launch

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese
Plan mode: If you are planning work, this entire skill is ONE plan step: "Invoke /vibes:launch". Do not decompose the steps below into separate plan tasks.
Display this ASCII art immediately when starting:
░▒▓█▓▒░      ░▒▓████████▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░░▒▓██████▓▒ ░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░      ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░     ░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░      ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░     ░▒▓████████▓▒░
░▒▓█▓▒░      ░▒▓████████▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░     ░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░      ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░     ░▒▓█▓▒░░▒▓█▓▒░
░▒▓████████▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░░▒▓██████▓▒░▒▓█▓▒░░▒▓█▓▒░
规划模式:如果你正在规划工作,整个技能作为一个规划步骤:"调用 /vibes:launch"。请勿将以下步骤拆分为单独的规划任务。
启动时立即显示此ASCII艺术图案:
░▒▓█▓▒░      ░▒▓████████▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓███████▓▒░░▒▓██████▓▒ ░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░      ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░     ░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░      ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░     ░▒▓████████▓▒░
░▒▓█▓▒░      ░▒▓████████▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░     ░▒▓█▓▒░░▒▓█▓▒░
░▒▓█▓▒░      ░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░░▒▓█▓▒░▒▓█▓▒░     ░▒▓█▓▒░░▒▓█▓▒░
░▒▓████████▓▒░▒▓█▓▒░░▒▓█▓▒░░▒▓██████▓▒░░▒▓█▓▒░░▒▓█▓▒░░▒▓██████▓▒░▒▓█▓▒░░▒▓█▓▒░

Notation

符号说明

Ask [Header]: "question" means call AskUserQuestion with that header and question. Options listed as bullets. User can always type custom via "Other". When collecting a key/secret, put one option like "Paste key" — the user types the actual value via Other.
For architecture context, see
LAUNCH-REFERENCE.md
in this directory.

Ask [标题]: "问题" 表示调用AskUserQuestion工具,使用指定的标题和问题。选项以项目符号列出。用户始终可以通过“其他”输入自定义内容。当收集密钥/机密信息时,提供一个类似“粘贴密钥”的选项——用户通过“其他”输入实际值。
如需架构相关信息,请查看此目录下的
LAUNCH-REFERENCE.md

FIRST: Pre-Flight Decision Tree

第一步:预检查决策树

Run all five checks before collecting any input:
#CheckCommandIf True
1.env has Clerk keys + Connect URLs
grep -qE '^VITE_CLERK_PUBLISHABLE_KEY=pk_' .env && grep -qE '^VITE_API_URL=' .env && grep -qE '^VITE_CLOUD_URL=' .env
Set
CONNECT_READY
. Read .env for clerkPk. Skip T2, T3, infra spawn.
2.env has admin user ID
grep CLERK_ADMIN_USER_ID .env
Store value. Skip Phase 3.
3app.jsx exists
test -f app.jsx
Ask [Reuse]: "app.jsx exists. Reuse it or regenerate?" If reuse: skip T1.
4Wrangler authenticated
npx wrangler whoami 2>&1
If NOT authenticated: tell user to run
npx wrangler login
and wait.
5SSH key exists
ls ~/.ssh/id_ed25519 ~/.ssh/id_rsa ~/.ssh/id_ecdsa 2>/dev/null
If missing AND not CONNECT_READY: warn about Connect deploy.

在收集任何输入之前,先完成以下五项检查:
序号检查内容命令如果为真
1.env文件包含Clerk密钥和Connect URL
grep -qE '^VITE_CLERK_PUBLISHABLE_KEY=pk_' .env && grep -qE '^VITE_API_URL=' .env && grep -qE '^VITE_CLOUD_URL=' .env
设置
CONNECT_READY
。从.env中读取clerkPk。跳过T2、T3和基础设施创建步骤。
2.env文件包含管理员用户ID
grep CLERK_ADMIN_USER_ID .env
存储该值。跳过阶段3。
3app.jsx文件存在
test -f app.jsx
Ask [复用]: "app.jsx已存在。是否复用还是重新生成?" 如果选择复用:跳过T1。
4Wrangler已认证
npx wrangler whoami 2>&1
如果未认证:告知用户运行
npx wrangler login
并等待完成。
5SSH密钥存在
ls ~/.ssh/id_ed25519 ~/.ssh/id_rsa ~/.ssh/id_ecdsa 2>/dev/null
如果不存在且未设置
CONNECT_READY
:提醒用户注意Connect部署相关问题。

Phase 0: Collect Inputs

阶段0:收集输入信息

0.1 App Prompt

0.1 应用需求描述

Ask [App prompt]: "What do you want to build? Describe the app you have in mind."
  • "Todo list" — A simple task manager with categories and due dates
  • "Photo gallery" — A shareable photo gallery with albums and captions
  • "Team dashboard" — A metrics and status dashboard for small teams
Store as
appPrompt
.
Ask [应用需求]: "你想要构建什么?描述你构想的应用。"
  • "待办事项列表" — 带分类和截止日期的简单任务管理器
  • "照片图库" — 可分享的照片图库,支持相册和图片说明
  • "团队仪表板" — 面向小型团队的指标和状态仪表板
将内容存储为
appPrompt

0.2 App Name + Domain

0.2 应用名称与域名

Ask [App name]: "What's the app name? (used for subdomain + database)" AND [Domain]: "Where will this be deployed?"
  • App name: "Derive from prompt" or "Let me specify"
  • Domain: "Cloudflare Workers (Recommended)" or "Custom domain"
If "Derive from prompt": generate URL-safe slug (lowercase, hyphens, max 30 chars). If "Custom domain": ask for domain name. Store as
appName
.
Resolve Workers URL (if Cloudflare):
bash
node "{pluginRoot}/scripts/lib/resolve-workers-url.js" --name "{appName}"
Store output as
domain
. If script fails, ask for their Cloudflare subdomain and construct
{appName}.{subdomain}.workers.dev
.
Ask [应用名称]: "应用名称是什么?(用于子域名和数据库)" 以及 [域名]: "应用将部署到哪里?"
  • 应用名称:"从需求描述中生成" 或 "我要自定义"
  • 域名:"Cloudflare Workers(推荐)" 或 "自定义域名"
如果选择“从需求描述中生成”:生成符合URL规范的短名称(小写、连字符连接,最长30个字符)。如果选择“自定义域名”:询问具体域名。将结果存储为
appName
解析Workers URL(如果选择Cloudflare):
bash
node "{pluginRoot}/scripts/lib/resolve-workers-url.js" --name "{appName}"
将输出结果存储为
domain
。如果脚本执行失败,询问用户的Cloudflare子域名,然后构造
{appName}.{subdomain}.workers.dev

0.3 AI Features (conditional)

0.3 AI功能(可选)

Scan
appPrompt
for AI keywords: "chatbot", "chat with AI", "summarize", "generate", "analyze", "AI-powered", "intelligent".
If detected: Ask [AI features]: "Does this app need AI features?"
  • "Yes — I have an OpenRouter key" — I'll paste my API key
  • "Yes — I need to get one" — I'll sign up at openrouter.ai
  • "No AI needed" — Skip AI capabilities
If yes: check
grep OPENROUTER_API_KEY ~/.vibes/.env
. If found, offer reuse (mask key). Otherwise collect via Ask and offer to cache to
~/.vibes/.env
. Store as
openRouterKey
(or null if no AI).

扫描
appPrompt
中的AI相关关键词:"chatbot"、"chat with AI"、"summarize"、"generate"、"analyze"、"AI-powered"、"intelligent"。
如果检测到相关关键词:Ask [AI功能]: "此应用是否需要AI功能?"
  • "是 — 我有OpenRouter密钥" — 我将粘贴我的API密钥
  • "是 — 我需要获取密钥" — 我将在openrouter.ai注册
  • "不需要AI" — 跳过AI功能配置
如果选择是:检查
grep OPENROUTER_API_KEY ~/.vibes/.env
。如果找到,提供复用选项(隐藏密钥)。否则通过Ask工具收集密钥,并提供将其缓存到
~/.vibes/.env
的选项。将结果存储为
openRouterKey
(如果不需要AI则为null)。

Phase 1: Spawn Team & Parallel Work

阶段1:创建Agent团队与并行任务

1.1 Setup

1.1 准备工作

  1. Resolve plugin root:
    echo "${CLAUDE_PLUGIN_ROOT}"
    → store as
    pluginRoot
  2. Create team:
    TeamCreate("launch-{appName}", "Full SaaS pipeline for {appName}")
  3. Create all tasks per the table in LAUNCH-REFERENCE.md. If
    CONNECT_READY
    : mark T2+T3 completed immediately.
  1. 解析插件根目录:
    echo "${CLAUDE_PLUGIN_ROOT}"
    → 存储为
    pluginRoot
  2. 创建团队:
    TeamCreate("launch-{appName}", "Full SaaS pipeline for {appName}")
  3. 根据LAUNCH-REFERENCE.md中的表格创建所有任务。如果已设置
    CONNECT_READY
    :直接标记T2和T3为已完成。

1.2 Spawn Builder (T1)

1.2 创建构建Agent(T1)

  1. Read
    {pluginRoot}/skills/launch/prompts/builder.md
  2. Substitute:
    {appPrompt}
    ,
    {appName}
    ,
    {pluginRoot}
  3. Set
    {aiInstructions}
    : if
    openRouterKey
    is set, add rule about
    useAI
    hook (see vibes SKILL.md "AI Features"). If null, leave empty.
  4. Spawn: Task tool,
    team_name="launch-{appName}"
    ,
    name="builder"
    ,
    subagent_type="general-purpose"
  1. 读取
    {pluginRoot}/skills/launch/prompts/builder.md
  2. 替换变量:
    {appPrompt}
    {appName}
    {pluginRoot}
  3. 设置
    {aiInstructions}
    :如果已设置
    openRouterKey
    ,添加关于
    useAI
    钩子的规则(参考vibes SKILL.md中的“AI Features”部分)。如果为null,则留空。
  4. 创建任务:使用Task工具,
    team_name="launch-{appName}"
    name="builder"
    subagent_type="general-purpose"

1.3 Clerk Credentials (T2) — simultaneous with builder

1.3 Clerk凭证配置(T2)—— 与构建任务并行执行

Skip entirely if CONNECT_READY.
Ask [Clerk app]: "Do you have a Clerk app configured?"
  • "I have one ready" — Already has passkeys and email auth
  • "I need to create one" — Walk me through setup
If creating new: guide through clerk.com/dashboard — create app, enable Email + Passkey, configure email settings (require OFF, verify ON, link ON, code ON). Then set up JWT template and webhook:
Ask [Clerk config]: "Complete these two setup steps in Clerk Dashboard:\n\n1. JWT Template: JWT Templates → New Template → name it
with-email
, paste this JSON as the custom claims (the
|| ''
fallbacks are required — Fireproof Studio rejects null names):\n
json\n{\n  \"params\": {\n    \"email\": \"{{user.primary_email_address}}\",\n    \"email_verified\": \"{{user.email_verified}}\",\n    \"external_id\": \"{{user.external_id}}\",\n    \"first\": \"{{user.first_name || ''}}\",\n    \"last\": \"{{user.last_name || ''}}\",\n    \"name\": \"{{user.full_name || ''}}\",\n    \"image_url\": \"{{user.image_url}}\",\n    \"public_meta\": \"{{user.public_metadata}}\"\n  },\n  \"role\": \"authenticated\",\n  \"userId\": \"{{user.id}}\"\n}\n
\n2. Webhook: Webhooks → Add Endpoint → URL
https://{domain}/webhook
→ subscribe to
subscription.deleted
\n\nHave you completed both?"
  • "Yes, both done" — JWT template 'with-email' with email/name claims + webhook endpoint created
  • "I need help" — Walk me through it step by step
Collect four credentials via Ask (user types actual values via Other):
Ask [Clerk PK]: "Paste your Clerk Publishable Key (starts with pk_test_ or pk_live_)"
  • "Paste key" — From Clerk dashboard > API Keys. Validate prefix.
Repeat pattern for:
  • [Clerk SK]: Secret Key — starts with
    sk_test_
    or
    sk_live_
  • [PEM Key]: JWKS PEM Public Key — from API Keys > Advanced > Public Key. Starts with
    -----BEGIN PUBLIC KEY-----
  • [Webhook Secret]: From Webhooks > endpoint > Signing Secret. Starts with
    whsec_
Save PEM to file:
bash
cat > clerk-jwks-key.pem << 'PEMEOF'
{pemKey}
PEMEOF
Mark T2 completed.
如果已设置
CONNECT_READY
,则完全跳过此步骤。
Ask [Clerk应用]: "你是否已配置好Clerk应用?"
  • "已准备好" — 已配置密码登录和邮箱认证
  • "需要创建" — 引导我完成配置步骤
如果选择创建新应用:引导用户访问clerk.com/dashboard — 创建应用,启用邮箱+密码登录,配置邮箱设置(关闭必填项,开启验证,开启链接,开启验证码)。然后设置JWT模板和Webhook:
Ask [Clerk配置]: "请在Clerk控制台完成以下两个设置步骤:\n\n1. JWT模板:JWT模板 → 新建模板 → 命名为
with-email
,粘贴以下JSON作为自定义声明(
|| ''
回退项是必需的 — Fireproof Studio会拒绝空名称):\n
json\n{\n  \"params\": {\n    \"email\": \"{{user.primary_email_address}}\",\n    \"email_verified\": \"{{user.email_verified}}\",\n    \"external_id\": \"{{user.external_id}}\",\n    \"first\": \"{{user.first_name || ''}}\",\n    \"last\": \"{{user.last_name || ''}}\",\n    \"name\": \"{{user.full_name || ''}}\",\n    \"image_url\": \"{{user.image_url}}\",\n    \"public_meta\": \"{{user.public_metadata}}\"\n  },\n  \"role\": \"authenticated\",\n  \"userId\": \"{{user.id}}\"\n}\n
\n2. Webhook:Webhook → 添加端点 → URL
https://{domain}/webhook
→ 订阅
subscription.deleted
事件\n\n是否已完成这两个步骤?"
  • "是,均已完成" — 已创建包含邮箱/名称声明的JWT模板'with-email'和Webhook端点
  • "需要帮助" — 逐步引导我完成
通过Ask工具收集四个凭证(用户通过“其他”输入实际值):
Ask [Clerk公钥]: "粘贴你的Clerk可发布密钥(以pk_test_或pk_live_开头)"
  • "粘贴密钥" — 来自Clerk控制台 > API密钥。验证前缀是否正确。
按照相同模式收集:
  • [Clerk密钥]: 密钥 — 以
    sk_test_
    sk_live_
    开头
  • [PEM密钥]: JWKS PEM公钥 — 来自API密钥 > 高级 > 公钥。以
    -----BEGIN PUBLIC KEY-----
    开头
  • [Webhook密钥]: 来自Webhook > 端点 > 签名密钥。以
    whsec_
    开头
将PEM密钥保存到文件:
bash
cat > clerk-jwks-key.pem << 'PEMEOF'
{pemKey}
PEMEOF
标记T2为已完成。

1.4 Spawn Infra (T3) — after T2 completes

1.4 创建基础设施Agent(T3)—— 在T2完成后执行

Skip if CONNECT_READY.
  1. Read
    {pluginRoot}/skills/launch/prompts/infra.md
  2. Substitute:
    {appName}
    ,
    {pluginRoot}
    ,
    {clerkPk}
    ,
    {clerkSk}
  3. Spawn: Task tool,
    team_name="launch-{appName}"
    ,
    name="infra"
    ,
    subagent_type="general-purpose"
如果已设置
CONNECT_READY
,则跳过此步骤。
  1. 读取
    {pluginRoot}/skills/launch/prompts/infra.md
  2. 替换变量:
    {appName}
    {pluginRoot}
    {clerkPk}
    {clerkSk}
  3. 创建任务:使用Task工具,
    team_name="launch-{appName}"
    name="infra"
    subagent_type="general-purpose"

1.5 Sell Config (T4) — while infra deploys

1.5 销售配置(T4)—— 在基础设施部署期间执行

Sell config is collected here but applied later by invoking
/vibes:sell
(or its assembly script) as an atomic step.
Do NOT hand-implement SaaS logic — the sell skill handles tenant routing, auth gating, billing, and admin setup.
Choose billing mode based on monetization intent:
  • "off" (free) — all authenticated users get full access. Good for MVPs and internal tools.
  • "required" (subscription) — users must subscribe. Requires Clerk Billing (Dev instances auto-connect to Stripe sandbox).
Always ask the user — do not assume a default.
Ask [Billing]: "What billing mode for your SaaS?" AND [Title]: "App display title?"
  • Billing: "Free (no billing)" or "Subscription required"
  • Title: "Derive from app name" or "Let me specify"
If billing is "Subscription required": Note that Clerk Billing must be configured in the Clerk Dashboard after deploy (plans, Stripe connection). Dev instances auto-connect to Stripe sandbox for testing.
Ask [Tagline]: "Describe your app's tagline (short punchy phrase)"
  • "Generate one" — Create from app description
  • "Let me write it" — I'll provide it
When billing is "required": These fields appear on a pricing section visible to potential customers before signup. Optimize for marketing copy quality — benefit-driven language, not technical descriptions. Tagline = sales headline. Subtitle = value proposition ("why should I pay?"). Features = compelling benefit statements (3-5 items).
Repeat pattern for subtitle and features list (3-5 bullet points).
Store:
billingMode
("off"/"required"),
appTitle
,
tagline
,
subtitle
,
features
(JSON array). Mark T4 completed.

销售配置在此处收集,但之后通过调用
/vibes:sell
(或其组装脚本)作为原子步骤应用。
请勿手动实现SaaS逻辑——销售技能会处理租户路由、认证限制、计费和管理员设置。
根据变现需求选择计费模式:
  • "off"(免费) — 所有已认证用户均可完全访问。适用于MVP和内部工具。
  • "required"(订阅) — 用户必须订阅。需要配置Clerk Billing(开发环境自动连接到Stripe沙箱)。
务必询问用户 — 不要默认选择。
Ask [计费模式]: "你的SaaS应用采用哪种计费模式?" 以及 [显示标题]: "应用显示标题是什么?"
  • 计费模式:"免费(无计费)" 或 "需要订阅"
  • 显示标题:"从应用名称生成" 或 "我要自定义"
如果计费模式为"需要订阅":注意部署后需要在Clerk控制台配置计费(套餐、Stripe连接)。开发环境会自动连接到Stripe沙箱用于测试。
Ask [标语]: "描述你的应用标语(简短有力的短语)"
  • "自动生成" — 根据应用描述生成
  • "自定义" — 我将提供内容
当计费模式为"required"时:这些字段会显示在潜在客户注册前的定价页面上。优化营销文案质量——使用利益导向的语言,而非技术描述。标语=销售标题。副标题=价值主张(“我为什么要付费?”)。功能列表=3-5个吸引人的利益陈述。
按照相同模式收集副标题和功能列表(3-5个项目符号)。
存储:
billingMode
("off"/"required")、
appTitle
tagline
subtitle
features
(JSON数组)。标记T4为已完成。

Phase 2: Assembly & Deploy

阶段2:组装与部署

Blocked by T1 + T3 + T4. Check TaskList until all complete.
需等待T1、T3、T4全部完成后执行。检查TaskList直到所有任务完成。

2.1 Verify Inputs

2.1 验证输入信息

Confirm:
app.jsx
exists with valid JSX.
.env
has
VITE_CLERK_PUBLISHABLE_KEY
,
VITE_API_URL
,
VITE_CLOUD_URL
. All sell config values collected.
Scan app.jsx for builder mistakes (see LAUNCH-REFERENCE.md "Common Builder Mistakes"). Fix any found before proceeding.
确认:
app.jsx
存在且为有效的JSX文件。
.env
包含
VITE_CLERK_PUBLISHABLE_KEY
VITE_API_URL
VITE_CLOUD_URL
。已收集所有销售配置值。
扫描app.jsx以查找构建错误(参考LAUNCH-REFERENCE.md中的“Common Builder Mistakes”部分)。在继续之前修复所有发现的问题。

2.2 Deploy Cycle

2.2 部署流程

This sequence runs twice: first here (with
--admin-ids '[]'
), then in Phase 3 (with real admin ID). Steps:
Step A — Assemble:
bash
node "${CLAUDE_PLUGIN_ROOT}/scripts/assemble-sell.js" app.jsx index.html \
  --clerk-key "{clerkPk}" \
  --app-name "{appName}" \
  --app-title "{appTitle}" \
  --domain "{domain}" \
  --billing-mode "{billingMode}" \
  --tagline "{tagline}" \
  --subtitle "{subtitle}" \
  --features '{featuresJSON}' \
  --admin-ids '{adminIds}'
Step B — Validate:
grep -c '__VITE_\|__CLERK_\|__APP_' index.html
— must be 0.
Step C — Deploy:
bash
node "${CLAUDE_PLUGIN_ROOT}/scripts/deploy-cloudflare.js" \
  --name "{appName}" \
  --file index.html \
  --clerk-key "{clerkPk}" \
  --billing-mode "{billingMode}" \
  --webhook-secret "{webhookSecret}" \
  {aiKeyFlag}
Where
{aiKeyFlag}
=
--ai-key "{openRouterKey}"
if set, omitted if null. The
--billing-mode
flag controls whether the client enforces JWT-based plan checks. The
--webhook-secret
flag sets the Clerk webhook signing secret as a Wrangler secret.
Run the cycle now with
{adminIds}
=
'[]'
(or
'["{existingAdminId}"]'
if found in pre-flight). Mark T5, T6 completed.

此流程需运行两次:首次在此处执行(使用
--admin-ids '[]'
),然后在阶段3执行(使用实际管理员ID)。步骤如下:
步骤A — 组装:
bash
node "${CLAUDE_PLUGIN_ROOT}/scripts/assemble-sell.js" app.jsx index.html \
  --clerk-key "{clerkPk}" \
  --app-name "{appName}" \
  --app-title "{appTitle}" \
  --domain "{domain}" \
  --billing-mode "{billingMode}" \
  --tagline "{tagline}" \
  --subtitle "{subtitle}" \
  --features '{featuresJSON}' \
  --admin-ids '{adminIds}'
步骤B — 验证:
grep -c '__VITE_\|__CLERK_\|__APP_' index.html
— 结果必须为0。
步骤C — 部署:
bash
node "${CLAUDE_PLUGIN_ROOT}/scripts/deploy-cloudflare.js" \
  --name "{appName}" \
  --file index.html \
  --clerk-key "{clerkPk}" \
  --billing-mode "{billingMode}" \
  --webhook-secret "{webhookSecret}" \
  {aiKeyFlag}
其中
{aiKeyFlag}
= 如果已设置则为
--ai-key "{openRouterKey}"
,否则省略。
--billing-mode
标志控制客户端是否强制执行基于JWT的套餐检查。
--webhook-secret
标志将Clerk Webhook签名密钥设置为Wrangler机密。
现在执行此流程,
{adminIds}
=
'[]'
(如果在预检查中找到现有管理员ID,则为
'["{existingAdminId}"]'
)。标记T5、T6为已完成。

Phase 3: Admin Setup

阶段3:管理员设置

Skip if
CLERK_ADMIN_USER_ID
was found in pre-flight.
如果在预检查中找到
CLERK_ADMIN_USER_ID
,则跳过此阶段。

3.1 Guide Signup

3.1 引导注册

Tell the user:
Your app is live! Create your admin account:
  1. Open:
    https://{domain}?subdomain=test
  2. Sign up with your email
  3. Complete email verification
  4. Create a passkey when prompted
Ask [Signup]: "Have you completed signup on the app?"
  • "Yes, signed up" — Completed verification + passkey
  • "Skip admin setup" — I'll do this later
If skip: proceed to Phase 4.
告知用户:
你的应用已上线!创建你的管理员账户:
  1. 打开:
    https://{domain}?subdomain=test
  2. 使用邮箱注册
  3. 完成邮箱验证
  4. 按照提示创建密码
Ask [注册]: "是否已在应用上完成注册?"
  • "是,已注册" — 已完成验证和密码创建
  • "跳过管理员设置" — 我稍后再完成
如果选择跳过:直接进入阶段4。

3.2 Collect Admin ID

3.2 收集管理员ID

Tell user: Go to clerk.com/dashboard > your app > Users > click your user > copy User ID (starts with
user_
).
Ask [User ID]: "Paste your Clerk User ID (starts with user_)"
  • "I need help finding it" — Clerk Dashboard > Users > click name > ID at top
Validate starts with
user_
. Save to
.env
:
bash
echo "CLERK_ADMIN_USER_ID={userId}" >> .env
告知用户:访问clerk.com/dashboard > 你的应用 > 用户 > 点击你的用户 > 复制用户ID(以
user_
开头)。
Ask [用户ID]: "粘贴你的Clerk用户ID(以user_开头)"
  • "需要帮助查找" — Clerk控制台 > 用户 > 点击名称 > 顶部的ID
验证是否以
user_
开头。将其保存到
.env
bash
echo "CLERK_ADMIN_USER_ID={userId}" >> .env

3.3 Re-run Deploy Cycle

3.3 重新执行部署流程

Re-run Phase 2.2 steps A-D with
{adminIds}
=
'["{userId}"]'
.
Tell user: Admin dashboard now works at
https://{domain}?subdomain=admin

使用
{adminIds}
=
'["{userId}"]'
重新执行阶段2.2的步骤A到D。
告知用户:管理员仪表板现在可通过
https://{domain}?subdomain=admin
访问

Phase 4: Verify & Cleanup

阶段4:验证与清理

4.1 Verify

4.1 验证

Ask [Verify]: "Your app is live! Open each URL and verify:\n\n- Landing: https://{domain}\n- Tenant: https://{domain}?subdomain=test\n- Admin: https://{domain}?subdomain=admin\n\nDoes everything look right?"
  • "All working" — Everything loads correctly
  • "Something's broken" — Need to troubleshoot
If
billingMode === "required"
: Also ask the user to verify billing:
"Check billing flow: Sign in at
https://{domain}?subdomain=test
— you should see a paywall with pricing. Use test card
4242 4242 4242 4242
(any future expiry, any CVC) to complete a test subscription. After subscribing, the tenant app should load."
Mark T7 completed. If broken, ask what's wrong and troubleshoot.
Ask [验证]: "你的应用已上线!打开以下每个URL进行验证:\n\n- 着陆页:https://{domain}\n- 租户页面:https://{domain}?subdomain=test\n- 管理员页面:https://{domain}?subdomain=admin\n\n所有功能是否正常?"
  • "全部正常" — 所有页面均可正常加载
  • "存在问题" — 需要排查
如果
billingMode === "required"
:同时请用户验证计费流程:
"检查计费流程:在
https://{domain}?subdomain=test
登录 — 你应该会看到带有定价信息的付费墙。使用测试卡
4242 4242 4242 4242
(任意未来到期日期、任意CVC)完成测试订阅。订阅完成后,租户应用应可正常加载。"
标记T7为已完成。如果存在问题,询问具体问题并进行排查。

4.2 Shutdown

4.2 清理

Send
shutdown_request
to "builder" and "infra" (if spawned). Wait for responses. Clean up team.
向"builder"和"infra"(如果已创建)发送
shutdown_request
。等待响应。清理团队资源。

4.3 Summary

4.3 总结

undefined
undefined

Launch Complete

部署完成

App: {appTitle} URL: https://{domain} Clerk: {clerkPk} Connect: {studioUrl} Billing: {billingMode}
应用: {appTitle} URL: https://{domain} Clerk: {clerkPk} Connect: {studioUrl} 计费模式: {billingMode}

What's deployed:

已部署内容:

  • Cloudflare Worker with KV registry
  • Fireproof Connect studio for real-time sync
  • Clerk authentication with passkeys
  • Subdomain-based multi-tenancy
  • 带有KV注册表的Cloudflare Worker
  • 用于实时同步的Fireproof Connect工作室
  • 支持密码登录的Clerk认证系统
  • 基于子域名的多租户架构

Next steps:

后续步骤:

  • Configure a custom domain (see CLAUDE.md DNS section)
  • Set up Clerk billing plans if using subscription mode

---
  • 配置自定义域名(参考CLAUDE.md的DNS部分)
  • 如果使用订阅模式,设置Clerk计费套餐

---

Error Handling

错误处理

FailureRecovery
Builder generates invalid JSXRead app.jsx, fix TS syntax / wrong hooks, re-save
Connect deploy failsInfra reports via SendMessage. Present error + fix steps
Assembly has placeholdersCheck .env for missing values, re-run assembly
Cloudflare deploy failsCheck
npx wrangler whoami
. Guide
npx wrangler login
if needed
Wrangler secret put failsRetry. If persistent, have user run manually
Teammate silent 3+ minSendMessage status check. If no response, take over task
Builder hardcodes DB nameEdit app.jsx: replace with
useTenant()
pattern before assembly
失败场景恢复方案
构建Agent生成无效JSX读取app.jsx,修复TS语法/错误钩子,重新保存
Connect部署失败基础设施通过SendMessage报告错误。显示错误信息和修复步骤
组装后存在占位符检查.env文件是否缺少值,重新执行组装步骤
Cloudflare部署失败检查
npx wrangler whoami
。如果需要,引导用户运行
npx wrangler login
Wrangler机密设置失败重试。如果持续失败,让用户手动执行
Agent超过3分钟无响应发送SendMessage状态检查。如果无回复,接管该任务
构建Agent硬编码数据库名称编辑app.jsx:在组装前替换为
useTenant()
模式
undefined