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