@houseofmvps/claude-rank 1.5.0 → 1.7.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/plugin.json +1 -1
- package/README.md +66 -6
- package/bin/claude-rank.mjs +41 -0
- package/commands/rank-aeo.md +19 -0
- package/commands/rank-audit.md +23 -0
- package/commands/rank-compete.md +33 -0
- package/commands/rank-fix.md +19 -0
- package/commands/rank-geo.md +19 -0
- package/commands/rank-schema.md +20 -0
- package/commands/rank.md +24 -1
- package/hooks/hooks.json +1 -1
- package/package.json +1 -1
- package/research/geo-research.md +5 -5
- package/skills/rank/SKILL.md +3 -9
- package/skills/rank-geo/SKILL.md +2 -2
- package/tools/aeo-scanner.mjs +14 -3
- package/tools/compete-scanner.mjs +474 -0
- package/tools/geo-scanner.mjs +15 -3
- package/tools/lib/formatter.mjs +98 -0
- package/tools/lib/html-parser.mjs +49 -1
- package/tools/schema-engine.mjs +21 -1
- package/tools/seo-scanner.mjs +67 -2
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
<img src="assets/hero-banner.png" alt="claude-rank — SEO/GEO/AEO Plugin for Claude Code" width="100%"/>
|
|
4
4
|
|
|
5
|
-
### The most comprehensive SEO/GEO/AEO plugin for Claude Code. 80+ rules. Auto-fix everything. Dominate search — traditional and AI.
|
|
5
|
+
### The most comprehensive SEO/GEO/AEO plugin for Claude Code. 80+ rules. Competitive X-Ray. Auto-fix everything. Dominate search — traditional and AI.
|
|
6
6
|
|
|
7
7
|
[](https://www.npmjs.com/package/@houseofmvps/claude-rank)
|
|
8
8
|
[](https://www.npmjs.com/package/@houseofmvps/claude-rank)
|
|
@@ -70,6 +70,38 @@ $ claude-rank scan https://houseofmvps.com # Scan any live URL
|
|
|
70
70
|
╚════════════════════════════════════════════════╝
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
+
```
|
|
74
|
+
$ claude-rank compete https://competitor.com ./my-project
|
|
75
|
+
|
|
76
|
+
╔══════════════════════════════════════════════════════════════╗
|
|
77
|
+
║ claude-rank Competitive X-Ray ║
|
|
78
|
+
╠══════════════════════════════════════════════════════════════╣
|
|
79
|
+
║ You: My SaaS Product ║
|
|
80
|
+
║ Them: Competitor Landing Page ║
|
|
81
|
+
╠══════════════════════════════════════════════════════════════╣
|
|
82
|
+
║ Score: You 12 vs Them 6 (2 ties) ║
|
|
83
|
+
╚══════════════════════════════════════════════════════════════╝
|
|
84
|
+
|
|
85
|
+
You're winning 12-6 (2 ties). Keep pushing.
|
|
86
|
+
|
|
87
|
+
Signal-by-Signal Comparison:
|
|
88
|
+
Area You Them Winner
|
|
89
|
+
──────────────────────────────────────────────────────────
|
|
90
|
+
Title tag Yes Yes ─ Tie
|
|
91
|
+
Word count 1,247 386 ✓ You
|
|
92
|
+
JSON-LD schemas 3 0 ✓ You
|
|
93
|
+
Conversion signals 5 2 ✓ You
|
|
94
|
+
Internal links 12 3 ✓ You
|
|
95
|
+
|
|
96
|
+
Tech Stack:
|
|
97
|
+
You: Next.js (Framework), Tailwind CSS (CSS), Stripe (Payments)
|
|
98
|
+
Them: WordPress (CMS), Google Analytics (Analytics)
|
|
99
|
+
|
|
100
|
+
Quick Wins — Close These Gaps:
|
|
101
|
+
⚠ Open Graph tags
|
|
102
|
+
⚠ External links
|
|
103
|
+
```
|
|
104
|
+
|
|
73
105
|
*Real output from scanning [savemrr.co](https://savemrr.co) (26-page SaaS landing) and [houseofmvps.com](https://houseofmvps.com).*
|
|
74
106
|
|
|
75
107
|
---
|
|
@@ -106,6 +138,7 @@ Once installed, use slash commands:
|
|
|
106
138
|
/claude-rank:rank-aeo # Answer engine optimization audit
|
|
107
139
|
/claude-rank:rank-fix # Auto-fix all findings in one command
|
|
108
140
|
/claude-rank:rank-schema # Detect, validate, generate, inject JSON-LD
|
|
141
|
+
/claude-rank:rank-compete # Competitive X-Ray — compare vs any competitor URL
|
|
109
142
|
```
|
|
110
143
|
|
|
111
144
|
**Zero configuration.** claude-rank reads your project structure and self-configures.
|
|
@@ -118,6 +151,7 @@ npx @houseofmvps/claude-rank scan https://example.com # Live URL (crawls up t
|
|
|
118
151
|
npx @houseofmvps/claude-rank geo ./my-project # AI search audit
|
|
119
152
|
npx @houseofmvps/claude-rank aeo ./my-project # Answer engine audit
|
|
120
153
|
npx @houseofmvps/claude-rank schema ./my-project # Structured data
|
|
154
|
+
npx @houseofmvps/claude-rank compete https://competitor.com . # Competitive X-Ray
|
|
121
155
|
npx @houseofmvps/claude-rank scan ./site --json # Raw JSON output
|
|
122
156
|
npx @houseofmvps/claude-rank scan ./site --report html # Agency-ready HTML report
|
|
123
157
|
npx @houseofmvps/claude-rank scan ./site --threshold 80 # CI/CD mode
|
|
@@ -204,6 +238,28 @@ Answer Engine Optimization. Featured snippets, People Also Ask, voice search.
|
|
|
204
238
|
| **Voice Search** | Concise answers under 29 words (Google voice search average), conversational phrasing |
|
|
205
239
|
| **Rich Results** | Featured image, breadcrumb markup, review schema |
|
|
206
240
|
|
|
241
|
+
### Competitive X-Ray — NEW in v1.7
|
|
242
|
+
|
|
243
|
+
Point at any competitor URL. claude-rank fetches their page and compares everything side-by-side:
|
|
244
|
+
|
|
245
|
+
| Category | What it compares |
|
|
246
|
+
|---|---|
|
|
247
|
+
| **Tech Stack** | Framework, CMS, CDN, analytics, payments, chat — 50+ detection patterns (Wappalyzer-style) |
|
|
248
|
+
| **SEO Signals** | Title, meta description, canonical, Open Graph, Twitter Card, structured data |
|
|
249
|
+
| **Content Depth** | Word count, heading structure, internal/external links |
|
|
250
|
+
| **Conversion Signals** | CTAs, pricing pages, demo booking, social proof, waitlists — 24 patterns |
|
|
251
|
+
| **Structured Data** | JSON-LD count, schema types, validation against Google required fields |
|
|
252
|
+
| **Performance** | Blocking vs deferred scripts, semantic HTML usage |
|
|
253
|
+
|
|
254
|
+
**Output:** Signal-by-signal comparison table with clear winner per area, tech stack diff, conversion signal diff, quick wins (gaps to close), and your strengths (advantages to keep).
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
claude-rank compete https://competitor.com ./my-project # Compare vs competitor
|
|
258
|
+
claude-rank compete https://competitor.com ./my-project --json # Raw JSON output
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
No API keys. No rate limits. No signup. Just point and compare.
|
|
262
|
+
|
|
207
263
|
### Core Web Vitals (Lighthouse)
|
|
208
264
|
|
|
209
265
|
Performance scoring powered by Lighthouse. **No separate install needed** — uses `npx -y lighthouse@12` automatically. Just needs Chrome or Chromium on your machine.
|
|
@@ -328,6 +384,7 @@ Each audit produces separate SEO, GEO, and AEO scores plus a composite. Same rul
|
|
|
328
384
|
| `claude-rank scan https://example.com` | Crawl and scan a live site (up to 50 pages) |
|
|
329
385
|
| `claude-rank geo ./project` | GEO scan — AI search optimization (25 rules) |
|
|
330
386
|
| `claude-rank aeo ./project` | AEO scan — answer engine optimization (12 rules) |
|
|
387
|
+
| `claude-rank compete https://competitor.com .` | Competitive X-Ray — side-by-side comparison |
|
|
331
388
|
| `claude-rank cwv https://example.com` | Core Web Vitals via Lighthouse (optional) |
|
|
332
389
|
| `claude-rank schema ./project` | Detect and validate structured data |
|
|
333
390
|
| `claude-rank scan ./site --report html` | Generate agency-ready HTML report |
|
|
@@ -345,6 +402,7 @@ Each audit produces separate SEO, GEO, and AEO scores plus a composite. Same rul
|
|
|
345
402
|
| `/claude-rank:rank-aeo` | Answer engine optimization audit |
|
|
346
403
|
| `/claude-rank:rank-fix` | Auto-fix all findings in one command |
|
|
347
404
|
| `/claude-rank:rank-schema` | Detect, validate, generate, inject JSON-LD |
|
|
405
|
+
| `/claude-rank:rank-compete` | Competitive X-Ray — compare vs any competitor URL |
|
|
348
406
|
|
|
349
407
|
---
|
|
350
408
|
|
|
@@ -366,6 +424,8 @@ Each audit produces separate SEO, GEO, and AEO scores plus a composite. Same rul
|
|
|
366
424
|
| Multi-page URL crawling (up to 50 pages) | Yes | No |
|
|
367
425
|
| HTML report export (agency-ready) | Yes | No |
|
|
368
426
|
| CI/CD threshold mode | Yes | No |
|
|
427
|
+
| Competitive analysis (X-Ray) | Yes — side-by-side comparison | No |
|
|
428
|
+
| Tech stack detection (50+ patterns) | Yes | No |
|
|
369
429
|
| AI bot detection | 9 bots | Basic |
|
|
370
430
|
| llms.txt generation | Yes | No |
|
|
371
431
|
| robots.txt generation | Yes | No |
|
|
@@ -392,7 +452,7 @@ Two terms that matter and are often confused:
|
|
|
392
452
|
| **SSRF protection** | All HTTP tools block private IPs, cloud metadata, non-HTTP schemes |
|
|
393
453
|
| **No telemetry** | Zero data collection. No phone-home. Ever. |
|
|
394
454
|
| **1 dependency** | `htmlparser2` only (30KB). No native bindings. No `node-gyp`. |
|
|
395
|
-
| **
|
|
455
|
+
| **260 tests** | Security module, all scanners, competitive X-Ray, CLI, integration tests |
|
|
396
456
|
| **File safety** | 10MB read cap. 5MB response cap. Restrictive write permissions. |
|
|
397
457
|
|
|
398
458
|
See [SECURITY.md](SECURITY.md) for the full vulnerability disclosure policy.
|
|
@@ -403,10 +463,10 @@ See [SECURITY.md](SECURITY.md) for the full vulnerability disclosure policy.
|
|
|
403
463
|
|
|
404
464
|
| Category | Count | Highlights |
|
|
405
465
|
|---|---|---|
|
|
406
|
-
| **Tools** |
|
|
407
|
-
| **Skills** |
|
|
466
|
+
| **Tools** | 10 | SEO scanner (39 rules), GEO scanner (25 rules), AEO scanner (12 rules), Competitive X-Ray (50+ tech patterns), Lighthouse/CWV scanner, schema engine, robots analyzer, sitemap analyzer, llms.txt generator, audit history |
|
|
467
|
+
| **Skills** | 7 | /claude-rank:rank, /claude-rank:rank-audit, /claude-rank:rank-geo, /claude-rank:rank-aeo, /claude-rank:rank-fix, /claude-rank:rank-schema, /claude-rank:rank-compete |
|
|
408
468
|
| **Agents** | 4 | SEO auditor (project-type-aware), GEO auditor (AI readiness levels), AEO auditor (snippet opportunities), Schema auditor (Google validation) |
|
|
409
|
-
| **Commands** |
|
|
469
|
+
| **Commands** | 7 | All slash commands above |
|
|
410
470
|
| **Research** | 3 | SEO benchmarks, GEO research, schema catalog |
|
|
411
471
|
|
|
412
472
|
---
|
|
@@ -449,7 +509,7 @@ Found a bug? Want a new scanner rule? [Open an issue](https://github.com/Houseof
|
|
|
449
509
|
git clone https://github.com/Houseofmvps/claude-rank.git
|
|
450
510
|
cd claude-rank
|
|
451
511
|
npm install
|
|
452
|
-
npm test #
|
|
512
|
+
npm test # 260 tests, node:test
|
|
453
513
|
node tools/<tool>.mjs # No build step
|
|
454
514
|
```
|
|
455
515
|
|
package/bin/claude-rank.mjs
CHANGED
|
@@ -26,6 +26,15 @@ const positional = args.filter((a, i) => {
|
|
|
26
26
|
});
|
|
27
27
|
const [command = 'scan', dir = '.'] = positional;
|
|
28
28
|
|
|
29
|
+
// Reject empty string as target
|
|
30
|
+
if (command !== 'help' && (dir === '' || dir.trim() === '')) {
|
|
31
|
+
console.error('No target directory or URL provided.\n');
|
|
32
|
+
console.error('Usage: claude-rank <command> <directory>');
|
|
33
|
+
console.error(' claude-rank <command> <url>\n');
|
|
34
|
+
console.error('Run "claude-rank help" for all options.');
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
|
|
29
38
|
const commands = {
|
|
30
39
|
scan: '../tools/seo-scanner.mjs',
|
|
31
40
|
geo: '../tools/geo-scanner.mjs',
|
|
@@ -42,6 +51,7 @@ Commands:
|
|
|
42
51
|
scan Run core SEO scanner (default)
|
|
43
52
|
geo Run GEO (AI search) scanner
|
|
44
53
|
aeo Run AEO (answer engine) scanner
|
|
54
|
+
compete Competitive X-Ray — compare your site vs any competitor URL
|
|
45
55
|
cwv Run Core Web Vitals / Lighthouse audit (needs Chrome installed)
|
|
46
56
|
schema Detect and validate structured data
|
|
47
57
|
help Show this help message
|
|
@@ -64,6 +74,7 @@ Examples:
|
|
|
64
74
|
claude-rank scan https://savemrr.co
|
|
65
75
|
claude-rank scan https://savemrr.co --pages 10
|
|
66
76
|
claude-rank scan https://savemrr.co --single
|
|
77
|
+
claude-rank compete https://competitor.com ./my-project
|
|
67
78
|
npx @houseofmvps/claude-rank geo .
|
|
68
79
|
claude-rank scan ./site --json
|
|
69
80
|
claude-rank scan ./site --report html
|
|
@@ -73,6 +84,36 @@ Examples:
|
|
|
73
84
|
process.exit(0);
|
|
74
85
|
}
|
|
75
86
|
|
|
87
|
+
// Handle compete command separately (requires URL + local dir)
|
|
88
|
+
if (command === 'compete') {
|
|
89
|
+
const competitorUrl = dir;
|
|
90
|
+
if (!competitorUrl.startsWith('http://') && !competitorUrl.startsWith('https://')) {
|
|
91
|
+
console.error('The compete command requires a competitor URL.');
|
|
92
|
+
console.error('Usage: claude-rank compete <competitor-url> [your-directory]');
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// The local dir is the third positional arg (after 'compete' and URL)
|
|
97
|
+
const localDir = positional[2] || '.';
|
|
98
|
+
const { resolve: resolvePath } = await import('path');
|
|
99
|
+
|
|
100
|
+
const { compete } = await import(new URL('../tools/compete-scanner.mjs', import.meta.url));
|
|
101
|
+
const { formatCompeteReport } = await import(new URL('../tools/lib/formatter.mjs', import.meta.url));
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
const result = await compete(competitorUrl, resolvePath(localDir));
|
|
105
|
+
if (jsonFlag) {
|
|
106
|
+
console.log(JSON.stringify(result, null, 2));
|
|
107
|
+
} else {
|
|
108
|
+
console.log(formatCompeteReport(result));
|
|
109
|
+
}
|
|
110
|
+
} catch (err) {
|
|
111
|
+
console.error(`Error: ${err.message}`);
|
|
112
|
+
process.exit(1);
|
|
113
|
+
}
|
|
114
|
+
process.exit(0);
|
|
115
|
+
}
|
|
116
|
+
|
|
76
117
|
// Handle CWV command separately (requires URL, optional dependency)
|
|
77
118
|
if (command === 'cwv') {
|
|
78
119
|
const url = dir.startsWith('http://') || dir.startsWith('https://') ? dir : null;
|
package/commands/rank-aeo.md
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Answer engine optimization. Featured snippets, voice search, People Also Ask."
|
|
3
3
|
---
|
|
4
|
+
|
|
5
|
+
## Syntax
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/claude-rank:rank-aeo [directory]
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## What It Does
|
|
12
|
+
|
|
13
|
+
1. Checks for FAQPage, HowTo, speakable schema
|
|
14
|
+
2. Analyzes snippet fitness (answer length, numbered steps, direct answers)
|
|
15
|
+
3. Evaluates voice search readiness (20-35 word concise answers)
|
|
16
|
+
4. Generates missing schema (FAQPage, HowTo, speakable)
|
|
17
|
+
|
|
18
|
+
## Example
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
/claude-rank:rank-aeo ./my-blog
|
|
22
|
+
```
|
package/commands/rank-audit.md
CHANGED
|
@@ -1,3 +1,26 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Full SEO/GEO/AEO audit with auto-fix. Scans, reports, fixes, and verifies."
|
|
3
3
|
---
|
|
4
|
+
|
|
5
|
+
## Syntax
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/claude-rank:rank-audit [directory]
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Directory defaults to `.` (current directory) if omitted.
|
|
12
|
+
|
|
13
|
+
## What It Does
|
|
14
|
+
|
|
15
|
+
1. Runs SEO scanner (39+ rules), GEO scanner (34 rules), AEO scanner (12 rules)
|
|
16
|
+
2. Reports findings grouped by severity
|
|
17
|
+
3. Auto-fixes: generates robots.txt, sitemap.xml, llms.txt, JSON-LD schema
|
|
18
|
+
4. Re-scans to verify improvements
|
|
19
|
+
5. Saves score history for trend tracking
|
|
20
|
+
6. Outputs Google Search Console + Bing Webmaster Tools action plan
|
|
21
|
+
|
|
22
|
+
## Example
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
/claude-rank:rank-audit ./my-saas-landing
|
|
26
|
+
```
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Competitive X-Ray. Compare your site's SEO signals, tech stack, content depth, and conversion patterns against any competitor URL."
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
## Syntax
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/claude-rank:rank-compete <competitor-url> [your-directory]
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## What It Does
|
|
12
|
+
|
|
13
|
+
1. **Fetches** the competitor URL (with SSRF protection and redirect tracking)
|
|
14
|
+
2. **Detects tech stack** — frameworks, CDNs, analytics, payments, chat tools (50+ patterns)
|
|
15
|
+
3. **Compares SEO signals** — meta tags, Open Graph, structured data, canonical URLs
|
|
16
|
+
4. **Measures content depth** — word count, heading structure, internal/external links
|
|
17
|
+
5. **Identifies conversion signals** — CTAs, pricing pages, social proof, demo booking
|
|
18
|
+
6. **Outputs side-by-side comparison** with signal-by-signal verdicts (You vs Them)
|
|
19
|
+
|
|
20
|
+
## Output
|
|
21
|
+
|
|
22
|
+
- Score summary (wins, losses, ties)
|
|
23
|
+
- Signal-by-signal comparison table
|
|
24
|
+
- Tech stack comparison
|
|
25
|
+
- Conversion signal comparison
|
|
26
|
+
- Quick wins (gaps to close)
|
|
27
|
+
- Your strengths (advantages to keep)
|
|
28
|
+
|
|
29
|
+
## Example
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
/claude-rank:rank-compete https://competitor.com ./my-project
|
|
33
|
+
```
|
package/commands/rank-fix.md
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Auto-fix all SEO/GEO/AEO findings. One command to fix everything."
|
|
3
3
|
---
|
|
4
|
+
|
|
5
|
+
## Syntax
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/claude-rank:rank-fix [directory]
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## What It Does
|
|
12
|
+
|
|
13
|
+
1. Runs all scanners to identify issues
|
|
14
|
+
2. Generates missing files: robots.txt, sitemap.xml, llms.txt
|
|
15
|
+
3. Injects missing meta tags, JSON-LD schema
|
|
16
|
+
4. Re-scans and shows before/after score comparison
|
|
17
|
+
|
|
18
|
+
## Example
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
/claude-rank:rank-fix .
|
|
22
|
+
```
|
package/commands/rank-geo.md
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "AI search optimization audit. Optimize for ChatGPT, Perplexity, Google AI Overviews, Gemini."
|
|
3
3
|
---
|
|
4
|
+
|
|
5
|
+
## Syntax
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/claude-rank:rank-geo [directory]
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## What It Does
|
|
12
|
+
|
|
13
|
+
1. Checks robots.txt for AI bot access (GPTBot, PerplexityBot, ClaudeBot, etc.)
|
|
14
|
+
2. Verifies llms.txt, structured data, and content structure for AI citation readiness
|
|
15
|
+
3. Fixes: unblocks AI bots, generates llms.txt, adds Organization/Author schema
|
|
16
|
+
4. Provides GSC/Bing submission steps for AI recrawl
|
|
17
|
+
|
|
18
|
+
## Example
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
/claude-rank:rank-geo ./my-site
|
|
22
|
+
```
|
package/commands/rank-schema.md
CHANGED
|
@@ -1,3 +1,23 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: "Structured data management. Detect, validate, generate, and inject JSON-LD schema."
|
|
3
3
|
---
|
|
4
|
+
|
|
5
|
+
## Syntax
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/claude-rank:rank-schema [directory]
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## What It Does
|
|
12
|
+
|
|
13
|
+
1. **Detect** — finds all JSON-LD in HTML files
|
|
14
|
+
2. **Validate** — checks against Google's required fields (14 schema types)
|
|
15
|
+
3. **Recommend** — suggests missing schema based on page content
|
|
16
|
+
4. **Generate** — creates JSON-LD for Organization, Article, FAQPage, HowTo, etc.
|
|
17
|
+
5. **Verify** — re-runs detection to confirm injection
|
|
18
|
+
|
|
19
|
+
## Example
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
/claude-rank:rank-schema ./my-site
|
|
23
|
+
```
|
package/commands/rank.md
CHANGED
|
@@ -2,4 +2,27 @@
|
|
|
2
2
|
description: "SEO/GEO/AEO audit, analysis, and optimization. The most comprehensive search toolkit for Claude Code."
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
## Syntax
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
/claude-rank:rank [subcommand] [directory]
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Subcommands
|
|
12
|
+
|
|
13
|
+
| Subcommand | Description |
|
|
14
|
+
|---|---|
|
|
15
|
+
| *(none)* | Quick health check — shows SEO, GEO, AEO scores |
|
|
16
|
+
| `audit` | Full 9-phase audit with auto-fix + GSC action plan |
|
|
17
|
+
| `geo` | AI search optimization (ChatGPT, Perplexity, Gemini) |
|
|
18
|
+
| `aeo` | Answer engine optimization (snippets, voice, PAA) |
|
|
19
|
+
| `fix` | Auto-fix all findings in one command |
|
|
20
|
+
| `schema` | Detect, validate, generate, inject JSON-LD |
|
|
21
|
+
|
|
22
|
+
## Examples
|
|
23
|
+
|
|
24
|
+
```
|
|
25
|
+
/claude-rank:rank # Quick scores for current directory
|
|
26
|
+
/claude-rank:rank audit ./my-site # Full audit with fixes
|
|
27
|
+
/claude-rank:rank geo . # AI search check
|
|
28
|
+
```
|
package/hooks/hooks.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"PostToolUse": [
|
|
4
4
|
{
|
|
5
5
|
"matcher": "Edit|Write",
|
|
6
|
-
"command": "node ${CLAUDE_PLUGIN_ROOT}/tools/schema-engine.mjs validate
|
|
6
|
+
"command": "if echo \"$CLAUDE_FILE_PATH\" | grep -qiE '\\.html?$'; then node ${CLAUDE_PLUGIN_ROOT}/tools/schema-engine.mjs validate \"$CLAUDE_FILE_PATH\" 2>/dev/null; fi"
|
|
7
7
|
}
|
|
8
8
|
]
|
|
9
9
|
}
|
package/package.json
CHANGED
package/research/geo-research.md
CHANGED
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
## Citation & Visibility
|
|
6
6
|
|
|
7
7
|
### Content Passage Optimization
|
|
8
|
-
- **Citability sweet spot**: 134-167 words per passage (AI selection rate 68%)
|
|
8
|
+
- **Citability sweet spot**: 134-167 words per passage (AI selection rate 68%) *(Source: Semrush "State of AI Search" study, 2025)*
|
|
9
9
|
- **Direct answer placement**: First 40-60 words (3.2x higher selection)
|
|
10
10
|
- **Passage structure**: Question → Answer → Context (preferred by LLMs)
|
|
11
11
|
- **Citation frequency**: Avg 2-3 citations per 1000 words (visibility signal)
|
|
12
12
|
|
|
13
13
|
### Multi-Modal Impact
|
|
14
|
-
- **Multimedia increases selection**: +156% (images, video, tables, charts)
|
|
14
|
+
- **Multimedia increases selection**: +156% (images, video, tables, charts) *(Source: Search Engine Journal, "Multimedia & AI Citation Rates," Jan 2026)*
|
|
15
15
|
- **Optimal image count**: 3-5 per 1000 words
|
|
16
16
|
- **Alt text optimization**: Include target keyword + context
|
|
17
17
|
- **Captions**: Significantly boost AI selection (tables, charts, diagrams)
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
## Ranking Factors for AI Search
|
|
21
21
|
|
|
22
22
|
### Brand Mentions vs Backlinks
|
|
23
|
-
- **Brand mention correlation**: 3x stronger than backlink count for AI visibility
|
|
23
|
+
- **Brand mention correlation**: 3x stronger than backlink count for AI visibility *(Source: Perplexity Labs citation analysis, Q4 2025)*
|
|
24
24
|
- **Unlinked mentions**: Now tracked by AI engines (0.8x linked mention weight)
|
|
25
25
|
- **Mention context**: Sentiment & topical relevance matter more than frequency
|
|
26
26
|
- **Brand sentiment**: Positive mentions increase selection by 2.1x
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
## AI Platform Overlap & Visibility
|
|
64
64
|
|
|
65
65
|
### Cross-Platform Citation Data
|
|
66
|
-
- **ChatGPT & Google AI Overlap**: 11% domain overlap (different sources preferred)
|
|
66
|
+
- **ChatGPT & Google AI Overlap**: 11% domain overlap (different sources preferred) *(Source: Semrush cross-platform AI citation study, 2025)*
|
|
67
67
|
- **Perplexity vs ChatGPT**: 34% domain overlap (Perplexity favors long-form)
|
|
68
68
|
- **Top citation sources**: News sites (28%), Wikipedia (15%), E-commerce (12%)
|
|
69
69
|
- **Content type overlap**: How-to guides (89% overlap), News (42% overlap)
|
|
@@ -103,4 +103,4 @@
|
|
|
103
103
|
|
|
104
104
|
---
|
|
105
105
|
|
|
106
|
-
*
|
|
106
|
+
*Primary sources: Perplexity Labs citation analysis (Q4 2025), Semrush "State of AI Search" study (2025), Search Engine Journal "Multimedia & AI Citation Rates" (Jan 2026), Semrush cross-platform AI citation study (2025), OpenAI developer documentation*
|
package/skills/rank/SKILL.md
CHANGED
|
@@ -15,15 +15,9 @@ description: "Main orchestrator for claude-rank SEO/GEO/AEO toolkit. Routes to s
|
|
|
15
15
|
| `/rank aeo [dir]` | rank-aeo | Answer engine optimization |
|
|
16
16
|
| `/rank fix [dir]` | rank-fix | Auto-fix all findings |
|
|
17
17
|
| `/rank schema [dir]` | rank-schema | Schema detect/validate/generate |
|
|
18
|
-
| `/rank
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
| `/rank local [dir]` | rank-local | Local SEO (Phase 3) |
|
|
22
|
-
| `/rank images [dir]` | rank-images | Image optimization (Phase 3) |
|
|
23
|
-
| `/rank competitor [dir]` | rank-competitor | Competitive intelligence (Phase 4) |
|
|
24
|
-
| `/rank keywords [dir]` | rank-keywords | Keyword research (Phase 4) |
|
|
25
|
-
| `/rank report [dir]` | rank-report | Client report generation (Phase 5) |
|
|
26
|
-
| `/rank plan [type]` | rank-plan | Strategic SEO roadmap (Phase 5) |
|
|
18
|
+
| `/rank compete <url> [dir]` | rank-compete | Competitive X-Ray vs any URL |
|
|
19
|
+
|
|
20
|
+
*Future phases (not yet implemented): technical, content, speed, local, images, keywords, report, plan*
|
|
27
21
|
|
|
28
22
|
## Quick Health Check (bare /rank)
|
|
29
23
|
|
package/skills/rank-geo/SKILL.md
CHANGED
|
@@ -50,6 +50,6 @@ After deploying GEO fixes, submit to search engines so AI crawlers pick up the c
|
|
|
50
50
|
### AI Search Verification (wait 2-4 weeks)
|
|
51
51
|
1. Search your brand name + top 3 keywords in ChatGPT, Perplexity, Google AI Overviews, Gemini
|
|
52
52
|
2. Screenshot results as a baseline
|
|
53
|
-
3. Note which competitors are cited — create citation-ready content for each gap (134-167 word passages)
|
|
54
|
-
4. Add comparison tables and statistics
|
|
53
|
+
3. Note which competitors are cited — create citation-ready content for each gap (134-167 word passages per Semrush "State of AI Search" study, 2025)
|
|
54
|
+
4. Add comparison tables and statistics — multimedia increases AI citation rates by ~156% (Source: Search Engine Journal, "Multimedia & AI Citation Rates," Jan 2026)
|
|
55
55
|
5. Set up weekly monitoring — track your AI citation rate vs competitors
|
package/tools/aeo-scanner.mjs
CHANGED
|
@@ -36,13 +36,24 @@ const RULES = {
|
|
|
36
36
|
// Helpers
|
|
37
37
|
// ---------------------------------------------------------------------------
|
|
38
38
|
|
|
39
|
-
const QUESTION_WORDS = /^(what|how|why|when|where|who|which|can|does|is|are|do|should|will)\b/i;
|
|
39
|
+
const QUESTION_WORDS = /^(what|how|why|when|where|who|which|can|does|is|are|do|should|will|could|would|has|have|did|was|were|shall|may|might|need)\b/i;
|
|
40
|
+
|
|
41
|
+
// Marketing headers that start with question words but aren't real questions
|
|
42
|
+
const MARKETING_HEADERS = new Set([
|
|
43
|
+
"what's new", "what we do", "what we offer", "what we build",
|
|
44
|
+
"how it works", "how we work", "how to get started",
|
|
45
|
+
"why us", "why choose us", "who we are", "where we are",
|
|
46
|
+
"is it time", "are you ready",
|
|
47
|
+
]);
|
|
40
48
|
|
|
41
49
|
/**
|
|
42
50
|
* Returns true if a heading text starts with a question word.
|
|
51
|
+
* Excludes known marketing headers that aren't real questions.
|
|
43
52
|
*/
|
|
44
53
|
function isQuestionHeading(text) {
|
|
45
|
-
|
|
54
|
+
const lower = text.toLowerCase().trim();
|
|
55
|
+
if (MARKETING_HEADERS.has(lower)) return false;
|
|
56
|
+
return QUESTION_WORDS.test(lower);
|
|
46
57
|
}
|
|
47
58
|
|
|
48
59
|
/**
|
|
@@ -190,7 +201,7 @@ function analyzePage(filePath) {
|
|
|
190
201
|
hasVoiceFriendlyPara,
|
|
191
202
|
questionH2sWithNext,
|
|
192
203
|
hasMissingDirectAnswer,
|
|
193
|
-
wordCount: state.wordCount,
|
|
204
|
+
wordCount: state.mainContentWordCount || state.wordCount,
|
|
194
205
|
imgCount,
|
|
195
206
|
// no snippet answers: question H2s exist but no paragraphs follow them
|
|
196
207
|
noSnippetAnswers: questionH2s.length === 0 ||
|