@seoagent-official/seoagent 1.100.10 → 1.101.0
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 +140 -140
- package/package.json +1 -1
- package/skills/references/publishing.md +36 -15
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@seoagent-official/seoagent",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.101.0",
|
|
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": {
|
|
@@ -45,20 +45,41 @@ The site pulls content from a CMS. You don't need a SEOAgent adapter — **read
|
|
|
45
45
|
|
|
46
46
|
## No repo: the site lives on a hosted CMS — `strategy: custom`
|
|
47
47
|
|
|
48
|
-
You were set up in an empty folder (the setup block
|
|
49
|
-
|
|
50
|
-
1.
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
48
|
+
You were set up in an empty folder (`seoagent init` and the setup block both say so for wordpress.com, wixsite.com, squarespace.com, myshopify.com, webflow.io, ghost.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.** This folder is the workspace. A hosted site gets the full SEOAgent loop: the audit runs against the live site, keywords and strategy and briefs are the same, articles are written the same. **Only delivery differs**, and it goes through the platform's connector — its API where it has one, its editor where it does not. Set the connector up once, in the first session, before the first brief.
|
|
49
|
+
|
|
50
|
+
### 1. Identify the platform from the live site, once
|
|
51
|
+
|
|
52
|
+
`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 …">`; `static.wixstatic.com` / `wix-` assets (Wix); `static1.squarespace.com` (Squarespace); `cdn.shopify.com` assets or `/products.json` answering (Shopify); `data-wf-site` (Webflow); `ghost` assets (Ghost); `blogger.com` assets (Blogger). Record it in `project.md`: `publishing.strategy: custom`, `publishing.cms: <wordpress | wix | squarespace | shopify | webflow | ghost | blogger | other>`, `blog_path` from the live blog URL.
|
|
53
|
+
|
|
54
|
+
### 2. Set up the connector — ask the user ONCE, with the exact steps, nothing else in that message
|
|
55
|
+
|
|
56
|
+
Before the first API call, `WebFetch` the platform's current API reference for creating a post and use what it says — endpoints and versions move; the notes below say where to look and what to ask for, not the exact request shape. Record the working call in `project.md` under `publishing.notes` so the next article is one step.
|
|
57
|
+
|
|
58
|
+
- **WordPress (self-hosted, or WordPress.com Business/Commerce):** Users → Profile → Application Passwords → create one named `seoagent`. Env: `WORDPRESS_API_URL=https://{domain}/wp-json`, `WORDPRESS_USERNAME`, `WORDPRESS_APP_PASSWORD`. Posts: `POST {WORDPRESS_API_URL}/wp/v2/posts` with HTTP Basic auth, `status: draft`. Titles and meta descriptions of existing pages are editable the same way (`/wp/v2/pages`, plus the SEO plugin's fields when Yoast or Rank Math is installed).
|
|
59
|
+
- **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 the app, authorizes it, and gives you the token). Env: `WPCOM_SITE`, `WPCOM_TOKEN`. Ask which of the two WordPress routes applies; the `/wp-json/` probe in step 1 answers it (Business sites answer on their own domain).
|
|
60
|
+
- **Wix:** Wix account → API Keys Manager → create a key with **Blog** (and Site) permissions; the **site ID** is in the site dashboard URL / Settings. Env: `WIX_API_KEY`, `WIX_SITE_ID`. The Wix REST Blog API creates a draft post (headers: `Authorization: {WIX_API_KEY}`, `wix-site-id: {WIX_SITE_ID}`), which the user publishes from the editor or you publish through the API when told to. Page titles and descriptions: the Wix SEO settings API where the key has permission, otherwise the page's SEO panel.
|
|
61
|
+
- **Squarespace:** no public API for posts — the connector **is the editor**. Write each article to `.seoagent/content/{slug}.md` with the exact title, URL slug, SEO title, meta description, body (headings, links, image alt text) and a one-line paste plan (Blog → + → paste body → Settings → SEO → title/description/slug). Walk the user through the first one. Titles, descriptions, redirects (Settings → Developer Tools → URL Mappings) and sitemap/GSC verification are reported with the exact panel.
|
|
62
|
+
- **Shopify:** custom app in the store admin with `write_content` (blog) scope → Admin API access token. Env: `SHOPIFY_STORE`, `SHOPIFY_ADMIN_TOKEN`. Articles go to the blog articles endpoint under `/admin/api/{version}/blogs/{blog_id}/articles.json`, `published: false`.
|
|
63
|
+
- **Webflow:** a site API token with CMS write access. Env: `WEBFLOW_TOKEN`, `WEBFLOW_COLLECTION_ID` (the blog collection). Items go to `POST https://api.webflow.com/v2/collections/{collection_id}/items` as drafts; publishing the site is the user's step unless told otherwise.
|
|
64
|
+
- **Ghost:** an Admin API key from Settings → Integrations. Env: `GHOST_URL`, `GHOST_ADMIN_KEY`. `POST /ghost/api/admin/posts/` with a Ghost Admin JWT, `status: draft`.
|
|
65
|
+
- **Blogger:** Blogger API v3 with an OAuth token from a Google Cloud project. Env: `BLOGGER_BLOG_ID`, `BLOGGER_TOKEN`. `POST https://www.googleapis.com/blogger/v3/blogs/{blogId}/posts?isDraft=true`.
|
|
66
|
+
- **Weebly, GoDaddy Website Builder, Carrd, Notion, Substack, Medium, Tumblr, Framer, or anything else with no post API you can use:** same as Squarespace — the editor is the connector. Say so plainly in the first session; do not promise API publishing you cannot verify.
|
|
67
|
+
|
|
68
|
+
### 3. Keep the credential in `.env` in this folder
|
|
69
|
+
|
|
70
|
+
Add `.env` to `.gitignore` if a git repo ever appears here. Never write a credential into `project.md`, a brief, `context.md` or any tracked file; record only the **env var names** in `publishing.notes`. Never ask the user to paste a key into chat when they can put it in the file themselves. If the key stops working (401/403), tell the user which variable to refresh — do not retry blindly.
|
|
71
|
+
|
|
72
|
+
### 4. Publish as a draft unless the user says otherwise
|
|
73
|
+
|
|
74
|
+
Exactly as option B: map `title`, `slug`, body (HTML for WordPress / Ghost / Shopify / Blogger / Wix; Webflow takes rich text), excerpt / meta description, and the canonical. Show the user the draft URL. When it is live, `seoagent content track --slug {slug} --url {live-url}` so the dashboard tracks it — the cloud cannot see the platform.
|
|
75
|
+
|
|
76
|
+
### 5. What else you can change on a hosted site
|
|
77
|
+
|
|
78
|
+
Most audit findings on a hosted site are settings, not code: page titles and meta descriptions, image alt text, redirects, the sitemap and robots (the platform generates them — verify, do not rewrite), Search Console verification, structured data where the platform allows custom code. Fix them through the connector when it has the permission (WordPress pages, Wix SEO settings), otherwise report each one with the exact panel and value. Never say a fix is done until you have re-fetched the live page and seen it.
|
|
79
|
+
|
|
80
|
+
### 6. Never fall back to SEOAgent Cloud hosting or a `/blog` proxy for these sites
|
|
81
|
+
|
|
82
|
+
The user's blog already exists on the platform; putting a second one next to it splits their content.
|
|
62
83
|
|
|
63
84
|
## C. SEOAgent Cloud hosting (optional — only when there's no content home) — `strategy: managed_proxy` | `subdomain`
|
|
64
85
|
|
|
@@ -79,7 +100,7 @@ Homemade CMS, an unusual static pipeline, Notion-as-CMS, etc. Ask the user to de
|
|
|
79
100
|
```yaml
|
|
80
101
|
publishing:
|
|
81
102
|
strategy: managed_proxy | subdomain | mdx_sync | custom | other
|
|
82
|
-
cms: strapi | wordpress | sanity | contentful | webflow | shopify | ghost | payload | other # only when strategy is custom or other
|
|
103
|
+
cms: strapi | wordpress | sanity | contentful | webflow | shopify | ghost | payload | wix | squarespace | blogger | other # only when strategy is custom or other
|
|
83
104
|
blog_path: /blog # canonical URL prefix on the live site
|
|
84
105
|
content_dir: content/blog # repo-root-relative dir where article files live (mdx_sync — lets sync auto-track from article #1)
|
|
85
106
|
setup_status: pending | done # done = the one-time setup task is complete
|