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
package/bin/ttm-tools.cjs CHANGED
@@ -11,12 +11,16 @@
11
11
  * Commands:
12
12
  * slug <text> Generate URL-safe slug from text
13
13
  * timestamp [format] Get timestamp (full|date|filename)
14
- * init Check .marketing/ initialization status
15
- * state <read|update> Read or update .marketing/STATE.md
14
+ * init Check .taketomarket/ initialization status
15
+ * state <read|update> Read or update .taketomarket/STATE.md
16
16
  * campaign <sub> [args] Campaign operations (init, state, update, list)
17
17
  * drift-log <sub> [args] Drift log operations (append, deprecation)
18
- * health Validate .marketing/ directory structure
18
+ * health Validate .taketomarket/ directory structure
19
19
  * commit <msg> [--files] Stage files and git commit
20
+ * scan-codebase Detect stack, monorepo, feature candidates
21
+ * config <read|set> Read or set .taketomarket/CONFIG.md
22
+ * first-run <sub> <skill> Check or mark first-run inline-education seen state
23
+ * svg-render <in> <out> Render SVG file to PNG via local converter
20
24
  */
21
25
 
22
26
  'use strict';
@@ -27,6 +31,15 @@ const args = process.argv.slice(2);
27
31
  const raw = args.includes('--raw');
28
32
  const command = args[0];
29
33
 
34
+ function ensureMigratedOrExit() {
35
+ const { requireMigratedState } = require('./lib/legacy-folder.cjs');
36
+ const result = requireMigratedState(process.cwd());
37
+ if (!result.ok) {
38
+ process.stderr.write('Error: ' + result.message + '\n');
39
+ process.exit(2);
40
+ }
41
+ }
42
+
30
43
  switch (command) {
31
44
  case 'slug': {
32
45
  const { cmdSlug } = require('./lib/slug.cjs');
@@ -45,6 +58,7 @@ switch (command) {
45
58
  break;
46
59
  }
47
60
  case 'state': {
61
+ ensureMigratedOrExit();
48
62
  const stateArgs = args.slice(1).filter(a => a !== '--raw');
49
63
  const subCmd = stateArgs[0];
50
64
  const { cmdStateRead, cmdStateUpdate } = require('./lib/state.cjs');
@@ -63,6 +77,7 @@ switch (command) {
63
77
  break;
64
78
  }
65
79
  case 'campaign': {
80
+ ensureMigratedOrExit();
66
81
  const { cmdCampaignInit, cmdCampaignState, cmdCampaignUpdate, cmdCampaignList, cmdCampaignArchive, cmdRepurposeManifest } = require('./lib/campaign.cjs');
67
82
  const campaignArgs = args.slice(1).filter(a => a !== '--raw');
68
83
  const subCmd = campaignArgs[0];
@@ -97,6 +112,7 @@ switch (command) {
97
112
  break;
98
113
  }
99
114
  case 'deviation': {
115
+ ensureMigratedOrExit();
100
116
  const devArgs = args.slice(1).filter(a => a !== '--raw');
101
117
  const devCmd = devArgs[0];
102
118
  if (devCmd === 'append') {
@@ -116,6 +132,7 @@ switch (command) {
116
132
  break;
117
133
  }
118
134
  case 'drift-log': {
135
+ ensureMigratedOrExit();
119
136
  const dlArgs = args.slice(1).filter(a => a !== '--raw');
120
137
  const dlCmd = dlArgs[0];
121
138
  if (dlCmd === 'append') {
@@ -145,13 +162,128 @@ switch (command) {
145
162
  break;
146
163
  }
147
164
  case 'health': {
165
+ ensureMigratedOrExit();
148
166
  const { cmdHealth } = require('./lib/health.cjs');
149
167
  const full = args.includes('--full');
150
168
  cmdHealth(raw, full);
151
169
  break;
152
170
  }
171
+ case 'legacy-folder': {
172
+ const sub = args[1];
173
+ const { legacyFolderCheck, migrateLegacyFolder } = require('./lib/legacy-folder.cjs');
174
+ if (sub === 'check') {
175
+ const result = legacyFolderCheck(process.cwd());
176
+ if (raw) {
177
+ console.log(JSON.stringify(result));
178
+ } else {
179
+ console.log(`Legacy folder state: ${result.state}`);
180
+ }
181
+ process.exit(result.state === 'conflict' ? 1 : 0);
182
+ } else if (sub === 'migrate') {
183
+ const result = migrateLegacyFolder(process.cwd());
184
+ if (raw) {
185
+ console.log(JSON.stringify(result));
186
+ } else {
187
+ console.log(result.ok ? `Migrated ${result.from} -> ${result.to}` : `Error: ${result.error}`);
188
+ }
189
+ process.exit(result.ok ? 0 : 1);
190
+ } else {
191
+ error('legacy-folder subcommand required: check, migrate');
192
+ }
193
+ break;
194
+ }
195
+ case 'scan-codebase': {
196
+ const { scanCodebase } = require('./lib/codebase-scan.cjs');
197
+ const result = scanCodebase(process.cwd());
198
+ console.log(
199
+ raw
200
+ ? JSON.stringify(result)
201
+ : `Stack: ${result.stack.join(', ')}\nMonorepo: ${result.monorepo}\nFeature candidates: ${result.featureCandidates.join(', ')}`
202
+ );
203
+ break;
204
+ }
205
+ case 'config': {
206
+ const { readConfig, setConfig } = require('./lib/config.cjs');
207
+ const cfgArgs = args.slice(1).filter(a => a !== '--raw');
208
+ const sub = cfgArgs[0];
209
+ if (sub === 'read') {
210
+ const cfg = readConfig(process.cwd());
211
+ console.log(raw ? JSON.stringify(cfg) : JSON.stringify(cfg, null, 2));
212
+ } else if (sub === 'set') {
213
+ const key = cfgArgs[1];
214
+ let val = cfgArgs[2];
215
+ if (val === 'true') val = true;
216
+ else if (val === 'false') val = false;
217
+ setConfig(process.cwd(), key, val);
218
+ console.log(raw ? '{"ok":true}' : `Set ${key} = ${val}`);
219
+ } else {
220
+ error('config subcommand required: read, set');
221
+ }
222
+ break;
223
+ }
224
+ case 'first-run': {
225
+ const sub = args[1];
226
+ const skillName = args[2];
227
+ if (!sub || !skillName) {
228
+ error('Usage: ttm-tools.cjs first-run check|mark <skill>');
229
+ }
230
+ const { isFirstRunSeen, markFirstRunSeen } = require('./lib/config.cjs');
231
+ if (sub === 'check') {
232
+ const seen = isFirstRunSeen(process.cwd(), skillName);
233
+ console.log(raw ? JSON.stringify({ seen }) : (seen ? 'seen' : 'first'));
234
+ } else if (sub === 'mark') {
235
+ markFirstRunSeen(process.cwd(), skillName);
236
+ console.log(raw ? '{"ok":true}' : `Marked ${skillName} as seen.`);
237
+ } else {
238
+ error('first-run subcommand required: check, mark');
239
+ }
240
+ break;
241
+ }
242
+ case 'svg-render': {
243
+ const { renderSvgToPng } = require('./lib/svg-render.cjs');
244
+ const svgArgs = args.slice(1).filter(a => a !== '--raw');
245
+ const result = renderSvgToPng(svgArgs[0], svgArgs[1]);
246
+ console.log(
247
+ raw
248
+ ? JSON.stringify(result)
249
+ : (result.ok ? `Rendered via ${result.renderer}` : `Error: ${result.error}`)
250
+ );
251
+ process.exit(result.ok ? 0 : 1);
252
+ break;
253
+ }
254
+ case 'site-location': {
255
+ const { suggestSitePath } = require('./lib/site-location.cjs');
256
+ const result = suggestSitePath(process.cwd());
257
+ console.log(raw ? JSON.stringify(result) : `Default: ${result.default}\nMonorepo: ${result.monorepo}`);
258
+ break;
259
+ }
260
+ case 'deploy': {
261
+ const { detectDeployPath } = require('./lib/deploy.cjs');
262
+ const deployArgs = args.slice(1).filter(a => a !== '--raw');
263
+ const sub = deployArgs[0];
264
+ if (sub === 'detect') {
265
+ const result = detectDeployPath(process.cwd());
266
+ console.log(raw ? JSON.stringify(result) : `Preferred: ${result.preferred || 'none'}\nAvailable: ${result.available.join(', ') || 'none'}`);
267
+ } else {
268
+ error(`deploy subcommand required: detect${sub ? ` (got: ${sub})` : ''}`);
269
+ }
270
+ break;
271
+ }
272
+ case 'playwright-check': {
273
+ const { checkPlaywrightMcp } = require('./lib/playwright-check.cjs');
274
+ const result = checkPlaywrightMcp();
275
+ console.log(raw ? JSON.stringify(result) : `${result.detected ? '✓' : '✗'} ${result.setupHint}`);
276
+ process.exit(result.detected ? 0 : 1);
277
+ break;
278
+ }
279
+ case 'install-detect': {
280
+ const { detectInstallMethod } = require('./lib/install-detect.cjs');
281
+ const result = detectInstallMethod();
282
+ console.log(raw ? JSON.stringify(result) : `Method: ${result.method}\nRoot: ${result.root}`);
283
+ break;
284
+ }
153
285
  default:
154
286
  error(
155
- `Unknown command: ${command || '(none)'}. Available: slug, timestamp, init, state, campaign, commit, deviation, drift-log, health`
287
+ `Unknown command: ${command || '(none)'}. Available: slug, timestamp, init, state, campaign, commit, deviation, drift-log, health, legacy-folder, scan-codebase, config, first-run, svg-render, site-location, deploy, playwright-check, install-detect`
156
288
  );
157
289
  }
@@ -7,7 +7,7 @@
7
7
  ## Gate 1: Positioning Drift (GATE-01) -- Tier 1
8
8
 
9
9
  **Checks:** Asset content alignment with approved positioning
10
- **Against:** `.marketing/POSITIONING.md`
10
+ **Against:** `.taketomarket/POSITIONING.md`
11
11
 
12
12
  ### Evaluation Criteria
13
13
 
@@ -31,7 +31,7 @@
31
31
  ## Gate 2: Claim Accuracy (GATE-02) -- Tier 1
32
32
 
33
33
  **Checks:** Factual and numeric claims against approved proof points
34
- **Against:** `.marketing/BRAND.md` proof points section
34
+ **Against:** `.taketomarket/BRAND.md` proof points section
35
35
 
36
36
  ### Evaluation Criteria
37
37
 
@@ -55,7 +55,7 @@
55
55
  ## Gate 3: Voice Drift (GATE-03) -- Tier 2
56
56
 
57
57
  **Checks:** Tone, vocabulary, and register against brand voice definition
58
- **Against:** `.marketing/BRAND.md` voice archetype and banned words list
58
+ **Against:** `.taketomarket/BRAND.md` voice archetype and banned words list
59
59
 
60
60
  ### Evaluation Criteria
61
61
 
@@ -79,7 +79,7 @@
79
79
  ## Gate 4: Outcome Alignment (GATE-04) -- Tier 1
80
80
 
81
81
  **Checks:** Whether the asset is designed to drive the campaign's stated outcome metric
82
- **Against:** `.marketing/CAMPAIGNS/<slug>/BRIEF.md` outcome metric
82
+ **Against:** `.taketomarket/CAMPAIGNS/<slug>/BRIEF.md` outcome metric
83
83
 
84
84
  ### Evaluation Criteria
85
85
 
@@ -98,7 +98,7 @@
98
98
  ## Gate 5: Funnel Integrity (GATE-05) -- Tier 2
99
99
 
100
100
  **Checks:** CTA presence, destination, and conversion path logic
101
- **Against:** `.marketing/CAMPAIGNS/<slug>/BRIEF.md` funnel/CTA section
101
+ **Against:** `.taketomarket/CAMPAIGNS/<slug>/BRIEF.md` funnel/CTA section
102
102
 
103
103
  ### Evaluation Criteria
104
104
 
@@ -125,7 +125,7 @@
125
125
  ## Gate 6: UTM Hygiene (GATE-06) -- Tier 2
126
126
 
127
127
  **Checks:** UTM parameter presence and naming convention compliance
128
- **Against:** `.marketing/CHANNELS.md` UTM schema
128
+ **Against:** `.taketomarket/CHANNELS.md` UTM schema
129
129
 
130
130
  ### Evaluation Criteria
131
131
 
@@ -178,7 +178,7 @@
178
178
  ## Gate 8: Competitor Collision (GATE-08) -- Tier 2
179
179
 
180
180
  **Checks:** Unintended competitor promotion or positioning echo
181
- **Against:** `.marketing/COMPETITORS.md`
181
+ **Against:** `.taketomarket/COMPETITORS.md`
182
182
 
183
183
  ### Evaluation Criteria
184
184
 
@@ -202,7 +202,7 @@
202
202
  ## Gate 9: ICP Fit (GATE-09) -- Tier 2
203
203
 
204
204
  **Checks:** Whether content speaks to the target ICP in their language
205
- **Against:** `.marketing/ICP.md`
205
+ **Against:** `.taketomarket/ICP.md`
206
206
 
207
207
  ### Evaluation Criteria
208
208
 
@@ -54,7 +54,7 @@ If a check is N/A (e.g., UTM hygiene for an asset without links), record:
54
54
 
55
55
  ### Evaluating GATE-01: Positioning Drift
56
56
 
57
- **Load:** `.marketing/POSITIONING.md` (Tier 2 full)
57
+ **Load:** `.taketomarket/POSITIONING.md` (Tier 2 full)
58
58
  **Asset content:** Full asset text
59
59
 
60
60
  **Evaluate:**
@@ -69,7 +69,7 @@ If a check is N/A (e.g., UTM hygiene for an asset without links), record:
69
69
 
70
70
  ### Evaluating GATE-02: Claim Accuracy
71
71
 
72
- **Load:** `.marketing/BRAND.md` (Tier 2 full -- proof points section)
72
+ **Load:** `.taketomarket/BRAND.md` (Tier 2 full -- proof points section)
73
73
  **Asset content:** Full asset text
74
74
 
75
75
  **Evaluate:**
@@ -84,7 +84,7 @@ If a check is N/A (e.g., UTM hygiene for an asset without links), record:
84
84
 
85
85
  ### Evaluating GATE-03: Voice Drift
86
86
 
87
- **Load:** `.marketing/BRAND.md` (Tier 2 full -- voice archetype and banned words sections)
87
+ **Load:** `.taketomarket/BRAND.md` (Tier 2 full -- voice archetype and banned words sections)
88
88
  **Asset content:** Full asset text
89
89
 
90
90
  **Evaluate:**
@@ -99,7 +99,7 @@ If a check is N/A (e.g., UTM hygiene for an asset without links), record:
99
99
 
100
100
  ### Evaluating GATE-04: Outcome Alignment
101
101
 
102
- **Load:** `.marketing/CAMPAIGNS/<slug>/BRIEF.md` (outcome metric section)
102
+ **Load:** `.taketomarket/CAMPAIGNS/<slug>/BRIEF.md` (outcome metric section)
103
103
  **Asset content:** Full asset text
104
104
 
105
105
  **Evaluate:**
@@ -113,7 +113,7 @@ If a check is N/A (e.g., UTM hygiene for an asset without links), record:
113
113
 
114
114
  ### Evaluating GATE-05: Funnel Integrity
115
115
 
116
- **Load:** `.marketing/CAMPAIGNS/<slug>/BRIEF.md` (funnel/CTA section)
116
+ **Load:** `.taketomarket/CAMPAIGNS/<slug>/BRIEF.md` (funnel/CTA section)
117
117
  **Asset content:** Full asset text
118
118
 
119
119
  **Evaluate:**
@@ -128,7 +128,7 @@ If a check is N/A (e.g., UTM hygiene for an asset without links), record:
128
128
 
129
129
  ### Evaluating GATE-06: UTM Hygiene
130
130
 
131
- **Load:** `.marketing/CHANNELS.md` (UTM schema section)
131
+ **Load:** `.taketomarket/CHANNELS.md` (UTM schema section)
132
132
  **Asset content:** Full asset text
133
133
 
134
134
  **Evaluate:**
@@ -158,7 +158,7 @@ If a check is N/A (e.g., UTM hygiene for an asset without links), record:
158
158
 
159
159
  ### Evaluating GATE-08: Competitor Collision
160
160
 
161
- **Load:** `.marketing/COMPETITORS.md` (Tier 2 full)
161
+ **Load:** `.taketomarket/COMPETITORS.md` (Tier 2 full)
162
162
  **Asset content:** Full asset text
163
163
 
164
164
  **Evaluate:**
@@ -173,7 +173,7 @@ If a check is N/A (e.g., UTM hygiene for an asset without links), record:
173
173
 
174
174
  ### Evaluating GATE-09: ICP Fit
175
175
 
176
- **Load:** `.marketing/ICP.md` (Tier 2 full)
176
+ **Load:** `.taketomarket/ICP.md` (Tier 2 full)
177
177
  **Asset content:** Full asset text
178
178
 
179
179
  **Evaluate:**
package/install.js CHANGED
@@ -159,7 +159,7 @@ async function promptRuntimeSelection(args, homeDir = os.homedir()) {
159
159
  if (choices === null) {
160
160
  rl.close();
161
161
  console.error('Invalid input after 2 attempts. Exiting.');
162
- console.log('Something went wrong? File an issue: https://github.com/ranjanrishikesh/takeToMarket/issues');
162
+ console.log('Something went wrong? File an issue: https://github.com/ranjanrishikesh/taketomarket/issues');
163
163
  process.exit(1);
164
164
  }
165
165
 
@@ -282,6 +282,36 @@ function copyDirSync(src, dest) {
282
282
  const PACKAGE_BASE_DIRS = ['workflows', 'templates', 'references', 'playbooks', 'gates', 'bin', 'agents'];
283
283
  const PACKAGE_BASE_FILES = ['settings.json', 'package.json'];
284
284
 
285
+ /**
286
+ * Classify how this installer was invoked so /ttm-update can pick the right upgrade path later.
287
+ * Returns 'clone' if the source tree is a git checkout, 'npm' if it lives inside node_modules
288
+ * or the npm cache, 'plugin' if it's the Claude Code plugin cache, else 'unknown'.
289
+ * @param {string} packageRoot
290
+ * @returns {'clone'|'npm'|'plugin'|'unknown'}
291
+ */
292
+ function classifyInstallMethod(packageRoot) {
293
+ if (dirExists(path.join(packageRoot, '.git'))) return 'clone';
294
+ if (packageRoot.includes(path.sep + 'node_modules' + path.sep)) return 'npm';
295
+ if (packageRoot.includes(path.sep + '.npm' + path.sep)) return 'npm';
296
+ if (packageRoot.includes(path.sep + 'claude-plugins-official' + path.sep)) return 'plugin';
297
+ return 'unknown';
298
+ }
299
+
300
+ /**
301
+ * Write the install-method sentinel so /ttm-update can read it without re-deriving from copied files.
302
+ * @param {string} destDir - ~/.taketomarket/
303
+ * @param {string} packageRoot
304
+ */
305
+ function writeInstallSentinel(destDir, packageRoot) {
306
+ const sentinel = {
307
+ method: classifyInstallMethod(packageRoot),
308
+ source: packageRoot,
309
+ version: VERSION,
310
+ installed_at: new Date().toISOString(),
311
+ };
312
+ fs.writeFileSync(path.join(destDir, '.install-method'), JSON.stringify(sentinel, null, 2) + '\n');
313
+ }
314
+
285
315
  /**
286
316
  * Copy non-skill package files to ~/.taketomarket/ (shared across all runtimes).
287
317
  * @param {string} packageRoot - Source npm package root
@@ -304,6 +334,8 @@ function copyPackageBase(packageRoot, homeDir = os.homedir()) {
304
334
  fs.copyFileSync(src, path.join(dest, file));
305
335
  }
306
336
  }
337
+
338
+ writeInstallSentinel(dest, packageRoot);
307
339
  }
308
340
 
309
341
  /**
@@ -706,7 +738,7 @@ Options:
706
738
  console.log(` ${f.target.label}: ${f.reason}`);
707
739
  }
708
740
  console.log('');
709
- console.log('Something went wrong? File an issue: https://github.com/ranjanrishikesh/takeToMarket/issues');
741
+ console.log('Something went wrong? File an issue: https://github.com/ranjanrishikesh/taketomarket/issues');
710
742
  }
711
743
 
712
744
  process.exit(failures.length === results.length ? 1 : 0);
@@ -727,7 +759,7 @@ function printResults(results) {
727
759
  if (require.main === module) {
728
760
  main().catch(err => {
729
761
  console.error(`Fatal: ${err.message}`);
730
- console.log('Something went wrong? File an issue: https://github.com/ranjanrishikesh/takeToMarket/issues');
762
+ console.log('Something went wrong? File an issue: https://github.com/ranjanrishikesh/taketomarket/issues');
731
763
  process.exit(1);
732
764
  });
733
765
  }
@@ -755,5 +787,7 @@ module.exports = {
755
787
  printInstallSummary,
756
788
  copyPackageBase,
757
789
  installSkillsForRuntime,
790
+ classifyInstallMethod,
791
+ writeInstallSentinel,
758
792
  PACKAGE_ROOT,
759
793
  };
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "taketomarket",
3
- "version": "2.2.0",
4
- "description": "Marketing operating system for Claude Code. Spec-driven campaigns with positioning-as-invariant enforcement, quality gate walls, and compound learnings.",
3
+ "version": "2.3.0",
4
+ "description": "Marketing OS for developerneurs and solopreneurs. Built for engineers shipping products with zero marketing experience required. Spec-driven campaigns with positioning-as-invariant enforcement and quality gate walls.",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "git+https://github.com/ranjanrishikesh/takeToMarket.git"
8
+ "url": "git+https://github.com/ranjanrishikesh/taketomarket.git"
9
9
  },
10
- "homepage": "https://github.com/ranjanrishikesh/takeToMarket#readme",
10
+ "homepage": "https://github.com/ranjanrishikesh/taketomarket#readme",
11
11
  "bugs": {
12
- "url": "https://github.com/ranjanrishikesh/takeToMarket/issues"
12
+ "url": "https://github.com/ranjanrishikesh/taketomarket/issues"
13
13
  },
14
14
  "author": "Rishikesh Ranjan <59333266+ranjanrishikesh@users.noreply.github.com>",
15
15
  "bin": {
@@ -45,7 +45,11 @@
45
45
  "content-marketing",
46
46
  "marketing-automation",
47
47
  "ai-agents",
48
- "spec-driven"
48
+ "spec-driven",
49
+ "developerneurs",
50
+ "solopreneurs",
51
+ "engineers",
52
+ "indie-hackers"
49
53
  ],
50
54
  "engines": {
51
55
  "node": ">=18"