// disciplines
SEO
/ttm-seo
Unified SEO + AEO toolkit. Subcommands: audit (URL/sitemap technical+content audit), keyword-map (cluster generation with intent tags), aeo (citation status across AI engines).
Overview
The ttm-seo skill is a unified SEO + AEO toolkit. It routes to one of three subcommand workflows based on the first argument you pass, so you can run technical and content checks, plan a topic cluster, or measure your visibility in AI answer engines from a single command.
SEO and Answer Engine Optimization (AEO) share most fundamentals (structured content, clear claims, citation-worthy formatting) but diverge on a few signals. Treating them as one toolkit with three modes prevents the trap of optimizing for Google in a way that breaks AEO citation.
Invoke it with a subcommand. ttm-seo audit <url-or-sitemap> runs a URL or sitemap through technical and content checks; ttm-seo keyword-map [seed-keyword] generates a topic cluster with intent tags; and ttm-seo aeo <query> measures your citation status across Google AI Overviews, ChatGPT search, and Perplexity for a target query. After matching a subcommand, the skill strips it from the arguments and forwards the remainder to the corresponding workflow.
On first run (unless inline education is disabled in .taketomarket/CONFIG.md), the skill prints a short explainer and marks itself as seen via node "${CLAUDE_PLUGIN_ROOT}/bin/ttm-tools.cjs" first-run mark ttm-seo.
How it works
The router parses the first positional argument and reads the matching workflow file under ${CLAUDE_PLUGIN_ROOT}/workflows/discipline/seo/. Anything else prints usage and exits. The three workflows are reproduced below.
Subcommand: audit
Technical and content SEO audit of a URL or content. Evaluates against SEO playbook gate definitions and generates a structured PASS/WARN/FAIL report per check. Single-pass analysis workflow per D-07.
Required reading: @${CLAUDE_PLUGIN_ROOT}/references/context-loading.md and @${CLAUDE_PLUGIN_ROOT}/playbooks/seo.md.
Text-Mode Detection
Text mode (--text flag): Set TEXT_MODE=true if --text is present in $ARGUMENTS or if the runtime is not Claude Code. When TEXT_MODE is active, replace every AskUserQuestion call with a plain-text numbered list.
if echo "$ARGUMENTS" | grep -q -- '--text'; then TEXT_MODE=true; fiIf the AskUserQuestion tool is not available in the current runtime, set TEXT_MODE=true.
Step 1: Load Context
Tier 1 summaries (lines 1 to <!-- END_SUMMARY -->) from all 9 .taketomarket/ reference files. Tier 2 (full): .taketomarket/CHANNELS.md (channel-specific SEO config). Playbook gates: @${CLAUDE_PLUGIN_ROOT}/playbooks/seo.md. If .taketomarket/POSITIONING.md does not exist: Error and exit.
Step 2: Get Audit Target
Ask: "What would you like to audit? Provide a URL, file path, or paste content directly." Parse input:
- URL (starts with
http://orhttps://): Attempt WebFetch for page content.- WebFetch available (SEARCH_MODE=web): Fetch and analyze.
- WebFetch NOT available (SEARCH_MODE=manual): Ask user to paste page content.
- File path: Read the file directly.
- Pasted content: Use directly.
Store as AUDIT_CONTENT and AUDIT_TARGET.
Step 3: Run SEO Gate Checks
Evaluate AUDIT_CONTENT against 8 SEO discipline gates. Per check: assign PASS / WARN / FAIL with specific evidence.
1. Search Intent Match (DISC-SEO-02)
- PASS: Content format and opening directly match the search intent.
- WARN: Content addresses query but format is mixed or answer is buried.
- FAIL: Content format contradicts the search intent.
2. Keyword Placement (DISC-SEO-01)
Target keyword in: title tag, H1, first 100 words, meta description, H2.
- PASS: Keyword in title, H1, first 100 words; title 50-60 chars.
- WARN: Missing from 1-2 placements; title 45-49 or 61-70 chars.
- FAIL: Missing from title or H1; title under 30 or over 70 chars.
3. Content Structure
Heading hierarchy (H1 > H2 > H3), no skipped levels, H2 sections 150-400 words.
- PASS: Single H1, logical hierarchy, no skipped levels.
- WARN: Minor hierarchy issues or uneven section lengths.
- FAIL: No H1, multiple H1s, or broken hierarchy.
4. Internal Linking Density (DISC-SEO-04)
- PASS: 3-6 internal links per 1000 words with descriptive anchors.
- WARN: 1-2 internal links per 1000 words.
- FAIL: 0 internal links.
5. Schema Markup (DISC-SEO-03)
Article, FAQ, HowTo, or Product schema with required fields.
- PASS: Appropriate schema type with all required fields.
- WARN: Schema present but incomplete.
- FAIL: No schema for content that qualifies.
6. Entity Coverage
Key entities search engines associate with the topic.
- PASS: References relevant entities (people, orgs, concepts).
- WARN: Some coverage but missing key entities.
- FAIL: No recognizable entity references.
7. Thin Content Detection (DISC-SEO-05)
- PASS: 800+ words standard (300+ programmatic); original analysis present.
- WARN: 500-799 words; mostly summarized.
- FAIL: Under 500 words; boilerplate content.
8. Core Web Vitals Budget (DISC-SEO-07)
- PASS: Optimized images with dimensions, lazy-load, no render blockers.
- WARN: Images missing dimensions or unoptimized formats.
- FAIL: Heavy unoptimized media or render-blocking embeds.
Step 4: Generate Report
Display a structured report:
========================================
takeToMarket > SEO AUDIT REPORT
========================================
Target: [URL or filename]
Date: [current date]
Overall: [X/8 PASS] [Y/8 WARN] [Z/8 FAIL]
| # | Gate | Result | Evidence |
|---|------------------------|--------|-----------------------|
| 1 | Search Intent Match | [P/W/F] | [brief evidence] |
| 2 | Keyword Placement | [P/W/F] | [brief evidence] |
| 3 | Content Structure | [P/W/F] | [brief evidence] |
| 4 | Internal Linking | [P/W/F] | [brief evidence] |
| 5 | Schema Markup | [P/W/F] | [brief evidence] |
| 6 | Entity Coverage | [P/W/F] | [brief evidence] |
| 7 | Thin Content Detection | [P/W/F] | [brief evidence] |
| 8 | Core Web Vitals Budget | [P/W/F] | [brief evidence] |
FINDINGS (WARN/FAIL details):
- [Gate]: [Issue and recommendation]
RECOMMENDATIONS (priority-ordered):
1. [Highest-impact fix]
2. [Next priority]Step 5: Completion
========================================
takeToMarket > SEO AUDIT COMPLETE
========================================
Target: ${AUDIT_TARGET} | Result: [X/8 PASS] [Y/8 WARN] [Z/8 FAIL]Offer: "Save this report to .taketomarket/AUDITS/seo-audit-[date].md? (yes/no)" If yes: create .taketomarket/AUDITS/ directory if needed and write the report.
Subcommand: keyword-map
Generate a keyword cluster map with intent tags for content planning. Groups keywords by topic cluster, assigns search intent (informational/transactional/navigational/commercial), and maps to content types and funnel stages. Single-pass analysis workflow per D-07.
Required reading: @${CLAUDE_PLUGIN_ROOT}/references/context-loading.md and @${CLAUDE_PLUGIN_ROOT}/playbooks/seo.md. The same POSITIONING.md read-only constraint and text-mode detection described above apply to this workflow as well.
Step 1: Load Context
Tier 1 summaries (lines 1 to <!-- END_SUMMARY -->) from all 9 .taketomarket/ reference files. Tier 2 (full): .taketomarket/POSITIONING.md, .taketomarket/CHANNELS.md, .taketomarket/COMPETITORS.md. If .taketomarket/POSITIONING.md does not exist: Error and exit.
Step 2: Gather Seed Keywords
Ask the user:
- "What are your primary seed keywords or topics? (comma-separated)"
- "Any specific competitors to include in keyword gap analysis? (or 'use COMPETITORS.md')"
- "Target geography/language? (default: English, global)"
If user says "use COMPETITORS.md", extract competitor names from the loaded file.
MCP Detection: Attempt WebSearch for seed keyword variations.
- SEARCH_MODE=web: Use WebSearch to expand seed keywords with related terms, "people also ask" patterns, and competitor keyword gaps.
- SEARCH_MODE=manual: Work with user-provided seeds + positioning + ICP context to generate clusters from domain knowledge.
Step 3: Generate Keyword Clusters
For each seed keyword, generate clusters:
- Head terms (1-2 words, high volume).
- Body terms (2-3 words, medium volume).
- Long-tail terms (4+ words, specific intent).
Assign to each keyword:
- Intent tag: informational / transactional / navigational / commercial-investigation.
- Funnel stage: awareness / consideration / decision / retention.
- Content type: blog / landing page / comparison / how-to / case study / tool.
- Priority: H (high) / M (medium) / L (low) based on intent alignment with ICP.
Group into topic clusters with pillar-cluster relationships.
Step 4: Output Keyword Map
Write to .taketomarket/KEYWORD-MAP.md:
# Keyword Map
Generated: [date]
Seeds: [list]
Geography: [target]
## Cluster: [Topic 1]
Pillar: [pillar keyword]
| Keyword | Intent | Funnel | Content Type | Priority |
|---------|--------|--------|--------------|----------|
| [term] | [info/trans/nav/comm] | [stage] | [type] | [H/M/L] |
## Cluster: [Topic 2]
...
## Gap Analysis
Keywords competitors rank for that are not covered:
| Keyword | Competitor | Intent | Opportunity |
|---------|-----------|--------|-------------|Step 5: Completion
========================================
takeToMarket > KEYWORD MAP COMPLETE
========================================
Clusters: [N] | Keywords: [total] | File: .taketomarket/KEYWORD-MAP.mdDisplay a summary table of clusters with keyword counts per cluster.
Subcommand: aeo
Check AI citation status and citability score for content against a target query. Evaluates whether content is structured for AI engine extraction and citation using AEO playbook gate definitions. Optionally checks live citation status via web search. Single-pass analysis workflow per D-07.
Required reading: @${CLAUDE_PLUGIN_ROOT}/references/context-loading.md and @${CLAUDE_PLUGIN_ROOT}/playbooks/aeo.md. The same POSITIONING.md read-only constraint and text-mode detection apply.
Step 1: Load Context
Tier 1 summaries (lines 1 to <!-- END_SUMMARY -->) from all 9 .taketomarket/ reference files. Tier 2 (full): .taketomarket/POSITIONING.md (differentiator alignment check). Playbook gates: @${CLAUDE_PLUGIN_ROOT}/playbooks/aeo.md. If .taketomarket/POSITIONING.md does not exist: Error and exit.
Step 2: Get Target Query and Content
Ask the user:
- "What query do you want to check AI citation status for?"
- "Paste the content you want evaluated (URL, file path, or raw content)."
Store query as TARGET_QUERY. Parse content input:
- URL: Attempt WebFetch. If unavailable (SEARCH_MODE=manual), ask user to paste.
- File path: Read directly.
- Pasted content: Use directly.
Store as CHECK_CONTENT.
Step 3: Evaluate Citability (AEO Gates)
Evaluate CHECK_CONTENT against 6 AEO discipline gates. Per check: assign PASS / WARN / FAIL with specific evidence.
1. Quote-Worthy Sentences (DISC-AEO-01)
- PASS: 3+ sentences quotable verbatim as standalone answers.
- WARN: 1-2 quotable sentences.
- FAIL: 0 quotable sentences — all require surrounding context.
2. FAQ/HowTo Schema (DISC-AEO-02)
- PASS: FAQPage or HowTo schema with complete Q&A pairs or steps.
- WARN: Schema present but incomplete (missing answers, <3 pairs).
- FAIL: No FAQ/HowTo schema on content with Q&A or instructions.
3. Author/Expert Markup (DISC-AEO-03)
- PASS: Author name, credentials, expertise; references specific experience.
- WARN: Author name present but no credentials.
- FAIL: No author attribution.
4. Cross-Domain Fact Consistency (DISC-AEO-04)
- PASS: All numeric and positioning claims consistent and verifiable.
- WARN: Minor phrasing differences that could be misinterpreted.
- FAIL: Direct contradictions in claims.
5. Direct Answer Formatting (DISC-AEO-05)
- PASS: Each H2 opens with 1-2 sentence definitive answer before elaboration.
- WARN: Most sections open directly but 1-2 start with context first.
- FAIL: Sections consistently open with preamble instead of answers.
6. Entity Authority
- PASS: References authoritative entities, domain terminology, linked concepts.
- WARN: Some entity coverage but surface-level.
- FAIL: Generic content with no entity depth.
Step 4: Citation Status (if WebSearch available)
Attempt WebSearch to detect tool availability.
SEARCH_MODE=web: Search TARGET_QUERY conversationally. Analyze: Is content being cited? Which competitors cited? What format do AI engines prefer?
SEARCH_MODE=manual: Skip live check. Tell user to manually search in ChatGPT, Perplexity, Gemini, Copilot.
Step 5: Generate Report
Citability score: (PASS count / 6) * 100, rounded.
========================================
takeToMarket > AEO CITABILITY REPORT
========================================
Query: "${TARGET_QUERY}"
Content: [URL, filename, or "pasted content"]
Date: [current date]
Citability Score: [score]% ([X/6 PASS] [Y/6 WARN] [Z/6 FAIL])
| # | Gate | Result | Evidence |
|---|-------------------------|--------|-----------------------|
| 1 | Quote-Worthy Sentences | [P/W/F] | [brief evidence] |
| 2 | FAQ/HowTo Schema | [P/W/F] | [brief evidence] |
| 3 | Author/Expert Markup | [P/W/F] | [brief evidence] |
| 4 | Fact Consistency | [P/W/F] | [brief evidence] |
| 5 | Direct Answer Format | [P/W/F] | [brief evidence] |
| 6 | Entity Authority | [P/W/F] | [brief evidence] |
[If SEARCH_MODE=web:]
CITATION STATUS:
- Currently cited: [yes/no/partial]
- Competing citations: [competitors being cited]
- Preferred format: [format AI engines favor]
FINDINGS (WARN/FAIL details):
- [Gate]: [Issue and recommendation]
RECOMMENDATIONS (priority-ordered):
1. [Highest-impact citability improvement]
2. [Next priority]Step 6: Completion
========================================
takeToMarket > AEO CHECK COMPLETE
========================================
Query: ${TARGET_QUERY} | Citability Score: [score]%Offer: "Save this report to .taketomarket/AUDITS/aeo-check-[date].md? (yes/no)" If yes: create .taketomarket/AUDITS/ directory if needed and write the report.
What if this doesn't fit?
Looks like /ttm-seo can't do that yet. Want a new skill? Run /ttm-request-skill. Existing skill needs work? Run /ttm-improve-skill.