EasyStarter logoEasyStarter

Vibe Coding

面向移动端开发的可复制 AI 编程指令

Prompt 1:极简快速上架(推荐)

这个 Prompt 用于在新的 EasyStarter Mobile 项目中,以最小可上线范围完成 iOS 首版闭环:配置 Cloudflare Server / D1 / R2,只保留 Apple 登录,接入 App Store Connect 与 RevenueCat 内购,在真机验证通过后部署 Server 并通过 EAS 构建提交。 这是一个综合性的 Prompt,如果需要集成其他服务,可以按照下面的 Prompt 按需执行。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我以最少配置完成移动端快速上架,只启用 Apple 登录(iOS)、RevenueCat 内购、R2 存储、D1 数据库,跳过一切非必要集成。

目标:
- 登录只保留 Apple Sign-In(iOS 原生),禁用邮箱密码、Google OAuth 和 GitHub。
- 支付只用 RevenueCat,不配置 Stripe 或其他 Provider。
- 存储只用 Cloudflare R2。
- 数据库只用 Cloudflare D1。
- 真机跑通后,一次性部署 Server 并通过 EAS 构建上架。

请按下面顺序执行:

### 第一步:Cloudflare 基础配置(使用 Wrangler CLI)
参考文档:https://developers.cloudflare.com/workers/wrangler/

1. 先读取这些文件,确认当前项目的真实配置位置和脚本:
   - 根目录 `package.json`
   - `apps/server/package.json`
   - `apps/server/wrangler.jsonc`
   - `apps/server/drizzle.config.ts`
   - `apps/server/.dev.vars.example`
   - `apps/server/.env.production.example`
   - `apps/native/app.json`
   - `apps/native/eas.json`
   - `packages/app-config/src/app-config.ts`
2. 检查 Wrangler CLI 是否可用:`pnpm wrangler --version`
3. 检查 Cloudflare 登录状态:`pnpm wrangler whoami`。如果未登录,执行 `pnpm wrangler login`,通过浏览器完成认证后继续。
4. 创建或接入 D1 数据库:
   - 如果还没有数据库,执行 `pnpm wrangler d1 create <database-name>`
   - 将输出里的 `database_name``database_id` 写入 `apps/server/wrangler.jsonc``d1_databases[0]`
   -`database_id` 同步写入 `apps/server/.dev.vars``apps/server/.env.production``CLOUDFLARE_D1_DATABASE_ID`
5. 创建或接入 R2 bucket:
   - 如果还没有 bucket,执行 `pnpm wrangler r2 bucket create <bucket-name>`
   - 将 bucket 名称写入 `apps/server/wrangler.jsonc``r2_buckets[0].bucket_name``binding` 保持项目代码使用的绑定名,通常是 `STORAGE`
   - 本地开发先在 Cloudflare R2 bucket Settings 中开启 Public Access(r2.dev),把 `https://pub-xxxx.r2.dev` 写入 `apps/server/.dev.vars``R2_PUBLIC_URL`
   - 生产环境优先在 R2 bucket Settings → Custom Domains 绑定自定义域名,把正式地址写入 `apps/server/.env.production``R2_PUBLIC_URL`
   - 如果生产自定义域名暂未确认,可以先使用 r2.dev 公开地址继续配置,不要因此停止;在交付结果中告诉我后续需要绑定 R2 Custom Domain,并把 `R2_PUBLIC_URL` 更新到 `apps/server/.env.production` 后重新推送生产 Secrets。
6. 设置 Server Worker 名称:在 `apps/server/wrangler.jsonc` 中设置 `name`,例如 `<your-app>-server`
7. 配置 `apps/server/wrangler.jsonc``vars`
   - `SERVER_URL`:生产 Server 地址。
   - `WEBSITE_URL`:生产 Web 地址,供登录回调、邮件链接或移动端跳转使用。
   - `APPLE_APP_BUNDLE_IDENTIFIER`:必须与 `apps/native/app.json``expo.ios.bundleIdentifier` 完全一致。
   - 如果 Cloudflare 生产自定义域名暂未确认,先使用 Workers 部署后获得的 `*.workers.dev` 地址作为 `SERVER_URL` 继续推进;`WEBSITE_URL` 可先保留 `<ROOT_DOMAIN>` 占位或使用当前可访问的 Web 地址。同时在交付结果中说明:正式域名确认后,需要更新 `SERVER_URL` / `WEBSITE_URL`、RevenueCat Webhook、Apple Return URL,并重新部署 Server、重新构建生产 App。
8. 配置 `apps/server/.dev.vars`
   - `CLOUDFLARE_ACCOUNT_ID`:从 Cloudflare Dashboard 概览页获取。
   - `CLOUDFLARE_API_TOKEN`:在 Cloudflare API Tokens 中创建,权限至少包含 D1 Edit、Workers R2 Storage Edit、Workers Scripts Edit。
   - `CLOUDFLARE_D1_DATABASE_ID`:第 4 步获得。
   - `BETTER_AUTH_SECRET`:执行 `openssl rand -base64 32` 生成。
   - `R2_PUBLIC_URL`:第 5 步获得的本地公开访问地址。
9. 配置 `apps/server/.env.production`:写入生产环境的 `CLOUDFLARE_ACCOUNT_ID``CLOUDFLARE_API_TOKEN``CLOUDFLARE_D1_DATABASE_ID``BETTER_AUTH_SECRET``R2_PUBLIC_URL`。生产 `BETTER_AUTH_SECRET` 请单独生成,不要复用本地值。
10. 配置移动端环境变量:
   -`apps/native/eas.json` 的各 build profile 中设置 `EXPO_PUBLIC_SERVER_API_URL` 为生产 Server 地址。
   - 设置 `EXPO_PUBLIC_WEB_APP_URL` 为生产 Web 地址。
   - 如项目还有本地移动端 env 文件,同步写入本地开发用 Server 地址;真机开发时不要写 `localhost`,优先使用 ngrok HTTPS 地址。
   - 如果生产域名暂未确认,`EXPO_PUBLIC_SERVER_API_URL` 先使用当前可访问的 Workers URL,`EXPO_PUBLIC_WEB_APP_URL` 先使用当前可访问的 Web 地址或 `<ROOT_DOMAIN>` 占位;在交付结果中说明正式域名确认后需要更新 `apps/native/eas.json` 并重新执行 EAS production build。
11. 执行数据库迁移:
   - `pnpm db:generate`
   - `pnpm db:migrate:local`

### 第二步:只保留 Apple 登录
1. 打开 `apps/server/src/lib/auth.ts`,在 `socialProviders` 中注释掉 `google``github`,只保留 Apple Sign-In 相关配置;不要删除相关代码。
2. 如果有邮箱密码登录(`emailAndPassword`),保持注释状态,不要启用。
3. 确认 `APPLE_APP_BUNDLE_IDENTIFIER` 已写入 `apps/server/wrangler.jsonc``vars`,并且与 `apps/native/app.json``expo.ios.bundleIdentifier` 完全一致。
4. 如果我还没有 Apple Developer 账号或尚未为 App ID 开启 Sign in with Apple,请告诉我:去 Apple Developer Portal → Certificates, Identifiers & Profiles → Identifiers,找到对应 Bundle ID,勾选 Sign in with Apple 能力,然后重新生成 Provisioning Profile。
5. 注意:Apple Sign-In 仅覆盖 iOS。这个极简方案不处理 Android 登录;如果后续需要 Android 登录,请单独补 Google 或手机号登录。

### 第三步:App Store Connect 配置(使用 asc-cli)
参考文档:https://github.com/tddworks/asc-cli

1. 检查 asc-cli 是否已安装:`asc --version`。如果未安装,执行 `brew install tddworks/tap/asccli`
2. 检查登录状态:`asc auth check`。如果未登录,需要 App Store Connect API Key:
   - 到 App Store Connect → Users and Access → Integrations → App Store Connect API → Generate API Key,权限选 Admin 或 App Manager。
   - 下载 `.p8` 私钥文件,记录 Key ID 和 Issuer ID。
   - 执行登录:`asc auth login --key-id <KEY_ID> --issuer-id <ISSUER_ID> --private-key-path <path/to/AuthKey.p8> --name default`
3. 确认 App 已创建:`asc apps list`。如果能找到目标 App,执行 `asc init --app-id <app-id>` 固定当前项目上下文。
4. 如果 App Store Connect 中还没有目标 App,请优先使用 asc-cli 创建;如果当前 asc-cli 版本不支持创建所需字段,就明确告诉我必须到 App Store Connect 网页端创建 App,并列出需要填写的 App Name、Bundle ID、SKU 和 Primary Language。
5. 创建或确认内购产品:
   - 先执行 `asc subscriptions --help``asc iap --help`,确认当前 asc-cli 版本支持的订阅和一次性购买命令。
   - 用 asc-cli 创建订阅组、月度订阅、年度订阅和非消耗型 Lifetime 产品。
   - Product ID 先规划再创建,例如 `com.yourapp.pro.monthly``com.yourapp.pro.yearly``com.yourapp.pro.lifetime`。Product ID 创建后不可修改,不要使用临时名称。
   - 如果某个内购创建或首次提交动作必须走 Apple 网页端或 iris 私有登录能力,不要编造命令;在交付结果中说明原因和具体手动步骤。
6. 记录所有 App Store Connect Product ID,后续写入 RevenueCat 和 `packages/app-config/src/app-config.ts`

### 第四步:RevenueCat 配置(使用 RevenueCat MCP)
参考文档:https://www.revenuecat.com/docs/tools/mcp/setup

1. 配置 RevenueCat MCP Server。如果没有 RevenueCat API v2 Secret Key,到 RevenueCat Dashboard → API Keys 创建。
2. 通过 RevenueCat MCP 创建或确认 iOS App:Bundle ID 必须与 `apps/native/app.json``expo.ios.bundleIdentifier` 一致。
3. 通过 MCP 导入 App Store Connect 中第三步创建的 Products。
4. 通过 MCP 创建 Entitlement,例如 `pro`,并将所有解锁 Pro 的 Products attach 到该 Entitlement。
5. 通过 MCP 创建或更新默认 Offering,并关联 Monthly、Annual、Lifetime 三个 Package。
6. 获取客户端 API Key:`EXPO_PUBLIC_REVENUECAT_IOS_API_KEY`,写入 `apps/native/eas.json` 和本地移动端 env 文件。
7. 设置 `EXPO_PUBLIC_REVENUECAT_ENTITLEMENT_ID`,例如 `pro`,写入 `apps/native/eas.json` 和本地移动端 env 文件。
8. 获取服务端 API Key:`REVENUECAT_SECRET_API_KEY`,写入 `apps/server/.dev.vars``apps/server/.env.production`
9. 生成 Webhook Authorization header:
   - 执行 `openssl rand -hex 32`
   - 拼成完整 Bearer 值,例如 `Bearer <random>`
   - 将同一个完整值写入 RevenueCat Webhook 的 Authorization header,以及 `apps/server/.dev.vars` / `apps/server/.env.production``REVENUECAT_WEBHOOK_SECRET`
10. 本地 Webhook 使用 ngrok:启动 Server,执行 `ngrok http 3001`,通过 RevenueCat MCP 配置 Webhook URL 为 `{ngrok_https_url}/api/webhooks/revenuecat`
11. 将商店 Product ID 写入 `packages/app-config/src/app-config.ts``native.payments`,确保 iOS `providerPriceId` 与 App Store Connect / RevenueCat Product ID 完全一致。

### 第五步:本地验证(iOS 真机优先)
1. 启动 Server:`pnpm dev:server`
2. 真机无法访问 localhost,使用 ngrok 暴露本地 Server:执行 `ngrok http 3001`,将输出的 HTTPS 地址写入移动端环境变量 `EXPO_PUBLIC_SERVER_API_URL`
3. 重启 Expo / Native App,让环境变量生效。
4. 连接 iOS 真机,使用项目 iOS device 脚本启动 App。
5. 验证 Apple 登录流程正常完成。
6. 验证 RevenueCat Offering 能正常拉取和展示套餐。
7. 验证头像或附件上传到 R2 正常。
8. 验证本地 D1 迁移已执行,Server 不再因为数据库 schema 缺失报错。

### 第六步:部署 Server 并构建上架
1. 确认 `apps/server/wrangler.jsonc``vars.SERVER_URL``vars.WEBSITE_URL` 为正式地址。
2. 确认 `apps/native/eas.json` 的生产 profile 使用正式 `EXPO_PUBLIC_SERVER_API_URL``EXPO_PUBLIC_WEB_APP_URL`
   - 如果 Cloudflare 生产自定义域名暂未确认,不要停止。先使用 `pnpm deploy:server` 部署得到的 Workers URL 完成 Server 部署、真机验证和 EAS 构建;在交付结果中告诉我后续需要在 Cloudflare 绑定正式域名,然后更新 `apps/server/wrangler.jsonc``apps/server/.env.production``apps/native/eas.json`、RevenueCat Webhook 和 Apple Return URL,再重新部署 Server 并重新构建 App。
3. 执行 `pnpm deploy:server`
4. 推送生产 Secrets:`pnpm -F server secrets:bulk:production`
5. 执行生产数据库迁移:`pnpm db:migrate`
6. 通过 RevenueCat MCP 配置生产 Webhook URL:`{SERVER_URL}/api/webhooks/revenuecat`
7. 在 Apple Developer Portal 更新 Return URL(如使用 Service ID 回调)为 `{SERVER_URL}/api/auth/callback/apple`
8. 构建 iOS 生产包:`pnpm -F native eas:build:ios:production`
9. 提交到 App Store Connect:`pnpm -F native eas:submit:ios:production`

参考文档:
https://developers.cloudflare.com/workers/wrangler/
https://github.com/tddworks/asc-cli
https://www.revenuecat.com/docs/tools/mcp/setup
https://www.easystarter.dev/zh/docs/mobile/integrations/authentication
https://www.easystarter.dev/zh/docs/mobile/integrations/iap/revenuecat
https://www.easystarter.dev/zh/docs/mobile/integrations/cloudflare
https://www.easystarter.dev/zh/docs/mobile/integrations/storage
https://www.easystarter.dev/zh/docs/mobile/integrations/database

交付结果请包含:
- Cloudflare 登录状态。
- Server Worker 名称。
- 已启用的登录方式(只有 Apple Sign-In,注明 iOS 限定)。
- App Store Connect 中创建的 Product ID 清单。
- RevenueCat Offering、Entitlement 和 Product ID 对照。
- R2 bucket 名称和 R2_PUBLIC_URL。
- D1 database_id 和迁移结果。
- 已写入的 env/vars 文件清单。
- 仍需我在 Apple Developer Portal、App Store Connect、RevenueCat 或 Cloudflare 后台手动完成的事项,以及不能自动完成的原因。

Prompt 2:启动 App 模拟器 + Server 端

这个 Prompt 用于在本地启动移动端模拟器和 Server,适合首次拉起项目、检查 env 配置、确认 App 能连接本地服务端。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我在当前项目中启动移动端 App 和 Server 本地开发环境。

目标:
- 根据项目已有脚本启动服务端和 iOS 模拟器。
- App 启动依赖服务端、`apps/native/app.json` 和移动端环境变量。
- App 端和 Server 端都可能需要必须的环境变量,请先检查并尽量帮我配置好。

请按下面顺序执行:
1. 先阅读根目录 `package.json``apps/native/package.json``apps/native/app.json``apps/native/.env*.example``apps/server/.env*.example``apps/server/wrangler.jsonc`,确认项目实际启动命令和必需配置。
2. 如果缺少本地 env 文件,请根据 example 创建本地开发用 env 文件;只填入可以从 example 或本地默认值安全推断的值,不要编造真实密钥。
3. 如果某些变量无法自动配置,请列出变量名、用途、应该从哪里获取、应该写入哪个文件,并给出示例格式。
4. 确认 `apps/native/app.json` 中影响本地启动的关键字段是否合理,例如 `name``slug``scheme``ios.bundleIdentifier`
5. 启动 Server,本地默认端口优先使用项目文档或脚本中定义的端口。
6. Server 正常后启动 iOS Simulator / Expo,并说明我应该在终端或模拟器里看到什么结果。

参考文档:
https://www.easystarter.dev/zh/docs/mobile/getting-started

交付结果请包含:
- 实际使用的启动命令。
- 已创建或修改的 env 文件。
- 仍需我手动填写的变量清单。
- Server 地址、App 使用的 API 地址,以及下一步如何验证 App 已连上 Server。

Prompt 3:真机开发 + Server 端

这个 Prompt 用于把移动端开发环境切到真机调试,重点处理真机访问本地 Server、ngrok 暴露地址、设备连接和环境变量同步。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我在当前项目中启动真机开发环境,并同时启动 Server 端。

目标:
- 根据项目已有脚本启动服务端和真机 App。
- 真机无法直接访问 `localhost`,请帮我确认项目推荐的本地访问方式,例如 ngrok 或局域网 IP。
- App 端启动依赖 `apps/native/app.json`、移动端环境变量和 Server 可访问地址。
- App 端和 Server 端都可能需要必须的环境变量,请先检查并尽量帮我配置好。

请按下面顺序执行:
1. 先阅读根目录 `package.json``apps/native/package.json``apps/native/app.json``apps/native/.env*.example``apps/server/.env*.example``apps/server/wrangler.jsonc`,确认真机开发脚本、服务端端口和必需配置。
2. 检查本机是否已有真机开发所需工具,例如 Xcode / Android Studio、Expo CLI、EAS CLI、iOS 设备连接状态或 Android 设备连接状态。
3. 如果缺少本地 env 文件,请根据 example 创建本地开发用 env 文件;只填入可以从 example 或本地默认值安全推断的值,不要编造真实密钥。
4. 启动 Server,并确认本地服务端地址和端口。
5. 如果真机需要访问本地 Server,请配置公网或局域网可访问地址。优先使用 ngrok:
   - 先检查本机是否已安装 ngrok,例如执行 `ngrok version`
   - 如果没有安装,请告诉我安装方式。macOS 可以优先使用 Homebrew:`brew install ngrok/ngrok/ngrok`;也可以到 https://ngrok.com/download 下载。
   - 如果 ngrok 需要登录或 authtoken,请提示我到 https://dashboard.ngrok.com/get-started/your-authtoken 获取 token,然后执行 `ngrok config add-authtoken <your-token>`
   - Server 启动后,使用实际服务端端口启动 ngrok,例如 `ngrok http 3001`
   - 找到 ngrok 输出中的 HTTPS 转发地址,例如 `https://xxxx.ngrok-free.app`
   - 将该 HTTPS 地址写入移动端环境变量,例如 `EXPO_PUBLIC_SERVER_API_URL=https://xxxx.ngrok-free.app`
   - 修改 env 后重启 Expo / 真机 App,让新的环境变量生效。
   - 如果无法自动安装或启动 ngrok,请告诉我需要执行的命令、复制哪个地址、写入哪个 env 文件。
6. 根据我连接的设备选择合适命令启动 App:
   - iOS 真机优先使用项目中的 iOS device 脚本。
   - Android 真机优先使用项目中的 Android device 脚本。
   - 如果项目已有 App + Server 并行脚本,优先使用该脚本。
7. 如果 `apps/native/app.json` 中的 `scheme``ios.bundleIdentifier``android.package` 或 Apple Team ID 会影响真机运行,请检查并说明需要如何修改。

参考文档:
https://www.easystarter.dev/zh/docs/mobile/getting-started

交付结果请包含:
- 实际使用的 Server 启动命令。
- 实际使用的真机启动命令。
- ngrok 的安装状态、启动命令和 HTTPS 转发地址。
- 真机访问 Server 的最终地址。
- 已创建或修改的 env 文件。
- 仍需我手动填写的变量清单。
- 如何在真机上验证 App 已成功连上 Server。

Prompt 4:配置 app.json

这个 Prompt 用于把移动端模板的 App 标识替换成真实产品信息,并检查 iOS、Android、Deep Link 和 EAS Update 相关字段是否一致。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我配置移动端 `apps/native/app.json`

目标:
- 把模板里的 EasyStarter 默认标识替换成我自己的 App 信息。
- 确保 iOS、Android、Deep Link、EAS Update 相关字段一致。
- 如果缺少必须信息,请不要编造,直接列出我需要提供什么。

请按下面顺序执行:
1. 读取 `apps/native/app.json``packages/app-config/src/app-config.ts``apps/server/wrangler.jsonc`,确认当前 App 名称、scheme、Bundle ID、Android package 和 Server 侧 Apple Bundle ID。
2. 检查并配置这些字段:
   - `expo.name`
   - `expo.slug`
   - `expo.scheme`
   - `expo.ios.bundleIdentifier`
   - `expo.ios.appleTeamId`
   - `expo.android.package`
   - `expo.extra.eas.projectId`
   - `expo.updates.url`
3. iOS 和 Android 的包名优先使用同一个反向域名格式,例如 `com.yourcompany.yourapp`
4. 确保 `apps/native/app.json``scheme``packages/app-config/src/app-config.ts` 中移动端 deep link scheme 保持一致。
5. 确保 `apps/server/wrangler.jsonc` 中的 `APPLE_APP_BUNDLE_IDENTIFIER``expo.ios.bundleIdentifier` 保持一致。
6. 如果还没有 EAS 项目,请告诉我需要在 `apps/native` 下执行 `eas init`,并说明它会生成 `projectId``updates.url`
7. 检查图标和启动页资源路径是否存在;如果资源还是模板默认图,请列出需要替换的文件路径。

参考文档:
https://www.easystarter.dev/zh/docs/mobile/integrations/app-json

交付结果请包含:
- 已修改的字段和值。
- 仍需我提供的信息,例如 Apple Team ID、Bundle ID、EAS Project ID。
- 需要去 Apple Developer Portal 或 Google Play Console 操作的事项。
- 配置完成后建议执行的验证命令。

Prompt 5:Cloudflare

这个 Prompt 用于准备 Cloudflare 基础凭据和本地/生产 env 文件,为后续 D1、R2、Workers 部署打好配置基础。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我完成 Cloudflare 集成配置。

目标:
- 准备 Cloudflare Workers、D1、R2 后续会用到的基础凭据。
- 把可安全配置的内容写入项目文件。
- 对无法自动获取的敏感信息,明确告诉我去哪里拿、写到哪里。

请按下面顺序执行:
1. 读取 `apps/server/wrangler.jsonc``apps/server/.dev.vars.example``apps/server/.env.production.example``apps/server/drizzle.config.ts`,确认 Cloudflare 相关变量和配置位置。
2. 检查是否已安装并登录 Wrangler,例如 `pnpm wrangler whoami` 或项目已有脚本。
3. 检查并准备这些变量:
   - `CLOUDFLARE_ACCOUNT_ID`
   - `CLOUDFLARE_API_TOKEN`
4. 如果缺少本地 env 文件,请基于 example 创建:
   - `apps/server/.dev.vars`
   - `apps/server/.env.production`
5. 不要编造 Cloudflare Token。请告诉我:
   - `CLOUDFLARE_ACCOUNT_ID` 在 Cloudflare Dashboard 的哪里复制。
   - `CLOUDFLARE_API_TOKEN` 应该创建哪些权限:D1 Edit、Workers R2 Storage Edit、Workers Scripts Edit。
   - 这些值分别写入哪个文件。
6. 如果我已经提供了值,请帮我写入对应文件,并避免把 secret 写入会提交到 Git 的文件。

参考文档:
https://www.easystarter.dev/zh/docs/mobile/integrations/cloudflare

交付结果请包含:
- Cloudflare 登录状态。
- 已创建或修改的文件。
- 还缺哪些变量。
- 下一步应该继续做数据库、存储还是部署。

Prompt 6:数据库

这个 Prompt 用于创建或接入 Cloudflare D1 数据库,并把数据库 ID 同步到 Wrangler、Server env 和本地迁移流程中。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我配置 Cloudflare D1 数据库,并跑通本地数据库开发流程。

目标:
- 创建或接入 D1 数据库。
- 同步配置 `apps/server/wrangler.jsonc``apps/server/.dev.vars``apps/server/.env.production`
- 生成并执行本地数据库迁移。

请按下面顺序执行:
1. 读取 `apps/server/wrangler.jsonc``apps/server/src/db/schema``apps/server/drizzle.config.ts`、根目录 `package.json`,确认数据库配置和脚本。
2. 检查 Cloudflare 变量是否已配置:
   - `CLOUDFLARE_ACCOUNT_ID`
   - `CLOUDFLARE_API_TOKEN`
   - `CLOUDFLARE_D1_DATABASE_ID`
3. 如果还没有 D1 数据库,请优先使用项目推荐命令创建,例如 `pnpm wrangler d1 create <database-name>`;如果不能执行,请告诉我 Cloudflare Dashboard 创建路径。
4. 拿到 `database_id` 后,写入:
   - `apps/server/.dev.vars`
   - `apps/server/.env.production`
   - `apps/server/wrangler.jsonc``d1_databases[0].database_id`
5. 确认 `d1_databases[0].binding` 是否为项目代码使用的绑定名,通常应为 `DB`
6. 执行本地开发命令:
   - `pnpm db:generate`
   - `pnpm db:migrate:local`
7. 如需要查看数据,再启动本地 Studio,例如 `pnpm db:studio:local`

参考文档:
https://www.easystarter.dev/zh/docs/mobile/integrations/database

交付结果请包含:
- D1 database name 和 database_id。
- 修改过的配置文件。
- 执行过的数据库命令和结果。
- 如果失败,给出失败原因和下一步处理方式。

Prompt 7:邮件服务

这个 Prompt 用于接入项目内置的 Resend 邮件能力,配置发件人、API Key、域名验证和注册/找回密码邮件验证路径。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我配置邮件服务。

目标:
- 使用项目内置的 Resend 邮件服务。
- 配置注册验证邮件和忘记密码邮件所需变量。
- 配置发件人名称和发件域名。

请按下面顺序执行:
1. 读取 `packages/app-config/src/app-config.ts``apps/server/.dev.vars.example``apps/server/.env.production.example``apps/server/src/emails`,确认邮件 Provider 和模板位置。
2. 检查当前 `common.email.provider` 是否为 `resend`
3. 检查并配置:
   - `RESEND_API_KEY`
   - `common.app.name`
   - `common.email.from.localPart`
   - `common.email.from.domain`
4. 如果我没有提供 Resend API Key,请告诉我:
   - 去 https://resend.com/api-keys 创建 API Key。
   - 权限选择 Sending access。
   - Key 写入 `apps/server/.dev.vars``apps/server/.env.production`
5. 如果发件域名还没有验证,请告诉我去 Resend Domains 添加域名,并在 DNS 服务商处添加 Resend 给出的记录。
6. 不要把 `RESEND_API_KEY` 写入前端环境变量,也不要提交到 Git。
7. 配置完成后,告诉我如何通过注册验证邮件或忘记密码流程验证邮件是否发送成功。

参考文档:
https://www.easystarter.dev/zh/docs/mobile/integrations/email

交付结果请包含:
- 邮件 Provider。
- 发件人最终格式,例如 `App Name <noreply@yourdomain.com>`
- 已修改的文件。
- 仍需我在 Resend 或 DNS 后台完成的操作。

Prompt 8:认证服务

这个 Prompt 用于完整配置移动端认证链路,覆盖邮箱密码、Google OAuth、Apple 登录、Server URL 和 Deep Link Scheme 的一致性检查。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我配置移动端认证服务。

目标:
- 跑通邮箱密码、Google OAuth 和 iOS Apple 原生登录。
- 确保 Server URL、Deep Link Scheme、OAuth 回调地址和 App 配置一致。
- 对无法自动创建的第三方后台配置,给我明确的操作清单。

请按下面顺序执行:
1. 读取 `apps/server/src/lib/auth.ts``apps/native/lib/auth/auth.client.ts``apps/native/app.json``packages/app-config/src/app-config.ts``apps/server/wrangler.jsonc``apps/server/.dev.vars.example`
2. 生成或检查 `BETTER_AUTH_SECRET`。如果缺失,可用 `openssl rand -base64 32` 生成,并写入 `apps/server/.dev.vars`;生产值写入 `apps/server/.env.production`
3. 检查 `SERVER_URL``WEBSITE_URL`、移动端 `EXPO_PUBLIC_SERVER_API_URL` 是否一致且可访问。
4. 检查 `apps/native/app.json``scheme` 是否与 app config 中的移动端 scheme 一致。
5. 配置 Google OAuth:
   - 回调地址应为 `{SERVER_URL}/api/auth/callback/google`
   - 移动端本地开发如果需要 HTTPS,请使用 ngrok,并同步更新 Google Cloud Console 的 Authorized redirect URI。
   - `GOOGLE_CLIENT_ID` 放到公开配置或 vars,`GOOGLE_CLIENT_SECRET` 放到 secret/env 文件。
6. 配置 Apple 登录:
   - 确认 Apple Developer Portal 中 App ID 已开启 Sign In with Apple。
   - `APPLE_APP_BUNDLE_IDENTIFIER` 必须与 `apps/native/app.json``ios.bundleIdentifier` 一致。
   - 如果需要 Service ID 回调,Return URL 使用 `{SERVER_URL}/api/auth/callback/apple`
7. 不要编造 Google、Apple 的真实凭据;如果缺失,请列出后台创建步骤和填写位置。

参考文档:
https://www.easystarter.dev/zh/docs/mobile/integrations/authentication

交付结果请包含:
- 当前启用的登录方式。
- 需要写入的 env/vars 列表。
- Google 和 Apple 后台需要配置的回调 URL。
- Deep Link Scheme 检查结果。
- 本地如何验证登录流程。

Prompt 9:阿里云手机号登录

这个 Prompt 用于接入中国大陆手机号验证码登录,配置阿里云 Dypnsapi 凭据,并判断是否可以只保留手机号登录。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我配置阿里云手机号登录。

目标:
- 使用项目内置的 Better Auth phone-number plugin 和阿里云 Dypnsapi。
- 配置中国大陆手机号验证码登录。
- 如果我只面向国内用户,请帮我判断是否可以只保留手机号登录。

请按下面顺序执行:
1. 读取 `apps/server/src/sms/providers/aliyun.ts``apps/server/src/lib/auth.ts`、登录相关前端页面、`apps/server/.dev.vars.example``apps/server/.env.production.example`
2. 确认当前手机号登录接口使用:
   - `SendSmsVerifyCode`
   - `CheckSmsVerifyCode`
   - 中国大陆 `+86` E.164 手机号格式
3. 检查并配置服务端变量:
   - `ALIBABA_CLOUD_ACCESS_KEY_ID`
   - `ALIBABA_CLOUD_ACCESS_KEY_SECRET`
4. 如果我没有提供 AccessKey,请告诉我:
   - 去阿里云 RAM 控制台创建 RAM 用户。
   - 开启 OpenAPI 调用访问。
   - 授权 `dypns:SendSmsVerifyCode``dypns:CheckSmsVerifyCode`
   - 创建 AccessKey 后分别写入 `apps/server/.dev.vars``apps/server/.env.production`
5. 不要修改项目内置的阿里云验证码参数,除非我明确要求:
   - `ALIYUN_SMS_VERSION`
   - `ALIYUN_SMS_SIGN_NAME`
   - `ALIYUN_SMS_TEMPLATE_CODE`
6. 如果我要只保留手机号登录,请帮我检查 GitHub / Google / Apple 登录相关变量和 UI 是否可以不配置或隐藏,并给出建议。
7. 启动本地 Server 和 App/Web 后,验证发送验证码和校验验证码接口。

参考文档:
https://www.easystarter.dev/zh/docs/mobile/integrations/authentication/aliyun-phone-auth

交付结果请包含:
- 已配置的阿里云变量。
- RAM 权限清单。
- 本地验证步骤。
- 是否还依赖其它登录方式的结论。

Prompt 10:存储服务

这个 Prompt 用于接入 Cloudflare R2 存储,配置 Worker 绑定、公开访问地址和头像/附件上传验证流程。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我配置 Cloudflare R2 存储服务。

目标:
- 创建或接入 R2 bucket。
- 配置 Worker 的 R2 绑定。
- 配置文件公开访问 URL。
- 跑通头像或附件上传流程。

请按下面顺序执行:
1. 读取 `apps/server/wrangler.jsonc``apps/server/src/storage``packages/app-config/src/app-config.ts``apps/server/.dev.vars.example``apps/server/.env.production.example`
2. 检查项目使用的 R2 binding 名称,通常应为 `STORAGE`
3. 如果还没有 bucket,请优先使用项目推荐命令创建,例如 `pnpm wrangler r2 bucket create <bucket-name>`;如果不能执行,请告诉我 Cloudflare Dashboard 创建路径。
4. 将 bucket 名称写入 `apps/server/wrangler.jsonc``r2_buckets`
5. 指导我在 Cloudflare R2 bucket Settings 中开启 Public Access,获取 `https://pub-xxxx.r2.dev` 或自定义域名。
6. 将公开访问地址写入:
   - `apps/server/.dev.vars``R2_PUBLIC_URL`
   - `apps/server/.env.production``R2_PUBLIC_URL`
7. 检查 `packages/app-config/src/app-config.ts` 中的上传类型、文件大小限制、允许 MIME 类型是否符合当前产品需求。
8. 启动本地 Server,验证头像或附件上传接口是否正常。

参考文档:
https://www.easystarter.dev/zh/docs/mobile/integrations/storage

交付结果请包含:
- R2 bucket 名称。
- R2_PUBLIC_URL。
- 修改过的配置文件。
- 上传限制摘要。
- 本地验证方式。

Prompt 11:创建内购产品

这个 Prompt 用于规划移动端订阅与一次性购买产品,iOS 侧优先通过 asc-cli 创建 App Store Connect 产品,Android 侧按 Google Play Console 流程准备,并提前规划不可修改的 Product ID。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我规划并创建移动端内购产品。

目标:
- 使用 asc-cli 在 App Store Connect 中创建或确认 iOS 订阅和一次性购买产品。
- 在 Google Play Console 中创建或确认 Android 订阅和一次性购买产品。
- 记录 iOS 和 Android 的产品 ID,后续给 RevenueCat 和 `app-config.ts` 使用。
- 先规划命名,避免 Product ID 创建后无法修改。

请按下面顺序执行:
1. 读取 `apps/native/app.json``packages/app-config/src/app-config.ts``apps/native/eas.json`,确认 Bundle ID、Android package、当前套餐和价格配置。
2. 先检查 asc-cli:
   - 检查是否已安装:`asc --version`。如果未安装,执行 `brew install tddworks/tap/asccli`
   - 检查登录状态:`asc auth check`。如果未登录,使用 App Store Connect API Key 登录:`asc auth login --key-id <KEY_ID> --issuer-id <ISSUER_ID> --private-key-path <path/to/AuthKey.p8> --name default`
   - 执行 `asc apps list` 找到目标 App。如果已存在,执行 `asc init --app-id <app-id>` 固定当前项目上下文。
   - 如果需要首次 IAP 提交能力,检查是否需要 iris 登录:`asc iris status`;如未登录,说明可执行 `asc iris auth login --apple-id <apple-id> --interactive`
3. 帮我规划产品结构,至少包含:
   - 月度订阅
   - 年度订阅
   - 终身买断
4. 给出 iOS Product ID 和 Android Product ID 命名方案。注意 Product ID 创建后不可修改,不要随便使用临时名称。
5. 使用 asc-cli 创建或确认 App Store Connect 产品:
   - 先执行 `asc subscriptions --help``asc iap --help`,确认当前 asc-cli 版本支持的订阅和一次性购买命令。
   - 如果 App Store Connect 中还没有目标 App,优先使用 asc-cli 创建;如果当前 asc-cli 版本无法覆盖必填字段,就告诉我必须到 App Store Connect 网页端创建 App,并列出 App Name、Bundle ID、SKU、Primary Language。
   - 使用 asc-cli 创建订阅组。
   - 使用 asc-cli 创建月度订阅和年度订阅。
   - 使用 asc-cli 创建 Non-Consumable 终身买断产品。
   - 使用 asc-cli 或 App Store Connect 网页端补齐价格、可售地区、本地化和审核截图。
   - 如果某个内购首次提交必须走 iris 或 App Store Connect 网页端,请说明原因、需要执行的命令或手动路径,不要编造命令。
6. 指导我在 Google Play Console 中:
   - 创建 App。
   - 确认至少上传过一次 AAB/APK。
   - 创建订阅、Base Plan、Offer。
   - 创建一次性购买产品。
   - 激活所有产品。
7. 如果我还没有商店账号、App Store Connect API Key、Google Play Console App 或必要权限,请列出前置条件,不要跳步。

参考文档:
https://github.com/tddworks/asc-cli
https://www.easystarter.dev/zh/docs/mobile/integrations/iap/store-products

交付结果请包含:
- asc-cli 安装和登录状态。
- App Store Connect App ID。
- 产品 ID 对照表。
- asc-cli 已执行的命令和结果。
- 每个平台还没完成的后台步骤,以及不能自动完成的原因。
- 需要填回 RevenueCat 和 `app-config.ts` 的字段。
- 风险提醒,尤其是 Product ID 不可修改。

Prompt 12:RevenueCat 内购

这个 Prompt 用于通过 RevenueCat MCP 把商店内购产品接入 RevenueCat,配置 Products、Offerings、Entitlements、Webhook 和 App/Server 环境变量。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我接入 RevenueCat 内购。

目标:
- 连接 App Store / Google Play 产品。
- 使用 RevenueCat MCP 配置 Products、Offerings、Entitlements、Webhook。
- 更新 App 端和 Server 端环境变量。
- 更新 `app-config.ts` 中的套餐和产品 ID。

请按下面顺序执行:
1. 读取 `apps/native/eas.json``packages/app-config/src/app-config.ts``apps/server/.dev.vars.example``apps/server/.env.production.example``apps/server/src` 中 RevenueCat webhook 相关代码。
2. 配置 RevenueCat MCP Server。如果还没有 RevenueCat API v2 Secret Key,到 RevenueCat Dashboard → API Keys 创建,并按文档配置 MCP。
3. 通过 RevenueCat MCP 确认商店内购产品已经创建,并收集 iOS / Android Product ID。
4. 通过 RevenueCat MCP 创建或确认 RevenueCat App:
   - iOS 使用 Bundle ID。
   - Android 使用 package name。
   - 配置 App Store Connect API key / Google Play service credentials。
5. 通过 RevenueCat MCP 导入 Products,并配置默认 Offering:
   - Monthly
   - Annual
   - Lifetime
6. 通过 RevenueCat MCP 创建 Entitlement,例如 `pro`,并把所有需要解锁 Pro 的 Products attach 到该 Entitlement。
7. 通过 RevenueCat MCP 获取并配置客户端变量:
   - `EXPO_PUBLIC_REVENUECAT_IOS_API_KEY`
   - `EXPO_PUBLIC_REVENUECAT_ANDROID_API_KEY`
   - `EXPO_PUBLIC_REVENUECAT_ENTITLEMENT_ID`
   写入 `apps/native/eas.json` 和本地移动端 env 文件。
8. 通过 RevenueCat MCP 获取并配置服务端变量:
   - `REVENUECAT_SECRET_API_KEY`
   - `REVENUECAT_WEBHOOK_SECRET`
   写入 `apps/server/.dev.vars``apps/server/.env.production`
9. 本地开发 Webhook 使用 ngrok,并通过 RevenueCat MCP 创建或更新 Webhook:
   - 启动 Server。
   - `ngrok http 3001`
   - RevenueCat Webhook URL 填 `{ngrok_https_url}/api/webhooks/revenuecat`
   - Authorization header 与 `REVENUECAT_WEBHOOK_SECRET` 保持完全一致。
10. 更新 `packages/app-config/src/app-config.ts``native.payments`,确保 `providerPriceId` 与商店后台 / RevenueCat Product ID 完全一致。
11. 启动 App,验证是否能拉取 Offering、展示套餐、购买后解锁 Entitlement。

参考文档:
https://www.revenuecat.com/docs/tools/mcp/setup
https://www.easystarter.dev/zh/docs/mobile/integrations/iap/revenuecat

交付结果请包含:
- RevenueCat MCP 配置状态。
- RevenueCat App、Offering、Entitlement 配置摘要。
- iOS / Android SDK Key 和 Entitlement ID 的写入位置。
- Server Secret 和 Webhook 配置位置。
- `app-config.ts` 中套餐和产品 ID 对照。
- 本地和生产环境分别如何验证。

Prompt 13:部署 Server

这个 Prompt 用于把 Server 部署到 Cloudflare Workers,推送生产 Secrets、执行生产 D1 迁移,并核对认证、存储和内购 Webhook 地址。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我部署 Server 到 Cloudflare Workers。

目标:
- 完成本地 CLI 部署或检查 GitHub 自动部署配置。
- 配置生产环境 vars 和 secrets。
- 运行生产 D1 数据库迁移。
- 输出最终 Server URL,并检查认证、存储、内购 Webhook 相关地址。

请按下面顺序执行:
1. 读取 `apps/server/wrangler.jsonc``apps/server/.env.production.example``apps/server/.dev.vars`、根目录 `package.json``apps/server/package.json`
2. 检查部署前置项:
   - Cloudflare 已登录。
   - D1 database_id 已配置。
   - R2 bucket 已配置。
   - `SERVER_URL``WEBSITE_URL` 已配置为正式地址。
3. 检查 `apps/server/wrangler.jsonc`
   - `name`
   - `d1_databases`
   - `r2_buckets`
   - `vars.SERVER_URL`
   - `vars.WEBSITE_URL`
   - OAuth Client ID 等公开变量
4. 准备 `apps/server/.env.production`,只放敏感变量,例如:
   - `BETTER_AUTH_SECRET`
   - `GOOGLE_CLIENT_SECRET`
   - `RESEND_API_KEY`
   - `R2_PUBLIC_URL`
   - `REVENUECAT_SECRET_API_KEY`
   - `REVENUECAT_WEBHOOK_SECRET`
5. 执行部署命令,优先使用项目脚本,例如 `pnpm deploy:server`
6. 部署成功后,记录 Worker URL。
7. 推送生产 Secrets,优先使用项目脚本,例如 `pnpm -F server secrets:bulk:production`
8. 执行生产数据库迁移:
   - 如 schema 有变化,先 `pnpm db:generate`
   - 再执行 `pnpm db:migrate`
9. 如果绑定自定义域名,请检查并更新:
   - `SERVER_URL`
   - Web 端调用 Server 的 URL
   - Google / Apple OAuth 回调地址
   - RevenueCat Webhook URL
10. 部署后访问健康检查或关键 API,确认 Worker 正常响应。

参考文档:
https://www.easystarter.dev/zh/docs/mobile/deploy/deploy-server

交付结果请包含:
- 实际部署命令。
- Worker URL 或自定义 Server URL。
- 已推送的 Secrets 名称列表,不要输出 secret 明文。
- 数据库迁移结果。
- 还需要在 OAuth / RevenueCat / Web 端同步更新的地址。

Prompt 14:上架 App

这个 Prompt 用于准备并执行 EAS 生产构建和应用商店提交,适合 Server、RevenueCat、认证回调和 App 标识都已配置完成后的发布阶段。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我准备并执行移动端 App 上架。

目标:
- 使用 EAS 构建 iOS 和 Android 生产包。
- 提交到 App Store Connect 和 Google Play Console。
- 确认生产 Server、RevenueCat、认证回调和 App 标识都已配置完成。

请按下面顺序执行:
1. 读取 `apps/native/app.json``apps/native/eas.json``apps/native/package.json``packages/app-config/src/app-config.ts`
2. 检查前置条件:
   - Server 已部署完成。
   - `EXPO_PUBLIC_SERVER_API_URL` 是生产 Server 地址。
   - `EXPO_PUBLIC_WEB_APP_URL` 是生产 Web 地址。
   - RevenueCat iOS / Android SDK Key 和 Entitlement ID 已配置。
   - App Store Connect 和 Google Play Console 中已创建 App。
3. 检查 `apps/native/app.json`
   - `expo.name`
   - `expo.slug`
   - `expo.version`
   - `expo.scheme`
   - `ios.bundleIdentifier`
   - `ios.appleTeamId`
   - `android.package`
   - `extra.eas.projectId`
4. 如果还没有初始化 EAS,请在 `apps/native` 下执行或提示我执行 `eas init`
5. 检查 EAS CLI 是否安装并登录:
   - `eas --version`
   - `eas whoami`
6. 构建 iOS 生产包,优先使用项目脚本,例如 `pnpm -F native eas:build:ios:production`
7. 构建 Android 生产包,优先使用项目脚本,例如 `pnpm -F native eas:build:android:production`
8. 构建完成后,提交 iOS:
   - `pnpm -F native eas:submit:ios:production`
9. 提交 Android:
   - `pnpm -F native eas:submit:android:production`
10. 提交完成后,告诉我在 App Store Connect / Google Play Console 后台还需要填写哪些元数据、截图、隐私信息和审核说明。
11. 如果只是 JS/文案/UI 小更新,判断是否可以用 OTA:`pnpm -F native eas:update:production`

参考文档:
https://www.easystarter.dev/zh/docs/mobile/deploy/deploy-app

交付结果请包含:
- EAS 登录状态。
- iOS / Android 构建链接。
- iOS / Android 提交结果。
- 上架后台还缺的材料。
- 是否可以使用 OTA 更新的判断。

Prompt 15:主题系统

这个 Prompt 用于配置移动端主题系统,统一颜色、字体、圆角、深浅色模式和 Native/Web 视觉风格。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我配置移动端主题系统。

目标:
- 调整 App 默认外观模式和默认主题系列。
- 如有需要,新增一个 Theme Family。
- 确保 Uniwind、主题 CSS、类型和 i18n 文案都同步。

请按下面顺序执行:
1. 读取 `apps/native/providers/theme-provider.tsx``apps/native/global.css``apps/native/metro.config.js``apps/native/themes``packages/i18n` 中移动端主题相关文案。
2. 先说明当前主题系统:
   - 外观模式:`system``light``dark`
   - 主题系列:项目当前已有的 Theme Family
   - 活跃主题名格式:`{themeFamily}-{resolvedThemeMode}`
3. 如果我只想改默认主题,请修改 `theme-provider.tsx` 中默认的 `themeModePreference``themeFamily`
4. 如果我要新增主题系列,请执行:
   -`THEME_FAMILIES``ThemeFamily` 类型中添加新 key。
   -`apps/native/themes` 下新增对应 CSS 文件。
   -`apps/native/global.css` 中 import 新主题。
   -`apps/native/metro.config.js``extraThemes` 中注册 `newtheme-light``newtheme-dark`
   - 在 i18n 文案中补充新主题名称和描述。
5. 新主题 CSS 必须包含和现有主题完全相同的变量名,避免运行时样式缺失。
6. 修改 Metro / Uniwind 配置后,重启 Expo;如遇缓存问题,使用 `npx expo start --clear`
7. 启动 App,检查设置页切换主题、亮色/暗色切换、重启后偏好是否持久化。

参考文档:
https://www.easystarter.dev/zh/docs/mobile/config/theme

交付结果请包含:
- 默认主题配置。
- 新增或修改的主题系列。
- 修改过的文件。
- 需要重启的开发服务。
- 视觉验证清单。

Prompt 16:数据分析

这个 Prompt 用于接入移动端的 OpenPanel 数据分析,配置 Client ID 和 Client Secret,并在本地开发、本地生产构建和 EAS 云端构建三种场景下把变量填入正确位置。

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 secret:公开值写入 `wrangler.jsonc``eas.json` 或前端 env;secret 只写入 `.dev.vars``.env.production` 或通过对应 CLI secret 命令推送。
- 暂时不需要的功能只注释或保持禁用,不要删除功能代码;只有文案、页面区块、示例数据这类明确要求移除的内容,才按本 Prompt 指令处理。

请帮我配置移动端数据分析。

目标:
- 接入 OpenPanel,不自动监听所有路由变化,只封装 `trackOpenPanelEvent` / `trackOpenPanelScreenView` 供业务在关键漏斗节点按需调用。
- 未配置 Client ID 或 Client Secret 时 SDK 自动跳过初始化。
- 在本地开发、本地生产构建、EAS 云端构建三种场景下,分别把 Client ID 和 Client Secret 填入正确位置。

请按下面顺序执行:
1. 读取 `apps/native/lib/analytics/openpanel.ts``apps/native/app/_layout.tsx``apps/native/.env.development.local.example``apps/native/.env.production.example``apps/native/eas.json`,确认变量名和加载方式。
2. 如果我没有提供 OpenPanel Client ID 和 Client Secret,请告诉我:
   - 去 https://openpanel.dev 注册账号。
   - 点击 Create Project,填写 Project name(可与 Web 端共用同一个项目,方便跨端漏斗分析)。
   - 开启 **App**,关闭暂时不需要的 **Website****Backend / API**
   - 点击 **Create project**
   - 创建完成后,从项目的客户端信息里复制 App 对应的 **Client ID****Client Secret**
3.`EXPO_PUBLIC_OPENPANEL_CLIENT_ID``EXPO_PUBLIC_OPENPANEL_CLIENT_SECRET` 写入:
   - `apps/native/.env.development.local`:由 `expo start` 在开发态加载,仅本地生效。
   - `apps/native/.env.production`:本地以生产模式构建(`eas build --local --profile production``expo prebuild` 后的原生构建、`expo export` 等)时由 Expo 按 `NODE_ENV=production` 自动加载。如果文件不存在,先 `cp apps/native/.env.production.example apps/native/.env.production`
   - `apps/native/eas.json` 三个 build profile(`development``preview``production`)的 `env` 字段:EAS 云端构建使用,**优先级高于 `.env.production`,会覆盖同名变量**
4. 如果想区分线上 / 测试数据,建议在 OpenPanel 控制台为不同环境分别创建独立的 Client,避免事件混到一起。
5. 启动 App 后,验证:
   - 普通页面切换不会自动产生 OpenPanel 事件。
   - 在 onboarding 完成、登录成功、订阅开始、核心生成任务完成等关键漏斗节点手动调用 OpenPanel helper 后,OpenPanel 控制台 Live 视图能看到对应事件。

参考文档:
https://www.easystarter.dev/zh/docs/mobile/integrations/analytics

交付结果请包含:
- 使用的 OpenPanel Client ID / Client Secret(如启用了多个环境,请分别列出)。
- 修改过的文件(`.env.development.local` / `.env.production` / `eas.json`)。
- 建议优先埋点的 3-5 个关键漏斗节点。
- 本地验证步骤。

On this page