npx skills add ...
npx skills add wix/skills --skill wix-app
Build and review Wix CLI app extensions — dashboard pages, modals, plugins, menu plugins, custom element widgets, Editor React components, site plugins, embedded scripts, backend APIs, backend events, service plugins, data collections, and App Market readiness. Use when building ANY feature or extension for a Wix CLI app or preparing a Wix app for App Market review. Triggers on: add, build, create, implement, help me, dashboard, widget, plugin, backend, API, event, collection, embedded script, service plugin, Editor React component, checkout, shipping, tax, discount, SPI, CMS, schema, tracking, popup, admin panel, menu item, modal, validate, test, verify, register extension, App Market, app review, submission readiness.
npx skills add wix/skills --skill wix-app
Helps build extensions for Wix CLI applications. Covers all extension types: dashboard pages, modals, plugins, menu plugins, custom element widgets, Editor React components, site plugins, embedded scripts, backend APIs, events, service plugins, and data collections.
Scaffolding is owned by the Wix CLI. Use wix generate --params for every supported type. It generates files and, where applicable, builder boilerplate, UUIDs, and src/extensions.ts registration. HTTP endpoints are discovered from files and need no registration. This skill provides the decision logic, API guidance, configuration semantics, and business-logic patterns that fill in the generated stubs.
Before reporting completion to the user, ALL boxes MUST be checked:
Dashboard page UI: Translated the prompt into a workflow before choosing components — what the user must understand, focus on, investigate, act on, and see confirmed. See UX Success Model, and Collection Toolkit for which component serves each need.
SummaryBar) — unless the prompt asks for a single record. "How many, and which ones need me" is why someone opens a dashboard.SidePanel to inspect without losing the filtered list, or EntityPage for deep or shareable detail — unless the prompt is explicitly a report or an export.filters and read inside fetchData. Filter UI that never narrows the rows is a defect that looks like a feature.A filtered table with none of the three is what gets built when nobody states the requirement — it is the most common way a generated dashboard disappoints.
🛑 Patterns Docs Gate (MANDATORY for any dashboard page UI): Read WIX_PATTERNS_DOCS.md, then Read dist/dts-bundle/index.json for the component inventory, upgrading @wix/patterns if that file is missing. The patterns docs are only ever read directly from those two published files — never by hand from anywhere else in node_modules.
🛑 Component Docs Gate (MANDATORY, dashboard UI only): Printed the doc for every patterns component, hook, and state type you are about to write — Read its file from dist/docs/index.json, and Read its bundled .d.ts from dist/dts-bundle/index.json for any patterns type you name in your own code. The inventory gives the name; the doc gives the props and the import path. Name what you read before the first line of JSX.
wix generate --params@wix/patterns BEFORE reaching for @wix/design-system — and never hand-rolled a component either library already provides. See Component Selection Order.wix-design-system skill ONLY before editing the first .tsx/.jsx file that imports @wix/design-system. Skip for backend-only or data-only extensions.@wix/design-system/styles.global.css in the main component entry file (page.tsx, modal .tsx, etc.) — not child/tab/helper files.🛑 STOP: If any box is unchecked, do NOT proceed to the next step.
| ❌ WRONG | ✅ CORRECT |
|---|---|
| Creating a CMS Data Collection for data an existing Wix app already owns (orders, products, bookings, contacts…), or deciding "no SDK exists" without a single MCP search | Use the domain's SDK module per the SDK-First Rule |
| Hand-writing builder files, folders, UUIDs, or extension registration | Run wix generate --params — it owns scaffolding |
| Implementing without reading the extension reference | Always read the relevant reference file first |
| Using MCP discovery without checking refs | Check reference files first |
| Reporting done without validation | Always run validation at the end |
| Letting manual action items get buried | Aggregate all manual steps at the very end |
| Building a dashboard page's collection UI (table, grid, filters, sort, bulk actions, page header) out of raw WDS or hand-written React | Use the @wix/patterns equivalent — it exists (see Component Selection Order) |
Guessing a @wix/patterns or WDS component/prop name from memory | Look it up: patterns via dist/docs/index.json + dist/dts-bundle/index.json (see WIX_PATTERNS_DOCS.md), WDS via the wix-design-system skill |
| Hand-rolling a component (empty state, badge, tooltip, pagination) that one of the two libraries already ships | Search patterns first, then WDS; only build custom when both genuinely lack it |
Calling auth.elevate from a site or editor extension, or calling an admin-only method there | Put the call in a backend extension and elevate there — elevation only works in backend code |
Elevating a session-resolved current*/my* method (currentCartV2.*, members.getMyMember) to "be safe" | Call it directly — elevating replaces the caller's session identity and retargets the operation |
Elevating a read the platform filters by caller (members.getMember/queryMembers, items.*, catalog) to "make it return more" | Call it directly — elevating removes the filter and returns data the visitor was never entitled to |
What are you trying to build?
Who will see it?
Where will it appear?
@wix/patterns + @wix/design-system (see Component Selection Order)@wix/patterns first, @wix/design-system for whatever patterns does not cover (see Component Selection Order). Need popup/form? → Dashboard Modal. Extending Wix app dashboard with a visual widget? → Dashboard Plugin. Adding a menu item to a Wix app dashboard's more-actions or bulk-actions menu? → Dashboard Menu Plugin. Modal constraint: Dashboard Pages cannot use <Modal />; use a separate Dashboard Modal extension and dashboard.openModal().APP_TOOLS declaration + TOOLS_PROVIDER_CONFIG handler — see APP_TOOLS.md). After event (webhooks/sync)? → Backend Event Extension. Custom HTTP endpoints? → Backend API. Need CMS collections for app-owned data? → Data Collection (see SDK-First Rule).Dashboard pages at Wix are built from two libraries. For every UI element, resolve in this order and stop at the first hit. Never skip a step, and never decide a component is missing from memory — check.
@wix/patterns — page structure and data collectionsPatterns owns the page shell and everything collection-shaped. These concepts are patterns' territory — if you need one, look it up there first rather than assembling it from WDS parts:
| Need | Look for |
|---|---|
| Page shell, header, content area, sticky footer | CollectionPage, EntityPage, SettingsPage (+ their .Header / .Content sub-parts) |
| Table, grid, table↔grid switch, folder views | Table, Grid, TableGridSwitch, TableFolders, GridFolders |
| Collection state — paging, sorting, selection, loading | useTableCollection() and its sibling hooks (one per collection type) |
| Filters, search, sorting, view presets/tabs | the collection's filter and view APIs |
| Row actions, bulk actions, drag-and-drop | the collection's feature APIs |
| Multiple pages inside one extension | PatternsReactRouter, PatternsReactRoute, usePatternsNavigate |
| Add / edit / view one item from a collection | EntityPage + useEntityPage (fetch + save + validation), reached with usePatternsNavigate().navigateToEntityPage. Form state via useForm / useController from @wix/patterns/form (useController, never register). Not a dashboard modal — see Entity create and edit |
| Overlays tied to a collection (item picker, bulk-action confirm) | PickerModal / usePickerModal, bulkActionModal |
Looking a component up is two direct file reads — no script, never node_modules browsed by hand. Resolve the installed package root once per session (Prerequisites), then reuse it. Start with what exists:
Then read the doc for each name you plan to use, including the state types they cross-reference — Read <pkgRoot>/dist/docs/index.json to find the file, then Read it directly. Props and import paths exist only there, and patterns is not a flat namespace — @wix/patterns/page, /provider, /form — so an import from memory is a guess.
Each doc gives its import line, props table, and an example. For a TypeScript type rather than a component — Filter<T>, RangeItem<T>, CursorQuery, a ...Props interface — look it up the same way in dist/dts-bundle/index.json instead and Read the .d.ts at exactly the file path it gives; it's already fully resolved, which is what keeps a deep @wix/bex-core/dist/types/... path out of the tree.
If dist/dts-bundle/index.json doesn't exist, the installed @wix/patterns predates this feature — upgrade it, then re-check. See Prerequisites. A missing index is not a reason to fall through to step 2; it means the lookup has not happened yet. Falling through here is the single most common way a dashboard page ends up built entirely from WDS.
Full lookup workflow, provider selection, and the provider/page separation rule: WIX_PATTERNS_DOCS.md.
@wix/design-system — everything inside the shellThe leaf-level UI patterns does not own: inputs, buttons, form fields, text, layout primitives, cards, badges, tooltips, toasts, icons. Pick the component by lookup, not recall — invoke the wix-design-system skill, whose bundled helper reads the installed package:
Compose from WDS layout primitives (Box, Card, Text). Do not add a third UI dependency, and do not restyle patterns or WDS internals.
PickerModal / usePickerModal and bulkActionModal cover collection-related overlays. "It's a modal" is not a reason to leave patterns.Any dialog that creates, updates, or displays one record listed by a collection page is an EntityPage — not a Dashboard Modal. This holds whether the records come from a CMS collection or an existing Wix app's SDK. A create / "add new" form is included: it writes the record, so it is an EntityPage even though nothing is being edited yet. "It's a simple data-entry dialog, not an entity edit" is the wrong reading of this rule.
A page that lists nothing — a settings page, an embedded-script config page — carries no EntityPage obligation. But "I built the list without @wix/patterns" is not an exception: a page that lists records should be a CollectionPage.
This is the most common place the selection order gets dropped: the collection gets built correctly with patterns, then the "add item" flow is hand-built as a WDS form in a modal.
The documented flow:
navigateToEntityPage({ path, entity }) from usePatternsNavigate(). (The patterns docs give this exact use case — "navigate to an entity page on an action cell click on a collection page" — and it renders the entity header immediately, before the fetch resolves.) On the create route there is no record to pass: omit entity and see ENTITY_PAGE_TOOLKIT.md § Create route, which is what the whole "add new" flow turns on.PatternsReactRoute inside PatternsReactRouter.useEntityPage({ fetch, onSave }) owns fetching, saving, validation, dirty state, loading skeletons, and error states. Form state comes from useForm / useController in @wix/patterns/form. The call itself — both generics, what onSave receives, which params exist — is in ENTITY_PAGE_TOOLKIT.md.EntityPage.Header, EntityPage.MainContent, EntityPage.AdditionalContent, and EntityPage.Card. WDS goes inside those cards — FormField, Input, Text for the individual fields.Use a Dashboard Modal for dialogs that neither write nor display a listed record: a delete or discard confirmation, an unsaved-changes prompt, an informational notice, or any dialog on a page that lists nothing. Dialog size and field count are not exceptions — a one-field create form over a listed record is still an EntityPage. Reach for a modal because the interaction persists nothing, never because "the form should open in a modal."
| Extension Type | Category | extensionType (for wix generate --params) | Reference File |
|---|---|---|---|
| Dashboard Page | Dashboard | DASHBOARD_PAGE | DASHBOARD_PAGE.md |
| Dashboard Modal | Dashboard | DASHBOARD_MODAL | DASHBOARD_MODAL.md |
| Dashboard Plugin | Dashboard | DASHBOARD_PLUGIN | DASHBOARD_PLUGIN.md |
| Dashboard Menu Plugin | Dashboard | DASHBOARD_MENU_PLUGIN | DASHBOARD_MENU_PLUGIN.md |
| Service Plugin | Backend | SERVICE_PLUGIN | SERVICE_PLUGIN.md |
| App Tools (AI assistant tools) | Backend | APP_TOOLS, then SERVICE_PLUGIN with pluginType: TOOLS_PROVIDER_CONFIG | APP_TOOLS.md |
| Backend Event Extension | Backend | EVENT | BACKEND_EVENT.md |
| Backend API (HTTP endpoint) | Backend | HTTP_ENDPOINT | BACKEND_API.md |
| Data Collection | Backend | DATA_COLLECTION | DATA_COLLECTION.md |
| Editor React component | Site | EDITOR_REACT_COMPONENT | EDITOR_REACT_COMPONENT.md |
| Custom element widget | Site | CUSTOM_ELEMENT | CUSTOM_ELEMENT_WIDGET.md |
| Site Plugin | Site | SITE_PLUGIN | SITE_PLUGIN.md |
| Embedded Script | Site | EMBEDDED_SCRIPT | EMBEDDED_SCRIPT.md |
Key constraints:
<Modal />; use a separate Dashboard Modal and dashboard.openModal().HTTP endpoints: Generate with
extensionType: "HTTP_ENDPOINT"(notBACKEND_API). See BACKEND_API.md for project-specific directories, handler types, and frontend URLs.
| Custom element widget vs Editor React component vs Site Plugin | Dashboard Page vs Modal | Service Plugin vs Event |
|---|---|---|
| Custom element widget: standalone interactive component. Editor React component: React with editor manifest (CSS/data/elements). Plugin: fixed slot in Wix app page. | Page: full page. Modal: overlay; use for popups. | Service: during flow. Event: after event. |
| Topic | Reference |
|---|---|
| Code Quality Requirements (applies to all generated code) | CODE_QUALITY.md |
| Extension Registration | EXTENSION_REGISTRATION.md |
| App Validation | APP_VALIDATION.md |
| App Market Review | APP_MARKET_REVIEW.md |
| App Identifiers (Namespace, Code ID) | APP_IDENTIFIERS.md |
| Wix Stores Versioning (V1/V3) | STORES_VERSIONING.md |
| Official Documentation Links | DOCUMENTATION.md |
| Wix Patterns Dashboard Pages | WIX_PATTERNS_DOCS.md |
| Dashboard UX Success Model (what a good dashboard contains) | UX_SUCCESS_MODEL.md |
| Dashboard Collection Toolkit (which component per user need) | COLLECTION_TOOLKIT.md |
| Reading a patterns bundle or doc file the index names | PATTERNS_BUNDLE_READING.md |
CRITICAL: Data owned by an existing Wix business app is read and written through that app's SDK module — NEVER modeled as a new CMS Data Collection. A custom collection for such data starts empty and stays disconnected from the real records (e.g., a "refunds dashboard" built on CMS shows an empty state while refunded orders exist in Wix eCommerce).
Entity → SDK module map (find the entity the user mentioned, use that package):
| Entity | SDK package |
|---|---|
| orders / carts / checkout / refund records / fulfillments | @wix/ecom — orders live here regardless of vertical |
| products / inventory / catalog | @wix/stores — ⚠️ V1/V3 check, see STORES_VERSIONING.md |
| payments / refunds / disputes | @wix/payments |
| invoices / payment links / receipts | @wix/get-paid |
| gift cards | @wix/gift-vouchers |
| coupons | @wix/marketing |
| pricing plans / subscriptions | @wix/pricing-plans |
| bookings / services / staff / time slots | @wix/bookings |
| calendar events / schedules | @wix/calendar |
| table reservations | @wix/table-reservations |
| restaurant menus / online orders | @wix/restaurants |
| blog posts | @wix/blog |
| site events / tickets / RSVPs | @wix/events |
| reviews | @wix/reviews |
| comments | @wix/comments |
| groups | @wix/groups |
| online programs | @wix/online-programs |
| donations | @wix/donations |
| portfolio | @wix/portfolio |
| media files | @wix/media |
| contacts / labels / tasks | @wix/crm |
| members | @wix/members |
| inbox conversations | @wix/inbox |
| forms / form submissions | @wix/forms |
| loyalty points / rewards | @wix/loyalty |
| email marketing | @wix/email-marketing |
| notifications | @wix/notifications |
| analytics | @wix/analytics-data |
| automations | @wix/automations |
| SEO tags / redirects | @wix/seo |
| site search | @wix/search |
| secrets | @wix/secrets |
| locations / site properties | @wix/business-tools |
| app instances | @wix/app-management |
If the entity isn't listed or you're unsure, run SearchWixSDKDocumentation for it — never conclude CMS with zero MCP calls. CMS is only for data your app itself introduces (configuration, rules, app-specific records) that no Wix app manages.
CRITICAL: Data collections are often needed implicitly — don't wait for the user to explicitly say "create a CMS collection." Infer the need automatically.
⚠️ Apply the SDK-First Rule first — the indicators below only apply to data your app itself owns, not to entities a Wix app already manages.
Skip this section if the user provides a collection ID directly (e.g., an existing site-level collection). In that case, use the provided ID as-is — no Data Collection extension or namespace scoping needed.
Always include a Data Collection extension when ANY of these are true:
| Indicator | Example |
|---|---|
| User mentions saving/storing/persisting app-specific data | "save the fee amount", "store product recommendations" |
| A dashboard page will manage (CRUD) domain entities | "dashboard to manage fees", "admin page to edit rules" |
| A service plugin reads app-configured data at runtime | "fetch fee rules at checkout", "look up shipping rates" |
| User mentions "dedicated database/collection" | "save in a dedicated database collection" |
| Multiple extensions reference the same custom data | Dashboard manages fees + service plugin reads fees |
Why this matters: Without the Data Collection extension, the collection won't be created when the app is installed, the Wix Data APIs may not work (code editor not enabled), and collection IDs won't be properly scoped to the app namespace.
If data collection is inferred, follow the App Namespace Requirement to obtain the namespace before proceeding.
When creating a Data Collection, you MUST ask the user for their app namespace from Wix Dev Center. This is a required parameter that must be obtained from the user's Dev Center dashboard and cannot be recommended or guessed.
If the user hasn't provided their app namespace, read APP_IDENTIFIERS.md and give the user the instructions to obtain it.
Applies ONLY when a Data Collection extension is being created. If the user provides a collection ID directly, use it as-is — no namespace scoping, no Data Collection extension needed.
When a Data Collection is created alongside other extensions that reference the same collections:
idSuffix for each collection (the Data Collection reference documents the full ID format)<app-namespace>/<idSuffix>) in all extensions that reference the collection via Wix Data API callsApplies when ANY Wix Stores API is used (products, inventory, orders, etc.):
getCatalogVersion()productsV3 (V3) vs products (V1)This is non-negotiable — V1 and V3 are NOT backwards compatible.
Applies whenever an extension calls a Wix SDK method. Decide where the call runs before writing it.
Who the extension runs as decides everything below — the Category column in Extension Types Reference Table tells you which one you have:
auth.elevate works only in backend code. In a site, editor, or dashboard extension it doesn't work at all.
Default: call the SDK directly from the extension. Routing a call that didn't need it is not a harmless extra hop — it is how working features break. Sort by who the call acts for, never by its scope name:
currentCartV2.*, cartV2.placeOrder, bookings.createBooking, members.getMyMember, and anything else operating on "my" or "the current" entity. These resolve the actor from the caller's session, so elevating runs them as the app and detaches the result from the person who asked — an order with no buyer, a booking with no attendee.items.* follows the collection's dataPermissions (scaffolded default: itemRead: 'ANYONE', writes 'PRIVILEGED' — fix writes with permissions, not routing; see DATA_COLLECTION.md). Catalog reads return base fields to anyone, withholding MERCHANT_DATA and non-visible products unless the app holds SCOPE.STORES.PRODUCT_READ_ADMIN. members.getMember/queryMembers withhold PRIVATE members from visitor and member callers.Route out only when the method acts on the business as a whole, which a visitor or member genuinely cannot do: archiveLocation, queryLocations, catalog and inventory writes, bookings.confirmBooking, order management. When the method's docs show the call elevated, route it out and elevate there — from any host, dashboard included, because auth.elevate only works in backend code, so the endpoint is the only place the documented pattern can run.
When you're unsure, call it directly and let it fail. A method a site extension may not call returns a permission error you see immediately; a method wrongly routed and elevated succeeds and silently returns the wrong data or acts for the wrong person. Some method pages carry a prose note that settles it — get-my-member: "This method requires visitor or member authentication." Authoritative when present, but only a minority of pages have one, so its absence decides nothing.
Two signals never settle it: the scope name — locations.queryLocations is SCOPE.DC-MULTILOCATION.READ-LOCATIONS yet admin-only, while currentCartV2.addLineItemsToCurrentCart carries SCOPE.ECOM.MANAGE-ADMIN yet is visitor-callable and breaks if elevated — and the SDK schema line's client prefix, which varies by docs channel for the same method, so carries nothing and isn't worth re-deriving.
Routing out means a Backend API endpoint that elevates and is reached with httpClient.fetchWithAuth(). Elevation bypasses Wix's permission check, so the endpoint must re-check the caller itself — see Identity and Authorization for what each host can actually verify, and why an owner-only operation belongs in a dashboard extension instead.
Add the scope in Dev Center → Permissions (it isn't declared in a repo file) and report it under Manual Steps Required.
Applies when a user wants to submit their app to the Wix App Market, list it publicly, prepare for App Market review, audit decline risk, or fix App Market review feedback. Not needed for private apps or routine version releases.
Read APP_MARKET_REVIEW.md — it contains the full technical checklist, implementation notes with Wix doc links, and the review taxonomy IDs for traceability.
Only ask for configuration values when absolutely necessary for the implementation to proceed. If a value can be configured later or added as a manual step, don't block on it.
If unclear on approach (placement, visibility, configuration, integration), ask clarifying questions. If the answer could change the extension type, wait for the response before proceeding. Otherwise, proceed with the best-fit extension type.
Use the Extension Types Reference Table and decision content above. State extension type and brief reasoning (placement, functionality, integration).
Workflow: Read extension reference → Check API references → Use MCP only for gaps.
references/backend-event/COMMON-EVENTS.mdreferences/data-collection/WIX_DATA.mdreferences/dashboard-page/DASHBOARD_API.mdreferences/SERVICE_PLUGIN.md together with the matching references/service-plugin/<NAME>.md leafreferences/APP_TOOLS.md; it links to references/app-tools/TOOLS.md (declaration) and references/service-plugin/TOOLS_PROVIDER.md (handler)Platform APIs (never discover - in references):
Vertical APIs (discover if needed):
@wix/* package in the SDK-First Rule module map first, then discover methods via MCPDecision table:
| User Requirement | Check References / Discovery Needed? | Reason / Reference File |
|---|---|---|
| "Display store products" | ✅ YES (MCP discovery) | Wix Stores API — include Stores Versioning reference |
| "Dashboard for orders / refunds" | ✅ YES (MCP discovery) | Wix eCommerce API (@wix/ecom) — NEVER a CMS collection |
| "Show booking calendar" | ✅ YES (MCP discovery) | Wix Bookings API not in reference files |
| "Send emails to users" | ✅ YES (MCP discovery) | Wix Triggered Emails not in reference files |
| "Get member info" | ✅ YES (MCP discovery) | Wix Members API not in reference files |
| "Listen for cart events" | Check COMMON-EVENTS.md | MCP discovery only if event missing in reference |
| "Store data in collection" | WIX_DATA.md ✅ Found | ❌ Skip discovery (covered by reference) |
| "Create CMS collections for my app" | Data Collection reference | ❌ Skip discovery (covered by dedicated reference) |
| "Show dashboard toast" | DASHBOARD_API.md ✅ Found | ❌ Skip discovery |
| "Show toast / navigate" | DASHBOARD_API.md ✅ Found | ❌ Skip discovery |
| "UI only (forms, inputs)" | N/A (no external API) | ❌ Skip discovery |
| "Settings page with form inputs" | N/A (UI only, no external API) | ❌ Skip discovery |
| "Dashboard page with local state" | N/A (no external API) | ❌ Skip discovery |
MCP Tools for discovery (when needed):
SearchWixSDKDocumentation - SDK methods and APIs (Always use maxResults: 5)ReadFullDocsMethodSchema - Full type schema for a specific SDK method (parameters, return type, permissions)ReadFullDocsArticle - Prose guides and conceptual articles only (not for SDK method signatures)For each supported type, including HTTP endpoints, run npx wix generate --params '<json>'. The command returns {"success":true,"extensionType":"...","newFiles":[...]} on success.
If the command fails because of unknown or invalid params, run npx wix schema generate --type <extensionType> to print the JSON Schema for that extension type, fix the --params payload, and retry. Do not fall back to manual scaffolding. The one exception is HTTP_ENDPOINT on a CLI older than 1.1.243, which predates the generator but still supports the extension: create the endpoint file by hand as described in BACKEND_API.md.
What the CLI does automatically:
src/extensions.ts with the import and .use() callsrc/extensions.tsHTTP endpoints: Run npx wix generate --params '{"extensionType":"HTTP_ENDPOINT","name":"hello"}', then implement the handler in the returned file. Follow BACKEND_API.md; if the route does not respond, its troubleshooting hint shows how to confirm discovery from the build output.
Open every path returned in newFiles and replace stubbed handler bodies / UI / queries with the user's actual logic, guided by the extension reference file's API and configuration sections.
wix-design-system skill before editing your first .tsx/.jsx file that imports @wix/design-system. Do NOT invoke it preemptively for backend-only or data-only jobs — it adds large content to context that you won't use.import "@wix/design-system/styles.global.css"; in the main component entry file (page.tsx, modal .tsx, etc.) — not in child/tab/helper files.idSuffix (case-sensitive). If idSuffix is "product-recommendations", use <app-namespace>/product-recommendations NOT productRecommendations.After all implementation is complete, you MUST run validation. See APP_VALIDATION.md for the complete validation workflow:
npx tsc --noEmit -p .)npx wix build)npx wix preview)Do NOT report completion to the user until validation passes.
If validation fails, fix the errors and re-validate until it passes.
Only after validation passes, provide a concise summary section at the top of your response:
Present any manual steps the user must perform (e.g., configuring settings in the Wix dashboard, enabling permissions, setting up external services).
Format:
wix generate --params updates src/extensions.ts automatically for registered extensions. HTTP endpoints require no import or .use() call; the runtime discovers their files. For background, troubleshooting, and the manual recovery pattern when src/extensions.ts drifts, see EXTENSION_REGISTRATION.md.
Execute these steps sequentially after all implementation is complete. See APP_VALIDATION.md for the complete guide.
npx tsc --noEmit -p .npx wix buildnpx wix previewStop and report errors if any step fails. Check .wix/debug.log on failures.
wix schema generate --type <extensionType> when wix generate --params fails — don't pre-fetch it@wix/patterns docs before building anything collection- or page-shaped (see Component Selection Order)For links to official Wix CLI documentation for all extension types, see DOCUMENTATION.md.