@seoagent-official/seoagent 1.66.0 → 1.66.1
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/index.js +92 -90
- package/package.json +1 -1
- package/skills/references/audit-checks.md +30 -9
- package/skills/seoagent.md +7 -4
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seoagent-official/seoagent",
|
|
3
|
-
"version": "1.66.
|
|
3
|
+
"version": "1.66.1",
|
|
4
4
|
"description": "The persistent AI SEO agent for Claude Code. Audits, keyword strategy, briefs, articles, real product screenshots from your repo, and the autopilot loop (cloud detects → CLI executes → ack closes) — other SEO tools write the prompt, SEOAgent runs it.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
Loaded by Phase 1 (Technical SEO Audit) when running a full audit. The main `SKILL.md` summarizes the categories; this reference holds the complete check list with the exact pattern to match and the recommendation text.
|
|
4
4
|
|
|
5
|
+
## Verify-before-assert (read first — non-negotiable)
|
|
6
|
+
|
|
7
|
+
**Every factual claim about a page's live state must be grounded in an actual fetch of the live URL — never in repo source, memory, or a prior.** Before running these checks, run `seoagent crawl` (Phase 1 Step 0). It writes `.seoagent/audit/evidence.md` — the live-crawl evidence base (exact title, meta, ALL H1s, canonical + server/client-render flag, every JSON-LD `@type`, OG/Twitter tags, the ACTUAL robots.txt contents, the sitemap URL + blog-post counts, client-rendered-shell detection). Read that file and derive Confirmed findings from it.
|
|
8
|
+
|
|
9
|
+
Three rules govern every finding:
|
|
10
|
+
|
|
11
|
+
1. **Confidence label (mandatory on every finding).** Tag each finding `Confirmed` (verified against the live evidence in `evidence.md` / a fetch you just did), `Likely` (strong inference, not directly verified), or `Hypothesis` (unverified). **Never emit an unverified specific — a price, a line number, a competitor name/roster, a dynamic on-page metric — as a bare fact.** A "2,184 families" style counter that is NOT in the server-fetched HTML is at most `Likely`/`Hypothesis`, never `Confirmed`.
|
|
12
|
+
|
|
13
|
+
2. **Never recommend adding something that already exists.** If `evidence.md` shows the page already serves `Organization` JSON-LD, a canonical tag, OG tags, etc., do NOT recommend adding them — that's the stale-source hallucination this guardrail exists to stop. Only recommend adding what the live evidence shows is genuinely absent.
|
|
14
|
+
|
|
15
|
+
3. **Live-vs-source reconciliation.** When repo/source state and the live-rendered page can disagree, grade the finding against the LIVE site. A repo-only issue (e.g. a `noindex` in a source file that isn't in the served HTML, a robots rule in a committed file that the live `/robots.txt` doesn't serve) must be labeled **"repo-only, unconfirmed on live"** and reported separately — never as production reality.
|
|
16
|
+
|
|
17
|
+
**Do not assert repo-internal specifics (file paths, line numbers) as fact in a live-state finding.** They are fixing *hints*, not verified live facts — mark them `Likely` and phrase as "likely in `app/layout.tsx`", never "on line 42".
|
|
18
|
+
|
|
5
19
|
## Crawlability & Indexation
|
|
6
20
|
|
|
7
21
|
### `robots_txt_exists`
|
|
@@ -10,9 +24,9 @@ Severity if fail: `high`
|
|
|
10
24
|
Recommendation: "Create a robots.txt file at {domain}/robots.txt. At minimum: `User-agent: *\nAllow: /\nSitemap: {domain}/sitemap.xml`."
|
|
11
25
|
|
|
12
26
|
### `robots_txt_blocks_important_paths`
|
|
13
|
-
Check:
|
|
27
|
+
Check: use the ACTUAL robots.txt contents from `evidence.md` (the crawl fetched and parsed the live file). Match its real `Disallow:` rules against the URL list in `pages.md`.
|
|
14
28
|
Severity: `critical` if blocks > 5 known important pages; `high` if blocks any important page.
|
|
15
|
-
Recommendation: List the blocking rules and which pages they affect.
|
|
29
|
+
Recommendation: List **only the blocking rules that actually appear in the fetched robots.txt** and which pages they affect. **Never invent a rule** (e.g. do NOT claim `Disallow: /private/` unless it is verbatim in the fetched file) — quoting a rule that isn't there is the exact hallucination this audit must avoid. If robots.txt wasn't fetched, this check is `Hypothesis` — say "couldn't verify robots.txt" rather than asserting any rule.
|
|
16
30
|
|
|
17
31
|
### `sitemap_exists`
|
|
18
32
|
Check: WebFetch `{domain}/sitemap.xml`. Pass = 200 OK and parseable XML.
|
|
@@ -67,6 +81,11 @@ Recommendation: "{dependency_url} returned {status}. The pages it powers ({list}
|
|
|
67
81
|
|
|
68
82
|
> **Why this check matters:** the most common SEO disaster on a live site is a CMS that's been quietly down for weeks — every page returns 200, the audit looks clean, but Google has been deindexing the blog the whole time. This check catches it on the first audit.
|
|
69
83
|
|
|
84
|
+
### `client_rendered_shell`
|
|
85
|
+
Check: `evidence.md` flags the page as a client-rendered shell — the server HTML is near-empty and/or shows a "Loading…" placeholder with no in-body links. The classic case is a blog index that ships a `Loading…` shell with no post `<a>` links in the server HTML: crawlers (and this fetch) see zero posts.
|
|
86
|
+
Severity: `critical` if it's a content-listing / blog-index / indexable page; `high` otherwise.
|
|
87
|
+
Recommendation: "This page renders client-side — the server HTML has no content/links, so crawlers can't see it (Confirmed from the crawl). Server-render or pre-render it (SSR/SSG/ISR) so the {posts/listings} are in the initial HTML. Any on-page data on this page (counts, listings) is Likely/Hypothesis until it's server-rendered."
|
|
88
|
+
|
|
70
89
|
## On-Page SEO
|
|
71
90
|
|
|
72
91
|
### `title_missing`
|
|
@@ -105,9 +124,9 @@ Severity: `high`
|
|
|
105
124
|
Recommendation: "Add exactly one `<h1>` containing the primary keyword."
|
|
106
125
|
|
|
107
126
|
### `h1_multiple`
|
|
108
|
-
Check: more than one `<h1>` in
|
|
127
|
+
Check: `evidence.md` lists more than one `<h1>` for the page (it captures ALL H1s in document order, so conflicting H1s are detected).
|
|
109
128
|
Severity: `medium`
|
|
110
|
-
Recommendation: "Reduce to one
|
|
129
|
+
Recommendation: "Page has {N} `<h1>`s ({list}). Reduce to one; demote the others to `<h2>`/`<h3>`."
|
|
111
130
|
|
|
112
131
|
### `heading_hierarchy_skipped`
|
|
113
132
|
Check: H1 → H3 with no H2 between, or H2 → H4 with no H3.
|
|
@@ -202,18 +221,20 @@ Recommendation: "Add an FAQ section with 5-7 H3 questions. Powers FAQ schema and
|
|
|
202
221
|
|
|
203
222
|
## Schema Markup
|
|
204
223
|
|
|
224
|
+
> **Schema checks MUST use `evidence.md`, not WebFetch.** WebFetch strips `<script>` tags — it CANNOT see JSON-LD, so "no schema found" from WebFetch is a false negative that leads directly to recommending schema the page already serves. The `seoagent crawl` evidence base parses raw HTML and lists every JSON-LD `@type` present per page. Read that. **Only flag a schema type as missing when `evidence.md` shows it is genuinely absent — never recommend adding a `@type` that already appears in the evidence.**
|
|
225
|
+
|
|
205
226
|
### `no_json_ld_on_article`
|
|
206
|
-
Check: page is a blog article (URL pattern `/blog/*`)
|
|
227
|
+
Check: page is a blog article (URL pattern `/blog/*`) AND `evidence.md` shows **no `Article` (or `BlogPosting`/`NewsArticle`) `@type`** for it.
|
|
207
228
|
Severity: `medium`
|
|
208
|
-
Recommendation: "Add `Article` JSON-LD with headline, author, datePublished, dateModified, image, publisher.logo. See `references/schema-markup.md`."
|
|
229
|
+
Recommendation (only if genuinely absent): "Add `Article` JSON-LD with headline, author, datePublished, dateModified, image, publisher.logo. See `references/schema-markup.md`."
|
|
209
230
|
|
|
210
231
|
### `no_organization_schema_on_homepage`
|
|
211
|
-
Check: homepage has no `Organization`
|
|
232
|
+
Check: `evidence.md` shows the homepage has **no `Organization` `@type`** (and no `SoftwareApplication`/`WebSite` that would already cover the brand entity). If the evidence lists `Organization`/`SoftwareApplication`, this check PASSES — do not recommend adding it.
|
|
212
233
|
Severity: `medium`
|
|
213
|
-
Recommendation: "Add `Organization` JSON-LD on homepage with name, url, logo, sameAs links to social profiles."
|
|
234
|
+
Recommendation (only if genuinely absent): "Add `Organization` JSON-LD on homepage with name, url, logo, sameAs links to social profiles."
|
|
214
235
|
|
|
215
236
|
### `note_schema_detection_limitation`
|
|
216
|
-
|
|
237
|
+
Schema is verified from `evidence.md` (raw-HTML JSON-LD parse), not WebFetch. If the crawl couldn't run, treat any "no schema" conclusion as `Hypothesis` and tell the user: "Test your pages at https://search.google.com/test/rich-results — I couldn't verify JSON-LD via WebFetch (it strips `<script>` blocks). Run `seoagent crawl` for a verified read."
|
|
217
238
|
|
|
218
239
|
## Site Architecture
|
|
219
240
|
|
package/skills/seoagent.md
CHANGED
|
@@ -392,9 +392,12 @@ Once approved, work **a cluster at a time**, top of the plan down:
|
|
|
392
392
|
|
|
393
393
|
## Phase 1: Technical SEO Audit
|
|
394
394
|
|
|
395
|
-
### Step 0 (mandatory)
|
|
395
|
+
### Step 0 (mandatory — capture the live-crawl evidence base, then read the checks)
|
|
396
396
|
|
|
397
|
-
**
|
|
397
|
+
1. **Run `seoagent crawl` first.** It fetches the homepage + top pages, the real robots.txt, and the live sitemap, and writes `.seoagent/audit/evidence.md` — the verified evidence base (exact title/meta, ALL H1s, canonical + server/client-render flag, every JSON-LD `@type`, OG/Twitter tags, the ACTUAL robots.txt contents, sitemap URL + blog-post counts, client-rendered-shell detection). **`Read` that file — every `Confirmed` finding must be derived from it, not from repo source or memory.** (Use `seoagent crawl --json` if you want the structured bundle.)
|
|
398
|
+
2. **Read `.claude/skills/seoagent/references/audit-checks.md`.** It contains the full check list, the **Verify-before-assert** rules (confidence labels, never-recommend-what-exists, live-vs-source reconciliation), severity tiers, and recommendation text per check. Do not run the audit from memory — the reference is the source of truth and gives consistent results across sessions.
|
|
399
|
+
|
|
400
|
+
**Verify-before-assert is the load-bearing rule of the whole audit.** Never state a live-page fact you didn't fetch: don't invent a robots.txt rule, don't recommend adding schema/canonical/OG tags the evidence shows already exist, don't report a dynamic on-page number (a "2,184 families" counter) as `Confirmed` unless it's in the server-fetched HTML. Tag every finding `Confirmed` / `Likely` / `Hypothesis`. If `seoagent crawl` couldn't run (offline, no domain), fall back to per-page WebFetch — but remember WebFetch strips `<script>`, so schema conclusions from it are `Hypothesis`, never `Confirmed`.
|
|
398
401
|
|
|
399
402
|
### Procedure
|
|
400
403
|
|
|
@@ -454,7 +457,7 @@ When the user says "I fixed X":
|
|
|
454
457
|
2. Append to `changelog.md`: `[date] Fixed: {finding}`.
|
|
455
458
|
3. Run `seoagent sync`.
|
|
456
459
|
|
|
457
|
-
> **Rule**: Before reporting
|
|
460
|
+
> **Rule (verify-before-assert)**: Before reporting ANY live-state fact — a URL is missing/broken, robots.txt blocks a path, a page lacks schema, a title/H1/canonical value — it must be grounded in an actual fetch (`seoagent crawl`'s `evidence.md`, or a WebFetch you just ran). Never assume a 404, a robots rule, or a missing schema from inference/repo source alone. Every finding carries a confidence tag (`Confirmed`/`Likely`/`Hypothesis`); unverified specifics (prices, line numbers, competitor names, dynamic counters) are never emitted as bare fact.
|
|
458
461
|
|
|
459
462
|
---
|
|
460
463
|
|
|
@@ -911,7 +914,7 @@ The CLI manages credentials at `~/.config/seoagent/auth.json` — outside the pr
|
|
|
911
914
|
7. **End with the plan's next step, not a menu.** When executing an approved plan, close with progress + what's next in the plan ("3 of 8 in this cluster done; writing the next now"), not a 2–3-option menu every turn. Offer explicit choices only at real decision points (the plan-approval gate, a cluster boundary, an ambiguous call).
|
|
912
915
|
8. **Update the roadmap and changelog** after every action.
|
|
913
916
|
9. **Sync after every artifact write.** Run `seoagent sync` (no-op when not logged in — always run it).
|
|
914
|
-
10. **
|
|
917
|
+
10. **Verify before you assert.** Every claim about a page's live state (robots.txt rules, schema/JSON-LD, meta tags, titles, headings, canonical, sitemap contents, whether a URL exists) must be grounded in an actual live fetch — `seoagent crawl`'s `.seoagent/audit/evidence.md` or a WebFetch you just ran — never repo source, memory, or a prior. **Never recommend adding something the live page already has.** Tag every finding `Confirmed` / `Likely` / `Hypothesis`; never emit an unverified specific (price, line number, competitor, dynamic on-page metric) as a bare fact. Repo-only issues that aren't confirmed on the live site are labeled and reported separately, not as production reality.
|
|
915
918
|
11. **Use the output template** for all top-level reports.
|
|
916
919
|
12. **Read context before generating.** Before any strategy, brief, or article, read `.seoagent/context.md`.
|
|
917
920
|
13. **Plan once, then execute** (see "Plan & Execute"). Get one approval on the content plan, then run it in batches (a cluster at a time) — don't ask `Continue?` between articles or phases. Pause only for: the plan approval, cluster boundaries (show drafts + open a PR), ambiguous decisions, and destructive actions. Go fully autonomous or step-by-step if the user asks.
|