@wix/agent-skills 1.31.0 → 1.31.1

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.
Files changed (47) hide show
  1. package/package.json +1 -1
  2. package/skills/wix-app/SKILL.md +7 -8
  3. package/skills/wix-app/references/DASHBOARD_PAGE.md +1 -1
  4. package/skills/wix-app/references/WIX_PATTERNS_DOCS.md +11 -50
  5. package/skills/wix-app/references/dashboard-page/DATA_SOURCES.md +14 -10
  6. package/skills/wix-app/references/dashboard-page/DRAFT_TEMPLATE.md +5 -8
  7. package/skills/wix-app/references/dashboard-page/TABLE_STATE.md +5 -4
  8. package/skills/wix-headless-kit/SKILL.md +15 -7
  9. package/skills/wix-headless-kit/guides/api-run.md +81 -26
  10. package/skills/wix-headless-kit/guides/existing-site.md +3 -2
  11. package/skills/wix-headless-kit/guides/reference-mode.md +9 -1
  12. package/skills/wix-headless-kit/install/AGENTS.md +7 -5
  13. package/skills/wix-headless-kit/install/attach.mjs +3 -3
  14. package/skills/wix-headless-kit/install/context.mjs +13 -3
  15. package/skills/wix-headless-kit/install/deploy.mjs +3 -3
  16. package/skills/wix-headless-kit/install/pins.json +1 -1
  17. package/skills/wix-headless-kit/install/setup.mjs +2 -2
  18. package/skills/wix-headless-kit/install/templates.mjs +2 -1
  19. package/skills/wix-headless-templates/blog/seed/SEED.md +1 -1
  20. package/skills/wix-headless-templates/blog/seed/seed-blog.mjs +2 -2
  21. package/skills/wix-headless-templates/bookings/seed/SEED.md +1 -1
  22. package/skills/wix-headless-templates/bookings/seed/seed-bookings.mjs +2 -1
  23. package/skills/wix-headless-templates/donations/seed/SEED.md +1 -1
  24. package/skills/wix-headless-templates/donations/seed/seed-donations.mjs +3 -2
  25. package/skills/wix-headless-templates/events/seed/SEED.md +1 -1
  26. package/skills/wix-headless-templates/events/seed/seed-events.mjs +3 -2
  27. package/skills/wix-headless-templates/portfolio/seed/SEED.md +4 -2
  28. package/skills/wix-headless-templates/portfolio/seed/seed-portfolio.mjs +6 -6
  29. package/skills/wix-headless-templates/rentals/seed/SEED.md +1 -1
  30. package/skills/wix-headless-templates/rentals/seed/seed-rentals.mjs +2 -1
  31. package/skills/wix-headless-templates/restaurants/seed/SEED.md +1 -1
  32. package/skills/wix-headless-templates/restaurants/seed/seed-restaurants.mjs +4 -3
  33. package/skills/wix-headless-templates/shared/seed/images.mjs +41 -5
  34. package/skills/wix-headless-templates/storefront/seed/SEED.md +17 -5
  35. package/skills/wix-headless-templates/storefront/seed/seed-store.mjs +21 -14
  36. package/skills/wix-manage/SKILL.md +25 -15
  37. package/skills/wix-manage/references/automations/activation-status.md +52 -0
  38. package/skills/wix-manage/references/automations/api-catalog.md +81 -0
  39. package/skills/wix-manage/references/automations/build-and-manage-automations.md +34 -0
  40. package/skills/wix-manage/references/bookings/create-and-update-booking-services.md +277 -363
  41. package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +3 -1
  42. package/skills/wix-manage/references/sites/send-feedback-to-wix.md +92 -0
  43. package/skills/wix-manage/references/sites/upload-static-site.md +258 -279
  44. package/skills/wix-manage/references/bookings/create-appointment-service.md +0 -243
  45. package/skills/wix-manage/references/bookings/create-booking-service-from-prompt.md +0 -31
  46. package/skills/wix-manage/references/bookings/create-class-service.md +0 -222
  47. package/skills/wix-manage/references/bookings/create-course-service.md +0 -251
@@ -12,13 +12,13 @@
12
12
  // Plan shape (see SEED.md):
13
13
  // { "products": [{ "name", "description", "price", "compareAtPrice"?, "quantity",
14
14
  // "options"?: [{ "name", "type"?: "text"|"color",
15
- // "choices": ["S","M"] | [{ "name", "colorCode"?, "imageUrl"? | "imagePath"? | "imagePrompt"?, "altText"? }] }],
15
+ // "choices": ["S","M"] | [{ "name", "colorCode"?, "imageMediaId"? | "imageUrl"? | "imagePath"? | "imagePrompt"?, "altText"? }] }],
16
16
  // "variantPrices"?: { "<choice name>": price },
17
17
  // "ribbon"?, "modifiers"?: [{ "name", "type"?: "choices"|"text", "mandatory"?,
18
18
  // "choices"?: ["Gift wrap"], "maxChars"?, "minChars"? }],
19
19
  // "infoSections"?: [{ "title", "description" }],
20
20
  // "preorder"?: { "message"?, "limit"? },
21
- // "imageUrl"? | "imagePath"? | "imagePrompt"?, "altText"?,
21
+ // "imageMediaId"? | "imageUrl"? | "imagePath"? | "imagePrompt"?, "altText"?,
22
22
  // "digitalFileUrl"? | "digitalFilePath"?, "digitalFileName"? }],
23
23
  // "categories"?: { "<category name>": ["<product name>", ...] },
24
24
  // "categoryDetails"?: { "<category name>": { "description"?, "imageUrl"? | "imagePath"? | "imagePrompt"? } } }
@@ -472,9 +472,11 @@ export async function addProductsToCategories(ctx, mapping) {
472
472
  }
473
473
  }
474
474
 
475
- // Bulk image attach in ONE call. items: [{ id, url, altText }] — no revision to pass: the
475
+ // Bulk image attach in ONE call. items: [{ id, url, mediaId?, altText }] — no revision to pass: the
476
476
  // current revision is read right before the update, so attach any number of times, any pass.
477
- // Wix re-hosts each url server-side; the media can take a little while to appear on read-back
477
+ // An item with a mediaId (a file already in this site's Media Manager) is attached by that id and
478
+ // reused as it is; a bare url is re-hosted by Wix server-side, a new file each time. The media can
479
+ // take a little while to appear on read-back
478
480
  // (propagation) — normal, not a failure.
479
481
  // The bulk update returns 200 on PARTIAL failure, like the bulk create: each item's outcome is
480
482
  // in results[].itemMetadata (success, error, originalIndex). Seen live (runs 85 and 86,
@@ -491,7 +493,8 @@ export async function addProductsToCategories(ctx, mapping) {
491
493
  // whose choices were linked (by this seed or by the owner in the dashboard) gets those links put
492
494
  // back right after.
493
495
  const sameFile = (a, b) => a && b && basename(a) === basename(b);
494
- const galleryHas = (items, url) => items.some((it) => sameFile(it.image?.filename, url) || sameFile(it.image?.url, url));
496
+ // A file attached by id keeps its own display name as the item's filename, so it is found by id.
497
+ const galleryHas = (items, url, mediaId) => items.some((it) => (mediaId && it.id === mediaId) || sameFile(it.image?.filename, url) || sameFile(it.image?.url, url));
495
498
 
496
499
  export async function attachProductImages(ctx, items) {
497
500
  if (!items?.length) return { attached: [], failures: [] };
@@ -508,9 +511,10 @@ export async function attachProductImages(ctx, items) {
508
511
  const p = byId.get(it.id);
509
512
  const current = p?.media?.itemsInfo?.items ?? [];
510
513
  const wanted = it.images ?? [{ url: it.url, altText: it.altText }];
511
- const fresh = wanted.filter(({ url }) => !galleryHas(current, url));
514
+ const fresh = wanted.filter(({ url, mediaId }) => !galleryHas(current, url, mediaId));
512
515
  if (!fresh.length) { ok.add(it.id); continue; } // every image is already there
513
- toSend.push({ it, p, items: [...current.map(({ id }) => ({ id })), ...fresh.map(({ url, altText }) => ({ url, altText }))] });
516
+ // A file already in the Media Manager goes in by its id: set by url, Stores imports a copy.
517
+ toSend.push({ it, p, items: [...current.map(({ id }) => ({ id })), ...fresh.map(({ url, mediaId, altText }) => (mediaId ? { id: mediaId, altText } : { url, altText }))] });
514
518
  }
515
519
  if (toSend.length) {
516
520
  const r = await req(ctx, "/stores/v3/bulk/products/update", {
@@ -558,7 +562,8 @@ function choiceLinksOf(p) {
558
562
 
559
563
  // Per-choice images (the dashboard's "image per colour"): a choice points at an item of the
560
564
  // product's OWN gallery, so the image is attached to the gallery first (pass 2) and linked here by
561
- // the gallery item's id — the id of the uploaded file is a different id and 400s. Links are a
565
+ // the gallery item's id — for a file imported by url that is a different id from the uploaded
566
+ // file's and the file's 400s; a file attached by its Media Manager id is the item of that id. Links are a
562
567
  // product update, which the API only accepts with the variants re-sent beside the options, so the
563
568
  // current variants (id, choices, price) ride along unchanged. Wix derives a variant's own media
564
569
  // from its choice at creation only; the storefront reads the choice's image, so a link made here
@@ -735,18 +740,19 @@ export async function setupStore(ctx, { products = [], categories = {}, category
735
740
  const choiceSpecs = products.map((pl, i) =>
736
741
  (pl.options ?? []).flatMap((o) =>
737
742
  (o.choices ?? [])
738
- .filter((c) => typeof c === "object" && c && (c.imageUrl || c.imagePath || c.imagePrompt))
743
+ .filter((c) => typeof c === "object" && c && (c.imageMediaId || c.imageUrl || c.imagePath || c.imagePrompt))
739
744
  .map((c) => ({
740
745
  optionName: o.name,
741
746
  choiceName: c.name,
742
747
  productName: pl.name,
743
748
  altText: c.altText ?? `${pl.name} — ${c.name}`,
744
- spec: { url: c.imageUrl, path: c.imagePath, prompt: c.imagePrompt, displayName: `${withNames[i].slug || "product"}-${String(c.name).toLowerCase().replace(/[^a-z0-9]+/g, "-")}.png` },
749
+ spec: { mediaId: c.imageMediaId, url: c.imageUrl, path: c.imagePath, prompt: c.imagePrompt, displayName: `${withNames[i].slug || "product"}-${String(c.name).toLowerCase().replace(/[^a-z0-9]+/g, "-")}.png` },
745
750
  })),
746
751
  ));
747
752
  const flatChoiceSpecs = choiceSpecs.flat();
748
753
  const resolved = await resolveItemImagesDetailed(ctx, [
749
754
  ...withNames.map((p, i) => ({
755
+ mediaId: products[i]?.imageMediaId,
750
756
  url: products[i]?.imageUrl,
751
757
  path: products[i]?.imagePath,
752
758
  prompt: products[i]?.imagePrompt,
@@ -766,8 +772,8 @@ export async function setupStore(ctx, { products = [], categories = {}, category
766
772
  .map((p, i) => {
767
773
  if (!p.id) return null;
768
774
  const images = [
769
- ...(files[i] ? [{ url: files[i].url, altText: products[i]?.altText ?? p.slug }] : []),
770
- ...choiceLinks[i].map((c) => ({ url: c.file.url, altText: c.altText })),
775
+ ...(files[i] ? [{ url: files[i].url, mediaId: files[i].existing ? files[i].id : undefined, altText: products[i]?.altText ?? p.slug }] : []),
776
+ ...choiceLinks[i].map((c) => ({ url: c.file.url, mediaId: c.file.existing ? c.file.id : undefined, altText: c.altText })),
771
777
  ];
772
778
  return images.length ? { id: p.id, images } : null;
773
779
  })
@@ -782,7 +788,7 @@ export async function setupStore(ctx, { products = [], categories = {}, category
782
788
  // it is reported here with the resolver's reason, or it ships text-only in silence.
783
789
  withNames.forEach((p, i) => {
784
790
  const src = products[i] ?? {};
785
- if ((src.imageUrl || src.imagePath || src.imagePrompt) && !files[i]) {
791
+ if ((src.imageMediaId || src.imageUrl || src.imagePath || src.imagePrompt) && !files[i]) {
786
792
  imageFailures.push({ name: p.name, error: resolved[i]?.error ?? "image did not resolve" });
787
793
  }
788
794
  });
@@ -807,7 +813,8 @@ export async function setupStore(ctx, { products = [], categories = {}, category
807
813
  const links = choiceLinks[i];
808
814
  if (!links.length || !p.id || !imagesAttached) continue;
809
815
  try {
810
- const r = await linkChoiceImages(ctx, p.id, links.map((c) => ({ optionName: c.optionName, choiceName: c.choiceName, url: c.file.url })));
816
+ // a file attached by its Media Manager id is the gallery item of that id; an imported one is found by name
817
+ const r = await linkChoiceImages(ctx, p.id, links.map((c) => ({ optionName: c.optionName, choiceName: c.choiceName, ...(c.file.existing ? { mediaId: c.file.id } : { url: c.file.url }) })));
811
818
  choiceImagesLinked += r.linked;
812
819
  for (const m of r.missing) choiceImageFailures.push({ name: p.name, choice: m, error: "image not in the product gallery" });
813
820
  } catch (e) {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: wix-manage
3
- description: "REST recipes to configure and manage a Wix site's business solutions — stores, bookings, payments, CMS, and more. Open the matching recipe for the exact endpoint, method, and payload before calling — never guess a Wix API, never write Wix dashboard URL from memory. Routes to: stores, bookings, get-paid, CMS, contacts, forms, media, app-installation, custom-apps, pricing-plans, restaurants, ricos rich-content, sites, blog, calendar, domains, events, site-properties, ecommerce, marketing, google-ads, google-business-profile, analytics, accessibility, seo, dashboard-navigation."
3
+ description: "REST recipes to configure and manage a Wix site's business solutions — stores, bookings, payments, CMS, and more. Open the matching recipe for the exact endpoint, method, and payload before calling — never guess a Wix API, never write Wix dashboard URL from memory. Routes to: automations, stores, bookings, get-paid, CMS, contacts, forms, media, app-installation, custom-apps, pricing-plans, restaurants, ricos rich-content, sites, blog, calendar, domains, events, site-properties, ecommerce, marketing, google-ads, google-business-profile, analytics, accessibility, seo, dashboard-navigation."
4
4
  compatibility: Requires Wix REST API access (API key or OAuth).
5
5
  ---
6
6
 
@@ -37,7 +37,7 @@ Lists all apps installed on a site using Apps Installer API. Useful for verifyin
37
37
  ## Custom Apps
38
38
 
39
39
  ### [Use App Skills and App Tools](references/custom-apps/use-app-skills-and-app-tools.md)
40
- "Discovers and runs what the apps installed on a Wix site add for AI agents: app skills, which are an app's instructions for a task (for example pricing a product for customers in another country, or checking a property listing before it is published), and app tools, which are actions and lookups an app exposes. Use when the user asks for something an installed app provides rather than a built-in Wix feature, asks what their apps can do, or names an app, skill or tool. Covers reading a chosen skill's instructions and running the app tools it allows, or running a single app tool directly."
40
+ "Discovers and runs what the apps installed on a Wix site add for AI agents: app skills, which are an app's instructions for a task (for example pricing a product for customers in another country, or checking a property listing before it is published), and app tools, which are actions and lookups an app exposes. Use every time a site has custom apps installed, before acting on the user's request: knowing which apps are installed doesn't tell what they can do, so only this skill's discovery calls show whether one of them handles the request. Also use when the user asks for something an installed app provides rather than a built-in Wix feature, asks what their apps can do, or names an app, skill or tool. Covers reading a chosen skill's instructions and running the app tools it allows, or running a single app tool directly."
41
41
 
42
42
  ---
43
43
 
@@ -96,19 +96,7 @@ Sets up booking policies, cancellation rules, and waitlist configuration using t
96
96
  "Creates staff members and configures custom working hours using Staff API + Calendar Events API. Critical two-step process: create staff → assign schedule → create working hours events."
97
97
 
98
98
  ### [Create and Update Booking Services](references/bookings/create-and-update-booking-services.md)
99
- Full CRUD operations for Wix Bookings services using Services API. Covers service types (APPOINTMENT, CLASS, COURSE), pricing configuration, location setup, and schedule management.
100
-
101
- ### [Create Booking Service from Prompt](references/bookings/create-booking-service-from-prompt.md)
102
- "Create a booking service from a user prompt — e.g. 'create a yoga class for $50', 'set up consultations for $75', 'add a personal training appointment', 'create a 6-week photography workshop', 'create a hidden free test course with 8 online sessions'. Determines the service type (APPOINTMENT, CLASS, or COURSE) and delegates to the type-specific recipe. For COURSE services with session dates/counts, follow the course recipe's separate Calendar bulkCreateEvents step; Services V2 alone does not create bookable course sessions."
103
-
104
- ### [Create Appointment Service](references/bookings/create-appointment-service.md)
105
- "Create an appointment booking service — e.g. 'set up consultations', 'create a 1-on-1 session', 'add a personal training appointment', 'create a meeting service for $25'. Handles staff assignment (required), session duration, pricing, and 1-on-1 capacity defaults via bulkCreateServices API."
106
-
107
- ### [Create Class Service](references/bookings/create-class-service.md)
108
- "Create a class booking service — e.g. 'create a yoga class for $50', 'set up a pilates class', 'add a group fitness session', 'create a weekly meditation class'. Handles group capacity, recurring session defaults, and pricing via bulkCreateServices API. Staff assignment is not used for classes."
109
-
110
- ### [Create Course Service](references/bookings/create-course-service.md)
111
- "Create a course booking service — e.g. 'create a 6-week photography workshop', 'set up a training program', 'add a bootcamp course for $300', 'create a hidden free test course with 8 sessions'. Handles group capacity, full-course pricing, bulkCreateServices, and separate course session events via bulkCreateEvents. Staff assignment is not used for courses."
99
+ "Creates and updates Wix Bookings services of every type — appointments, classes and courses — from a plain request such as 'a 60-minute consultation for $75', 'a yoga class for 12 people every Tuesday' or 'a 6-week photography course'. Covers choosing the service type, defaults for what the request leaves out, pricing (free, fixed, free-to-paid), staff, capacity, duration, categories, visibility, images, scheduling class and course sessions on the calendar, and changing existing services."
112
100
 
113
101
  ### [Check Bookings Availability (and Diagnose Issues)](references/bookings/diagnose-availability-issues.md)
114
102
  "Answers whether an appointment-based Wix Bookings service currently has bookable availability — the primary question — and diagnoses the cause only when there's no availability or the owner asks why. To diagnose, first rules out service-level blockers the availability endpoint can't see (service hidden, online booking off), then runs DiagnoseAvailability for ordered, machine-readable staff/setup reasons, with a manual fallback for booking-policy and capacity causes. Use when someone asks whether a service has availability, or why a service shows no times / customers can't book it."
@@ -419,6 +407,9 @@ List, count, and find the sites in a Wix account. Covers the namespace filter fo
419
407
  ### [Read Account or Site Context](references/sites/read-site-context.md)
420
408
  Probe a Wix site or account for full context in one call — installed apps by display name, locale, currency, timezone, and status. Account token + siteId targets one site; account token alone returns up to 10; site-scoped token alone returns the site it is scoped to.
421
409
 
410
+ ### [Send Feedback to Wix](references/sites/send-feedback-to-wix.md)
411
+ Relay the user's feedback about building with Wix — the APIs, docs, recipes, Wix MCP and tooling — to Wix, attributed to the authenticated user. Covers when to offer it, how to compose a message Wix can act on, and the call that sends it. Use when the user asks to report something to Wix, is frustrated with a Wix API or flow, or a recipe's flow fell short. Not a support channel, and not for the user's own site content.
412
+
422
413
  ### [Site Import](references/sites/site-import.md)
423
414
  Drive the Wix Site Import agent to migrate an existing store or site from another platform (Shopify, WooCommerce, Magento, or any URL) into Wix — as a brand-new site or into the user's existing one — or to import from CSV/TSV export files with no source site. Use this skill whenever the user wants to import, migrate, or clone a store/site into Wix, mentions moving off Shopify/WooCommerce/Magento, or gives a source store URL and asks to bring it into Wix. Covers starting the import, polling progress, answering the agent's mid-import questions, handling deploy/failure/auth-expiry states, and sending post-deploy follow-up changes.
424
415
 
@@ -458,3 +449,22 @@ Modifies existing products and variants using Catalog V3 Products API. Covers ad
458
449
 
459
450
  ### [Stores Dashboard Navigation](references/stores/stores-dashboard-navigation.md)
460
451
  "Builds direct links to Wix Stores and eCommerce dashboard pages on manage.wix.com — products list, edit a specific product, categories, inventory, orders list, a specific order, abandoned checkouts, gift cards, shipping and tax settings. Pairs each main Stores/eCommerce entity with its read API so you can fetch an entity and hand back a 'view it in your dashboard' link. Use when the user asks where something is in the Wix dashboard, wants a direct link to a dashboard page, or you need a dashboard URL to include with the result of an API operation."
452
+
453
+ <!-- automations-builder-sync:begin -->
454
+ ## Automations
455
+
456
+ ### [Build and Manage Wix Automations](references/automations/build-and-manage-automations.md)
457
+ Discover installed automation triggers and actions and inspect an automation’s current active status without changing site data.
458
+
459
+ <details>
460
+ <summary>Internal skills (loaded on demand by Build and Manage Wix Automations — do NOT use directly)</summary>
461
+
462
+ - [Automations API Catalog](references/automations/api-catalog.md)
463
+ Discover installed automation triggers and actions and inspect their schemas through site-scoped public catalog APIs.
464
+
465
+ - [Automations Activation Status](references/automations/activation-status.md)
466
+ Read an automation’s current ACTIVE or INACTIVE status and distinguish it from historical run outcomes.
467
+
468
+ </details>
469
+
470
+ <!-- automations-builder-sync:end -->
@@ -0,0 +1,52 @@
1
+ ---
2
+ name: "Automations Activation Status"
3
+ description: "Read an automation’s current ACTIVE or INACTIVE status and distinguish it from historical run outcomes."
4
+ ---
5
+
6
+ # Inspect activation status
7
+
8
+ An automation's current state is `configuration.status`: ACTIVE is eligible for new trigger
9
+ events; INACTIVE is not. Neither value proves that a historical run succeeded or that a
10
+ pending activation has stopped.
11
+
12
+ 1. Resolve the requested name with one Query Automations call filtered by that exact name
13
+ (below); don't page through other automations. If the ID is already supplied, go to Get.
14
+ If several match, open your answer by listing each match's full returned ID and asking
15
+ which one the user means; don't report a single status. If none match, say so and ask the
16
+ user to check the name or site; never guess an ID.
17
+ 2. Get the matching returned ID and read `configuration.status`.
18
+ 3. Answer briefly and completely in one reply. Start with the automation's exact name, its
19
+ returned ID and ACTIVE/INACTIVE from that response, then say what it means for new trigger
20
+ events. If the user asks whether the status says anything about past runs, answer it
21
+ directly in the next sentence: status does not show whether past runs succeeded; they are
22
+ visible in the automation's activity view in the site dashboard.
23
+ 4. If Get returns not found, do not state a status. Open with: the automation wasn't found on
24
+ this site, so its status can't be determined, and ask the user to confirm the site and the
25
+ automation ID. This question is required. Then give the possible causes below.
26
+
27
+ Use an authorized site-scoped client with Set Up Automations permission. REST calls use
28
+ `Authorization: <token>`. An API key also needs `wix-site-id: <metaSiteId>`; do not combine it
29
+ with `wix-account-id`. Never print credentials.
30
+
31
+ `POST https://www.wixapis.com/automations-service/v2/automations/query`
32
+
33
+ ```json
34
+ {"query":{"filter":{"name":"<automation name>"},"cursorPaging":{"limit":25}}}
35
+ ```
36
+
37
+ Read `automations[]` and `pagingMetadata.cursors.next`; continue pages if needed. Retain the
38
+ returned `id` and exact name. Then:
39
+
40
+ `GET https://www.wixapis.com/automations-service/v2/automations/<automationId>`
41
+
42
+ Read `automation.configuration.status` from the Get response. Never infer status from the
43
+ name or a previous mutation. Do not validate, change configuration, toggle status or test-run
44
+ an automation to answer this read-only request.
45
+
46
+ Not-found causes (step 4): unpublished builder drafts do not appear
47
+ through this API, but a 404 can also mean deletion or a changed ID after overriding a
48
+ preinstalled automation. When the user's history supports an unpublished builder draft as the
49
+ cause, ask the owner to publish or discard it rather than reproducing its edits.
50
+
51
+ Official contracts: [Query Automations](https://dev.wix.com/docs/api-reference/business-management/automations/automations/automations-v2/query-automations),
52
+ [Get Automation](https://dev.wix.com/docs/api-reference/business-management/automations/automations/automations-v2/get-automation).
@@ -0,0 +1,81 @@
1
+ ---
2
+ name: "Automations API Catalog"
3
+ description: "Discover installed automation triggers and actions and inspect their schemas through site-scoped public catalog APIs."
4
+ ---
5
+
6
+ # Discover installed automation capabilities
7
+
8
+ Check the site's installed trigger/action catalogs, then inspect the chosen components'
9
+ schemas. This recipe is read-only: do not create an automation, install an app, generate email
10
+ content, or run an action to establish availability.
11
+
12
+ ## Authentication
13
+
14
+ Use an authorized site-scoped client with Set Up Automations permission. REST calls use
15
+ `Authorization: <token>`. An API key also needs `wix-site-id: <metaSiteId>`; do not combine it
16
+ with `wix-account-id`. OAuth app tokens are bound to a site instance. Never print credentials.
17
+ A 401/403 is an access failure, not evidence that a catalog component is unavailable.
18
+
19
+ ## Resolve, select, inspect
20
+
21
+ 1. Use a known key only as a search hint. Resolve an exact candidate first; if it is absent,
22
+ browse small pages and compare names/semantics locally. Do not conclude that a remembered
23
+ key exists on this site without a successful Resolve response.
24
+ 2. For triggers, request `basicFieldsOnly: true` while browsing, then hydrate only the chosen
25
+ trigger with Get Trigger By App Id And Key. Compare its payload and filters to the intent.
26
+ 3. Actions already include schemas in Resolve. Retain the chosen returned identity and
27
+ required input fields; avoid repeating the whole catalog just to read display names.
28
+ 4. Summarize the available pair and required configuration, distinguishing what the trigger
29
+ supplies from values the user would need to choose. Do not mutate anything to prove it.
30
+
31
+ ### Trigger discovery
32
+
33
+ `POST https://www.wixapis.com/v1/triggers/resolve`
34
+
35
+ ```json
36
+ {"basicFieldsOnly":true,"query":{"filter":{"triggerKey":"contacts-new_contact_was_created"},"paging":{"limit":25,"offset":0}}}
37
+ ```
38
+
39
+ Read `results[]` and `paging`. A nonempty matching result establishes an installed trigger;
40
+ use its returned `appId` and `triggerKey` in:
41
+
42
+ `GET https://www.wixapis.com/v1/triggers/apps/<appId>/keys/<triggerKey>`
43
+
44
+ Read `trigger.payloadDataSchema`, `trigger.filters` and `trigger.automationConfigSchema`.
45
+ The contact-created key above is a discovery hint; names and availability may vary by site.
46
+
47
+ ### Action discovery
48
+
49
+ `POST https://www.wixapis.com/v1/actions/resolve`
50
+
51
+ ```json
52
+ {"query":{"filter":{"actionKey":"addLabelsToContact"},"paging":{"limit":25,"offset":0}}}
53
+ ```
54
+
55
+ Read `actions[]`, `paging`, and each chosen action's `appId`, `actionKey`, `inputSchema`,
56
+ `outputSchema` and `interfaceConfiguration`. Inspect required properties, types, enums and
57
+ field descriptions before explaining configuration. For an existing runtime version use
58
+ `GET https://www.wixapis.com/v1/actions/apps/<appId>/keys/<actionKey>` and read `action`.
59
+ A site may have Add label to contact without Create task; never substitute one for the other.
60
+
61
+ ### Bounded fallback
62
+
63
+ Remove the exact-key filter to browse; use offset pages of at most 25 entries, with no sort.
64
+ Resolve Actions has no `basicFieldsOnly` option and rejects displayName filters; search names
65
+ locally. Compact each page to identities and display names before adding it to reasoning
66
+ context. Fetch each catalog page and static schema once, cache it for this site, and hydrate only a
67
+ shortlist; never re-fetch a page or schema you already have. Pages can overlap;
68
+ de-duplicate by appId+key. Only a complete scan with distinct count equal to `paging.total`
69
+ proves absence; state the evidence ("scanned N distinct of `paging.total` N"). Without that
70
+ proof, say the component was "not found in the installed catalog", never that it is not
71
+ installed. Either way, list the closest related actions you saw in that scan, as findings
72
+ rather than substitutes, with their returned `appId`/`actionKey` and display name; don't fetch
73
+ their schemas unless the user asks.
74
+
75
+ Resolve is site-scoped; global Query catalogs can include uninstalled apps and do not prove
76
+ availability. The method schemas below confirm the full public URLs; do not invent a private
77
+ transport or guess a new path if access fails.
78
+
79
+ Official contracts: [Resolve Triggers](https://dev.wix.com/docs/api-reference/business-management/automations/triggers/trigger-catalog/resolve-triggers),
80
+ [Resolve Actions](https://dev.wix.com/docs/api-reference/business-management/automations/actions/action-catalog/resolve-actions).
81
+ For current automation status use [Automations Activation Status](https://dev.wix.com/docs/api-reference/business-management/automations/skills/automations-activation-status).
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: "Build and Manage Wix Automations"
3
+ description: "Discover installed automation triggers and actions and inspect an automation’s current active status without changing site data."
4
+ ---
5
+
6
+ # Build and Manage Wix Automations
7
+
8
+ Use this guide to discover installed automation capabilities and inspect whether an
9
+ automation is active. These are read-only workflows. Creation, configuration edits,
10
+ activation and test execution are outside what this skill covers.
11
+ Do not perform a write when the user asks only to inspect.
12
+
13
+ | Request | Load |
14
+ | --- | --- |
15
+ | Check which triggers/actions are available and what inputs they need | [Automations API Catalog](https://dev.wix.com/docs/api-reference/business-management/automations/skills/automations-api-catalog) |
16
+ | Is an automation turned on? What does its status mean? | [Automations Activation Status](https://dev.wix.com/docs/api-reference/business-management/automations/skills/automations-activation-status) |
17
+
18
+ For a capability check, resolve the site's catalogs, retain the returned app/key identities,
19
+ and inspect the selected schemas. A remembered action key is a search hint, not evidence that
20
+ the action is installed. State missing prerequisites without offering an unverified substitute.
21
+ If a requested action isn't found, report it exactly as the "Bounded fallback" section of
22
+ [Automations API Catalog](https://dev.wix.com/docs/api-reference/business-management/automations/skills/automations-api-catalog) says (scan evidence, "not found" vs "not installed", closest
23
+ related actions).
24
+ Resolve the trigger once and scan the action catalog once; answer from those results instead
25
+ of repeating either call.
26
+
27
+ For current status, find the exact automation, Get its returned ID, and report the status
28
+ from that response. Every status answer names the automation and its returned ID. Current ACTIVE/INACTIVE status is separate from historical run results.
29
+
30
+ Status questions need only Query and Get Automation: don't call the trigger or action catalogs
31
+ for them. Query by the exact name with one bounded page before paging further.
32
+
33
+ Keep the requested site context fixed. Do not expose tokens or credentials. Tie every claim
34
+ to the returned data, and distinguish a missing record from proof of nonexistence.