[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DKF9BWDAGYFVWSFH3C22Y5":3,"skill-same:01M6DKF9BWDAGYFVWSFH3C22Y5":90},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":34,"publishedAt":55,"linkOnly":56,"markdownContent":57,"markdownBody":58,"frontMatter":59,"refName":66,"commitSha":67,"skillDirectory":68,"forksCount":69,"repositoryHtmlUrl":70,"repositoryHomepageUrl":71,"ownerHtmlUrl":72,"ownerBlogUrl":73,"ownerDescription":74,"updatedAt":75,"install":76,"resources":89},"01M6DKF9BWDAGYFVWSFH3C22Y5","mktg-setup",null,"First-run conversational setup wizard for marketing-cli. Use when \u002Fcmo 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\", \"I just installed marketing-cli\", \"onboard me\", \"first time\", \"initial setup\". Asks 3 sharp questions (identity, posture, distribution preferences), records the answers to brand\u002Fcmo-preferences.md, then hands off to \u002Fcmo's foundation flow which spawns 3 research agents in parallel. The user never has to type \u002Fmktg-setup directly — \u002Fcmo auto-routes here on first run.","MoizIbnYousaf\u002Fmarketing-cli","MoizIbnYousaf","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F148609638?v=4","01M6DK31T63X0A4VD3HV88V5E4","Abdul Moiz Shahzad","01M6DK31ZWA28MZK3202BZRXAB",35,"MIT","https:\u002F\u002Fgithub.com\u002FMoizIbnYousaf\u002Fmarketing-cli\u002Fblob\u002Fmain\u002Fskills\u002Fmktg-setup\u002FSKILL.md",[18,23,26,31],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000015","视觉设计","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000019","营销推广",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000032","设计师","PROFESSION","适用职业",{"categoryNo":32,"categoryName":33,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000035","市场营销",[35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54],"mktg setup","setup","parallel","distribution","time","me","files","up","never","auto","brand","cli","marketing","Bash","wizard","SET","flow","start","run","identity","2026-11-10 10:12:30",false,"---\nname: mktg-setup\ndescription: >\n  First-run conversational setup wizard for marketing-cli. Use when \u002Fcmo\n  detects no populated brand files and no cmo-preferences.md, when the user\n  just installed marketing-cli for the first time, or when they say things\n  like \"set up marketing\", \"start marketing\", \"marketing wizard\", \"I just\n  installed marketing-cli\", \"onboard me\", \"first time\", \"initial setup\".\n  Asks 3 sharp questions (identity, posture, distribution preferences),\n  records the answers to brand\u002Fcmo-preferences.md, then hands off to \u002Fcmo's\n  foundation flow which spawns 3 research agents in parallel. The user never\n  has to type \u002Fmktg-setup directly — \u002Fcmo auto-routes here on first run.\nallowed-tools:\n  - Bash(mktg *)\n  - Bash(mkdir *)\n  - Bash(test *)\n  - Bash(cat *)\n---\n\n# \u002Fmktg-setup — First-Run Conversational Setup\n\n## When This Runs\n\n`\u002Fcmo` invokes this skill automatically when both conditions are true:\n\n1. `brand\u002Fcmo-preferences.md` does not exist (or is template content), AND\n2. `mktg status --json` reports `brandSummary.populated \u003C 3`.\n\nThe user typically never types `\u002Fmktg-setup`. They install marketing-cli (`npm i -g marketing-cli`), open Claude Code in any project directory, type `\u002Fcmo` (or just say \"help me with marketing\"), and `\u002Fcmo`'s activation routes here. The wizard is a conversational on-ramp, not a slash command users have to memorize.\n\n## What This Skill Does\n\nThree AskUserQuestion calls. That is the entire wizard. No batched questions, no progress bars, no long forms.\n\nEach answer becomes a persistent decision in `brand\u002Fcmo-preferences.md`. After question 3, hand off to `\u002Fcmo`'s foundation flow (3 research agents in parallel — see `cmo\u002Frules\u002Fsub-agents.md`).\n\nThe wizard's job is to record the small set of decisions Claude cannot make for the user. Filling out the 10 brand files is `\u002Fcmo`'s job, not the wizard's.\n\n## On Activation\n\n1. Run `mktg status --json --fields project,brand,brandSummary` from the project root.\n2. 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.\n3. If `cmo-preferences.md` already exists and is non-template: skip the wizard entirely. Hand back to `\u002Fcmo` immediately. Tell the user: \"Looks like you've already onboarded. Hand off to \u002Fcmo for your next move.\"\n4. Otherwise (genuine first run): proceed to Step 1.\n\n---\n\n## Step 1 — Ask: Identity\n\nStep 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.\n\n### Step 1a — Setup mode\n\nUse AskUserQuestion. Single-select.\n\n**Question text:** \"How should we set up your brand?\"\n\n**Options:**\n- \"From a URL — I'll scrape your site to seed brand files (recommended if you have a website)\"\n- \"Local conversational setup — I'll ask a few questions instead\"\n- \"Pre-launch \u002F open source \u002F personal brand — describe in 1 sentence\"\n\nThe user's choice determines the follow-up:\n- **\"From a URL\"** → go to **Step 1b** (URL capture).\n- **\"Local conversational setup\"** OR **\"Pre-launch \u002F open source \u002F personal brand\"** → go to **Step 1c** (sentence capture).\n\n### Step 1b — URL capture (only if Step 1a = \"From a URL\")\n\nUse AskUserQuestion. Single-select with the \"Other\" free-text path (so the user can paste the URL inline).\n\n**Question text:** \"Paste your URL\"\n\n**Options:**\n- \"I'll paste the URL in the next message\" — the user types the URL in their next chat message.\n- (Use the built-in \"Other\" free-text option for inline URL entry — paste-and-go.)\n\nCapture 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:\n\n```bash\nmktg init --from \u003Curl>\n```\n\n`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).\n\nOn success, the scrape seeds `brand\u002Fvoice-profile.md`, `brand\u002Fpositioning.md`, `brand\u002Faudience.md`, and `brand\u002Fcompetitors.md`. Hold the captured URL and the \"scrape ran\" status (yes\u002Fno) for Step 5.\n\n### Step 1c — Sentence capture (only if Step 1a = \"Local conversational setup\" OR \"Pre-launch \u002F open source \u002F personal brand\")\n\nNo URL here — this is the deliberate no-URL path. Ask a single short follow-up:\n\n> \"Got it — describe what we're marketing in one sentence.\"\n\nCapture the response verbatim. Hold it as the seed for `brand\u002Fvoice-profile.md` (it lands in the \"What we are\" section during Step 5 \u002F foundation flow). Don't run `mktg init --from`; the foundation research agents fill the gaps.\n\n---\n\n## Step 2 — Ask: Posture\n\nUse AskUserQuestion. Single-select.\n\n**Question text:** \"What's the marketing posture you want?\"\n\n**Options:**\n- \"Aggressive launch\" — Product Hunt + Hacker News + X campaign blitz. Best for new product launches with momentum to capture.\n- \"Steady authority build\" — SEO + newsletter + slow-burn thought leadership. Best for long-game category ownership.\n- \"Founder-led \u002F personal brand\" — voice-driven content, personality forward. Best when the founder IS the differentiator.\n- \"Product-led growth\" — free tier hooks, referrals, viral mechanics. Best when the product itself drives acquisition.\n\nThis is the single most important answer. It shapes which skills `\u002Fcmo` prioritizes downstream:\n\n| Posture | Skills \u002Fcmo prioritizes |\n|---|---|\n| aggressive-launch | `launch-strategy`, `startup-launcher`, `social-campaign`, `direct-response-copy` |\n| steady-authority | `seo-content`, `keyword-research`, `newsletter`, `ai-seo` |\n| founder-led | `brand-voice`, `voice-extraction`, `content-atomizer`, `mktg-x` |\n| product-led-growth | `free-tool-strategy`, `referral-program`, `lead-magnet`, `conversion-flow-cro` |\n\n---\n\n## Step 3 — Ask: Distribution\n\nUse AskUserQuestion. multiSelect = true.\n\n**Question text:** \"Which distribution channels should we wire up first?\"\n\n**Options:**\n- \"Typefully\" — X\u002FTwitter and threads. Best for short-form and thread-first audiences.\n- \"Postiz\" — LinkedIn, Reddit, Bluesky, Mastodon, Threads, Instagram, TikTok, etc. (30+ providers via the postiz catalog).\n- \"Resend\" — transactional email and newsletter delivery.\n- \"Skip for now — I'll connect later\" — `\u002Fcmo` will use `--adapter file` for export until the user wires something up.\n\nMultiple selections are fine. If the user picks \"Skip\", record that explicitly — a deliberate skip is signal, not absence of data.\n\n---\n\n## Step 4 — Ask: Studio (beta)\n\nUse AskUserQuestion. Single-select.\n\n**Question text:** \"Want to use the Studio dashboard? (beta)\"\n\n**Options:**\n- \"Yes — auto-open the Studio at the end of setup (recommended)\" — `\u002Fcmo` will run `mktg studio` automatically at the end of foundation flow and on subsequent activations when the user says \"show me the dashboard.\"\n- \"No — keep me in the CLI only\" — `\u002Fcmo` will not auto-launch Studio. The user can still run `mktg studio` manually any time.\n\nWhy this question: Studio is in beta. Some users prefer pure CLI workflows (especially headless\u002Fagent-only environments). Recording the choice once means \u002Fcmo never nags later.\n\nIf the user picks \"No\", `\u002Fcmo` reads `studio_enabled: no` from preferences and skips the studio launch step in its foundation flow. If they later change their mind, they can edit `brand\u002Fcmo-preferences.md` directly or just say \"let's open studio\" and \u002Fcmo will respect the explicit ask.\n\n---\n\n## Step 5 — Write Preferences\n\nCreate `brand\u002Fcmo-preferences.md` with this shape:\n\n```markdown\n# CMO Preferences\n\n> Recorded by \u002Fmktg-setup on {ISO 8601 date}. Edit this file to change \u002Fcmo's runtime behavior.\n> \u002Fcmo reads this file on every activation and uses it to shape skill prioritization and distribution routing.\n\n## Identity\n\n- **What we're marketing**: {URL or one-sentence description from Step 1}\n- **Setup mode**: {from-url | local | pre-launch}\n- **URL**: {captured URL if Setup mode is from-url, otherwise omit this line}\n- **Scrape ran**: {yes if mktg init --from succeeded, no if from-url failed or mode is local\u002Fpre-launch}\n\n## Posture\n\n- **Mode**: {aggressive-launch | steady-authority | founder-led | product-led-growth}\n- **Why this mode**: {one-line rationale based on the user's choice — pull from the option description in Step 2}\n- **Skill priority shortlist**: {comma-separated list from the posture-to-skills mapping}\n\n## Distribution\n\n- **Selected**: {comma-separated list of selected platforms, or \"none\" if skipped}\n- **Skipped**: {whichever options weren't selected}\n- **Default adapter**: {typefully if X selected and only X | postiz if multi-platform | file if skipped}\n\n## Studio\n\n- **studio_enabled**: {yes | no}\n- **Beta**: yes (Studio is in beta — record the user's preference; \u002Fcmo respects this on every activation)\n- **Auto-open at end of setup**: {yes if studio_enabled is yes, no otherwise}\n\n## Notes\n\n- This file is the persistent contract. \u002Fcmo reads it on every activation.\n- To change preferences, edit this file directly OR ask Claude to \"re-run mktg setup\" (it will overwrite this file).\n```\n\nMake sure the directory exists before writing:\n\n```bash\ntest -d brand || mkdir -p brand\n```\n\n---\n\n## Step 6 — Hand Off to \u002Fcmo\n\n**SEO backend handoff (before spawning agents):** run `mktg seo status --json --fields readiness,catalog.endpointError,project`. OpenSEO is the default SEO data plane (measured KD, volume, SERP, backlinks, GSC).\n\n- Any `*_ready` state → tell the user: \"OpenSEO is configured. After foundation, I'll verify it with the free `whoami` tool and link a project (`mktg seo link-project`) so keyword research can use measured metrics.\" After the foundation chain, if `.seo\u002Fopenseo.json` is still missing, recommend `\u002Fopenseo-project-setup` as the first SEO move.\n- `not_configured` → one line only, no blocking: \"OpenSEO isn't set up — keyword metrics will be `unknown` until it is. Setup takes a minute: openseo.so → connect the hosted MCP with OAuth, or set OPENSEO_API_KEY for headless use.\" Never install anything or ask for keys inside the wizard.\n\nTell the user clearly what's happening next. Tailor the closing line to their Studio choice:\n\n- **studio_enabled = yes** → \"Recorded your preferences. Now I'm spawning 3 research agents in parallel — brand voice, audience, and competitors — to fill out your foundation. ~5 minutes. Then I'll auto-open the Studio dashboard.\"\n- **studio_enabled = no** → \"Recorded your preferences. Now I'm spawning 3 research agents in parallel — brand voice, audience, and competitors — to fill out your foundation. ~5 minutes. Studio stays off per your choice; I'll surface results in the CLI.\"\n\nThen invoke the foundation flow per `cmo\u002Frules\u002Fsub-agents.md`:\n\n1. Spawn `mktg-brand-researcher` with the identity context from Step 1\n2. Spawn `mktg-audience-researcher` with the posture context from Step 2\n3. Spawn `mktg-competitive-scanner` with both\n\nWait for all 3, then chain:\n- `\u002Flandscape-scan` for ecosystem grounding\n- `\u002Fpositioning-angles` to lock the angle\n- **If `studio_enabled` is `yes`**: run `mktg studio` to auto-open the dashboard with the populated state.\n- **If `studio_enabled` is `no`**: skip the Studio launch. Print a one-line summary of what was populated and the next recommended skill in the CLI. Tell the user: \"Studio's off per your preference. If you change your mind, edit `brand\u002Fcmo-preferences.md` or just say 'open studio'.\"\n\n---\n\n## Anti-Patterns\n\n| Anti-pattern | Instead | Why |\n|---|---|---|\n| Asking more than 3 questions in the wizard | Stop at 3 — hand off to \u002Fcmo for the rest | More questions = abandonment. \u002Fcmo's research agents fill the rest in 5 minutes via real research. |\n| Asking for a URL before letting the user pick a setup mode | Always ask Step 1a (setup mode) first, then branch to Step 1b (URL) or Step 1c (sentence) | URL is just one of three paths. Pre-launch \u002F open-source \u002F personal-brand users don't have a URL yet, and the local conversational path bypasses the scrape entirely. Forcing a URL up front blocks them. |\n| Validating the URL inside the wizard (regex, http vs https, \"is this real?\") | Pass the raw string straight to `mktg init --from \u003Curl>` and let the CLI handle malformed inputs | The CLI already returns structured errors for bad URLs. Re-validating in the wizard duplicates logic, drifts from the CLI, and frustrates users who paste valid-but-unusual URLs. |\n| Silently routing to brand-voice \u002F audience-research before recording preferences | Always record `cmo-preferences.md` FIRST | Without it, every future `\u002Fcmo` activation re-runs the wizard. The preferences file is the contract that prevents that. |\n| Skipping the wizard if voice-profile.md exists but cmo-preferences.md doesn't | Run the wizard regardless of other brand files (use the migration path in step 2) | `cmo-preferences.md` is the persistent contract — separate from brand content. A user who upgraded from pre-mktg-setup needs to record their posture explicitly. |\n| Treating \"Skip distribution\" as missing data | Record the skip explicitly as `selected: none` and `default_adapter: file` | A deliberate skip is signal. The user told us not to wire anything yet — respect that. |\n| Spawning research agents BEFORE writing cmo-preferences.md | Always write the file first | If the user kills the conversation mid-research, we lose the preferences. The file write is the savepoint. |\n| Letting the user re-run the wizard accidentally | After writing the file, \u002Fcmo on the next activation will see it and skip the wizard | This is the whole point of the persistent contract. \u002Fcmo only re-routes here when the file is missing. |\n\n---\n\n## Iteration \u002F Re-Running\n\nThe user can change their preferences three ways:\n\n1. **Edit `brand\u002Fcmo-preferences.md` directly** — it's just markdown.\n2. **Ask Claude**: \"I want to change my marketing posture\" — `\u002Fcmo` will re-route here, overwriting the file.\n3. **Future**: `mktg setup --force` (CLI flag, not yet implemented at v0.5.0; tracked for a future release).\n\n---\n\n## Dependencies\n\n- Reads: `mktg status --json`, optionally URL via `mktg init --from \u003Curl>`.\n- Writes: `brand\u002Fcmo-preferences.md` (new). Optionally seeds `brand\u002Fvoice-profile.md` if the user provided a sentence in Step 1.\n- Hands off to: `\u002Fcmo` foundation flow (which spawns the 3 research agents and chains `\u002Flandscape-scan` → `\u002Fpositioning-angles` → `mktg studio`).\n","# \u002Fmktg-setup — First-Run Conversational Setup\n\n## When This Runs\n\n`\u002Fcmo` invokes this skill automatically when both conditions are true:\n\n1. `brand\u002Fcmo-preferences.md` does not exist (or is template content), AND\n2. `mktg status --json` reports `brandSummary.populated \u003C 3`.\n\nThe user typically never types `\u002Fmktg-setup`. They install marketing-cli (`npm i -g marketing-cli`), open Claude Code in any project directory, type `\u002Fcmo` (or just say \"help me with marketing\"), and `\u002Fcmo`'s activation routes here. The wizard is a conversational on-ramp, not a slash command users have to memorize.\n\n## What This Skill Does\n\nThree AskUserQuestion calls. That is the entire wizard. No batched questions, no progress bars, no long forms.\n\nEach answer becomes a persistent decision in `brand\u002Fcmo-preferences.md`. After question 3, hand off to `\u002Fcmo`'s foundation flow (3 research agents in parallel — see `cmo\u002Frules\u002Fsub-agents.md`).\n\nThe wizard's job is to record the small set of decisions Claude cannot make for the user. Filling out the 10 brand files is `\u002Fcmo`'s job, not the wizard's.\n\n## On Activation\n\n1. Run `mktg status --json --fields project,brand,brandSummary` from the project root.\n2. 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.\n3. If `cmo-preferences.md` already exists and is non-template: skip the wizard entirely. Hand back to `\u002Fcmo` immediately. Tell the user: \"Looks like you've already onboarded. Hand off to \u002Fcmo for your next move.\"\n4. Otherwise (genuine first run): proceed to Step 1.\n\n---\n\n## Step 1 — Ask: Identity\n\nStep 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.\n\n### Step 1a — Setup mode\n\nUse AskUserQuestion. Single-select.\n\n**Question text:** \"How should we set up your brand?\"\n\n**Options:**\n- \"From a URL — I'll scrape your site to seed brand files (recommended if you have a website)\"\n- \"Local conversational setup — I'll ask a few questions instead\"\n- \"Pre-launch \u002F open source \u002F personal brand — describe in 1 sentence\"\n\nThe user's choice determines the follow-up:\n- **\"From a URL\"** → go to **Step 1b** (URL capture).\n- **\"Local conversational setup\"** OR **\"Pre-launch \u002F open source \u002F personal brand\"** → go to **Step 1c** (sentence capture).\n\n### Step 1b — URL capture (only if Step 1a = \"From a URL\")\n\nUse AskUserQuestion. Single-select with the \"Other\" free-text path (so the user can paste the URL inline).\n\n**Question text:** \"Paste your URL\"\n\n**Options:**\n- \"I'll paste the URL in the next message\" — the user types the URL in their next chat message.\n- (Use the built-in \"Other\" free-text option for inline URL entry — paste-and-go.)\n\nCapture 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:\n\n```bash\nmktg init --from \u003Curl>\n```\n\n`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).\n\nOn success, the scrape seeds `brand\u002Fvoice-profile.md`, `brand\u002Fpositioning.md`, `brand\u002Faudience.md`, and `brand\u002Fcompetitors.md`. Hold the captured URL and the \"scrape ran\" status (yes\u002Fno) for Step 5.\n\n### Step 1c — Sentence capture (only if Step 1a = \"Local conversational setup\" OR \"Pre-launch \u002F open source \u002F personal brand\")\n\nNo URL here — this is the deliberate no-URL path. Ask a single short follow-up:\n\n> \"Got it — describe what we're marketing in one sentence.\"\n\nCapture the response verbatim. Hold it as the seed for `brand\u002Fvoice-profile.md` (it lands in the \"What we are\" section during Step 5 \u002F foundation flow). Don't run `mktg init --from`; the foundation research agents fill the gaps.\n\n---\n\n## Step 2 — Ask: Posture\n\nUse AskUserQuestion. Single-select.\n\n**Question text:** \"What's the marketing posture you want?\"\n\n**Options:**\n- \"Aggressive launch\" — Product Hunt + Hacker News + X campaign blitz. Best for new product launches with momentum to capture.\n- \"Steady authority build\" — SEO + newsletter + slow-burn thought leadership. Best for long-game category ownership.\n- \"Founder-led \u002F personal brand\" — voice-driven content, personality forward. Best when the founder IS the differentiator.\n- \"Product-led growth\" — free tier hooks, referrals, viral mechanics. Best when the product itself drives acquisition.\n\nThis is the single most important answer. It shapes which skills `\u002Fcmo` prioritizes downstream:\n\n| Posture | Skills \u002Fcmo prioritizes |\n|---|---|\n| aggressive-launch | `launch-strategy`, `startup-launcher`, `social-campaign`, `direct-response-copy` |\n| steady-authority | `seo-content`, `keyword-research`, `newsletter`, `ai-seo` |\n| founder-led | `brand-voice`, `voice-extraction`, `content-atomizer`, `mktg-x` |\n| product-led-growth | `free-tool-strategy`, `referral-program`, `lead-magnet`, `conversion-flow-cro` |\n\n---\n\n## Step 3 — Ask: Distribution\n\nUse AskUserQuestion. multiSelect = true.\n\n**Question text:** \"Which distribution channels should we wire up first?\"\n\n**Options:**\n- \"Typefully\" — X\u002FTwitter and threads. Best for short-form and thread-first audiences.\n- \"Postiz\" — LinkedIn, Reddit, Bluesky, Mastodon, Threads, Instagram, TikTok, etc. (30+ providers via the postiz catalog).\n- \"Resend\" — transactional email and newsletter delivery.\n- \"Skip for now — I'll connect later\" — `\u002Fcmo` will use `--adapter file` for export until the user wires something up.\n\nMultiple selections are fine. If the user picks \"Skip\", record that explicitly — a deliberate skip is signal, not absence of data.\n\n---\n\n## Step 4 — Ask: Studio (beta)\n\nUse AskUserQuestion. Single-select.\n\n**Question text:** \"Want to use the Studio dashboard? (beta)\"\n\n**Options:**\n- \"Yes — auto-open the Studio at the end of setup (recommended)\" — `\u002Fcmo` will run `mktg studio` automatically at the end of foundation flow and on subsequent activations when the user says \"show me the dashboard.\"\n- \"No — keep me in the CLI only\" — `\u002Fcmo` will not auto-launch Studio. The user can still run `mktg studio` manually any time.\n\nWhy this question: Studio is in beta. Some users prefer pure CLI workflows (especially headless\u002Fagent-only environments). Recording the choice once means \u002Fcmo never nags later.\n\nIf the user picks \"No\", `\u002Fcmo` reads `studio_enabled: no` from preferences and skips the studio launch step in its foundation flow. If they later change their mind, they can edit `brand\u002Fcmo-preferences.md` directly or just say \"let's open studio\" and \u002Fcmo will respect the explicit ask.\n\n---\n\n## Step 5 — Write Preferences\n\nCreate `brand\u002Fcmo-preferences.md` with this shape:\n\n```markdown\n# CMO Preferences\n\n> Recorded by \u002Fmktg-setup on {ISO 8601 date}. Edit this file to change \u002Fcmo's runtime behavior.\n> \u002Fcmo reads this file on every activation and uses it to shape skill prioritization and distribution routing.\n\n## Identity\n\n- **What we're marketing**: {URL or one-sentence description from Step 1}\n- **Setup mode**: {from-url | local | pre-launch}\n- **URL**: {captured URL if Setup mode is from-url, otherwise omit this line}\n- **Scrape ran**: {yes if mktg init --from succeeded, no if from-url failed or mode is local\u002Fpre-launch}\n\n## Posture\n\n- **Mode**: {aggressive-launch | steady-authority | founder-led | product-led-growth}\n- **Why this mode**: {one-line rationale based on the user's choice — pull from the option description in Step 2}\n- **Skill priority shortlist**: {comma-separated list from the posture-to-skills mapping}\n\n## Distribution\n\n- **Selected**: {comma-separated list of selected platforms, or \"none\" if skipped}\n- **Skipped**: {whichever options weren't selected}\n- **Default adapter**: {typefully if X selected and only X | postiz if multi-platform | file if skipped}\n\n## Studio\n\n- **studio_enabled**: {yes | no}\n- **Beta**: yes (Studio is in beta — record the user's preference; \u002Fcmo respects this on every activation)\n- **Auto-open at end of setup**: {yes if studio_enabled is yes, no otherwise}\n\n## Notes\n\n- This file is the persistent contract. \u002Fcmo reads it on every activation.\n- To change preferences, edit this file directly OR ask Claude to \"re-run mktg setup\" (it will overwrite this file).\n```\n\nMake sure the directory exists before writing:\n\n```bash\ntest -d brand || mkdir -p brand\n```\n\n---\n\n## Step 6 — Hand Off to \u002Fcmo\n\n**SEO backend handoff (before spawning agents):** run `mktg seo status --json --fields readiness,catalog.endpointError,project`. OpenSEO is the default SEO data plane (measured KD, volume, SERP, backlinks, GSC).\n\n- Any `*_ready` state → tell the user: \"OpenSEO is configured. After foundation, I'll verify it with the free `whoami` tool and link a project (`mktg seo link-project`) so keyword research can use measured metrics.\" After the foundation chain, if `.seo\u002Fopenseo.json` is still missing, recommend `\u002Fopenseo-project-setup` as the first SEO move.\n- `not_configured` → one line only, no blocking: \"OpenSEO isn't set up — keyword metrics will be `unknown` until it is. Setup takes a minute: openseo.so → connect the hosted MCP with OAuth, or set OPENSEO_API_KEY for headless use.\" Never install anything or ask for keys inside the wizard.\n\nTell the user clearly what's happening next. Tailor the closing line to their Studio choice:\n\n- **studio_enabled = yes** → \"Recorded your preferences. Now I'm spawning 3 research agents in parallel — brand voice, audience, and competitors — to fill out your foundation. ~5 minutes. Then I'll auto-open the Studio dashboard.\"\n- **studio_enabled = no** → \"Recorded your preferences. Now I'm spawning 3 research agents in parallel — brand voice, audience, and competitors — to fill out your foundation. ~5 minutes. Studio stays off per your choice; I'll surface results in the CLI.\"\n\nThen invoke the foundation flow per `cmo\u002Frules\u002Fsub-agents.md`:\n\n1. Spawn `mktg-brand-researcher` with the identity context from Step 1\n2. Spawn `mktg-audience-researcher` with the posture context from Step 2\n3. Spawn `mktg-competitive-scanner` with both\n\nWait for all 3, then chain:\n- `\u002Flandscape-scan` for ecosystem grounding\n- `\u002Fpositioning-angles` to lock the angle\n- **If `studio_enabled` is `yes`**: run `mktg studio` to auto-open the dashboard with the populated state.\n- **If `studio_enabled` is `no`**: skip the Studio launch. Print a one-line summary of what was populated and the next recommended skill in the CLI. Tell the user: \"Studio's off per your preference. If you change your mind, edit `brand\u002Fcmo-preferences.md` or just say 'open studio'.\"\n\n---\n\n## Anti-Patterns\n\n| Anti-pattern | Instead | Why |\n|---|---|---|\n| Asking more than 3 questions in the wizard | Stop at 3 — hand off to \u002Fcmo for the rest | More questions = abandonment. \u002Fcmo's research agents fill the rest in 5 minutes via real research. |\n| Asking for a URL before letting the user pick a setup mode | Always ask Step 1a (setup mode) first, then branch to Step 1b (URL) or Step 1c (sentence) | URL is just one of three paths. Pre-launch \u002F open-source \u002F personal-brand users don't have a URL yet, and the local conversational path bypasses the scrape entirely. Forcing a URL up front blocks them. |\n| Validating the URL inside the wizard (regex, http vs https, \"is this real?\") | Pass the raw string straight to `mktg init --from \u003Curl>` and let the CLI handle malformed inputs | The CLI already returns structured errors for bad URLs. Re-validating in the wizard duplicates logic, drifts from the CLI, and frustrates users who paste valid-but-unusual URLs. |\n| Silently routing to brand-voice \u002F audience-research before recording preferences | Always record `cmo-preferences.md` FIRST | Without it, every future `\u002Fcmo` activation re-runs the wizard. The preferences file is the contract that prevents that. |\n| Skipping the wizard if voice-profile.md exists but cmo-preferences.md doesn't | Run the wizard regardless of other brand files (use the migration path in step 2) | `cmo-preferences.md` is the persistent contract — separate from brand content. A user who upgraded from pre-mktg-setup needs to record their posture explicitly. |\n| Treating \"Skip distribution\" as missing data | Record the skip explicitly as `selected: none` and `default_adapter: file` | A deliberate skip is signal. The user told us not to wire anything yet — respect that. |\n| Spawning research agents BEFORE writing cmo-preferences.md | Always write the file first | If the user kills the conversation mid-research, we lose the preferences. The file write is the savepoint. |\n| Letting the user re-run the wizard accidentally | After writing the file, \u002Fcmo on the next activation will see it and skip the wizard | This is the whole point of the persistent contract. \u002Fcmo only re-routes here when the file is missing. |\n\n---\n\n## Iteration \u002F Re-Running\n\nThe user can change their preferences three ways:\n\n1. **Edit `brand\u002Fcmo-preferences.md` directly** — it's just markdown.\n2. **Ask Claude**: \"I want to change my marketing posture\" — `\u002Fcmo` will re-route here, overwriting the file.\n3. **Future**: `mktg setup --force` (CLI flag, not yet implemented at v0.5.0; tracked for a future release).\n\n---\n\n## Dependencies\n\n- Reads: `mktg status --json`, optionally URL via `mktg init --from \u003Curl>`.\n- Writes: `brand\u002Fcmo-preferences.md` (new). Optionally seeds `brand\u002Fvoice-profile.md` if the user provided a sentence in Step 1.\n- Hands off to: `\u002Fcmo` foundation flow (which spawns the 3 research agents and chains `\u002Flandscape-scan` → `\u002Fpositioning-angles` → `mktg studio`).\n",{"name":5,"description":60,"allowed-tools":61},"First-run conversational setup wizard for marketing-cli. Use when \u002Fcmo 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\", \"I just installed marketing-cli\", \"onboard me\", \"first time\", \"initial setup\". Asks 3 sharp questions (identity, posture, distribution preferences), records the answers to brand\u002Fcmo-preferences.md, then hands off to \u002Fcmo's foundation flow which spawns 3 research agents in parallel. The user never has to type \u002Fmktg-setup directly — \u002Fcmo auto-routes here on first run.\n",[62,63,64,65],"Bash(mktg *)","Bash(mkdir *)","Bash(test *)","Bash(cat *)","main","65a0c0d1e5a6f4ac9fb5281a72c91cbf7e9257aa","skills\u002Fmktg-setup",5,"https:\u002F\u002Fgithub.com\u002FMoizIbnYousaf\u002Fmarketing-cli","https:\u002F\u002Fwww.marketing-cli.com\u002F","https:\u002F\u002Fgithub.com\u002FMoizIbnYousaf","https:\u002F\u002Fmoiz.ai","AI Engineer\r\n","2026-10-20 15:05:36",{"source":8,"skillName":5,"commands":77,"prompt":87,"zipAvailable":88},[78,81,84],{"tool":79,"command":80},"npx","npx skills add MoizIbnYousaf\u002Fmarketing-cli --skill mktg-setup",{"tool":82,"command":83},"bunx","bunx skills add MoizIbnYousaf\u002Fmarketing-cli --skill mktg-setup",{"tool":85,"command":86},"pnpm","pnpm dlx skills add MoizIbnYousaf\u002Fmarketing-cli --skill mktg-setup","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FMoizIbnYousaf\u002Fmarketing-cli\u002Fblob\u002Fmain\u002Fskills\u002Fmktg-setup\u002FSKILL.md",true,[],[91,110,136,165,192,216],{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":97,"publishedAt":55},"01M6DKQDNVS30J8TB3YYM13PJ2","cmo-studio-integration","When mktg-studio is running on this machine, \u002Fcmo proactively narrates work into the dashboard via Bash + curl against the localhost HTTP API. Detect via \u002Fapi\u002Fhealth, then log every meaningful action — the user sees what \u002Fcmo is doing in real time.","https:\u002F\u002Fgithub.com\u002FMoizIbnYousaf\u002Fmarketing-cli\u002Fblob\u002Fmain\u002Fstudio\u002Fskills\u002Fcmo-studio-integration\u002FSKILL.md",[],[98,99,100,101,102,103,104,105,48,106,107,108,109,39],"integration","cmo","cmo studio integration","real time","dashboard","http","api","health","work","curl","user","log",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":122,"publishedAt":55},"01M6DKQ8KH8EZ27YY7PEDSZGMT","voice-extraction","Reverse-engineer any person's writing voice from their content. Paste in posts, articles, tweets, or essays and this skill launches 10 parallel Sonnet subagents to analyze every dimension of the voice, then synthesizes into a voice file. Use when someone says 'match this voice,' 'analyze this writing,' 'extract their voice,' 'make me sound like this,' 'study this person's writing,' or pastes in content they want to learn from.","https:\u002F\u002Fgithub.com\u002FMoizIbnYousaf\u002Fmarketing-cli\u002Fblob\u002Fmain\u002Fskills\u002Fvoice-extraction\u002FSKILL.md",[116,119],{"categoryNo":117,"categoryName":118,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":120,"categoryName":121,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000036","内容创作者",[123,124,125,126,127,128,129,130,37,131,132,133,134,135,40],"extraction","voice","voice extraction","writing","learn","content","file","analyze","extract","subagents","use","engineer","study",{"skillNo":137,"name":138,"nameZh":6,"description":139,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":140,"categories":141,"keywords":147,"publishedAt":55},"01M6DKPZAQ4NTERXENEFKFACZZ","visual-style","Build a persistent visual brand identity for image generation. Defines how the brand looks visually — aesthetic, lighting, composition, mood — and writes it to brand\u002Fcreative-kit.md so \u002Fimage-gen and other creative skills produce consistent on-brand visuals. Three modes: Extract (from website\u002FURL), Build (interview), Reference (mood board\u002Fexamples). Use when starting any project that needs images, when the user says \"visual style\", \"brand aesthetic\", \"image style\", \"visual identity\", \"how should our images look\", \"build visual brand\", \"define our look\", or when \u002Fimage-gen outputs feel generic because no visual style exists yet.","https:\u002F\u002Fgithub.com\u002FMoizIbnYousaf\u002Fmarketing-cli\u002Fblob\u002Fmain\u002Fskills\u002Fvisual-style\u002FSKILL.md",[142,143,146],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":144,"categoryName":145,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},[148,149,150,151,54,152,153,154,155,156,45,157,133,158,159,160,161,162,163,164],"visual","style","visual style","image","visuals","produce","website","Composition","how","interview","images","aesthetic","three","lighting","positioning","project","define",{"skillNo":166,"name":167,"nameZh":6,"description":168,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":169,"categories":170,"keywords":176,"publishedAt":55},"01M6DKPR2K3YJ1MAJG8XT815VP","video-content","Three-tier video pipeline: ffmpeg Quick (5s, instant) → ffmpeg Enhanced with Ken Burns (15s, polished) → Remotion Animated (60-90s, production-grade). Takes static slides from Paper MCP or any PNGs and assembles them into platform-ready video. Make sure to use this skill whenever the user has slides, images, or PNGs and wants to turn them into video — even if they just say 'make a video from these', 'animate my slides', 'I have images and need a TikTok', or 'stitch these together'. Also use when they mention ffmpeg video assembly, Remotion-animated slide assembly, Ken Burns effects, or any slides-to-video pipeline. Owns the slides→MP4 assembly pipeline; for writing, debugging, or running `remotion render` on Remotion code itself, see \u002Fremotion-best-practices; for screen-recorded product demos, see \u002Fmarketing-demo. Works with any PNG source — Paper exports, Canva, screenshots, anything.","https:\u002F\u002Fgithub.com\u002FMoizIbnYousaf\u002Fmarketing-cli\u002Fblob\u002Fmain\u002Fskills\u002Fvideo-content\u002FSKILL.md",[171,172,173,174,175],{"categoryNo":144,"categoryName":145,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":117,"categoryName":118,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":32,"categoryName":33,"taxonomyType":29,"taxonomyTypeDesc":30},{"categoryNo":120,"categoryName":121,"taxonomyType":29,"taxonomyTypeDesc":30},[128,177,178,179,126,180,181,182,183,184,185,48,47,186,187,188,158,189,190,191],"Video","video content","MCP","status","debugging","code","product","pipeline","Remotion","instant","assemble","ready","stitch","tiktok","screen",{"skillNo":193,"name":194,"nameZh":6,"description":195,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":196,"categories":197,"keywords":203,"publishedAt":55},"01M6DKPKDPTV6JFSW4SK3CKQCH","typefully","Create, schedule, and manage social media posts via Typefully. ALWAYS use this skill when asked to draft, schedule, post, or check tweets, posts, threads, or social media content for Twitter\u002FX, LinkedIn, Threads, Bluesky, or Mastodon.","https:\u002F\u002Fgithub.com\u002FMoizIbnYousaf\u002Fmarketing-cli\u002Fblob\u002Fmain\u002Fskills\u002Ftypefully\u002FSKILL.md",[198,199,200,201,202],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":117,"categoryName":118,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},{"categoryNo":32,"categoryName":33,"taxonomyType":29,"taxonomyTypeDesc":30},[194,204,50,205,48,47,124,45,206,207,208,209,210,133,211,212,213,214,38,215],"create","Media","schedule","twitter","linkedin","social media","check","manage","bluesky","social","draft","scripts",{"skillNo":217,"name":218,"nameZh":6,"description":219,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":220,"categories":221,"keywords":226,"publishedAt":55},"01M6DKP7X0YHAK9QZ1ZRKFQ596","tiktok-slideshow","Orchestrator skill that chains \u002Fslideshow-script → \u002Fpaper-marketing → \u002Fvideo-content for end-to-end TikTok slideshow production. Each phase is an independent Lego block — this orchestrator is just one recipe that combines them. Produces 5 publishable TikTok videos from a single positioning angle. Triggers on \"TikTok slideshow\", \"TikTok video\", \"make TikTok\", \"slideshow video\", \"TikTok content\".","https:\u002F\u002Fgithub.com\u002FMoizIbnYousaf\u002Fmarketing-cli\u002Fblob\u002Fmain\u002Fskills\u002Ftiktok-slideshow\u002FSKILL.md",[222,223,224,225],{"categoryNo":144,"categoryName":145,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":117,"categoryName":118,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":32,"categoryName":33,"taxonomyType":29,"taxonomyTypeDesc":30},[190,227,180,128,228,177,185,48,47,229,230,231,162,232,233,234,235],"tiktok slideshow","Production","just","orchestrator","bun","end","triggers","ffmpeg","paper"]