@wix/agent-skills 1.34.0 → 1.35.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/README.md CHANGED
@@ -75,6 +75,7 @@ npx skills add wix/skills -g
75
75
  | [wix-docs](skills/wix-docs/SKILL.md) | Look up the Wix API/SDK docs (shared fallback) | Confirming an exact Wix endpoint, method schema, field, or enum before writing code — `curl` doc-search + the `.md`-twin trick, or the Wix MCP tools. Referenced by the other skills as their docs-lookup fallback |
76
76
  | [wix-export](skills/wix-export/SKILL.md) | Export or create a Wix Studio 2 site | Exporting an existing Studio 2 site or creating a new one into its own folder, installing or signing in to the origami CLI only when that is missing, and continuing straight into the change the user asked for. Not for Wix Editor or Studio 1 sites, or for content and business changes (use wix-manage) |
77
77
  | [wix-import](skills/wix-import/SKILL.md) | Import local site code into a Wix Studio 2 site | Saving an exported Origami site back to Wix, or bringing code from any other project into an existing or new Studio 2 site — sets up the origami CLI when missing, validates the files, and confirms what the import replaces before uploading images or saving. Not for Wix Editor or Studio 1 sites, or for content and business changes (use wix-manage) |
78
+ | [wix-readme](skills/wix-readme/SKILL.md) | Index of the plugin: its skills and the Wix MCP tools | Right after installing the plugin, or when asking what the plugin can do and which skill or tool fits a task |
78
79
  | [wix-replatform](wix-replatform/README.md) | Migrate sites from WordPress and other platforms into Wix | Migrating an existing business from another platform into Wix. Both backend data and website. `npx skills add wix/skills/wix-replatform` |
79
80
 
80
81
  ## Supported Agents
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wix/agent-skills",
3
- "version": "1.34.0",
3
+ "version": "1.35.0",
4
4
  "description": "Wix Skills for AI coding agents — versioned npm distribution of the wix/skills content.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -3,6 +3,6 @@
3
3
  "@wix/create-new": "0.0.124",
4
4
  "typescript": "5.8.3",
5
5
  "templates": {
6
- "ref": "v1.34.0"
6
+ "ref": "v1.35.0"
7
7
  }
8
8
  }
@@ -50,7 +50,7 @@ Read and update SEO titles and tags at the right level. For "change my site's SE
50
50
  "Retrieve, create, and delete URL redirects on a Wix site using the public SEO Redirects API. Covers exact and group redirects, language-scoped redirects for multilingual sites, bulk creates of up to 100 and bulk deletes of up to 500, and the change flow for a redirect that already exists. This API has no query, search, or update method: List Redirects is the only read-many. Redirects do not chain, so creating one that points at a path another redirect starts from permanently deletes that other redirect; list and check before every write."
51
51
 
52
52
  ### [Generate and Read a Wix Site's Content Plan](references/seo/manage-content-plan.md)
53
- Generate an SEO content plan and read its blog post topics, or troubleshoot an existing content plan flow stuck at KEYWORD_RESEARCH while polling GetContentPlanFlow. Use this recipe for both generation and stalled-flow questions: it explains the intentional pause, the Create Content Plan release request, missing flow IDs, and the exact public API paths and response fields.
53
+ Generate an SEO content plan for a Wix site, read suggested blog post topics and keywords, or diagnose and continue an existing stalled generation flow, including requests with missing flow identifiers.
54
54
 
55
55
  ### [Manage Google Search Console for a Wix Site](references/seo/manage-google-search-console.md)
56
56
  "Connect a Wix site to Google Search Console and drive its setup through the public GSC Connection and Site Readiness APIs: check connection and readiness, start the Google authorization, verify ownership, add the property, submit the sitemap, request indexing, read search performance, run URL inspection, recover a stale connection, or disconnect. The site owner authorizes in their own browser via a single-use connect URL."
@@ -118,6 +118,8 @@ You have two endpoints:
118
118
  }'
119
119
  ```
120
120
 
121
+ **With `publish: true`, the post is live once this call returns 200, even if the response reads `draftPost.status: "UNPUBLISHED"`.** The same response carries `changeOrigin: "PUBLISH"` and `hasUnpublishedChanges: false`. Do not call Publish Draft Post, search for a publish endpoint, or create the post again. To confirm it is live, read it back with [Get Post](https://dev.wix.com/docs/api-reference/business-solutions/blog/posts-stats/get-post): `GET https://www.wixapis.com/blog/v3/posts/{draftPost.id}` returns 200 with `post.id` equal to `draftPost.id` and a `post.firstPublishedDate`.
122
+
121
123
  #### Bulk-create endpoint (preferred for multiple posts)
122
124
 
123
125
  > **⚠️ Body shape — read this carefully. Each item in `draftPosts` is a FLAT post object: `{title, memberId, richContent, media?, ...}`. Do NOT wrap each item in a `draftPost` field.** Unlike the single-post endpoint (which uses `{draftPost: {...}}` because the request is one post), the bulk endpoint puts each post DIRECTLY inside the `draftPosts` array.
@@ -1,293 +1,278 @@
1
1
  ---
2
2
  name: "Generate and Read a Wix Site's Content Plan"
3
- description: "Generate an SEO content plan and read its blog post topics, or troubleshoot an existing content plan flow stuck at KEYWORD_RESEARCH while polling GetContentPlanFlow. Use this recipe for both generation and stalled-flow questions: it explains the intentional pause, the Create Content Plan release request, missing flow IDs, and the exact public API paths and response fields."
3
+ description: "Generate an SEO content plan for a Wix site, read suggested blog post topics and keywords, or diagnose and continue an existing stalled generation flow, including requests with missing flow identifiers."
4
4
  ---
5
5
 
6
6
  # Generate and Read a Wix Site's Content Plan
7
7
 
8
- A **content plan** is a set of suggested blog post briefs, including titles,
9
- keywords, and the existing site pages they support. A **content plan flow** is
10
- the asynchronous job that generates those briefs. Its `contentPlanFlowId` is
11
- a flow UUID, distinct from the site's ID, and its `status` reports progress.
12
- Generation creates briefs, not published posts.
13
-
14
- `KEYWORD_RESEARCH` means keyword research is complete and the job is waiting
15
- for the **Create Content Plan** request to generate the briefs. This request
16
- releases the intentional pause; polling alone does not advance it.
17
-
18
- Use the selected site's authorization context. Trigger and Create Content Plan
19
- are writes requiring **Manage SEO Settings**; execute them when the user has
20
- requested generation or explicitly confirmed it.
21
-
22
- ## Resume or read an existing flow
23
-
24
- An existing flow is a job already started by a previous trigger, including one
25
- discussed earlier in the conversation. To finish it or read its results:
26
-
27
- 1. Find its actual `contentPlanFlowId` in the conversation or a previous
28
- trigger/status response. A site ID is not a flow ID, even though both are
29
- UUIDs. If the ID is missing, explain the intentional pause when the user
30
- reports `KEYWORD_RESEARCH`, ask for the flow ID, and end the turn without an
31
- API call. Never submit a placeholder. Do not offer a new flow or a different
32
- site as an alternative to recovering the ID.
33
- 2. Read that flow with
34
- `GET https://www.wixapis.com/promote/seo/v1/content-plan-flows/{contentPlanFlowId}`.
35
- Read `contentPlanFlow.status`; see the response and status table in
36
- [Check the flow status](#2-poll-until-keyword_research).
37
- 3. At `SUCCESS`, go directly to [Read the briefs](#5-read-the-briefs).
38
- At `KEYWORD_RESEARCH`, when completion is requested, call
39
- [Create Content Plan](#3-release-the-flow) once with this flow ID.
40
- For an earlier in-progress status, continue checking this same flow until
41
- it reaches the pause. If already at `CONTENT_PLAN`, continue to step 4
42
- without calling Create Content Plan again. For a terminal or unmet-requirement
43
- status, follow the status table and stop.
44
- 4. After Create Content Plan succeeds, retain its returned flow ID and
45
- [check until SUCCESS](#4-poll-until-success), then
46
- [read the briefs](#5-read-the-briefs). Do not trigger a replacement or release
47
- a successful flow just to retrieve its results.
48
-
49
- ## Generate a new plan
50
-
51
- When the user requests a new plan, follow these steps in order. The request and
52
- response examples for each step are in [API steps](#api-steps).
53
-
54
- 1. [Trigger](#1-trigger) once and retain the returned flow ID.
55
- 2. [Check the flow status](#2-poll-until-keyword_research) until `KEYWORD_RESEARCH`.
56
- 3. [Call Create Content Plan](#3-release-the-flow) once to continue generation.
57
- 4. [Check until SUCCESS](#4-poll-until-success).
58
- 5. [Read the briefs](#5-read-the-briefs) and report the actual returned topics.
59
-
60
- Only Trigger and Create Content Plan write data in the generation path. Do not
61
- change the site's business profile, name, description, categories, or publication
62
- state to accelerate it. Those are separate tasks requiring real user data and
63
- authorization. `CREATED` can mean queued work, not missing setup.
64
-
65
- ## Polling without losing progress
66
-
67
- **One API execution makes one HTTP request and returns.** The sequence below
68
- is a series of separate calls, with a decision after each response. It is not
69
- one code block containing the entire workflow. Never wrap API calls in a
70
- `for`/`while` loop, a timer, or a function that polls until a target status.
71
-
72
- Retain each response's flow ID before the next call. Wait between status checks
73
- using the client's supported waiting capability, outside the API execution;
74
- do not assume timers exist inside that execution or busy-wait there.
75
-
76
- Keep checking while work progresses. If waiting cannot continue, report the
77
- flow ID and last observed status as incomplete; do not claim success or merely
78
- promise to finish later. Identify trigger and release as writes if asked
79
- whether an execution changes data.
80
-
81
- ## API steps
82
-
83
- ### 1. Trigger
8
+ A content plan contains suggested blog post briefs, not published posts.
9
+ `contentPlanFlowId` identifies the generation job, not the site.
10
+
11
+ For an existing job, require its `contentPlanFlowId` before any API call. Ask
12
+ for it; if no user can answer, report incomplete and stop. A site ID, an ID-less
13
+ flow GET or the latest successful flow cannot identify the user's job. Explain
14
+ that continuation follows [step 3](#3-check-research-and-release-once): check the
15
+ flow's own `keywordResearchId` research for `SUCCESS`, then release once only if
16
+ a fresh flow read still shows `KEYWORD_RESEARCH`.
17
+
18
+ `KEYWORD_RESEARCH` means research has started, not finished. Some flows advance
19
+ automatically; `CONTENT_PLAN` or `SUCCESS` needs no release. Polling alone does
20
+ not release a flow that is waiting for Create Content Plan.
21
+
22
+ Use the selected site's authorization context. Writes require **Manage SEO
23
+ Settings**; execute them when the user requests the change or confirms it. Never
24
+ change business data or publication state just to accelerate generation.
25
+
26
+ Use only IDs and values that the API returned or the user supplied; every example
27
+ value is a placeholder. If a request tool needs `siteId`, use the selected or
28
+ supplied site ID, never `contentPlanFlowId`.
29
+
30
+ Each path below is the endpoint shown on its linked public reference, except
31
+ Get Site Keyword Research, whose own page is not public yet (see
32
+ [step 3](#read-the-matching-research)). All use the
33
+ `https://www.wixapis.com/seo-content-plan-service/v1` base. Every call here was
34
+ sent live on this base. Trigger, Get Content Plan Flow, Get Site Keyword
35
+ Research, List Blog Post Candidates and List Keyword Research Items returned
36
+ data. Create Content Plan and Update Keyword Research Item were sent with IDs
37
+ that match no record and returned the service's own errors (for example
38
+ `CONTENT_PLAN_FLOW_NOT_FOUND`), not a missing-route error. A `404` on one of
39
+ these paths is an error to report, not a reason to try another base.
40
+
41
+ ## 1. Trigger or inspect an existing flow
42
+
43
+ For new generation, trigger once:
84
44
 
85
45
  ```
86
- POST https://www.wixapis.com/promote/seo/v1/content-plan-flows/trigger
46
+ POST https://www.wixapis.com/seo-content-plan-service/v1/content-plan-flows/trigger
87
47
  {}
88
48
  ```
89
49
 
90
- Response:
50
+ Response: `{ "contentPlanFlowId": "<flow-uuid>" }`. Save the ID.
51
+ [Trigger Content Plan Generation Flow](https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-content-plan-flow-v1/trigger-content-plan-generation-flow).
91
52
 
92
- ```json
93
- { "contentPlanFlowId": "<flow-uuid>" }
94
- ```
53
+ For an existing flow, apply the entry gate above. Keep its ID, last observed
54
+ status and release history for a later resume.
95
55
 
96
- `<flow-uuid>` and other angle-bracket values in these examples are placeholders;
97
- substitute actual returned values before making requests. Return this response
98
- and end this execution here. Save the ID before making any status request.
99
- Do not append step 2 to the trigger script.
100
- See [Trigger Content Plan Generation Flow](https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-content-plan-flow-v1/trigger-content-plan-generation-flow).
101
-
102
- ### 2. Poll until KEYWORD_RESEARCH
56
+ ## 2. Read status with bounded waiting
103
57
 
104
58
  ```
105
- GET https://www.wixapis.com/promote/seo/v1/content-plan-flows/{contentPlanFlowId}
59
+ GET https://www.wixapis.com/seo-content-plan-service/v1/content-plan-flows/{contentPlanFlowId}
106
60
  ```
107
61
 
108
- Execute this GET once and return its response. This execution contains no
109
- `for`/`while` loop and no timer. Repeat it as a separate call when another
110
- status check is needed. Keep the response compact: flow ID and status suffice.
111
-
112
- Example response, showing the public flow fields (optional fields may be absent):
62
+ Read nested `contentPlanFlow.status`. Example:
113
63
 
114
64
  ```json
115
65
  {
116
66
  "contentPlanFlow": {
117
67
  "id": "<flow-uuid>",
118
- "createdAt": "2026-09-08T10:00:00.000Z",
119
- "updatedAt": "2026-09-08T10:01:00.000Z",
120
68
  "status": "KEYWORD_RESEARCH",
121
- "origin": "AGENT",
122
- "summaryId": "<summary-uuid>",
123
- "keywordResearchId": "<keyword-research-uuid>"
69
+ "keywordResearchId": "<research-uuid>"
124
70
  }
125
71
  }
126
72
  ```
127
73
 
128
- Read `contentPlanFlow.status`, not a top-level `status`. If it is missing,
129
- inspect the response instead of silently looping. Always use this generation's
130
- flow ID; if it stays `CREATED`, report the ID and observed status without
131
- inventing missing business prerequisites.
132
- See [Get Content Plan Flow](https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-content-plan-flow-v1/get-content-plan-flow).
74
+ Pacing:
75
+
76
+ 1. The first check needs no pause. Set an end time with a supported clock: five
77
+ minutes by default, or a shorter runtime limit or user-requested window.
78
+ 2. Between checks, wait about 15 seconds with the client's supported delay. Use
79
+ a separate wait or scheduling tool if one exists. Only if you run code
80
+ yourself and have no such tool, put one awaited sleep of about 15 seconds in
81
+ that code, before its single GET (for example,
82
+ `await new Promise(r => setTimeout(r, 15000))` in JavaScript or
83
+ `time.sleep(15)` in Python). A sleep that is not awaited does not pause. With
84
+ neither a wait tool nor code execution, go to step 4. Sending checks back to
85
+ back with no pause is not pacing. This is client pacing, not an API rate
86
+ limit or a completion-time promise.
87
+ 3. **Each execution makes one HTTP request and returns.** Before each later
88
+ check, confirm the pause fits the window and wait once. Then read the clock
89
+ again: if the window has ended, go to step 4 without sending. Otherwise send
90
+ one GET and read its result. Never loop requests, busy-wait, or use API or doc calls as a
91
+ pause; request counts and frozen `updatedAt` values do not measure time.
92
+ 4. If no usable clock or waiting exists, or the window ends, report incomplete
93
+ with the saved ID, status and release history. Expiry does not prove failure.
94
+ End the turn for a later requested resume; do not restart automatically.
95
+
96
+ | Observed status | Action |
97
+ | --- | --- |
98
+ | `CREATED`, `SITE_ANALYSIS`, `SITE_SUMMARY` | Continue paced checks within the window. |
99
+ | `KEYWORD_RESEARCH` | Follow [Check research and release once](#3-check-research-and-release-once), within the same monitoring window. |
100
+ | `CONTENT_PLAN` | Continue paced checks; skip release. |
101
+ | `SUCCESS` | Stop waiting and read candidates. |
102
+ | `PENDING_REQUIREMENTS` | Stop; report the unmet requirement. Never invent site data. |
103
+ | `FAIL`, `CANCELED` | Report the ID and result, then stop. |
104
+ | Missing or unrecognized status | Report uncertainty; do not silently poll. |
133
105
 
134
- `contentPlanFlow.status` is a string enum. Status checks may skip intermediate
135
- states; decide from the returned value rather than requiring every transition.
136
- Typical status progression: `CREATED` → `SITE_ANALYSIS` → `KEYWORD_RESEARCH`
137
- → **call Create Content Plan** → `CONTENT_PLAN` → `SUCCESS`.
106
+ [Get Content Plan Flow](https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-content-plan-flow-v1/get-content-plan-flow).
138
107
 
139
- | Status | Meaning and next action |
140
- | --- | --- |
141
- | `CREATED` | Queued or starting. Check the same flow again; do not change site settings. |
142
- | `SITE_ANALYSIS` | Analyzing site pages. Continue separate checks. |
143
- | `SITE_SUMMARY` | Summarizing existing content. Continue separate checks. |
144
- | `KEYWORD_RESEARCH` | Waiting for Create Content Plan. Release once when generation is requested. |
145
- | `CONTENT_PLAN` | Generating briefs. Continue separate checks; do not release again. |
146
- | `SUCCESS` | Ready. Read candidates in step 5. |
147
- | `PENDING_REQUIREMENTS` | Missing business information. Stop polling and report the actual unmet requirement from evidence. Do not invent or update business data, or repeatedly trigger replacements. |
148
- | `FAIL` | Generation failed. Report the flow ID and failure; do not silently start a replacement. |
149
- | `CANCELED` | Canceled and cannot be resumed. Report it and stop. |
150
- | `UNKNOWN` | No usable status. Inspect the response and report uncertainty instead of guessing progress. |
108
+ ## 3. Check research and release once
109
+
110
+ Create Content Plan is an action on Blog Post Candidate, distinct from the
111
+ flow-status read. It requires matching research `SUCCESS`; elapsed time at this
112
+ stage proves neither readiness nor failure.
151
113
 
152
- Check every few seconds using separate calls. Completion time varies.
114
+ 1. No `keywordResearchId` on the flow: report it missing and stop; do not guess it.
115
+ 2. Read **that exact research** (below), not the latest research. Not `SUCCESS`
116
+ yet: pause, then read again.
117
+ 3. Research `SUCCESS`: read the same flow again, with no extra delay.
118
+ 4. Flow still `KEYWORD_RESEARCH` with the same research ID: [release once](#release-once).
119
+ `CONTENT_PLAN` or `SUCCESS`: skip release and follow the status. A changed
120
+ research ID: check the new research; the old success does not authorize it.
153
121
 
154
- ### 3. Release the flow
122
+ ### Read the matching research
155
123
 
156
124
  ```
157
- POST https://www.wixapis.com/promote/seo/v1/create-content-plan
158
- { "contentPlanFlowId": "<flow-uuid>" }
125
+ GET https://www.wixapis.com/seo-content-plan-service/v1/site-keyword-research?keywordResearchId={keywordResearchId}
159
126
  ```
160
127
 
161
- Successful response:
128
+ Require `siteKeywordResearch.id` and `contentPlanFlowId` to match the flow being
129
+ followed, then read `status`. Never omit the query ID: the ID-less read returns
130
+ the latest successful research, not this job's. Keyword-list items are not a
131
+ research-status check.
132
+
133
+ Minimal matching response:
162
134
 
163
135
  ```json
164
136
  {
165
- "success": true,
166
- "contentPlanFlowId": "<flow-uuid>"
137
+ "siteKeywordResearch": {
138
+ "id": "<research-uuid>",
139
+ "status": "SUCCESS",
140
+ "contentPlanFlowId": "<flow-uuid>"
141
+ }
167
142
  }
168
143
  ```
169
144
 
170
- Failure response fields (the diagnostic text comes from the API):
145
+ This check is the published procedure: the [Create Content Plan reference](https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-blog-post-candidate-v1/create-content-plan)
146
+ says to poll Get Site Keyword Research with the flow's `keywordResearchId` until
147
+ `SUCCESS`, then re-read the flow before releasing, and the
148
+ [Get Content Plan Flow reference](https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-content-plan-flow-v1/get-content-plan-flow)
149
+ says the same.
171
150
 
172
- ```json
173
- {
174
- "success": false,
175
- "message": "<reason returned by the API>"
176
- }
151
+ Get Site Keyword Research itself is a BETA method with no public reference page
152
+ of its own. It requires `wix-seo.read`. The query parameter, response fields and
153
+ statuses above match its API definition and live responses on this base.
154
+
155
+ **Fallback:** if this call fails, is unavailable, or returns a response without
156
+ the matching `id`, `contentPlanFlowId` and a `status` shown above, do not
157
+ release. Keep paced flow reads only: a flow that reaches `CONTENT_PLAN` or
158
+ `SUCCESS` needs no release; one still at `KEYWORD_RESEARCH` when the window ends
159
+ is reported incomplete with its IDs. This follows the Create Content Plan
160
+ reference, which requires research `SUCCESS` before release.
161
+
162
+ ### Release once
163
+
164
+ When the user requested generation or continuation, and no release has already
165
+ been attempted for this flow, call Create Content Plan **once**:
166
+
167
+ ```
168
+ POST https://www.wixapis.com/seo-content-plan-service/v1/create-content-plan
169
+ { "contentPlanFlowId": "<flow-uuid>" }
177
170
  ```
178
171
 
179
- The response fields are `success` (boolean), `message` (failure reason, only
180
- when `success` is false), and `contentPlanFlowId` (flow UUID when returned).
181
- Check `success` as well as the HTTP status. If false, report `message` and stop;
182
- a successful HTTP response alone is not a completed plan.
172
+ Minimal response examples:
173
+
174
+ ```json
175
+ { "success": true, "contentPlanFlowId": "<returned-flow-uuid>" }
176
+ ```
183
177
 
184
- On success, retain the returned `contentPlanFlowId` for the next status check
185
- and candidate read. This response is not the list of briefs: continue to steps
186
- 4 and 5. Do not call release again to retrieve results; on an already successful
187
- flow it regenerates a plan under a new flow ID.
188
- See [Create Content Plan](https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-blog-post-candidate-v1/create-content-plan).
178
+ ```json
179
+ { "success": false, "message": "<failure-message>" }
180
+ ```
189
181
 
190
- ### 4. Poll until SUCCESS
182
+ Record the attempt before sending. Concurrent/repeated calls can duplicate plans.
183
+ If release history is uncertain, ask rather than send another POST. Check HTTP
184
+ status and response `success`; `false` requires reporting `message`, not claiming
185
+ completion. On HTTP `428` with application code
186
+ `FLOW_NOT_READY_FOR_CONTENT_PLAN` (listed in the Create Content Plan reference's
187
+ errors), inspect the error and make a paced
188
+ status recheck; do not retry the POST in a loop. Other errors or an
189
+ uncertain response require reporting the attempt, not repeating it.
190
+
191
+ On success, retain the returned `contentPlanFlowId` and monitor it with the same
192
+ bounded, single-request approach. A different returned ID is a separate flow;
193
+ explain that and never claim the original completed. Completion still requires
194
+ observed `SUCCESS` and returned candidates. Do not release an already successful
195
+ flow to recover it: that action regenerates a separate plan.
196
+ [Create Content Plan](https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-blog-post-candidate-v1/create-content-plan).
197
+
198
+ ### Edge cases
199
+
200
+ | Situation | Action |
201
+ | --- | --- |
202
+ | Research briefly not found | The flow can link the ID before its research record exists. Read again after a pause within the window, then inspect the flow if it persists; do not release or restart. |
203
+ | Research `FAIL`, `CANCELED`, `REVERTED`, missing/unknown status, or mismatched IDs | Stop and report the result; no release or replacement. |
204
+ | Get Site Keyword Research unavailable | Keep the error and IDs. Continue paced flow reads only: `CONTENT_PLAN`/`SUCCESS` needs no release; still `KEYWORD_RESEARCH` when the window ends means report incomplete, because readiness cannot be verified. Never release from flow status or keyword-list items. |
205
+ | Authorization denied or other error | Report the specific error and keep the IDs; no private fallback or readiness guess. |
191
206
 
192
- Same single-GET execution and nested response as step 2, using the release
193
- response's flow ID and returning after each check. Typical status progression:
194
- `CONTENT_PLAN` → `SUCCESS`. Read candidates in a subsequent execution after
195
- observing `SUCCESS`.
207
+ ## 4. Read and present briefs
196
208
 
197
- ### 5. Read the briefs
209
+ Only after observing `SUCCESS` for the same flow:
198
210
 
199
211
  ```
200
- GET https://www.wixapis.com/promote/seo/v1/content-plan-flows/{contentPlanFlowId}/blog-post-candidates
212
+ GET https://www.wixapis.com/seo-content-plan-service/v1/content-plan-flows/{contentPlanFlowId}/blog-post-candidates
201
213
  ```
202
214
 
203
- Example response showing the fields needed to display one topic:
215
+ Omit `paging` to return all candidates. Read titles and keywords from `briefData`:
204
216
 
205
217
  ```json
206
218
  {
207
- "blogPostCandidates": [
208
- {
209
- "id": "<candidate-id>",
210
- "briefData": {
211
- "h1Title": "How to Care for Handmade Ceramic Mugs",
212
- "keyword": "ceramic mug care",
213
- "mainKeyword": "handmade ceramic mugs",
214
- "pageUrl": "https://www.example.com/mugs"
215
- }
219
+ "blogPostCandidates": [{
220
+ "id": "<candidate-id>",
221
+ "briefData": {
222
+ "h1Title": "How to Care for Handmade Ceramic Mugs",
223
+ "keyword": "ceramic mug care",
224
+ "mainKeyword": "handmade ceramic mugs",
225
+ "pageUrl": "https://www.example.com/mugs"
216
226
  }
217
- ],
218
- "pagingMetadata": { "count": 1, "cursors": {}, "hasNext": false }
227
+ }],
228
+ "pagingMetadata": { "count": 1, "hasNext": false }
219
229
  }
220
230
  ```
221
231
 
222
- This is illustrative data, not the user's results. Candidates can contain
223
- additional fields; see the linked reference for the full contract. Omitting
224
- `paging` returns all candidates in a single response. Each candidate's brief
225
- fields are nested under `briefData`, not at the candidate's top level. Map them
226
- directly:
227
-
228
- ```js
229
- const topics = response.blogPostCandidates.map(candidate => ({
230
- id: candidate.id,
231
- title: candidate.briefData?.h1Title,
232
- keyword: candidate.briefData?.keyword,
233
- mainKeyword: candidate.briefData?.mainKeyword,
234
- supportingPageUrl: candidate.briefData?.pageUrl
235
- }));
236
- ```
232
+ The final reply must give the flow ID, observed completion and count,
233
+ followed by a table with **Title | Keyword | Main keyword | Supporting URL**.
234
+ Populate all four columns from `briefData`, with clickable supporting URLs;
235
+ a titles-only or titles/main-keywords table is incomplete. Label any shortened subset.
236
+ Absent fields are unavailable; do not invent them. `pageUrl` supports an existing
237
+ page, not a newly published post. Explain weak or repetitive results honestly;
238
+ successful generation does not establish editorial quality or promise rankings.
239
+ [List Blog Post Candidates](https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-blog-post-candidate-v1/list-blog-post-candidates).
240
+
241
+ ## Editing keywords after completion (optional)
237
242
 
238
- `pageUrl` identifies the existing site page the proposed post supports; it is
239
- not the URL of a newly published blog post. Generation creates briefs, not
240
- published posts. Do not read `candidate.title`, `candidate.keyword`, or
241
- `candidate.pageUrl`, or infer missing data from those nonexistent top-level
242
- fields. If a nested field is absent, report it as unavailable and inspect the
243
- raw candidate before making another request. Report the actual returned
244
- titles and available keywords/supporting page URLs. Do not invent briefs or
245
- claim completion from the release response.
246
- See [List Blog Post Candidates](https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-blog-post-candidate-v1/list-blog-post-candidates).
247
-
248
- ### Present the result
249
-
250
- Start with the flow ID, observed `SUCCESS` status, and returned candidate count.
251
- Use a compact table with one row per topic: suggested title, target keyword,
252
- main keyword, and supporting page URL. Include the actual returned URL as a
253
- link; do not merely say that each brief contains a URL. Avoid repeating SEO
254
- titles and descriptions unless requested. If the answer must be shortened,
255
- label the displayed subset and total explicitly instead of claiming to show all
256
- topics. These are AI-generated suggestions; do not promise rankings or traffic.
257
- Assess the returned topics before recommending them: if they are repetitive,
258
- mostly restate the site name, or lack a clear connection to the site's business,
259
- say so plainly. Successful generation does not establish editorial quality.
260
- Still show the actual results; do not silently replace weak titles with invented
261
- ones or call them optimized without evidence. Explain what business context
262
- would help assess or refine them, without modifying the site's settings.
263
-
264
- ## Editing keywords (optional)
265
-
266
- After step 2, before or after step 3, read the keywords:
243
+ After observed flow `SUCCESS`, read research once:
267
244
 
268
245
  ```
269
- GET https://www.wixapis.com/promote/seo/v1/content-plan-keyword-research-items
246
+ GET https://www.wixapis.com/seo-content-plan-service/v1/content-plan-keyword-research-items
270
247
  ```
271
248
 
272
- Edit one keyword (field-masked, only `keyword` and `main_keyword` writable):
249
+ No parameters are required; omit optional `paging` for all items. Match returned
250
+ `keywordResearchId` to the completed flow and use returned `keywordResearchItems`
251
+ item IDs before editing. A mismatch or HTTP `404` is not permission to edit or
252
+ retry immediately. This is a post-completion read, not a pre-completion readiness
253
+ test.
254
+ The list is site-scoped and returns the latest research, not per-research status.
255
+ Its reserved `contentPlanFlowId` query field is ignored; it cannot target an older
256
+ flow or prove that flow's readiness.
257
+ [List Keyword Research Items](https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-keyword-research-v1/list-keyword-research-items).
258
+
259
+ Only `keyword` and `mainKeyword` are writable, using a field mask.
260
+ Set `mainKeyword: true` to promote an existing item. Whether `false` demotes one
261
+ is not verified; do not rely on it, and read the item back after any change.
262
+ [Update Keyword Research Item](https://dev.wix.com/docs/api-reference/business-management/seo/content-plan-keyword-research-v1/update-keyword-research-item).
263
+
264
+ List uses `content-plan-keyword-research-items`, while Update uses
265
+ `keyword-research-items/{itemId}`. Preserve that difference. Use the returned
266
+ `item.id` for `{itemId}` and the same value in the Update body.
273
267
 
274
268
  ```
275
- PATCH https://www.wixapis.com/promote/seo/v1/keyword-research-items/{itemId}
269
+ PATCH https://www.wixapis.com/seo-content-plan-service/v1/keyword-research-items/{itemId}
276
270
  {
277
- "keywordResearchId": "...",
278
- "item": { "id": "...", "keyword": "new keyword" },
271
+ "keywordResearchId": "<research-uuid>",
272
+ "item": { "id": "<item-id>", "keyword": "new keyword" },
279
273
  "fieldMask": "keyword"
280
274
  }
281
275
  ```
282
276
 
283
- **Copy-on-write:** the response may carry a different `keywordResearchId`.
284
- Always use the one from the response for the next write. Edits are not
285
- durable across generations.
286
-
287
- ## Do not
288
-
289
- - Poll forever without calling Create Content Plan (step 3).
290
- - Read candidates before `SUCCESS`.
291
- - Retry after `PENDING_REQUIREMENTS`.
292
- - Ask for a site ID.
293
- - Retry after a 403 — the caller lacks **Manage SEO Settings**.
277
+ The copy-on-write response can return a new `keywordResearchId`; use it for the
278
+ next write. Edits do not persist across generations.
@@ -211,7 +211,8 @@ route takes it. The site stays the same, at the same URL, now server-rendered.
211
211
  - **From a shell, without attachments:** two calls. `{ siteId, prepare: true, size }`
212
212
  with the ZIP's `size` (`wc -c < build.zip`) answers with `curl` commands for
213
213
  the build ZIP and, when the site's repository takes it, a source ZIP; run them
214
- as given, then make the second call it names, with `uploadKey`. A 404 on the
214
+ as given, then make the second call it names:
215
+ `{ siteId, uploadKey, sourceUploadId?, expectedHeadRevisionId?, releaseNotes? }`. A 404 on the
215
216
  second call means the upload URL expired: prepare again. A prepared upload is
216
217
  finished by that second call and by nothing else: a release made another way
217
218
  (the ZIP attached, say) leaves the prepared upload behind and releases without
@@ -0,0 +1,166 @@
1
+ ---
2
+ name: wix-readme
3
+ description: "What the Wix plugin holds and how to work with Wix through it: the flow the Wix MCP README returns, an index of the plugin's skills with what each does, and the Wix MCP tools with what each does. Use when the plugin was just installed or when the user asks what the Wix plugin can do or which skill or tool fits a task."
4
+ ---
5
+
6
+ # The Wix plugin
7
+
8
+ The plugin is two things: skills, folders of instructions and shipped code for building on Wix, each with a `SKILL.md` at its root; and the Wix MCP server at `https://mcp.wix.com/mcp`, whose tools read and change the user's Wix sites and account. The skills say how; the tools do.
9
+
10
+ ## How to work with Wix through the plugin
11
+
12
+ Every Wix task ends in one of two places: a call made now with the user's account, or code the user keeps that makes the same calls (an app, a headless site, a script). The way there is the same.
13
+
14
+ 1. **Start with `WixREADME`**, once per conversation. It returns this flow in full and the account's sites with their installed apps.
15
+ 2. **Pick the site.** The `siteId` comes from the site context; when several fit, ask. A business solution's API works only on a site with that app installed, and an app's version changes its endpoints, so check the site's apps first.
16
+ 3. **Find the method.** The first source that gives it: an earlier tool result in the conversation; else the skill that covers the task (the index below says what each is for), whose example is the model when it matches the case; else the docs, `SearchWixRESTDocumentation` or `BrowseWixRESTDocsMenu` for REST, the SDK, CLI, headless and apps searches for code, then `ReadFullDocsArticle` on the method's page.
17
+ 4. **Get the exact shape.** A request is modeled on an example that matches the case: a skill's recipe or template, or the method's docs page, when it shows the fields the case needs. That is enough. The schema is for what no example shows: a field, an enum, a filter or sort key (a closed list per method). `SearchWixAPISpec` on the method's docs URL returns the request and response schemas, the REST URL and the JavaScript SDK call; `ReadFullDocsMethodSchema` when it is not available.
18
+ 5. **Make the call, or write the code.** To do it now: `ExecuteWixAPI`, one function holding every step of the task, the reads and the writes they feed. For code the user keeps: write the call from the shape found in step 4, REST or SDK. `wix-headless-templates` is that code already written and verified, one folder per business solution, and `wix-headless-kit` builds a site on it.
19
+
20
+ Throughout: nothing Wix-specific from memory. Every URL, id, setting location, product fact, request shape and field name comes from a skill, the docs tools, an earlier tool result or the user.
21
+
22
+ ## Creating a site
23
+
24
+ A new Wix site is written in code and uploaded. `StartDeployWebsite` returns the guide for a site the agent writes or files the user brought; `StartHeadlessBuild` returns the guide for a site that needs Wix business features (a store, bookings, a CMS, members, payments and the rest). Each guide creates the site, uploads it and says what comes next; call one and follow it.
25
+
26
+ What the guides stand on:
27
+
28
+ - **One site, created once**, by the provision call (`POST .../headless-business-setup/v1/headless-business/provision`, `origin: 'agent'`), which returns `metaSiteId`, the id every later call takes. A site made earlier is found with `ListWixSites` and uploaded to again; the URL never changes.
29
+ - **Static pages are dropped, a Wix Astro build is released.** A drop sends the complete file set each time. A build (`.wix/build-metadata.json` beside `dist/`) is released to Wix hosting, server-rendered, through `UploadHeadlessWebsiteFiles` only: as an attachment, or in two calls (`prepare: true` with the zip's `size`, then `uploadKey`) from a shell that reaches the internet. The project's source is stored with the release, and a later session continues the site from it.
30
+ - **`UploadHeadlessWebsiteFiles`** takes `siteId` and the files, as `attachments` or the `files` text bundle, and returns the live URL and the dashboard. Without the MCP, the same drop is a `curl` multipart call, with or without a login.
31
+ - **Business features** come from `wix-headless-kit`'s run on the same site and `appId`: apps installed and content seeded, the Astro project built from `wix-headless-templates`, the build released.
32
+
33
+ To read more: the recipe, `wix-manage/references/sites/upload-static-site.md` (https://www.wix.com/skills/wix-manage/references/sites/upload-static-site.md): the calls for every route, drop and release, finding and changing a site, the anonymous route, limits and failures. The cold start (https://www.wix.com/skills/headless-cold-start/headless-kit.md): the headless build from a cold environment to the released site.
34
+
35
+ ## Two ways to Wix
36
+
37
+ ### The plugin with the Wix MCP
38
+
39
+ The preferred way. The plugin's MCP configuration connects the Wix MCP server at `https://mcp.wix.com/mcp`; the client signs the user in on the first call and the tools below are in the tool list, with nothing to install. The flow above runs on them: `WixREADME` for the context, the documentation tools to find a method and its shape, `ExecuteWixAPI` to call it, `StartDeployWebsite` and `StartHeadlessBuild` with `UploadHeadlessWebsiteFiles` to create a site and put it live. The skills are read from the plugin's folder, and `ReadFullDocsArticle` reads them online when they are not there.
40
+
41
+ Context first:
42
+
43
+ | Tool | What it does |
44
+ |---|---|
45
+ | `WixREADME` | The context every other tool assumes. Call it once per conversation before a Wix task; for another site later, call `GetSiteContext` instead. |
46
+ | `ListWixSites` | Lists the user's sites, with an optional name filter. Needs no `WixREADME` first. |
47
+ | `GetSiteContext` | Deep context for one site, by name or id: its apps, settings and data, as markdown. |
48
+
49
+ Building and deploying a site:
50
+
51
+ | Tool | What it does |
52
+ |---|---|
53
+ | `StartDeployWebsite` | Returns the guide to create a site on Wix and put files on it: HTML, CSS and JS, a static build, a zip, another builder's export. Updates keep the site and URL. Works with or without a Wix login. |
54
+ | `StartHeadlessBuild` | Returns the headless guide, for a site that needs Wix business features: a store, bookings, events, a restaurant menu, a blog, pricing plans, donations, forms, members, a CMS, payments. |
55
+ | `UploadHeadlessWebsiteFiles` | The upload step of those two guides: puts a static site or a Wix Astro build onto an existing Wix Headless site by its metaSiteId, as files, as attachments, or in two calls with presigned URLs. |
56
+ | `GetSuggestedDomains` | Domain name suggestions for a site. |
57
+
58
+ Calling Wix APIs:
59
+
60
+ | Tool | What it does |
61
+ |---|---|
62
+ | `ExecuteWixAPI` | Reads and changes a site's or account's data with one JavaScript function over the Wix REST API: chained calls, pagination, loops, the reads that feed the writes. The preferred way to call Wix APIs. |
63
+ | `SearchWixAPISpec` | Inspects the Wix REST API spec and each method's JavaScript SDK call by running JavaScript against the index: the exact request and response shape, enums, the SDK import and signature. |
64
+
65
+ Documentation:
66
+
67
+ | Tool | What it does |
68
+ |---|---|
69
+ | `SearchWixRESTDocumentation` | Searches the Wix REST API docs. The starting point for finding an endpoint. |
70
+ | `BrowseWixRESTDocsMenu` | Browses the REST docs as a menu, category by category. |
71
+ | `SearchWixSDKDocumentation` | Searches the Wix JavaScript SDK docs. |
72
+ | `SearchWixHeadlessDocumentation` | Searches the Wix Headless docs. |
73
+ | `SearchWixCLIDocumentation` | Searches the Wix CLI docs: commands, local development, authentication. |
74
+ | `SearchWixWDSDocumentation` | Searches the Wix Design System docs. |
75
+ | `SearchBuildAppsDocumentation` | Searches the Wix Build Apps docs. |
76
+ | `SearchDevelopmentDocumentation` | Broad Wix developer docs: platform concepts and guides, after the specific searches return nothing. |
77
+ | `SearchWixHelpCenter` | Searches the Wix Help Center: how site owners do things by hand in the dashboard and editors. |
78
+ | `ReadFullDocsArticle` | Reads a page in full by URL: a docs article or method page, a skill's `SKILL.md` or any of its files, a Help Center article. |
79
+ | `ReadFullDocsMethodSchema` | The full request and response schema of one method, by its docs URL. |
80
+
81
+ Media and feedback:
82
+
83
+ | Tool | What it does |
84
+ |---|---|
85
+ | `UploadImageToWixSite` | Uploads images to a site's Media Manager and returns their URLs and media ids. |
86
+ | `PickImagesForWixMedia` | Shows the user a file picker to upload images from their device to the Media Manager. |
87
+ | `ReportIssueToWix` | Reports one problem with Wix's tools, APIs or docs to the Wix team, when the user asks for it. |
88
+
89
+ ### The Wix CLI
90
+
91
+ The other way, from a shell. `@wix/cli` is Wix's command-line tool: it signs in to a Wix account, creates and manages Wix projects on disk, a Wix app or a Wix Headless site, builds them and releases them to Wix, and mints tokens for REST calls. Its session lives on the machine. All as `npx @wix/cli@latest <command>`:
92
+
93
+ | Command | What it does |
94
+ |---|---|
95
+ | `login` | Signs in with a device code and writes the session to `~/.wix/auth/account.json`. |
96
+ | `whoami` | Shows the signed-in account. |
97
+ | `create` | Creates a Wix project with its site: for a headless site, the site, its OAuth app and hosting, and the project's `wix.config.json` (`siteId`, `appId`). |
98
+ | `env pull` | Writes the project's environment to `.env.local`: the site's client id and the values the build reads. |
99
+ | `build` | Builds the project for Wix: for an Astro site, `dist/` and `.wix/build-metadata.json`. |
100
+ | `release` | Releases the build to Wix; the site keeps its URL. |
101
+ | `token`, `token --site <siteId>` | Mints an admin token, account-scoped or site-scoped, for REST calls from a shell: `Authorization: Bearer <token>` (`wix-docs/references/CALLING.md`). |
102
+
103
+ `wix-headless-kit` builds a Wix Headless site through the MCP's tools or through the CLI; a CLI session already on the machine makes its run the CLI route, where `install/setup.mjs` runs `create`, and `build` then `release` put the site live.
104
+
105
+ Without the MCP, each tool is a plain HTTP call to the same backend. `wix-docs` covers these, with the request bodies, as its `curl` lane:
106
+
107
+ | Tool | Without the MCP |
108
+ |---|---|
109
+ | `SearchWixRESTDocumentation`, `SearchWixSDKDocumentation`, `SearchWixHeadlessDocumentation`, `SearchWixCLIDocumentation`, `SearchWixWDSDocumentation`, `SearchBuildAppsDocumentation`, `SearchDevelopmentDocumentation` | `POST https://www.wixapis.com/mcp-docs-search/v1/docs/search` (or `/search/markdown`) with `search_term` and the `document_type` of that corpus. |
110
+ | `BrowseWixRESTDocsMenu` | `POST https://www.wixapis.com/mcp-docs-search/v1/docs/menu/browse`. |
111
+ | `ReadFullDocsArticle` | Append `.md` to any `https://dev.wix.com/docs/...` URL; a skill's file is `https://www.wix.com/skills/<skill>/<path>`. |
112
+ | `SearchWixAPISpec`, `ReadFullDocsMethodSchema` | `POST https://mcp.wix.com/api/code-mode/search` with the same JavaScript. |
113
+ | `ExecuteWixAPI` | The REST call itself, to `https://www.wixapis.com`, with a token: which identity a method takes and how to mint the token are in `wix-docs/references/CALLING.md`. |
114
+ | `StartDeployWebsite`, `StartHeadlessBuild`, `UploadHeadlessWebsiteFiles` | `create`, `build` and `release` from a shell; the `wix-manage` recipe `references/sites/upload-static-site.md` creates a site and drops files over REST. |
115
+
116
+ ## Skills
117
+
118
+ Each skill is a folder with a `SKILL.md` at its root that says what it does and which of its files to read when. A skill may already be on disk, in the plugin's folder or under `.agents/skills/<skill>/` after `npx skills add wix/skills`, or served by the client's skill tool; read it from there. Otherwise every file is online at `https://www.wix.com/skills/<skill>/<path>`, read with `ReadFullDocsArticle` or `curl`; `https://www.wix.com/skills/<skill>/` with the trailing slash lists the skill's files. Paths below are inside the skill's folder.
119
+
120
+ ### wix-headless-kit
121
+
122
+ Online: https://www.wix.com/skills/wix-headless-kit/SKILL.md. On disk: the plugin's `skills/wix-headless-kit/`, or `.agents/skills/wix-headless-kit/`.
123
+
124
+ Builds a Wix Headless site on shipped, verified `@wix/sdk` code: one typed data layer, hooks, components, Astro pages and a seed script per Wix business solution, from `wix-headless-templates`. The agent designs the presentation on those hooks and releases to Wix hosting. Runs as a CLI flow from a shell, or as Wix API calls through the MCP.
125
+
126
+ **The cold start**, `wix-headless-cold-start/headless-kit.md` (https://www.wix.com/skills/headless-cold-start/headless-kit.md, what `StartHeadlessBuild` returns), takes a cold environment to where wix-headless-kit runs, then hands off to its `SKILL.md`. It measures three facts: the Wix MCP's tools in the tool list; Node 24.18 or later with `npm` reaching the registry; a way to get a build to `UploadHeadlessWebsiteFiles`, as an attachment or by `curl` to its upload URLs. The facts pick the route: all three, the plugin route (site through `ExecuteWixAPI`, Astro build here, release through the upload tool); MCP but no way to release a build, the API-call guide (`guides/api-run.md`, static pages in the upload tool's `files`); a Wix CLI session on the machine, the CLI route. The project folder comes first, with any handed-over files extracted into it. Skills on disk are used where they are; otherwise `CI=1 npx skills@latest add wix/skills --skill wix-headless-kit --skill wix-docs --skill wix-manage --yes`, then `node .agents/skills/wix-headless-kit/install/templates.mjs` for the templates, and `install/bootstrap.mjs` on the CLI route.
127
+
128
+ - `SKILL.md`: the steps of a build and the table of business solutions.
129
+ - `guides/api-run.md`: the whole run as Wix API calls through the MCP, for an agent with no shell or a shell that cannot reach Wix.
130
+ - `guides/capabilities.md`: which Wix product owns which feature, and what ships for it.
131
+ - `guides/existing-site.md`: a new frontend for a Wix site that already has its content, and continuing a site built in an earlier session.
132
+ - `guides/migration.md`: a site moving to code after "Go Headless" in its dashboard.
133
+ - `guides/reference-mode.md`: a stack that cannot run the shipped React code.
134
+ - `guides/feedback.md`: sending the user's feedback on building with Wix.
135
+ - `install/`: the scripts of a run (`setup.mjs`, `attach.mjs`, `deploy.mjs`, `install.mjs`, `templates.mjs`, `context.mjs`, `bootstrap.mjs`, `check.mjs`) and `pins.json`, the pinned CLI and templates versions.
136
+
137
+ ### wix-headless-templates
138
+
139
+ Online: https://www.wix.com/skills/wix-headless-templates/SKILL.md. On disk: the plugin's `skills/wix-headless-templates/`, or `.agents/skills/wix-headless-templates/`.
140
+
141
+ The code wix-headless-kit builds from, one folder per business solution: `storefront`, `bookings`, `rentals`, `blog`, `cms`, `forms`, `members`, `events`, `restaurants`, `donations`, `pricing-plans`, `portfolio`, `faq`, plus `blank` and `shared`. Each folder holds:
142
+
143
+ - `INSTRUCTIONS.md`: the playbook, with the contracts.
144
+ - `app/`: the typed, framework-agnostic data layer over `@wix/sdk`, React hooks and reference components.
145
+ - `app-astro/`: the Astro pages with owner-editable SEO.
146
+ - `rest/`: the same data layer as plain REST calls, for a site without a bundler.
147
+ - `seed/`: the seed script that fills the site from a plan, `SEED.md` as the plan's contract, and a reader of what the site already holds.
148
+ - `project/`: the solution composed into the CLI's Astro scaffold.
149
+
150
+ `compose.mjs` at the root composes a solution's layers into a project.
151
+
152
+ ### wix-manage
153
+
154
+ Online: https://www.wix.com/skills/wix-manage/SKILL.md. On disk: the plugin's `skills/wix-manage/`, or `.agents/skills/wix-manage/`.
155
+
156
+ REST recipes to configure and manage a site's business solutions, one recipe per task with the exact endpoints, request bodies and order of steps. `SKILL.md` is the index of every recipe by area, each a link. The recipes are under `references/<area>/`: `app-installation`, `stores`, `ecommerce`, `bookings`, `calendar`, `donations`, `get-paid`, `pricing-plans`, `restaurants`, `events`, `blog`, `cms`, `rich-content`, `forms`, `contacts`, `automations`, `marketing`, `google-ads`, `google-business-profile`, `analytics`, `seo`, `media`, `sites`, `domains`, `site-properties`, `collaborators`, `custom-apps`, `dashboard-navigation`, `accessibility`. Each recipe is also a docs article under its API's section.
157
+
158
+ ### wix-docs
159
+
160
+ Online: https://www.wix.com/skills/wix-docs/SKILL.md. On disk: the plugin's `skills/wix-docs/`, or `.agents/skills/wix-docs/`.
161
+
162
+ Looks up the Wix API and SDK documentation to confirm an endpoint, method, request and response shape, field, enum or error before writing Wix code. `SKILL.md` has the two lanes, plain `curl` and the MCP's documentation tools, with the search, browse and read requests. `references/API_SPEC_SEARCH.md`: the spec index and its queries. `references/CALLING.md`: the identities a call runs as and how each token is minted. `references/EXTRACTING.md`: reading only the needed part of a big menu or method page with `curl` and `grep`.
163
+
164
+ ### wix-readme
165
+
166
+ This index.