seo 0.2.10 → 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.
@@ -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.10",
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
  },
@@ -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. It answers SEO questions
9
- with evidence from three sources: its own crawl of the site, Google Search
10
- Console, and Google Analytics. Every report returns structured JSON with the observed
11
- evidence, derived findings, caveats, and provenance kept separate. Nothing is
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 every report id with a one-line purpose,
21
- optionally by category.
22
- 2. `seo_describe_report` with one id returns when to use it, when to avoid it,
23
- its exact JSON Schema, the order to read its output in, what its evidence
24
- cannot support, one verification step, and related report ids.
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
- Always describe a report before its first run in a session. The describe
37
- response is the per-report manual: follow its `readOrder`, respect its
38
- `doNotClaim` limits, and use its `related` ids to decide what to run next.
39
- Reuse the schema for repeated runs. Do not guess parameters.
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
- Run the `setup-check` report (or `seo doctor`) if auth state is unknown.
52
- Saved project profiles are selected with `--project <id>`; list them with
53
- `seo projects list --json`. Without a profile, pass `--site sc-domain:example.com`
54
- for Search Console reports or `--url https://example.com` for crawl-only
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
- Each job lists report ids in a sensible starting order. Run the first, read
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
- A single page complaint usually needs both angles: the index evidence for that
77
- URL and an `audit-page` pass for content or technical problems on the page
78
- itself.
79
-
80
- The main human report is the `seo report` command. It is the right first move
81
- for a broad performance question with a known project and available search
82
- evidence. For a broad technical audit of a large or unfamiliar URL, run the
83
- sitemap health pass before any full crawl. The focused reports above are for
84
- specific symptoms.
85
-
86
- For a large or unfamiliar site, do not open with a full crawl. Describe and run
87
- `site-crawl` with `health: true` and an explicit `sitemapUrl` when known. This
88
- first pass checks sitemap URL responses, redirects, robots decisions, and
89
- access blocks without downloading, parsing, rendering, or caching page bodies.
90
- Read `config.strategy`, `access`, failures, limits, and sitemap completeness.
91
- Run the full `site-crawl` second only when the question needs page content,
92
- metadata, canonicals, internal links, structured data, or rendered HTML.
93
-
94
- The crawler identifies every HTTP and browser request as
95
- `SEO-Skill/<version> (+https://seoskill.dev)`. If `access.blockedRequests` is
96
- non-zero, give the user the provider evidence and exact User-Agent. A
97
- User-Agent is spoofable, so ask for a temporary exception scoped to the audit
98
- machine source IP, hostname or required paths, and only the blocking security
99
- rule. Never recommend a broad User-Agent-only bypass.
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
- The CLI also has direct commands for raw provider access and administration:
119
- `seo gsc-query`, `seo url-inspect`, `seo analytics google properties`,
120
- `seo analytics google report`, `seo updates`, `seo crawl`, `seo export`, and
121
- `seo projects`. Use `seo help all` to list everything. Prefer a registered
122
- report when one covers the question, because reports carry provenance and
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
- Full report output is cached locally. Pass `refresh: true` (or `--refresh`)
126
- only when the user explicitly wants a fresh fetch. The sitemap health strategy
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.