@wix/agent-skills 1.30.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.
- package/package.json +1 -1
- package/skills/wix-app/SKILL.md +7 -8
- package/skills/wix-app/references/DASHBOARD_PAGE.md +1 -1
- package/skills/wix-app/references/WIX_PATTERNS_DOCS.md +11 -50
- package/skills/wix-app/references/dashboard-page/DATA_SOURCES.md +14 -10
- package/skills/wix-app/references/dashboard-page/DRAFT_TEMPLATE.md +5 -8
- package/skills/wix-app/references/dashboard-page/TABLE_STATE.md +5 -4
- package/skills/wix-headless-kit/SKILL.md +20 -12
- package/skills/wix-headless-kit/guides/api-run.md +178 -0
- package/skills/wix-headless-kit/guides/existing-site.md +3 -2
- package/skills/wix-headless-kit/guides/reference-mode.md +9 -1
- package/skills/wix-headless-kit/install/AGENTS.md +7 -5
- package/skills/wix-headless-kit/install/attach.mjs +3 -3
- package/skills/wix-headless-kit/install/context.mjs +13 -3
- package/skills/wix-headless-kit/install/deploy.mjs +3 -3
- package/skills/wix-headless-kit/install/pins.json +1 -1
- package/skills/wix-headless-kit/install/setup.mjs +2 -2
- package/skills/wix-headless-kit/install/templates.mjs +2 -1
- package/skills/wix-headless-templates/blog/seed/SEED.md +1 -1
- package/skills/wix-headless-templates/blog/seed/seed-blog.mjs +2 -2
- package/skills/wix-headless-templates/bookings/seed/SEED.md +1 -1
- package/skills/wix-headless-templates/bookings/seed/seed-bookings.mjs +2 -1
- package/skills/wix-headless-templates/donations/seed/SEED.md +1 -1
- package/skills/wix-headless-templates/donations/seed/seed-donations.mjs +3 -2
- package/skills/wix-headless-templates/events/seed/SEED.md +1 -1
- package/skills/wix-headless-templates/events/seed/seed-events.mjs +3 -2
- package/skills/wix-headless-templates/portfolio/seed/SEED.md +4 -2
- package/skills/wix-headless-templates/portfolio/seed/seed-portfolio.mjs +6 -6
- package/skills/wix-headless-templates/rentals/seed/SEED.md +1 -1
- package/skills/wix-headless-templates/rentals/seed/seed-rentals.mjs +2 -1
- package/skills/wix-headless-templates/restaurants/seed/SEED.md +1 -1
- package/skills/wix-headless-templates/restaurants/seed/seed-restaurants.mjs +4 -3
- package/skills/wix-headless-templates/shared/seed/images.mjs +63 -7
- package/skills/wix-headless-templates/storefront/seed/SEED.md +17 -5
- package/skills/wix-headless-templates/storefront/seed/seed-store.mjs +49 -16
- package/skills/wix-manage/SKILL.md +25 -15
- package/skills/wix-manage/references/automations/activation-status.md +52 -0
- package/skills/wix-manage/references/automations/api-catalog.md +81 -0
- package/skills/wix-manage/references/automations/build-and-manage-automations.md +34 -0
- package/skills/wix-manage/references/bookings/create-and-update-booking-services.md +277 -363
- package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +3 -1
- package/skills/wix-manage/references/sites/send-feedback-to-wix.md +92 -0
- package/skills/wix-manage/references/sites/upload-static-site.md +258 -279
- package/skills/wix-vibe-headless/platforms/base44-ecom-light-seed-with-install.md +7 -1
- package/skills/wix-vibe-headless/platforms/base44-ecom-light-seed.md +7 -1
- package/skills/wix-vibe-headless/platforms/base44-ecom-light.md +7 -1
- package/skills/wix-headless-kit/guides/no-machine.md +0 -115
- package/skills/wix-manage/references/bookings/create-appointment-service.md +0 -243
- package/skills/wix-manage/references/bookings/create-booking-service-from-prompt.md +0 -31
- package/skills/wix-manage/references/bookings/create-class-service.md +0 -222
- 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"? } } }
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
import { setSiteCurrency } from "../../shared/seed/site.mjs";
|
|
30
30
|
import { basename } from "node:path";
|
|
31
31
|
import { readFileSync } from "node:fs";
|
|
32
|
-
import { resolveItemImages } from "../../shared/seed/images.mjs";
|
|
32
|
+
import { resolveItemImages, resolveItemImagesDetailed } from "../../shared/seed/images.mjs";
|
|
33
33
|
import { seedSiteId } from "../../shared/seed/site-context.mjs";
|
|
34
34
|
import { wixToken } from "../../shared/seed/wix-cli.mjs";
|
|
35
35
|
|
|
@@ -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
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
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 —
|
|
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
|
|
@@ -686,7 +691,7 @@ export async function setupStore(ctx, { products = [], categories = {}, category
|
|
|
686
691
|
const planNames = new Set(products.map((p) => p.name));
|
|
687
692
|
let all = [];
|
|
688
693
|
try { all = await readAllProducts(ctx); } catch (e) { console.error(`catalog read failed (skipping the pre-existing check): ${String(e.message).slice(0, 120)}`); }
|
|
689
|
-
|
|
694
|
+
let preexisting = all.filter((p) => !planNames.has(p.name));
|
|
690
695
|
|
|
691
696
|
// Idempotent by name: an errored bulk create (429/5xx) may still have applied server-side,
|
|
692
697
|
// and SKILL.md tells the agent to re-run a failed seed — creating only the names that don't
|
|
@@ -735,17 +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,
|
|
747
|
+
productName: pl.name,
|
|
742
748
|
altText: c.altText ?? `${pl.name} — ${c.name}`,
|
|
743
|
-
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` },
|
|
744
750
|
})),
|
|
745
751
|
));
|
|
746
752
|
const flatChoiceSpecs = choiceSpecs.flat();
|
|
747
|
-
const
|
|
753
|
+
const resolved = await resolveItemImagesDetailed(ctx, [
|
|
748
754
|
...withNames.map((p, i) => ({
|
|
755
|
+
mediaId: products[i]?.imageMediaId,
|
|
749
756
|
url: products[i]?.imageUrl,
|
|
750
757
|
path: products[i]?.imagePath,
|
|
751
758
|
prompt: products[i]?.imagePrompt,
|
|
@@ -753,7 +760,9 @@ export async function setupStore(ctx, { products = [], categories = {}, category
|
|
|
753
760
|
})),
|
|
754
761
|
...flatChoiceSpecs.map((c) => c.spec),
|
|
755
762
|
]);
|
|
763
|
+
const files = resolved.map((r) => r.file);
|
|
756
764
|
const choiceFiles = files.slice(withNames.length);
|
|
765
|
+
const choiceResolved = resolved.slice(withNames.length);
|
|
757
766
|
let cursor = 0;
|
|
758
767
|
const choiceLinks = choiceSpecs.map((specs) =>
|
|
759
768
|
specs.map((c) => ({ ...c, file: choiceFiles[cursor++] })).filter((c) => c.file));
|
|
@@ -763,8 +772,8 @@ export async function setupStore(ctx, { products = [], categories = {}, category
|
|
|
763
772
|
.map((p, i) => {
|
|
764
773
|
if (!p.id) return null;
|
|
765
774
|
const images = [
|
|
766
|
-
...(files[i] ? [{ url: files[i].url, altText: products[i]?.altText ?? p.slug }] : []),
|
|
767
|
-
...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 })),
|
|
768
777
|
];
|
|
769
778
|
return images.length ? { id: p.id, images } : null;
|
|
770
779
|
})
|
|
@@ -774,6 +783,15 @@ export async function setupStore(ctx, { products = [], categories = {}, category
|
|
|
774
783
|
// the same plan reuses the products and attaches again.
|
|
775
784
|
let imagesAttached = 0;
|
|
776
785
|
const imageFailures = [];
|
|
786
|
+
// A product whose image never resolved (a bad path, an unsupported file type, a refused
|
|
787
|
+
// prompt, a timeout) is not in imageItems at all, so the attach step below never sees it:
|
|
788
|
+
// it is reported here with the resolver's reason, or it ships text-only in silence.
|
|
789
|
+
withNames.forEach((p, i) => {
|
|
790
|
+
const src = products[i] ?? {};
|
|
791
|
+
if ((src.imageMediaId || src.imageUrl || src.imagePath || src.imagePrompt) && !files[i]) {
|
|
792
|
+
imageFailures.push({ name: p.name, error: resolved[i]?.error ?? "image did not resolve" });
|
|
793
|
+
}
|
|
794
|
+
});
|
|
777
795
|
const nameOf = (id) => withNames.find((p) => p.id === id)?.name;
|
|
778
796
|
try {
|
|
779
797
|
if (imageItems.length) {
|
|
@@ -788,11 +806,15 @@ export async function setupStore(ctx, { products = [], categories = {}, category
|
|
|
788
806
|
// Pass 3 — link each choice's image to its choice, by the gallery item's id.
|
|
789
807
|
let choiceImagesLinked = 0;
|
|
790
808
|
const choiceImageFailures = [];
|
|
809
|
+
flatChoiceSpecs.forEach((c, j) => {
|
|
810
|
+
if (!choiceFiles[j]) choiceImageFailures.push({ name: c.productName, choice: c.choiceName, error: choiceResolved[j]?.error ?? "image did not resolve" });
|
|
811
|
+
});
|
|
791
812
|
for (const [i, p] of withNames.entries()) {
|
|
792
813
|
const links = choiceLinks[i];
|
|
793
814
|
if (!links.length || !p.id || !imagesAttached) continue;
|
|
794
815
|
try {
|
|
795
|
-
|
|
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 }) })));
|
|
796
818
|
choiceImagesLinked += r.linked;
|
|
797
819
|
for (const m of r.missing) choiceImageFailures.push({ name: p.name, choice: m, error: "image not in the product gallery" });
|
|
798
820
|
} catch (e) {
|
|
@@ -800,6 +822,17 @@ export async function setupStore(ctx, { products = [], categories = {}, category
|
|
|
800
822
|
}
|
|
801
823
|
}
|
|
802
824
|
|
|
825
|
+
// The pre-existing list is read again now: on a fresh site the Stores app was installed moments
|
|
826
|
+
// before the first read, and Wix creates its sample catalog asynchronously after the install, so
|
|
827
|
+
// that read often came back empty and the closing message said nothing about a dozen samples the
|
|
828
|
+
// live shop lists. The early read still serves the idempotency check above; this one serves the report.
|
|
829
|
+
try {
|
|
830
|
+
const after = await readAllProducts(ctx);
|
|
831
|
+
preexisting = after.filter((p) => !planNames.has(p.name));
|
|
832
|
+
} catch (e) {
|
|
833
|
+
console.error(`catalog re-read failed (reporting the pre-existing list from the first read): ${String(e.message).slice(0, 120)}`);
|
|
834
|
+
}
|
|
835
|
+
|
|
803
836
|
// failures is part of the result, not an exception: a partial seed still leaves a usable
|
|
804
837
|
// store, and the agent needs the names to report rather than silently shipping a short
|
|
805
838
|
// catalog. Re-run the seed to retry them — existing names are skipped, not duplicated.
|
|
@@ -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
|
-
|
|
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.
|