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.
- package/.claude-plugin/plugin.json +10 -0
- package/LICENSE +21 -0
- package/README.md +419 -0
- package/agents/ttm-producer.md +53 -0
- package/bin/lib/campaign.cjs +553 -0
- package/bin/lib/commit.cjs +105 -0
- package/bin/lib/core.cjs +172 -0
- package/bin/lib/deviation.cjs +149 -0
- package/bin/lib/drift-log.cjs +219 -0
- package/bin/lib/health.cjs +438 -0
- package/bin/lib/slug.cjs +59 -0
- package/bin/lib/state.cjs +96 -0
- package/bin/ttm-tools.cjs +157 -0
- package/gates/base-gates.md +266 -0
- package/gates/discipline/.gitkeep +0 -0
- package/gates/gate-evaluation.md +341 -0
- package/gates/meta-gates.md +19 -0
- package/install.js +307 -0
- package/package.json +53 -0
- package/playbooks/.gitkeep +0 -0
- package/playbooks/aeo.md +223 -0
- package/playbooks/affiliate.md +272 -0
- package/playbooks/base.md +110 -0
- package/playbooks/email.md +306 -0
- package/playbooks/events.md +320 -0
- package/playbooks/linkedin.md +263 -0
- package/playbooks/paid-ads.md +318 -0
- package/playbooks/pr-media.md +296 -0
- package/playbooks/seo.md +284 -0
- package/playbooks/social.md +305 -0
- package/playbooks/youtube.md +325 -0
- package/references/context-loading.md +107 -0
- package/references/learnings-extraction.md +94 -0
- package/references/measurement-template.md +48 -0
- package/references/meta-gate-evaluation.md +169 -0
- package/references/positioning-check-report.md +197 -0
- package/references/review-checklist.md +78 -0
- package/references/ship-checklist-items.md +94 -0
- package/settings.json +4 -0
- package/skills/ttm-aeo-check/SKILL.md +20 -0
- package/skills/ttm-affiliate-kit/SKILL.md +19 -0
- package/skills/ttm-archive/SKILL.md +13 -0
- package/skills/ttm-brand-refresh/SKILL.md +19 -0
- package/skills/ttm-brief/SKILL.md +14 -0
- package/skills/ttm-competitor-scan/SKILL.md +19 -0
- package/skills/ttm-email-preflight/SKILL.md +19 -0
- package/skills/ttm-fix/SKILL.md +13 -0
- package/skills/ttm-health/SKILL.md +12 -0
- package/skills/ttm-icp-refresh/SKILL.md +19 -0
- package/skills/ttm-init/SKILL.md +12 -0
- package/skills/ttm-keyword-map/SKILL.md +19 -0
- package/skills/ttm-learn/SKILL.md +14 -0
- package/skills/ttm-measure/SKILL.md +14 -0
- package/skills/ttm-new-campaign/SKILL.md +13 -0
- package/skills/ttm-next/SKILL.md +12 -0
- package/skills/ttm-positioning-check/SKILL.md +19 -0
- package/skills/ttm-positioning-shift/SKILL.md +19 -0
- package/skills/ttm-produce/SKILL.md +14 -0
- package/skills/ttm-repurpose/SKILL.md +20 -0
- package/skills/ttm-research/SKILL.md +13 -0
- package/skills/ttm-resume/SKILL.md +13 -0
- package/skills/ttm-review/SKILL.md +13 -0
- package/skills/ttm-seo-audit/SKILL.md +20 -0
- package/skills/ttm-ship/SKILL.md +13 -0
- package/skills/ttm-state/SKILL.md +13 -0
- package/skills/ttm-verify/SKILL.md +14 -0
- package/templates/agents-md.md +65 -0
- package/templates/campaign-brief.md +74 -0
- package/templates/campaign-research.md +39 -0
- package/templates/campaign-state.md +40 -0
- package/templates/claude-md.md +65 -0
- package/templates/deviation-log.md +12 -0
- package/templates/drift-log.md +17 -0
- package/templates/fix-brief.md +59 -0
- package/templates/fix-log.md +22 -0
- package/templates/measurement-report.md +75 -0
- package/templates/migration-plan.md +24 -0
- package/templates/production-manifest.json +20 -0
- package/templates/reference-files/brand.md +45 -0
- package/templates/reference-files/calendar.md +30 -0
- package/templates/reference-files/channels.md +40 -0
- package/templates/reference-files/competitors.md +40 -0
- package/templates/reference-files/icp.md +50 -0
- package/templates/reference-files/learnings.md +40 -0
- package/templates/reference-files/metrics.md +42 -0
- package/templates/reference-files/positioning.md +38 -0
- package/templates/reference-files/state.md +27 -0
- package/templates/verification-report.md +59 -0
- package/workflows/discipline/.gitkeep +0 -0
- package/workflows/discipline/aeo-check.md +180 -0
- package/workflows/discipline/affiliate-kit.md +147 -0
- package/workflows/discipline/email-preflight.md +150 -0
- package/workflows/discipline/keyword-map.md +125 -0
- package/workflows/discipline/repurpose.md +329 -0
- package/workflows/discipline/seo-audit.md +169 -0
- package/workflows/lifecycle/.gitkeep +0 -0
- package/workflows/lifecycle/brief-positioning-check.md +90 -0
- package/workflows/lifecycle/brief.md +355 -0
- package/workflows/lifecycle/fix.md +495 -0
- package/workflows/lifecycle/learn.md +405 -0
- package/workflows/lifecycle/measure.md +379 -0
- package/workflows/lifecycle/produce.md +383 -0
- package/workflows/lifecycle/research.md +264 -0
- package/workflows/lifecycle/review.md +432 -0
- package/workflows/lifecycle/ship.md +521 -0
- package/workflows/lifecycle/verify.md +507 -0
- package/workflows/reference-mgmt/.gitkeep +0 -0
- package/workflows/reference-mgmt/brand-refresh.md +193 -0
- package/workflows/reference-mgmt/competitor-scan.md +228 -0
- package/workflows/reference-mgmt/icp-refresh.md +200 -0
- package/workflows/reference-mgmt/positioning-check.md +339 -0
- package/workflows/reference-mgmt/positioning-shift.md +368 -0
- package/workflows/setup/.gitkeep +0 -0
- package/workflows/setup/init-questions.md +225 -0
- package/workflows/setup/init-validation.md +155 -0
- package/workflows/setup/init.md +449 -0
- package/workflows/setup/new-campaign.md +134 -0
- package/workflows/utility/.gitkeep +0 -0
- package/workflows/utility/archive.md +334 -0
- package/workflows/utility/health.md +166 -0
- package/workflows/utility/next.md +187 -0
- package/workflows/utility/resume.md +249 -0
- 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
|