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.
- package/.claude-plugin/marketplace.json +4 -4
- package/.claude-plugin/plugin.json +2 -2
- package/README.md +34 -11
- package/bin/lib/campaign.cjs +12 -8
- package/bin/lib/codebase-scan.cjs +86 -0
- package/bin/lib/config.cjs +129 -0
- package/bin/lib/deploy.cjs +36 -0
- package/bin/lib/deviation.cjs +1 -1
- package/bin/lib/drift-log.cjs +4 -4
- package/bin/lib/health.cjs +32 -31
- package/bin/lib/install-detect.cjs +62 -0
- package/bin/lib/legacy-folder.cjs +100 -0
- package/bin/lib/playwright-check.cjs +26 -0
- package/bin/lib/site-location.cjs +22 -0
- package/bin/lib/state.cjs +3 -3
- package/bin/lib/svg-render.cjs +42 -0
- package/bin/ttm-tools.cjs +136 -4
- package/gates/base-gates.md +8 -8
- package/gates/gate-evaluation.md +8 -8
- package/install.js +37 -3
- package/package.json +10 -6
- package/playbooks/aeo.md +218 -114
- package/playbooks/affiliate.md +225 -160
- package/playbooks/email.md +236 -174
- package/playbooks/events.md +303 -213
- package/playbooks/landing-pages.md +305 -0
- package/playbooks/linkedin.md +264 -142
- package/playbooks/manifesto.md +322 -0
- package/playbooks/paid-ads.md +240 -189
- package/playbooks/positioning.md +340 -0
- package/playbooks/pr-media.md +308 -168
- package/playbooks/pseo.md +426 -0
- package/playbooks/seo.md +251 -158
- package/playbooks/social.md +253 -182
- package/playbooks/youtube.md +286 -181
- package/references/brand-color-theory.md +48 -0
- package/references/codex-image-gen-research.md +58 -0
- package/references/context-loading.md +6 -6
- package/references/humanizer-patterns.md +433 -0
- package/references/inline-education-blurbs.md +461 -0
- package/references/landing-page-anatomy.md +64 -0
- package/references/linkedin-post-patterns.md +174 -0
- package/references/logo-design-principles.md +55 -0
- package/references/meta-gate-evaluation.md +3 -3
- package/references/obra-superpowers-conventions.md +170 -0
- package/references/playbook-leaders.md +472 -0
- package/references/playwright-mcp-setup.md +164 -0
- package/references/positioning-check-report.md +2 -2
- package/references/pseo-page-anatomy.md +56 -0
- package/references/pseo-templates/alternative-anatomy.md +31 -0
- package/references/pseo-templates/alternative-content-playbook.md +32 -0
- package/references/pseo-templates/blog-anatomy.md +28 -0
- package/references/pseo-templates/blog-content-playbook.md +36 -0
- package/references/pseo-templates/comparison-anatomy.md +29 -0
- package/references/pseo-templates/comparison-content-playbook.md +35 -0
- package/references/pseo-templates/use-case-anatomy.md +28 -0
- package/references/pseo-templates/use-case-content-playbook.md +30 -0
- package/skills/ttm-101/SKILL.md +25 -0
- package/skills/ttm-aeo-check/SKILL.md +17 -12
- package/skills/ttm-affiliate-kit/SKILL.md +5 -0
- package/skills/ttm-archive/SKILL.md +5 -0
- package/skills/ttm-brand-refresh/SKILL.md +5 -0
- package/skills/ttm-brief/SKILL.md +5 -0
- package/skills/ttm-competitor-scan/SKILL.md +5 -0
- package/skills/ttm-deploy/SKILL.md +22 -0
- package/skills/ttm-discover/SKILL.md +17 -0
- package/skills/ttm-email-check/SKILL.md +17 -0
- package/skills/ttm-email-preflight/SKILL.md +17 -11
- package/skills/ttm-fix/SKILL.md +5 -0
- package/skills/ttm-health/SKILL.md +6 -1
- package/skills/ttm-humanize/SKILL.md +33 -0
- package/skills/ttm-icp-refresh/SKILL.md +5 -0
- package/skills/ttm-improve-skill/SKILL.md +18 -0
- package/skills/ttm-init/SKILL.md +10 -3
- package/skills/ttm-keyword-map/SKILL.md +17 -11
- package/skills/ttm-landing/SKILL.md +19 -0
- package/skills/ttm-learn/SKILL.md +5 -0
- package/skills/ttm-linkedin-post/SKILL.md +26 -0
- package/skills/ttm-measure/SKILL.md +5 -0
- package/skills/ttm-new-campaign/SKILL.md +5 -0
- package/skills/ttm-next/SKILL.md +5 -0
- package/skills/ttm-playwright-setup/SKILL.md +18 -0
- package/skills/ttm-positioning-check/SKILL.md +5 -0
- package/skills/ttm-positioning-shift/SKILL.md +5 -0
- package/skills/ttm-produce/SKILL.md +5 -0
- package/skills/ttm-pseo/SKILL.md +26 -0
- package/skills/ttm-repurpose/SKILL.md +5 -0
- package/skills/ttm-request-skill/SKILL.md +18 -0
- package/skills/ttm-research/SKILL.md +18 -6
- package/skills/ttm-resume/SKILL.md +5 -0
- package/skills/ttm-review/SKILL.md +5 -0
- package/skills/ttm-seo/SKILL.md +64 -0
- package/skills/ttm-seo-audit/SKILL.md +17 -12
- package/skills/ttm-ship/SKILL.md +5 -0
- package/skills/ttm-state/SKILL.md +5 -0
- package/skills/ttm-update/SKILL.md +152 -4
- package/skills/ttm-verify/SKILL.md +5 -0
- package/templates/agents-md.md +14 -4
- package/templates/campaign-research.md +6 -6
- package/templates/campaign-state.md +1 -1
- package/templates/claude-md.md +14 -4
- package/templates/linkedin-base-template.md +48 -0
- package/templates/next-step-footer.md +13 -0
- package/templates/production-manifest.json +4 -4
- package/templates/pseo/alternative-cms-schema.json +65 -0
- package/templates/pseo/blog-cms-schema.json +55 -0
- package/templates/pseo/comparison-cms-schema.json +56 -0
- package/templates/pseo/use-case-cms-schema.json +62 -0
- package/templates/reference-files/brand.md +51 -0
- package/templates/reference-files/product-dna.md +73 -0
- package/templates/site-scaffold/app/globals.css +2 -0
- package/templates/site-scaffold/app/layout.tsx +17 -0
- package/templates/site-scaffold/app/page.tsx +33 -0
- package/templates/site-scaffold/app/robots.ts +8 -0
- package/templates/site-scaffold/app/sitemap.ts +10 -0
- package/templates/site-scaffold/app/tokens.css +21 -0
- package/templates/site-scaffold/components/Comparison.tsx +14 -0
- package/templates/site-scaffold/components/Faq.tsx +14 -0
- package/templates/site-scaffold/components/Features.tsx +14 -0
- package/templates/site-scaffold/components/FinalCta.tsx +17 -0
- package/templates/site-scaffold/components/Footer.tsx +12 -0
- package/templates/site-scaffold/components/Hero.tsx +22 -0
- package/templates/site-scaffold/components/HowItWorks.tsx +14 -0
- package/templates/site-scaffold/components/PricingTeaser.tsx +14 -0
- package/templates/site-scaffold/components/Problem.tsx +14 -0
- package/templates/site-scaffold/components/SocialProof.tsx +14 -0
- package/templates/site-scaffold/components/Solution.tsx +14 -0
- package/templates/site-scaffold/components/Testimonials.tsx +14 -0
- package/templates/site-scaffold/components/UseCases.tsx +14 -0
- package/templates/site-scaffold/content/.gitkeep +0 -0
- package/templates/site-scaffold/lib/.gitkeep +0 -0
- package/templates/site-scaffold/next.config.mjs +10 -0
- package/templates/site-scaffold/package.json +25 -0
- package/templates/site-scaffold/postcss.config.mjs +3 -0
- package/templates/site-scaffold/public/llms.txt +9 -0
- package/templates/site-scaffold/tsconfig.json +21 -0
- package/templates/verification-report.md +1 -1
- package/workflows/channel/linkedin-post.md +178 -0
- package/workflows/discipline/affiliate-kit.md +65 -6
- package/workflows/discipline/{email-preflight.md → email-check.md} +39 -4
- package/workflows/discipline/repurpose.md +82 -31
- package/workflows/discipline/{aeo-check.md → seo/aeo.md} +13 -6
- package/workflows/discipline/{seo-audit.md → seo/audit.md} +13 -6
- package/workflows/discipline/{keyword-map.md → seo/keyword-map.md} +13 -6
- package/workflows/education/ttm-101.md +114 -0
- package/workflows/lifecycle/brief-positioning-check.md +1 -1
- package/workflows/lifecycle/brief.md +64 -28
- package/workflows/lifecycle/{research.md → discover.md} +61 -19
- package/workflows/lifecycle/fix.md +72 -37
- package/workflows/lifecycle/humanize.md +280 -0
- package/workflows/lifecycle/learn.md +72 -35
- package/workflows/lifecycle/measure.md +54 -18
- package/workflows/lifecycle/produce.md +88 -37
- package/workflows/lifecycle/review.md +71 -25
- package/workflows/lifecycle/ship.md +62 -18
- package/workflows/lifecycle/verify.md +72 -26
- package/workflows/reference-mgmt/brand-refresh.md +50 -13
- package/workflows/reference-mgmt/competitor-scan.md +51 -15
- package/workflows/reference-mgmt/icp-refresh.md +48 -12
- package/workflows/reference-mgmt/positioning-check.md +55 -20
- package/workflows/reference-mgmt/positioning-shift.md +53 -17
- package/workflows/setup/init-brand-colors.md +75 -0
- package/workflows/setup/init-logo.md +113 -0
- package/workflows/setup/init-product-dna.md +83 -0
- package/workflows/setup/init-questions.md +166 -30
- package/workflows/setup/init-validation.md +22 -0
- package/workflows/setup/init.md +144 -39
- package/workflows/setup/new-campaign.md +48 -12
- package/workflows/site/deploy.md +98 -0
- package/workflows/site/landing.md +156 -0
- package/workflows/site/pseo.md +96 -0
- package/workflows/site/quality-gates.md +88 -0
- package/workflows/utility/archive.md +45 -9
- package/workflows/utility/health.md +77 -3
- package/workflows/utility/improve-skill.md +233 -0
- package/workflows/utility/next.md +38 -2
- package/workflows/utility/playwright-setup.md +128 -0
- package/workflows/utility/request-skill.md +218 -0
- package/workflows/utility/resume.md +40 -3
- 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 .
|
|
15
|
-
* state <read|update> Read or update .
|
|
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 .
|
|
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
|
}
|
package/gates/base-gates.md
CHANGED
|
@@ -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:** `.
|
|
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:** `.
|
|
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:** `.
|
|
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:** `.
|
|
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:** `.
|
|
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:** `.
|
|
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:** `.
|
|
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:** `.
|
|
205
|
+
**Against:** `.taketomarket/ICP.md`
|
|
206
206
|
|
|
207
207
|
### Evaluation Criteria
|
|
208
208
|
|
package/gates/gate-evaluation.md
CHANGED
|
@@ -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:** `.
|
|
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:** `.
|
|
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:** `.
|
|
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:** `.
|
|
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:** `.
|
|
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:** `.
|
|
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:** `.
|
|
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:** `.
|
|
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/
|
|
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/
|
|
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/
|
|
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.
|
|
4
|
-
"description": "Marketing
|
|
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/
|
|
8
|
+
"url": "git+https://github.com/ranjanrishikesh/taketomarket.git"
|
|
9
9
|
},
|
|
10
|
-
"homepage": "https://github.com/ranjanrishikesh/
|
|
10
|
+
"homepage": "https://github.com/ranjanrishikesh/taketomarket#readme",
|
|
11
11
|
"bugs": {
|
|
12
|
-
"url": "https://github.com/ranjanrishikesh/
|
|
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"
|