launch
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChinesePlan 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 in this directory.
LAUNCH-REFERENCE.mdAsk [标题]: "问题" 表示调用AskUserQuestion工具,使用指定的标题和问题。选项以项目符号列出。用户始终可以通过“其他”输入自定义内容。当收集密钥/机密信息时,提供一个类似“粘贴密钥”的选项——用户通过“其他”输入实际值。
如需架构相关信息,请查看此目录下的。
LAUNCH-REFERENCE.mdFIRST: Pre-Flight Decision Tree
第一步:预检查决策树
Run all five checks before collecting any input:
| # | Check | Command | If True |
|---|---|---|---|
| 1 | .env has Clerk keys + Connect URLs | | Set |
| 2 | .env has admin user ID | | Store value. Skip Phase 3. |
| 3 | app.jsx exists | | Ask [Reuse]: "app.jsx exists. Reuse it or regenerate?" If reuse: skip T1. |
| 4 | Wrangler authenticated | | If NOT authenticated: tell user to run |
| 5 | SSH key exists | | If missing AND not CONNECT_READY: warn about Connect deploy. |
在收集任何输入之前,先完成以下五项检查:
| 序号 | 检查内容 | 命令 | 如果为真 |
|---|---|---|---|
| 1 | .env文件包含Clerk密钥和Connect URL | | 设置 |
| 2 | .env文件包含管理员用户ID | | 存储该值。跳过阶段3。 |
| 3 | app.jsx文件存在 | | Ask [复用]: "app.jsx已存在。是否复用还是重新生成?" 如果选择复用:跳过T1。 |
| 4 | Wrangler已认证 | | 如果未认证:告知用户运行 |
| 5 | SSH密钥存在 | | 如果不存在且未设置 |
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 .
appPromptAsk [应用需求]: "你想要构建什么?描述你构想的应用。"
- "待办事项列表" — 带分类和截止日期的简单任务管理器
- "照片图库" — 可分享的照片图库,支持相册和图片说明
- "团队仪表板" — 面向小型团队的指标和状态仪表板
将内容存储为。
appPrompt0.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 .
appNameResolve Workers URL (if Cloudflare):
bash
node "{pluginRoot}/scripts/lib/resolve-workers-url.js" --name "{appName}"Store output as . If script fails, ask for their Cloudflare subdomain and construct .
domain{appName}.{subdomain}.workers.devAsk [应用名称]: "应用名称是什么?(用于子域名和数据库)" 以及 [域名]: "应用将部署到哪里?"
- 应用名称:"从需求描述中生成" 或 "我要自定义"
- 域名:"Cloudflare Workers(推荐)" 或 "自定义域名"
如果选择“从需求描述中生成”:生成符合URL规范的短名称(小写、连字符连接,最长30个字符)。如果选择“自定义域名”:询问具体域名。将结果存储为。
appName解析Workers URL(如果选择Cloudflare):
bash
node "{pluginRoot}/scripts/lib/resolve-workers-url.js" --name "{appName}"将输出结果存储为。如果脚本执行失败,询问用户的Cloudflare子域名,然后构造。
domain{appName}.{subdomain}.workers.dev0.3 AI Features (conditional)
0.3 AI功能(可选)
Scan for AI keywords: "chatbot", "chat with AI", "summarize", "generate", "analyze", "AI-powered", "intelligent".
appPromptIf 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 . If found, offer reuse (mask key). Otherwise collect via Ask and offer to cache to . Store as (or null if no AI).
grep OPENROUTER_API_KEY ~/.vibes/.env~/.vibes/.envopenRouterKey扫描中的AI相关关键词:"chatbot"、"chat with AI"、"summarize"、"generate"、"analyze"、"AI-powered"、"intelligent"。
appPrompt如果检测到相关关键词:Ask [AI功能]: "此应用是否需要AI功能?"
- "是 — 我有OpenRouter密钥" — 我将粘贴我的API密钥
- "是 — 我需要获取密钥" — 我将在openrouter.ai注册
- "不需要AI" — 跳过AI功能配置
如果选择是:检查。如果找到,提供复用选项(隐藏密钥)。否则通过Ask工具收集密钥,并提供将其缓存到的选项。将结果存储为(如果不需要AI则为null)。
grep OPENROUTER_API_KEY ~/.vibes/.env~/.vibes/.envopenRouterKeyPhase 1: Spawn Team & Parallel Work
阶段1:创建Agent团队与并行任务
1.1 Setup
1.1 准备工作
- Resolve plugin root: → store as
echo "${CLAUDE_PLUGIN_ROOT}"pluginRoot - Create team:
TeamCreate("launch-{appName}", "Full SaaS pipeline for {appName}") - Create all tasks per the table in LAUNCH-REFERENCE.md. If : mark T2+T3 completed immediately.
CONNECT_READY
- 解析插件根目录:→ 存储为
echo "${CLAUDE_PLUGIN_ROOT}"pluginRoot - 创建团队:
TeamCreate("launch-{appName}", "Full SaaS pipeline for {appName}") - 根据LAUNCH-REFERENCE.md中的表格创建所有任务。如果已设置:直接标记T2和T3为已完成。
CONNECT_READY
1.2 Spawn Builder (T1)
1.2 创建构建Agent(T1)
- Read
{pluginRoot}/skills/launch/prompts/builder.md - Substitute: ,
{appPrompt},{appName}{pluginRoot} - Set : if
{aiInstructions}is set, add rule aboutopenRouterKeyhook (see vibes SKILL.md "AI Features"). If null, leave empty.useAI - Spawn: Task tool, ,
team_name="launch-{appName}",name="builder"subagent_type="general-purpose"
- 读取
{pluginRoot}/skills/launch/prompts/builder.md - 替换变量:、
{appPrompt}、{appName}{pluginRoot} - 设置:如果已设置
{aiInstructions},添加关于openRouterKey钩子的规则(参考vibes SKILL.md中的“AI Features”部分)。如果为null,则留空。useAI - 创建任务:使用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 , paste this JSON as the custom claims (the fallbacks are required — Fireproof Studio rejects null names):\n\n2. Webhook: Webhooks → Add Endpoint → URL → subscribe to \n\nHave you completed both?"
with-email|| ''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}\nhttps://{domain}/webhooksubscription.deleted- "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 or
sk_test_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}
PEMEOFMark T2 completed.
如果已设置,则完全跳过此步骤。
CONNECT_READYAsk [Clerk应用]: "你是否已配置好Clerk应用?"
- "已准备好" — 已配置密码登录和邮箱认证
- "需要创建" — 引导我完成配置步骤
如果选择创建新应用:引导用户访问clerk.com/dashboard — 创建应用,启用邮箱+密码登录,配置邮箱设置(关闭必填项,开启验证,开启链接,开启验证码)。然后设置JWT模板和Webhook:
Ask [Clerk配置]: "请在Clerk控制台完成以下两个设置步骤:\n\n1. JWT模板:JWT模板 → 新建模板 → 命名为,粘贴以下JSON作为自定义声明( 回退项是必需的 — Fireproof Studio会拒绝空名称):\n\n2. Webhook:Webhook → 添加端点 → URL → 订阅事件\n\n是否已完成这两个步骤?"
with-email|| ''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}\nhttps://{domain}/webhooksubscription.deleted- "是,均已完成" — 已创建包含邮箱/名称声明的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.
- Read
{pluginRoot}/skills/launch/prompts/infra.md - Substitute: ,
{appName},{pluginRoot},{clerkPk}{clerkSk} - Spawn: Task tool, ,
team_name="launch-{appName}",name="infra"subagent_type="general-purpose"
如果已设置,则跳过此步骤。
CONNECT_READY- 读取
{pluginRoot}/skills/launch/prompts/infra.md - 替换变量:、
{appName}、{pluginRoot}、{clerkPk}{clerkSk} - 创建任务:使用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 (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.
/vibes:sellChoose 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: ("off"/"required"), , , , (JSON array). Mark T4 completed.
billingModeappTitletaglinesubtitlefeatures销售配置在此处收集,但之后通过调用(或其组装脚本)作为原子步骤应用。 请勿手动实现SaaS逻辑——销售技能会处理租户路由、认证限制、计费和管理员设置。
/vibes:sell根据变现需求选择计费模式:
- "off"(免费) — 所有已认证用户均可完全访问。适用于MVP和内部工具。
- "required"(订阅) — 用户必须订阅。需要配置Clerk Billing(开发环境自动连接到Stripe沙箱)。
务必询问用户 — 不要默认选择。
Ask [计费模式]: "你的SaaS应用采用哪种计费模式?" 以及 [显示标题]: "应用显示标题是什么?"
- 计费模式:"免费(无计费)" 或 "需要订阅"
- 显示标题:"从应用名称生成" 或 "我要自定义"
如果计费模式为"需要订阅":注意部署后需要在Clerk控制台配置计费(套餐、Stripe连接)。开发环境会自动连接到Stripe沙箱用于测试。
Ask [标语]: "描述你的应用标语(简短有力的短语)"
- "自动生成" — 根据应用描述生成
- "自定义" — 我将提供内容
当计费模式为"required"时:这些字段会显示在潜在客户注册前的定价页面上。优化营销文案质量——使用利益导向的语言,而非技术描述。标语=销售标题。副标题=价值主张(“我为什么要付费?”)。功能列表=3-5个吸引人的利益陈述。
按照相同模式收集副标题和功能列表(3-5个项目符号)。
存储:("off"/"required")、、、、(JSON数组)。标记T4为已完成。
billingModeappTitletaglinesubtitlefeaturesPhase 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: exists with valid JSX. has , , . All sell config values collected.
app.jsx.envVITE_CLERK_PUBLISHABLE_KEYVITE_API_URLVITE_CLOUD_URLScan app.jsx for builder mistakes (see LAUNCH-REFERENCE.md "Common Builder Mistakes"). Fix any found before proceeding.
确认:存在且为有效的JSX文件。包含、、。已收集所有销售配置值。
app.jsx.envVITE_CLERK_PUBLISHABLE_KEYVITE_API_URLVITE_CLOUD_URL扫描app.jsx以查找构建错误(参考LAUNCH-REFERENCE.md中的“Common Builder Mistakes”部分)。在继续之前修复所有发现的问题。
2.2 Deploy Cycle
2.2 部署流程
This sequence runs twice: first here (with ), then in Phase 3 (with real admin ID). Steps:
--admin-ids '[]'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: — must be 0.
grep -c '__VITE_\|__CLERK_\|__APP_' index.htmlStep 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 = if set, omitted if null. The flag controls whether the client enforces JWT-based plan checks. The flag sets the Clerk webhook signing secret as a Wrangler secret.
{aiKeyFlag}--ai-key "{openRouterKey}"--billing-mode--webhook-secretRun the cycle now with = (or if found in pre-flight). Mark T5, T6 completed.
{adminIds}'[]''["{existingAdminId}"]'此流程需运行两次:首次在此处执行(使用),然后在阶段3执行(使用实际管理员ID)。步骤如下:
--admin-ids '[]'步骤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 — 验证: — 结果必须为0。
grep -c '__VITE_\|__CLERK_\|__APP_' index.html步骤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}其中 = 如果已设置则为,否则省略。标志控制客户端是否强制执行基于JWT的套餐检查。标志将Clerk Webhook签名密钥设置为Wrangler机密。
{aiKeyFlag}--ai-key "{openRouterKey}"--billing-mode--webhook-secret现在执行此流程, = (如果在预检查中找到现有管理员ID,则为)。标记T5、T6为已完成。
{adminIds}'[]''["{existingAdminId}"]'Phase 3: Admin Setup
阶段3:管理员设置
Skip if was found in pre-flight.
CLERK_ADMIN_USER_ID如果在预检查中找到,则跳过此阶段。
CLERK_ADMIN_USER_ID3.1 Guide Signup
3.1 引导注册
Tell the user:
Your app is live! Create your admin account:
- Open:
https://{domain}?subdomain=test- Sign up with your email
- Complete email verification
- 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.
告知用户:
你的应用已上线!创建你的管理员账户:
- 打开:
https://{domain}?subdomain=test- 使用邮箱注册
- 完成邮箱验证
- 按照提示创建密码
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 . Save to :
user_.envbash
echo "CLERK_ADMIN_USER_ID={userId}" >> .env告知用户:访问clerk.com/dashboard > 你的应用 > 用户 > 点击你的用户 > 复制用户ID(以开头)。
user_Ask [用户ID]: "粘贴你的Clerk用户ID(以user_开头)"
- "需要帮助查找" — Clerk控制台 > 用户 > 点击名称 > 顶部的ID
验证是否以开头。将其保存到:
user_.envbash
echo "CLERK_ADMIN_USER_ID={userId}" >> .env3.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使用 = 重新执行阶段2.2的步骤A到D。
{adminIds}'["{userId}"]'告知用户:管理员仪表板现在可通过访问
https://{domain}?subdomain=adminPhase 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 : Also ask the user to verify billing:
billingMode === "required""Check billing flow: Sign in at— you should see a paywall with pricing. Use test cardhttps://{domain}?subdomain=test(any future expiry, any CVC) to complete a test subscription. After subscribing, the tenant app should load."4242 4242 4242 4242
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(任意未来到期日期、任意CVC)完成测试订阅。订阅完成后,租户应用应可正常加载。"4242 4242 4242 4242
标记T7为已完成。如果存在问题,询问具体问题并进行排查。
4.2 Shutdown
4.2 清理
Send to "builder" and "infra" (if spawned). Wait for responses. Clean up team.
shutdown_request向"builder"和"infra"(如果已创建)发送。等待响应。清理团队资源。
shutdown_request4.3 Summary
4.3 总结
undefinedundefinedLaunch 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
错误处理
| Failure | Recovery |
|---|---|
| Builder generates invalid JSX | Read app.jsx, fix TS syntax / wrong hooks, re-save |
| Connect deploy fails | Infra reports via SendMessage. Present error + fix steps |
| Assembly has placeholders | Check .env for missing values, re-run assembly |
| Cloudflare deploy fails | Check |
| Wrangler secret put fails | Retry. If persistent, have user run manually |
| Teammate silent 3+ min | SendMessage status check. If no response, take over task |
| Builder hardcodes DB name | Edit app.jsx: replace with |
| 失败场景 | 恢复方案 |
|---|---|
| 构建Agent生成无效JSX | 读取app.jsx,修复TS语法/错误钩子,重新保存 |
| Connect部署失败 | 基础设施通过SendMessage报告错误。显示错误信息和修复步骤 |
| 组装后存在占位符 | 检查.env文件是否缺少值,重新执行组装步骤 |
| Cloudflare部署失败 | 检查 |
| Wrangler机密设置失败 | 重试。如果持续失败,让用户手动执行 |
| Agent超过3分钟无响应 | 发送SendMessage状态检查。如果无回复,接管该任务 |
| 构建Agent硬编码数据库名称 | 编辑app.jsx:在组装前替换为 |
undefined