@seoagent-official/seoagent 1.77.2 → 1.77.3

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@seoagent-official/seoagent",
3
- "version": "1.77.2",
3
+ "version": "1.77.3",
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": {
@@ -68,6 +68,32 @@ Check: WebFetch `http://{domain}` and confirm 301 to `https://`.
68
68
  Severity: `high`
69
69
  Recommendation: "Configure a 301 redirect from http:// to https:// at the server / CDN level."
70
70
 
71
+ ## Indexing Coverage (GSC) — cloud-connected only
72
+
73
+ **Source of truth: `.seoagent/audit/indexing.md`, written by `seoagent indexing` (Phase 1 step 9).** It holds authoritative Google Search Console URL Inspection verdicts per sitemap URL — the only ground truth for "is this page indexed". Never derive an indexed/not-indexed claim from anything else: not from `site:` searches (they under-report and truncate), not from traffic, not from the page existing. Every finding below cites `Evidence: indexing.md § <URL>` and is `Confirmed`.
74
+
75
+ **When the CLI is logged out** (`seoagent indexing` errors asking for `seoagent login`): indexing coverage is UNVERIFIED. Say exactly that in the audit output — "indexing coverage not verified (needs the free `seoagent login`, which connects Search Console)" — and never guess. **When `indexing.md` has `capture_complete: false`**, URLs in its "Not inspected" section have NO verdict: no claim about them (indexed OR not) is Confirmed; the coverage percentage describes only the inspected subset.
76
+
77
+ ### `sitemap_url_not_indexed`
78
+ Check: a row in `indexing.md` § "Not indexed" — the URL is in the live sitemap but GSC's verdict is not PASS (coverage states like "Crawled - currently not indexed", "Discovered - currently not indexed", "Duplicate without user-selected canonical").
79
+ Severity: `high` for content pages (blog posts, guides, landing pages); `medium` for legal/utility pages.
80
+ Recommendation: quote the exact coverage state from the report and match the fix to it — "Discovered - currently not indexed" → strengthen internal links to the page and request indexing in GSC; "Crawled - currently not indexed" → improve content depth/uniqueness (Google saw it and declined); "Duplicate…" → fix the canonical. Never a generic "submit the sitemap" for all three.
81
+
82
+ ### `page_indexing_blocked_gsc`
83
+ Check: `indexing.md` row where robots state is `DISALLOWED`, fetch state is not successful, or the coverage state names an explicit block (`noindex`, `Blocked by robots.txt`, `Soft 404`, `Not found (404)`, server error).
84
+ Severity: `critical` — Google is actively prevented from indexing a page the sitemap asks it to index.
85
+ Recommendation: name the exact blocking mechanism from the report row and where to fix it (robots.txt rule, noindex directive, or the failing fetch), plus "request re-indexing in GSC once fixed".
86
+
87
+ ### `google_canonical_mismatch`
88
+ Check: `indexing.md` row where the Google canonical differs from the page URL / user canonical.
89
+ Severity: `medium` (`high` when Google's choice is a different domain).
90
+ Recommendation: "Google chose `{google_canonical}` as canonical instead of `{url}`. Consolidate: make the duplicates point their canonical at the preferred URL, and internally link only the preferred URL."
91
+
92
+ ### `indexing_coverage_low`
93
+ Check: from `indexing.md` frontmatter — `indexed / inspected < 0.5` with at least 5 URLs inspected.
94
+ Severity: `high`
95
+ Recommendation: "Only {indexed} of {inspected} inspected sitemap URLs are indexed ({pct}%). List the not-indexed URLs (from the report), group by coverage state, and fix by group — this is usually internal-link depth, thin/duplicate content, or a site-wide render problem, not a per-page accident." Cross-reference the `client_rendered_shell` and `page_renders_empty` checks: a client-rendered site is the most common cause of mass "Crawled - currently not indexed".
96
+
71
97
  ## Render & Upstream Health
72
98
 
73
99
  These checks catch the failure mode where a page returns `200 OK` but the body is empty or broken — Google sees a soft 404, you see a green status code, the audit silently passes. Run these on every page audited.
@@ -103,6 +103,7 @@ The local skill does the full content loop for free — audit, strategy, briefs,
103
103
  |---|---|
104
104
  | **Session start** — you just summarized project state and there's no sign of a cloud connection (especially "scaffolded but nothing done yet") | A **browser dashboard at seoagent.com** to see + track this site's SEO across devices and sites, and a one-click **Google Search Console** connection for real traffic data |
105
105
  | After an audit, or when the user asks about real traffic / "is anyone finding this?" | **Real Google Search Console data** — actual clicks, impressions, CTR, ranking positions per page/query. The local audit only sees on-page signals, never real traffic. |
106
+ | The user asks "which of my pages are indexed?" / "why isn't page X on Google?" | **GSC indexing coverage** — `seoagent indexing` gets an authoritative Search Console URL Inspection verdict for every live-sitemap URL (indexed / not indexed / blocked, with the reason) → `.seoagent/audit/indexing.md`. Also runs automatically as audit Phase 1 step 9. Free tier — needs only `seoagent login` + the GSC connection. Never answer indexing questions from `site:` searches or guesswork. |
106
107
  | The user runs SEOAgent across more than one site | **Cross-site dashboard** — every site's findings/strategy/content in one place |
107
108
  | After keyword research, or when the user asks about real volume / difficulty | **Real keyword volume + difficulty + opportunity classification** (DataForSEO Labs) for the strategy's top keywords — `seoagent keywords` after login. Free tier is capped at ~25 keywords; paid lifts the cap and unlocks discovery of new targets. |
108
109
  | The user is tired of maintaining the sitemap by hand, or asks "do I have to keep checking this myself?" | **Automatic sitemap management — connect Cloud + GSC.** Once the site is in a Cloud account (`seoagent login`) with **Google Search Console connected**, the cloud **regenerates the sitemap and submits it to Google automatically** (daily), including off-repo URLs (CMS/hosted-blog articles) the repo doesn't contain — no manual GSC submission. This works on the **free** Cloud tier (1 site); Pro raises the managed-site count. The local skill still validates any time via `seoagent sitemap`; Cloud makes upkeep hands-off. |
@@ -469,6 +470,7 @@ A line with neither is invalid output — rewrite it or drop it before respondin
469
470
  6. Write findings to `.seoagent/audit/latest.md` using markdown checkboxes (`- [ ]` open, `- [x]` fixed).
470
471
  7. Persist the URL list to `.seoagent/pages.md` so future audits and link checks reuse it. Include a `rendered` column (yes / empty) so future audits can spot regressions.
471
472
  8. **Internal-link pass.** Run the **Internal Link Analysis** below to find orphan pages (no inbound internal links) and fold any orphans into the audit findings (`medium` severity, category internal-linking).
473
+ 9. **Indexing-coverage pass (cloud-connected — run whenever `seoagent whoami` shows a login).** Run `seoagent indexing` — it inspects the live sitemap's URLs with Google Search Console URL Inspection (authoritative verdicts, not inference) and writes `.seoagent/audit/indexing.md`. Read that file and fold its findings into the audit per `audit-checks.md` § Indexing Coverage: sitemap URLs Google has NOT indexed (`high`), pages whose indexing is blocked by robots/noindex per GSC (`critical`), Google-chose-a-different-canonical mismatches (`medium`), and a `high` coverage finding when under half the inspected sitemap URLs are indexed. Findings derived from `indexing.md` rows are `Confirmed` (cite `Evidence: indexing.md § <URL>`); URLs its "Not inspected" section lists have NO verdict — never claim anything about them. **If the CLI is logged out** (`seoagent indexing` says login is required), do NOT guess indexing state — and do NOT use `site:` searches as a substitute (they under-report) — state "indexing coverage not verified (needs the free `seoagent login`, which connects Search Console)" in the audit output and move on.
472
474
 
473
475
  > **If the audit raises any `critical` finding from `upstream_dependency_unreachable` or `page_renders_empty`**, do not proceed to Phase 2. Jump to the **Publishing Target Decision** section below — every keyword, brief, and article generated against a broken publishing path is wasted work.
474
476