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,128 @@
|
|
|
1
|
+
# Playwright Setup 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-playwright-setup` 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-playwright-setup
|
|
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-playwright-setup --raw` -- the JSON `seen` field is `true` once the explainer has run before.
|
|
14
|
+
|
|
15
|
+
### Explainer for `/ttm-playwright-setup`
|
|
16
|
+
|
|
17
|
+
`/ttm-playwright-setup` installs and configures the Playwright MCP
|
|
18
|
+
required for the visual landing-page gate (gate 4) and any future
|
|
19
|
+
browser-based verification. It detects your existing MCP config,
|
|
20
|
+
adds the Playwright entry, and confirms the tool is reachable from
|
|
21
|
+
the runtime.
|
|
22
|
+
|
|
23
|
+
Why it matters: the landing-page gate wall includes a Playwright-driven
|
|
24
|
+
visual check, and without the MCP installed it falls back to a softer
|
|
25
|
+
gate. This skill turns the soft gate into a hard one. Treat it as the
|
|
26
|
+
runtime equivalent of installing a missing test dependency.
|
|
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:** `${CLAUDE_PLUGIN_ROOT}/references/playwright-mcp-setup.md`
|
|
33
|
+
|
|
34
|
+
## Step 1: Detect current state
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
node ${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs playwright-check --raw
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
If `detected = true`: print "Playwright MCP already configured for Claude Code." Then AskUserQuestion (priority: critical):
|
|
41
|
+
- "Run smoke test, install for another runtime (Codex/Cursor), or exit?"
|
|
42
|
+
- options: "Run smoke test" / "Install for another runtime" / "Exit"
|
|
43
|
+
|
|
44
|
+
If "Run smoke test": skip to Step 5. If "Install for another runtime": continue to Step 2 (filter Claude Code out of the candidate list). If "Exit": exit.
|
|
45
|
+
|
|
46
|
+
## Step 2: Pick target runtime
|
|
47
|
+
|
|
48
|
+
Even if the current session is Claude Code, the user might be installing for Codex or Cursor. Always ask.
|
|
49
|
+
|
|
50
|
+
Suggest candidates by checking which dirs exist:
|
|
51
|
+
- `~/.claude/` → Claude Code
|
|
52
|
+
- `~/.codex/` → Codex
|
|
53
|
+
- `~/.cursor/` → Cursor
|
|
54
|
+
|
|
55
|
+
Then AskUserQuestion (priority: critical):
|
|
56
|
+
- "Which runtime do you want to configure Playwright MCP for?"
|
|
57
|
+
- options: list detected candidates first (marked "(detected)"), then the other runtimes, then "All of them"
|
|
58
|
+
- if user picks "All of them": loop through each in Step 3.
|
|
59
|
+
|
|
60
|
+
## Step 3: Print install steps for detected runtime
|
|
61
|
+
|
|
62
|
+
Print the relevant sections from `${CLAUDE_PLUGIN_ROOT}/references/playwright-mcp-setup.md`:
|
|
63
|
+
|
|
64
|
+
- Section **"1. Install the MCP server"** — the `npx -y @playwright/mcp@0.0.75 --help` pre-warm command and the `node -v` / `npm view @playwright/mcp version` verification.
|
|
65
|
+
- Section **"2. Install the Chrome extension bridge"** — the Chrome Web Store link for "Playwright Extension" (`mmlmfjhmonkocbjadbfplnigmagldckm`), plus the sideload fallback for corporate machines.
|
|
66
|
+
- Section **"3. Configure runtime MCP settings"** — show only the sub-block matching the detected runtime:
|
|
67
|
+
- **Claude Code:** the `claude mcp add playwright ...` CLI command (preferred) and the equivalent `~/.claude.json` / `~/.claude/settings.json` JSON snippet.
|
|
68
|
+
- **Codex CLI:** the `~/.codex/config.toml` TOML snippet (`[mcp_servers.playwright]`) and the `codex mcp add` CLI equivalent.
|
|
69
|
+
- **Cursor:** the `~/.cursor/mcp.json` (or per-project `.cursor/mcp.json`) JSON snippet.
|
|
70
|
+
|
|
71
|
+
## Step 4: Pause for user
|
|
72
|
+
|
|
73
|
+
AskUserQuestion (priority: critical):
|
|
74
|
+
|
|
75
|
+
- question: "Have you completed the install steps above?"
|
|
76
|
+
- options:
|
|
77
|
+
- "Yes, ready to test"
|
|
78
|
+
- "I'll do it later"
|
|
79
|
+
|
|
80
|
+
If "I'll do it later": exit with a reminder that `/ttm-playwright-setup` can be re-run anytime to resume.
|
|
81
|
+
|
|
82
|
+
## Step 5: Smoke test
|
|
83
|
+
|
|
84
|
+
If the user said "Yes, ready to test":
|
|
85
|
+
|
|
86
|
+
- Re-run `node ${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs playwright-check --raw`.
|
|
87
|
+
- Track retry count across re-checks. Cap at 2 failed re-checks.
|
|
88
|
+
- If still not detected: print "MCP server not detected. Common fixes:" followed by the relevant items from the reference's **Troubleshooting** section (Node version too old, runtime needs a full restart to pick up new MCP entries, absolute path required for `npx` on Cursor macOS). Loop back to Step 4.
|
|
89
|
+
- After the 2nd failed re-check, exit the smoke-test loop with: "Couldn't detect Playwright MCP after 2 attempts. See references/playwright-mcp-setup.md Troubleshooting section, fix the issue, then re-run /ttm-playwright-setup."
|
|
90
|
+
- If detected: try a real Playwright call:
|
|
91
|
+
- Use the MCP `browser_navigate` tool to navigate to `https://example.com` and take a screenshot.
|
|
92
|
+
- On success: print "✓ Playwright MCP working. takeToMarket capabilities now unlocked."
|
|
93
|
+
- On failure: print the error and link to the **Troubleshooting** section of `references/playwright-mcp-setup.md`.
|
|
94
|
+
|
|
95
|
+
## Step 6: Mark CONFIG.md
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
TS=$(node ${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs timestamp --raw | tr -d '"')
|
|
99
|
+
node ${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs config set playwright_mcp_setup_at "$TS"
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
If the user installed with the Chrome extension bridge (`--extension`), also record that capability so downstream skills can precondition:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
node ${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs config set playwright_mcp_extension true
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Otherwise set it to `false`.
|
|
109
|
+
|
|
110
|
+
## Step 7: Print next steps
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
✓ Playwright MCP is configured.
|
|
114
|
+
|
|
115
|
+
Capabilities now unlocked:
|
|
116
|
+
- /ttm-competitor-scan can render JS-heavy sites.
|
|
117
|
+
- /ttm-linkedin-post can scrape author profiles (requires a logged-in tab in Chrome).
|
|
118
|
+
- /ttm-landing and /ttm-pseo quality gates can run Lighthouse + visual diff.
|
|
119
|
+
|
|
120
|
+
Run /ttm-next for the recommended next command.
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## What if this doesn't fit?
|
|
124
|
+
|
|
125
|
+
Looks like /ttm-playwright-setup can't do that yet.
|
|
126
|
+
|
|
127
|
+
- Want a new skill? /ttm-request-skill
|
|
128
|
+
- Existing skill needs work? /ttm-improve-skill
|
|
@@ -0,0 +1,218 @@
|
|
|
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-request-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-request-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-request-skill --raw` -- the JSON `seen` field is `true` once the explainer has run before.
|
|
12
|
+
|
|
13
|
+
### Explainer for `/ttm-request-skill`
|
|
14
|
+
|
|
15
|
+
`/ttm-request-skill` is the proposal pipeline for new skills. You
|
|
16
|
+
describe a marketing job you keep doing manually, the skill asks
|
|
17
|
+
structured questions (inputs, outputs, gates, frequency), and
|
|
18
|
+
produces either a local SKILL.md draft you can iterate on or a
|
|
19
|
+
formatted feature request against the upstream repo.
|
|
20
|
+
|
|
21
|
+
Why it matters: solopreneurs hit recurring marketing tasks that
|
|
22
|
+
nobody else's playbook covers because nobody else has your product.
|
|
23
|
+
Rather than re-prompting from scratch each time, this skill turns
|
|
24
|
+
your repeated workflow into a versioned, gated skill -- the same
|
|
25
|
+
way you'd extract a utility function after writing the same code
|
|
26
|
+
three times.
|
|
27
|
+
|
|
28
|
+
(Canonical source: `references/inline-education-blurbs.md`. Embedded verbatim because workflows do not @-resolve files at runtime.)
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
<purpose>
|
|
33
|
+
Skill request workflow for /ttm-request-skill. Gathers details about a NEW
|
|
34
|
+
skill the user wants and files a GitHub issue at ranjanrishikesh/taketomarket.
|
|
35
|
+
Prefers the `gh` CLI when installed and authenticated; falls back to opening a
|
|
36
|
+
pre-filled GitHub issue URL in the 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 — this skill files into the upstream
|
|
49
|
+
takeToMarket project.
|
|
50
|
+
|
|
51
|
+
## No Secrets in Issue Body
|
|
52
|
+
|
|
53
|
+
Do NOT include API keys, tokens, file paths containing credentials, or any
|
|
54
|
+
content from `.taketomarket/` reference files in the issue body. Only echo the
|
|
55
|
+
user's freeform answers verbatim.
|
|
56
|
+
</constraints>
|
|
57
|
+
|
|
58
|
+
<process>
|
|
59
|
+
|
|
60
|
+
## Step 1: Gather details
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
takeToMarket > REQUEST A NEW SKILL
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Use `AskUserQuestion` (priority: critical) to collect:
|
|
67
|
+
|
|
68
|
+
1. **Skill name** — "What's the skill name you want? (e.g., `ttm-twitter-post`)"
|
|
69
|
+
- Freeform single-line answer.
|
|
70
|
+
- If the user omits the `ttm-` prefix, prepend it for them.
|
|
71
|
+
2. **What it does** — "What does it do?"
|
|
72
|
+
- Freeform, multi-line allowed.
|
|
73
|
+
3. **Use case** — "What's the use case? When would you run it?"
|
|
74
|
+
- Freeform, multi-line allowed.
|
|
75
|
+
4. **Similar / extends** — "Any existing skill it's similar to or extends?"
|
|
76
|
+
- Freeform. Optional — accept an empty answer.
|
|
77
|
+
|
|
78
|
+
Store the answers as `SKILL_NAME`, `DESCRIPTION`, `USE_CASE`, `SIMILAR`.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Step 2: Detect gh CLI
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
GH_STATE="no-gh"
|
|
86
|
+
if command -v gh >/dev/null 2>&1; then
|
|
87
|
+
if gh auth status >/dev/null 2>&1; then
|
|
88
|
+
GH_STATE="gh-ready"
|
|
89
|
+
fi
|
|
90
|
+
fi
|
|
91
|
+
echo "$GH_STATE"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
If `GH_STATE` is `gh-ready`, proceed to Step 3.
|
|
95
|
+
Otherwise, proceed to Step 4.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Step 3: If gh-ready, file issue via gh CLI
|
|
100
|
+
|
|
101
|
+
Build the issue body from the gathered answers, then run:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
gh issue create \
|
|
105
|
+
--repo ranjanrishikesh/taketomarket \
|
|
106
|
+
--title "[Skill request] ${SKILL_NAME}" \
|
|
107
|
+
--body "$(cat <<'EOF'
|
|
108
|
+
**Skill name:** ${SKILL_NAME}
|
|
109
|
+
**What it does:** ${DESCRIPTION}
|
|
110
|
+
**Use case:** ${USE_CASE}
|
|
111
|
+
**Similar / extends:** ${SIMILAR}
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
Filed via /ttm-request-skill
|
|
115
|
+
EOF
|
|
116
|
+
)"
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
(Substitute the variables before passing to the heredoc — the heredoc above is
|
|
120
|
+
quoted to prevent shell expansion of literal `${...}` placeholders that
|
|
121
|
+
should be filled in by you. Build the body string first and pass the resolved
|
|
122
|
+
text via `--body`.)
|
|
123
|
+
|
|
124
|
+
Capture the resulting issue URL printed by `gh issue create`. Display it to
|
|
125
|
+
the user:
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
takeToMarket > SKILL REQUEST FILED
|
|
129
|
+
|
|
130
|
+
Issue: <issue-url>
|
|
131
|
+
|
|
132
|
+
Thanks for the request. You can track it at the URL above.
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Done — exit successfully.
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Step 4: If no-gh, generate pre-filled URL
|
|
140
|
+
|
|
141
|
+
When `gh` is not installed or not authenticated, build a pre-filled GitHub
|
|
142
|
+
issue URL pointing at the `skill-request.yml` template.
|
|
143
|
+
|
|
144
|
+
URL-encode the title and body. The body fields map to template field IDs:
|
|
145
|
+
`skill-name`, `description`, `use-case`, `similar`.
|
|
146
|
+
|
|
147
|
+
Construct (conceptually):
|
|
148
|
+
|
|
149
|
+
```
|
|
150
|
+
https://github.com/ranjanrishikesh/taketomarket/issues/new
|
|
151
|
+
?template=skill-request.yml
|
|
152
|
+
&title=<urlencoded "[Skill request] SKILL_NAME">
|
|
153
|
+
&skill-name=<urlencoded SKILL_NAME>
|
|
154
|
+
&description=<urlencoded DESCRIPTION>
|
|
155
|
+
&use-case=<urlencoded USE_CASE>
|
|
156
|
+
&similar=<urlencoded SIMILAR>
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
You can generate the encoded URL with:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
python3 - <<'PY'
|
|
163
|
+
import urllib.parse
|
|
164
|
+
import os
|
|
165
|
+
title = f"[Skill request] {os.environ['SKILL_NAME']}"
|
|
166
|
+
params = {
|
|
167
|
+
"template": "skill-request.yml",
|
|
168
|
+
"title": title,
|
|
169
|
+
"skill-name": os.environ["SKILL_NAME"],
|
|
170
|
+
"description": os.environ["DESCRIPTION"],
|
|
171
|
+
"use-case": os.environ["USE_CASE"],
|
|
172
|
+
"similar": os.environ.get("SIMILAR", ""),
|
|
173
|
+
}
|
|
174
|
+
qs = urllib.parse.urlencode(params)
|
|
175
|
+
print(f"https://github.com/ranjanrishikesh/taketomarket/issues/new?{qs}")
|
|
176
|
+
PY
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
(Export `SKILL_NAME`, `DESCRIPTION`, `USE_CASE`, `SIMILAR` to the environment
|
|
180
|
+
before running the snippet.)
|
|
181
|
+
|
|
182
|
+
Print the URL and instruct the user:
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
takeToMarket > OPEN IN BROWSER
|
|
186
|
+
|
|
187
|
+
gh CLI not detected (or not authenticated). Open this URL to file the issue:
|
|
188
|
+
|
|
189
|
+
<url>
|
|
190
|
+
|
|
191
|
+
Tip: install `gh` (https://cli.github.com) and run `gh auth login` to file
|
|
192
|
+
issues directly next time.
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Done — exit successfully.
|
|
196
|
+
|
|
197
|
+
</process>
|
|
198
|
+
|
|
199
|
+
<success_criteria>
|
|
200
|
+
- [ ] Four questions asked via AskUserQuestion (name, description, use case, similar)
|
|
201
|
+
- [ ] gh CLI detection performed (command + auth status)
|
|
202
|
+
- [ ] If gh ready: issue created at ranjanrishikesh/taketomarket with `[Skill request]` prefix and labels via template not required (gh path bypasses template)
|
|
203
|
+
- [ ] If no gh: pre-filled URL printed with template=skill-request.yml and encoded title/body fields
|
|
204
|
+
- [ ] No local files modified
|
|
205
|
+
</success_criteria>
|
|
206
|
+
|
|
207
|
+
<output>
|
|
208
|
+
No local files modified. Either a GitHub issue is created remotely (gh path)
|
|
209
|
+
or a URL is printed for the user to open (browser path).
|
|
210
|
+
</output>
|
|
211
|
+
|
|
212
|
+
## What if this doesn't fit?
|
|
213
|
+
|
|
214
|
+
Looks like /ttm-request-skill can't do that yet. Try one of:
|
|
215
|
+
|
|
216
|
+
- Existing skill behaving wrong? /ttm-improve-skill
|
|
217
|
+
- Need an overview of the system first? /ttm-101
|
|
218
|
+
- Otherwise file a free-form issue: https://github.com/ranjanrishikesh/taketomarket/issues/new
|
|
@@ -1,3 +1,33 @@
|
|
|
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-resume` 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-resume
|
|
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-resume --raw` -- the JSON `seen` field is `true` once the explainer has run before.
|
|
12
|
+
|
|
13
|
+
### Explainer for `/ttm-resume`
|
|
14
|
+
|
|
15
|
+
`/ttm-resume` is the session-recovery skill. It loads the active
|
|
16
|
+
campaign's STATE.md, summarizes the last completed phase, lists
|
|
17
|
+
pending work and known blockers, and recommends the exact next
|
|
18
|
+
`/ttm-*` command. It also detects interrupted verify/fix loops so
|
|
19
|
+
you continue from where the loop stopped.
|
|
20
|
+
|
|
21
|
+
Why it matters: marketing campaigns run across many sessions over
|
|
22
|
+
many days, and context loss between sessions is where things get
|
|
23
|
+
silently dropped. Resume is the equivalent of restoring a debugger
|
|
24
|
+
state: you don't have to remember where you were because the state
|
|
25
|
+
files do.
|
|
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
32
|
Session recovery workflow for /ttm-resume. Loads campaign state, shows context
|
|
3
33
|
summary (last completed phase, what was done, pending work, blockers), and suggests
|
|
@@ -14,7 +44,7 @@ State is loaded directly from CAMPAIGNS/<slug>/STATE.md (no separate handoff fil
|
|
|
14
44
|
<constraints>
|
|
15
45
|
## POSITIONING.md is READ-ONLY
|
|
16
46
|
|
|
17
|
-
**Do NOT modify `.
|
|
47
|
+
**Do NOT modify `.taketomarket/POSITIONING.md` during this workflow.**
|
|
18
48
|
|
|
19
49
|
POSITIONING.md is an architectural invariant. If you detect positioning drift:
|
|
20
50
|
- In verify: use the Escalate option to launch /ttm-positioning-shift
|
|
@@ -76,7 +106,7 @@ Parse the full JSON output. Extract:
|
|
|
76
106
|
|
|
77
107
|
Also read the FULL STATE.md file (not just CLI output) to get body content:
|
|
78
108
|
```bash
|
|
79
|
-
Read .
|
|
109
|
+
Read .taketomarket/CAMPAIGNS/${SLUG}/STATE.md
|
|
80
110
|
```
|
|
81
111
|
|
|
82
112
|
The body contains "Phase:" and "Next step:" lines plus any additional notes,
|
|
@@ -142,7 +172,7 @@ Use the phase-to-command mapping to suggest the exact next command:
|
|
|
142
172
|
|
|
143
173
|
| Current Phase | Next Command | Notes |
|
|
144
174
|
|---------------|-------------|-------|
|
|
145
|
-
| `created` | `/ttm-
|
|
175
|
+
| `created` | `/ttm-discover ${SLUG}` | Campaign exists but no research done |
|
|
146
176
|
| `researched` | `/ttm-brief ${SLUG}` | Research complete, needs brief |
|
|
147
177
|
| `briefed` | `/ttm-produce ${SLUG}` | Brief ready, needs production |
|
|
148
178
|
| `produced` | `/ttm-verify ${SLUG}` | Assets produced, needs verification |
|
|
@@ -247,3 +277,10 @@ It has been ${days} days since last activity. Consider:
|
|
|
247
277
|
No files modified. This is a read-only command that displays recovery context
|
|
248
278
|
and suggests the next command for the user to run.
|
|
249
279
|
</output>
|
|
280
|
+
|
|
281
|
+
## What if this doesn't fit?
|
|
282
|
+
|
|
283
|
+
Looks like /ttm-resume can't do that yet.
|
|
284
|
+
|
|
285
|
+
- Want a new skill? /ttm-request-skill
|
|
286
|
+
- Existing skill needs work? /ttm-improve-skill
|
|
@@ -1,3 +1,31 @@
|
|
|
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-state` 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-state
|
|
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-state --raw` -- the JSON `seen` field is `true` once the explainer has run before.
|
|
12
|
+
|
|
13
|
+
### Explainer for `/ttm-state`
|
|
14
|
+
|
|
15
|
+
`/ttm-state` is the read-only dashboard. With no argument it prints
|
|
16
|
+
every campaign (active and archived) with its current phase, blockers,
|
|
17
|
+
shipped-asset count, and last activity timestamp. With a slug, it
|
|
18
|
+
prints the per-campaign detail view from that campaign's STATE.md.
|
|
19
|
+
|
|
20
|
+
Why it matters: state is the truth file in takeToMarket -- not your
|
|
21
|
+
memory, not the conversation history. This skill is how you check
|
|
22
|
+
that truth without mutating it. Use it before running any campaign
|
|
23
|
+
action when you're not sure where you left off.
|
|
24
|
+
|
|
25
|
+
(Canonical source: `references/inline-education-blurbs.md`. Embedded verbatim because workflows do not @-resolve files at runtime.)
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
1
29
|
<purpose>
|
|
2
30
|
State dashboard workflow for /ttm-state. Displays all campaigns (active and
|
|
3
31
|
archived) in a summary table. No-argument mode shows the full campaign dashboard;
|
|
@@ -12,7 +40,7 @@ and enriches with per-campaign STATE.md data.
|
|
|
12
40
|
<constraints>
|
|
13
41
|
## POSITIONING.md is READ-ONLY
|
|
14
42
|
|
|
15
|
-
**Do NOT modify `.
|
|
43
|
+
**Do NOT modify `.taketomarket/POSITIONING.md` during this workflow.**
|
|
16
44
|
|
|
17
45
|
POSITIONING.md is an architectural invariant. If you detect positioning drift:
|
|
18
46
|
- In verify: use the Escalate option to launch /ttm-positioning-shift
|
|
@@ -68,14 +96,14 @@ Exit.
|
|
|
68
96
|
|
|
69
97
|
**Check for archived campaigns:**
|
|
70
98
|
```bash
|
|
71
|
-
ls .
|
|
99
|
+
ls .taketomarket/CAMPAIGNS/ARCHIVE/ 2>/dev/null
|
|
72
100
|
```
|
|
73
101
|
|
|
74
102
|
For each archived directory found, read its STATE.md frontmatter to get archive date
|
|
75
103
|
and outcome information.
|
|
76
104
|
|
|
77
105
|
**Read global state for portfolio context:**
|
|
78
|
-
Read `.
|
|
106
|
+
Read `.taketomarket/STATE.md` body content (below frontmatter) for portfolio-level
|
|
79
107
|
decisions, blockers, and experiments.
|
|
80
108
|
|
|
81
109
|
---
|
|
@@ -109,9 +137,9 @@ For each active campaign, also display a detail section:
|
|
|
109
137
|
**Created:** <date> | **Last Updated:** <date>
|
|
110
138
|
**Gate Results:** <summary of pass/fail counts from review.overall_result>
|
|
111
139
|
**Fix Attempts:** <fix.run_count or 0>
|
|
112
|
-
**Decisions in flight:** <from global .
|
|
113
|
-
**Blockers:** <from global .
|
|
114
|
-
**Experiments:** <from global .
|
|
140
|
+
**Decisions in flight:** <from global .taketomarket/STATE.md body if any>
|
|
141
|
+
**Blockers:** <from global .taketomarket/STATE.md body if any>
|
|
142
|
+
**Experiments:** <from global .taketomarket/STATE.md body if any>
|
|
115
143
|
```
|
|
116
144
|
|
|
117
145
|
If no active campaigns exist, display:
|
|
@@ -198,10 +226,17 @@ If the campaign has no body content in STATE.md, display:
|
|
|
198
226
|
- [ ] Dashboard displays active campaigns with detail sections
|
|
199
227
|
- [ ] Archived campaigns shown as collapsed rows
|
|
200
228
|
- [ ] Single campaign mode shows full detail when slug provided
|
|
201
|
-
- [ ] Global .
|
|
229
|
+
- [ ] Global .taketomarket/STATE.md body read for portfolio-level context
|
|
202
230
|
- [ ] No files modified (read-only command)
|
|
203
231
|
</success_criteria>
|
|
204
232
|
|
|
205
233
|
<output>
|
|
206
234
|
No files modified (read-only command).
|
|
207
235
|
</output>
|
|
236
|
+
|
|
237
|
+
## What if this doesn't fit?
|
|
238
|
+
|
|
239
|
+
Looks like /ttm-state can't do that yet.
|
|
240
|
+
|
|
241
|
+
- Want a new skill? /ttm-request-skill
|
|
242
|
+
- Existing skill needs work? /ttm-improve-skill
|