@lacneu/wix-openclaw 0.3.1 → 0.5.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/CHANGELOG.md +179 -2
- package/README.md +103 -14
- package/dist/config.js +16 -1
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +369 -0
- package/dist/index.js +31 -2
- package/dist/index.js.map +1 -1
- package/dist/tools/_query.d.ts +1 -1
- package/dist/tools/_query.js +3 -0
- package/dist/tools/_query.js.map +1 -1
- package/dist/tools/accessibility.d.ts +132 -0
- package/dist/tools/accessibility.js +740 -0
- package/dist/tools/accessibility.js.map +1 -0
- package/dist/tools/seo.d.ts +239 -0
- package/dist/tools/seo.js +1039 -0
- package/dist/tools/seo.js.map +1 -1
- package/dist/types.d.ts +5 -1
- package/dist/wix-client.js +10 -0
- package/dist/wix-client.js.map +1 -1
- package/openclaw.plugin.json +37 -5
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,183 @@ All notable changes to this project will be documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [Unreleased]
|
|
9
|
+
|
|
10
|
+
## [0.5.0] - 2026-08-29
|
|
11
|
+
|
|
12
|
+
Six accessibility tools, off by default behind **their own** switch. The 0.4
|
|
13
|
+
line could correct a site's SEO tags and say nothing about whether the site
|
|
14
|
+
could be used with a screen reader; Wix runs an accessibility scan of its own,
|
|
15
|
+
and this release reads it.
|
|
16
|
+
|
|
17
|
+
Nothing in this family writes to the site, so there are no tokens and no
|
|
18
|
+
refusals here. The discipline moved instead to what an answer is allowed to
|
|
19
|
+
CLAIM — see below.
|
|
20
|
+
|
|
21
|
+
### Added — Accessibility: Wix runs the scan, this reads the result
|
|
22
|
+
|
|
23
|
+
> Developer Preview, and **off by default behind its own switch**,
|
|
24
|
+
> `enableAccessibilityTools`. Nothing in this family writes to the site.
|
|
25
|
+
|
|
26
|
+
Six tools: `wix_a11y_list_page_collections`, `wix_a11y_run_scan`,
|
|
27
|
+
`wix_a11y_get_scan`, `wix_a11y_get_latest_scan`,
|
|
28
|
+
`wix_a11y_list_page_summaries` and `wix_a11y_list_findings`.
|
|
29
|
+
|
|
30
|
+
### The discipline moves, because the danger moved
|
|
31
|
+
|
|
32
|
+
The SEO writes needed tokens because they destroyed the previous value of what
|
|
33
|
+
they wrote. Nothing here destroys anything — so the way this family hurts a user
|
|
34
|
+
is different, and Wix names it: **a page is clear only when it has no findings,
|
|
35
|
+
its page status is completed, and its coverage confirms the relevant checks
|
|
36
|
+
ran**. A page that failed to scan reports zero findings too, because nothing was
|
|
37
|
+
read.
|
|
38
|
+
|
|
39
|
+
So no answer here can be skimmed into a clean one. Page summaries carry `clear`,
|
|
40
|
+
valued `true`, `false` or `"unknown"`, instead of a bare count — and a `true`
|
|
41
|
+
comes with `clearFor`, naming the checks it is true for, because coverage says
|
|
42
|
+
which checks ran, not that the right ones did. The `"unknown"` pages are
|
|
43
|
+
counted for you. A scan reports `resultIsWhole`;
|
|
44
|
+
`PARTIALLY_COMPLETED` never collapses into success, a running scan says its
|
|
45
|
+
numbers are progress rather than a result, and a failed scan refuses to be a
|
|
46
|
+
result at all. An unfiltered empty findings list says that an absent finding is
|
|
47
|
+
not a rule that passed.
|
|
48
|
+
|
|
49
|
+
### `attempt` is what tells a retry apart from a new scan
|
|
50
|
+
|
|
51
|
+
Wix takes a caller-generated idempotency key so a lost response cannot create
|
|
52
|
+
duplicate work, and requires a **new** key for a genuinely new scan — verifying
|
|
53
|
+
a fix is a new scan, not a retry. The key is derived from the site, the target
|
|
54
|
+
and the `attempt` label the caller passes. A random key per call would satisfy
|
|
55
|
+
the schema and make the guarantee inert against a 5-per-minute limit; deriving
|
|
56
|
+
it from the target alone would turn every verification into a retry that hands
|
|
57
|
+
back the stale result.
|
|
58
|
+
|
|
59
|
+
### Recovery paths that would otherwise be unreachable
|
|
60
|
+
|
|
61
|
+
`SCAN_ALREADY_IN_PROGRESS` and `SCAN_STATE_UNKNOWN` carry a scan id the caller
|
|
62
|
+
is meant to poll. Left inside a thrown message, the only move an agent has left
|
|
63
|
+
is to start a duplicate — so those errors return the id and the instruction not
|
|
64
|
+
to. `SCAN_SIZE_LIMIT_EXCEEDED` returns with an explicit ban on describing the
|
|
65
|
+
site as fully scanned.
|
|
66
|
+
|
|
67
|
+
### The SDK view is not the wire view
|
|
68
|
+
|
|
69
|
+
The Wix SDK renames three keys coming back from REST — `id` → `_id`,
|
|
70
|
+
`createdDate` → `_createdDate`, `updatedDate` → `_updatedDate`. This plugin
|
|
71
|
+
speaks REST directly, so the wire says `id`. Every field name here was taken
|
|
72
|
+
from the SDK typings, which made that rename the one place the typings are not
|
|
73
|
+
the contract: reading `_id` returned `undefined` on every real call, so a
|
|
74
|
+
started scan handed back no id and the polling flow had nothing to poll. The
|
|
75
|
+
tests agreed, because the fixtures had been shaped from the same typings.
|
|
76
|
+
|
|
77
|
+
Query encoding came from the same source and had the same shape of trap: Wix's
|
|
78
|
+
serialiser flattens nested objects to dotted keys (`filter.severity`) but emits
|
|
79
|
+
a repeated field as a **repeated key** (`filter.categories=A&filter.categories=B`).
|
|
80
|
+
An indexed `filter.categories.0` is a different parameter, and a filter the API
|
|
81
|
+
ignores returns unfiltered findings that the tool would then label filtered.
|
|
82
|
+
|
|
83
|
+
### Fixed
|
|
84
|
+
|
|
85
|
+
- **A raw NUL byte had been written into a source file.** It was a legitimate
|
|
86
|
+
HMAC separator written the wrong way, and its effect was not on the running
|
|
87
|
+
code: `grep` treats a file containing NUL as binary and answers **nothing**,
|
|
88
|
+
silently, so searches reported symbols absent that were present. Written as
|
|
89
|
+
an escape now, and a guard rejects any raw control character in `src/` and
|
|
90
|
+
`test/` — the same class as a stray U+2028 that once landed in a test regex.
|
|
91
|
+
- Stale counts in the SEO opt-in comments in `src/config.ts` and the manifest
|
|
92
|
+
test, still saying four tools write irreversibly when eleven do.
|
|
93
|
+
|
|
94
|
+
## [0.4.0] - 2026-08-29
|
|
95
|
+
|
|
96
|
+
Ten more `wix_seo_*` tools, still **off by default**, close the other half of
|
|
97
|
+
the SEO gap: 0.3.x could audit a site's tags and never correct them. Writing
|
|
98
|
+
them is a different destructiveness from deleting a redirect — a tag write
|
|
99
|
+
replaces **the previous value of what it writes** — so the guard is different
|
|
100
|
+
too, and most of this entry is about that.
|
|
101
|
+
|
|
102
|
+
### Added — SEO: writing tags, and the patterns behind them
|
|
103
|
+
|
|
104
|
+
> Same warning as the audit tools: these endpoints are in Developer Preview,
|
|
105
|
+
> Wix states they should not be used on live sites, and **every tool here
|
|
106
|
+
> replaces what it writes**. They register only with `enableSeoTools: true`.
|
|
107
|
+
|
|
108
|
+
Ten tools complete the SEO surface: you could audit tags but not correct them.
|
|
109
|
+
|
|
110
|
+
**Per-item and site-wide tags.** `wix_seo_set_item_tags`,
|
|
111
|
+
`wix_seo_bulk_set_item_tags`, `wix_seo_reset_item_tags` and
|
|
112
|
+
`wix_seo_set_site_tags`.
|
|
113
|
+
|
|
114
|
+
**Patterns.** `wix_seo_list_patterns`, `wix_seo_get_pattern`,
|
|
115
|
+
`wix_seo_list_pattern_variables` (read-only) plus `wix_seo_set_pattern`,
|
|
116
|
+
`wix_seo_create_pattern` and `wix_seo_reset_pattern`.
|
|
117
|
+
|
|
118
|
+
### The destructiveness is a different shape, so the guard is too
|
|
119
|
+
|
|
120
|
+
A redirect delete destroys another row — it can be listed and named. A tag write
|
|
121
|
+
destroys **the previous value of what it writes**: `tags` replaces the item's set
|
|
122
|
+
in full, so a caller that sets a title wipes the description it never mentioned,
|
|
123
|
+
gets exactly what it asked for, and loses something it never saw. That is this
|
|
124
|
+
half's "redirects do not chain".
|
|
125
|
+
|
|
126
|
+
The pre-flight therefore reports what **disappears** — the tags held today whose
|
|
127
|
+
slot the incoming set does not fill — never an echo of the input. A caller
|
|
128
|
+
reading its own request back learns nothing. Nothing is lost, nothing is
|
|
129
|
+
refused: the ceremony exists for the unannounced loss, not for its own sake.
|
|
130
|
+
|
|
131
|
+
A pattern write earns the heaviest pre-flight in the plugin. It re-renders
|
|
132
|
+
**every page of its type**, it has no revision, and the Wix dashboard writes to
|
|
133
|
+
the same object — last write wins. So the refusal reports the page count
|
|
134
|
+
downstream alongside the templates, and the token is bound to the pattern read
|
|
135
|
+
immediately before — **and to that page count**, because the radius is part of
|
|
136
|
+
what was accepted: a token minted while a type held twelve pages does not
|
|
137
|
+
authorise the same write once it holds four hundred.
|
|
138
|
+
|
|
139
|
+
Every refusal in this family carries the **value** of what it names, not only
|
|
140
|
+
its slot.
|
|
141
|
+
Editing `{{title}}` into `{{title}} — Ataraxis` loses no tag, so a report by
|
|
142
|
+
slot alone read identically before and after — an operator signing a rewrite of
|
|
143
|
+
every page of a type without seeing either version.
|
|
144
|
+
|
|
145
|
+
### Three contract facts that live in code, not in prose
|
|
146
|
+
|
|
147
|
+
- **`fieldMask` is a comma-separated STRING over REST.** The SDK takes an array,
|
|
148
|
+
which is what a model reaches for. It is built here, never accepted.
|
|
149
|
+
- **`language` is actively dropped.** Tags can only be written for the item's
|
|
150
|
+
primary language, and sending one fails `LANGUAGE_NOT_SUPPORTED` *even when
|
|
151
|
+
the field mask omits it* — so not declaring the field is not enough, TypeBox
|
|
152
|
+
passes undeclared properties through.
|
|
153
|
+
- **Site SEO Tags accepts only `meta`.** Wix rejects `title`, `script` and
|
|
154
|
+
`link` there despite the shared tag shape listing them, and there is no way to
|
|
155
|
+
set site-wide structured data through any Wix API — a per-page `script` tag is
|
|
156
|
+
the route.
|
|
157
|
+
|
|
158
|
+
`BLOG_POST` bulk writes are capped at 20 entries, not 100, and Wix rejects the
|
|
159
|
+
**whole call** past an item type's limit — a 40-post batch would write nothing —
|
|
160
|
+
so the cap is enforced before the request leaves.
|
|
161
|
+
|
|
162
|
+
### The `publish` split, stated where a model will read it
|
|
163
|
+
|
|
164
|
+
For a static page, `publish: true` updates **only** the published revision. The
|
|
165
|
+
read tools always return the **saved** one, so after such a write they keep
|
|
166
|
+
showing the old values — that is not a failed write, and re-sending will not
|
|
167
|
+
change it. The method's own response is not a read of the published page either.
|
|
168
|
+
A caller following the description literally converges instead of retrying.
|
|
169
|
+
|
|
170
|
+
## [0.3.1] - 2026-08-28
|
|
171
|
+
|
|
172
|
+
**The version that actually reached npm for the 0.3 line.** `v0.3.0` was
|
|
173
|
+
tagged, failed to compile in the release workflow and was never published, so
|
|
174
|
+
`0.3.1` carries the whole 0.3.0 entry below plus the fix that unblocked it.
|
|
175
|
+
|
|
176
|
+
### Fixed
|
|
177
|
+
|
|
178
|
+
- **The build imported a type from a subpath that does not exist across the
|
|
179
|
+
supported range.** `openclaw/plugin-sdk/agent-core` only appeared in
|
|
180
|
+
2026.5.28, while this plugin declares `>=2026.5.0`, so CI failed on the lower
|
|
181
|
+
bound. The shared tool-result type is declared locally instead — verified at
|
|
182
|
+
both ends of the supported range rather than at the version that happened to
|
|
183
|
+
be installed.
|
|
184
|
+
|
|
8
185
|
## [0.3.0] - 2026-08-28
|
|
9
186
|
|
|
10
187
|
Nine `wix_seo_*` tools, **off by default**, close the gap that made this plugin
|
|
@@ -402,7 +579,7 @@ For instance owners on `@lacneu/wix-openclaw@0.2.2`:
|
|
|
402
579
|
3. Verify in the boot log:
|
|
403
580
|
`wix-openclaw: ready — 50 tool(s) registered`.
|
|
404
581
|
|
|
405
|
-
Fifty, not
|
|
582
|
+
Fifty, not sixty-nine: the SEO tools are not registered until you opt in. Nothing
|
|
406
583
|
else changes, and the approval fix applies as soon as the plugin loads — a gated
|
|
407
584
|
tool that used to fail without asking will now put its prompt to the operator.
|
|
408
585
|
|
|
@@ -418,7 +595,7 @@ To add the SEO tools:
|
|
|
418
595
|
`openclaw config set plugins.entries.wix-openclaw.config.enableSeoTools true`.
|
|
419
596
|
`update` carries your existing config forward and the new field simply
|
|
420
597
|
defaults to `false`, so nothing turns on by surprise.
|
|
421
|
-
3. Restart, and expect `
|
|
598
|
+
3. Restart, and expect `69 tool(s) registered`.
|
|
422
599
|
4. Read the Developer Preview warning at the top of this section before pointing
|
|
423
600
|
any of the four writing tools at a live site.
|
|
424
601
|
|
package/README.md
CHANGED
|
@@ -15,10 +15,12 @@
|
|
|
15
15
|
## Overview
|
|
16
16
|
|
|
17
17
|
`wix-openclaw` is an OpenClaw plugin that lets your agent operate a Wix site
|
|
18
|
-
through the official Wix REST API. It registers
|
|
19
|
-
Wix products (Blog, CMS Data, Forms, Bookings, Contacts, Events, Reviews,
|
|
20
|
-
Multilingual, Sites, Site Media
|
|
21
|
-
turns loose textual briefs into structured markdown artefacts.
|
|
18
|
+
through the official Wix REST API. It registers **50 tools by default** across a
|
|
19
|
+
dozen Wix products (Blog, CMS Data, Forms, Bookings, Contacts, Events, Reviews,
|
|
20
|
+
FAQ, Multilingual, Sites, Site Media), plus a `wix_design_brief` helper that
|
|
21
|
+
turns loose textual briefs into structured markdown artefacts. Two families are
|
|
22
|
+
opt-in and add to that: SEO (`enableSeoTools`, 19 tools) and accessibility
|
|
23
|
+
(`enableAccessibilityTools`, 6 tools) — **75 with both**.
|
|
22
24
|
|
|
23
25
|
Every tool funnels through a single authenticated HTTP client that:
|
|
24
26
|
|
|
@@ -176,8 +178,10 @@ Tick these only if the corresponding Wix product is actually in use on
|
|
|
176
178
|
the target site:
|
|
177
179
|
|
|
178
180
|
- [ ] **Manage SEO** (`SCOPE.PROMOTE.MANAGE-SEO`) — **only if you set
|
|
179
|
-
`enableSeoTools: true
|
|
180
|
-
|
|
181
|
+
`enableSeoTools: true`**, which registers **nineteen** tools of which
|
|
182
|
+
**eleven write irreversibly** (four on redirects, seven on tags and
|
|
183
|
+
patterns; a pattern write re-renders every page of its type). In the default
|
|
184
|
+
configuration the SEO tools are not registered at all, so granting this scope would hand the key the power to
|
|
181
185
|
delete redirects for tools that cannot run. Wix exposes a **single** SEO
|
|
182
186
|
scope, not a read/write pair: ticking it grants redirect creation and deletion
|
|
183
187
|
along with the read-only audit, so there is no such thing as an audit-only SEO
|
|
@@ -185,8 +189,20 @@ the target site:
|
|
|
185
189
|
*Social Posts* and *Import orders*; its label is currently untranslated and
|
|
186
190
|
renders literally as `site.scope.SCOPE.PROMOTE.MANAGE-SEO.name`. Since Wix
|
|
187
191
|
cannot narrow it, the read/write boundary is enforced by this plugin instead —
|
|
188
|
-
the
|
|
189
|
-
|
|
192
|
+
each of the eleven writing tools refuses until what it would destroy, be it a
|
|
193
|
+
redirect, a tag or a template, has been named and acknowledged.
|
|
194
|
+
|
|
195
|
+
- [ ] **Manage Accessibility Scans** — **only if you set
|
|
196
|
+
`enableAccessibilityTools: true`**, which registers six tools. None of them
|
|
197
|
+
writes to the site: Wix runs the scan, the plugin reads the result. **The
|
|
198
|
+
scope identifier for this permission is not published in the API reference
|
|
199
|
+
and is NOT recorded here** — the last time this README guessed a Wix
|
|
200
|
+
permission name it invented one that does not exist, so this line stays empty
|
|
201
|
+
until the exact label is read off the Wix permissions page. Note that reading
|
|
202
|
+
page collections or past results does **not** prove the key may start a scan:
|
|
203
|
+
Wix states that starting one needs this permission specifically, and answers
|
|
204
|
+
`403` / `PERMISSION_DENIED` otherwise — which the tools surface as a
|
|
205
|
+
permission problem, never as an empty site.
|
|
190
206
|
|
|
191
207
|
- [ ] **Pricing Plans** — if you sell subscription packages
|
|
192
208
|
- [ ] **Wix Stores** + **Wix eCommerce** — if you sell physical/digital
|
|
@@ -238,7 +254,8 @@ columns and remove the matching tools from your agent's allow-list.
|
|
|
238
254
|
| `wix_reviews_*` | Wix Reviews | Reviews moderation |
|
|
239
255
|
| `wix_faq_*` | Manage FAQ | FAQ tooling |
|
|
240
256
|
| `wix_multilingual_*` | Multilingual Translation Schema Read | Translation reads |
|
|
241
|
-
| `wix_seo_*` (all
|
|
257
|
+
| `wix_seo_*` (all nineteen) | Manage SEO (`SCOPE.PROMOTE.MANAGE-SEO`) | SEO audit **and** redirect changes — Wix has no read-only SEO scope, so this one permission covers both |
|
|
258
|
+
| `wix_a11y_*` (all six) | Manage Accessibility Scans (identifier not published — read it off the Wix permissions page) | Starting a scan. Reading collections or stored results does not imply it |
|
|
242
259
|
| `wix_design_brief` | _(none — no API call)_ | Always |
|
|
243
260
|
|
|
244
261
|
### Wix app installation requirements
|
|
@@ -487,19 +504,22 @@ neither answer has been tested.
|
|
|
487
504
|
### SEO
|
|
488
505
|
|
|
489
506
|
> **Developer Preview, and OFF by default.** Every Wix endpoint behind these
|
|
490
|
-
>
|
|
507
|
+
> nineteen tools is listed in Wix's
|
|
491
508
|
> [Developer Preview](https://dev.wix.com/docs/api-reference/articles/work-with-wix-apis/platform/about-developer-preview)
|
|
492
|
-
> — Item SEO Tags, Site SEO Tags and all six Redirects methods.
|
|
509
|
+
> — Item SEO Tags, Site SEO Tags, SEO Patterns and all six Redirects methods.
|
|
510
|
+
> Wix may change
|
|
493
511
|
> them at any time, and states plainly that you **shouldn't use them on live
|
|
494
512
|
> sites**: they are for testing and feedback. An API stays in preview for at
|
|
495
513
|
> most six months.
|
|
496
514
|
>
|
|
497
515
|
> Nothing here registers unless you set `enableSeoTools: true` in the plugin
|
|
498
|
-
> config.
|
|
499
|
-
> succeed
|
|
516
|
+
> config. Eleven of the tools write irreversibly to the live site the moment
|
|
517
|
+
> they succeed — and a pattern write re-renders every page of its type — so
|
|
518
|
+
> opting in is the operator saying they accept both risks.
|
|
500
519
|
> _Preview status verified against the Wix reference on 2026-08-28._
|
|
501
520
|
|
|
502
|
-
Auditing a site's SEO, and managing its URL redirects
|
|
521
|
+
Auditing a site's SEO, correcting its tags, and managing its URL redirects and
|
|
522
|
+
tag patterns.
|
|
503
523
|
|
|
504
524
|
| Tool | What it does | Approval | Validated |
|
|
505
525
|
|---|---|---|---|
|
|
@@ -512,6 +532,16 @@ Auditing a site's SEO, and managing its URL redirects.
|
|
|
512
532
|
| `wix_seo_delete_redirect` | Delete one redirect (re-reads it and refuses until its token is acknowledged) | **required** | schema |
|
|
513
533
|
| `wix_seo_bulk_create_redirects` | Create 1–100 redirects | **required** | schema |
|
|
514
534
|
| `wix_seo_bulk_delete_redirects` | Delete 1–500 redirects | **required** | schema |
|
|
535
|
+
| `wix_seo_set_item_tags` | Set one item's tags — REPLACES its own set in full; refuses until the tags it would drop are acknowledged | **required** | schema |
|
|
536
|
+
| `wix_seo_bulk_set_item_tags` | Set tags for many items of one type (100 max, 20 for `BLOG_POST`); per-entry results | **required** | schema |
|
|
537
|
+
| `wix_seo_reset_item_tags` | Give an item back the tags it inherits, discarding its own (all or nothing) | **required** | schema |
|
|
538
|
+
| `wix_seo_set_site_tags` | Set the site-wide tags — `meta` only; Wix rejects `title`/`script`/`link` here | **required** | schema |
|
|
539
|
+
| `wix_seo_list_patterns` | The site's tag templates, per page type | — | schema |
|
|
540
|
+
| `wix_seo_get_pattern` | One page type's pattern; read `source` to know whose it is — an owned pattern may hold zero templates, so empty ≠ absent | — | schema |
|
|
541
|
+
| `wix_seo_list_pattern_variables` | The variables a page type's pattern may reference | — | schema |
|
|
542
|
+
| `wix_seo_set_pattern` | Change an existing pattern — re-renders EVERY page of the type | **required** | schema |
|
|
543
|
+
| `wix_seo_create_pattern` | Give a page type its first pattern (same path as the set, `POST` not `PATCH`) | **required** | schema |
|
|
544
|
+
| `wix_seo_reset_pattern` | Return a page type to the Wix default pattern | **required** | schema |
|
|
515
545
|
|
|
516
546
|
**Three things to know before using these.**
|
|
517
547
|
|
|
@@ -550,6 +580,65 @@ delete it, then create it carrying **every** field over — an omitted field is
|
|
|
550
580
|
filled with its default, not its previous value. To find one, list them all and
|
|
551
581
|
filter client-side.
|
|
552
582
|
|
|
583
|
+
### Accessibility
|
|
584
|
+
|
|
585
|
+
> **Developer Preview, and OFF by default — separately from SEO.** The Wix
|
|
586
|
+
> Accessibility Scans endpoints are in Developer Preview and may change without
|
|
587
|
+
> notice. Nothing here writes to the site, so there is no approval to give and
|
|
588
|
+
> nothing to undo; the switch exists because starting a scan needs its own Wix
|
|
589
|
+
> permission, which the SEO scope does not grant. Set
|
|
590
|
+
> `enableAccessibilityTools: true` to opt in.
|
|
591
|
+
> _Contract read from the public Introduction, Sample Flows and agent Skill
|
|
592
|
+
> pages, and from the published SDK package
|
|
593
|
+
> `@wix/auto_sdk_accessibility_accessibility-scans`, whose own host mapping
|
|
594
|
+
> gives the REST prefix `/accessibility/v1/accessibility-scans` verbatim. The
|
|
595
|
+
> per-method reference pages are listed in the Wix menu but return 404, so no
|
|
596
|
+
> field name here was taken from a rendered page — verified 2026-08-29._
|
|
597
|
+
|
|
598
|
+
Wix runs the scan; these tools start it and read what it found.
|
|
599
|
+
|
|
600
|
+
| Tool | What it does | Approval | Validated |
|
|
601
|
+
|---|---|---|---|
|
|
602
|
+
| `wix_a11y_list_page_collections` | The page collections this site supports right now — pass a `collectionId` back unchanged | — | schema |
|
|
603
|
+
| `wix_a11y_run_scan` | Start a scan of one target: the site, one page, or one collection. Returns a scan id immediately | — | schema |
|
|
604
|
+
| `wix_a11y_get_scan` | Poll target: lifecycle, progress, aggregate totals. No pages, no findings | — | schema |
|
|
605
|
+
| `wix_a11y_get_latest_scan` | The most recent stored scan for a target, without starting a new one | — | schema |
|
|
606
|
+
| `wix_a11y_list_page_summaries` | Every discovered page, including clear ones and ones that failed to scan | — | schema |
|
|
607
|
+
| `wix_a11y_list_findings` | The actionable findings, filterable by page, rule, severity or category | — | schema |
|
|
608
|
+
|
|
609
|
+
**What makes a page clear, and why it takes three conditions.**
|
|
610
|
+
|
|
611
|
+
Wix states it plainly: a page is clear only when it has no findings, **its page
|
|
612
|
+
status is completed**, and **its coverage confirms the relevant checks ran**. A
|
|
613
|
+
page that failed to scan also reports zero findings — because nothing was read,
|
|
614
|
+
not because nothing is wrong. So every page summary carries `clear`, valued
|
|
615
|
+
`true`, `false` or `"unknown"`, rather than a bare count — with `clearFor`
|
|
616
|
+
naming the checks a `true` is true *for* — a scan reports `resultIsWhole`, and
|
|
617
|
+
`PARTIALLY_COMPLETED` never collapses into success. The
|
|
618
|
+
failure mode this family has is not data loss, it is an agent reporting a clean
|
|
619
|
+
site from an incomplete scan.
|
|
620
|
+
|
|
621
|
+
**Scans are asynchronous, and these tools do not wait.** `wix_a11y_run_scan`
|
|
622
|
+
returns a scan id; poll `wix_a11y_get_scan` after `suggestedPollIntervalSeconds`
|
|
623
|
+
(every 5 seconds when absent) until the status is terminal. A tool that blocked
|
|
624
|
+
for the length of a site scan would be the wrong shape for an agent turn.
|
|
625
|
+
|
|
626
|
+
**`attempt` is what tells a retry apart from a new scan.** Wix takes a
|
|
627
|
+
caller-generated idempotency key so a lost response cannot create duplicate
|
|
628
|
+
work, and requires a *new* key for a genuinely new scan. The plugin derives that
|
|
629
|
+
key from the site, the target and the `attempt` label you pass: reuse the label
|
|
630
|
+
to retry, change it to scan again. A random key per call would satisfy the
|
|
631
|
+
schema and make the whole guarantee inert.
|
|
632
|
+
|
|
633
|
+
**Limits worth knowing.** Runs are capped at 5 per minute per site; a multi-page
|
|
634
|
+
scan covers at most 300 pages and answers `SCAN_SIZE_LIMIT_EXCEEDED` beyond that
|
|
635
|
+
— after which the site must never be described as fully scanned. Stored results
|
|
636
|
+
are kept about six months, and `resultsExpirationDate` says exactly when. A
|
|
637
|
+
published site is scanned from its published version, an unpublished one from
|
|
638
|
+
its latest saved version — the opposite way round from the SEO tag reads above.
|
|
639
|
+
|
|
640
|
+
---
|
|
641
|
+
|
|
553
642
|
### Design
|
|
554
643
|
|
|
555
644
|
| Tool | What it does | Approval | Validated |
|
package/dist/config.js
CHANGED
|
@@ -34,6 +34,15 @@ export const DEFAULT_APPROVAL_REQUIRED = [
|
|
|
34
34
|
"wix_seo_delete_redirect",
|
|
35
35
|
"wix_seo_bulk_create_redirects",
|
|
36
36
|
"wix_seo_bulk_delete_redirects",
|
|
37
|
+
// Tranche 2 — writing tags. Each REPLACES what it writes: the previous
|
|
38
|
+
// value is gone, and a pattern write re-renders every page of its type.
|
|
39
|
+
"wix_seo_set_item_tags",
|
|
40
|
+
"wix_seo_bulk_set_item_tags",
|
|
41
|
+
"wix_seo_reset_item_tags",
|
|
42
|
+
"wix_seo_set_site_tags",
|
|
43
|
+
"wix_seo_set_pattern",
|
|
44
|
+
"wix_seo_create_pattern",
|
|
45
|
+
"wix_seo_reset_pattern",
|
|
37
46
|
];
|
|
38
47
|
const VALID_LOG_LEVELS = ["debug", "info", "warn", "error"];
|
|
39
48
|
/**
|
|
@@ -60,10 +69,16 @@ export function resolveConfig(cfg = {}) {
|
|
|
60
69
|
enabled: cfg.enabled !== false,
|
|
61
70
|
// OPT-IN, unlike every other tool group. The Wix SEO endpoints are in
|
|
62
71
|
// Developer Preview: Wix may change them at any time and says they
|
|
63
|
-
// "shouldn't be used on live sites".
|
|
72
|
+
// "shouldn't be used on live sites". Eleven of these tools also write
|
|
64
73
|
// irreversibly to a live site the moment they succeed. Defaulting them on
|
|
65
74
|
// would enable that on every existing install without anyone deciding to.
|
|
66
75
|
enableSeoTools: cfg.enableSeoTools === true,
|
|
76
|
+
// A SEPARATE SWITCH, not a sub-case of the SEO one. These tools destroy
|
|
77
|
+
// nothing, but starting a scan needs its own Wix permission that the SEO
|
|
78
|
+
// scope does not grant — so an install that turned SEO on has not thereby
|
|
79
|
+
// decided anything about this, and folding the two together would enable a
|
|
80
|
+
// family of calls that would only fail with 403.
|
|
81
|
+
enableAccessibilityTools: cfg.enableAccessibilityTools === true,
|
|
67
82
|
apiKey,
|
|
68
83
|
accountId,
|
|
69
84
|
allowedSiteIds,
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,EAAE;AACF,2EAA2E;AAC3E,6DAA6D;AAQ7D;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAI,KAAQ;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE;QACvD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC,CAAiB,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,wBAAwB;IACxB,oBAAoB;IACpB,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,yBAAyB;IACzB,qBAAqB;IACrB,sBAAsB;IACtB,yBAAyB;IACzB,sEAAsE;IACtE,6EAA6E;IAC7E,2EAA2E;IAC3E,6EAA6E;IAC7E,6DAA6D;IAC7D,yBAAyB;IACzB,yBAAyB;IACzB,+BAA+B;IAC/B,+BAA+B;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,EAAE;AACF,2EAA2E;AAC3E,6DAA6D;AAQ7D;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAI,KAAQ;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,IAAY,EAAE,EAAE;QACvD,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjC,CAAC,CAAiB,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,wBAAwB;IACxB,oBAAoB;IACpB,uBAAuB;IACvB,sBAAsB;IACtB,qBAAqB;IACrB,yBAAyB;IACzB,qBAAqB;IACrB,sBAAsB;IACtB,yBAAyB;IACzB,sEAAsE;IACtE,6EAA6E;IAC7E,2EAA2E;IAC3E,6EAA6E;IAC7E,6DAA6D;IAC7D,yBAAyB;IACzB,yBAAyB;IACzB,+BAA+B;IAC/B,+BAA+B;IAC/B,uEAAuE;IACvE,wEAAwE;IACxE,uBAAuB;IACvB,4BAA4B;IAC5B,yBAAyB;IACzB,uBAAuB;IACvB,qBAAqB;IACrB,wBAAwB;IACxB,uBAAuB;CACxB,CAAC;AAEF,MAAM,gBAAgB,GAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3E;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAuB,EAAE;IAEzB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IAClD,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9E,MAAM,eAAe,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,aAAa,GACjB,eAAe,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,IAAI,yBAAyB,CAAC;IAE3E,MAAM,QAAQ,GAAgB,gBAAgB,CAAC,QAAQ,CACrD,GAAG,CAAC,QAAuB,CAC5B;QACC,CAAC,CAAE,GAAG,CAAC,QAAwB;QAC/B,CAAC,CAAC,MAAM,CAAC;IAEX,OAAO;QACL,OAAO,EAAE,GAAG,CAAC,OAAO,KAAK,KAAK;QAC9B,sEAAsE;QACtE,mEAAmE;QACnE,sEAAsE;QACtE,0EAA0E;QAC1E,0EAA0E;QAC1E,cAAc,EAAE,GAAG,CAAC,cAAc,KAAK,IAAI;QAC3C,wEAAwE;QACxE,yEAAyE;QACzE,0EAA0E;QAC1E,2EAA2E;QAC3E,iDAAiD;QACjD,wBAAwB,EAAE,GAAG,CAAC,wBAAwB,KAAK,IAAI;QAC/D,MAAM;QACN,SAAS;QACT,cAAc;QACd,aAAa;QACb,gBAAgB,EAAE,IAAI,GAAG,CAAC,gBAAgB,CAAC;QAC3C,QAAQ;KACT,CAAC;AACJ,CAAC"}
|