/launch — full launch orchestration
You are orchestrating a product launch using two layers:
- CLI (
launch/, package @marketing-studio/launch) — everything deterministic: state, validation, posting providers, research fetchers, payload rendering. Run it as node "${CLAUDE_SKILL_DIR}/../../../dist/index.js" <cmd> (or launch <cmd> if linked) -- the CLI lives in this package, ${CLAUDE_SKILL_DIR}/../../...
- This session — everything generative or credentialed-through-MCP: DashClaw infra calls, WebSearch synthesis, draft copywriting, and the approval gates. The CLI never holds DashClaw credentials and never sends email/SMS.
Honesty rule: each step below is labeled [CLI] or [session]. Don't do session work by shelling out, and don't reimplement CLI work inline.
Target <dir> is the project directory being launched (sibling of the engine repo).
Humans can drive the same engine visually with launch ui (local dashboard, same gates — see docs/ui-dashboard.md); this skill remains the autonomous path.
Sequence
1. Intake [CLI]
launch init <dir> --domain <domain> --price <price> [--name --tagline --audience]
Pull flag values from the conversation. Read back <dir>/.launch/launch.config.json and confirm the summary with the user. Re-run with --force if they correct anything.
2. DashClaw setup [session]
select_project (or create_project if this product has no DashClaw project yet).
create_launch with declared_stack from the config — typically ["domain", "vercel", "stripe", "resend"].
preflight_launch — validates every provider token BEFORE any money is spent. If it fails, STOP and present a remediation table (provider → failing check → fix); do not proceed to spend steps.
3. Domain [session] — 💰 SPEND GATE #1
check_domain_availability for the config domain (and 2-3 alternatives if taken).
- Present price and alternatives to the user.
- SPEND GATE: ask the user for explicit approval with AskUserQuestion and WAIT for their answer. Never call
purchase_domain without a fresh approval in this conversation. Record the approval decision via dashclaw_guard + dashclaw_record for the audit trail.
- On approval:
purchase_domain. On decline: skip to step 4 using an already-owned domain or stop.
4. Hosting [session]
create_vercel_project (link the product repo).
create_vercel_deployment and poll get_vercel_deployment_status until READY.
add_vercel_domain for the purchased domain.
set_dns_records per Vercel's required records (A/CNAME from the add-domain response); verify with get_dns_records.
- Set any product env vars with
set_vercel_env_var.
5. Payments [session] — 💰 SPEND GATE #2 (live mode)
Stripe best practices: create in TEST mode first, verify the full flow, then — and only then — recreate in live mode behind the gate.
create_stripe_product + create_stripe_price (TEST mode) from config pricing.
create_stripe_webhook pointing at the product's webhook endpoint; store the signing secret as a Vercel env var (set_vercel_env_var), never in the repo.
- Verify test checkout end-to-end.
- SPEND GATE: live mode creates real billable objects. Ask the user for explicit approval with AskUserQuestion and WAIT for their answer before recreating product/price/webhook in live mode. Audit via
dashclaw_guard + dashclaw_record.
6. Email infra [session]
create_resend_domain for the config domain.
set_dns_records with the DKIM/SPF records from the response.
verify_resend_domain (DNS propagation can take minutes — poll, don't fail fast).
7. Research [CLI + session]
- [CLI]
launch research <dir> (live mode — keyless fetchers: x-algorithm README, Algolia Show HN winners, hunted.space, per-sub Reddit rules).
- [session] WebSearch synthesis per platform (queries from THINKING.md: "X algorithm ranking signals ", " LinkedIn algorithm what's working", PH featuring criteria). Write the synthesis into each brief's
## Session research section — the CLI preserves that section on regeneration.
- [CLI]
launch research <dir> --check must pass (all briefs fresh) before copy.
8. Copy [CLI + session]
- [CLI]
launch copy <dir> --scaffold.
- [session] Fill every draft in
<dir>/.launch/drafts/ with real copy written from the research briefs (hooks from Show HN winners, X thread structure, LinkedIn link-in-first-comment, per-sub Reddit angles, email/SMS from the announcement templates). Replace every {{placeholder}} including {{unsubscribeUrl}}.
- [CLI]
launch copy <dir> --validate — loop fill→validate until exit 0.
9. 🚦 PUBLISH GATE [session]
Render EVERY draft (all platforms + the email HTML + SMS text) to the user in one review block. Ask for explicit approval with AskUserQuestion (multiSelect per-platform opt-out) and WAIT for the user's answer. Nothing is published until the user approves; platforms they deselect are skipped. Record the decision via dashclaw_record.
10. Distribute [CLI + session]
- [CLI]
launch post <dir> --all --live — posts X, Bluesky, Facebook, LinkedIn, YouTube, Reddit via API; submits sitemap + URL inspection to Google; skips blocked providers with a summary; the posted-ledger makes re-runs idempotent.
- [CLI] Assisted platforms at their recommended times (from the briefs):
launch post <dir> --platform hackernews --assist --live — opens the prefilled Show HN submitlink, copies the maker comment. The HUMAN clicks submit.
launch post <dir> --platform producthunt --assist --live — writes .launch/out/producthunt-kit.md, opens the submit page, copies the tagline. Schedule per the kit (12:01 AM PT, low-competition day).
- [CLI]
launch notify <dir> --channel email and --channel sms — renders artifacts + .launch/out/notify-payloads.json (consent-filtered).
- [session] For each payload entry:
send_resend_email / send_twilio_sms with the exact input object. The CLI never sends.
11. Verify & report [CLI + session]
- [session]
verify_launch + get_launch_status for the infra side.
- [CLI]
launch status <dir> for the distribution side.
- Final report: live URL, posted links from the ledger, pending assisted steps, and the stats command (
launch stats <dir> --platform producthunt --slug <slug>).
Failure handling
- Any MCP failure: surface the error verbatim, consult
get_launch_status, and fix forward.
- NEVER re-run a spend step (domain purchase, live Stripe) after a failure without a fresh approval gate — check the launch plan state and the audit log first.
- Posting failures: the ledger guarantees completed platforms are skipped on re-run; fix the failing provider (see
launch doctor) and re-run launch post <dir> --all --live.
- Credential problems:
launch doctor --json gives provider → mode → fix hint; degrade blocked API platforms to assisted/manual instead of failing the launch.
Dry-run rehearsal (run this before any real launch)
No money, no posts, no sends — end to end. launch post is DRY-RUN BY DEFAULT now,
so --dry-run below is optional (kept for back-compat) and --live is what actually
publishes. --assist is the one exception: it opens a prefilled page and copies text
but submits nothing, so it runs for real without --live.
launch init <dir> --domain <domain> --price <price>
launch research <dir> --offline
launch copy <dir> --scaffold
# fill drafts (session) …
launch copy <dir> --validate
launch post <dir> --all --dry-run # prints exact request payloads, writes nothing
launch notify <dir> --channel email --dry-run
launch notify <dir> --channel sms --dry-run
launch status <dir>
Skip every DashClaw spend step during rehearsal (no purchase_domain, no live Stripe). The rehearsal is green when every command exits 0 and the drafts pass validation.
Credentials
Social API keys live in the engine repo's .env (template: .env.example, per-provider setup cost/time guides in docs/setup-<provider>.md, launch-day checklist in docs/launch-runbook.md). DashClaw infra credentials live with the DashClaw MCP server — this skill calls the tools, the CLI never sees those secrets.
1---2name: launch-23description: Take a developed project end-to-end through launch — domain, hosting, payments, email infra, algorithm-researched copy, and multi-platform distribution — with zero copy-paste. Trigger on "launch <project>", "ship <project>", "take <project> live", or "/launch <dir>".4---56# /launch — full launch orchestration78You are orchestrating a product launch using two layers:910- **CLI (`launch/`, package `@marketing-studio/launch`)** — everything deterministic: state, validation, posting providers, research fetchers, payload rendering. Run it as `node "${CLAUDE_SKILL_DIR}/../../../dist/index.js" <cmd>` (or `launch <cmd>` if linked) -- the CLI lives in this package, `${CLAUDE_SKILL_DIR}/../../..`.11- **This session** — everything generative or credentialed-through-MCP: DashClaw infra calls, WebSearch synthesis, draft copywriting, and the approval gates. The CLI never holds DashClaw credentials and never sends email/SMS.1213Honesty rule: each step below is labeled **[CLI]** or **[session]**. Don't do session work by shelling out, and don't reimplement CLI work inline.1415Target `<dir>` is the project directory being launched (sibling of the engine repo).1617Humans can drive the same engine visually with `launch ui` (local dashboard, same gates — see docs/ui-dashboard.md); this skill remains the autonomous path.1819## Sequence2021### 1. Intake [CLI]2223```24launch init <dir> --domain <domain> --price <price> [--name --tagline --audience]25```2627Pull flag values from the conversation. Read back `<dir>/.launch/launch.config.json` and confirm the summary with the user. Re-run with `--force` if they correct anything.2829### 2. DashClaw setup [session]30311. `select_project` (or `create_project` if this product has no DashClaw project yet).322. `create_launch` with `declared_stack` from the config — typically `["domain", "vercel", "stripe", "resend"]`.333. `preflight_launch` — validates every provider token BEFORE any money is spent. If it fails, STOP and present a remediation table (provider → failing check → fix); do not proceed to spend steps.3435### 3. Domain [session] — 💰 SPEND GATE #136371. `check_domain_availability` for the config domain (and 2-3 alternatives if taken).382. Present price and alternatives to the user.393. **SPEND GATE: ask the user for explicit approval with AskUserQuestion and WAIT for their answer. Never call `purchase_domain` without a fresh approval in this conversation.** Record the approval decision via `dashclaw_guard` + `dashclaw_record` for the audit trail.404. On approval: `purchase_domain`. On decline: skip to step 4 using an already-owned domain or stop.4142### 4. Hosting [session]43441. `create_vercel_project` (link the product repo).452. `create_vercel_deployment` and poll `get_vercel_deployment_status` until READY.463. `add_vercel_domain` for the purchased domain.474. `set_dns_records` per Vercel's required records (A/CNAME from the add-domain response); verify with `get_dns_records`.485. Set any product env vars with `set_vercel_env_var`.4950### 5. Payments [session] — 💰 SPEND GATE #2 (live mode)5152Stripe best practices: create in TEST mode first, verify the full flow, then — and only then — recreate in live mode behind the gate.53541. `create_stripe_product` + `create_stripe_price` (TEST mode) from config pricing.552. `create_stripe_webhook` pointing at the product's webhook endpoint; store the signing secret as a Vercel env var (`set_vercel_env_var`), never in the repo.563. Verify test checkout end-to-end.574. **SPEND GATE: live mode creates real billable objects. Ask the user for explicit approval with AskUserQuestion and WAIT for their answer before recreating product/price/webhook in live mode.** Audit via `dashclaw_guard` + `dashclaw_record`.5859### 6. Email infra [session]60611. `create_resend_domain` for the config domain.622. `set_dns_records` with the DKIM/SPF records from the response.633. `verify_resend_domain` (DNS propagation can take minutes — poll, don't fail fast).6465### 7. Research [CLI + session]66671. **[CLI]** `launch research <dir>` (live mode — keyless fetchers: x-algorithm README, Algolia Show HN winners, hunted.space, per-sub Reddit rules).682. **[session]** WebSearch synthesis per platform (queries from THINKING.md: "X algorithm ranking signals <month year>", "<month year> LinkedIn algorithm what's working", PH featuring criteria). Write the synthesis into each brief's `## Session research` section — the CLI preserves that section on regeneration.693. **[CLI]** `launch research <dir> --check` must pass (all briefs fresh) before copy.7071### 8. Copy [CLI + session]72731. **[CLI]** `launch copy <dir> --scaffold`.742. **[session]** Fill every draft in `<dir>/.launch/drafts/` with real copy written from the research briefs (hooks from Show HN winners, X thread structure, LinkedIn link-in-first-comment, per-sub Reddit angles, email/SMS from the announcement templates). Replace every `{{placeholder}}` including `{{unsubscribeUrl}}`.753. **[CLI]** `launch copy <dir> --validate` — loop fill→validate until exit 0.7677### 9. 🚦 PUBLISH GATE [session]7879Render EVERY draft (all platforms + the email HTML + SMS text) to the user in one review block. **Ask for explicit approval with AskUserQuestion (multiSelect per-platform opt-out) and WAIT for the user's answer. Nothing is published until the user approves; platforms they deselect are skipped.** Record the decision via `dashclaw_record`.8081### 10. Distribute [CLI + session]82831. **[CLI]** `launch post <dir> --all --live` — posts X, Bluesky, Facebook, LinkedIn, YouTube, Reddit via API; submits sitemap + URL inspection to Google; skips blocked providers with a summary; the posted-ledger makes re-runs idempotent.842. **[CLI]** Assisted platforms at their recommended times (from the briefs):85 - `launch post <dir> --platform hackernews --assist --live` — opens the prefilled Show HN submitlink, copies the maker comment. The HUMAN clicks submit.86 - `launch post <dir> --platform producthunt --assist --live` — writes `.launch/out/producthunt-kit.md`, opens the submit page, copies the tagline. Schedule per the kit (12:01 AM PT, low-competition day).873. **[CLI]** `launch notify <dir> --channel email` and `--channel sms` — renders artifacts + `.launch/out/notify-payloads.json` (consent-filtered).884. **[session]** For each payload entry: `send_resend_email` / `send_twilio_sms` with the exact `input` object. The CLI never sends.8990### 11. Verify & report [CLI + session]91921. **[session]** `verify_launch` + `get_launch_status` for the infra side.932. **[CLI]** `launch status <dir>` for the distribution side.943. Final report: live URL, posted links from the ledger, pending assisted steps, and the stats command (`launch stats <dir> --platform producthunt --slug <slug>`).9596## Failure handling9798- Any MCP failure: surface the error verbatim, consult `get_launch_status`, and fix forward.99- NEVER re-run a spend step (domain purchase, live Stripe) after a failure without a fresh approval gate — check the launch plan state and the audit log first.100- Posting failures: the ledger guarantees completed platforms are skipped on re-run; fix the failing provider (see `launch doctor`) and re-run `launch post <dir> --all --live`.101- Credential problems: `launch doctor --json` gives provider → mode → fix hint; degrade blocked API platforms to assisted/manual instead of failing the launch.102103## Dry-run rehearsal (run this before any real launch)104105No money, no posts, no sends — end to end. `launch post` is DRY-RUN BY DEFAULT now,106so `--dry-run` below is optional (kept for back-compat) and `--live` is what actually107publishes. `--assist` is the one exception: it opens a prefilled page and copies text108but submits nothing, so it runs for real without `--live`.109110111```112launch init <dir> --domain <domain> --price <price>113launch research <dir> --offline114launch copy <dir> --scaffold115# fill drafts (session) …116launch copy <dir> --validate117launch post <dir> --all --dry-run # prints exact request payloads, writes nothing118launch notify <dir> --channel email --dry-run119launch notify <dir> --channel sms --dry-run120launch status <dir>121```122123Skip every DashClaw spend step during rehearsal (no `purchase_domain`, no live Stripe). The rehearsal is green when every command exits 0 and the drafts pass validation.124125## Credentials126127Social API keys live in the engine repo's `.env` (template: `.env.example`, per-provider setup cost/time guides in `docs/setup-<provider>.md`, launch-day checklist in `docs/launch-runbook.md`). DashClaw infra credentials live with the DashClaw MCP server — this skill calls the tools, the CLI never sees those secrets.