@wix/agent-skills 1.16.0 → 1.16.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/skills/wix-app/SKILL.md +72 -8
- package/skills/wix-app/references/CODE_QUALITY.md +0 -1
- package/skills/wix-app/references/DASHBOARD_MODAL.md +21 -14
- package/skills/wix-app/references/DASHBOARD_PAGE.md +30 -184
- package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +19 -3
- package/skills/wix-app/references/WIX_PATTERNS_DOCS.md +172 -0
- package/skills/wix-app/references/dashboard-page/WDS_LAYOUT.md +187 -0
- package/skills/wix-app/references/editor-react-component/A11Y-REVIEW.md +12 -7
- package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +31 -2
- package/skills/wix-app/references/editor-react-component/COMPONENT-API.md +6 -1
- package/skills/wix-app/references/editor-react-component/COMPONENT-CONFIGURATION.md +60 -0
- package/skills/wix-app/references/editor-react-component/DIRECTIONALITY.md +6 -6
- package/skills/wix-app/references/editor-react-component/FUNCTION-HANDLERS.md +167 -0
- package/skills/wix-app/references/editor-react-component/REACT-GUIDELINES.md +2 -2
- package/skills/wix-app/references/editor-react-component/SITE-CONTEXT-HOOKS.md +187 -0
- package/skills/wix-app/scripts/scan-a11y-code.cjs +777 -0
- package/skills/wix-app/scripts/scan-a11y-eslint.cjs +201 -0
- package/skills/wix-base44-connector/SKILL.md +185 -0
- package/skills/wix-base44-connector/scripts/utils.js +212 -0
- package/skills/wix-design-system/SKILL.md +19 -15
- package/skills/wix-docs/SKILL.md +75 -1
- package/skills/wix-headless/references/CAPABILITIES.md +16 -3
- package/skills/wix-headless/references/SDK_HANDOFF.md +1 -1
- package/skills/wix-headless/references/SEED.md +1 -1
- package/skills/wix-headless/references/inline-recipes/how-to-code-forms.md +560 -102
- package/skills/wix-headless/references/inline-recipes/setup-forms.md +210 -143
- package/skills/wix-manage/SKILL.md +20 -17
- package/skills/wix-manage/references/accessibility/scan-site-accessibility.md +98 -0
- package/skills/wix-manage/references/analytics/analytics-dashboard-navigation.md +1 -2
- package/skills/wix-manage/references/domains/domain-search-purchase-and-connect.md +2603 -0
- package/skills/wix-manage/references/events/create-wix-event.md +112 -90
- package/skills/wix-manage/references/events/manage-wix-events.md +33 -94
- package/skills/wix-manage/references/sites/create-headless-site.md +1 -0
- package/skills/wix-manage/references/sites/manage-oauth-apps.md +154 -0
- package/skills/wix-manage/references/sites/read-site-context.md +125 -0
- package/skills/wix-manage/references/sites/site-import.md +67 -15
- package/skills/wix-manage/references/stores/create-product-catalog-v3.md +273 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +1 -1
- package/skills/wix-vibe-headless/SKILL.md +2 -1
- package/skills/wix-vibe-headless/install/deploy.cjs +63 -3
- package/skills/wix-vibe-headless/platforms/base44-ecom-light-seed.md +104 -0
- package/skills/wix-vibe-headless/platforms/base44-ecom-light.md +74 -0
- package/skills/wix-vibe-headless/platforms/base44.md +15 -40
- package/skills/wix-vibe-headless/references/blog/INSTRUCTIONS.md +7 -11
- package/skills/wix-vibe-headless/references/blog/seed/SEED.md +1 -1
- package/skills/wix-vibe-headless/references/bookings/INSTRUCTIONS.md +7 -11
- package/skills/wix-vibe-headless/references/bookings/seed/SEED.md +1 -1
- package/skills/wix-vibe-headless/references/cms/INSTRUCTIONS.md +1 -2
- package/skills/wix-vibe-headless/references/events/INSTRUCTIONS.md +7 -12
- package/skills/wix-vibe-headless/references/events/seed/SEED.md +1 -1
- package/skills/wix-vibe-headless/references/members/INSTRUCTIONS.md +7 -11
- package/skills/wix-vibe-headless/references/portfolio/INSTRUCTIONS.md +7 -11
- package/skills/wix-vibe-headless/references/portfolio/seed/SEED.md +1 -1
- package/skills/wix-vibe-headless/references/pricing-plans/INSTRUCTIONS.md +7 -11
- package/skills/wix-vibe-headless/references/pricing-plans/seed/SEED.md +1 -1
- package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +7 -11
- package/skills/wix-vibe-headless/references/restaurants/seed/SEED.md +1 -1
- package/skills/wix-vibe-headless/references/shared/app/components/WixManageBanner.jsx +1 -1
- package/skills/wix-vibe-headless/references/shared/app/rest/wix-config.js +5 -3
- package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +75 -13
- package/skills/wix-vibe-headless/references/storefront/app/components/ProductCard.jsx +29 -86
- package/skills/wix-vibe-headless/references/storefront/app/components/ProductGrid.jsx +3 -8
- package/skills/wix-vibe-headless/references/storefront/app/components/VariantPicker.jsx +78 -105
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductCard.js +92 -0
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useVariantOptions.js +76 -0
- package/skills/wix-vibe-headless/references/storefront/seed/SEED.md +1 -1
- package/skills/wix-vibe-headless/references/storefront/seed/seed-store.js +44 -5
- package/skills/wix-app/references/AUTO_PATTERNS_DASHBOARD.md +0 -326
- package/skills/wix-app/references/auto-patterns-dashboard/action-cell.md +0 -115
- package/skills/wix-app/references/auto-patterns-dashboard/app-config-structure.md +0 -264
- package/skills/wix-app/references/auto-patterns-dashboard/app-context.md +0 -37
- package/skills/wix-app/references/auto-patterns-dashboard/bulk-actions.md +0 -86
- package/skills/wix-app/references/auto-patterns-dashboard/collection-page-actions.md +0 -119
- package/skills/wix-app/references/auto-patterns-dashboard/collection-page.md +0 -103
- package/skills/wix-app/references/auto-patterns-dashboard/custom-actions-override.md +0 -76
- package/skills/wix-app/references/auto-patterns-dashboard/custom-columns-override.md +0 -82
- package/skills/wix-app/references/auto-patterns-dashboard/custom-components-override.md +0 -89
- package/skills/wix-app/references/auto-patterns-dashboard/custom-header-override.md +0 -124
- package/skills/wix-app/references/auto-patterns-dashboard/custom-sections-override.md +0 -91
- package/skills/wix-app/references/auto-patterns-dashboard/custom-slots-override.md +0 -71
- package/skills/wix-app/references/auto-patterns-dashboard/entity-page-actions.md +0 -70
- package/skills/wix-app/references/auto-patterns-dashboard/entity-page-view-actions.md +0 -73
- package/skills/wix-app/references/auto-patterns-dashboard/entity-page.md +0 -98
- package/skills/wix-app/references/auto-patterns-dashboard/example-patterns.json +0 -278
- package/skills/wix-app/references/auto-patterns-dashboard/pages-configuration.md +0 -94
- package/skills/wix-app/references/auto-patterns-dashboard/resolved-action.md +0 -43
- package/skills/wix-app/references/auto-patterns-dashboard/sdk-utilities.md +0 -66
- package/skills/wix-app/references/auto-patterns-dashboard/views.md +0 -76
- package/skills/wix-app/scripts/generate-auto-patterns.js +0 -510
- package/skills/wix-manage/references/domains/domain-search-and-purchase.md +0 -437
- package/skills/wix-manage/references/stores/create-product-from-image.md +0 -1031
- package/skills/wix-manage/references/stores/create-product-with-options-catalog-v3.md +0 -623
- package/skills/wix-manage/references/stores/setup-online-store-catalog-v3.md +0 -106
package/skills/wix-docs/SKILL.md
CHANGED
|
@@ -7,7 +7,8 @@ description: "Look up the Wix API/SDK documentation to confirm an exact endpoint
|
|
|
7
7
|
|
|
8
8
|
Get the **exact** truth about a Wix API — endpoint, HTTP method, request/response body, a field, an
|
|
9
9
|
enum, or an error. **Never invent a Wix endpoint, path, body, or enum from memory** — confirm it
|
|
10
|
-
here first.
|
|
10
|
+
here first. That includes the example endpoints in this skill: they illustrate the mechanics and
|
|
11
|
+
go stale like any snapshot — discover the real contract before you rely on one.
|
|
11
12
|
|
|
12
13
|
A lookup is a short flow: **find the right page, then read it.** Do it with `curl` (default, below)
|
|
13
14
|
or the Wix MCP doc tools if your agent has them (Lane 2).
|
|
@@ -212,6 +213,79 @@ when present, fall back to Lane 1 when not. Optional — skip this lane if the t
|
|
|
212
213
|
Append `.md` only when `curl`-ing a page directly. The MCP tools and the search endpoint take the
|
|
213
214
|
plain docs URL **without** `.md` — never feed a `.md` URL to an MCP tool.
|
|
214
215
|
|
|
216
|
+
## From docs to calls
|
|
217
|
+
|
|
218
|
+
The contract you just read runs under one of two identities — and which one a call wants is part
|
|
219
|
+
of what you read:
|
|
220
|
+
|
|
221
|
+
| identity | token | for |
|
|
222
|
+
|---|---|---|
|
|
223
|
+
| **admin** | an admin token (API key, connector, or OAuth-app admin grant) | managing the site — ad hoc calls, or the same fetch inside an app's backend function |
|
|
224
|
+
| **visitor** | minted from the site's OAuth app, in frontend code | everything the site's end user does — storefront reads, cart, checkout |
|
|
225
|
+
|
|
226
|
+
**Admin** — any management or read call, straight from its docs contract:
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
curl -sS -X POST 'https://www.wixapis.com/contacts/v5/contacts/query' \
|
|
230
|
+
-H "Authorization: Bearer $ADMIN_TOKEN" -H 'Content-Type: application/json' \
|
|
231
|
+
--data-raw '{"query": {"cursorPaging": {"limit": 10}}}'
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
In a Wix CLI project, the CLI mints `$ADMIN_TOKEN` — at either scope:
|
|
235
|
+
|
|
236
|
+
```bash
|
|
237
|
+
TOKEN=$(npx @wix/cli@latest token --site "$SITE_ID") # site-scoped: this one site's APIs
|
|
238
|
+
TOKEN=$(npx @wix/cli@latest token) # account-scoped: account-level APIs (list sites, …)
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
Mint once per run and cache it — within a run the CLI returns a byte-identical token, so re-minting
|
|
242
|
+
only spends startup time.
|
|
243
|
+
|
|
244
|
+
**Visitor — minted from the OAuth app's client id.** The client id is a public value, and it is
|
|
245
|
+
usually already on disk before it is in any API: in a managed headless project it is the `appId`
|
|
246
|
+
field of `wix.config.json` — **the OAuth app id and the client id are the same value** — so read it
|
|
247
|
+
from the project's config instead of querying the OAuth-apps API for it. The mint is one
|
|
248
|
+
unauthenticated call, so it belongs in the site's own frontend code:
|
|
249
|
+
|
|
250
|
+
```bash
|
|
251
|
+
curl -sS -X POST 'https://www.wixapis.com/oauth2/token' \
|
|
252
|
+
-H 'Content-Type: application/json' \
|
|
253
|
+
--data-raw '{"clientId": "<oauth app client id>", "grantType": "anonymous"}'
|
|
254
|
+
# → { "access_token": "OauthNG.JWS.…", … } — bearer for products, cart, checkout
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
The cart and checkout APIs act on the *caller's* identity, so they want the visitor token — the
|
|
258
|
+
admin token is for managing the site, the visitor token is for being on it.
|
|
259
|
+
|
|
260
|
+
The authentication docs (append `.md` to read):
|
|
261
|
+
|
|
262
|
+
- [`about-identities`](https://dev.wix.com/docs/api-reference/articles/authentication/about-identities) — the identity model
|
|
263
|
+
- [`rest-api-authentication`](https://dev.wix.com/docs/api-reference/articles/authentication/rest-api-authentication) — headers, token kinds
|
|
264
|
+
- [`retrieve-tokens`](https://dev.wix.com/docs/api-reference/business-management/headless/authentication/retrieve-tokens) — the `/oauth2/token` contract, all grant types
|
|
265
|
+
- [`about-authentication`](https://dev.wix.com/docs/go-headless/authentication/about-authentication) — visitor vs member sessions
|
|
266
|
+
- [`create-an-oauth-app-for-visitors-and-members`](https://dev.wix.com/docs/go-headless/getting-started/setup/authentication/create-an-oauth-app-for-visitors-and-members) — where the client id comes from
|
|
267
|
+
- [`set-up-a-headless-client`](https://dev.wix.com/docs/go-headless/authentication/setup/set-up-a-headless-client) — wiring the client
|
|
268
|
+
|
|
269
|
+
## Special APIs worth knowing
|
|
270
|
+
|
|
271
|
+
**Dynamic Site Context — "what IS this site?"** One admin call returns a markdown report of the
|
|
272
|
+
whole site — installed apps, status, URL, locale, CMS collections — the same output the Wix MCP's
|
|
273
|
+
site-context tool renders:
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
curl -sS -X POST 'https://www.wixapis.com/_api/dynamic-context/v1/dynamic-context/markdown' \
|
|
277
|
+
-H "Authorization: Bearer $ADMIN_TOKEN" -H 'Content-Type: application/json' \
|
|
278
|
+
--data-raw '{"siteId": "<metasite id>"}' | jq -r '.markdown'
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
A `200` with `"markdown": ""` means the token or `siteId` is wrong — the endpoint reports an empty
|
|
282
|
+
context instead of an auth error, so treat empty as "check auth", never as "empty site".
|
|
283
|
+
|
|
284
|
+
For site management, the **`wix-manage`** skill carries per-area recipes. It may already be
|
|
285
|
+
installed at
|
|
286
|
+
`.agents/skills/wix-manage/`; install it with `npx -y skills add wix/skills/skills/wix-manage`,
|
|
287
|
+
or read it straight off the registry: `https://www.wix.com/skills/wix-manage`.
|
|
288
|
+
|
|
215
289
|
## Before you write the code
|
|
216
290
|
|
|
217
291
|
Confirm on the page — not from memory — the endpoint, the HTTP verb, the request body shape,
|
|
@@ -37,10 +37,23 @@ The verticals the skill operates end-to-end today: **stores · blog · cms · fo
|
|
|
37
37
|
- **Required site features:** an index/list view of the collection; a detail page per item. (Visitor reads are public; visitor writes go through a form.) **(Opt-in, with members)** when the brief asks for per-user-private data ("my saved items", a personal list) or member-only content **and** members login is in the run, a collection can instead be **member-scoped** — each member sees/edits only their own rows, or any logged-in member reads shared member-only content. Added only on that intent, never by default; see the members cross-cutting entry and `setup-cms.md`.
|
|
38
38
|
- **Implementation checklist:** show each item's main fields with clear labels; link the list to each item's detail page; show a sensible empty state when there are no items yet.
|
|
39
39
|
|
|
40
|
-
### forms —
|
|
41
|
-
- **Intent:** contact / lead / signup / waitlist /
|
|
40
|
+
### forms — any visitor-fillable form
|
|
41
|
+
- **Intent:** contact / enquiry / lead / signup / waitlist / application / feedback / survey /
|
|
42
|
+
questionnaire / quote request / intake or registration form / "let people reach me" / generic custom
|
|
43
|
+
data capture — plus the **floor** when nothing dynamic is named. Lead capture is the most common
|
|
44
|
+
case, **not the boundary**: any form a visitor fills in and submits is this vertical, and whether
|
|
45
|
+
the submission also becomes a CRM contact is an optional per-field mapping.
|
|
46
|
+
- **Not forms — an RSVP is `events`:** confirming attendance to an event or occasion (a wedding,
|
|
47
|
+
party, or gathering) is the **events** vertical, which ships a built-in RSVP registration form —
|
|
48
|
+
route there even for a single occasion with no tickets.
|
|
49
|
+
- **Not forms — a per-service booking form is `bookings`:** the form attached to a bookable service
|
|
50
|
+
belongs to **bookings**. Use `forms` only when neither an event nor a bookable service is
|
|
51
|
+
involved.
|
|
42
52
|
- **Required site features:** a visible form; a confirmation after submitting; basic field validation.
|
|
43
|
-
|
|
53
|
+
A site may have **more than one** form, each with its own purpose and field set.
|
|
54
|
+
- **Implementation checklist:** render every field with a clear label; mark which fields are required;
|
|
55
|
+
a clear submit button; show a thank-you / success state after sending; show a friendly message if
|
|
56
|
+
the submit fails.
|
|
44
57
|
|
|
45
58
|
### events — events and registration
|
|
46
59
|
- **Intent:** event / ticket / RSVP / registration / attendees / "confirm attendance" / a wedding, party, or gathering people respond to. **Covers RSVP to a single occasion** (one wedding, one party) — not only multi-event listings, and not only ticketed events. An invitation with an RSVP is this vertical, not `forms`.
|
|
@@ -58,7 +58,7 @@ The host binds to **schema**, not to a frozen list of content IDs. **Content is
|
|
|
58
58
|
|
|
59
59
|
Carry only the **structural** carve-outs the coding step genuinely reads — the collection/form *names and keys* you must know to query and bind, which do **not** change when an owner adds a row:
|
|
60
60
|
- **cms:** `collectionId` + field keys per collection
|
|
61
|
-
- **forms:**
|
|
61
|
+
- **forms:** `formId` + each form's field `target` keys (the submission keys the frontend binds `name` = target). Field set, labels, options, and validation (`required`, format, length/pattern) are read live from the schema (`how-to-code-forms.md`).
|
|
62
62
|
|
|
63
63
|
Everything else the host resolves live from the queries in §3. (Static platform constants — Stores/Bookings app IDs, the Blog appDefId — and the public `clientId` are needed too, but they're identical for every site, not seed output; they're in §2/§3.)
|
|
64
64
|
|
|
@@ -34,7 +34,7 @@ Each entry states only the entities, where their count/content comes from, the p
|
|
|
34
34
|
- **stores** — *A product catalog.* Recipe: **`setup-online-store.md`**. `intent.stores.productCount` products whose names/prices fit `brand`. If `intent.stores.categoriesNamed` is non-empty, create exactly those categories and assign products into them; **if empty, create none** (skill policy — overrides any docs default). **Variant cardinality — keep it small by default:** unless `intent.stores` calls for specific options, give each product **at most one option with ≤3 choices** (so ≤3 variants/product); many products legitimately have **no** options (a single variant). Seeding cost scales with the variant Cartesian product and the field count per variant, so don't manufacture options the brief doesn't need — but **honor a larger/explicit option set when intent names one** (this default is a floor, not a cap). Text-only by default (images only when `imagery` is on — §1, §4). **Keep (seed-time only):** `categoryIds[]` to assign products into their categories; **nothing goes to the handoff** — the frontend lists products and categories **live** (`queryProducts` / `searchProducts` / `queryCategories`), so owner-added products/categories appear with no code change.
|
|
35
35
|
- **blog** — *Initial posts.* Recipe: **`setup-blog.md`**. `intent.blog.postCount` posts on `intent.blog.topics` (or brand-derived topics). Text-only (no covers). **Keep:** nothing for the handoff — posts are discovered **live** (`queryPosts`, `[...slug]` routes). Track created post ids only transiently (to confirm success / assign categories).
|
|
36
36
|
- **cms** — *Content collections.* Recipe: **`setup-cms.md`**. One collection per `intent.cms.collections` entry; `itemCount` items each, content from `brand`. Collections are **public-read** (visitor reads on the frontend) by default. **(Opt-in, members only)** if the brief calls for per-user-private or member-only data **and** members login is in the run, seed that collection **member-scoped** instead (per-user or member-only — see `setup-cms.md`); a per-user collection is seeded **empty** (members populate it), since admin-seeded rows are owned by the admin. **Keep (→ handoff):** `collectionIds{<name>}` + each collection's **field keys** — this is *structural* (the frontend must know the collection name and its fields to query and bind; it doesn't change when an owner adds a row). `itemIds{<name>:[]}` only transiently, for wiring multi-references during seeding.
|
|
37
|
-
- **forms** — *
|
|
37
|
+
- **forms** — *Visitor-fillable forms.* Recipe: **`setup-forms.md`**. One form per `intent.forms.forms` entry; fields from the entry, `purpose` names the form. **Keep (→ handoff):** `formIds[]` + each form's field **`target`** keys — *structural* (the frontend binds each input's `name` = target to submit; targets are **immutable**, so they don't go stale when an owner relabels a field).
|
|
38
38
|
- **events** — *A ticketed or RSVP occasion, or upcoming events.* Recipe: **`setup-events.md`**. Each event is **either `TICKETING`** (paid — it has ticket tiers) **or `RSVP`** (free — the registration form is built-in, so don't seed form fields) per intent. For an **RSVP occasion** (a wedding, party, gathering): one RSVP event with the occasion's real details (title, a **future** date/time, location). For a **ticketed** event: the event plus its ticket tiers (default a single `"General Admission"` tier if none named). For a **listing** site: `intent.events.eventCount` events with brand-appropriate titles and **future** start dates (a default location/timezone is fine). Text-only. **Keep:** nothing for the handoff — events and tiers are discovered **live** (`queryEvents`, `getEventBySlug`, `queryAvailableTickets`); track `eventIds`/`ticketDefinitionIds` only transiently.
|
|
39
39
|
- **bookings** — *Bookable services.* Recipe: **`setup-bookings.md`**. `intent.bookings.serviceCount` services (name + short description fitting `brand`, a simple duration and price); keep the schedule minimal. **Keep:** `serviceIds[]` as **seed-time state** (pricing-plans' coverage step keys on them, below); nothing for the handoff — services are discovered **live** (`queryServices`).
|
|
40
40
|
- **pricing-plans** — *Membership tiers.* Recipe: **`setup-pricing-plans.md`**. `intent.pricing-plans.planCount` recurring plans (name, price, a monthly billing cycle) fitting `brand`. **When bookings is also in this run and the intent is a membership that covers services** (a studio/gym/class pass), also **attach the covered bookings services to the plan** — seed the bookings services first, since coverage keys on their service ids (see the recipe). **Keep:** the bookings coverage only transiently, to wire it during seeding; nothing for the handoff — plans are discovered **live** (`queryPlans`) and plan→service coverage is read **live** at checkout, never from a frozen map (see `how-to-code-pricing-plans.md`).
|