taketomarket 2.2.0 → 2.3.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 (180) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/.claude-plugin/plugin.json +2 -2
  3. package/README.md +34 -11
  4. package/bin/lib/campaign.cjs +12 -8
  5. package/bin/lib/codebase-scan.cjs +86 -0
  6. package/bin/lib/config.cjs +129 -0
  7. package/bin/lib/deploy.cjs +36 -0
  8. package/bin/lib/deviation.cjs +1 -1
  9. package/bin/lib/drift-log.cjs +4 -4
  10. package/bin/lib/health.cjs +32 -31
  11. package/bin/lib/install-detect.cjs +62 -0
  12. package/bin/lib/legacy-folder.cjs +100 -0
  13. package/bin/lib/playwright-check.cjs +26 -0
  14. package/bin/lib/site-location.cjs +22 -0
  15. package/bin/lib/state.cjs +3 -3
  16. package/bin/lib/svg-render.cjs +42 -0
  17. package/bin/ttm-tools.cjs +136 -4
  18. package/gates/base-gates.md +8 -8
  19. package/gates/gate-evaluation.md +8 -8
  20. package/install.js +37 -3
  21. package/package.json +10 -6
  22. package/playbooks/aeo.md +218 -114
  23. package/playbooks/affiliate.md +225 -160
  24. package/playbooks/email.md +236 -174
  25. package/playbooks/events.md +303 -213
  26. package/playbooks/landing-pages.md +305 -0
  27. package/playbooks/linkedin.md +264 -142
  28. package/playbooks/manifesto.md +322 -0
  29. package/playbooks/paid-ads.md +240 -189
  30. package/playbooks/positioning.md +340 -0
  31. package/playbooks/pr-media.md +308 -168
  32. package/playbooks/pseo.md +426 -0
  33. package/playbooks/seo.md +251 -158
  34. package/playbooks/social.md +253 -182
  35. package/playbooks/youtube.md +286 -181
  36. package/references/brand-color-theory.md +48 -0
  37. package/references/codex-image-gen-research.md +58 -0
  38. package/references/context-loading.md +6 -6
  39. package/references/humanizer-patterns.md +433 -0
  40. package/references/inline-education-blurbs.md +461 -0
  41. package/references/landing-page-anatomy.md +64 -0
  42. package/references/linkedin-post-patterns.md +174 -0
  43. package/references/logo-design-principles.md +55 -0
  44. package/references/meta-gate-evaluation.md +3 -3
  45. package/references/obra-superpowers-conventions.md +170 -0
  46. package/references/playbook-leaders.md +472 -0
  47. package/references/playwright-mcp-setup.md +164 -0
  48. package/references/positioning-check-report.md +2 -2
  49. package/references/pseo-page-anatomy.md +56 -0
  50. package/references/pseo-templates/alternative-anatomy.md +31 -0
  51. package/references/pseo-templates/alternative-content-playbook.md +32 -0
  52. package/references/pseo-templates/blog-anatomy.md +28 -0
  53. package/references/pseo-templates/blog-content-playbook.md +36 -0
  54. package/references/pseo-templates/comparison-anatomy.md +29 -0
  55. package/references/pseo-templates/comparison-content-playbook.md +35 -0
  56. package/references/pseo-templates/use-case-anatomy.md +28 -0
  57. package/references/pseo-templates/use-case-content-playbook.md +30 -0
  58. package/skills/ttm-101/SKILL.md +25 -0
  59. package/skills/ttm-aeo-check/SKILL.md +17 -12
  60. package/skills/ttm-affiliate-kit/SKILL.md +5 -0
  61. package/skills/ttm-archive/SKILL.md +5 -0
  62. package/skills/ttm-brand-refresh/SKILL.md +5 -0
  63. package/skills/ttm-brief/SKILL.md +5 -0
  64. package/skills/ttm-competitor-scan/SKILL.md +5 -0
  65. package/skills/ttm-deploy/SKILL.md +22 -0
  66. package/skills/ttm-discover/SKILL.md +17 -0
  67. package/skills/ttm-email-check/SKILL.md +17 -0
  68. package/skills/ttm-email-preflight/SKILL.md +17 -11
  69. package/skills/ttm-fix/SKILL.md +5 -0
  70. package/skills/ttm-health/SKILL.md +6 -1
  71. package/skills/ttm-humanize/SKILL.md +33 -0
  72. package/skills/ttm-icp-refresh/SKILL.md +5 -0
  73. package/skills/ttm-improve-skill/SKILL.md +18 -0
  74. package/skills/ttm-init/SKILL.md +10 -3
  75. package/skills/ttm-keyword-map/SKILL.md +17 -11
  76. package/skills/ttm-landing/SKILL.md +19 -0
  77. package/skills/ttm-learn/SKILL.md +5 -0
  78. package/skills/ttm-linkedin-post/SKILL.md +26 -0
  79. package/skills/ttm-measure/SKILL.md +5 -0
  80. package/skills/ttm-new-campaign/SKILL.md +5 -0
  81. package/skills/ttm-next/SKILL.md +5 -0
  82. package/skills/ttm-playwright-setup/SKILL.md +18 -0
  83. package/skills/ttm-positioning-check/SKILL.md +5 -0
  84. package/skills/ttm-positioning-shift/SKILL.md +5 -0
  85. package/skills/ttm-produce/SKILL.md +5 -0
  86. package/skills/ttm-pseo/SKILL.md +26 -0
  87. package/skills/ttm-repurpose/SKILL.md +5 -0
  88. package/skills/ttm-request-skill/SKILL.md +18 -0
  89. package/skills/ttm-research/SKILL.md +18 -6
  90. package/skills/ttm-resume/SKILL.md +5 -0
  91. package/skills/ttm-review/SKILL.md +5 -0
  92. package/skills/ttm-seo/SKILL.md +64 -0
  93. package/skills/ttm-seo-audit/SKILL.md +17 -12
  94. package/skills/ttm-ship/SKILL.md +5 -0
  95. package/skills/ttm-state/SKILL.md +5 -0
  96. package/skills/ttm-update/SKILL.md +152 -4
  97. package/skills/ttm-verify/SKILL.md +5 -0
  98. package/templates/agents-md.md +14 -4
  99. package/templates/campaign-research.md +6 -6
  100. package/templates/campaign-state.md +1 -1
  101. package/templates/claude-md.md +14 -4
  102. package/templates/linkedin-base-template.md +48 -0
  103. package/templates/next-step-footer.md +13 -0
  104. package/templates/production-manifest.json +4 -4
  105. package/templates/pseo/alternative-cms-schema.json +65 -0
  106. package/templates/pseo/blog-cms-schema.json +55 -0
  107. package/templates/pseo/comparison-cms-schema.json +56 -0
  108. package/templates/pseo/use-case-cms-schema.json +62 -0
  109. package/templates/reference-files/brand.md +51 -0
  110. package/templates/reference-files/product-dna.md +73 -0
  111. package/templates/site-scaffold/app/globals.css +2 -0
  112. package/templates/site-scaffold/app/layout.tsx +17 -0
  113. package/templates/site-scaffold/app/page.tsx +33 -0
  114. package/templates/site-scaffold/app/robots.ts +8 -0
  115. package/templates/site-scaffold/app/sitemap.ts +10 -0
  116. package/templates/site-scaffold/app/tokens.css +21 -0
  117. package/templates/site-scaffold/components/Comparison.tsx +14 -0
  118. package/templates/site-scaffold/components/Faq.tsx +14 -0
  119. package/templates/site-scaffold/components/Features.tsx +14 -0
  120. package/templates/site-scaffold/components/FinalCta.tsx +17 -0
  121. package/templates/site-scaffold/components/Footer.tsx +12 -0
  122. package/templates/site-scaffold/components/Hero.tsx +22 -0
  123. package/templates/site-scaffold/components/HowItWorks.tsx +14 -0
  124. package/templates/site-scaffold/components/PricingTeaser.tsx +14 -0
  125. package/templates/site-scaffold/components/Problem.tsx +14 -0
  126. package/templates/site-scaffold/components/SocialProof.tsx +14 -0
  127. package/templates/site-scaffold/components/Solution.tsx +14 -0
  128. package/templates/site-scaffold/components/Testimonials.tsx +14 -0
  129. package/templates/site-scaffold/components/UseCases.tsx +14 -0
  130. package/templates/site-scaffold/content/.gitkeep +0 -0
  131. package/templates/site-scaffold/lib/.gitkeep +0 -0
  132. package/templates/site-scaffold/next.config.mjs +10 -0
  133. package/templates/site-scaffold/package.json +25 -0
  134. package/templates/site-scaffold/postcss.config.mjs +3 -0
  135. package/templates/site-scaffold/public/llms.txt +9 -0
  136. package/templates/site-scaffold/tsconfig.json +21 -0
  137. package/templates/verification-report.md +1 -1
  138. package/workflows/channel/linkedin-post.md +178 -0
  139. package/workflows/discipline/affiliate-kit.md +65 -6
  140. package/workflows/discipline/{email-preflight.md → email-check.md} +39 -4
  141. package/workflows/discipline/repurpose.md +82 -31
  142. package/workflows/discipline/{aeo-check.md → seo/aeo.md} +13 -6
  143. package/workflows/discipline/{seo-audit.md → seo/audit.md} +13 -6
  144. package/workflows/discipline/{keyword-map.md → seo/keyword-map.md} +13 -6
  145. package/workflows/education/ttm-101.md +114 -0
  146. package/workflows/lifecycle/brief-positioning-check.md +1 -1
  147. package/workflows/lifecycle/brief.md +64 -28
  148. package/workflows/lifecycle/{research.md → discover.md} +61 -19
  149. package/workflows/lifecycle/fix.md +72 -37
  150. package/workflows/lifecycle/humanize.md +280 -0
  151. package/workflows/lifecycle/learn.md +72 -35
  152. package/workflows/lifecycle/measure.md +54 -18
  153. package/workflows/lifecycle/produce.md +88 -37
  154. package/workflows/lifecycle/review.md +71 -25
  155. package/workflows/lifecycle/ship.md +62 -18
  156. package/workflows/lifecycle/verify.md +72 -26
  157. package/workflows/reference-mgmt/brand-refresh.md +50 -13
  158. package/workflows/reference-mgmt/competitor-scan.md +51 -15
  159. package/workflows/reference-mgmt/icp-refresh.md +48 -12
  160. package/workflows/reference-mgmt/positioning-check.md +55 -20
  161. package/workflows/reference-mgmt/positioning-shift.md +53 -17
  162. package/workflows/setup/init-brand-colors.md +75 -0
  163. package/workflows/setup/init-logo.md +113 -0
  164. package/workflows/setup/init-product-dna.md +83 -0
  165. package/workflows/setup/init-questions.md +166 -30
  166. package/workflows/setup/init-validation.md +22 -0
  167. package/workflows/setup/init.md +144 -39
  168. package/workflows/setup/new-campaign.md +48 -12
  169. package/workflows/site/deploy.md +98 -0
  170. package/workflows/site/landing.md +156 -0
  171. package/workflows/site/pseo.md +96 -0
  172. package/workflows/site/quality-gates.md +88 -0
  173. package/workflows/utility/archive.md +45 -9
  174. package/workflows/utility/health.md +77 -3
  175. package/workflows/utility/improve-skill.md +233 -0
  176. package/workflows/utility/next.md +38 -2
  177. package/workflows/utility/playwright-setup.md +128 -0
  178. package/workflows/utility/request-skill.md +218 -0
  179. package/workflows/utility/resume.md +40 -3
  180. package/workflows/utility/state.md +42 -7
@@ -9,8 +9,100 @@ allowed-tools: Bash Read
9
9
 
10
10
  # /ttm-update
11
11
 
12
+ ## Step 0: First-run inline education
13
+
14
+ Read `.taketomarket/CONFIG.md`. Parse `first_run_seen` (object) and `inline_education` (boolean, default true).
15
+
16
+ If `inline_education` is false: skip this step. Else if `first_run_seen.ttm-update` is not `true`, print the explainer below verbatim, then mark this skill as seen:
17
+
18
+ ```bash
19
+ node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" first-run mark ttm-update
20
+ ```
21
+
22
+ Use this exact check (bash) to decide whether to print: `node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" first-run check ttm-update --raw` -- the JSON `seen` field is `true` once the explainer has run before.
23
+
24
+ ### Explainer for `/ttm-update`
25
+
26
+ `/ttm-update` checks your installed takeToMarket version against the
27
+ npm registry, detects whether you installed via npm or git clone,
28
+ runs the appropriate upgrade path, then reconciles any locally-edited
29
+ skill files against the new source and offers per-file diffs.
30
+
31
+ Why it matters: skills evolve quickly and an out-of-date install
32
+ silently misses gate improvements and bug fixes. This skill is the
33
+ opinionated upgrader -- it knows the right command for your install
34
+ method and preserves your local edits behind explicit prompts rather
35
+ than overwriting them.
36
+
37
+ (Canonical source: `references/inline-education-blurbs.md`. Embedded verbatim because workflows do not @-resolve files at runtime.)
38
+
39
+ ---
40
+
12
41
  Check if takeToMarket needs updating and upgrade if available.
13
42
 
43
+ ## Step: Detect install method
44
+
45
+ Detect how the user installed takeToMarket before deciding how to upgrade.
46
+ Run this FIRST, before any version or legacy-folder work:
47
+
48
+ ```bash
49
+ node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" install-detect --raw
50
+ ```
51
+
52
+ Parse the JSON `method` field. The value will be one of:
53
+
54
+ - **clone** — installed via `git clone`. Upgrades happen with `git pull` in the
55
+ plugin root, then re-running the installer (`node install.js` or `npx
56
+ taketomarket@latest --yes` from the cloned directory).
57
+ - **npm** — installed via `npx taketomarket` or `npm install -g taketomarket`.
58
+ Upgrades happen via `npx taketomarket@latest --yes`.
59
+ - **unknown** — could not locate a plugin root. Print manual instructions and
60
+ ask the user where takeToMarket is installed before continuing:
61
+ ```
62
+ Could not auto-detect your takeToMarket install location.
63
+ Manual upgrade options:
64
+ - npm: npx taketomarket@latest --yes
65
+ - clone: cd <your-clone>; git pull; node install.js
66
+ ```
67
+ Halt the workflow until the user confirms the method to use.
68
+
69
+ Remember the `method` and `root` values — they are used by the version-check
70
+ branching and the skill-file sync step below.
71
+
72
+ ## Step: Legacy folder migration
73
+
74
+ Before checking version, detect whether the project still uses the legacy
75
+ `.marketing/` state directory and offer migration to `.taketomarket/`:
76
+
77
+ ```bash
78
+ node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" legacy-folder check --raw
79
+ ```
80
+
81
+ Parse the JSON `state` field:
82
+
83
+ - **legacy**: print `WARN: Legacy '.marketing/' detected. Migration will rename it to '.taketomarket/'. Recommend committing or backing up first.` then prompt with `AskUserQuestion`:
84
+ - question: "Migrate `.marketing/` to `.taketomarket/` now? (recommended before upgrade)"
85
+ - options: "Yes, migrate now" / "Skip for now"
86
+ - On Yes:
87
+ ```bash
88
+ node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" legacy-folder migrate --raw
89
+ ```
90
+ - On Skip: continue with a note that the upgrade will land alongside the legacy folder.
91
+ - **conflict**: print the error below, then halt before the version check:
92
+ ```
93
+ ERROR: Both .marketing/ and .taketomarket/ exist. Manual resolution required before upgrade.
94
+
95
+ To resolve:
96
+ 1. Compare contents: diff -r .marketing .taketomarket
97
+ 2. Merge any unique files from .marketing/ into .taketomarket/.
98
+ 3. Remove the legacy folder once .taketomarket/ is complete:
99
+ rm -rf .marketing
100
+ 4. Re-run /ttm-update to continue the upgrade.
101
+ ```
102
+ - **current** or **none**: continue silently.
103
+
104
+ ## Version check
105
+
14
106
  1. Get current installed version:
15
107
  ```bash
16
108
  cat $HOME/.taketomarket/package.json 2>/dev/null | python3 -c "import sys,json; print(json.load(sys.stdin).get('version','unknown'))" 2>/dev/null || echo "unknown"
@@ -21,9 +113,65 @@ cat $HOME/.taketomarket/package.json 2>/dev/null | python3 -c "import sys,json;
21
113
  npm show taketomarket version 2>/dev/null || echo "unknown"
22
114
  ```
23
115
 
24
- 3. Compare versions. If a newer version is available (latest > installed), run:
25
- ```bash
26
- npx taketomarket@latest --yes
116
+ 3. Compare versions. If already up to date, confirm
117
+ "takeToMarket vX.X.X is up to date." and skip the install + sync steps below.
118
+
119
+ 4. If a newer version is available, branch by the install `method` detected
120
+ earlier:
121
+
122
+ - **clone** — pull the latest source, then reinstall from the cloned directory:
123
+ ```bash
124
+ git -C "<root>" pull --ff-only && node "<root>/install.js"
125
+ ```
126
+ (Substitute the `root` returned from `install-detect`.)
127
+ - **npm** — upgrade via npm:
128
+ ```bash
129
+ npm install -g taketomarket@latest
130
+ ```
131
+ (Falling back to `npx taketomarket@latest --yes` is acceptable if `npm
132
+ install -g` is not desired.)
133
+ - **unknown** — print the manual instructions emitted in the detection step
134
+ and halt. Do NOT attempt an automatic install.
135
+
136
+ ## Step: Skill-file diff + sync
137
+
138
+ After the install completes (clone or npm), reconcile any user-installed skill
139
+ files under `~/.claude/skills/ttm-*/` against the freshly installed source under
140
+ `<root>/skills/ttm-*/`. This catches the case where the user edited an installed
141
+ skill or where the installer skipped a file.
142
+
143
+ For each `ttm-*` skill directory present in BOTH locations:
144
+
145
+ 1. Compare files (e.g., `SKILL.md` and any supporting files) between
146
+ `~/.claude/skills/<skill>/` and `<root>/skills/<skill>/`.
147
+ 2. For every file with a non-trivial diff, show the user a short summary of the
148
+ diff (filename + a few lines of context). Then use `AskUserQuestion` with
149
+ priority `critical`:
150
+ - question: "Overwrite `~/.claude/skills/<skill>/<file>` with the new source?"
151
+ - options: "Yes, overwrite" / "Skip this file" / "Skip remaining files"
152
+ 3. On "Yes, overwrite": copy the source file over the installed copy.
153
+ 4. On "Skip remaining files": stop the sync loop and continue to the log step.
154
+ 5. Track the count of files actually synced.
155
+
156
+ If `<root>` is `null` (unknown install method), skip this step entirely.
157
+
158
+ ## Step: Append to UPDATE-LOG.md
159
+
160
+ Record the upgrade outcome in `.taketomarket/UPDATE-LOG.md` (create the file if
161
+ it does not exist). Append the following block:
162
+
163
+ ```
164
+ ## YYYY-MM-DD HH:MM
165
+ - Updated from vX.X.X to vY.Y.Y
166
+ - Method: <clone|npm>
167
+ - Files synced: <count>
168
+ - Folder migration: <yes|no>
27
169
  ```
28
170
 
29
- 4. If already up to date, confirm: "takeToMarket vX.X.X is up to date."
171
+ `<yes|no>` reflects whether the legacy-folder migration step actually ran a
172
+ rename during this invocation.
173
+
174
+ ## Next steps
175
+
176
+ See `${CLAUDE_PLUGIN_ROOT}/templates/next-step-footer.md`.
177
+ <!-- next-step-footer -->
@@ -12,3 +12,8 @@ allowed-tools: Read Write Bash Glob Grep Task AskUserQuestion
12
12
  # /ttm-verify
13
13
 
14
14
  Read and follow the workflow at `${CLAUDE_PLUGIN_ROOT}/workflows/lifecycle/verify.md`
15
+
16
+ ## Next steps
17
+
18
+ See `${CLAUDE_PLUGIN_ROOT}/templates/next-step-footer.md`.
19
+ <!-- next-step-footer -->
@@ -4,6 +4,16 @@
4
4
 
5
5
  Every marketing asset ships with a verifiable outcome metric and passes through a positioning-invariant quality gate wall. No asset ships without both, ever.
6
6
 
7
+ ### Target Audience
8
+
9
+ **Built for developerneurs and solopreneurs** — engineers building and shipping their own products who have zero or near-zero marketing/growth experience.
10
+
11
+ When assisting the user:
12
+ - Assume strong engineering literacy. They read code fluently.
13
+ - Assume zero marketing literacy. Explain positioning, ICP, AEO, funnels in engineering analogies.
14
+ - Default to opinionated guidance — they came here because they don't know what's "right" in marketing.
15
+ - When suggesting marketing terms, link to `/ttm-101` or run inline explanations on first use.
16
+
7
17
  ## Positioning as Invariant (positioning-as-invariant)
8
18
 
9
19
  POSITIONING.md is the source of truth for all marketing content. It is:
@@ -33,10 +43,10 @@ Each phase has a dedicated `/ttm-*` command. Phases cannot be skipped.
33
43
 
34
44
  ## File Paths
35
45
 
36
- - Marketing state: `.marketing/`
37
- - Reference files: `.marketing/POSITIONING.md`, `.marketing/BRAND.md`, etc.
38
- - Campaigns: `.marketing/CAMPAIGNS/<slug>/`
39
- - Campaign state: `.marketing/CAMPAIGNS/<slug>/STATE.md`
46
+ - Marketing state: `.taketomarket/`
47
+ - Reference files: `.taketomarket/POSITIONING.md`, `.taketomarket/BRAND.md`, etc.
48
+ - Campaigns: `.taketomarket/CAMPAIGNS/<slug>/`
49
+ - Campaign state: `.taketomarket/CAMPAIGNS/<slug>/STATE.md`
40
50
 
41
51
  ## Deterministic Operations
42
52
 
@@ -10,30 +10,30 @@
10
10
 
11
11
  | Insight | Confidence | Source |
12
12
  |---------|-----------|--------|
13
- | [GENERATED BY /ttm-research] | HIGH/MEDIUM/LOW | [source or "user-provided"] |
13
+ | [GENERATED BY /ttm-discover] | HIGH/MEDIUM/LOW | [source or "user-provided"] |
14
14
 
15
15
  ## Competitor Content Analysis
16
16
 
17
17
  | Competitor | Content Type | Key Message | Gap/Opportunity |
18
18
  |-----------|-------------|-------------|-----------------|
19
- | [GENERATED BY /ttm-research] | [type] | [message] | [gap] |
19
+ | [GENERATED BY /ttm-discover] | [type] | [message] | [gap] |
20
20
 
21
21
  ## Audience Insights
22
22
 
23
23
  | Insight | Confidence | Source |
24
24
  |---------|-----------|--------|
25
- | [GENERATED BY /ttm-research] | HIGH/MEDIUM/LOW | [source] |
25
+ | [GENERATED BY /ttm-discover] | HIGH/MEDIUM/LOW | [source] |
26
26
 
27
27
  ## Ambient Narrative
28
28
 
29
- [GENERATED BY /ttm-research -- What the market already believes about this topic]
29
+ [GENERATED BY /ttm-discover -- What the market already believes about this topic]
30
30
 
31
31
  ## Content Gaps
32
32
 
33
33
  | Gap | Opportunity Size | Difficulty |
34
34
  |-----|-----------------|------------|
35
- | [GENERATED BY /ttm-research] | HIGH/MEDIUM/LOW | HIGH/MEDIUM/LOW |
35
+ | [GENERATED BY /ttm-discover] | HIGH/MEDIUM/LOW | HIGH/MEDIUM/LOW |
36
36
 
37
37
  ## Research Summary
38
38
 
39
- [GENERATED BY /ttm-research -- 2-3 sentence summary for /ttm-brief to consume quickly]
39
+ [GENERATED BY /ttm-discover -- 2-3 sentence summary for /ttm-brief to consume quickly]
@@ -37,4 +37,4 @@ verify.overall_result: null
37
37
  # Campaign: [CAMPAIGN_NAME]
38
38
 
39
39
  Phase: created
40
- Next step: Run `/ttm-research [SLUG]` to gather market intelligence.
40
+ Next step: Run `/ttm-discover [SLUG]` to gather market intelligence.
@@ -4,6 +4,16 @@
4
4
 
5
5
  Every marketing asset ships with a verifiable outcome metric and passes through a positioning-invariant quality gate wall. No asset ships without both, ever.
6
6
 
7
+ ### Target Audience
8
+
9
+ **Built for developerneurs and solopreneurs** — engineers building and shipping their own products who have zero or near-zero marketing/growth experience.
10
+
11
+ When assisting the user:
12
+ - Assume strong engineering literacy. They read code fluently.
13
+ - Assume zero marketing literacy. Explain positioning, ICP, AEO, funnels in engineering analogies.
14
+ - Default to opinionated guidance — they came here because they don't know what's "right" in marketing.
15
+ - When suggesting marketing terms, link to `/ttm-101` or run inline explanations on first use.
16
+
7
17
  ## Positioning as Invariant (positioning-as-invariant)
8
18
 
9
19
  POSITIONING.md is the source of truth for all marketing content. It is:
@@ -33,10 +43,10 @@ Each phase has a dedicated `/ttm-*` command. Phases cannot be skipped.
33
43
 
34
44
  ## File Paths
35
45
 
36
- - Marketing state: `.marketing/`
37
- - Reference files: `.marketing/POSITIONING.md`, `.marketing/BRAND.md`, etc.
38
- - Campaigns: `.marketing/CAMPAIGNS/<slug>/`
39
- - Campaign state: `.marketing/CAMPAIGNS/<slug>/STATE.md`
46
+ - Marketing state: `.taketomarket/`
47
+ - Reference files: `.taketomarket/POSITIONING.md`, `.taketomarket/BRAND.md`, etc.
48
+ - Campaigns: `.taketomarket/CAMPAIGNS/<slug>/`
49
+ - Campaign state: `.taketomarket/CAMPAIGNS/<slug>/STATE.md`
40
50
 
41
51
  ## Deterministic Operations
42
52
 
@@ -0,0 +1,48 @@
1
+ # LinkedIn Base — {{USER_NAME}}
2
+
3
+ **Generated by `/ttm-linkedin-post` first-run interview on {{DATE}}.**
4
+ **Source authors:** {{AUTHOR_LIST}}
5
+
6
+ This file is the per-user LinkedIn style guide. It captures the cadence, hooks, and structure patterns derived from the user-selected source authors. Every `/ttm-linkedin-post` run loads this file.
7
+
8
+ ---
9
+
10
+ ## Voice + style
11
+
12
+ **Voice archetype:** {{VOICE_ARCHETYPE}}
13
+
14
+ **Sentence rhythm:** {{SENTENCE_RHYTHM}}
15
+
16
+ **Vocabulary level:** {{VOCAB_LEVEL}}
17
+
18
+ **Punctuation habits:** {{PUNCTUATION_HABITS}}
19
+
20
+ ## Hook patterns (from source authors)
21
+
22
+ {{HOOK_PATTERNS_EXTRACTED}}
23
+
24
+ ## Post structure preferences
25
+
26
+ {{STRUCTURE_PREFERENCES}}
27
+
28
+ ## Length distribution
29
+
30
+ {{LENGTH_NORMS}}
31
+
32
+ ## Topics user wants to be known for
33
+
34
+ {{TOPICS}}
35
+
36
+ ## Anti-patterns (things to avoid)
37
+
38
+ {{ANTI_PATTERNS}}
39
+
40
+ ## Source author profile summaries
41
+
42
+ {{AUTHOR_SUMMARIES}}
43
+
44
+ ---
45
+
46
+ ## Regeneration
47
+
48
+ Run `/ttm-linkedin-post --rebuild-base` to refresh this file with new author scrapes.
@@ -0,0 +1,13 @@
1
+ <!-- next-step-footer -->
2
+
3
+ ---
4
+
5
+ **Next:** Run `/ttm-next` for the recommended next command based on your current state.
6
+
7
+ Or run one of:
8
+ - `/ttm-state` to see all campaigns at a glance.
9
+ - `/ttm-health` to validate `.taketomarket/` directory integrity.
10
+ - `/ttm-resume` to pick up where you left off.
11
+
12
+ Found a bug or want a new feature? File an issue at https://github.com/ranjanrishikesh/taketomarket/issues.
13
+ <!-- /next-step-footer -->
@@ -2,10 +2,10 @@
2
2
  "campaign": "[SLUG]",
3
3
  "produced_at": "[ISO_TIMESTAMP]",
4
4
  "context_loaded": {
5
- "brief": ".marketing/CAMPAIGNS/[SLUG]/BRIEF.md",
6
- "positioning": ".marketing/POSITIONING.md",
7
- "brand": ".marketing/BRAND.md",
8
- "icp": ".marketing/ICP.md"
5
+ "brief": ".taketomarket/CAMPAIGNS/[SLUG]/BRIEF.md",
6
+ "positioning": ".taketomarket/POSITIONING.md",
7
+ "brand": ".taketomarket/BRAND.md",
8
+ "icp": ".taketomarket/ICP.md"
9
9
  },
10
10
  "hero": {
11
11
  "asset_id": 1,
@@ -0,0 +1,65 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Alternative Page CMS Schema",
4
+ "type": "object",
5
+ "required": ["slug", "competitorName", "tldr", "whyPeopleLeave", "whyWeAreTheAlternative"],
6
+ "properties": {
7
+ "slug": { "type": "string", "pattern": "^[a-z0-9-]+$" },
8
+ "competitorName": { "type": "string" },
9
+ "tldr": { "type": "string", "minLength": 50, "maxLength": 400 },
10
+ "whyPeopleLeave": {
11
+ "type": "array",
12
+ "minItems": 3,
13
+ "maxItems": 5,
14
+ "items": { "type": "string" }
15
+ },
16
+ "whyWeAreTheAlternative": {
17
+ "type": "array",
18
+ "minItems": 3,
19
+ "maxItems": 5,
20
+ "items": { "type": "string" }
21
+ },
22
+ "featureParity": {
23
+ "type": "object",
24
+ "additionalProperties": { "type": "string" }
25
+ },
26
+ "migrationSteps": {
27
+ "type": "array",
28
+ "minItems": 3,
29
+ "items": {
30
+ "type": "object",
31
+ "required": ["step", "description"],
32
+ "properties": {
33
+ "step": { "type": "integer" },
34
+ "description": { "type": "string" },
35
+ "code": { "type": "string" },
36
+ "link": { "type": "string" }
37
+ }
38
+ }
39
+ },
40
+ "customerQuotes": {
41
+ "type": "array",
42
+ "items": {
43
+ "type": "object",
44
+ "required": ["quote", "name"],
45
+ "properties": {
46
+ "quote": { "type": "string" },
47
+ "name": { "type": "string" },
48
+ "role": { "type": "string" },
49
+ "company": { "type": "string" }
50
+ }
51
+ }
52
+ },
53
+ "faq": {
54
+ "type": "array",
55
+ "items": {
56
+ "type": "object",
57
+ "required": ["question", "answer"],
58
+ "properties": {
59
+ "question": { "type": "string" },
60
+ "answer": { "type": "string" }
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
@@ -0,0 +1,55 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Blog Post CMS Schema",
4
+ "type": "object",
5
+ "required": ["slug", "title", "tldr", "author", "publishedAt", "sections"],
6
+ "properties": {
7
+ "slug": { "type": "string", "pattern": "^[a-z0-9-]+$" },
8
+ "title": { "type": "string", "minLength": 10, "maxLength": 120 },
9
+ "tldr": { "type": "string", "minLength": 50, "maxLength": 400 },
10
+ "author": {
11
+ "type": "object",
12
+ "required": ["name"],
13
+ "properties": {
14
+ "name": { "type": "string" },
15
+ "role": { "type": "string" },
16
+ "avatarUrl": { "type": "string" }
17
+ }
18
+ },
19
+ "publishedAt": { "type": "string", "format": "date" },
20
+ "updatedAt": { "type": "string", "format": "date" },
21
+ "tags": { "type": "array", "items": { "type": "string" } },
22
+ "heroImage": { "type": "string" },
23
+ "sections": {
24
+ "type": "array",
25
+ "minItems": 3,
26
+ "items": {
27
+ "type": "object",
28
+ "required": ["h2", "body"],
29
+ "properties": {
30
+ "h2": { "type": "string" },
31
+ "body": { "type": "string" },
32
+ "visual": { "type": "string" }
33
+ }
34
+ }
35
+ },
36
+ "takeaways": {
37
+ "type": "array",
38
+ "minItems": 3,
39
+ "maxItems": 5,
40
+ "items": { "type": "string" }
41
+ },
42
+ "faq": {
43
+ "type": "array",
44
+ "items": {
45
+ "type": "object",
46
+ "required": ["question", "answer"],
47
+ "properties": {
48
+ "question": { "type": "string" },
49
+ "answer": { "type": "string" }
50
+ }
51
+ }
52
+ },
53
+ "related": { "type": "array", "items": { "type": "string" } }
54
+ }
55
+ }
@@ -0,0 +1,56 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Comparison Page CMS Schema",
4
+ "type": "object",
5
+ "required": ["slug", "competitorName", "tldr", "comparisonTable"],
6
+ "properties": {
7
+ "slug": { "type": "string", "pattern": "^[a-z0-9-]+$" },
8
+ "competitorName": { "type": "string" },
9
+ "tldr": { "type": "string", "minLength": 50, "maxLength": 400 },
10
+ "comparisonTable": {
11
+ "type": "array",
12
+ "minItems": 5,
13
+ "items": {
14
+ "type": "object",
15
+ "required": ["feature", "product", "competitor"],
16
+ "properties": {
17
+ "feature": { "type": "string" },
18
+ "product": { "type": "string" },
19
+ "competitor": { "type": "string" }
20
+ }
21
+ }
22
+ },
23
+ "whenProductWins": {
24
+ "type": "array",
25
+ "minItems": 3,
26
+ "maxItems": 5,
27
+ "items": { "type": "string" }
28
+ },
29
+ "whenCompetitorWins": {
30
+ "type": "array",
31
+ "minItems": 3,
32
+ "maxItems": 5,
33
+ "items": { "type": "string" }
34
+ },
35
+ "pricing": {
36
+ "type": "object",
37
+ "required": ["product", "competitor"],
38
+ "properties": {
39
+ "product": { "type": "string" },
40
+ "competitor": { "type": "string" },
41
+ "notes": { "type": "string" }
42
+ }
43
+ },
44
+ "faq": {
45
+ "type": "array",
46
+ "items": {
47
+ "type": "object",
48
+ "required": ["question", "answer"],
49
+ "properties": {
50
+ "question": { "type": "string" },
51
+ "answer": { "type": "string" }
52
+ }
53
+ }
54
+ }
55
+ }
56
+ }
@@ -0,0 +1,62 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "title": "Use-Case Page CMS Schema",
4
+ "type": "object",
5
+ "required": ["slug", "useCase", "tldr", "problem", "featurePillars"],
6
+ "properties": {
7
+ "slug": { "type": "string", "pattern": "^[a-z0-9-]+$" },
8
+ "useCase": { "type": "string" },
9
+ "tldr": { "type": "string", "minLength": 50, "maxLength": 400 },
10
+ "problem": { "type": "string", "minLength": 1 },
11
+ "whyTypicalSolutionsFail": { "type": "string", "minLength": 1 },
12
+ "featurePillars": {
13
+ "type": "array",
14
+ "minItems": 3,
15
+ "items": {
16
+ "type": "object",
17
+ "required": ["title", "body"],
18
+ "properties": {
19
+ "title": { "type": "string" },
20
+ "body": { "type": "string" },
21
+ "visual": { "type": "string" }
22
+ }
23
+ }
24
+ },
25
+ "walkthrough": {
26
+ "type": "array",
27
+ "minItems": 3,
28
+ "items": {
29
+ "type": "object",
30
+ "required": ["step", "description"],
31
+ "properties": {
32
+ "step": { "type": "integer" },
33
+ "description": { "type": "string" },
34
+ "screenshot": { "type": "string" }
35
+ }
36
+ }
37
+ },
38
+ "outcome": { "type": "string" },
39
+ "customerQuote": {
40
+ "type": "object",
41
+ "required": ["quote", "name"],
42
+ "properties": {
43
+ "quote": { "type": "string" },
44
+ "name": { "type": "string" },
45
+ "role": { "type": "string" },
46
+ "company": { "type": "string" }
47
+ }
48
+ },
49
+ "faq": {
50
+ "type": "array",
51
+ "items": {
52
+ "type": "object",
53
+ "required": ["question", "answer"],
54
+ "properties": {
55
+ "question": { "type": "string" },
56
+ "answer": { "type": "string" }
57
+ }
58
+ }
59
+ },
60
+ "relatedUseCases": { "type": "array", "items": { "type": "string" } }
61
+ }
62
+ }
@@ -43,3 +43,54 @@
43
43
 
44
44
  ### Bad Examples
45
45
  [GENERATED BY /ttm-init -- Examples of off-brand content with explanation]
46
+
47
+ ## Colors
48
+
49
+ **Primary:** `[#HEX]` (e.g., `#0EA5E9`)
50
+ **Primary variants:**
51
+ - Lighter (hover): `[#HEX]`
52
+ - Darker (active): `[#HEX]`
53
+
54
+ **Secondary:** `[#HEX]`
55
+ **Accent:** `[#HEX]`
56
+
57
+ **Neutral scale:**
58
+ - 50: `[#HEX]`
59
+ - 100: `[#HEX]`
60
+ - 200: `[#HEX]`
61
+ - 300: `[#HEX]`
62
+ - 400: `[#HEX]`
63
+ - 500: `[#HEX]`
64
+ - 600: `[#HEX]`
65
+ - 700: `[#HEX]`
66
+ - 800: `[#HEX]`
67
+ - 900: `[#HEX]`
68
+
69
+ **Semantic:**
70
+ - Success: `[#HEX]`
71
+ - Warning: `[#HEX]`
72
+ - Error: `[#HEX]`
73
+ - Info: `[#HEX]`
74
+
75
+ **Accessibility check:**
76
+ - Primary on light bg WCAG: `[AA / AAA]`
77
+ - Primary on dark bg WCAG: `[AA / AAA]`
78
+
79
+ **Palette rationale:** [Why these colors, derived from positioning + manifesto.]
80
+
81
+ ## Logo
82
+
83
+ **Files** (saved to `.taketomarket/brand/`):
84
+ - Primary: `logo.svg`
85
+ - Mark only: `logo-mark.svg`
86
+ - Wordmark only: `logo-wordmark.svg`
87
+ - Mono light: `logo-mono-light.svg`
88
+ - Mono dark: `logo-mono-dark.svg`
89
+ - Favicon: `logo-favicon.svg`
90
+ - Raster: `logo@1x.png`, `logo@2x.png`
91
+
92
+ **Type:** [Wordmark / Lettermark / Symbol / Combination]
93
+
94
+ **Rationale:** [Why this logo type, why these proportions, why these colors.]
95
+
96
+ **Vision-review history:** [Round 1, Round 2, ... with critique + iteration.]