EasyStarter logoEasyStarter

Vibe Coding

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

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

这个 Prompt 用于在新的 EasyStarter Web 项目中,以最小可上线范围完成 Web 首版闭环:配置 Cloudflare Server / Web / D1 / R2,只保留 Google 登录,接入 Stripe 支付,本地验证后一次性部署 Server 和 Web。 这是一个综合性的 Prompt,如果需要集成其他服务,可以按照下面的 Prompt 按需执行。

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

请帮我以最少配置完成快速上架,只启用 Google 登录、Stripe 支付、R2 存储,跳过一切非必要集成。

目标:
- 登录只保留 Google OAuth,禁用邮箱密码和 GitHub。
- 支付只用 Stripe,不配置 Creem 或其他 Provider。
- 存储只用 Cloudflare R2。
- 本地跑通后一次性部署 Server 和 Web。

请按下面顺序执行:

### 第一步:Cloudflare 基础配置(使用 Chrome 插件 + Wrangler CLI)

核心目标:
- 认证:只保留 Google OAuth。禁用邮箱密码和 GitHub。
- 支付:Web 端只保留 Stripe。不要 Creem、RevenueCat 或其他支付 provider。
- 存储:只使用 Cloudflare R2。
- 先完整跑本地验证。
- 只有生产必需值都确认后,才部署 Server 和 Web。

重要安全规则:
- 最终回复里不要打印任何 secret。
- 不要提交 `.env``.dev.vars`、API key、webhook secret、OAuth secret 或生产 secret。
- 如果某个 secret 或不可公开值必须我在 Dashboard 手动提供,不要编造占位值;在交付结果中明确告诉我需要在哪里配置或复制什么,以及后续应该填到哪个文件或配置字段。`wrangler.jsonc` 里的公开配置按下方规则使用占位符。

重要 Stripe 规则:
- 不要依赖 Stripe CLI 默认账户。
- Stripe CLI 不会自动创建新的 Sandbox。
- 创建 Products / Prices 前,必须确认目标 Stripe Sandbox / account id。
- 所有创建或验证 Stripe 资源的 CLI 命令都必须显式传 `--api-key`

## Step 1:Cloudflare 配置

参考:https://developers.cloudflare.com/workers/wrangler/

你可以优先使用 Codex 的 @Chrome 插件打开 Cloudflare Dashboard,并基于我当前 Chrome 中已登录的 Cloudflare 会话获取或创建 Cloudflare 配置。除非 Chrome 未登录、需要我完成 MFA、账号权限不足,或 Cloudflare 页面无法显示必要信息,否则不要让我手动复制 `CLOUDFLARE_ACCOUNT_ID``CLOUDFLARE_API_TOKEN`

安全规则:
- 不要在最终回复、日志摘要或聊天中打印 `CLOUDFLARE_API_TOKEN`
- 不要使用 Cloudflare Global API Key。
- 创建 token 后,因为 token 只显示一次,请立即写入目标 env 文件,不要要求我贴到聊天里。
- 写入 secret 前,先确认目标文件不会被 Git 提交;如果 `.dev.vars``.env.production` 没有被 ignore,不要写入 secret,并在交付结果中说明需要先把这些文件加入 ignore 后再继续。
- `CLOUDFLARE_ACCOUNT_ID` 可以写入 env;`CLOUDFLARE_API_TOKEN` 只能写入 `.dev.vars``.env.production` 或通过部署 secret 命令设置,不能写入 `wrangler.jsonc`
- 如果需要我输入密码、验证码或完成 MFA,请暂停并让我在 Chrome 里完成,不要询问或记录这些信息。

`wrangler.jsonc` 必改规则:
- 不允许保留模板里的项目名、域名、D1、R2、Google Client ID 或 Analytics ID。下面这些字段必须换成当前项目自己的真实值;如果 Chrome 插件、Dashboard 或 CLI 创建失败,也要先改成清晰占位符,并在交付结果中标记为阻塞生产部署。
- `apps/server/wrangler.jsonc` 必须确认并更新:
  - `name`
  - `d1_databases[0].database_name`
  - `d1_databases[0].database_id`
  - `vars.WEBSITE_URL`
  - `vars.SERVER_URL`
  - `vars.GOOGLE_CLIENT_ID`
  - `r2_buckets[0].bucket_name`
- `apps/web/wrangler.jsonc` 必须确认并更新:
  - `name`
  - `services[0].service`
  - `vars.VITE_SERVER_URL`
  - `vars.VITE_APP_URL`
  - `vars.VITE_GA_MEASUREMENT_ID`
  - `vars.VITE_OPENPANEL_CLIENT_ID`
- 推荐占位符格式:`<YOUR_SERVER_WORKER_NAME>``<YOUR_WEB_WORKER_NAME>``<YOUR_D1_DATABASE_NAME>``<YOUR_D1_DATABASE_ID>``<YOUR_R2_BUCKET_NAME>``https://api.<ROOT_DOMAIN>``https://<ROOT_DOMAIN>``<YOUR_GOOGLE_CLIENT_ID>``<YOUR_GA_MEASUREMENT_ID>``<YOUR_OPENPANEL_CLIENT_ID>`。占位符存在时不要执行生产部署。

1. 先读取这些文件,确认 Cloudflare 配置位置:
   - `apps/server/wrangler.jsonc`
   - `apps/web/wrangler.jsonc`
   - `apps/server/.dev.vars.example`
   - `apps/server/.env.production.example`
   - `apps/server/drizzle.config.ts`
   - 根目录 `package.json`
   - 根目录 `.gitignore`

2. 检查 Wrangler:
   - 运行 `pnpm wrangler --version`

3. 检查本地 Wrangler 状态:
   - 运行 `pnpm wrangler whoami`
   - 如果已经能拿到 account name / account id,记录用于后续配置。
   - 如果未登录或信息不完整,继续使用 Chrome 插件打开 Cloudflare Dashboard 获取。

4. 使用 Chrome 插件打开 `https://dash.cloudflare.com`,确认当前登录的 Cloudflare account。如果我有多个 account,请根据项目名称、域名、现有 `wrangler.jsonc` 或让我确认目标 account,不要猜。

5. 如果缺少 env 文件,请基于 example 创建:
   - `apps/server/.dev.vars`
   - `apps/server/.env.production`
   - `apps/web/.env.development`
   - `apps/web/.env.production`

   Web env 只允许写公开配置,不允许写 secret。

   `apps/web/.env.development` 写入:
   - `VITE_SERVER_URL=http://localhost:3001`
   - `VITE_APP_URL=http://localhost:3000`

   `apps/web/.env.production` 写入:
   - `VITE_SERVER_URL=https://api.<ROOT_DOMAIN>`
   - `VITE_APP_URL=https://<ROOT_DOMAIN>`

   如果生产域名暂未确认,仍然创建 `apps/web/.env.production`,保留 `<ROOT_DOMAIN>` 占位,并在交付结果中告诉我后续需要把 `<ROOT_DOMAIN>` 替换成正式域名后再执行生产部署。

6. 获取 `CLOUDFLARE_ACCOUNT_ID`
   - 优先从 Cloudflare Dashboard 当前 account 页面获取 Account ID。
   - 如果 Wrangler `whoami` 已经返回同一个 account id,也可以使用该值。
   - 写入 `apps/server/.dev.vars``apps/server/.env.production`

7. 准备 `CLOUDFLARE_API_TOKEN`
   - 如果已有 token 原值不可查看,不要假设能恢复;请创建新的 scoped token。
   - 使用 Chrome 插件进入 Cloudflare Dashboard 的 API Tokens 页面。
   - 创建 Custom Token,名称建议:`easystarter-<project-name>-deploy`
   - 权限选择当前 UI 中对应的 Edit / Write 权限:
     - Account → D1 Write / D1 Edit
     - Account → Workers R2 Storage Write / Edit
     - Account → Workers Scripts Write / Edit
   - 如果项目使用 Queues,再加 Account → Queues Write / Edit。
   - Account Resources 只选择当前目标 account。
   - 如果项目后续要通过自定义域名或 route 部署 Worker,再补充所需的 Workers Routes / Zone 权限;否则不要扩大权限。
   - 创建 token 后,只把 token 写入 `apps/server/.dev.vars``apps/server/.env.production`,不要输出 token。

8. 验证 Cloudflare token:
   - 使用不会打印 token 的方式验证,例如从 env 文件临时加载变量后运行 `pnpm wrangler whoami`,不要 echo token。
   - 如果验证失败,说明是权限、account scope 还是 token 写入问题,并给出下一步。

9. 创建 D1 数据库:
   - 如果 `apps/server/wrangler.jsonc` 已有 `d1_databases[0].database_id`,先验证它属于当前 Cloudflare account。
   - 运行 `pnpm wrangler d1 create <database-name>`
   - 把返回的 `database_id` 和数据库名写入:
     - `apps/server/wrangler.jsonc``d1_databases[0].database_id`
     - `apps/server/wrangler.jsonc``d1_databases[0].database_name`
     - `apps/server/.dev.vars``CLOUDFLARE_D1_DATABASE_ID`
     - `apps/server/.env.production``CLOUDFLARE_D1_DATABASE_ID`
   - 确认 `d1_databases[0].binding` 和项目代码使用的绑定名一致,通常是 `DB`
   - 如果 D1 创建或验证失败,把 `apps/server/wrangler.jsonc``d1_databases[0].database_name` 改成 `<YOUR_D1_DATABASE_NAME>``d1_databases[0].database_id` 改成 `<YOUR_D1_DATABASE_ID>`,不要保留旧模板值,并在交付结果中说明失败原因和后续创建命令。

10. 创建 R2 bucket:
   - 运行 `pnpm wrangler r2 bucket create <bucket-name>`
   - 把 bucket 名写入 `apps/server/wrangler.jsonc``r2_buckets[0].bucket_name`
   - 保持 R2 binding 为 `STORAGE`
   - 如果 R2 创建或验证失败,把 `apps/server/wrangler.jsonc``r2_buckets[0].bucket_name` 改成 `<YOUR_R2_BUCKET_NAME>`,不要保留旧模板值,并在交付结果中说明失败原因和后续创建命令。

11. 配置 R2 公共访问 URL:
   - 本地开发:
     - 在 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 里绑定自定义域名,例如 `storage.yourdomain.com`
     - 该域名必须已经在当前 Cloudflare 账户里。
     - 把生产存储 URL 写入 `apps/server/.env.production``R2_PUBLIC_URL`
   - 如果域名还不在 Cloudflare 里,先使用 `r2.dev` 公开地址继续;在交付结果中列出后续需要把域名添加到 Cloudflare、绑定 R2 Custom Domain、更新 `R2_PUBLIC_URL` 并重新推送生产 Secrets。

12. 设置 Cloudflare Worker 名称:
   -`apps/server/wrangler.jsonc` 设置 Server Worker 的 `name`,例如 `<project-name>-server`
   -`apps/web/wrangler.jsonc` 设置 Web Worker 的 `name`,例如 `<project-name>-web`
   - 如果无法确认项目名或目标 Worker 名,不要保留旧模板值;分别写入 `<YOUR_SERVER_WORKER_NAME>``<YOUR_WEB_WORKER_NAME>`

13. 配置 Web → Server Service Binding:
   - 确保 `apps/web/wrangler.jsonc``services[0].service` 精确匹配 Server Worker 名称。
   - 保持应用代码预期的 binding 名称。
   - 如果 Server Worker 名仍未确认,先把 `services[0].service` 写成 `<YOUR_SERVER_WORKER_NAME>`,不要保留旧模板值。

14. 配置 Cloudflare env 文件:
   - `apps/server/.dev.vars`
     - `CLOUDFLARE_ACCOUNT_ID`
     - `CLOUDFLARE_API_TOKEN`
     - `CLOUDFLARE_D1_DATABASE_ID`
     - `BETTER_AUTH_SECRET`
   - `apps/server/.env.production`
     - 同样的 Cloudflare 值
     - 单独生成一个生产用 `BETTER_AUTH_SECRET`
   - 使用下面命令生成 Better Auth secret:
     `openssl rand -base64 32`
   - 不要打印 token 值。

15. 配置生产 URL:
   -`apps/server/wrangler.jsonc` 的 vars 里设置:
     - `SERVER_URL`
     - `WEBSITE_URL`
   -`apps/web/wrangler.jsonc` 的 vars 里设置:
     - `VITE_SERVER_URL`
     - `VITE_APP_URL`
     - `VITE_GA_MEASUREMENT_ID`
     - `VITE_OPENPANEL_CLIENT_ID`
   -`apps/web/.env.production` 里设置同样的公开生产 URL:
     - `VITE_SERVER_URL`
     - `VITE_APP_URL`
   -`apps/web/.env.development` 里设置本地公开 URL:
     - `VITE_SERVER_URL=http://localhost:3001`
     - `VITE_APP_URL=http://localhost:3000`
   - 如果生产域名还没确认,生产 URL 保持 `<ROOT_DOMAIN>` 占位,并在交付结果中告诉我后续需要把 `<ROOT_DOMAIN>` 替换成正式域名后再执行生产部署。
   - 如果 GA 或 OpenPanel 暂未创建,`apps/web/wrangler.jsonc` 里分别写 `<YOUR_GA_MEASUREMENT_ID>``<YOUR_OPENPANEL_CLIENT_ID>`,不要保留旧模板值;占位符存在时不要部署生产。

## Step 2:只保留 Google 登录

1. 打开 `apps/server/src/lib/auth.ts`
2. `socialProviders` 里只保留 `google`
3. 注释 GitHub,保持禁用;不要删除相关代码。
4. 确保 `emailAndPassword` 禁用:
   - 如果存在 `emailAndPassword`,保持 disabled。
   - 不要启用邮箱密码登录。
5. 配置 Google OAuth 变量:
   - `GOOGLE_CLIENT_ID`
     - 写入 `apps/server/wrangler.jsonc``vars`
   - `GOOGLE_CLIENT_SECRET`
     - 写入 `apps/server/.dev.vars`
     - 写入 `apps/server/.env.production`
6. 如果还没有 Google OAuth 凭证,优先使用 Codex 的 @Chrome 插件打开 Google Cloud Console,并基于我当前 Chrome 中已登录的 Google 账号创建:
   - 打开 `https://console.cloud.google.com/apis/credentials`
   - 如果我有多个 Google Cloud project,请根据项目名称、生产域名或让我确认目标 project,不要猜。
   - 如果需要配置 OAuth consent screen,选择 External,并按最小上线需要填写应用名、用户支持邮箱、开发者联系邮箱;不要添加多余 scope。
   - 创建 OAuth Client ID。
   - Application type 选择 Web application。
   - 名称建议:`<project-name>-web`
   - Authorized JavaScript origins:
     - 本地 Web URL,通常是 `http://localhost:3000``http://localhost:3001`
     - 生产 Web URL
   - Authorized redirect URIs:
     - 本地:`http://localhost:3001/api/auth/callback/google`
     - 生产:`{SERVER_URL}/api/auth/callback/google`
   - 创建完成后,把 Client ID 写入 `apps/server/wrangler.jsonc``vars.GOOGLE_CLIENT_ID`
   - 把 Client Secret 写入 `apps/server/.dev.vars``apps/server/.env.production``GOOGLE_CLIENT_SECRET`,不要在最终回复、日志摘要或聊天中打印 secret。
   - 如果 Chrome 未登录、需要我完成 MFA、账号权限不足、Google Cloud 页面无法显示必要信息,或 Chrome 插件无法完成创建,请把 `apps/server/wrangler.jsonc``vars.GOOGLE_CLIENT_ID` 改成 `<YOUR_GOOGLE_CLIENT_ID>`,不要保留旧模板值;暂停让我在 Chrome 里完成必要操作,不要询问或记录密码、验证码。
7. 确认 `apps/server/.dev.vars` 里已经填写 `BETTER_AUTH_SECRET`
8. 本地验证点击 Google 登录会跳到 Google,并能回到应用。
   - 如果 Chrome 能访问 Google,但 shell / Workers runtime 不能访问 Google,检查系统代理,并用显式 proxy env 启动本地 dev。

## Step 3:只保留 Stripe 支付

参考:
- https://docs.stripe.com/stripe-cli
- https://docs.stripe.com/sandboxes
- https://docs.stripe.com/sandboxes/dashboard/manage

你可以优先使用 Codex 的 @Chrome 插件打开 Stripe Dashboard,并基于我当前 Chrome 中已登录的 Stripe 会话完成账号确认、Sandbox 选择或创建、API Key 获取、生产 webhook 配置等 Dashboard 操作。Products / Prices 创建、本地 webhook forwarding 和 CLI 验证仍优先使用 Stripe CLI,并且所有 Stripe CLI 命令都必须显式传 `--api-key`

安全规则:
- 不要在最终回复、日志摘要或聊天中打印 `STRIPE_SECRET_KEY``STRIPE_WEBHOOK_SECRET`
- 不要依赖 Stripe CLI 默认账户。
- 不要使用错误 sandbox 或 live account 的 key。
- 获取 secret 后请立即写入对应 env 文件,不要要求我贴到聊天里。
- 如果需要我输入密码、验证码或完成 MFA,请暂停并让我在 Chrome 里完成,不要询问或记录这些信息。

1. 确认 Web 支付 provider:
   - 确认 `packages/app-config/src/app-config.ts``web.payments.provider``stripe`
   - 禁用或注释 Creem、RevenueCat 或其他 Web 支付 provider;不要删除相关代码。

2. 检查 Stripe CLI:
   - 运行 `stripe --version`
   - 如果 macOS 未安装:
     `brew install stripe/stripe-cli/stripe`

3. 选择或创建目标 Stripe Sandbox:
   - 使用 Chrome 插件打开 Stripe Dashboard。
   - 打开账户切换器。
   - 点击 `Switch to sandbox`
   - 选择当前项目对应的 sandbox,或者新建一个名为 `<project-name>` 的 sandbox。
   - 创建 Products / Prices 前,必须确认选中的 sandbox/account name 和 account id(`acct_...`)。
   - 如果 Chrome 未登录、需要 MFA、权限不足,或页面无法显示必要信息,请暂停并让我在 Chrome 里完成。

4. 获取目标 Sandbox 的 test secret key:
   - 使用 Chrome 插件进入选中的 sandbox,打开 Developers → API keys。
   - 获取 test secret key(`sk_test_...`)。
   - 写入 `apps/server/.dev.vars``STRIPE_SECRET_KEY`
   - 不要在聊天、日志摘要或最终回复中打印 key。
   - 不要使用其他 sandbox/account 的 key。

5. 验证 API key 属于目标 sandbox:
   - 运行:
     `stripe accounts retrieve --api-key "$STRIPE_SECRET_KEY"`
   - 确认返回的 account id 和 display name 与目标 sandbox 一致。
   - 如果不一致,不要继续创建 Stripe 资源;在交付结果中告诉我需要从目标 sandbox 的 Developers → API keys 获取正确 key,并重新写入 `apps/server/.dev.vars``STRIPE_SECRET_KEY`

6. 使用显式 `--api-key` 创建 Products 和 Prices:
   - 创建 Pro product:
     `stripe products create --name="Pro" --api-key "$STRIPE_SECRET_KEY"`
   - 创建 Pro 月付 price:
     `stripe prices create --product=<prod_id> --currency=usd --unit-amount=1000 --recurring[interval]=month --api-key "$STRIPE_SECRET_KEY"`
   - 创建 Pro 年付 price:
     `stripe prices create --product=<prod_id> --currency=usd --unit-amount=10000 --recurring[interval]=year --api-key "$STRIPE_SECRET_KEY"`
   - 创建 Lifetime product:
     `stripe products create --name="Lifetime" --api-key "$STRIPE_SECRET_KEY"`
   - 创建 Lifetime price:
     `stripe prices create --product=<prod_id> --currency=usd --unit-amount=200000 --api-key "$STRIPE_SECRET_KEY"`
   - 如果应用有 credit packs,也在同一个目标 sandbox 里用显式 `--api-key` 创建对应 prices。
   - 把每个返回的 `price_...` 写入 `packages/app-config/src/app-config.ts` 里对应的 `providerPriceIds.test`

7. 本地 Webhook:
   - 用同一个 sandbox key 启动 webhook forwarding:
     `stripe listen --api-key "$STRIPE_SECRET_KEY" --forward-to http://localhost:3001/api/webhooks/stripe`
   - 把输出的 `whsec_...` 写入 `apps/server/.dev.vars``STRIPE_WEBHOOK_SECRET`
   - 更新 `STRIPE_WEBHOOK_SECRET` 后重启本地 server。

8. 本地 Stripe 验证:
   - 触发测试事件:
     `stripe trigger checkout.session.completed --api-key "$STRIPE_SECRET_KEY"`
   - 确认本地 server 收到 `POST /api/webhooks/stripe`,HTTP 200。
   - 通用 CLI trigger 可能没有应用自己的 user metadata,如果签名验证和投递成功,业务层 skip log 可以接受。
   - 同时使用 Chrome 插件打开本地 Web,走一次真实 Checkout,并用测试卡验证:
     `4242 4242 4242 4242`
   - 确认 Stripe Checkout 能完成支付并回跳到应用。

9. 生产 Stripe 配置:
   - 除非我明确确认 live account,否则不要创建或覆盖生产价格。
   - 使用 Chrome 插件打开 Stripe Dashboard,确认目标 live account name 和 account id。
   - 从目标 live Stripe account 获取 live secret key(`sk_live_...`)。
   - 写入 `apps/server/.env.production``STRIPE_SECRET_KEY`
   - 在 live account 中创建或确认 live Products / Prices。
   - 把每个 live `price_...` 写入 `providerPriceIds.production`
   - 使用 Chrome 插件在 Stripe Dashboard 配置生产 webhook:
     `{SERVER_URL}/api/webhooks/stripe`
   - 把生产 Signing secret 写入 `apps/server/.env.production``STRIPE_WEBHOOK_SECRET`
   - 不要在聊天、日志摘要或最终回复中打印 live key 或 signing secret。

## Step 4:只使用 R2 存储

1. 确认 app config 的 storage provider 是 `r2`
2. 禁用或注释所有非 R2 storage provider;不要删除相关代码。
3. 确认 server storage binding 是 `STORAGE`
4. 本地验证:
   - 如果已经登录,用应用上传流程验证。
   - 或者做最小 Wrangler R2 smoke test:
     - 写入一个临时对象
     - 读回
     - 删除
5. 不要在 bucket 里留下 smoke-test 对象。

## Step 5:数据库迁移

1. 确认 `apps/server/wrangler.jsonc``d1_databases[0].database_id` 已填写。
2. 运行:
   - `pnpm db:generate`
   - `pnpm db:migrate:local`
3. 生产准备好后再运行:
   - `pnpm db:migrate`

## Step 6:本地验证

启动:

`pnpm dev:web+server`

验证:
- Web 本地正常渲染。
- Server health/root endpoint 正常响应。
- Google OAuth 能跳到 Google 并回到应用。
- Stripe test checkout 能用测试卡 `4242 4242 4242 4242` 完成。
- Stripe webhook 收到事件并返回 HTTP 200。
- R2 上传或 R2 smoke test 成功。
- 没有 GitHub 登录。
- 没有邮箱密码登录。
- 没有 Creem/RevenueCat Web 支付路由。

根据改动运行:
- `pnpm check-types`
- `pnpm --filter server exec wrangler deploy --dry-run`
- `pnpm --filter web exec wrangler deploy --dry-run`

## Step 7:只有生产值完整后,才一次性部署

部署前确认:
- `apps/server/.env.production` 已填写:
  - `CLOUDFLARE_ACCOUNT_ID`
  - `CLOUDFLARE_API_TOKEN`
  - `CLOUDFLARE_D1_DATABASE_ID`
  - `BETTER_AUTH_SECRET`
  - `GOOGLE_CLIENT_SECRET`
  - `R2_PUBLIC_URL`
  - `STRIPE_SECRET_KEY`
  - `STRIPE_WEBHOOK_SECRET`
  - 其他应用必需的生产 secret
- `packages/app-config/src/app-config.ts``providerPriceIds.production` 是真实值,不是占位符。
- `apps/server/wrangler.jsonc` 已换成当前项目自己的值,且没有占位符:
  - `name`
  - `d1_databases[0].database_name`
  - `d1_databases[0].database_id`
  - `r2_buckets[0].bucket_name`
- `apps/server/wrangler.jsonc` 生产 vars 正确:
  - `SERVER_URL`
  - `WEBSITE_URL`
  - `GOOGLE_CLIENT_ID`
- `apps/web/wrangler.jsonc` 已换成当前项目自己的值,且没有占位符:
  - `name`
  - `services[0].service`
- `apps/web/wrangler.jsonc` 生产 vars 正确:
  - `VITE_SERVER_URL`
  - `VITE_APP_URL`
  - `VITE_GA_MEASUREMENT_ID`
  - `VITE_OPENPANEL_CLIENT_ID`
- `apps/web/wrangler.jsonc` service binding 指向 Server Worker。
- `apps/web/wrangler.jsonc``services[0].service``apps/server/wrangler.jsonc``name` 完全一致。
- Google OAuth 生产 redirect URI 已配置:
  `{SERVER_URL}/api/auth/callback/google`
- Stripe 生产 webhook 已配置:
  `{SERVER_URL}/api/webhooks/stripe`
- R2 生产自定义域名已配置,并写入 `R2_PUBLIC_URL`

然后部署:
1. `pnpm -F server secrets:bulk:production`
2. `pnpm db:migrate`
3. `pnpm deploy:server`
4. `pnpm deploy:web`

部署后验证:
- Web 生产 URL。
- Server 生产 URL。
- 生产 Google 登录。
- Stripe live/test 按当前阶段验证。
- R2 public file URL。

## 交付物

最后给我一份简洁报告,包含:

- Cloudflare Worker 名称:
  - Server
  - Web
- D1 数据库:
  - name
  - database_id
- R2:
  - bucket name
  - 本地 `R2_PUBLIC_URL`
  - 生产 `R2_PUBLIC_URL`
- Service Binding:
  - Web binding name
  - 目标 Server Worker name
- 启用的登录方式:
  - Google only
- Stripe:
  - 目标 sandbox account id/name
  - test Price ID 到 plan 的映射
  - production Price ID 到 plan 的映射
- 写入过的 env/vars 文件:
  - 只列文件名和变量名,不列 secret 值
- 生产 URL 表:
  - Web URL
  - Server URL
  - Storage URL
- 如果有占位符或 Chrome 插件 / Dashboard / CLI 创建失败:
  - 列出具体字段
  - 说明失败原因
  - 给出后续要进入哪个 Dashboard 或执行哪个命令补齐
- 执行过的验证命令和结果
- 仍需要我手动完成的 Dashboard 步骤

Prompt 2:启动 Web + Server 端

这个 Prompt 用于在本地启动 Web 和 Server,适合首次拉起项目、检查 Web/Server env 配置、确认前端能连接本地 API。

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

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

目标:
- 根据项目已有脚本启动 Web 客户端和 Server 端。
- Web 客户端依赖 Server API 地址和 Web 端环境变量。
- Web 端和 Server 端都可能需要必须的环境变量,请先检查并尽量帮我配置好。

请按下面顺序执行:
1. 先阅读根目录 `package.json``apps/web/package.json``apps/server/package.json``apps/web/.env*.example``apps/server/.env*.example``apps/web/wrangler.jsonc``apps/server/wrangler.jsonc`,确认项目实际启动命令和必需配置。
2. 如果缺少本地 env 文件,请根据 example 创建本地开发用 env 文件;只填入可以从 example 或本地默认值安全推断的值,不要编造真实密钥。
3. 检查 Web 端本地地址和 Server 端本地地址,默认优先使用项目脚本或文档中的端口。
4. 确认 `VITE_SERVER_URL``VITE_APP_URL`、Server 侧 `SERVER_URL``WEBSITE_URL` 在本地开发时互相匹配。
5. 启动 Server,本地默认端口优先使用项目脚本中定义的端口。
6. Server 正常后启动 Web 客户端,并说明我应该在终端或浏览器里看到什么结果。

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

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

Prompt 3:Cloudflare 基础配置 + D1 数据库

这个 Prompt 用于准备 Web 项目的 Cloudflare 基础凭据,并创建或接入 D1 数据库,为 Workers、D1、R2 与后续部署打好配置基础。

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

请帮我完成 Cloudflare 基础配置,并创建或接入 D1 数据库。

你可以优先使用 Codex 的 @Chrome 插件打开 Cloudflare Dashboard,并基于我当前 Chrome 中已登录的 Cloudflare 会话获取或创建 Cloudflare 配置。除非 Chrome 未登录、需要我完成 MFA、账号权限不足,或 Cloudflare 页面无法显示必要信息,否则不要让我手动复制 `CLOUDFLARE_ACCOUNT_ID``CLOUDFLARE_API_TOKEN`

目标:
- 获取并配置 `CLOUDFLARE_ACCOUNT_ID`
- 创建或准备可用于 Wrangler、Workers、D1、R2 的 `CLOUDFLARE_API_TOKEN`
- 创建或接入 Cloudflare D1 数据库。
- 同步配置 `apps/server/wrangler.jsonc``apps/server/.dev.vars``apps/server/.env.production`
- 跑通本地数据库迁移流程。

安全规则:
- 不要在最终回复、日志摘要或聊天中打印 `CLOUDFLARE_API_TOKEN`
- 不要使用 Cloudflare Global API Key。
- 创建 token 后,因为 token 只显示一次,请立即写入目标 env 文件,不要要求我贴到聊天里。
- 写入 secret 前,先确认目标文件不会被 Git 提交;如果 `.dev.vars``.env.production` 没有被 ignore,不要写入 secret,并在交付结果中说明需要先把这些文件加入 ignore 后再继续。
- `CLOUDFLARE_ACCOUNT_ID` 可以写入 env;`CLOUDFLARE_API_TOKEN` 只能写入 `.dev.vars``.env.production` 或通过部署 secret 命令设置,不能写入 `wrangler.jsonc`
- 如果需要我输入密码、验证码或完成 MFA,请暂停并让我在 Chrome 里完成,不要询问或记录这些信息。

请按下面顺序执行:
1. 先读取这些文件,确认项目实际配置位置:
   - `apps/server/wrangler.jsonc`
   - `apps/web/wrangler.jsonc`
   - `apps/server/.dev.vars.example`
   - `apps/server/.env.production.example`
   - `apps/server/drizzle.config.ts`
   - `apps/server/src/db/schema`
   - 根目录 `package.json`
   - 根目录 `.gitignore`
2. 检查本地 Wrangler 状态:
   - 运行 `pnpm wrangler --version`
   - 运行 `pnpm wrangler whoami`
   - 如果已经能拿到 account name / account id,记录用于后续配置。
   - 如果未登录或信息不完整,继续使用 Chrome 插件打开 Cloudflare Dashboard 获取。
3. 使用 Chrome 插件打开 `https://dash.cloudflare.com`,确认当前登录的 Cloudflare account。如果我有多个 account,请根据项目名称、域名、现有 `wrangler.jsonc` 或让我确认目标 account,不要猜。
4. 如果缺少 env 文件,请基于 example 创建:
   - `apps/server/.dev.vars`
   - `apps/server/.env.production`
5. 获取 `CLOUDFLARE_ACCOUNT_ID`
   - 优先从 Cloudflare Dashboard 当前 account 页面获取 Account ID。
   - 如果 Wrangler `whoami` 已经返回同一个 account id,也可以使用该值。
   - 写入 `apps/server/.dev.vars``apps/server/.env.production`
6. 准备 `CLOUDFLARE_API_TOKEN`
   - 如果已有 token 原值不可查看,不要假设能恢复;请创建新的 scoped token。
   - 使用 Chrome 插件进入 Cloudflare Dashboard 的 API Tokens 页面。
   - 创建 Custom Token,名称建议:`easystarter-<project-name>-deploy`
   - 权限选择当前 UI 中对应的 Edit / Write 权限:
     - Account → D1 Write / D1 Edit
     - Account → Workers R2 Storage Write / Edit
     - Account → Workers Scripts Write / Edit
   - Account Resources 只选择当前目标 account。
   - 如果项目后续要通过自定义域名或 route 部署 Worker,再补充所需的 Workers Routes / Zone 权限;否则不要扩大权限。
   - 创建 token 后,只把 token 写入 env 文件,不要输出 token。
7. 写入或更新这些变量:
   - `CLOUDFLARE_ACCOUNT_ID`
   - `CLOUDFLARE_API_TOKEN`
8. 验证 Cloudflare token:
   - 使用不会打印 token 的方式验证,例如从 env 文件临时加载变量后运行 `pnpm wrangler whoami`,不要 echo token。
   - 如果验证失败,说明是权限、account scope 还是 token 写入问题,并给出下一步。
9. 创建或接入 D1 数据库:
   - 检查 `apps/server/wrangler.jsonc` 是否已有 `d1_databases[0].database_id`
   - 检查 `apps/server/.dev.vars``apps/server/.env.production` 是否已有 `CLOUDFLARE_D1_DATABASE_ID`
   - 如果已有 D1 database id,请验证它属于当前 Cloudflare account。
   - 如果还没有 D1 数据库,请优先使用项目推荐命令创建,例如 `pnpm wrangler d1 create <database-name>`
   - database name 根据项目名生成,保持简洁,例如 `<project-name>-db`
   - 拿到 `database_id` 后,写入:
     - `apps/server/wrangler.jsonc``d1_databases[0].database_id`
     - `apps/server/wrangler.jsonc``d1_databases[0].database_name``database_name`
     - `apps/server/.dev.vars``CLOUDFLARE_D1_DATABASE_ID`
     - `apps/server/.env.production``CLOUDFLARE_D1_DATABASE_ID`
10. 确认 D1 binding:
    - 检查 `apps/server/wrangler.jsonc``d1_databases[0].binding`
    - 确认它和项目代码使用的绑定名一致,通常是 `DB`
    - 如果项目代码使用的绑定名不是 `DB`,以项目代码为准,不要随意改代码。
11. 执行本地数据库流程:
    - 运行 `pnpm db:generate`
    - 运行 `pnpm db:migrate:local`
    - 如果项目脚本名称不同,以根目录 `package.json` 中的实际脚本为准。
    - 小改动无需执行 lint。
12. 本次只做 Cloudflare 基础凭据和 D1 数据库配置:
    - 不要顺手配置 R2 bucket。
    - 不要部署 Worker。
    - 不要重构代码。
    - 不要修改认证、支付、邮件等无关模块。

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

交付结果请包含:
- Cloudflare 登录状态。
- 目标 Cloudflare account name。
- `CLOUDFLARE_ACCOUNT_ID` 是否已写入。
- `CLOUDFLARE_API_TOKEN` 是否已创建并写入,但不要输出 token。
- token 权限清单。
- D1 database name 和 database_id。
- D1 binding 名称。
- 已创建或修改的文件。
- 执行过的数据库命令和结果。
- 如果失败,给出失败原因和下一步处理方式。
- 下一步建议继续做 R2 存储、认证服务还是部署。

Prompt 4:邮件服务

这个 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/web/integrations/email

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

Prompt 5:认证服务

这个 Prompt 用于配置 Web 端认证服务,检查邮箱密码、Google OAuth、GitHub、回调地址、Server/Web URL 和相关 env 是否一致。

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

请帮我配置 Web 端认证服务。

目标:
- 跑通邮箱密码、GitHub OAuth 和 Google OAuth。
- 确保 Server URL、Web URL、OAuth 回调地址和 CORS trusted origins 一致。
- 对无法自动创建的第三方后台配置,给我明确的操作清单。

请按下面顺序执行:
1. 读取 `apps/server/src/lib/auth.ts``apps/web/src` 中 auth client 相关代码、`packages/app-config/src/app-config.ts``apps/server/wrangler.jsonc``apps/web/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``VITE_SERVER_URL``VITE_APP_URL` 是否互相匹配。
4. 配置 GitHub OAuth:
   - 本地回调地址通常为 `http://localhost:3001/api/auth/callback/github`
   - 生产回调地址为 `{SERVER_URL}/api/auth/callback/github`
   - `GITHUB_CLIENT_ID` 放到公开配置或 vars,`GITHUB_CLIENT_SECRET` 放到 secret/env 文件。
5. 配置 Google OAuth:
   - Authorized JavaScript origins 填 Web 地址,例如 `{WEBSITE_URL}`
   - Authorized redirect URIs 填 `{SERVER_URL}/api/auth/callback/google`
   - `GOOGLE_CLIENT_ID` 放到公开配置或 vars,`GOOGLE_CLIENT_SECRET` 放到 secret/env 文件。
6. 如果启用了邮箱注册验证或忘记密码,请确认邮件服务已配置。
7. 不要编造 GitHub、Google 的真实凭据;如果缺失,请列出后台创建步骤和填写位置。
8. 启动 Web + Server,验证注册、登录、退出、OAuth 回调和会话保持。

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

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

Prompt 6:阿里云手机号登录

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

通用执行规则:
- 如果某个步骤需要用户去第三方后台手动操作,必须一步一步说明:从哪里进入、点击哪个菜单、创建或复制什么值、选择什么权限或类型、复制后填入哪个文件或配置字段,以及下一步验证命令。不要只写“需要手动配置”。
- 明确区分公开配置和 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 登录相关变量和 UI 是否可以不配置或隐藏,并给出建议。
7. 启动本地 Server 和 Web 后,验证发送验证码和校验验证码接口。

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

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

Prompt 7:存储服务

这个 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 和 Web,验证头像或附件上传接口是否正常。

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

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

Prompt 8:Stripe 支付

这个 Prompt 用于接入 Stripe 支付,配置商品、价格、Secret Key、Webhook、本地测试卡验证和生产环境同步。

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

请帮我配置 Web 端 Stripe 支付。

目标:
- 使用项目内置 Stripe Provider。
- 配置订阅、一次性买断、Billing Portal 和 Webhook。
- 更新服务端环境变量和 `app-config.ts` 定价计划。

请按下面顺序执行:
1. 读取 `packages/app-config/src/app-config.ts``apps/server/src/payments``apps/server/.dev.vars.example``apps/server/.env.production.example`、Web 端定价和账单页面。
2. 确认 `web.payments.provider` 是否为 `stripe`;如果不是,请先说明当前 provider 和切换影响。
3. 检查并配置服务端变量:
   - `STRIPE_SECRET_KEY`
   - `STRIPE_WEBHOOK_SECRET`
4. 如果我没有提供 Stripe Secret Key,请告诉我去 Stripe Dashboard 的 Developers → API keys 获取:
   - 测试环境使用 `sk_test_`
   - 生产环境使用 `sk_live_`
5. 指导我在 Stripe Products 中创建:
   - Pro 月付 Price
   - Pro 年付 Price
   - Lifetime 一次性 Price
6. 将 Stripe Price ID 写入 `packages/app-config/src/app-config.ts``web.payments.plans`,确保:
   - `providerPriceId``price_...`
   - `amountCents` 与 Stripe 后台价格一致
   - `priceType``interval``trialDays``status` 正确
7. 本地 Webhook 使用 Stripe CLI:
   - 如果未安装,提示 macOS 可执行 `brew install stripe/stripe-cli/stripe`
   - 执行 `stripe login`
   - 执行 `stripe listen --forward-to http://localhost:3001/api/webhooks/stripe`
   - 将终端输出的 `whsec_...` 写入 `apps/server/.dev.vars`
8. 生产 Webhook 在 Stripe Dashboard 配置,URL 为 `{SERVER_URL}/api/webhooks/stripe`,并把 Signing secret 写入 `apps/server/.env.production`
9. 检查 Billing Portal 是否已在 Stripe Dashboard 启用。
10. 启动 Web + Server,使用 Stripe 测试卡验证订阅和买断流程。

参考文档:
https://www.easystarter.dev/zh/docs/web/integrations/payments/stripe

交付结果请包含:
- Stripe 环境变量写入位置。
- Price ID 与本地套餐配置对照。
- Webhook 本地和生产配置。
- Billing Portal 配置状态。
- 本地支付验证步骤。

Prompt 9:Creem 支付

这个 Prompt 用于接入 Creem 支付,配置商品价格、API Key、Webhook,并与 app-config.ts 中的 Web 支付方案保持一致。

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

请帮我配置 Web 端 Creem 支付。

目标:
- 使用项目内置 Creem Provider。
- 配置订阅、一次性买断、客户账单管理门户和 Webhook。
- 更新服务端环境变量和 `app-config.ts` 定价计划。

请按下面顺序执行:
1. 读取 `packages/app-config/src/app-config.ts``apps/server/src/payments``apps/server/.dev.vars.example``apps/server/.env.production.example`、Web 端定价和账单页面。
2. 确认 `web.payments.provider` 是否为 `creem`;如果不是,请先说明当前 provider 和切换影响。
3. 检查并配置服务端变量:
   - `CREEM_API_KEY`
   - `CREEM_WEBHOOK_SECRET`
4. 如果我没有提供 Creem API Key,请告诉我去 Creem 控制台获取:
   - 测试环境使用 `creem_test_`
   - 生产环境使用 `creem_live_`
5. 指导我在 Creem Products 中创建:
   - Pro 月付产品
   - Pro 年付产品
   - Lifetime 一次性产品
6. 将 Creem Product ID 写入 `packages/app-config/src/app-config.ts``web.payments.plans`,确保:
   - `providerPriceId``prod_...`
   - `amountCents` 与 Creem 后台价格一致
   - `trialDays` 与 Creem 产品里设置的试用天数一致
   - `priceType``interval``status` 正确
7. 本地 Webhook 使用 ngrok:
   - 如果未安装 ngrok,提示 macOS 可执行 `brew install ngrok/ngrok/ngrok`,或到 https://ngrok.com/download 下载。
   - 如需 authtoken,提示执行 `ngrok config add-authtoken <your-token>`
   - 启动 Server 后执行 `ngrok http 3001`
   - Creem Webhook URL 填 `{ngrok_https_url}/api/webhooks/creem`
8. 生产 Webhook 在 Creem 控制台配置,URL 为 `{SERVER_URL}/api/webhooks/creem`,并把 Webhook Secret 写入 `apps/server/.env.production`
9. 启动 Web + Server,验证订阅、买断和账单管理门户流程。

参考文档:
https://www.easystarter.dev/zh/docs/web/integrations/payments/creem

交付结果请包含:
- Creem 环境变量写入位置。
- Product ID 与本地套餐配置对照。
- Webhook 本地和生产配置。
- 本地支付验证步骤。

Prompt 10:部署 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`
   - `GITHUB_CLIENT_SECRET`
   - `GOOGLE_CLIENT_SECRET`
   - `RESEND_API_KEY`
   - `R2_PUBLIC_URL`
   - `STRIPE_SECRET_KEY`
   - `STRIPE_WEBHOOK_SECRET`
   - `CREEM_API_KEY`
   - `CREEM_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`
   - `WEBSITE_URL`
   - Web 端 `VITE_SERVER_URL`
   - GitHub / Google OAuth 回调地址
   - Stripe / Creem Webhook URL
10. 部署后访问健康检查或关键 API,确认 Worker 正常响应。

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

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

Prompt 11:部署 Web

这个 Prompt 用于把 Web 端部署到 Cloudflare Workers,配置 Web Worker、Service Binding、生产 URL 和前端公开环境变量。

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

请帮我部署 Web 到 Cloudflare Workers。

目标:
- 将 TanStack Start Web 应用部署到 Cloudflare Workers。
- 确认 Web Worker 与 Server Worker 的 Service Binding 正确。
- 配置生产 Web URL 和 Server URL。

请按下面顺序执行:
1. 读取 `apps/web/wrangler.jsonc``apps/server/wrangler.jsonc``apps/web/package.json`、根目录 `package.json`
2. 确认 Server 已经部署完成,且 `apps/server/wrangler.jsonc``name` 是真实 Server Worker 名称。
3. 检查 `apps/web/wrangler.jsonc`
   - `name`
   - `services[0].binding`
   - `services[0].service`
   - `vars.VITE_SERVER_URL`
   - `vars.VITE_APP_URL`
4. 确保 `services[0].service` 与 Server Worker 的 `name` 完全一致。
5. 确保 `VITE_SERVER_URL` 指向生产 Server 地址,`VITE_APP_URL` 指向生产 Web 地址。
6. 执行部署命令,优先使用项目脚本,例如 `pnpm deploy:web`
7. 部署成功后,记录 Web Worker URL。
8. 如果绑定自定义域名,请同步更新:
   - `apps/web/wrangler.jsonc``VITE_APP_URL`
   - `apps/web/wrangler.jsonc``VITE_SERVER_URL`
   - `apps/server/wrangler.jsonc``WEBSITE_URL`
   - OAuth 后台的 Homepage URL 和回调地址
9. 重新部署 Web 和必要的 Server,使静态 vars 生效。
10. 访问线上 Web,验证首页、登录、支付、文件上传等关键流程。

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

交付结果请包含:
- 实际部署命令。
- Web Worker URL 或自定义 Web URL。
- Service Binding 检查结果。
- 修改过的配置文件。
- 线上验证清单。

Prompt 12:主题系统

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

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

请帮我配置 Web 端主题系统。

目标:
- 调整默认主题预设。
- 如有需要,新增一个主题 Preset。
- 确保亮色、暗色 CSS 变量完整,并验证主题切换和持久化。

请按下面顺序执行:
1. 读取 `apps/web/src/configs/theme-presets.ts`、Web 端主题 provider / hook / config 相关文件、`packages/app-config/src/app-config.ts`
2. 先说明当前主题系统:
   - 外观模式:`light``dark``system`
   - 主题预设列表
   - 用户偏好 localStorage key
3. 如果我只想改默认主题,请调整 `theme-presets.ts``themePresets` 的顺序,把目标 preset 放到第一位。
4. 如果我要新增主题,请在 `themePresets` 中添加新 key,并提供:
   - `label`
   - `styles.light`
   - `styles.dark`
5. 新主题必须包含和现有主题完全相同的 CSS 变量名,避免运行时样式缺失。
6. 检查主题选择 UI 是否会自动展示新增 preset;如果不会,请补充对应配置。
7. 启动 Web,检查亮色/暗色/跟随系统切换、主题 preset 切换、刷新后偏好是否持久化、首屏是否无明显闪烁。

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

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

Prompt 13:落地页配置

这个 Prompt 用于配置 Web 落地页内容,把模板文案、品牌信息、CTA、定价和 SEO 信息替换成真实产品配置。

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

请帮我配置 Web 落地页。

目标:
- 调整默认落地页区块顺序。
- 删除不需要的区块,添加需要的区块。
- 如有需要,新增自定义落地页区块。

请按下面顺序执行:
1. 读取 `apps/web/src/configs/web-config.ts``apps/web/src/configs/landing-page-component/landing-page-component-registry.tsx``apps/web/src/configs/landing-page-component/landing-page-component-config.ts``apps/web/src/components/landing-page`
2. 列出当前可用区块 key、label、type。
3. 检查 `defaultLandingPageComponents` 当前顺序。
4. 根据我的产品需求调整默认区块:
   - 调整顺序。
   - 删除不需要的区块。
   - 添加已注册区块。
5. 注意同一 `type` 的区块在落地页中只会显示一个;如果同时选择多个同类型区块,请提醒我并保留最合适的一个。
6. 如果我要新增自定义区块,请执行:
   -`apps/web/src/components/landing-page/` 下创建组件。
   -`landing-page-component-registry.tsx` 注册组件。
   -`landing-page-component-config.ts` 添加 label、group、type。
   - 如需默认显示,加入 `web-config.ts``defaultLandingPageComponents`
7. 启动 Web,检查首页每个区块是否按预期显示,移动端和桌面端布局是否正常。

参考文档:
https://www.easystarter.dev/zh/docs/web/config/landing-page

交付结果请包含:
- 最终落地页区块顺序。
- 新增、删除、修改的区块。
- 修改过的文件。
- 需要我提供的文案或图片素材。
- 视觉验证清单。

Prompt 14:数据分析

这个 Prompt 用于接入 Web 端的 Google Analytics 4 和 OpenPanel,配置 Measurement ID、OpenPanel Client ID,并确保本地开发、本地部署和 CI 部署三种场景下变量都填入正确位置。

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

请帮我配置 Web 端数据分析。

目标:
- 接入 Google Analytics 4(流量分析)和 OpenPanel(产品分析)。
- 两套方案均为可选,未配置环境变量时自动跳过加载,互不影响。
- OpenPanel 不默认监听所有路由变化,只封装 `trackOpenPanelEvent` / `trackOpenPanelScreenView`,由业务在关键漏斗节点按需调用。
- 在本地开发、本地 CLI 部署、CI / 远程部署三种场景下,都把变量填入正确位置。

请按下面顺序执行:
1. 读取 `apps/web/src/lib/analytics/google-analytics.tsx``apps/web/src/lib/analytics/openpanel.ts``apps/web/src/lib/analytics/page-view-tracker.tsx``apps/web/src/routes/__root.tsx``apps/web/.env.development.example``apps/web/.env.production.example``apps/web/wrangler.jsonc`,确认变量名和加载方式。
2. 如果我没有提供 GA4 Measurement ID,请告诉我:
   - 去 https://analytics.google.com 登录账号。
   - 管理 → 创建 → 媒体资源,填入产品名、时区、币种。
   - 数据流 → 添加流 → 网站,输入网站 URL。
   - 在数据流详情页复制 **Measurement ID**,格式 `G-XXXXXXXXXX`
3. 如果我没有提供 OpenPanel Client ID,请告诉我:
   - 去 https://openpanel.dev 注册账号。
   - 点击 Create Project,填写 Project name。
   - 保持 **Website** 开启,关闭暂时不需要的 **App****Backend / API**
   -**Domain** 填生产网站域名,例如 `https://yourdomain.com`
   -**Allowed domains** 填允许写入事件的域名,例如生产域名和 `http://localhost:3000`
   - 点击 **Create project**
   - 创建完成后,从项目的客户端信息里复制 Website 对应的 **Client ID**(UUID 格式)。
4.`VITE_GA_MEASUREMENT_ID``VITE_OPENPANEL_CLIENT_ID` 写入:
   - `apps/web/.env.development`:本地开发使用。
   - `apps/web/wrangler.jsonc``vars`:本地 CLI 部署使用(明文,不需要 Secret)。
   - `apps/web/.env.production`:CI / 远程部署变量清单,同时把这些变量同步到 Cloudflare(GitHub 自动部署)的**构建变量**中。
5. 这两个值都是 `VITE_` 前缀的公开配置,会随 bundle 暴露到客户端,**不要**当作 Secret 写入 `.dev.vars`,也**不要**使用 `pnpm run secrets:bulk:production` 推送。
6. 只用其中之一时,请告诉我把另一个变量留空,对应 SDK 会自动跳过。
7. 配置完成后,启动 Web,验证:
   - 在 GA4 实时报告里看到当前会话。
   - GA `page_view` 会随路由变化更新。
   - 在注册完成、登录成功、订阅支付、核心生成任务完成等关键漏斗节点手动调用 OpenPanel helper 后,OpenPanel 控制台 Live 视图能看到对应事件。

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

交付结果请包含:
- 是否启用了 GA4、OpenPanel,以及对应 ID。
- 修改过的文件(`.env.development` / `wrangler.jsonc` / `.env.production`)。
- CI 构建变量配置清单。
- 建议优先埋点的 3-5 个关键漏斗节点。
- 本地验证步骤。

On this page