taketomarket 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/.claude-plugin/plugin.json +10 -0
  2. package/LICENSE +21 -0
  3. package/README.md +419 -0
  4. package/agents/ttm-producer.md +53 -0
  5. package/bin/lib/campaign.cjs +553 -0
  6. package/bin/lib/commit.cjs +105 -0
  7. package/bin/lib/core.cjs +172 -0
  8. package/bin/lib/deviation.cjs +149 -0
  9. package/bin/lib/drift-log.cjs +219 -0
  10. package/bin/lib/health.cjs +438 -0
  11. package/bin/lib/slug.cjs +59 -0
  12. package/bin/lib/state.cjs +96 -0
  13. package/bin/ttm-tools.cjs +157 -0
  14. package/gates/base-gates.md +266 -0
  15. package/gates/discipline/.gitkeep +0 -0
  16. package/gates/gate-evaluation.md +341 -0
  17. package/gates/meta-gates.md +19 -0
  18. package/install.js +307 -0
  19. package/package.json +53 -0
  20. package/playbooks/.gitkeep +0 -0
  21. package/playbooks/aeo.md +223 -0
  22. package/playbooks/affiliate.md +272 -0
  23. package/playbooks/base.md +110 -0
  24. package/playbooks/email.md +306 -0
  25. package/playbooks/events.md +320 -0
  26. package/playbooks/linkedin.md +263 -0
  27. package/playbooks/paid-ads.md +318 -0
  28. package/playbooks/pr-media.md +296 -0
  29. package/playbooks/seo.md +284 -0
  30. package/playbooks/social.md +305 -0
  31. package/playbooks/youtube.md +325 -0
  32. package/references/context-loading.md +107 -0
  33. package/references/learnings-extraction.md +94 -0
  34. package/references/measurement-template.md +48 -0
  35. package/references/meta-gate-evaluation.md +169 -0
  36. package/references/positioning-check-report.md +197 -0
  37. package/references/review-checklist.md +78 -0
  38. package/references/ship-checklist-items.md +94 -0
  39. package/settings.json +4 -0
  40. package/skills/ttm-aeo-check/SKILL.md +20 -0
  41. package/skills/ttm-affiliate-kit/SKILL.md +19 -0
  42. package/skills/ttm-archive/SKILL.md +13 -0
  43. package/skills/ttm-brand-refresh/SKILL.md +19 -0
  44. package/skills/ttm-brief/SKILL.md +14 -0
  45. package/skills/ttm-competitor-scan/SKILL.md +19 -0
  46. package/skills/ttm-email-preflight/SKILL.md +19 -0
  47. package/skills/ttm-fix/SKILL.md +13 -0
  48. package/skills/ttm-health/SKILL.md +12 -0
  49. package/skills/ttm-icp-refresh/SKILL.md +19 -0
  50. package/skills/ttm-init/SKILL.md +12 -0
  51. package/skills/ttm-keyword-map/SKILL.md +19 -0
  52. package/skills/ttm-learn/SKILL.md +14 -0
  53. package/skills/ttm-measure/SKILL.md +14 -0
  54. package/skills/ttm-new-campaign/SKILL.md +13 -0
  55. package/skills/ttm-next/SKILL.md +12 -0
  56. package/skills/ttm-positioning-check/SKILL.md +19 -0
  57. package/skills/ttm-positioning-shift/SKILL.md +19 -0
  58. package/skills/ttm-produce/SKILL.md +14 -0
  59. package/skills/ttm-repurpose/SKILL.md +20 -0
  60. package/skills/ttm-research/SKILL.md +13 -0
  61. package/skills/ttm-resume/SKILL.md +13 -0
  62. package/skills/ttm-review/SKILL.md +13 -0
  63. package/skills/ttm-seo-audit/SKILL.md +20 -0
  64. package/skills/ttm-ship/SKILL.md +13 -0
  65. package/skills/ttm-state/SKILL.md +13 -0
  66. package/skills/ttm-verify/SKILL.md +14 -0
  67. package/templates/agents-md.md +65 -0
  68. package/templates/campaign-brief.md +74 -0
  69. package/templates/campaign-research.md +39 -0
  70. package/templates/campaign-state.md +40 -0
  71. package/templates/claude-md.md +65 -0
  72. package/templates/deviation-log.md +12 -0
  73. package/templates/drift-log.md +17 -0
  74. package/templates/fix-brief.md +59 -0
  75. package/templates/fix-log.md +22 -0
  76. package/templates/measurement-report.md +75 -0
  77. package/templates/migration-plan.md +24 -0
  78. package/templates/production-manifest.json +20 -0
  79. package/templates/reference-files/brand.md +45 -0
  80. package/templates/reference-files/calendar.md +30 -0
  81. package/templates/reference-files/channels.md +40 -0
  82. package/templates/reference-files/competitors.md +40 -0
  83. package/templates/reference-files/icp.md +50 -0
  84. package/templates/reference-files/learnings.md +40 -0
  85. package/templates/reference-files/metrics.md +42 -0
  86. package/templates/reference-files/positioning.md +38 -0
  87. package/templates/reference-files/state.md +27 -0
  88. package/templates/verification-report.md +59 -0
  89. package/workflows/discipline/.gitkeep +0 -0
  90. package/workflows/discipline/aeo-check.md +180 -0
  91. package/workflows/discipline/affiliate-kit.md +147 -0
  92. package/workflows/discipline/email-preflight.md +150 -0
  93. package/workflows/discipline/keyword-map.md +125 -0
  94. package/workflows/discipline/repurpose.md +329 -0
  95. package/workflows/discipline/seo-audit.md +169 -0
  96. package/workflows/lifecycle/.gitkeep +0 -0
  97. package/workflows/lifecycle/brief-positioning-check.md +90 -0
  98. package/workflows/lifecycle/brief.md +355 -0
  99. package/workflows/lifecycle/fix.md +495 -0
  100. package/workflows/lifecycle/learn.md +405 -0
  101. package/workflows/lifecycle/measure.md +379 -0
  102. package/workflows/lifecycle/produce.md +383 -0
  103. package/workflows/lifecycle/research.md +264 -0
  104. package/workflows/lifecycle/review.md +432 -0
  105. package/workflows/lifecycle/ship.md +521 -0
  106. package/workflows/lifecycle/verify.md +507 -0
  107. package/workflows/reference-mgmt/.gitkeep +0 -0
  108. package/workflows/reference-mgmt/brand-refresh.md +193 -0
  109. package/workflows/reference-mgmt/competitor-scan.md +228 -0
  110. package/workflows/reference-mgmt/icp-refresh.md +200 -0
  111. package/workflows/reference-mgmt/positioning-check.md +339 -0
  112. package/workflows/reference-mgmt/positioning-shift.md +368 -0
  113. package/workflows/setup/.gitkeep +0 -0
  114. package/workflows/setup/init-questions.md +225 -0
  115. package/workflows/setup/init-validation.md +155 -0
  116. package/workflows/setup/init.md +449 -0
  117. package/workflows/setup/new-campaign.md +134 -0
  118. package/workflows/utility/.gitkeep +0 -0
  119. package/workflows/utility/archive.md +334 -0
  120. package/workflows/utility/health.md +166 -0
  121. package/workflows/utility/next.md +187 -0
  122. package/workflows/utility/resume.md +249 -0
  123. package/workflows/utility/state.md +207 -0
@@ -0,0 +1,449 @@
1
+ <purpose>
2
+ Interview-driven onboarding that generates all .marketing/ reference files
3
+ from structured questioning. Use when setting up takeToMarket for a new project.
4
+ Orchestrates a 6-section interview with specificity validation, then generates
5
+ 9 reference files plus CLAUDE.md and AGENTS.md instruction files.
6
+ </purpose>
7
+
8
+ <required_reading>
9
+ @${CLAUDE_PLUGIN_ROOT}/workflows/setup/init-questions.md
10
+ @${CLAUDE_PLUGIN_ROOT}/workflows/setup/init-validation.md
11
+ </required_reading>
12
+
13
+ <process>
14
+
15
+ ## Text-Mode Detection
16
+
17
+ **Text mode (`--text` flag):** Set `TEXT_MODE=true` if `--text` is present in `$ARGUMENTS`
18
+ or if the runtime is not Claude Code. When TEXT_MODE is active, replace every
19
+ `AskUserQuestion` call with a plain-text numbered list and ask the user to type
20
+ their choice number.
21
+
22
+ Detection:
23
+ ```bash
24
+ if echo "$ARGUMENTS" | grep -q -- '--text'; then TEXT_MODE=true; fi
25
+ ```
26
+
27
+ If `AskUserQuestion` tool is not available in the current runtime, set `TEXT_MODE=true`.
28
+
29
+ When TEXT_MODE is active, replace each AskUserQuestion with a plain-text numbered list:
30
+ ```
31
+ [HEADER]
32
+ [QUESTION]
33
+ 1. [OPTION_1_LABEL] -- [OPTION_1_DESCRIPTION]
34
+ 2. [OPTION_2_LABEL] -- [OPTION_2_DESCRIPTION]
35
+ ...
36
+ Type the number of your choice:
37
+ ```
38
+
39
+ For multiSelect questions, instruct the user: "Type the numbers of your choices separated by commas (e.g., 1,3,5):"
40
+
41
+ ---
42
+
43
+ ## Step 1: Pre-flight
44
+
45
+ ```
46
+ takeToMarket > INITIALIZING
47
+ ```
48
+
49
+ Run init status check:
50
+ ```bash
51
+ node ${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs init --raw
52
+ ```
53
+
54
+ **If result is "initialized":**
55
+
56
+ Use AskUserQuestion:
57
+ - header: "Existing Setup"
58
+ - question: ".marketing/ already contains reference files. What would you like to do?"
59
+ - options:
60
+ - label: "Start fresh"
61
+ description: "Delete existing files and re-run the full interview"
62
+ - label: "Update specific files"
63
+ description: "Choose which reference files to regenerate"
64
+ - label: "Cancel"
65
+ description: "Exit without changes"
66
+
67
+ **If "Start fresh":** Delete .marketing/ contents (except CAMPAIGNS/ and PLAYBOOKS/) and continue to Step 2.
68
+ **If "Update specific files":** Present file picker using AskUserQuestion with multiSelect: true listing all 9 reference files. Run only the interview sections that map to selected files (see Question-to-Template Mapping in init-questions.md). Skip unselected sections and jump to Step 9 for generation.
69
+ **If "Cancel":** Exit with message "No changes made."
70
+
71
+ **If result is "not initialized":**
72
+ ```bash
73
+ mkdir -p .marketing/CAMPAIGNS
74
+ mkdir -p .marketing/PLAYBOOKS
75
+ ```
76
+ Continue to Step 2.
77
+
78
+ ---
79
+
80
+ ## Step 2: Interview -- Section 1: Product and Positioning
81
+
82
+ ```
83
+ takeToMarket > SECTION 1: PRODUCT AND POSITIONING
84
+ ```
85
+
86
+ This section collects data for **POSITIONING.md**.
87
+
88
+ Ask the **Product Category** structured question from init-questions.md Section 1 via AskUserQuestion.
89
+ Then ask all 5 freeform questions from init-questions.md Section 1 in sequence.
90
+
91
+ **Specificity validation for Section 1:**
92
+
93
+ After collecting all answers, validate:
94
+
95
+ - **Differentiator check:** FAIL if differentiator is a single adjective or contains only banned phrases. FAIL if it does not describe a specific mechanism, capability, or process.
96
+ - PASS: "Auto-generates sprint plans from Slack conversations"
97
+ - FAIL: "The most innovative project management tool"
98
+
99
+ - **Target audience check:** FAIL if audience specifies fewer than 2 of: role, company size, industry, geography.
100
+ - PASS: "VP Marketing at B2B SaaS companies with 50-500 employees"
101
+ - FAIL: "Modern teams"
102
+
103
+ - **Proof points check:** FAIL if fewer than 2 proof points. FAIL if any lacks a verifiable source.
104
+ - PASS: "42% reduction in churn after implementing X (Source: Q3 2025 internal analysis)"
105
+ - FAIL: "Customers love our product"
106
+
107
+ - **Must-not-say check:** FAIL if fewer than 2 banned terms. FAIL if any lacks reasoning.
108
+ - PASS: "'Disruptive' -- overused in our category, signals no real differentiation"
109
+ - FAIL: Just a list of words with no reasoning
110
+
111
+ **Global banned phrases** -- check all freeform answers against the Banned Phrases table in init-validation.md. Reject any answer containing superlatives, buzzwords, impact words, or vague qualifiers without a specific mechanism.
112
+
113
+ **On validation failure**, re-prompt:
114
+ ```
115
+ Your [FIELD_NAME] is too vague. Here's what specific looks like:
116
+ - Vague: '[FAIL_EXAMPLE]'
117
+ - Specific: '[PASS_EXAMPLE]'
118
+ Please try again with more specificity.
119
+ ```
120
+
121
+ Maximum 2 re-prompts per field. After 2 retries, accept with flag:
122
+ `<!-- SPECIFICITY_WARNING: [field] accepted after 2 retries -->`
123
+
124
+ Store all collected answers for file generation in Step 9.
125
+
126
+ ---
127
+
128
+ ## Step 3: Interview -- Section 2: Brand and Voice
129
+
130
+ ```
131
+ takeToMarket > SECTION 2: BRAND AND VOICE
132
+ ```
133
+
134
+ This section collects data for **BRAND.md**.
135
+
136
+ Ask the **Voice Archetype** and **Formality Level** structured questions from init-questions.md Section 2 via AskUserQuestion.
137
+ Then ask all 4 freeform questions from init-questions.md Section 2 in sequence.
138
+
139
+ **Specificity validation for Section 2:**
140
+
141
+ - **Voice archetype check:** FAIL if description is under 20 words. FAIL if no concrete personality traits.
142
+ - PASS: "Confident but not arrogant. We explain complex concepts simply. We use data to back claims. We never talk down to the reader."
143
+ - FAIL: "Professional and friendly"
144
+
145
+ - **Examples check:** FAIL if on-brand example is under 10 words. FAIL if off-brand example is missing or identical style.
146
+
147
+ - **Banned words check:** FAIL if zero banned words listed. WARN if banned words lack reasoning.
148
+
149
+ On WARN: "Your banned words could be more specific, but I'll accept it for now. You can update this later with `/ttm-brand-refresh`."
150
+
151
+ ---
152
+
153
+ ## Step 4: Interview -- Section 3: ICP and Audience
154
+
155
+ ```
156
+ takeToMarket > SECTION 3: ICP AND AUDIENCE
157
+ ```
158
+
159
+ This section collects data for **ICP.md**.
160
+
161
+ No structured questions for this section. Ask all 6 freeform questions from init-questions.md Section 3 in sequence.
162
+
163
+ **Specificity validation for Section 3:**
164
+
165
+ - **Segment check:** FAIL if description specifies fewer than 2 of: role, company size, industry, geography.
166
+
167
+ - **Pain points check:** FAIL if fewer than 2 pain points. FAIL if pain points are generic.
168
+ - PASS: "Spends 4+ hours weekly manually reconciling campaign data across 5 analytics platforms"
169
+ - FAIL: "Struggles with marketing"
170
+
171
+ - **JTBD check:** FAIL if job description is under 10 words. FAIL if it uses banned phrases.
172
+
173
+ - **Customer language check:** WARN (not FAIL) if fewer than 3 phrases provided -- this data is harder to have on hand.
174
+
175
+ On WARN: "Your customer language could be more detailed, but I'll accept it for now. You can update this later with `/ttm-icp-refresh`."
176
+
177
+ ---
178
+
179
+ ## Step 5: Interview -- Section 4: Channels
180
+
181
+ ```
182
+ takeToMarket > SECTION 4: CHANNELS
183
+ ```
184
+
185
+ This section collects data for **CHANNELS.md**.
186
+
187
+ Ask the **Primary Channel** structured question from init-questions.md Section 4 via AskUserQuestion.
188
+ Then ask all 4 freeform questions from init-questions.md Section 4 in sequence.
189
+
190
+ **Specificity validation for Section 4:**
191
+
192
+ - **Channel list check:** FAIL if zero active channels listed. WARN if no baseline metrics provided for active channels.
193
+
194
+ - **Budget check:** WARN if no budget split provided (acceptable for early-stage companies).
195
+
196
+ On WARN: "Your channel baselines could be more detailed, but I'll accept it for now. You can update this later with `/ttm-health`."
197
+
198
+ ---
199
+
200
+ ## Step 6: Interview -- Section 5: Competitors
201
+
202
+ ```
203
+ takeToMarket > SECTION 5: COMPETITORS
204
+ ```
205
+
206
+ This section collects data for **COMPETITORS.md**.
207
+
208
+ No structured questions for this section. Ask all 4 freeform questions from init-questions.md Section 5 in sequence.
209
+
210
+ **Specificity validation for Section 5:**
211
+
212
+ - **Competitor list check:** FAIL if zero competitors named. WARN if fewer than 2 competitors (acceptable for new categories). FAIL if entries lack positioning description.
213
+
214
+ - **Positioning map check:** WARN if no axes defined (can be refined later).
215
+
216
+ On WARN: "Your competitor analysis could be more detailed, but I'll accept it for now. You can update this later with `/ttm-competitor-scan`."
217
+
218
+ ---
219
+
220
+ ## Step 7: Interview -- Section 6: Metrics and Calendar
221
+
222
+ ```
223
+ takeToMarket > SECTION 6: METRICS AND CALENDAR
224
+ ```
225
+
226
+ This section collects data for **METRICS.md** and **CALENDAR.md**.
227
+
228
+ Ask the **Attribution Model** structured question from init-questions.md Section 6 via AskUserQuestion.
229
+ Then ask all 7 freeform questions from init-questions.md Section 6 in sequence.
230
+
231
+ **Specificity validation for Section 6:**
232
+
233
+ - **Primary metric check:** FAIL if metric is an output metric only (e.g., "blog posts published") without an outcome metric.
234
+ - PASS: "Qualified pipeline generated from content marketing -- target $500K/quarter"
235
+ - FAIL: "Number of blog posts published per month"
236
+
237
+ - **Secondary metrics check:** WARN if no secondary metrics provided.
238
+
239
+ - **Calendar check:** WARN if no quarterly theme provided. WARN if no cadence defined.
240
+
241
+ On WARN: "Your metrics/calendar data could be more detailed, but I'll accept it for now. You can update this later with `/ttm-health`."
242
+
243
+ ---
244
+
245
+ ## Step 8: Confirmation Gate
246
+
247
+ ```
248
+ takeToMarket > REVIEW
249
+ ```
250
+
251
+ Display a summary of what was collected:
252
+ - Product category and positioning summary (differentiator in one sentence)
253
+ - Voice archetype and formality level
254
+ - Primary ICP segment (role, company size, industry)
255
+ - Active channels and primary channel
256
+ - Top competitors named
257
+ - Primary outcome metric and target
258
+
259
+ Use AskUserQuestion:
260
+ - header: "Ready?"
261
+ - question: "Here's what I'll use to generate your reference files. Ready to proceed?"
262
+ - options:
263
+ - label: "Generate files"
264
+ description: "Create all .marketing/ reference files"
265
+ - label: "Revise a section"
266
+ description: "Go back and update specific answers"
267
+
268
+ **If "Revise a section":** Use AskUserQuestion with options listing sections 1-6. Re-run the selected section's interview questions and validation. Return to this confirmation gate.
269
+
270
+ **If "Generate files":** Continue to Step 9.
271
+
272
+ ---
273
+
274
+ ## Step 9: Generate Reference Files
275
+
276
+ ```
277
+ takeToMarket > GENERATING REFERENCE FILES
278
+ ```
279
+
280
+ For each reference file, follow this pattern:
281
+
282
+ 1. Read the template: `${CLAUDE_PLUGIN_ROOT}/templates/reference-files/{filename}.md`
283
+ 2. Generate the file content by filling ALL `[GENERATED BY /ttm-init]` placeholders with interview data
284
+ 3. **Critical structural requirements:**
285
+ - Preserve `<!-- _SUMMARY: ... -->` and `<!-- END_SUMMARY -->` comment markers exactly as they appear in the template
286
+ - Summary section must be under 200 words
287
+ - Preserve all table structures from the template
288
+ - For dates, use: `node ${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs timestamp date --raw`
289
+ 4. Write to `.marketing/{FILENAME}.md`
290
+
291
+ **Generate files in this order:**
292
+
293
+ ### 1. POSITIONING.md (from Section 1 data)
294
+ Read template: `${CLAUDE_PLUGIN_ROOT}/templates/reference-files/positioning.md`
295
+ Fill: Category, Target audience, Primary differentiator, Proof points, Must-not-say, Competitive frame, Positioning History date.
296
+ Write to: `.marketing/POSITIONING.md`
297
+
298
+ ### 2. BRAND.md (from Section 2 data)
299
+ Read template: `${CLAUDE_PLUGIN_ROOT}/templates/reference-files/brand.md`
300
+ Fill: Voice archetype, Voice attributes, Tone per context, Banned words with reasoning, Proof points, Good and bad examples.
301
+ Write to: `.marketing/BRAND.md`
302
+
303
+ ### 3. ICP.md (from Section 3 data)
304
+ Read template: `${CLAUDE_PLUGIN_ROOT}/templates/reference-files/icp.md`
305
+ Fill: Primary segment, Demographics, Psychographics, JTBD, Pain points with severity and frequency, Buying triggers, Anti-ICP, Customer language library.
306
+ Write to: `.marketing/ICP.md`
307
+
308
+ ### 4. CHANNELS.md (from Section 4 data)
309
+ Read template: `${CLAUDE_PLUGIN_ROOT}/templates/reference-files/channels.md`
310
+ Fill: Active channels with baselines, Primary channel, Dormant channels with reasons, Banned channels with reasons, Budget allocation, Channel-specific rules.
311
+ Write to: `.marketing/CHANNELS.md`
312
+
313
+ ### 5. COMPETITORS.md (from Section 5 data)
314
+ Read template: `${CLAUDE_PLUGIN_ROOT}/templates/reference-files/competitors.md`
315
+ Fill: Direct competitors (positioning, strength, weakness), Positioning map axes and positions, Share of voice baseline.
316
+ Write to: `.marketing/COMPETITORS.md`
317
+
318
+ ### 6. METRICS.md (from Section 6 data -- metrics portion)
319
+ Read template: `${CLAUDE_PLUGIN_ROOT}/templates/reference-files/metrics.md`
320
+ Fill: Primary outcome metric (metric/target/window/source), Secondary metrics, Leading indicators, Baselines, Attribution model.
321
+ Write to: `.marketing/METRICS.md`
322
+
323
+ ### 7. CALENDAR.md (from Section 6 data -- calendar portion)
324
+ Read template: `${CLAUDE_PLUGIN_ROOT}/templates/reference-files/calendar.md`
325
+ Fill: Quarterly themes, Launch calendar, Always-on cadence, Blackout dates.
326
+ Write to: `.marketing/CALENDAR.md`
327
+
328
+ ### 8. STATE.md (template copy with timestamp)
329
+ Read template: `${CLAUDE_PLUGIN_ROOT}/templates/reference-files/state.md`
330
+ **Special handling:** Copy template and update ONLY the `last_updated` frontmatter field:
331
+ ```bash
332
+ node ${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs timestamp date --raw
333
+ ```
334
+ Do NOT fill interview data into STATE.md -- it is initialized with default values.
335
+ Write to: `.marketing/STATE.md`
336
+
337
+ ### 9. LEARNINGS.md (template copy with zeroed counters)
338
+ Read template: `${CLAUDE_PLUGIN_ROOT}/templates/reference-files/learnings.md`
339
+ **Special handling:** Copy template verbatim. Set Summary fields to:
340
+ - Total lessons: 0
341
+ - Last lesson date: none
342
+ - Top pattern: none
343
+ Do NOT fill interview data -- learnings are populated during campaign Learn phases.
344
+ Write to: `.marketing/LEARNINGS.md`
345
+
346
+ ---
347
+
348
+ ## Step 10: Generate Instruction Files
349
+
350
+ ```
351
+ takeToMarket > GENERATING INSTRUCTION FILES
352
+ ```
353
+
354
+ Read `${CLAUDE_PLUGIN_ROOT}/templates/claude-md.md` and write to `CLAUDE.md` in the project root.
355
+ Read `${CLAUDE_PLUGIN_ROOT}/templates/agents-md.md` and write to `AGENTS.md` in the project root.
356
+
357
+ These are static copies -- do NOT customize with interview data. The positioning-as-invariant
358
+ enforcement rules are already baked into the templates. Runtime context loading handles
359
+ dynamic positioning data via POSITIONING.md.
360
+
361
+ ---
362
+
363
+ ## Step 11: Post-Init Validation
364
+
365
+ ```
366
+ takeToMarket > VALIDATING
367
+ ```
368
+
369
+ Run health check:
370
+ ```bash
371
+ node ${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs health
372
+ ```
373
+
374
+ Parse the JSON result. Verify all checks have status "pass".
375
+
376
+ If any check has status "fail" or "missing":
377
+ - Report which files failed
378
+ - Attempt to regenerate only the failed files by re-reading the template and re-writing
379
+ - Re-run health check
380
+
381
+ Once all checks pass, update state:
382
+ ```bash
383
+ node ${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs state update status initialized
384
+ ```
385
+
386
+ **Warning tracking:** If any interview section accumulated 3 or more SPECIFICITY_WARNING flags
387
+ during the interview, append to `.marketing/STATE.md` under a `## Follow-up Needed` heading:
388
+ - Section [N] ([name]): [count] specificity warnings -- recommend re-running with [relevant /ttm-* command]
389
+
390
+ Use these commands per section:
391
+ - Section 1 (Positioning): `/ttm-positioning-check`
392
+ - Section 2 (Brand): `/ttm-brand-refresh`
393
+ - Section 3 (ICP): `/ttm-icp-refresh`
394
+ - Section 4 (Channels): `/ttm-health`
395
+ - Section 5 (Competitors): `/ttm-competitor-scan`
396
+ - Section 6 (Metrics/Calendar): `/ttm-health`
397
+
398
+ ---
399
+
400
+ ## Step 12: Summary
401
+
402
+ ```
403
+ takeToMarket > INITIALIZED
404
+
405
+ Reference files created:
406
+ .marketing/POSITIONING.md
407
+ .marketing/BRAND.md
408
+ .marketing/ICP.md
409
+ .marketing/CHANNELS.md
410
+ .marketing/STATE.md
411
+ .marketing/METRICS.md
412
+ .marketing/COMPETITORS.md
413
+ .marketing/CALENDAR.md
414
+ .marketing/LEARNINGS.md
415
+
416
+ Instruction files created:
417
+ CLAUDE.md
418
+ AGENTS.md
419
+
420
+ All health checks passed. Your marketing operating system is ready.
421
+
422
+ Next step: Run /ttm-new-campaign to create your first campaign.
423
+ ```
424
+
425
+ </process>
426
+
427
+ <success_criteria>
428
+ - [ ] Pre-flight check completed (existing init detected or directories created)
429
+ - [ ] All 6 interview sections completed with specificity validation
430
+ - [ ] Confirmation gate passed
431
+ - [ ] 9 reference files generated in .marketing/ with _SUMMARY/END_SUMMARY preserved
432
+ - [ ] CLAUDE.md and AGENTS.md copied to project root
433
+ - [ ] Health check passes (all 11 checks: marketing_dir + campaigns_dir + 9 files)
434
+ - [ ] STATE.md status set to "initialized"
435
+ </success_criteria>
436
+
437
+ <output>
438
+ - `.marketing/POSITIONING.md`
439
+ - `.marketing/BRAND.md`
440
+ - `.marketing/ICP.md`
441
+ - `.marketing/CHANNELS.md`
442
+ - `.marketing/STATE.md`
443
+ - `.marketing/METRICS.md`
444
+ - `.marketing/COMPETITORS.md`
445
+ - `.marketing/CALENDAR.md`
446
+ - `.marketing/LEARNINGS.md`
447
+ - `CLAUDE.md`
448
+ - `AGENTS.md`
449
+ </output>
@@ -0,0 +1,134 @@
1
+ <purpose>
2
+ Campaign scaffolding workflow that creates a CAMPAIGNS/<slug>/ directory with
3
+ initialized STATE.md, empty RESEARCH.md, empty BRIEF.md, and ASSETS/ directory.
4
+ Use when starting a new marketing campaign after /ttm-init has been run.
5
+ </purpose>
6
+
7
+ <required_reading>
8
+ @${CLAUDE_PLUGIN_ROOT}/references/context-loading.md
9
+ </required_reading>
10
+
11
+ <process>
12
+
13
+ ## Step 1: Pre-flight Check
14
+
15
+ ```
16
+ takeToMarket > CREATING CAMPAIGN
17
+ ```
18
+
19
+ Run init status check:
20
+ ```bash
21
+ node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" init --raw
22
+ ```
23
+
24
+ **If result is "not initialized":**
25
+ Tell the user: "takeToMarket is not initialized yet. Run `/ttm-init` first to set up your marketing reference files."
26
+ Exit -- do not continue.
27
+
28
+ **If result is "initialized":**
29
+ Continue to Step 2.
30
+
31
+ ---
32
+
33
+ ## Step 2: Generate Slug
34
+
35
+ If `$ARGUMENTS` is empty or blank (after stripping any flags):
36
+ Ask the user: "What is the campaign name?"
37
+ Use the response as the campaign name input.
38
+
39
+ Generate the slug deterministically via CLI:
40
+ ```bash
41
+ CAMPAIGN_SLUG=$(node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" slug "$ARGUMENTS" --raw)
42
+ ```
43
+
44
+ Store the result as `CAMPAIGN_SLUG`. Store the original input as `CAMPAIGN_NAME`.
45
+
46
+ Display: `Campaign slug: ${CAMPAIGN_SLUG}`
47
+
48
+ **Important:** Never generate slugs via AI. Always use the `ttm-tools.cjs slug` command.
49
+
50
+ ---
51
+
52
+ ## Step 3: Check for Existing Campaign
53
+
54
+ ```bash
55
+ ls .marketing/CAMPAIGNS/${CAMPAIGN_SLUG}/ 2>/dev/null && echo "exists" || echo "new"
56
+ ```
57
+
58
+ **If "exists":**
59
+ Warn the user: "A campaign with slug `${CAMPAIGN_SLUG}` already exists. Would you like to overwrite it or pick a different name?"
60
+
61
+ - If user wants to overwrite: continue to Step 4 (existing files will be replaced).
62
+ - If user wants a different name: go back to Step 2 and ask for a new campaign name.
63
+
64
+ **If "new":**
65
+ Continue to Step 4.
66
+
67
+ ---
68
+
69
+ ## Step 4: Create Scaffold
70
+
71
+ Run the campaign init command:
72
+ ```bash
73
+ node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" campaign init "${CAMPAIGN_SLUG}" "${CAMPAIGN_NAME}"
74
+ ```
75
+
76
+ This creates:
77
+ - `CAMPAIGNS/<slug>/STATE.md` (phase: created)
78
+ - `CAMPAIGNS/<slug>/RESEARCH.md` (from template)
79
+ - `CAMPAIGNS/<slug>/BRIEF.md` (from template)
80
+ - `CAMPAIGNS/<slug>/ASSETS/` (empty directory)
81
+
82
+ Verify all 4 items exist:
83
+ ```bash
84
+ ls .marketing/CAMPAIGNS/${CAMPAIGN_SLUG}/STATE.md && \
85
+ ls .marketing/CAMPAIGNS/${CAMPAIGN_SLUG}/RESEARCH.md && \
86
+ ls .marketing/CAMPAIGNS/${CAMPAIGN_SLUG}/BRIEF.md && \
87
+ ls -d .marketing/CAMPAIGNS/${CAMPAIGN_SLUG}/ASSETS/ && \
88
+ echo "scaffold complete"
89
+ ```
90
+
91
+ If any item is missing, report the error and exit.
92
+
93
+ ---
94
+
95
+ ## Step 5: Update Global State
96
+
97
+ Set the current campaign in the global STATE.md:
98
+ ```bash
99
+ node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" state update current_campaign "${CAMPAIGN_SLUG}"
100
+ ```
101
+
102
+ ---
103
+
104
+ ## Step 6: Display Summary
105
+
106
+ ```
107
+ takeToMarket > CAMPAIGN CREATED: ${CAMPAIGN_SLUG}
108
+
109
+ .marketing/CAMPAIGNS/${CAMPAIGN_SLUG}/
110
+ STATE.md (phase: created)
111
+ RESEARCH.md (pending -- run /ttm-research)
112
+ BRIEF.md (pending -- run /ttm-brief)
113
+ ASSETS/ (empty -- populated by /ttm-produce)
114
+
115
+ Next: Run /ttm-research ${CAMPAIGN_SLUG}
116
+ ```
117
+
118
+ </process>
119
+
120
+ <success_criteria>
121
+ - [ ] init check passed (system is initialized)
122
+ - [ ] slug generated deterministically via ttm-tools.cjs (NOT AI-generated)
123
+ - [ ] existing campaign check performed
124
+ - [ ] CAMPAIGNS/<slug>/ directory created with STATE.md, RESEARCH.md, BRIEF.md, ASSETS/
125
+ - [ ] global STATE.md current_campaign updated
126
+ - [ ] user sees next-step guidance
127
+ </success_criteria>
128
+
129
+ <output>
130
+ - `.marketing/CAMPAIGNS/<slug>/STATE.md`
131
+ - `.marketing/CAMPAIGNS/<slug>/RESEARCH.md`
132
+ - `.marketing/CAMPAIGNS/<slug>/BRIEF.md`
133
+ - `.marketing/CAMPAIGNS/<slug>/ASSETS/` (empty directory)
134
+ </output>
File without changes