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
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# pSEO Workflow
|
|
2
|
+
|
|
3
|
+
## Step 0: First-run inline education
|
|
4
|
+
|
|
5
|
+
Read `.taketomarket/CONFIG.md`. Parse `first_run_seen` (object) and `inline_education` (boolean, default true).
|
|
6
|
+
|
|
7
|
+
If `inline_education` is false: skip this step. Else if `first_run_seen.ttm-pseo` is not `true`, print the explainer below verbatim, then mark this skill as seen:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" first-run mark ttm-pseo
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Use this exact check (bash) to decide whether to print: `node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" first-run check ttm-pseo --raw` -- the JSON `seen` field is `true` once the explainer has run before.
|
|
14
|
+
|
|
15
|
+
### Explainer for `/ttm-pseo`
|
|
16
|
+
|
|
17
|
+
`/ttm-pseo` is programmatic SEO: given a template and a dataset
|
|
18
|
+
(competitors-vs-you, alternatives, integrations, etc.), it generates
|
|
19
|
+
N landing pages with consistent positioning across all of them. Each
|
|
20
|
+
page passes the same gate wall as a single landing page, but in bulk.
|
|
21
|
+
|
|
22
|
+
Why it matters: pSEO is one of the few SEO plays still worth running
|
|
23
|
+
in the AI-search era because the long tail of "X vs Y" queries doesn't
|
|
24
|
+
get cannibalized as quickly. The catch is that ungoverned pSEO produces
|
|
25
|
+
thousands of near-duplicate, positioning-drifted pages. The gate wall
|
|
26
|
+
is what makes pSEO defensible at scale.
|
|
27
|
+
|
|
28
|
+
(Canonical source: `references/inline-education-blurbs.md`. Embedded verbatim because workflows do not @-resolve files at runtime.)
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
**Required reading:**
|
|
33
|
+
- `${CLAUDE_PLUGIN_ROOT}/references/pseo-page-anatomy.md`
|
|
34
|
+
- `${CLAUDE_PLUGIN_ROOT}/references/pseo-templates/[template]-anatomy.md`
|
|
35
|
+
- `${CLAUDE_PLUGIN_ROOT}/references/pseo-templates/[template]-content-playbook.md`
|
|
36
|
+
- `${CLAUDE_PLUGIN_ROOT}/templates/pseo/[template]-cms-schema.json`
|
|
37
|
+
- `${CLAUDE_PLUGIN_ROOT}/playbooks/pseo.md` (delivered in P6)
|
|
38
|
+
- `.taketomarket/POSITIONING.md`, `BRAND.md`, `PRODUCT-DNA.md`, `ICP.md`
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Step 1: Verify /ttm-landing is run
|
|
43
|
+
|
|
44
|
+
Read `.taketomarket/CONFIG.md` for `landing_path`. If not set: print "Run /ttm-landing first" and exit.
|
|
45
|
+
|
|
46
|
+
## Step 2: Parse args
|
|
47
|
+
|
|
48
|
+
`<template>` must be one of: blog, use-case, comparison, alternative.
|
|
49
|
+
`<sub>` is either `new`, `from-json`, or `list`.
|
|
50
|
+
|
|
51
|
+
## Step 3 (new): Generate one page
|
|
52
|
+
|
|
53
|
+
Read appropriate anatomy + content playbook + CMS schema.
|
|
54
|
+
|
|
55
|
+
AskUserQuestion to gather CMS-schema-required fields, or:
|
|
56
|
+
- For blog: title, tldr, key sections (h2 list), takeaways, FAQ.
|
|
57
|
+
- For use-case: useCase name, problem, feature pillars, walkthrough steps.
|
|
58
|
+
- For comparison: competitor, comparison table rows, when-we-win, when-they-win.
|
|
59
|
+
- For alternative: competitor, why-people-leave, why-we-are-alternative, migration steps.
|
|
60
|
+
|
|
61
|
+
Validate against CMS schema. If invalid: prompt to fix.
|
|
62
|
+
|
|
63
|
+
Generate page using content playbook guidance.
|
|
64
|
+
|
|
65
|
+
Render as Next.js page at `[landing_path]/app/[route]/[slug]/page.tsx`:
|
|
66
|
+
- `/blog/[slug]` for blog
|
|
67
|
+
- `/use-cases/[slug]` for use-case
|
|
68
|
+
- `/vs/[slug]` for comparison
|
|
69
|
+
- `/alternatives/[slug]` for alternative
|
|
70
|
+
|
|
71
|
+
Include Schema.org markup (Article + FAQPage + BreadcrumbList).
|
|
72
|
+
|
|
73
|
+
Mandatory humanize step on the generated copy.
|
|
74
|
+
|
|
75
|
+
Update `sitemap.ts` and `public/llms.txt` to include new route.
|
|
76
|
+
|
|
77
|
+
## Step 4 (from-json): Batch generate
|
|
78
|
+
|
|
79
|
+
Parse JSON file. Validate each entry against schema. For each: same as Step 3 but skip user-question phase.
|
|
80
|
+
|
|
81
|
+
## Step 5 (list): Just enumerate
|
|
82
|
+
|
|
83
|
+
List all existing pSEO routes by scanning `[landing_path]/app/{blog,use-cases,vs,alternatives}/`.
|
|
84
|
+
|
|
85
|
+
## Step 6: Quality gates
|
|
86
|
+
|
|
87
|
+
Run gates from quality-gates.md on each new page.
|
|
88
|
+
|
|
89
|
+
## Step 7: Print next steps
|
|
90
|
+
|
|
91
|
+
## What if this doesn't fit?
|
|
92
|
+
|
|
93
|
+
Looks like /ttm-pseo can't do that yet.
|
|
94
|
+
|
|
95
|
+
- Want a new skill? /ttm-request-skill
|
|
96
|
+
- Existing skill needs work? /ttm-improve-skill
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Landing Quality Gates
|
|
2
|
+
|
|
3
|
+
Called by `/ttm-landing`, `/ttm-pseo`, `/ttm-review`, `/ttm-verify` for landing/pSEO assets.
|
|
4
|
+
|
|
5
|
+
## Gate 1: Positioning integrity
|
|
6
|
+
|
|
7
|
+
For each generated HTML/TSX file:
|
|
8
|
+
1. Extract visible text (strip tags).
|
|
9
|
+
2. Confirm POSITIONING.md primary differentiator is present (or its key phrasing).
|
|
10
|
+
3. Confirm no banned words from BRAND.md `## Banned words`.
|
|
11
|
+
4. Confirm no must-not-say from POSITIONING.md.
|
|
12
|
+
|
|
13
|
+
Fail any file that violates.
|
|
14
|
+
|
|
15
|
+
## Gate 2: Schema.org markup
|
|
16
|
+
|
|
17
|
+
For each page file:
|
|
18
|
+
1. Confirm a `<script type="application/ld+json">` block exists.
|
|
19
|
+
2. Parse the JSON-LD.
|
|
20
|
+
3. Validate against expected schema type (Article, Product, FAQPage, etc.).
|
|
21
|
+
|
|
22
|
+
## Gate 3: Performance budget (Playwright)
|
|
23
|
+
|
|
24
|
+
Requires Playwright MCP. Check before running:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
node ${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs playwright-check --raw
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
If not detected: skip with WARN (don't fail). Otherwise:
|
|
31
|
+
|
|
32
|
+
For each deployed landing/pSEO URL (from CONFIG.md `last_deploy_url`):
|
|
33
|
+
1. Use Playwright MCP to run a Lighthouse audit at the URL.
|
|
34
|
+
2. Extract LCP, CLS, INP from the report.
|
|
35
|
+
3. Compare against budget:
|
|
36
|
+
- LCP < 2.5s → PASS, else FAIL.
|
|
37
|
+
- CLS < 0.1 → PASS, else FAIL.
|
|
38
|
+
- INP < 200ms → PASS, else FAIL.
|
|
39
|
+
|
|
40
|
+
Output:
|
|
41
|
+
```
|
|
42
|
+
[PASS|FAIL] Gate 3: Performance
|
|
43
|
+
LCP: 1.8s [PASS]
|
|
44
|
+
CLS: 0.05 [PASS]
|
|
45
|
+
INP: 150ms [PASS]
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Gate 4: Mobile responsiveness (Playwright)
|
|
49
|
+
|
|
50
|
+
Requires Playwright MCP. If not detected: skip with WARN.
|
|
51
|
+
|
|
52
|
+
For each deployed URL:
|
|
53
|
+
1. Take screenshots at 375px (mobile), 768px (tablet), 1024px (laptop), 1440px (desktop).
|
|
54
|
+
2. AI vision review each screenshot:
|
|
55
|
+
- No horizontal scroll on mobile.
|
|
56
|
+
- All CTAs visible without scroll on desktop above-fold.
|
|
57
|
+
- Text legible at smallest viewport.
|
|
58
|
+
- No clipped images or overflowing buttons.
|
|
59
|
+
3. Score each viewport PASS/FAIL.
|
|
60
|
+
|
|
61
|
+
Output:
|
|
62
|
+
```
|
|
63
|
+
[PASS|FAIL] Gate 4: Mobile responsiveness
|
|
64
|
+
375px: PASS
|
|
65
|
+
768px: PASS
|
|
66
|
+
1024px: PASS
|
|
67
|
+
1440px: PASS
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Gate 5: Internal linking
|
|
71
|
+
|
|
72
|
+
For each pSEO page:
|
|
73
|
+
- Confirm at least 3 internal links to other pSEO or top-level pages.
|
|
74
|
+
- Confirm at least 1-2 external links to authoritative sources.
|
|
75
|
+
|
|
76
|
+
## Gate 6: llms.txt
|
|
77
|
+
|
|
78
|
+
Confirm `public/llms.txt` has been updated to reflect the new route(s).
|
|
79
|
+
|
|
80
|
+
## Gate result format
|
|
81
|
+
|
|
82
|
+
For each gate, output:
|
|
83
|
+
```
|
|
84
|
+
[PASS|FAIL] Gate N: <name>
|
|
85
|
+
Details: <message>
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
If any FAIL: route caller to /ttm-fix with the gate output as context.
|
|
@@ -1,3 +1,32 @@
|
|
|
1
|
+
## Step 0: First-run inline education
|
|
2
|
+
|
|
3
|
+
Read `.taketomarket/CONFIG.md`. Parse `first_run_seen` (object) and `inline_education` (boolean, default true).
|
|
4
|
+
|
|
5
|
+
If `inline_education` is false: skip this step. Else if `first_run_seen.ttm-archive` is not `true`, print the explainer below verbatim, then mark this skill as seen:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" first-run mark ttm-archive
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Use this exact check (bash) to decide whether to print: `node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" first-run check ttm-archive --raw` -- the JSON `seen` field is `true` once the explainer has run before.
|
|
12
|
+
|
|
13
|
+
### Explainer for `/ttm-archive`
|
|
14
|
+
|
|
15
|
+
`/ttm-archive` moves a finished campaign out of the active set into
|
|
16
|
+
`.taketomarket/archive/`. It freezes STATE.md, preserves the gate
|
|
17
|
+
results and ship records, and removes the campaign from the
|
|
18
|
+
`/ttm-next` queue. Archived campaigns still feed `/ttm-learn`.
|
|
19
|
+
|
|
20
|
+
Why it matters: campaigns that should be done but stay marked active
|
|
21
|
+
pollute scheduling and waste cognitive budget every time you run
|
|
22
|
+
`/ttm-state`. Archive is the marketing equivalent of merging and
|
|
23
|
+
deleting a branch -- the work is preserved, but it's out of your
|
|
24
|
+
active workspace.
|
|
25
|
+
|
|
26
|
+
(Canonical source: `references/inline-education-blurbs.md`. Embedded verbatim because workflows do not @-resolve files at runtime.)
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
1
30
|
<purpose>
|
|
2
31
|
Archive workflow for /ttm-archive. Validates campaign is shipped or learned (only
|
|
3
32
|
shipped or learned campaigns can be archived per D-08), extracts structured learnings from campaign
|
|
@@ -17,7 +46,7 @@ as cautionary records (D-08).
|
|
|
17
46
|
<constraints>
|
|
18
47
|
## POSITIONING.md is READ-ONLY
|
|
19
48
|
|
|
20
|
-
**Do NOT modify `.
|
|
49
|
+
**Do NOT modify `.taketomarket/POSITIONING.md` during this workflow.**
|
|
21
50
|
|
|
22
51
|
POSITIONING.md is an architectural invariant. If you detect positioning drift:
|
|
23
52
|
- In verify: use the Escalate option to launch /ttm-positioning-shift
|
|
@@ -124,9 +153,9 @@ Following the learnings-extraction.md reference guide, scan campaign artifacts.
|
|
|
124
153
|
|
|
125
154
|
**Read these files from the campaign directory:**
|
|
126
155
|
|
|
127
|
-
1. `.
|
|
128
|
-
2. `.
|
|
129
|
-
3. `.
|
|
156
|
+
1. `.taketomarket/CAMPAIGNS/${SLUG}/STATE.md` (full file -- frontmatter and body)
|
|
157
|
+
2. `.taketomarket/CAMPAIGNS/${SLUG}/MANIFEST.json` (if exists -- per-asset gate results)
|
|
158
|
+
3. `.taketomarket/CAMPAIGNS/${SLUG}/BRIEF.md` (if exists -- original strategy)
|
|
130
159
|
4. `VERIFICATION.md` in the campaign directory (gate details)
|
|
131
160
|
5. Any `FIX-BRIEF-*.md` files (fix attempts and outcomes)
|
|
132
161
|
6. Any `REVIEW-FEEDBACK-*.md` files (human review feedback)
|
|
@@ -242,7 +271,7 @@ If the command returns an error:
|
|
|
242
271
|
- Exit with the error context
|
|
243
272
|
|
|
244
273
|
The CLI command handles:
|
|
245
|
-
- Moving the campaign directory to `.
|
|
274
|
+
- Moving the campaign directory to `.taketomarket/CAMPAIGNS/ARCHIVE/${SLUG}/`
|
|
246
275
|
- Updating the campaign state to "archived"
|
|
247
276
|
- Validating the campaign is in "shipped" or "learned" phase before allowing archive
|
|
248
277
|
|
|
@@ -258,7 +287,7 @@ takeToMarket > UPDATING LEARNINGS
|
|
|
258
287
|
The campaign is now in ARCHIVE/ with phase set to "archived". Writing learnings after
|
|
259
288
|
archive confirmation prevents data-loss on retry (duplicate rows) if archive were to fail.
|
|
260
289
|
|
|
261
|
-
Read `.
|
|
290
|
+
Read `.taketomarket/LEARNINGS.md`.
|
|
262
291
|
|
|
263
292
|
**Duplicate guard:** Before inserting rows, scan existing LEARNINGS.md content for
|
|
264
293
|
any row containing `| ${SLUG} |` with today's date. If matching rows already exist
|
|
@@ -305,7 +334,7 @@ Display completion summary:
|
|
|
305
334
|
|------|----------|----------|--------|-------------|
|
|
306
335
|
${extracted_rows}
|
|
307
336
|
|
|
308
|
-
Campaign directory moved to `.
|
|
337
|
+
Campaign directory moved to `.taketomarket/CAMPAIGNS/ARCHIVE/${SLUG}/`
|
|
309
338
|
|
|
310
339
|
### Next Steps
|
|
311
340
|
- Lessons are now available in LEARNINGS.md for future campaigns
|
|
@@ -329,6 +358,13 @@ Campaign directory moved to `.marketing/CAMPAIGNS/ARCHIVE/${SLUG}/`
|
|
|
329
358
|
</success_criteria>
|
|
330
359
|
|
|
331
360
|
<output>
|
|
332
|
-
- `.
|
|
333
|
-
- `.
|
|
361
|
+
- `.taketomarket/LEARNINGS.md` (updated with extracted lessons)
|
|
362
|
+
- `.taketomarket/CAMPAIGNS/ARCHIVE/${SLUG}/STATE.md` (phase set to archived, via CLI)
|
|
334
363
|
</output>
|
|
364
|
+
|
|
365
|
+
## What if this doesn't fit?
|
|
366
|
+
|
|
367
|
+
Looks like /ttm-archive can't do that yet.
|
|
368
|
+
|
|
369
|
+
- Want a new skill? /ttm-request-skill
|
|
370
|
+
- Existing skill needs work? /ttm-improve-skill
|
|
@@ -1,5 +1,35 @@
|
|
|
1
|
+
## Step 0: First-run inline education
|
|
2
|
+
|
|
3
|
+
Read `.taketomarket/CONFIG.md`. Parse `first_run_seen` (object) and `inline_education` (boolean, default true).
|
|
4
|
+
|
|
5
|
+
If `inline_education` is false: skip this step. Else if `first_run_seen.ttm-health` is not `true`, print the explainer below verbatim, then mark this skill as seen:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" first-run mark ttm-health
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Use this exact check (bash) to decide whether to print: `node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" first-run check ttm-health --raw` -- the JSON `seen` field is `true` once the explainer has run before.
|
|
12
|
+
|
|
13
|
+
### Explainer for `/ttm-health`
|
|
14
|
+
|
|
15
|
+
`/ttm-health` audits the integrity of your `.taketomarket/` directory.
|
|
16
|
+
It checks that reference files exist and aren't suspiciously empty,
|
|
17
|
+
flags stale references, validates per-campaign STATE.md against the
|
|
18
|
+
file system, surfaces DRIFT-LOG anomalies, and reports gate-result
|
|
19
|
+
inconsistencies. It only reports -- it does not self-heal.
|
|
20
|
+
|
|
21
|
+
Why it matters: state corruption in a long-running multi-campaign
|
|
22
|
+
project is silent until something breaks. Running health periodically
|
|
23
|
+
(or letting it auto-trigger on detected issues) catches drift like a
|
|
24
|
+
filesystem fsck -- before it forces a manual rebuild of a campaign's
|
|
25
|
+
state.
|
|
26
|
+
|
|
27
|
+
(Canonical source: `references/inline-education-blurbs.md`. Embedded verbatim because workflows do not @-resolve files at runtime.)
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
1
31
|
<purpose>
|
|
2
|
-
Health audit workflow for /ttm-health. Validates .
|
|
32
|
+
Health audit workflow for /ttm-health. Validates .taketomarket/ directory integrity,
|
|
3
33
|
reference file completeness, per-campaign state consistency, reference file staleness,
|
|
4
34
|
campaign velocity, DRIFT-LOG integrity, and gate result consistency. Reports text
|
|
5
35
|
output with pass/warn/fail per check category. Does NOT self-heal -- only reports.
|
|
@@ -12,7 +42,7 @@ output with pass/warn/fail per check category. Does NOT self-heal -- only report
|
|
|
12
42
|
<constraints>
|
|
13
43
|
## POSITIONING.md is READ-ONLY
|
|
14
44
|
|
|
15
|
-
**Do NOT modify `.
|
|
45
|
+
**Do NOT modify `.taketomarket/POSITIONING.md` during this workflow.**
|
|
16
46
|
|
|
17
47
|
POSITIONING.md is an architectural invariant. If you detect positioning drift:
|
|
18
48
|
- In verify: use the Escalate option to launch /ttm-positioning-shift
|
|
@@ -29,6 +59,43 @@ commands or manual actions the user should take.
|
|
|
29
59
|
|
|
30
60
|
<process>
|
|
31
61
|
|
|
62
|
+
## Step: Legacy folder check
|
|
63
|
+
|
|
64
|
+
Before running the main audit, detect whether the project still uses the legacy
|
|
65
|
+
`.marketing/` state directory and offer migration to the canonical `.taketomarket/`.
|
|
66
|
+
|
|
67
|
+
Run the legacy-folder check:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" legacy-folder check --raw
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Parse the JSON `state` field:
|
|
74
|
+
|
|
75
|
+
- **legacy**: print `WARN: Legacy '.marketing/' folder detected. Migration will rename it to '.taketomarket/'. Recommend committing or backing up first (the rename is fast but not reversible from inside the workflow).` Then use `AskUserQuestion`:
|
|
76
|
+
- question: "Migrate `.marketing/` to `.taketomarket/` now?"
|
|
77
|
+
- options: "Yes, migrate now" / "Skip for now"
|
|
78
|
+
- On Yes:
|
|
79
|
+
```bash
|
|
80
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" legacy-folder migrate --raw
|
|
81
|
+
```
|
|
82
|
+
Then verify `.taketomarket/` exists.
|
|
83
|
+
- On Skip: continue to Step 1 with a note that the audit will report `.marketing/` paths.
|
|
84
|
+
- **conflict**: print the error below, then halt the workflow:
|
|
85
|
+
```
|
|
86
|
+
ERROR: Both .marketing/ and .taketomarket/ exist. Manual resolution required.
|
|
87
|
+
|
|
88
|
+
To resolve:
|
|
89
|
+
1. Compare contents: diff -r .marketing .taketomarket
|
|
90
|
+
2. Merge any unique files from .marketing/ into .taketomarket/.
|
|
91
|
+
3. Once .taketomarket/ has everything you need, remove the legacy folder:
|
|
92
|
+
rm -rf .marketing
|
|
93
|
+
4. Re-run /ttm-health to confirm.
|
|
94
|
+
```
|
|
95
|
+
- **current** or **none**: continue silently to Step 1.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
32
99
|
## Step 1: Run Health Audit
|
|
33
100
|
|
|
34
101
|
```
|
|
@@ -80,7 +147,7 @@ Group checks by category based on their `name` prefix or type:
|
|
|
80
147
|
## Health Report
|
|
81
148
|
|
|
82
149
|
### Structural Integrity
|
|
83
|
-
[PASS] .
|
|
150
|
+
[PASS] .taketomarket/ directory exists
|
|
84
151
|
[PASS] CAMPAIGNS/ directory exists
|
|
85
152
|
[PASS] Required subdirectories present
|
|
86
153
|
|
|
@@ -164,3 +231,10 @@ All systems healthy. No action needed.
|
|
|
164
231
|
<output>
|
|
165
232
|
No files modified (diagnostic command).
|
|
166
233
|
</output>
|
|
234
|
+
|
|
235
|
+
## What if this doesn't fit?
|
|
236
|
+
|
|
237
|
+
Looks like /ttm-health can't do that yet.
|
|
238
|
+
|
|
239
|
+
- Want a new skill? /ttm-request-skill
|
|
240
|
+
- Existing skill needs work? /ttm-improve-skill
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
## Step 0: First-run inline education
|
|
2
|
+
|
|
3
|
+
Read `.taketomarket/CONFIG.md`. Parse `first_run_seen` (object) and `inline_education` (boolean, default true).
|
|
4
|
+
|
|
5
|
+
If `inline_education` is false: skip this step. Else if `first_run_seen.ttm-improve-skill` is not `true`, print the explainer below verbatim, then mark this skill as seen:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" first-run mark ttm-improve-skill
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Use this exact check (bash) to decide whether to print: `node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" first-run check ttm-improve-skill --raw` -- the JSON `seen` field is `true` once the explainer has run before.
|
|
12
|
+
|
|
13
|
+
### Explainer for `/ttm-improve-skill`
|
|
14
|
+
|
|
15
|
+
`/ttm-improve-skill` opens a feedback loop on a specific takeToMarket
|
|
16
|
+
skill. It diffs your last few invocations of a skill, asks what felt
|
|
17
|
+
wrong or missing, and either drafts a local skill override or files a
|
|
18
|
+
structured issue against the takeToMarket repo so the change can land
|
|
19
|
+
upstream.
|
|
20
|
+
|
|
21
|
+
Why it matters: takeToMarket is opinionated, which means it'll be
|
|
22
|
+
wrong about your context sometimes. This skill is the structured
|
|
23
|
+
escape hatch -- instead of fighting the skill in-conversation, you
|
|
24
|
+
record the friction, get a fix, and avoid that friction permanently.
|
|
25
|
+
Treat it like filing a linter rule exemption.
|
|
26
|
+
|
|
27
|
+
(Canonical source: `references/inline-education-blurbs.md`. Embedded verbatim because workflows do not @-resolve files at runtime.)
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
<purpose>
|
|
32
|
+
Skill improvement workflow for /ttm-improve-skill. Gathers details about an
|
|
33
|
+
EXISTING skill that needs changes and files a GitHub issue at
|
|
34
|
+
ranjanrishikesh/taketomarket. Prefers the `gh` CLI when installed and
|
|
35
|
+
authenticated; falls back to opening a pre-filled GitHub issue URL in the
|
|
36
|
+
browser.
|
|
37
|
+
</purpose>
|
|
38
|
+
|
|
39
|
+
<constraints>
|
|
40
|
+
## Read-Only on the Local Project
|
|
41
|
+
|
|
42
|
+
This workflow does NOT modify any files in the user's project. It only creates
|
|
43
|
+
a remote GitHub issue (via `gh`) or prints a URL for the user to open.
|
|
44
|
+
|
|
45
|
+
## Repo Identity
|
|
46
|
+
|
|
47
|
+
Always file issues at `ranjanrishikesh/taketomarket` (lowercase). Do not infer
|
|
48
|
+
a different repo from local git remotes.
|
|
49
|
+
|
|
50
|
+
## No Secrets in Issue Body
|
|
51
|
+
|
|
52
|
+
Do NOT include API keys, tokens, file paths containing credentials, or any
|
|
53
|
+
content from `.taketomarket/` reference files in the issue body. Only echo the
|
|
54
|
+
user's freeform answers verbatim.
|
|
55
|
+
</constraints>
|
|
56
|
+
|
|
57
|
+
<process>
|
|
58
|
+
|
|
59
|
+
## Step 1: Enumerate existing skills
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
takeToMarket > REPORT A SKILL IMPROVEMENT
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
List installed ttm-* skills so the user can pick one:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
ls -1 "${CLAUDE_PLUGIN_ROOT}/skills" | grep '^ttm-' | sort
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Present the list to the user.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Step 2: Gather details
|
|
76
|
+
|
|
77
|
+
Use `AskUserQuestion` (priority: critical) to collect:
|
|
78
|
+
|
|
79
|
+
1. **Which skill?** — "Which skill needs improvement?"
|
|
80
|
+
- `multiSelect` from the enumerated `ttm-*` skill list.
|
|
81
|
+
- Allow a freeform fallback in case the user wants to name a skill not yet
|
|
82
|
+
visible locally.
|
|
83
|
+
2. **What's not working?** — "What's not working with this skill?"
|
|
84
|
+
- Freeform, multi-line allowed.
|
|
85
|
+
3. **Expected behavior** — "What's the expected behavior?"
|
|
86
|
+
- Freeform, multi-line allowed.
|
|
87
|
+
4. **Steps to reproduce** — "Steps to reproduce (if a bug)."
|
|
88
|
+
- Freeform, multi-line allowed. Optional — accept an empty answer.
|
|
89
|
+
|
|
90
|
+
Store the answers as `WHICH_SKILL`, `NOT_WORKING`, `EXPECTED`, `REPRO_STEPS`.
|
|
91
|
+
|
|
92
|
+
If the user selected multiple skills, join them with `, ` for the issue title
|
|
93
|
+
and body.
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## Step 3: Detect gh CLI
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
GH_STATE="no-gh"
|
|
101
|
+
if command -v gh >/dev/null 2>&1; then
|
|
102
|
+
if gh auth status >/dev/null 2>&1; then
|
|
103
|
+
GH_STATE="gh-ready"
|
|
104
|
+
fi
|
|
105
|
+
fi
|
|
106
|
+
echo "$GH_STATE"
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
If `GH_STATE` is `gh-ready`, proceed to Step 4.
|
|
110
|
+
Otherwise, proceed to Step 5.
|
|
111
|
+
|
|
112
|
+
---
|
|
113
|
+
|
|
114
|
+
## Step 4: If gh-ready, file issue via gh CLI
|
|
115
|
+
|
|
116
|
+
Build the issue body from the gathered answers, then run:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
gh issue create \
|
|
120
|
+
--repo ranjanrishikesh/taketomarket \
|
|
121
|
+
--title "[Skill improvement] ${WHICH_SKILL}" \
|
|
122
|
+
--body "$(cat <<'EOF'
|
|
123
|
+
**Which skill:** ${WHICH_SKILL}
|
|
124
|
+
**What's not working:** ${NOT_WORKING}
|
|
125
|
+
**Expected behavior:** ${EXPECTED}
|
|
126
|
+
**Steps to reproduce:** ${REPRO_STEPS}
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
Filed via /ttm-improve-skill
|
|
130
|
+
EOF
|
|
131
|
+
)"
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
(Substitute the variables before passing to the heredoc — the heredoc above is
|
|
135
|
+
quoted to prevent shell expansion of literal `${...}` placeholders. Build the
|
|
136
|
+
body string first and pass the resolved text via `--body`.)
|
|
137
|
+
|
|
138
|
+
Capture the resulting issue URL printed by `gh issue create`. Display it to
|
|
139
|
+
the user:
|
|
140
|
+
|
|
141
|
+
```
|
|
142
|
+
takeToMarket > SKILL IMPROVEMENT FILED
|
|
143
|
+
|
|
144
|
+
Issue: <issue-url>
|
|
145
|
+
|
|
146
|
+
Thanks for the report. You can track it at the URL above.
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Done — exit successfully.
|
|
150
|
+
|
|
151
|
+
---
|
|
152
|
+
|
|
153
|
+
## Step 5: If no-gh, generate pre-filled URL
|
|
154
|
+
|
|
155
|
+
When `gh` is not installed or not authenticated, build a pre-filled GitHub
|
|
156
|
+
issue URL pointing at the `skill-improvement.yml` template.
|
|
157
|
+
|
|
158
|
+
URL-encode the title and body. The body fields map to template field IDs:
|
|
159
|
+
`which-skill`, `not-working`, `expected`, `repro-steps`.
|
|
160
|
+
|
|
161
|
+
Construct (conceptually):
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
https://github.com/ranjanrishikesh/taketomarket/issues/new
|
|
165
|
+
?template=skill-improvement.yml
|
|
166
|
+
&title=<urlencoded "[Skill improvement] WHICH_SKILL">
|
|
167
|
+
&which-skill=<urlencoded WHICH_SKILL>
|
|
168
|
+
¬-working=<urlencoded NOT_WORKING>
|
|
169
|
+
&expected=<urlencoded EXPECTED>
|
|
170
|
+
&repro-steps=<urlencoded REPRO_STEPS>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
You can generate the encoded URL with:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
python3 - <<'PY'
|
|
177
|
+
import urllib.parse
|
|
178
|
+
import os
|
|
179
|
+
title = f"[Skill improvement] {os.environ['WHICH_SKILL']}"
|
|
180
|
+
params = {
|
|
181
|
+
"template": "skill-improvement.yml",
|
|
182
|
+
"title": title,
|
|
183
|
+
"which-skill": os.environ["WHICH_SKILL"],
|
|
184
|
+
"not-working": os.environ["NOT_WORKING"],
|
|
185
|
+
"expected": os.environ["EXPECTED"],
|
|
186
|
+
"repro-steps": os.environ.get("REPRO_STEPS", ""),
|
|
187
|
+
}
|
|
188
|
+
qs = urllib.parse.urlencode(params)
|
|
189
|
+
print(f"https://github.com/ranjanrishikesh/taketomarket/issues/new?{qs}")
|
|
190
|
+
PY
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
(Export `WHICH_SKILL`, `NOT_WORKING`, `EXPECTED`, `REPRO_STEPS` to the
|
|
194
|
+
environment before running the snippet.)
|
|
195
|
+
|
|
196
|
+
Print the URL and instruct the user:
|
|
197
|
+
|
|
198
|
+
```
|
|
199
|
+
takeToMarket > OPEN IN BROWSER
|
|
200
|
+
|
|
201
|
+
gh CLI not detected (or not authenticated). Open this URL to file the issue:
|
|
202
|
+
|
|
203
|
+
<url>
|
|
204
|
+
|
|
205
|
+
Tip: install `gh` (https://cli.github.com) and run `gh auth login` to file
|
|
206
|
+
issues directly next time.
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Done — exit successfully.
|
|
210
|
+
|
|
211
|
+
</process>
|
|
212
|
+
|
|
213
|
+
<success_criteria>
|
|
214
|
+
- [ ] Installed ttm-* skills listed for user selection
|
|
215
|
+
- [ ] Four questions asked via AskUserQuestion (which-skill, not-working, expected, repro)
|
|
216
|
+
- [ ] gh CLI detection performed (command + auth status)
|
|
217
|
+
- [ ] If gh ready: issue created at ranjanrishikesh/taketomarket with `[Skill improvement]` prefix
|
|
218
|
+
- [ ] If no gh: pre-filled URL printed with template=skill-improvement.yml and encoded title/body fields
|
|
219
|
+
- [ ] No local files modified
|
|
220
|
+
</success_criteria>
|
|
221
|
+
|
|
222
|
+
<output>
|
|
223
|
+
No local files modified. Either a GitHub issue is created remotely (gh path)
|
|
224
|
+
or a URL is printed for the user to open (browser path).
|
|
225
|
+
</output>
|
|
226
|
+
|
|
227
|
+
## What if this doesn't fit?
|
|
228
|
+
|
|
229
|
+
Looks like /ttm-improve-skill can't do that yet. Try one of:
|
|
230
|
+
|
|
231
|
+
- Want a brand-new skill instead? /ttm-request-skill
|
|
232
|
+
- Need an overview of the system first? /ttm-101
|
|
233
|
+
- Otherwise file a free-form issue: https://github.com/ranjanrishikesh/taketomarket/issues/new
|
|
@@ -1,3 +1,32 @@
|
|
|
1
|
+
## Step 0: First-run inline education
|
|
2
|
+
|
|
3
|
+
Read `.taketomarket/CONFIG.md`. Parse `first_run_seen` (object) and `inline_education` (boolean, default true).
|
|
4
|
+
|
|
5
|
+
If `inline_education` is false: skip this step. Else if `first_run_seen.ttm-next` is not `true`, print the explainer below verbatim, then mark this skill as seen:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" first-run mark ttm-next
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Use this exact check (bash) to decide whether to print: `node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" first-run check ttm-next --raw` -- the JSON `seen` field is `true` once the explainer has run before.
|
|
12
|
+
|
|
13
|
+
### Explainer for `/ttm-next`
|
|
14
|
+
|
|
15
|
+
`/ttm-next` scans every active campaign in the project and proposes
|
|
16
|
+
the single highest-priority next move across the whole portfolio.
|
|
17
|
+
Output is a ranked list with one top recommendation plus up to
|
|
18
|
+
three alternatives, each as a runnable `/ttm-*` command.
|
|
19
|
+
|
|
20
|
+
Why it matters: when more than two campaigns are active, "what
|
|
21
|
+
should I do next" becomes a meaningful decision that depends on
|
|
22
|
+
which campaigns are stuck, which are about to lose momentum, and
|
|
23
|
+
which have the soonest measurable outcome. This skill is the
|
|
24
|
+
scheduler for your marketing pipeline.
|
|
25
|
+
|
|
26
|
+
(Canonical source: `references/inline-education-blurbs.md`. Embedded verbatim because workflows do not @-resolve files at runtime.)
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
1
30
|
<purpose>
|
|
2
31
|
Next-command routing workflow for /ttm-next. Looks across ALL active campaigns,
|
|
3
32
|
prioritizes which needs attention most, and suggests the specific /ttm-* command
|
|
@@ -13,7 +42,7 @@ in created and researched phases.
|
|
|
13
42
|
<constraints>
|
|
14
43
|
## POSITIONING.md is READ-ONLY
|
|
15
44
|
|
|
16
|
-
**Do NOT modify `.
|
|
45
|
+
**Do NOT modify `.taketomarket/POSITIONING.md` during this workflow.**
|
|
17
46
|
|
|
18
47
|
POSITIONING.md is an architectural invariant. If you detect positioning drift:
|
|
19
48
|
- In verify: use the Escalate option to launch /ttm-positioning-shift
|
|
@@ -67,7 +96,7 @@ the phase-to-command mapping:
|
|
|
67
96
|
|
|
68
97
|
| Current Phase | Next Command | Notes |
|
|
69
98
|
|---------------|--------------|-------|
|
|
70
|
-
| `created` | `/ttm-
|
|
99
|
+
| `created` | `/ttm-discover <slug>` | New campaign needs research |
|
|
71
100
|
| `researched` | `/ttm-brief <slug>` | Research done, needs brief |
|
|
72
101
|
| `briefed` | `/ttm-produce <slug>` | Brief ready, produce content |
|
|
73
102
|
| `produced` | `/ttm-verify <slug>` | Content ready, verify quality |
|
|
@@ -185,3 +214,10 @@ append a note: "(Note: this command is not yet available -- coming in Phase 9)"
|
|
|
185
214
|
<output>
|
|
186
215
|
No files modified (read-only command).
|
|
187
216
|
</output>
|
|
217
|
+
|
|
218
|
+
## What if this doesn't fit?
|
|
219
|
+
|
|
220
|
+
Looks like /ttm-next can't do that yet.
|
|
221
|
+
|
|
222
|
+
- Want a new skill? /ttm-request-skill
|
|
223
|
+
- Existing skill needs work? /ttm-improve-skill
|