seo 0.2.9 → 0.2.12
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/README.md +101 -1
- package/dist/cli.js +219 -109
- package/dist/cli.js.map +1 -1
- package/dist/{dist-BrBR9umh.js → dist-D0EI_L8C.js} +1 -1
- package/dist/{dist-C6zXDARm.js → dist-DaHrxVkW.js} +85 -80
- package/dist/dist-DaHrxVkW.js.map +1 -0
- package/dist/index.d.ts +1223 -64
- package/dist/index.js +2801 -410
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +2574 -386
- package/dist/mcp.js.map +1 -1
- package/dist/{package-C51oI-6o.js → package-B-M-4PZ_.js} +2 -2
- package/dist/{package-C51oI-6o.js.map → package-B-M-4PZ_.js.map} +1 -1
- package/evals/bing-webmaster-overview.json +31 -0
- package/evals/link-evidence.json +29 -0
- package/evals/seo.json +16 -0
- package/evals/server-log-analysis.json +29 -0
- package/package.json +3 -3
- package/skills/seo/SKILL.md +56 -67
- package/dist/dist-C6zXDARm.js.map +0 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "bing-webmaster-overview",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Show me how our site is doing in Bing and whether Bing is crawling it cleanly.",
|
|
7
|
+
"expected_output": "Should use report id bing-webmaster-overview for bounded Bing traffic, crawl, query, and page insights. Should follow the discovery flow with seo_list_reports, seo_describe_report, then seo_run_report using the verified Bing site URL. Should read dataStatus and provenance before findings, traffic comparisons, crawl changes, and opportunities. Should inspect query and page coverage before movements because weekly top-list entries missing from a period are unknown, not zero. Movement comparisons require the entry in every weekly top list in both periods. Should state that Bing evidence does not describe Google or the whole search market and that the inIndex statistic is not URL-level proof of indexing.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id bing-webmaster-overview",
|
|
10
|
+
"Follows seo_list_reports, seo_describe_report, seo_run_report in order",
|
|
11
|
+
"Passes the verified Bing site URL",
|
|
12
|
+
"Reads dataStatus and provenance before findings",
|
|
13
|
+
"Treats dimensions missing from weekly top lists as unknown rather than zero",
|
|
14
|
+
"Does not present Bing inIndex as URL-level proof of indexing"
|
|
15
|
+
],
|
|
16
|
+
"files": []
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": 2,
|
|
20
|
+
"prompt": "The Bing report is partial and capped but the returned crawl rows show no 4xx errors. Can we call the site clean?",
|
|
21
|
+
"expected_output": "Should refuse the all-clear. Should explain that partial or capped evidence only describes the retained Bing rows, that invalid or unavailable rows stay visible, and that Bing is one provider rather than a complete live crawl. Should recommend a bounded live site crawl to verify current response and page evidence.",
|
|
22
|
+
"assertions": [
|
|
23
|
+
"Refuses to call the site clean from partial capped evidence",
|
|
24
|
+
"Keeps capped invalid and unavailable rows visible",
|
|
25
|
+
"States Bing is one provider rather than a complete live crawl",
|
|
26
|
+
"Recommends a bounded live crawl for current evidence"
|
|
27
|
+
],
|
|
28
|
+
"files": []
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "link-evidence",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Agent task: show me who links to this site using the connected Bing project.",
|
|
7
|
+
"expected_output": "Should route to report id link-evidence and describe it before the first run. Should run seo links --project <project> --json or seo_run_report with the verified Bing site. Should read dataStatus, provenance, warnings, caveats, and selection before listing rows. Should call the result bounded Bing evidence, not a complete backlink profile, and should recommend opening selected referring URLs to confirm that the links still exist.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id link-evidence",
|
|
10
|
+
"Reads coverage and limits before link rows",
|
|
11
|
+
"Does not claim complete backlink coverage or link quality",
|
|
12
|
+
"Recommends direct verification of selected referring URLs"
|
|
13
|
+
],
|
|
14
|
+
"files": []
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 2,
|
|
18
|
+
"prompt": "Agent task: import ./links.csv and give me every backlink plus domain authority scores.",
|
|
19
|
+
"expected_output": "Should run report id link-evidence with file ./links.csv and bounded row and output limits, or use seo links --file ./links.csv --json. Should explain that the import can normalize and deduplicate retained rows but cannot create domain authority scores or guarantee every backlink. Should read suppliedRows, validRows, invalidRows, duplicateRows, capped, selection, warnings, and caveats before summarising.",
|
|
20
|
+
"assertions": [
|
|
21
|
+
"Uses the bounded file import path",
|
|
22
|
+
"Reads import provenance and output selection",
|
|
23
|
+
"Declines to invent domain authority scores",
|
|
24
|
+
"Does not call the retained rows every backlink"
|
|
25
|
+
],
|
|
26
|
+
"files": []
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|
package/evals/seo.json
CHANGED
|
@@ -82,6 +82,22 @@
|
|
|
82
82
|
"Offers a bounded live verification instead of asserting the rank"
|
|
83
83
|
],
|
|
84
84
|
"files": []
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": 7,
|
|
88
|
+
"prompt": "Make a polished HTML report from our latest SEO audit that I can send to a client. The normal generated template looks too generic.",
|
|
89
|
+
"expected_output": "Should use structured report evidence and create one local standalone HTML file rather than treating the built-in renderer as the required design. Should start from `seo report --project <project> --json` and request `--full` only when the intended layout needs deeper sections. The page should be responsive, accessible, print friendly, self contained, and marked noindex,nofollow. It should visibly preserve the site, reporting period, generated date, provider labels, data status, priorities, caveats, skipped or partial evidence, and verification steps. It may choose a visual style for the audience but must not invent missing values, forecasts, causation, scores, or stronger conclusions. It should keep provider evidence separate, omit secrets and unnecessary raw rows, save the file locally, and tell the user where it was written.",
|
|
90
|
+
"assertions": [
|
|
91
|
+
"Creates a local standalone HTML file from structured report evidence",
|
|
92
|
+
"Uses compact JSON first and requests full detail only when the layout needs it",
|
|
93
|
+
"Treats layout and visual style as flexible rather than copying the built-in renderer",
|
|
94
|
+
"Keeps provider labels, dates, data status, caveats, partial states, and verification steps visible",
|
|
95
|
+
"Does not invent missing values, forecasts, causation, scores, or stronger conclusions",
|
|
96
|
+
"Keeps provider evidence separate and omits secrets and unnecessary raw rows",
|
|
97
|
+
"Makes the page responsive, accessible, print friendly, self contained, and noindex",
|
|
98
|
+
"Saves the file locally and reports its path"
|
|
99
|
+
],
|
|
100
|
+
"files": []
|
|
85
101
|
}
|
|
86
102
|
]
|
|
87
103
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"subject": "server-log-analysis",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": 1,
|
|
6
|
+
"prompt": "Agent task: analyze ./access.log and tell me which search crawlers are hitting errors.",
|
|
7
|
+
"expected_output": "Should route to report id server-log-analysis and describe it before the first run. Should run seo server-logs analyze --file ./access.log --json or the structured report with bounded row, path, and output limits. Should read dataStatus, provenance coverage, warnings, caveats, statusCodes, crawlers, and selection before listing crawler paths. Should treat user-agent classification as observed but unverified and should verify important errors against the original log and server configuration.",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Uses report id server-log-analysis",
|
|
10
|
+
"Reads file coverage and limits before crawler path rows",
|
|
11
|
+
"Does not treat a user-agent match as verified crawler identity",
|
|
12
|
+
"Recommends checking important errors against the source evidence"
|
|
13
|
+
],
|
|
14
|
+
"files": []
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": 2,
|
|
18
|
+
"prompt": "Agent task: load this huge JSONL access log and keep every raw request so we can search it later.",
|
|
19
|
+
"expected_output": "Should explain that server-log-analysis is a one-shot streaming aggregate and does not retain raw requests or build a local log database. Should use explicit row, path, and output bounds, then report any capped, malformed, or untracked evidence. Should recommend a dedicated log platform if durable raw-event search is required.",
|
|
20
|
+
"assertions": [
|
|
21
|
+
"Uses streaming bounded aggregation",
|
|
22
|
+
"Does not claim raw log retention",
|
|
23
|
+
"Keeps capped and malformed evidence visible",
|
|
24
|
+
"Does not load the whole file into memory"
|
|
25
|
+
],
|
|
26
|
+
"files": []
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "seo",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.12",
|
|
4
4
|
"description": "The only SEO skill your agent needs. 50+ SEO audit tools through a local CLI and MCP server, using your own crawl, Search Console, and Google Analytics data.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -74,8 +74,8 @@
|
|
|
74
74
|
"security:check": "pnpm run security:audit && pnpm run security:secrets",
|
|
75
75
|
"security:secrets": "node scripts/security-secrets.mjs",
|
|
76
76
|
"skills:validate": "node scripts/validate-skills.mjs",
|
|
77
|
-
"test": "turbo run test && pnpm run build:package && node --test scripts/package.test.mjs scripts/dogfood-summary.test.mjs && node scripts/resource-harness.mjs && node scripts/provider-resource-harness.mjs && pnpm run skills:validate",
|
|
78
|
-
"test:resources": "pnpm run build:package && node scripts/resource-harness.mjs && node scripts/provider-resource-harness.mjs",
|
|
77
|
+
"test": "turbo run test && pnpm run build:package && node --test scripts/package.test.mjs scripts/dogfood-summary.test.mjs && node scripts/resource-harness.mjs && node scripts/provider-resource-harness.mjs && node scripts/indexnow-resource-harness.mjs && node scripts/bing-resource-harness.mjs && pnpm run skills:validate",
|
|
78
|
+
"test:resources": "pnpm run build:package && node scripts/resource-harness.mjs && node scripts/provider-resource-harness.mjs && node scripts/indexnow-resource-harness.mjs && node scripts/bing-resource-harness.mjs",
|
|
79
79
|
"test:package-install": "pnpm run build:package && node --test scripts/installed-package.test.mjs",
|
|
80
80
|
"typecheck": "turbo run typecheck"
|
|
81
81
|
},
|
package/skills/seo/SKILL.md
CHANGED
|
@@ -5,25 +5,20 @@ description: Use and read this skill immediately if the user request is in any w
|
|
|
5
5
|
|
|
6
6
|
# seo
|
|
7
7
|
|
|
8
|
-
`seo` is a local CLI, MCP server, and report engine
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
hosted; data stays on the machine.
|
|
13
|
-
|
|
14
|
-
You do not need to memorise reports. Discover them at runtime.
|
|
8
|
+
`seo` is a local CLI, MCP server, and report engine using crawl, Search Console,
|
|
9
|
+
Google Analytics, and optional Bing evidence. Reports keep observations,
|
|
10
|
+
findings, caveats, and provenance separate. Data stays local. Discover reports
|
|
11
|
+
at runtime instead of memorising them.
|
|
15
12
|
|
|
16
13
|
## Discover, describe, run
|
|
17
14
|
|
|
18
15
|
With the MCP server (preferred):
|
|
19
16
|
|
|
20
|
-
1. `seo_list_reports` returns
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
3. `seo_run_report` with the id and a bounded `params` object. Read
|
|
26
|
-
`structuredContent`, not the display text.
|
|
17
|
+
1. `seo_list_reports` returns report ids and purposes, optionally by category.
|
|
18
|
+
2. `seo_describe_report` returns one report's usage, schema, reading order,
|
|
19
|
+
limits, verification, and related ids.
|
|
20
|
+
3. `seo_run_report` runs bounded `params`. Read `structuredContent`, not display
|
|
21
|
+
text.
|
|
27
22
|
|
|
28
23
|
The same catalog exists without MCP:
|
|
29
24
|
|
|
@@ -33,32 +28,22 @@ seo reports describe <report-id> --json
|
|
|
33
28
|
seo reports run <report-id> --params '<json>' --json
|
|
34
29
|
```
|
|
35
30
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
When a describe response lists `fixableChecks`, the report also serves fix
|
|
42
|
-
guidance per check. After a run, take each failed or warning check id from
|
|
43
|
-
`topActions` and call `seo_describe_report` with `id` and `check` (CLI:
|
|
44
|
-
`seo reports describe <report-id> --check <check-id>`). The result contains
|
|
45
|
-
the goal, fix steps, a ready-to-use agent prompt, spec links, and a
|
|
46
|
-
verification step for that one check. Fetch guidance only for checks you are
|
|
47
|
-
actually going to fix.
|
|
31
|
+
Describe a report before its first run. Follow `readOrder`, `doNotClaim`, and
|
|
32
|
+
`related`; reuse its schema and do not guess parameters. When `fixableChecks`
|
|
33
|
+
exists, fetch guidance only for failed or warning ids in `topActions` with
|
|
34
|
+
`seo_describe_report` using `id` and `check` (CLI:
|
|
35
|
+
`seo reports describe <report-id> --check <check-id>`).
|
|
48
36
|
|
|
49
37
|
## Setup and selection
|
|
50
38
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
reports. Crawl and page audits work with no Google connection at all. Always
|
|
56
|
-
pass `--json`; JSON mode never prompts.
|
|
39
|
+
Use `setup-check` or `seo doctor` when auth is unknown. Select profiles with
|
|
40
|
+
`--project <id>` and list them with `seo projects list --json`. Without one,
|
|
41
|
+
pass `--site sc-domain:example.com` or `--url https://example.com`. Crawl audits
|
|
42
|
+
need no Google connection. Agent commands use `--json`, which never prompts.
|
|
57
43
|
|
|
58
44
|
## Common jobs
|
|
59
45
|
|
|
60
|
-
|
|
61
|
-
its evidence, then decide; do not run a whole chain blindly.
|
|
46
|
+
Run the first report, read it, then decide. Do not run a whole chain blindly.
|
|
62
47
|
|
|
63
48
|
| Job | Reports |
|
|
64
49
|
|---|---|
|
|
@@ -70,33 +55,39 @@ its evidence, then decide; do not run a whole chain blindly.
|
|
|
70
55
|
| AI search visibility and eligibility | `ai-readiness`, `geo-gaps`, `ai-referrals`, `seo-to-ai-query` |
|
|
71
56
|
| Plan content from real demand | `query-clusters`, `page-opportunities`, `content-optimization`, `cannibalisation` |
|
|
72
57
|
| Catch regressions over time | `technical-watch`, `crawl-diff`, `index-watch`, `measure-change` after a fix ships |
|
|
58
|
+
| Review Bing traffic, crawl, query, and page insights | `bing-webmaster-overview`, then `site-crawl` when live page evidence is needed |
|
|
59
|
+
| See who links to the site | `link-evidence`, then verify selected referring URLs directly |
|
|
60
|
+
| Review real crawler requests in a server log | `server-log-analysis`, then verify important errors against the original log and server configuration |
|
|
73
61
|
| Client-ready reporting | `monthly-report`, `narrative-report`, `monthly-action-plan` |
|
|
74
62
|
| Turn crawl findings into tickets | `top-fixes`, `affected-urls`, `explain-crawl-issue` |
|
|
75
63
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
`
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
64
|
+
Use `seo report` first for a broad performance question with a known project.
|
|
65
|
+
For a large or unfamiliar URL, run sitemap health before a full crawl.
|
|
66
|
+
|
|
67
|
+
## Create a client HTML report
|
|
68
|
+
|
|
69
|
+
For a polished or branded report, create one standalone HTML file from
|
|
70
|
+
structured data. Built-in `--format html` is a predictable fallback. Start with
|
|
71
|
+
compact JSON and request `--full` only when deeper evidence is needed. Follow
|
|
72
|
+
supplied brand direction and design for the findings. Use responsive,
|
|
73
|
+
accessible, print-friendly HTML, embedded CSS, `noindex,nofollow`, and no remote
|
|
74
|
+
scripts or assets.
|
|
75
|
+
|
|
76
|
+
Show site, period, generated date, provider labels, data status, priorities,
|
|
77
|
+
limitations, and verification. Preserve partial, capped, sampled, missing, and
|
|
78
|
+
skipped states. Keep observations separate from interpretation and providers
|
|
79
|
+
separate from each other. Never invent scores, forecasts, causes, or missing
|
|
80
|
+
values. Omit secrets and unnecessary raw rows. Save locally and report the path.
|
|
81
|
+
|
|
82
|
+
For a large site, run `site-crawl` with `health: true` and an explicit
|
|
83
|
+
`sitemapUrl` when known. Read `config.strategy`, `access`, failures, limits, and
|
|
84
|
+
sitemap completeness. Full crawl second only for page content, metadata,
|
|
85
|
+
canonicals, links, structured data, or rendered HTML.
|
|
86
|
+
|
|
87
|
+
Requests use `SEO-Skill/<version> (+https://seoskill.dev)`. For
|
|
88
|
+
`access.blockedRequests`, show provider evidence and the identity. Ask for a
|
|
89
|
+
temporary exception scoped by audit IP, host or paths, and blocking rule. Never
|
|
90
|
+
recommend a User-Agent-only bypass.
|
|
100
91
|
|
|
101
92
|
## Evidence rules
|
|
102
93
|
|
|
@@ -115,13 +106,11 @@ rule. Never recommend a broad User-Agent-only bypass.
|
|
|
115
106
|
|
|
116
107
|
## Beyond the report catalog
|
|
117
108
|
|
|
118
|
-
|
|
119
|
-
`seo
|
|
120
|
-
`seo
|
|
121
|
-
`seo
|
|
122
|
-
|
|
123
|
-
caveats that raw queries do not.
|
|
109
|
+
Use `seo help all` for direct provider and administration commands. Bing setup
|
|
110
|
+
uses `seo providers bing`; link evidence uses `seo links --project <id> --json`
|
|
111
|
+
or `seo links --file <path> --json`. IndexNow writes externally: validate with
|
|
112
|
+
`seo indexnow submit --dry-run --json` and remove dry run only when authorised.
|
|
113
|
+
Receipt does not prove crawling or indexing. Prefer registered reports.
|
|
124
114
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
always bypasses page-body cache and never writes page responses to it.
|
|
115
|
+
Use `refresh: true` or `--refresh` only when fresh data is requested. Sitemap
|
|
116
|
+
health always bypasses page-body cache and never writes page responses.
|