@seoagent-official/seoagent 1.108.5 → 1.108.6

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.108.5",
3
+ "version": "1.108.6",
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": {
@@ -5,6 +5,7 @@
5
5
  **Golden rules (these also live in the skill body):**
6
6
 
7
7
  - **Never delete a file without explicit user confirmation on the first destructive action of the session.** Auto-prune is conservative (requires <5 clicks in 90 days, zero inbound internal links, etc.) but it can still surprise the user. Show them what's about to go. Technical-fix actions edit an existing page rather than delete, so they only need a diff review, not a destructive-action confirmation.
8
+ - **Standing approval.** While the site is in auto-approve mode (the SEOAgent default), the cloud stamps each item it queues, and its file's steps then say **Standing approval applies**. Do that work without waiting for a go-ahead: with no one in the session (a scheduled run, a Grok Bot, a headless run) apply it, commit it, and ack it; with a person present, show the diff or draft as you go and carry on. It is a go-ahead, not a quality waiver: decline anything that looks wrong. Prunes (destructive) and new landing pages (a new URL) never carry it, and a file without it keeps its own confirm step.
8
9
  - **Read the decline memory first.** `.seoagent/inbox/README.md` ends with **Previously declined on this site** (also `declined` in `seoagent inbox --json`, and a **Related past declines** block inside any action file an earlier decline bears on): what you or a previous session already refused here, and why. A pending action that one of those reasons still covers (same page, same class of problem — e.g. the page is `noindex`, so canonical, meta and schema on it are all inert) is **declined citing that reason, not re-investigated**: `seoagent ack <id> <id> … --failed --reason "covered by #<earlier id>: <its reason>"`. Several ids take one verdict. Only apply a fix when the earlier reason no longer holds.
9
10
  - Acknowledge every action you finish: `seoagent ack <action_id>` (or `seoagent ack <action_id> --failed --reason "..."` to decline). That marks it `completed` on the dashboard and removes the inbox file on the next sync. **Write decline reasons for your future self**: state the fact that rules the action out (the page is noindex; the canonical points off-site; the finding is stale since <date>) — every decline is fed back into the next inbox as memory, and the issue is not proposed again.
10
11
  - After processing, run `seoagent sync` once more to clean stale inbox files, then report a summary: how many applied, how many declined (and why).
@@ -47,7 +48,7 @@ Start by reading `.seoagent/inbox/README.md` (or `seoagent inbox`) to see the li
47
48
 
48
49
  - `Read` it. The frontmatter has `action_id`, `issue` (`meta`|`schema`|`canonical`|`internal_link`|`other`), `severity`, and `page_url`. The body describes the recommended fix per issue type.
49
50
  - **Find the page's source** that renders `page_url` — the route/template/markdown under `app/`, `pages/`, `src/`, or `content/`. Match by URL path.
50
- - Apply the fix in the source (use `Edit`/`Write`): meta → title/description (or the framework's metadata API/frontmatter); schema → JSON-LD; canonical → `<link rel="canonical">`; internal_link → add relevant internal links. Safe/reversible edits — no hard delete-confirmation needed, but still **show the user the diff** (confirm once per session, then proceed).
51
+ - Apply the fix in the source (use `Edit`/`Write`): meta → title/description (or the framework's metadata API/frontmatter); schema → JSON-LD; canonical → `<link rel="canonical">`; internal_link → add relevant internal links. Safe/reversible edits — no hard delete-confirmation needed. Follow the file's go-ahead step: **Standing approval** → apply, commit, ack; otherwise **show the user the diff** (confirm once per session, then proceed).
51
52
  - **Check the action file's "Related past declines" block first.** If it says the page was already ruled out (noindex, off-site canonical, not this site's page), decline with that reason and move on — do not re-fetch and re-derive it.
52
53
  - Acknowledge: `seoagent ack <action_id>` (or `--failed --reason "not applicable; ..."` to decline).
53
54
 
@@ -55,7 +56,7 @@ Start by reading `.seoagent/inbox/README.md` (or `seoagent inbox`) to see the li
55
56
 
56
57
  - `Read` it. The frontmatter has `action_id`, `brief_slug`, `primary_keyword`, `cluster`, and `priority`. The body points at the synced brief.
57
58
  - **Read the full brief** under `.seoagent/` (briefs file or `strategy/` entry matching `brief_slug`) for the outline, word-count target, and internal-link plan.
58
- - Write the article following the skill's content-production protocol (Phase 4), then publish it where this project's content lives (repo `content/` or the connected CMS — you are the publishing engine). Show the user the draft before publishing (interactive sessions can use the visual review loop — `references/draft-review.md`).
59
+ - Write the article following the skill's content-production protocol (Phase 4), then publish it where this project's content lives (repo `content/` or the connected CMS — you are the publishing engine). Follow the file's go-ahead step: **Standing approval** → publish, commit, ack; otherwise show the user the draft before publishing (interactive sessions can use the visual review loop — `references/draft-review.md`).
59
60
  - **If the action body has a "Screenshots to capture" section** (autopilot flagged this as a SaaS product), follow `references/screenshots.md` — capture real product screenshots from this repo's UI for the relevant sections instead of shipping illustration-only.
60
61
  - Acknowledge: `seoagent ack <action_id>` (or `--failed --reason "skipped; off-strategy"`).
61
62
 
@@ -68,14 +69,14 @@ Start by reading `.seoagent/inbox/README.md` (or `seoagent inbox`) to see the li
68
69
  - `rank_expansion` → the page already wins, or is in striking distance, for the queries in the body. Deepen **that** page against **those** queries; never spawn a new one.
69
70
  - `low_ctr` → **read the body, not just the reason.** Past roughly position 20 nobody sees the snippet, so the body says "Lift ranking" and a title rewrite is wasted work: fill the gaps a searcher on the page's real queries expects, and add the vocabulary those queries use if the page answers them in different words. Only when the body says "Improve CTR" (shallow position) is rewriting the title + meta description the fix — and write it against the **"Queries this page already ranks for"** section, which both depths now carry, not a keyword guessed from the slug. When one of those queries is the site's own brand name the page is competing with its own homepage, so check the new snippet does not restate what another of this site's results already says.
70
71
  - `stale_thin` → expand and update.
71
- - Follow the rewrite protocol (`references/rewrite-protocol.md`). Reversible edit — show the user the diff (confirm once per session, then proceed; interactive sessions can review the revised draft via `references/draft-review.md`).
72
+ - Follow the rewrite protocol (`references/rewrite-protocol.md`). Reversible edit — follow the file's go-ahead step: **Standing approval** → apply, commit, ack; otherwise show the user the diff (confirm once per session, then proceed; interactive sessions can review the revised draft via `references/draft-review.md`).
72
73
  - Acknowledge: `seoagent ack <action_id>` (or `--failed --reason "kept as-is; ..."`).
73
74
 
74
75
  ### `cli_sitemap_update-<id>.md`
75
76
 
76
77
  - `Read` it. The frontmatter has `action_id` + `sitemap_url`; the body lists the URLs SEOAgent knows (crawled + GSC-discovered — this **includes CMS-hosted blog articles your repo doesn't contain**).
77
78
  - **Find how the project serves its sitemap** (framework sitemap like Next.js `app/sitemap.ts` / `next-sitemap` / Astro integration, or a static `public/sitemap.xml`, or none yet). Prefer extending the framework sitemap so it stays current.
78
- - **Union** the repo's own routes (which the framework sitemap usually covers) with the URL list in the file (which adds off-repo CMS articles), dedup, and ensure the result is served at `sitemap_url`. Show the user the diff. Deploy if needed — GSC fetches the live URL. See `references/sitemaps.md` for the generator-detection table.
79
+ - **Union** the repo's own routes (which the framework sitemap usually covers) with the URL list in the file (which adds off-repo CMS articles), dedup, and ensure the result is served at `sitemap_url`. Show the user the diff, or under **Standing approval** commit it. Deploy if needed — GSC fetches the live URL. See `references/sitemaps.md` for the generator-detection table.
79
80
  - **Verify with `seoagent sitemap`** once deployed — it should report 200, no private leakage, and the expected URL count.
80
81
  - Acknowledge: `seoagent ack <action_id>` (or `--failed --reason "sitemap already served"`). SEOAgent re-submits the sitemap to GSC on its schedule.
81
82
 
@@ -85,7 +86,7 @@ Start by reading `.seoagent/inbox/README.md` (or `seoagent inbox`) to see the li
85
86
  - **`okf`** — fill `.seoagent/okf/` per `references/open-knowledge-format.md` (it is already scaffolded; `seoagent okf scaffold` covers an older project). **Replace every scaffold placeholder** and make `seoagent okf validate` pass — a placeholder or invalid bundle is deliberately NOT published. Then `seoagent sync` copies it to `<public_dir>/.well-known/okf/` (or `seoagent okf publish` on demand), and **you tell the user to commit + deploy**. `.seoagent/okf/` is the source; crawlers only read `/.well-known/okf/index.md`.
86
87
  - **`llms_txt`** — run `seoagent llms`. **Do not hand-write it.** It is generated from `pages.md`, published `content/`, crawl evidence and `context.md`, so every link resolves and it regenerates on every sync instead of going stale after the next publish. If the page inventory is thin, run `seoagent refresh --crawl` first.
87
88
  - **Both files must agree with the live site** on pricing, plan names, and positioning. A bundle that contradicts your own pages is worse than none. Cross-check `/pricing` before you write numbers.
88
- - Show the user the diff, deploy, then acknowledge: `seoagent ack <action_id>` (or `--failed --reason "..."`).
89
+ - Show the user the diff (under **Standing approval**, commit it yourself), deploy, then acknowledge: `seoagent ack <action_id>` (or `--failed --reason "..."`).
89
90
 
90
91
  ### `cli_new_landing_page-<id>.md`
91
92
 
@@ -68,8 +68,8 @@ If the repo alone is inconclusive, WebFetch the homepage and infer from the visi
68
68
 
69
69
  ## Starting a session: fast path and first session
70
70
 
71
- **Fresh project (fast path).** When `init` ran this session or moments before — no `audit/latest.md`, no `strategy/`, changelog holds only the init line — there is **nothing to reconcile**. Skip the bookkeeping and go straight to Phase 1: `seoagent crawl` → read `evidence.md` → audit → **deliver evidence-grounded findings first, workspace bookkeeping second**. One `seoagent doctor` is still worth running, but act only on `domain_unknown` / `site_type_unknown` before the crawl; every other finding waits until the findings are delivered. `seoagent sync` must never block, gate, or precede audit work on a fresh project — run it after the findings are out. On a cloud-connected project, once the findings are delivered and before the session ends, set up the weekday run per `references/recurring-runs.md` § First setup and record `schedule:` in `project.md` — the paste block stops after the bind, so this first session is the only place it happens (doctor flags `schedule_missing` until it does).
71
+ **Fresh project (fast path).** When `init` ran this session or moments before — no `audit/latest.md`, no `strategy/`, changelog holds only the init line — there is **nothing to reconcile**. Skip the bookkeeping and go straight to Phase 1: `seoagent crawl` → read `evidence.md` → audit → **deliver evidence-grounded findings first, workspace bookkeeping second**. One `seoagent doctor` is still worth running, but act only on `domain_unknown` / `site_type_unknown` before the crawl; every other finding waits until the findings are delivered. `seoagent sync` must never block, gate, or precede audit work on a fresh project — run it after the findings are out, and work any inbox actions it lists (`references/inbox.md`) before the session ends. On a cloud-connected project, once the findings are delivered and before the session ends, set up the weekday run per `references/recurring-runs.md` § First setup and record `schedule:` in `project.md` — the paste block stops after the bind, so this first session is the only place it happens (doctor flags `schedule_missing` until it does).
72
72
 
73
- **Cloud-connected project (any age).** `seoagent whoami --json` returns `logged_in: true` → run `seoagent sync` before anything else, then triage the inbox (`references/inbox.md`) and the briefs the pull delivered. While autopilot is on, the cloud owns keyword research, clusters, and briefs, so the Phase 2 / Phase 3 local-planning steps are skipped — see `references/cloud-cta.md` § Cloud-connected mode. Close the session with `Run seoagent sync and process the inbox` as option 3, never `Plan content strategy`. The audit phases (Phase 1, re-audit) are unchanged. If `project.md` has no `schedule:` line (doctor: `schedule_missing`), set up the weekday run per `references/recurring-runs.md` § First setup before the session ends — never inside a scheduled run itself.
73
+ **Cloud-connected project (any age).** `seoagent whoami --json` returns `logged_in: true` → run `seoagent sync` before anything else, then **work the inbox** (`references/inbox.md`) unless the user asked for something else first, then the briefs the pull delivered. Files marked **Standing approval** need no go-ahead. While autopilot is on, the cloud owns keyword research, clusters, and briefs, so the Phase 2 / Phase 3 local-planning steps are skipped — see `references/cloud-cta.md` § Cloud-connected mode. Close the session with `Run seoagent sync and process the inbox` as option 3, never `Plan content strategy`. The audit phases (Phase 1, re-audit) are unchanged. If `project.md` has no `schedule:` line (doctor: `schedule_missing`), set up the weekday run per `references/recurring-runs.md` § First setup before the session ends — never inside a scheduled run itself.
74
74
 
75
75
  **First session on an existing project, no audit yet.** Before the Phase 1 audit: WebFetch the homepage plus up to 3 key pages; run `seoagent sitemap` to validate the **live** sitemap — never judge it by committed files, since a dynamic `app/sitemap.ts` serves `/sitemap.xml` with no file in the repo; WebFetch `{domain}/robots.txt`; and scan headings/nav for topic clusters that already exist. Then run the full audit.
@@ -56,7 +56,7 @@ Run `seoagent sync` after every write. Logged out it exits 1 naming the fix; not
56
56
 
57
57
  A free account adds what the local skill can't (GSC traffic, indexing verdicts, dashboard, managed sitemaps). Paid autopilot also delivers owner-approved backlink outreach emails to this inbox for you to send from the user's own email account (needs an email connector). Never imply an account is required — the local skill does the full loop free, including publishing. Offer it in one benefit-led line, once per session per topic; drop it if declined. **Read `references/cloud-cta.md` before pitching.**
58
58
 
59
- `sync` also pulls cloud actions into `.seoagent/inbox/`; when `seoagent inbox`/`doctor` reports any, **read `references/inbox.md`**. Always: heed its **Previously declined** memory, confirm the session's first destructive action, show diffs, `seoagent ack <action_id>` what you finish (`--failed --reason "..."` to decline), then sync.
59
+ `sync` also pulls cloud actions into `.seoagent/inbox/`; when it lists any, **work them unless the user asked otherwise** (`references/inbox.md`): heed **Previously declined**, confirm the first destructive action, `seoagent ack <id>` each (`--failed --reason` declines). **Standing approval** needs no go-ahead.
60
60
 
61
61
  **Cloud-first routing.** Once per session run `seoagent whoami --json`; `logged_in: true` = cloud-connected (exit 1 = no account). Connected → `seoagent sync` first. With autopilot on (`seoagent autopilot status`) the cloud already does keyword research, clusters, and briefs (pulled into `strategy/` and `briefs/`) and queues every next step in the inbox: work those and **skip Phase 2–3** — a second, local plan duplicates the cloud's. After the inbox offer `seoagent sync` again, never strategy planning. Phase 2–3 remain the local flow (no account, or autopilot off and an empty workspace after sync). Detail: `references/cloud-cta.md` § Cloud-connected mode.
62
62
 
@@ -93,7 +93,7 @@ A **first session with no audit yet** opens per `references/session-protocol.md`
93
93
  1. **`seoagent doctor`** — follow each `→` directive. Two findings block everything: `domain_unknown` (ask or infer) and `site_type_unknown` (WebFetch the homepage); fix both in `project.md` first. A flagged pull receipt is triaged per `references/pull-receipt.md` **before any SEO work** — triage proposes, never auto-acts.
94
94
  2. **`project.md`** — read it plus `roadmap.md`; one-sentence summary + next priority. Missing → infer and confirm per `references/session-protocol.md`.
95
95
  3. **`context.md`** — governs all strategy and content work. Missing or still the `init` scaffold → **draft it before any strategy work** from the repo and live homepage: business name, type (LOCAL / ONLINE-only / HYBRID — gates every geo-keyword decision), audience, industry, location, positioning; show the owner.
96
- 4. **Pick the flow.** Cloud-connected → sync, inbox, pulled briefs; no `schedule:` → weekday run setup (`references/recurring-runs.md`). Otherwise: no strategy → audit + keyword research, then one plan. Plan exists → reconcile against reality, state the next batch, continue. All written → re-audit and propose the next increment. Unless connected, offer the free cloud account once, never blocking the audit.
96
+ 4. **Pick the flow.** Cloud-connected → sync, work the inbox, pulled briefs; no `schedule:` → weekday run setup (`references/recurring-runs.md`). Otherwise: no strategy → audit + keyword research, then one plan. Plan exists → reconcile against reality, state the next batch, continue. All written → re-audit and propose the next increment. Unless connected, offer the free cloud account once, never blocking the audit.
97
97
 
98
98
  ## Plan once, then execute
99
99