@seoagent-official/seoagent 1.100.9 → 1.100.10

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.100.9",
3
+ "version": "1.100.10",
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": {
@@ -6,6 +6,7 @@ Articles need a working place to live before they're worth generating. The good
6
6
 
7
7
  - **A. In the repo** (markdown / MDX / Astro content collections / a static-site generator) → you write the file.
8
8
  - **B. In a CMS** (WordPress, Sanity, Contentful, Strapi, Shopify, Ghost, Webflow, Payload, Notion, …) → you publish via the API the repo already uses.
9
+ - **B2. In a hosted CMS with no repo at all** (a wordpress.com blog, self-hosted WordPress with no code checkout, Shopify, Webflow, Squarespace, Wix, …) → there is no repo to find; you publish through the platform's API after the user enables it, or hand the article over as a file when the platform has no API. See § "No repo" below.
9
10
 
10
11
  SEOAgent Cloud *hosting* (option C below) exists only as a convenience for users who have **no** content home and no engineering resources — it is NOT the default. Never lead with it.
11
12
 
@@ -42,6 +43,23 @@ The site pulls content from a CMS. You don't need a SEOAgent adapter — **read
42
43
  - **Mapping starting points:** Strapi → `POST /api/articles` `{data:{…}}`. Sanity → `client.create({_type:'post',…})`. Contentful → Management API `createEntry`. Webflow → `POST /collections/:id/items`. Shopify → `POST /admin/api/.../articles.json`. Ghost → Admin API `posts.add`. WordPress → `POST /wp-json/wp/v2/posts`. For anything unfamiliar, ask the user once how a post gets created, then store the mapping in `project.md` so future articles are one step.
43
44
  - **Best for:** teams with an existing CMS — keep it, just get SEOAgent's content into it.
44
45
 
46
+ ## No repo: the site lives on a hosted CMS — `strategy: custom`
47
+
48
+ You were set up in an empty folder (the setup block says so for wordpress.com, myshopify.com, webflow.io, blogspot.com, … domains), or `init` found no code that builds the site and the live site is plainly a hosted platform. **Do not hunt for a repository and do not ask the user for one — there isn't one.** The platform holds the content, and the way in is its API.
49
+
50
+ 1. **Identify the platform from the live site, once.** `WebFetch https://{domain}/wp-json/` — a JSON body with `name`/`namespaces` is WordPress (self-hosted or WordPress.com). Otherwise read the homepage HTML: `<meta name="generator" content="WordPress …">`, `cdn.shopify.com` assets / `/products.json` answering, `data-wf-site` (Webflow), `static1.squarespace.com`, `static.wixstatic.com`, `blogger.com` assets. Record it in `project.md` as `publishing.strategy: custom`, `publishing.cms: <platform>`, `blog_path` from the live blog URL.
51
+ 2. **Ask the user to enable API access — one message, the exact steps, nothing else.**
52
+ - **WordPress (self-hosted, or WordPress.com Business/Commerce with plugins):** Users → Profile → Application Passwords → create one named `seoagent`. You need `WORDPRESS_API_URL=https://{domain}/wp-json`, `WORDPRESS_USERNAME`, `WORDPRESS_APP_PASSWORD`.
53
+ - **WordPress.com (Free/Personal/Premium):** the REST API lives at `https://public-api.wordpress.com/wp/v2/sites/{domain}/posts` and needs an OAuth2 bearer token from a WordPress.com app (developer.wordpress.com/apps — the user creates one, authorizes it, and gives you the token). Ask which of the two they can do; print the exact call either way.
54
+ - **Shopify:** a custom app in the store admin with `write_content` scope → Admin API access token; posts go to `POST /admin/api/{version}/blogs/{blog_id}/articles.json`.
55
+ - **Webflow:** a site API token with CMS write access; items go to `POST https://api.webflow.com/v2/collections/{collection_id}/items`.
56
+ - **Ghost:** an Admin API key from Settings → Integrations; `POST /ghost/api/admin/posts/` with a Ghost Admin JWT.
57
+ - **Blogger:** Blogger API v3 with an OAuth token; `POST https://www.googleapis.com/blogger/v3/blogs/{blogId}/posts`.
58
+ - **No post API you can use (Squarespace, Wix, Weebly, GoDaddy, Carrd, Notion, Substack, Medium, Tumblr, Framer):** say so plainly. Write each article to `.seoagent/content/{slug}.md` in this folder and hand it to the user to paste into the platform's editor. Report audit findings that need a template, header or DNS change with the exact setting to change.
59
+ 3. **Keep the credential in `.env` in this folder** (add `.env` to `.gitignore` if a git repo ever appears here). Never write it into `project.md`, a brief, or any tracked file. Never ask the user to paste it into chat if they can put it in the file themselves.
60
+ 4. **Publish as a draft unless the user says otherwise**, exactly as option B: map `title`, `slug`, body (HTML for WordPress/Ghost/Shopify/Blogger; Webflow takes rich text), excerpt/meta description, and the canonical. Show the user the draft URL. Then `seoagent content track --slug {slug} --url {live-url}` once it is live, so the dashboard tracks it.
61
+ 5. **Never fall back to SEOAgent Cloud hosting or a `/blog` proxy for these sites** — the user's blog already exists on the platform; putting a second one next to it splits their content.
62
+
45
63
  ## C. SEOAgent Cloud hosting (optional — only when there's no content home) — `strategy: managed_proxy` | `subdomain`
46
64
 
47
65
  For users with no repo content path and no CMS who don't want to build one. Requires `seoagent login`. Two shapes:
@@ -149,7 +149,7 @@ Outputs: `strategy/clusters/{slug}.md`, `strategy/discovery.md` (all metrics), `
149
149
 
150
150
  > Autopilot on → **skip the briefs** (they arrive via sync + inbox); the publishing target still applies.
151
151
 
152
- Articles need a working home first, and **you are the publishing engine** — publish where the content already lives: **repo files (`mdx_sync`) or the user's CMS (`custom`)**; cloud hosting is only for users with no content home, never the default. **Guardrail:** a blog route rendering DB/headless rows with no repo content files is NOT a publishing path — never INSERT into a production database. **Read `references/publishing.md`** for the full decision. **Generate no briefs or articles until `publishing.setup_status: done`.**
152
+ Articles need a working home first, and **you are the publishing engine** — publish where the content already lives: **repo files (`mdx_sync`) or the user's CMS (`custom`)**; cloud hosting is never the default. **Guardrail:** a blog route rendering DB/headless rows with no repo content files is NOT a publishing path — never INSERT into production. **No repo** (hosted wordpress.com/Shopify-style site) → never hunt; see § "No repo". **Read `references/publishing.md`.** **Generate no briefs or articles until `publishing.setup_status: done`.**
153
153
 
154
154
  Brief pre-check: `done` → WebFetch `https://{domain}{blog_path}`, expecting 200 with a body; failure = the target regressed — raise a `critical` finding, no briefs. `pending` → stop and remind the user of their open task.
155
155