$npx -y skills add MoizIbnYousaf/marketing-cli --skill mktg-setupFirst-run conversational setup wizard for marketing-cli. Use when /cmo detects no populated brand files and no cmo-preferences.md, when the user just installed marketing-cli for the first time, or when they say things like "set up marketing", "start marketing", "marketing wizard"
| 1 | # /mktg-setup — First-Run Conversational Setup |
| 2 | |
| 3 | ## When This Runs |
| 4 | |
| 5 | `/cmo` invokes this skill automatically when both conditions are true: |
| 6 | |
| 7 | 1. `brand/cmo-preferences.md` does not exist (or is template content), AND |
| 8 | 2. `mktg status --json` reports `brandSummary.populated < 3`. |
| 9 | |
| 10 | The user typically never types `/mktg-setup`. They install marketing-cli (`npm i -g marketing-cli`), open Claude Code in any project directory, type `/cmo` (or just say "help me with marketing"), and `/cmo`'s activation routes here. The wizard is a conversational on-ramp, not a slash command users have to memorize. |
| 11 | |
| 12 | ## What This Skill Does |
| 13 | |
| 14 | Three AskUserQuestion calls. That is the entire wizard. No batched questions, no progress bars, no long forms. |
| 15 | |
| 16 | Each answer becomes a persistent decision in `brand/cmo-preferences.md`. After question 3, hand off to `/cmo`'s foundation flow (3 research agents in parallel — see `cmo/rules/sub-agents.md`). |
| 17 | |
| 18 | The wizard's job is to record the small set of decisions Claude cannot make for the user. Filling out the 10 brand files is `/cmo`'s job, not the wizard's. |
| 19 | |
| 20 | ## On Activation |
| 21 | |
| 22 | 1. Run `mktg status --json --fields project,brand,brandSummary` from the project root. |
| 23 | 2. If `brandSummary.populated >= 3` AND `cmo-preferences.md` doesn't exist: a returning user got upgraded to a version that introduced preferences. Tell them: "I see you have a populated brand but no preferences file yet. I'll write one based on what's already here." Skip directly to step 3 (write preferences) using inferred defaults from existing brand files. |
| 24 | 3. If `cmo-preferences.md` already exists and is non-template: skip the wizard entirely. Hand back to `/cmo` immediately. Tell the user: "Looks like you've already onboarded. Hand off to /cmo for your next move." |
| 25 | 4. Otherwise (genuine first run): proceed to Step 1. |
| 26 | |
| 27 | --- |
| 28 | |
| 29 | ## Step 1 — Ask: Identity |
| 30 | |
| 31 | Step 1 is a single-select question (1a) plus exactly one free-text follow-up (1b or 1c). Don't merge them and don't add extra prompts in between. |
| 32 | |
| 33 | ### Step 1a — Setup mode |
| 34 | |
| 35 | Use AskUserQuestion. Single-select. |
| 36 | |
| 37 | **Question text:** "How should we set up your brand?" |
| 38 | |
| 39 | **Options:** |
| 40 | - "From a URL — I'll scrape your site to seed brand files (recommended if you have a website)" |
| 41 | - "Local conversational setup — I'll ask a few questions instead" |
| 42 | - "Pre-launch / open source / personal brand — describe in 1 sentence" |
| 43 | |
| 44 | The user's choice determines the follow-up: |
| 45 | - **"From a URL"** → go to **Step 1b** (URL capture). |
| 46 | - **"Local conversational setup"** OR **"Pre-launch / open source / personal brand"** → go to **Step 1c** (sentence capture). |
| 47 | |
| 48 | ### Step 1b — URL capture (only if Step 1a = "From a URL") |
| 49 | |
| 50 | Use AskUserQuestion. Single-select with the "Other" free-text path (so the user can paste the URL inline). |
| 51 | |
| 52 | **Question text:** "Paste your URL" |
| 53 | |
| 54 | **Options:** |
| 55 | - "I'll paste the URL in the next message" — the user types the URL in their next chat message. |
| 56 | - (Use the built-in "Other" free-text option for inline URL entry — paste-and-go.) |
| 57 | |
| 58 | Capture the URL exactly as the user provides it. **Do NOT validate it inside the wizard** — no regex, no protocol check, no normalization. Pass the raw string straight to the CLI: |
| 59 | |
| 60 | ```bash |
| 61 | mktg init --from <url> |
| 62 | ``` |
| 63 | |
| 64 | `mktg init --from` is the single source of truth for URL handling. If the URL is malformed, unreachable, or scrape-blocked, the CLI surfaces the error; the wizard relays that error to the user and falls back to the local sentence path (offer "I'll describe it in one sentence instead" without re-asking Step 1a). |
| 65 | |
| 66 | On success, the scrape seeds `brand/voice-profile.md`, `brand/positioning.md`, `brand/audience.md`, and `brand/competitors.md`. Hold the captured URL and the "scrape ran" status (yes/no) for Step 5. |
| 67 | |
| 68 | ### Step 1c — Sentence capture (only if Step 1a = "Local conversational setup" OR "Pre-launch / open source / personal brand") |
| 69 | |
| 70 | No URL here — this is the deliberate no-URL path. Ask a single short follow-up: |
| 71 | |
| 72 | > "Got it — describe what we're marketing in one sentence." |
| 73 | |
| 74 | Capture the response verbatim. Hold it as the seed for `brand/voice-profile.md` (it lands in the "What we are" section during Step 5 / foundation flow). Don't run `mktg init --from`; the foundation research agents fill the |