@wix/agent-skills 1.31.0 → 1.31.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 +7 -8
- package/skills/wix-app/references/DASHBOARD_PAGE.md +1 -1
- package/skills/wix-app/references/STORES_VERSIONING.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 +31 -14
- package/skills/wix-headless-kit/guides/api-run.md +116 -31
- package/skills/wix-headless-kit/guides/existing-site.md +9 -2
- package/skills/wix-headless-kit/guides/reference-mode.md +9 -1
- package/skills/wix-headless-kit/install/AGENTS.md +10 -7
- package/skills/wix-headless-kit/install/attach.mjs +35 -30
- package/skills/wix-headless-kit/install/background.mjs +32 -0
- package/skills/wix-headless-kit/install/bootstrap.mjs +28 -11
- package/skills/wix-headless-kit/install/check.mjs +2 -2
- package/skills/wix-headless-kit/install/context.mjs +62 -8
- package/skills/wix-headless-kit/install/deploy.mjs +36 -11
- package/skills/wix-headless-kit/install/env-ignore.mjs +16 -0
- package/skills/wix-headless-kit/install/install.mjs +95 -0
- package/skills/wix-headless-kit/install/pins.json +1 -1
- package/skills/wix-headless-kit/install/proc.mjs +46 -0
- package/skills/wix-headless-kit/install/setup.mjs +18 -27
- package/skills/wix-headless-kit/install/templates.mjs +4 -3
- package/skills/wix-headless-templates/blog/app/components/blog/RichContent.tsx +3 -2
- package/skills/wix-headless-templates/blog/project/package-lock.json +1287 -1299
- package/skills/wix-headless-templates/blog/project/package.json +1 -1
- package/skills/wix-headless-templates/blog/project/src/components/blog/RichContent.tsx +3 -2
- package/skills/wix-headless-templates/blog/rest/authors.ts +5 -5
- package/skills/wix-headless-templates/blog/rest/comments.ts +4 -4
- package/skills/wix-headless-templates/blog/rest/post-likes.ts +3 -3
- package/skills/wix-headless-templates/blog/rest/posts.ts +4 -4
- package/skills/wix-headless-templates/blog/rest/taxonomy.ts +5 -5
- package/skills/wix-headless-templates/blog/seed/SEED.md +1 -1
- package/skills/wix-headless-templates/blog/seed/seed-blog.mjs +4 -3
- package/skills/wix-headless-templates/bookings/rest/booking.ts +4 -4
- package/skills/wix-headless-templates/bookings/rest/services.ts +4 -4
- package/skills/wix-headless-templates/bookings/seed/SEED.md +1 -1
- package/skills/wix-headless-templates/bookings/seed/seed-bookings.mjs +4 -2
- package/skills/wix-headless-templates/cms/rest/collections.ts +3 -3
- package/skills/wix-headless-templates/cms/rest/items.ts +4 -4
- package/skills/wix-headless-templates/cms/seed/seed-cms.mjs +2 -1
- package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/rest/donate.ts +3 -3
- package/skills/wix-headless-templates/donations/seed/SEED.md +1 -1
- package/skills/wix-headless-templates/donations/seed/seed-donations.mjs +5 -3
- package/skills/wix-headless-templates/events/rest/events.ts +4 -4
- package/skills/wix-headless-templates/events/rest/orders.ts +4 -4
- package/skills/wix-headless-templates/events/rest/registration.ts +4 -4
- package/skills/wix-headless-templates/events/seed/SEED.md +1 -1
- package/skills/wix-headless-templates/events/seed/seed-events.mjs +5 -3
- package/skills/wix-headless-templates/faq/rest/faq.ts +4 -4
- package/skills/wix-headless-templates/faq/seed/seed-faq.mjs +2 -1
- package/skills/wix-headless-templates/forms/rest/forms.ts +4 -4
- package/skills/wix-headless-templates/forms/rest/submissions.ts +4 -4
- package/skills/wix-headless-templates/forms/seed/seed-forms.mjs +2 -1
- package/skills/wix-headless-templates/members/rest/auth.ts +3 -3
- package/skills/wix-headless-templates/members/rest/members.ts +4 -4
- package/skills/wix-headless-templates/members/seed/seed-members.mjs +2 -1
- package/skills/wix-headless-templates/portfolio/rest/portfolio.ts +4 -4
- package/skills/wix-headless-templates/portfolio/seed/SEED.md +4 -2
- package/skills/wix-headless-templates/portfolio/seed/seed-portfolio.mjs +8 -7
- package/skills/wix-headless-templates/pricing-plans/rest/plan-access.ts +3 -3
- package/skills/wix-headless-templates/pricing-plans/rest/plans.ts +4 -4
- package/skills/wix-headless-templates/pricing-plans/rest/purchase.ts +3 -3
- package/skills/wix-headless-templates/pricing-plans/seed/seed-pricing-plans.mjs +2 -1
- package/skills/wix-headless-templates/rentals/rest/rentals.ts +4 -4
- package/skills/wix-headless-templates/rentals/seed/SEED.md +1 -1
- package/skills/wix-headless-templates/rentals/seed/seed-rentals.mjs +4 -2
- package/skills/wix-headless-templates/restaurants/rest/menu.ts +4 -4
- package/skills/wix-headless-templates/restaurants/rest/ordering.ts +5 -5
- package/skills/wix-headless-templates/restaurants/rest/reservations.ts +4 -4
- package/skills/wix-headless-templates/restaurants/seed/SEED.md +1 -1
- package/skills/wix-headless-templates/restaurants/seed/seed-restaurants.mjs +6 -4
- package/skills/wix-headless-templates/shared/capabilities/site-search/rest/search.ts +4 -4
- package/skills/wix-headless-templates/shared/capabilities/site-search/seed/install.mjs +6 -4
- package/skills/wix-headless-templates/shared/seed/images.mjs +41 -5
- package/skills/wix-headless-templates/shared/seed/main.mjs +15 -0
- package/skills/wix-headless-templates/shared/seed/wix-cli.mjs +43 -11
- package/skills/wix-headless-templates/storefront/INSTRUCTIONS.md +1 -1
- package/skills/wix-headless-templates/storefront/rest/cart.ts +5 -5
- package/skills/wix-headless-templates/storefront/rest/catalog.ts +5 -5
- package/skills/wix-headless-templates/storefront/seed/SEED.md +44 -14
- package/skills/wix-headless-templates/storefront/seed/seed-store.mjs +23 -15
- package/skills/wix-manage/SKILL.md +28 -18
- package/skills/wix-manage/references/app-installation/install-wix-apps.md +5 -1
- package/skills/wix-manage/references/app-installation/list-installed-apps.md +19 -9
- 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/booking-service-policy-setup.md +3 -0
- package/skills/wix-manage/references/bookings/create-and-update-booking-services.md +277 -363
- package/skills/wix-manage/references/bookings/external-calendar-integration.md +3 -0
- package/skills/wix-manage/references/bookings/multi-resource-service-creation.md +3 -0
- package/skills/wix-manage/references/cms/cms-data-items-crud.md +11 -2
- package/skills/wix-manage/references/cms/cms-publishing-flow.md +63 -16
- package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +3 -1
- package/skills/wix-manage/references/forms/update-form.md +3 -0
- package/skills/wix-manage/references/pricing-plans/create-and-update-pricing-plans.md +3 -0
- package/skills/wix-manage/references/restaurants/wix-restaurants-setup.md +3 -0
- package/skills/wix-manage/references/sites/create-headless-site.md +7 -50
- package/skills/wix-manage/references/sites/manage-oauth-apps.md +4 -4
- package/skills/wix-manage/references/sites/read-site-context.md +4 -0
- package/skills/wix-manage/references/sites/send-feedback-to-wix.md +92 -0
- package/skills/wix-manage/references/sites/upload-static-site.md +298 -283
- package/skills/wix-manage/references/stores/add-store-pages-to-site.md +3 -0
- package/skills/wix-manage/references/stores/change-store-currency.md +3 -0
- package/skills/wix-manage/references/stores/create-product-catalog-v3.md +3 -0
- package/skills/wix-manage/references/stores/find-products-query-and-search-catalog-v3.md +3 -0
- package/skills/wix-manage/references/stores/update-product-with-options.md +192 -22
- 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
|
@@ -1,28 +1,60 @@
|
|
|
1
1
|
// The Wix CLI the seeds call for a site token and for `wix env pull`.
|
|
2
2
|
//
|
|
3
|
-
// Order: the project's own copy (node_modules
|
|
3
|
+
// Order: the project's own copy (node_modules/@wix/cli, installed with the template's lock), then
|
|
4
4
|
// a `wix` on PATH, then `npx -y @wix/cli@<pinned>` — which installs the CLI before running it, 20 to
|
|
5
5
|
// 60 s and a wall of npm output on a fresh machine. The first two take under two seconds.
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
//
|
|
7
|
+
// On Windows `wix` and `npx` are .cmd shims, which Node starts only through a shell (ENOENT
|
|
8
|
+
// without one, EINVAL for an explicit .cmd since Node 20.12). There the CLI's own JS entry, and
|
|
9
|
+
// npm's npx entry beside node.exe, run through node directly.
|
|
10
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
11
|
+
import { delimiter, dirname, join } from "node:path";
|
|
8
12
|
import { execFileSync, spawnSync } from "node:child_process";
|
|
9
13
|
|
|
10
14
|
// The CLI version the fallback installs; equal to `@wix/cli` in wix-headless-kit/install/pins.json.
|
|
11
15
|
const WIX_CLI_VERSION = "1.1.258";
|
|
16
|
+
const isWin = process.platform === "win32";
|
|
17
|
+
|
|
18
|
+
// The JS file a @wix/cli install runs (package.json `bin`), or null.
|
|
19
|
+
function cliEntry(pkgDir) {
|
|
20
|
+
try {
|
|
21
|
+
const { bin } = JSON.parse(readFileSync(join(pkgDir, "package.json"), "utf8"));
|
|
22
|
+
const rel = typeof bin === "string" ? bin : bin?.wix;
|
|
23
|
+
return rel && existsSync(join(pkgDir, rel)) ? join(pkgDir, rel) : null;
|
|
24
|
+
} catch {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function viaNpx() {
|
|
30
|
+
const pkg = `@wix/cli@${WIX_CLI_VERSION}`;
|
|
31
|
+
if (!isWin) return { file: "npx", prefix: ["-y", pkg] };
|
|
32
|
+
const js = join(dirname(process.execPath), "node_modules", "npm", "bin", "npx-cli.js");
|
|
33
|
+
if (existsSync(js)) return { file: process.execPath, prefix: [js, "-y", pkg] };
|
|
34
|
+
return { file: "npx.cmd", prefix: ["-y", pkg], shell: true };
|
|
35
|
+
}
|
|
12
36
|
|
|
13
37
|
export function resolveWixCli(cwd = process.cwd()) {
|
|
14
|
-
const bin = process.platform === "win32" ? "wix.cmd" : "wix";
|
|
15
|
-
const local = join(cwd, "node_modules", ".bin", bin);
|
|
16
38
|
// The project's copy counts only once its install has finished: the seed runs beside a detached
|
|
17
39
|
// npm install, and mid-install the .bin shim can exist before the package it points at does
|
|
18
40
|
// (seen live: "Cannot find module node_modules/.bin/wix"). npm writes node_modules/.package-lock.json
|
|
19
41
|
// last, the same marker the kit's install step syncs on.
|
|
20
|
-
const
|
|
21
|
-
|
|
42
|
+
const pkgDir = join(cwd, "node_modules", "@wix", "cli");
|
|
43
|
+
const installed = existsSync(join(cwd, "node_modules", ".package-lock.json")) && existsSync(join(pkgDir, "package.json"));
|
|
44
|
+
if (installed) {
|
|
45
|
+
const local = join(cwd, "node_modules", ".bin", "wix");
|
|
46
|
+
if (!isWin && existsSync(local)) return { file: local, prefix: [] };
|
|
47
|
+
const entry = isWin && cliEntry(pkgDir);
|
|
48
|
+
if (entry) return { file: process.execPath, prefix: [entry] };
|
|
49
|
+
}
|
|
22
50
|
for (const dir of (process.env.PATH ?? "").split(delimiter)) {
|
|
23
|
-
if (dir
|
|
51
|
+
if (!dir) continue;
|
|
52
|
+
if (!isWin && existsSync(join(dir, "wix"))) return { file: join(dir, "wix"), prefix: [] };
|
|
53
|
+
// A global npm install on Windows: wix.cmd in the prefix, the package beside it.
|
|
54
|
+
const entry = isWin && existsSync(join(dir, "wix.cmd")) && cliEntry(join(dir, "node_modules", "@wix", "cli"));
|
|
55
|
+
if (entry) return { file: process.execPath, prefix: [entry] };
|
|
24
56
|
}
|
|
25
|
-
return
|
|
57
|
+
return viaNpx();
|
|
26
58
|
}
|
|
27
59
|
|
|
28
60
|
/**
|
|
@@ -32,7 +64,7 @@ export function resolveWixCli(cwd = process.cwd()) {
|
|
|
32
64
|
*/
|
|
33
65
|
export function wixToken(siteId, cwd = process.cwd()) {
|
|
34
66
|
const cli = resolveWixCli(cwd);
|
|
35
|
-
const out = execFileSync(cli.file, [...cli.prefix, "token", "--site", siteId], { encoding: "utf8", cwd });
|
|
67
|
+
const out = execFileSync(cli.file, [...cli.prefix, "token", "--site", siteId], { encoding: "utf8", cwd, shell: cli.shell, windowsHide: true });
|
|
36
68
|
// An older CLI starts its "update available" box on the token's own line, so a line split is
|
|
37
69
|
// not enough: the token is the first long run of token characters.
|
|
38
70
|
const token = out.match(/[A-Za-z0-9._-]{40,}/)?.[0];
|
|
@@ -43,5 +75,5 @@ export function wixToken(siteId, cwd = process.cwd()) {
|
|
|
43
75
|
/** Runs a Wix CLI command synchronously; same return shape as spawnSync. */
|
|
44
76
|
export function runWix(args, { cwd = process.cwd(), ...opts } = {}) {
|
|
45
77
|
const cli = resolveWixCli(cwd);
|
|
46
|
-
return spawnSync(cli.file, [...cli.prefix, ...args], { cwd, ...opts });
|
|
78
|
+
return spawnSync(cli.file, [...cli.prefix, ...args], { cwd, shell: cli.shell, windowsHide: true, ...opts });
|
|
47
79
|
}
|
|
@@ -264,7 +264,7 @@ import { seoTags } from "@wix/seo";
|
|
|
264
264
|
export const wixMetadata = {
|
|
265
265
|
appDefId: WIX_APPS.checkoutAndOrders.id,
|
|
266
266
|
pageIdentifier: WIX_APPS.checkoutAndOrders.categoryPageMetadata.pageIdentifier,
|
|
267
|
-
identifiers: { slug: WIX_APPS.checkoutAndOrders.categoryPageMetadata.identifiers.
|
|
267
|
+
identifiers: { slug: WIX_APPS.checkoutAndOrders.categoryPageMetadata.identifiers.collection },
|
|
268
268
|
};
|
|
269
269
|
|
|
270
270
|
const slug = Astro.params.slug!;
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
// All calls run with the visitor token: the cart is the token's (see ../shared/client).
|
|
7
7
|
// docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/add-line-items-to-current-cart.md
|
|
8
8
|
// docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
|
|
9
|
-
import { WixApiError, wixRequest } from "
|
|
10
|
-
import { imgSrc } from "
|
|
11
|
-
import { EMPTY_TOTALS, WIX_STORES_APP_ID, addOptions, assertAdded, assertCheckoutable, cartErrorMessage, rawId, summaryTotals, toCart } from "
|
|
12
|
-
import type { Raw } from "
|
|
13
|
-
import type { Cart } from "
|
|
9
|
+
import { WixApiError, wixRequest } from "../../shared/rest/client.js";
|
|
10
|
+
import { imgSrc } from "../../shared/rest/media.js";
|
|
11
|
+
import { EMPTY_TOTALS, WIX_STORES_APP_ID, addOptions, assertAdded, assertCheckoutable, cartErrorMessage, rawId, summaryTotals, toCart } from "../app/wix/storefront/cart-core.js";
|
|
12
|
+
import type { Raw } from "../app/wix/storefront/catalog-core.js";
|
|
13
|
+
import type { Cart } from "../app/wix/storefront/types.js";
|
|
14
14
|
|
|
15
15
|
const CART = "/ecom/v2/carts/current";
|
|
16
16
|
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
// Porting: keep the paths, keep the bodies, port the core once.
|
|
6
6
|
// docs: https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/products-v3/search-products.md
|
|
7
7
|
// docs: https://dev.wix.com/docs/api-reference/business-solutions/stores/catalog-v3/categories/get-category-by-slug.md
|
|
8
|
-
import { WixApiError, wixRequest } from "
|
|
9
|
-
import { imgSrc, mediaKey } from "
|
|
8
|
+
import { WixApiError, wixRequest } from "../../shared/rest/client.js";
|
|
9
|
+
import { imgSrc, mediaKey } from "../../shared/rest/media.js";
|
|
10
10
|
import {
|
|
11
11
|
CATALOG_SORTS,
|
|
12
12
|
DETAIL_FIELDS,
|
|
@@ -29,9 +29,9 @@ import {
|
|
|
29
29
|
type CatalogSort,
|
|
30
30
|
type FacetSelection,
|
|
31
31
|
type Raw,
|
|
32
|
-
} from "
|
|
33
|
-
import { WIX_STORES_APP_ID } from "
|
|
34
|
-
import type { Category, Facet, FacetData, ProductDetail, ProductSummary, VariantInventory } from "
|
|
32
|
+
} from "../app/wix/storefront/catalog-core.js";
|
|
33
|
+
import { WIX_STORES_APP_ID } from "../app/wix/storefront/cart-core.js";
|
|
34
|
+
import type { Category, Facet, FacetData, ProductDetail, ProductSummary, VariantInventory } from "../app/wix/storefront/types.js";
|
|
35
35
|
|
|
36
36
|
export { CATALOG_SORTS, choiceAvailability, resolveVariant, sellingPrice, type CatalogSearchOptions, type CatalogSort, type FacetSelection };
|
|
37
37
|
|
|
@@ -54,8 +54,8 @@ to a file if you want it later). `.seed-exit` and `seed-result.json` are written
|
|
|
54
54
|
`type: "color"` renders as real swatches (give every color choice a `colorCode`); anything
|
|
55
55
|
else renders as text pills. Variants are expanded automatically (full cross-product, each
|
|
56
56
|
carrying the product's price/compareAtPrice/quantity) — keep option counts small.
|
|
57
|
-
A choice may carry its own photo — `
|
|
58
|
-
same
|
|
57
|
+
A choice may carry its own photo — `imageMediaId` | `imageUrl` | `imagePath` | `imagePrompt`
|
|
58
|
+
(+ `altText`), the same forms as a product image: it joins the product's gallery and the product page shows
|
|
59
59
|
it when that choice is picked (a colour's photo). Give it when the source has one per colour.
|
|
60
60
|
- `variantPrices` — `{ "<choice name>": price }` when one option's choices are priced differently
|
|
61
61
|
("L": 74): every variant carrying that choice takes that price (the first priced choice wins);
|
|
@@ -76,9 +76,14 @@ to a file if you want it later). `.seed-exit` and `seed-result.json` are written
|
|
|
76
76
|
- **Give every product an image** (a store without product images looks broken: gray boxes on
|
|
77
77
|
tiles, PDP, and cart) — the default is an `imagePrompt` (AI-generated, ~1 Wix AI credit
|
|
78
78
|
per image, account-billed): brand-contextual — subject, aesthetic/mood, palette, lighting —
|
|
79
|
-
always ending "no text, no watermarks". At least one image in the set shows the real subject of the business — the actual product/space/service, not abstract decoration. For an asset the user actually supplied use `
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
always ending "no text, no watermarks". At least one image in the set shows the real subject of the business — the actual product/space/service, not abstract decoration. For an asset the user actually supplied use `imageMediaId` (a file
|
|
80
|
+
already in the site's Media Manager, such as one the user uploaded there: the product uses that
|
|
81
|
+
file as it is, no copy), `imagePath` (a file on this machine — uploaded to Wix Media) or
|
|
82
|
+
`imageUrl` (their own hosted URL; verify it with `curl -sI` → 200) — never a stock-photo or
|
|
83
|
+
guessed URL. A `static.wixstatic.com/media/<file id>` URL of a file on this site counts as its
|
|
84
|
+
`imageMediaId`. List the site's files to find an id: the
|
|
85
|
+
[Media Manager](https://dev.wix.com/docs/api-reference/assets/media/media-manager/files/list-files.md)
|
|
86
|
+
names each by the name it was uploaded under. Images resolve in parallel and never block the seed; a failed image leaves
|
|
82
87
|
that product text-only. Seed text-only only when the user explicitly asks.
|
|
83
88
|
- `digitalFilePath` (a file on this machine) or `digitalFileUrl` — makes the product a digital
|
|
84
89
|
download, uploaded and created with both the file and stock (`quantity` is ignored). It's also the
|
|
@@ -94,17 +99,26 @@ to a file if you want it later). `.seed-exit` and `seed-result.json` are written
|
|
|
94
99
|
create only; an existing category keeps what it has.
|
|
95
100
|
- `quantity` — tracked stock, a non-negative integer. For stock that isn't counted (made to
|
|
96
101
|
order, print on demand, unlimited) use `"inStock": true` **instead** of `quantity`; sending
|
|
97
|
-
both is rejected.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
102
|
+
both is rejected. A product with no stock given, drafted or the user's own, is `"inStock": true`.
|
|
103
|
+
Right after the bulk create, a product's own stock summary can still read `OUT_OF_STOCK`
|
|
104
|
+
while its inventory items are already stocked; the items are what a buyer's add is checked
|
|
105
|
+
against. A product **without options** can still end up with no item (a create that ran while
|
|
106
|
+
the catalog was provisioning): the script stocks those afterwards with one Bulk Create
|
|
107
|
+
Inventory Items call (`productId`, its single `variantId`, and `inStock: true` or the
|
|
108
|
+
`quantity`), where `ALREADY_EXISTS` means the item is already there. A seed made call by call
|
|
109
|
+
reads the items (Query Inventory Items) and creates only the missing ones.
|
|
110
|
+
- `currency` — 3-letter ISO code. Set it **only when the user names one**, in the brief or on their
|
|
111
|
+
own pages: a sentence about currency ("prices in euros") or a price written with its unit ("9
|
|
112
|
+
dollars", "$9", "€20"). On a site this run created it is set without asking; a store the user
|
|
113
|
+
already runs is asked first. Do **not** infer it from a language, a country, or an address — an
|
|
114
|
+
unrequested switch silently reprices the whole catalog. The seed applies it before creating
|
|
115
|
+
anything, because a product's price is stored in the site currency at create time. For a few
|
|
116
|
+
seconds afterwards product reads can still report the old currency; that lag is
|
|
103
117
|
expected and self-resolves, so don't re-verify it or retry.
|
|
104
118
|
|
|
105
119
|
**Default to 3 products** when you draft the catalog yourself — the seed shows the shape, not a
|
|
106
|
-
full inventory; the owner adds the rest in the dashboard.
|
|
107
|
-
UI**: give at least one product a color option and put one product on sale — truthfully to the
|
|
120
|
+
full inventory; the owner adds the rest in the dashboard. The closing names drafted products as
|
|
121
|
+
placeholders. **Make those 3 exercise the shipped UI**: give at least one product a color option and put one product on sale — truthfully to the
|
|
108
122
|
business (a ceramics studio has glaze colors; a bakery doesn't). When the brief mentions gift
|
|
109
123
|
wrap, engraving, a message card, pre-orders, or "coming soon" stock, seed ONE product with that
|
|
110
124
|
modifier and ONE pre-order item so the surfaces exist to design against; never add them to a
|
|
@@ -131,7 +145,8 @@ a new site (a dozen products: "Baseball Cap", "Ceramic Flower Vase", "Crew T-Shi
|
|
|
131
145
|
live shop lists them next to the owner's, so they are never silent: the result's `preexisting[]` names
|
|
132
146
|
every product the plan did not name (`{ id, name, slug }`), and the closing message says so with the
|
|
133
147
|
Manage products link (`dashboardProductsUrl` in the result) so the owner removes them there if they
|
|
134
|
-
want to.
|
|
148
|
+
want to. After a currency change their prices keep the same numbers in the new currency, and the
|
|
149
|
+
closing says so. Categories are idempotent by name — a re-run reuses "Donuts" instead of creating a second one.
|
|
135
150
|
|
|
136
151
|
**Images are confirmed, not assumed.** `imagesAttached` counts the attaches the API reported as
|
|
137
152
|
successful; `imageFailures: [{ name, error }]` names the products left without an image and why.
|
|
@@ -149,6 +164,8 @@ duplicated. Never hand-patch ids to "fill the gap".
|
|
|
149
164
|
|
|
150
165
|
Two things this module does not seed (dashboard-only — tell the merchant): **SKUs** and
|
|
151
166
|
**subscription plans** (the storefront renders them when the merchant adds them).
|
|
167
|
+
Shipping isn't seeded either; when the brief asks for it, `wix-manage`'s
|
|
168
|
+
`references/ecommerce/ecom-shipping.md` sets it up.
|
|
152
169
|
|
|
153
170
|
## Escape hatch — individual functions
|
|
154
171
|
|
|
@@ -157,6 +174,19 @@ ordering: `installStoresApp`, `readAllProducts`, `bulkCreateProducts`,
|
|
|
157
174
|
`createCategories(ctx, names, details?)`, `addProductsToCategories`, `attachProductImages` — plus
|
|
158
175
|
`makeCtx()` for the auth context.
|
|
159
176
|
|
|
177
|
+
A seed made call by call sends the body `bulkCreateProducts` builds
|
|
178
|
+
(`POST /stores/v3/bulk/products-with-inventory/create`); the description is rich-text nodes, as
|
|
179
|
+
`mkDesc` turns them out:
|
|
180
|
+
|
|
181
|
+
```json
|
|
182
|
+
{ "returnEntity": true, "products": [{
|
|
183
|
+
"name": "Hearth Candle", "productType": "PHYSICAL", "physicalProperties": {},
|
|
184
|
+
"description": { "nodes": [{ "type": "PARAGRAPH", "id": "d0", "paragraphData": {},
|
|
185
|
+
"nodes": [{ "type": "TEXT", "id": "", "textData": { "text": "Hand-poured soy wax.", "decorations": [] } }] }] },
|
|
186
|
+
"variantsInfo": { "variants": [{ "price": { "actualPrice": { "amount": "28" } },
|
|
187
|
+
"physicalProperties": {}, "inventoryItem": { "inStock": true } }] } }] }
|
|
188
|
+
```
|
|
189
|
+
|
|
160
190
|
## Reference
|
|
161
191
|
|
|
162
192
|
If a call returns an unexpected shape or you need an operation this module doesn't cover, read
|
|
@@ -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"? } } }
|
|
@@ -32,6 +32,7 @@ import { readFileSync } from "node:fs";
|
|
|
32
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
|
+
import { isMain } from "../../shared/seed/main.mjs";
|
|
35
36
|
|
|
36
37
|
const API = "https://www.wixapis.com";
|
|
37
38
|
const STORES_APP_ID = "215238eb-22a5-4c36-9e7b-e7c08025e04e";
|
|
@@ -472,9 +473,11 @@ export async function addProductsToCategories(ctx, mapping) {
|
|
|
472
473
|
}
|
|
473
474
|
}
|
|
474
475
|
|
|
475
|
-
// Bulk image attach in ONE call. items: [{ id, url, altText }] — no revision to pass: the
|
|
476
|
+
// Bulk image attach in ONE call. items: [{ id, url, mediaId?, altText }] — no revision to pass: the
|
|
476
477
|
// current revision is read right before the update, so attach any number of times, any pass.
|
|
477
|
-
//
|
|
478
|
+
// An item with a mediaId (a file already in this site's Media Manager) is attached by that id and
|
|
479
|
+
// reused as it is; a bare url is re-hosted by Wix server-side, a new file each time. The media can
|
|
480
|
+
// take a little while to appear on read-back
|
|
478
481
|
// (propagation) — normal, not a failure.
|
|
479
482
|
// The bulk update returns 200 on PARTIAL failure, like the bulk create: each item's outcome is
|
|
480
483
|
// in results[].itemMetadata (success, error, originalIndex). Seen live (runs 85 and 86,
|
|
@@ -491,7 +494,8 @@ export async function addProductsToCategories(ctx, mapping) {
|
|
|
491
494
|
// whose choices were linked (by this seed or by the owner in the dashboard) gets those links put
|
|
492
495
|
// back right after.
|
|
493
496
|
const sameFile = (a, b) => a && b && basename(a) === basename(b);
|
|
494
|
-
|
|
497
|
+
// A file attached by id keeps its own display name as the item's filename, so it is found by id.
|
|
498
|
+
const galleryHas = (items, url, mediaId) => items.some((it) => (mediaId && it.id === mediaId) || sameFile(it.image?.filename, url) || sameFile(it.image?.url, url));
|
|
495
499
|
|
|
496
500
|
export async function attachProductImages(ctx, items) {
|
|
497
501
|
if (!items?.length) return { attached: [], failures: [] };
|
|
@@ -508,9 +512,10 @@ export async function attachProductImages(ctx, items) {
|
|
|
508
512
|
const p = byId.get(it.id);
|
|
509
513
|
const current = p?.media?.itemsInfo?.items ?? [];
|
|
510
514
|
const wanted = it.images ?? [{ url: it.url, altText: it.altText }];
|
|
511
|
-
const fresh = wanted.filter(({ url }) => !galleryHas(current, url));
|
|
515
|
+
const fresh = wanted.filter(({ url, mediaId }) => !galleryHas(current, url, mediaId));
|
|
512
516
|
if (!fresh.length) { ok.add(it.id); continue; } // every image is already there
|
|
513
|
-
|
|
517
|
+
// A file already in the Media Manager goes in by its id: set by url, Stores imports a copy.
|
|
518
|
+
toSend.push({ it, p, items: [...current.map(({ id }) => ({ id })), ...fresh.map(({ url, mediaId, altText }) => (mediaId ? { id: mediaId, altText } : { url, altText }))] });
|
|
514
519
|
}
|
|
515
520
|
if (toSend.length) {
|
|
516
521
|
const r = await req(ctx, "/stores/v3/bulk/products/update", {
|
|
@@ -558,7 +563,8 @@ function choiceLinksOf(p) {
|
|
|
558
563
|
|
|
559
564
|
// Per-choice images (the dashboard's "image per colour"): a choice points at an item of the
|
|
560
565
|
// 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 —
|
|
566
|
+
// the gallery item's id — for a file imported by url that is a different id from the uploaded
|
|
567
|
+
// 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
568
|
// product update, which the API only accepts with the variants re-sent beside the options, so the
|
|
563
569
|
// current variants (id, choices, price) ride along unchanged. Wix derives a variant's own media
|
|
564
570
|
// from its choice at creation only; the storefront reads the choice's image, so a link made here
|
|
@@ -735,18 +741,19 @@ export async function setupStore(ctx, { products = [], categories = {}, category
|
|
|
735
741
|
const choiceSpecs = products.map((pl, i) =>
|
|
736
742
|
(pl.options ?? []).flatMap((o) =>
|
|
737
743
|
(o.choices ?? [])
|
|
738
|
-
.filter((c) => typeof c === "object" && c && (c.imageUrl || c.imagePath || c.imagePrompt))
|
|
744
|
+
.filter((c) => typeof c === "object" && c && (c.imageMediaId || c.imageUrl || c.imagePath || c.imagePrompt))
|
|
739
745
|
.map((c) => ({
|
|
740
746
|
optionName: o.name,
|
|
741
747
|
choiceName: c.name,
|
|
742
748
|
productName: pl.name,
|
|
743
749
|
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` },
|
|
750
|
+
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
751
|
})),
|
|
746
752
|
));
|
|
747
753
|
const flatChoiceSpecs = choiceSpecs.flat();
|
|
748
754
|
const resolved = await resolveItemImagesDetailed(ctx, [
|
|
749
755
|
...withNames.map((p, i) => ({
|
|
756
|
+
mediaId: products[i]?.imageMediaId,
|
|
750
757
|
url: products[i]?.imageUrl,
|
|
751
758
|
path: products[i]?.imagePath,
|
|
752
759
|
prompt: products[i]?.imagePrompt,
|
|
@@ -766,8 +773,8 @@ export async function setupStore(ctx, { products = [], categories = {}, category
|
|
|
766
773
|
.map((p, i) => {
|
|
767
774
|
if (!p.id) return null;
|
|
768
775
|
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 })),
|
|
776
|
+
...(files[i] ? [{ url: files[i].url, mediaId: files[i].existing ? files[i].id : undefined, altText: products[i]?.altText ?? p.slug }] : []),
|
|
777
|
+
...choiceLinks[i].map((c) => ({ url: c.file.url, mediaId: c.file.existing ? c.file.id : undefined, altText: c.altText })),
|
|
771
778
|
];
|
|
772
779
|
return images.length ? { id: p.id, images } : null;
|
|
773
780
|
})
|
|
@@ -782,7 +789,7 @@ export async function setupStore(ctx, { products = [], categories = {}, category
|
|
|
782
789
|
// it is reported here with the resolver's reason, or it ships text-only in silence.
|
|
783
790
|
withNames.forEach((p, i) => {
|
|
784
791
|
const src = products[i] ?? {};
|
|
785
|
-
if ((src.imageUrl || src.imagePath || src.imagePrompt) && !files[i]) {
|
|
792
|
+
if ((src.imageMediaId || src.imageUrl || src.imagePath || src.imagePrompt) && !files[i]) {
|
|
786
793
|
imageFailures.push({ name: p.name, error: resolved[i]?.error ?? "image did not resolve" });
|
|
787
794
|
}
|
|
788
795
|
});
|
|
@@ -807,7 +814,8 @@ export async function setupStore(ctx, { products = [], categories = {}, category
|
|
|
807
814
|
const links = choiceLinks[i];
|
|
808
815
|
if (!links.length || !p.id || !imagesAttached) continue;
|
|
809
816
|
try {
|
|
810
|
-
|
|
817
|
+
// a file attached by its Media Manager id is the gallery item of that id; an imported one is found by name
|
|
818
|
+
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
819
|
choiceImagesLinked += r.linked;
|
|
812
820
|
for (const m of r.missing) choiceImageFailures.push({ name: p.name, choice: m, error: "image not in the product gallery" });
|
|
813
821
|
} catch (e) {
|
|
@@ -847,7 +855,7 @@ export async function setupStore(ctx, { products = [], categories = {}, category
|
|
|
847
855
|
|
|
848
856
|
// ---- CLI entry ----------------------------------------------------------------------------------
|
|
849
857
|
|
|
850
|
-
const invokedDirectly =
|
|
858
|
+
const invokedDirectly = isMain(import.meta.url);
|
|
851
859
|
if (invokedDirectly) {
|
|
852
860
|
const planPath = process.argv[2];
|
|
853
861
|
if (!planPath) {
|
|
@@ -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."
|
|
@@ -408,7 +396,7 @@ Authoritative recipe for hand-authoring valid Ricos rich-content JSON (the richC
|
|
|
408
396
|
Creates new Wix sites from templates using account-level APIs. Covers template search, site creation, and publishing. Not for headless sites.
|
|
409
397
|
|
|
410
398
|
### [Create Headless Site](references/sites/create-headless-site.md)
|
|
411
|
-
Creates a Wix Headless site
|
|
399
|
+
Creates a Wix Headless website: a site in the user's Wix account whose frontend is files uploaded to Wix hosting, with the Wix business backend behind it through APIs. Creating, uploading, updating and connecting a backend are one flow, in Upload a Website or HTML Files.
|
|
412
400
|
|
|
413
401
|
### [Manage OAuth Apps](references/sites/manage-oauth-apps.md)
|
|
414
402
|
Create, read, update, and query OAuth apps for a Wix headless site. Each OAuth app's id is the client_id a frontend uses to mint anonymous visitor tokens and call Wix APIs.
|
|
@@ -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
|
|
|
@@ -426,7 +417,7 @@ Drive the Wix Site Import agent to migrate an existing store or site from anothe
|
|
|
426
417
|
"Builds direct links to the account-level sites pages on manage.wix.com — the My Sites list (all sites in the account) and each site's own dashboard. Pairs the site list with the Query Sites read API. 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."
|
|
427
418
|
|
|
428
419
|
### [Upload a Website or HTML Files](references/sites/upload-static-site.md)
|
|
429
|
-
|
|
420
|
+
Create and update a Wix Headless website by uploading its files — an index.html, a static build, a zip exported from an AI builder or any other tool, or pages you write for the user — as a live site in the user's Wix account. Covers every route: uploading with the user's identity (curl with a Wix CLI token, or the Wix MCP), publishing anonymously with a save link when you don't hold it, and the Wix Headless drop page; then updating the same site and URL, and connecting a Wix backend (stores, bookings, forms) through the headless skill. Use when the user wants to upload, publish, deploy or host HTML/CSS/JS as a new Wix site, their own or written for them, or to change a site published this way. Not for migrating a live store/site from another platform by URL or from CSV exports (use Site Import), not for adding HTML or custom code into an existing Wix site, and not for uploading images or documents to a site's media files.
|
|
430
421
|
|
|
431
422
|
---
|
|
432
423
|
|
|
@@ -454,7 +445,26 @@ Query and list products from a Wix Store using the Catalog V1 Query Products end
|
|
|
454
445
|
Manages pre-order settings for product variants using V3 Inventory API. Covers enabling/disabling pre-orders, setting messages, configuring limits, and handling trackQuantity requirements.
|
|
455
446
|
|
|
456
447
|
### [Update Product with Options (Catalog V3)](references/stores/update-product-with-options.md)
|
|
457
|
-
|
|
448
|
+
Start here for existing Catalog V3 product updates, including digital products that fail at add-to-cart with ITEM_NOT_FOUND_IN_CATALOG. Includes name lookup, Get Product, and PATCH in one flow, plus importing a supplied PDF and attaching it to the existing variant. Covers options, variant prices and SKUs, product visibility (hide/unhide through `visible`, never delete), description edits that preserve Rich Content, and revision-based updates. Read another recipe only for a field or operation this flow does not cover.
|
|
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 -->
|
|
@@ -92,7 +92,7 @@ curl -X POST \
|
|
|
92
92
|
|
|
93
93
|
Before installing, refer to the [Apps Created by Wix](https://dev.wix.com/docs/api-reference/articles/work-with-wix-apis/platform/about-apps-created-by-wix) documentation to find the correct `appDefId` for the app you want to install.
|
|
94
94
|
|
|
95
|
-
Some common apps:
|
|
95
|
+
Some common apps (`appDefId`; [List Installed Apps](list-installed-apps.md) shows which of them a site already has):
|
|
96
96
|
| App | appDefId |
|
|
97
97
|
|-----|----------|
|
|
98
98
|
| Wix Stores | `215238eb-22a5-4c36-9e7b-e7c08025e04e` |
|
|
@@ -102,6 +102,10 @@ Some common apps:
|
|
|
102
102
|
| Wix Multilingual | `14d84998-ae09-1abf-c6fc-3f3cace5bf19` |
|
|
103
103
|
| Wix Pricing Plans | `1522827f-c56c-a5c9-2ac9-00f9e6ae12d3` |
|
|
104
104
|
| Wix CMS | `e593b0bd-b783-45b8-97c2-873d42aacaf4` |
|
|
105
|
+
| Wix Forms | `225dd912-7dea-4738-8688-4b8c6955ffc2` |
|
|
106
|
+
| Wix Restaurants Menus | `b278a256-2757-4f19-9313-c05c783bec92` |
|
|
107
|
+
| Wix Restaurants Orders (online ordering) | `9a5d83fd-8570-482e-81ab-cfa88942ee60` |
|
|
108
|
+
| Wix Table Reservations | `f9c07de2-5341-40c6-b096-8eb39de391fb` |
|
|
105
109
|
|
|
106
110
|
### IMPORTANT NOTES:
|
|
107
111
|
- NEVER guess the `appDefId`. For Wix-built apps, use the table above. For any other app, resolve the ID using Step 0 (Search Market Listings).
|
|
@@ -8,7 +8,10 @@ This recipe guides you through listing all installed apps on a Wix site using th
|
|
|
8
8
|
|
|
9
9
|
## Prerequisites
|
|
10
10
|
|
|
11
|
-
-
|
|
11
|
+
- A token scoped to the site: the call takes no site parameter and answers for the site the token is
|
|
12
|
+
for. With the Wix CLI, `npx @wix/cli@latest token --site <siteId>`; through the Wix MCP, `ExecuteWixAPI`
|
|
13
|
+
with `scope: 'site'` and the `siteId`. An account token, with or without a `wix-site-id` header, answers
|
|
14
|
+
an empty list, which looks like a site with no apps.
|
|
12
15
|
|
|
13
16
|
## Required APIs
|
|
14
17
|
|
|
@@ -18,7 +21,10 @@ This recipe guides you through listing all installed apps on a Wix site using th
|
|
|
18
21
|
|
|
19
22
|
## Step 1: Query Installed Apps
|
|
20
23
|
|
|
21
|
-
Use the Get Installed Apps endpoint to retrieve all apps installed on a site.
|
|
24
|
+
Use the Get Installed Apps endpoint to retrieve all apps installed on a site. It returns every app
|
|
25
|
+
instance, including the dozens of platform apps every site carries, as ids only: the response has no
|
|
26
|
+
names; match them against the table in Step 2. [Read Account or Site Context](../sites/read-site-context.md)
|
|
27
|
+
has the names, but its list can lag an install by many minutes; this call is immediate.
|
|
22
28
|
|
|
23
29
|
**Endpoint**: `GET https://www.wixapis.com/apps-installer-service/v1/app-instances`
|
|
24
30
|
|
|
@@ -26,7 +32,7 @@ Use the Get Installed Apps endpoint to retrieve all apps installed on a site.
|
|
|
26
32
|
```bash
|
|
27
33
|
curl -X GET \
|
|
28
34
|
'https://www.wixapis.com/apps-installer-service/v1/app-instances' \
|
|
29
|
-
-H
|
|
35
|
+
-H "Authorization: $(npx @wix/cli@latest token --site <SITE_ID>)" \
|
|
30
36
|
-H 'Content-Type: application/json'
|
|
31
37
|
```
|
|
32
38
|
|
|
@@ -36,8 +42,7 @@ curl -X GET \
|
|
|
36
42
|
"appInstances": [
|
|
37
43
|
{
|
|
38
44
|
"id": "instance-id-1",
|
|
39
|
-
"appDefId": "
|
|
40
|
-
"version": "^0.0.0",
|
|
45
|
+
"appDefId": "215238eb-22a5-4c36-9e7b-e7c08025e04e",
|
|
41
46
|
"enabled": true,
|
|
42
47
|
"status": "UNKNOWN"
|
|
43
48
|
},
|
|
@@ -61,12 +66,17 @@ Match the `appDefId` values from the response against known Wix app IDs.
|
|
|
61
66
|
|
|
62
67
|
| App | appDefId |
|
|
63
68
|
|-----|----------|
|
|
64
|
-
| Wix Stores | `
|
|
69
|
+
| Wix Stores | `215238eb-22a5-4c36-9e7b-e7c08025e04e` |
|
|
70
|
+
| Wix Checkout & Orders (installed with Stores) | `1380b703-ce81-ff05-f115-39571d94dfcd` |
|
|
65
71
|
| Wix Bookings | `13d21c63-b5ec-5912-8397-c3a5ddb27a97` |
|
|
66
72
|
| Wix Blog | `14bcded7-0066-7c35-14d7-466cb3f09103` |
|
|
67
73
|
| Wix Events | `140603ad-af8d-84a5-2c80-a0f60cb47351` |
|
|
68
74
|
| Wix Pricing Plans | `1522827f-c56c-a5c9-2ac9-00f9e6ae12d3` |
|
|
69
|
-
| Wix
|
|
75
|
+
| Wix CMS (Wix Data) | `e593b0bd-b783-45b8-97c2-873d42aacaf4` |
|
|
76
|
+
| Wix Forms | `225dd912-7dea-4738-8688-4b8c6955ffc2` |
|
|
77
|
+
| Wix Restaurants Menus | `b278a256-2757-4f19-9313-c05c783bec92` |
|
|
78
|
+
| Wix Restaurants Orders (online ordering) | `9a5d83fd-8570-482e-81ab-cfa88942ee60` |
|
|
79
|
+
| Wix Table Reservations | `f9c07de2-5341-40c6-b096-8eb39de391fb` |
|
|
70
80
|
|
|
71
81
|
For a complete list, see [Apps Created by Wix](https://dev.wix.com/docs/api-reference/articles/work-with-wix-apis/platform/about-apps-created-by-wix).
|
|
72
82
|
|
|
@@ -111,8 +121,8 @@ If you receive `401 Unauthorized` or `403 Forbidden` errors from Wix APIs:
|
|
|
111
121
|
- Check that the token has `APP-MARKET.VIEW-INSTALLED-APP` permission
|
|
112
122
|
|
|
113
123
|
### Empty Response
|
|
114
|
-
-
|
|
115
|
-
|
|
124
|
+
- Every site carries dozens of platform app instances, so an empty list means the token was not scoped to
|
|
125
|
+
the site (an account token answers empty), not a site with no apps. Mint a site token and call again.
|
|
116
126
|
|
|
117
127
|
---
|
|
118
128
|
|