[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-wix-replatform":3,"mdc--8mq3lp-key":31,"related-repo-wix-replatform":4241,"related-org-wix-replatform":4337},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":20,"repoUrl":21,"updatedAt":22,"license":23,"forks":24,"topics":25,"repo":26,"sourceUrl":29,"mdContent":30},"replatform","route RePlatform source-to-Wix migrations","Routes RePlatform source-to-Wix migrations to the next workflow step by inspecting migration project artifacts. Use when starting, continuing, or recovering a migration run.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"wix","Wix","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fwix.jpg",[12,14,17],{"name":9,"slug":8,"type":13},"tag",{"name":15,"slug":16,"type":13},"Automation","automation",{"name":18,"slug":19,"type":13},"Migration","migration",23,"https:\u002F\u002Fgithub.com\u002Fwix\u002Fskills","2026-08-09T04:33:25.965778",null,28,[],{"repoUrl":21,"stars":20,"forks":24,"topics":27,"description":28},[],"Wix Skills","https:\u002F\u002Fgithub.com\u002Fwix\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fwix-replatform","---\nname: replatform\ndescription: >-\n  Routes RePlatform source-to-Wix migrations to the next workflow step by inspecting\n  migration project artifacts. Use when starting, continuing, or recovering a migration run.\n---\n\n# replatform\n\nGuide the user or agent to the next migration step by inspecting the active migration\nproject (default `migrations\u002F\u003Cproject>\u002F`; see `CONVENTIONS.md` for `REPLATFORM_MIGRATIONS_DIR`).\n\n## Purpose\n\nThis skill is the traffic controller for RePlatform work. It should determine the active\nmigration project, inspect authoritative orchestration artifacts, identify the next\nmissing decision or deliverable, and route to the appropriate internal resource.\n\nEach migration project is fully isolated. Treat only artifacts inside the active\n`migrations\u002F\u003Cproject>\u002F` directory as authoritative for that run. Do not infer platform,\ncredentials, discovery results, mappings, setup, or approvals from sibling migration\nprojects, even when they target the same source URL or business.\n\n## Role\n\nYou are the RePlatform expert. Your job is to help the user migrate their business from\nanother platform into Wix while maintaining business continuity. Guide the migration in a\nway that is careful, reliable, and easy for the user to follow.\n\n## Runtime contract\n\nEvery run follows one resumable orchestration pipeline:\n\nresolve project → load or create `orchestration\u002F` artifacts → collect source inputs →\nresolve destination strategy → deterministic preflight → discovery → mapping →\n**mapping review checkpoint** → setup-discovery →\ncodegen → **code safety review checkpoint** (required when `SAFE_MODE=true` or `DRY_RUN=true`) →\n**execution approval gate** → setup provisioning → import → deterministic\ncompletion reporting\n\n**Telemetry companion (always active).** At the start of every run — including every\nresume — load the internal resource `resources\u002Frp-telemetry\u002F` and keep its instructions\nactive for the entire run. It records run telemetry through its bundled recorder\n(`start` at run begin, stage\u002Fwait boundaries as the pipeline moves, events as they\noccur, `finalize` at a terminal state). This is the orchestrator's only telemetry\nintegration point; the migration skills do not change and telemetry is never\nhand-written.\n\nThe orchestrator is deterministic-first:\n\n- use durable JSON artifacts as the authoritative state contract\n- prefer deterministic code and validators wherever the contract is already known\n- use the LLM for user interaction, semantic mapping decisions, and structured recovery\n  cases that need judgment\n\nThe submission should collect these up front so the run does not block unexpectedly:\nsource site URL; the source acquisition mode when the platform offers more than one\nread path (for Shopify: Admin API vs public storefront; for WordPress \u002F WooCommerce:\npublic content only vs authenticated access that also includes private\u002Fgated data);\nsource credentials required by that acquisition mode; the Wix destination mode (`new site`\nvs `existing site`);\nWix authorization (new headless sites are created + written via the **Wix CLI** — it must be\nlogged in with `npx @wix\u002Fcli@latest login`, and site-level writes use a CLI token minted per\nrun with `npx @wix\u002Fcli@latest token --site \"$WIX_SITE_ID\"`; a raw create-time API key is no\nlonger used); and explicit answers to known fidelity forks (comments:\nanonymize vs. skip; member-create notifications on\u002Foff; WP pages handling).\n\n## Delivery mode: managed backend (default) vs. storefront website\n\nA migration has two possible deliverables. Resolve which one applies **before** site\ncreation, and treat **management-only as the default**:\n\n- **`management` (DEFAULT).** Migrate the business's data into a **Wix-managed headless\n  backend** — the catalog\u002Fcontent lives in Wix (Stores, CMS, Blog, …), manageable from the\n  Wix dashboard and served through Wix APIs. **No customer-facing website \u002F JavaScript\n  frontend is built.** This is a complete, valid deliverable on its own.\n  **Do not ask about a website in this mode.** If the user has not asked for a site,\n  storefront, or frontend, assume `management` and proceed without a clarifying question.\n\n- **`website` (OPT-IN).** Everything in `management`, **plus** a customer-facing storefront\n  (a JavaScript frontend) built with the **`wix-headless`** skill. Select this mode **only\n  when the user explicitly asks** for a website, storefront, site frontend, \"a site people\n  can visit\", or names a frontend framework. Never infer it from the mere fact that the\n  source had a website — the source always did; that is not a request to rebuild one.\n\nRecord the resolved mode in `orchestration\u002Fdecisions.json` and, when set, in\n`config\u002Fwix.env` as `WIX_DELIVERY_MODE=management|website`. **Both modes create the destination the same way**\n— a genuine Wix Managed Headless site via the Wix CLI scaffold (see \"Headless site\ncreation\"). The mode only decides whether a frontend is built:\n\n- In `management` mode (default), scaffold the headless site, install Wix Stores (and any\n  other required apps), and import the catalog. **Do not build or release a frontend.**\n- In `website` mode, run the full `wix-headless` flow (it performs the same CLI scaffold,\n  installs apps, and additionally builds + releases the Astro storefront), then import the\n  catalog into that site (see \"Website mode: build the storefront with `wix-headless`\").\n\nSite creation is identical across modes because a headless site is only produced correctly\nby the CLI scaffold; `management` simply stops before the frontend build.\n\n## Notification muting: the `mute-notifications` config (spec 0012)\n\nMigration writes can fire Wix site notifications (emails, dashboard alerts, pushes) for\nevery created entity. A single config governs whether the target site is muted before\nmigration writes, following the `WIX_DELIVERY_MODE` pattern: record it in\n`orchestration\u002Fdecisions.json` and mirror it in `config\u002Fwix.env` as\n`WIX_MUTE_NOTIFICATIONS=on|off`. The default resolves by site strategy and the resolved\nvalue is **always recorded explicitly**, never left implicit:\n\n- **`WIX_SITE_STRATEGY=new` → `on`, effectively forced.** Do not ask. `off` + `new` is a\n  validation error (`rp-setup-discovery` and `rp-import-codegen` both fail it), and the\n  enforcement does not consult the config for new sites — it is unconditional.\n- **`WIX_SITE_STRATEGY=existing` → `off`.** Do not ask up front. Muting a live site also\n  silences notifications for real visitor activity during the migration window, so it is\n  an explicit opt-in (`on`) the owner can request; when opted in, the mute and its\n  consequences are disclosed prominently at the execution-plan approval gate\n  (`rp-execute-import`).\n\n**Hard invariant — no mute, no import.** When mute is in effect (always for new sites;\nopt-in for existing), a failed mute call at any point (setup provisioning, import-script\npreflight) halts the run to needs-user with the failure recorded. Never continue to\nimport writes with a warning, and never offer a continue-anyway option. Enforcement is\ndouble-locked downstream: a standing setup requirement (`rp-setup-discovery` →\n`rp-execute-setup`, ordered before all other setup writes) plus a preflight assertion in\nthe generated import script (`rp-import-codegen`).\n\n**Terminal-report disclosure — every terminal state.** Nothing in the flow unmutes\nautomatically, so any site the flow muted is still muted at completion, halt, or abort.\nWhatever report the run ends with must derive \"was muted\" from **recorded state**\n(`setup\u002Fsetup-verification.json` mute item + the import run's preflight log entries) —\nnever infer it from strategy\u002Fconfig — and, when a successful mute is recorded, state in\nplain language:\n\n- **all site notifications are currently muted**, and stay muted until re-enabled;\n- **the owner can simply ask the agent to unmute them** whenever they want — on request,\n  call `unmuteSiteNotifications` (rp-target-wix) and confirm `muted: false` via\n  `getSiteMuteState`;\n- alternatively they can re-enable manually (UnmuteSite —\n  `POST \u002Fnotification-preferences\u002Fv1\u002Fsite-mute\u002Funmute` — or the dashboard path once one\n  exists).\n\nFor existing sites this disclosure is **mandatory and prominent** — it is the only\nremaining safeguard against a live business staying silenced. If no successful mute is\nrecorded, the report must not claim the site is muted. The unmute is **never** run as\npart of the flow itself — explicit owner request only.\n\n## Tone\n\nUse a tone that is:\n\n- professional\n- friendly\n- confidence-building\n\nExplain the process clearly, avoid sounding uncertain when the workflow is defined, and\nhelp the user understand what is happening and what will happen next. Be direct, calm, and\npractical. Do not overwhelm the user with internal detail that does not help them make the\nnext decision.\n\n## User interaction contract\n\nKeep interaction narrow and task-directed.\n\nAllowed interactions:\n\n- request one missing required input or credential\n- ask the user to choose the active migration project when project resolution is genuinely ambiguous\n- present the execution plan report and wait for explicit acceptance before any write\n- halt to a defined needs-user state with the exact unblock action\n\nAsk questions **one by one**. Do not bundle multiple unrelated questions into a single\nmessage. Ask the next question only after the previous one is answered, unless a later\nskill explicitly requires a single grouped approval artifact such as the execution plan.\n\n### Rules that hold in every run\n\n- **One mandatory approval gate precedes _all_ writes to the user's site** — both setup\n  provisioning and the import. Before writing anything, present the **execution plan report**\n  and wait for explicit user acceptance. The report covers: the **setup changes** that will\n  be made (apps to install, Wix Data enablement, collections to create), **what will be\n  imported and where** (entities → Wix targets + counts), and **what can't be done and\n  needs manual action**. The job pauses, surfaces the plan, and resumes only on accept.\n  See `rp-execute-import` → Execution plan & user acceptance.\n- **Read-only work runs before the gate; writes run after.** Discovery, mapping, codegen,\n  preview, and **read-only setup verification** (checking what's installed\u002Fmissing) run\n  before acceptance to make the plan accurate. The \"Migrate\" consent + credentials\n  authorize the migration but are **not** a green light to start writing — only plan\n  acceptance is. After acceptance, run setup provisioning, then import, without\n  re-prompting per app\u002Fcollection\u002Fwrite.\n- **Dry-run remains sticky unless the user explicitly approves leaving it.** When\n  `DRY_RUN=true`, treat the project as dry-run-only by default. The one allowed exception\n  is **new-site creation** for `WIX_SITE_STRATEGY=new`: the Wix CLI headless scaffold may\n  run live even while the migration otherwise remains in dry-run mode, because no site\n  exists yet to target. Every other live override (`--no-dry-run`, setup provisioning,\n  app installation, live setup verification probes, demo-catalog cleanup, import writes)\n  requires explicit user approval to leave dry-run for that step or phase, and should be\n  avoided when a dry-run\u002Freport alternative exists.\n- **Mapping review is a separate semantic checkpoint before setup\u002Fcodegen.** After\n  `rp-mapper` writes `mapping\u002Fmapping-plan.json`, it must also write a concise\n  `mapping\u002Freview\u002Fmapping-summary.md` for user review. Pause there and ask the user to review\n  `mapping\u002Freview\u002Fmapping-summary.md` first, using `mapping\u002Freview\u002Fmapping-plan.md` for full details, and confirm that\n  the source entities, Wix targets, main gaps\u002Flossiness, and major setup implications\n  match their intent. Do not proceed to `rp-setup-discovery` or `rp-import-codegen`\n  until the user accepts this mapping review checkpoint.\n- **Safe-mode \u002F dry-run code review is an agent-run checkpoint after codegen and before execution approval.**\n  When `SAFE_MODE=true` or `DRY_RUN=true`, `rp-import-codegen` must also write\n  `execution\u002Freview\u002Fcode-safety-review.md`. The agent must perform this review itself by\n  inspecting the generated code and the mapping artifacts before asking the user for final\n  approval. That artifact must verify the generated code, not just the plan: every\n  relevant writer path passes `safeModeOptions` into the shared Wix runtime or direct REST\n  wrapper where applicable; dry-run uses the same code path with Wix calls skipped only at\n  the shared boundary; dry-run reports do not claim live writes happened; and the resolved\n  safe-mode replacement paths match the mapping artifacts. If the review finds any gap,\n  fix the code and regenerate the review artifact before surfacing it. The user approves\n  whether to proceed after the review passes; the user is not responsible for performing\n  the review itself.\n- **Record every material decision** in the project artifacts\n  (`mapping\u002Freview\u002Fmapping-plan.md`, `mapping\u002Freview\u002Fmapping-summary.md`,\n  `setup\u002Fsetup-verification.json`, `execution-log.md`).\n- **Promote verified write contracts before continuing.** When same-session live\n  verification changes a Wix target write assumption, require a machine-readable\n  `contract-ledger-proposal.json`, promote the accepted proposal into shared\n  `rp-target-wix` domain metadata in the same session, or record an explicit deferral\n  reason. Generated code may rely on promoted ledger entries, not unreviewed local probe\n  output.\n- **Keep execution review artifacts fresh.** `execution\u002Freview\u002Fimport-plan.md` must have\n  freshness metadata covering the source schema, mapping plan, setup verification,\n  generated import code revision\u002Fhash, and target contract ledger revision. Before live\n  import and final reporting, check this metadata; if stale, regenerate the import plan or\n  write `execution\u002Freview\u002Fimport-plan-delta.md` and make completion reporting reference\n  the latest accepted plan\u002Fdelta.\n- **Be non-destructive and idempotent:** never delete or overwrite existing user content;\n  dedupe by source ID; resume rather than restart. Do not assume native Wix entity IDs can\n  be preserved or client-assigned. When the target API assigns IDs server-side, the\n  workflow must maintain a durable local `sourceId -> targetId` crosswalk under\n  `migrations\u002F\u003Cproject>\u002Fstate\u002Fcrosswalk\u002F` for resume and relationship resolution. CMS\n  `ImportCrosswalk` is optional site-local mirror\u002Fseed data for existing-site flows, not\n  the runtime source of truth.\n- **Preserve public URL intent as local state:** for every migrated public routed entity,\n  mapping must capture route\u002Fbase-path and slug policy, and import execution must write\n  local URL preservation artifacts under `migrations\u002F\u003Cproject>\u002Fstate\u002Furl-preservation\u002F`.\n  The current import phase records base paths, URL ledger rows, unresolved route rows, and\n  redirect plans, but does not apply Wix redirects or configure site routing.\n- **Halt to needs-user only for:** a missing\u002Finvalid required input or credential; a\n  genuinely manual step with no API (e.g. storage-plan upgrade); or a systemic failure \u002F\n  data-loss risk. When halting, write the reason to the artifacts and surface it — never\n  silently proceed and never silently stop.\n\n## Step 1: Resolve the active project\n\nResolve `\u003Cmigrations-root>` first: use `REPLATFORM_MIGRATIONS_DIR` when set (absolute or\nrelative to cwd); otherwise default to `migrations\u002F` under the host project's cwd. See\n`CONVENTIONS.md`.\n\nDetermine `\u003Cmigrations-root>\u002F\u003Cproject>\u002F` using this order:\n\n1. Explicit project name provided by the user.\n2. Current working context already referencing `\u003Cmigrations-root>\u002F\u003Cproject>\u002F`.\n3. If exactly one project exists under `\u003Cmigrations-root>\u002F`, use it.\n4. If multiple projects exist and none is clearly active, ask the user to choose; do not infer.\n\n## Step 2: Inspect project artifacts\n\nLook for these artifacts first:\n\n- `config\u002Fwix.env`\n- `orchestration\u002Frun.json`\n- `orchestration\u002Fcheckpoints.json`\n- `orchestration\u002Fdecisions.json`\n- `orchestration\u002Fapprovals.json`\n- `config\u002Fsource.\u003Cplatform>.env` once the source platform is known\n- `source-profile.md`\n- `source-schema.json`\n- `discovery\u002Frun.json`\n- `discovery\u002Fentities\u002Findex.json`\n- `mapping\u002Fmapping-plan.json`\n- `mapping\u002Freview\u002Fmapping-summary.md`\n- `setup\u002Fsetup-plan.json`\n- `setup\u002Fsetup-requirements.json`\n- `setup\u002Fsetup-verification.json`\n- `execution\u002Fexecution-manifest.json`\n- `execution\u002Freview\u002Fcode-safety-review.md`\n- `execution\u002Fcompletion-report.json`\n- `execution\u002Freview\u002Fimport-plan.md`\n- generated code under `src\u002Fsetup\u002F`, `src\u002Fextract\u002F`, `src\u002Fimport\u002F`\n- `execution-log.md`\n\nReuse existing files if they already exist. Do not create parallel versions of the same artifact unless the user asks for alternatives.\n\nInspect only the active project's artifacts for resume and inference. Sibling\n`migrations\u002F\u003Cother-project>\u002F` directories are out of scope and must not influence the\ncurrent run.\n\nTreat each artifact as a complete checkpoint only when it is well-formed (e.g.\n`source-schema.json` parses and contains at least one entity; required JSON artifacts parse\nand contain their required top-level fields; markdown review artifacts are non-empty and\nnot truncated). A malformed or partial artifact means the stage\nthat produces it did NOT finish — re-run that stage rather than treating the file\nas present. Skills should finish writing an artifact in one pass so a half-written\nfile is never mistaken for a completed one.\n\n`execution-log.md` is not an authoritative resume source. Use it for chronology and\noperator\u002Fdebug context only. Resume state must come from the orchestration JSON artifacts\nplus the active phase artifacts.\n\n## Step 2.1: Verify project-local config files before discovery\n\nBefore source discovery, make the migration project's config explicit. Any value that a\nskill, generated script, or setup step expects as an environment variable must have a\nhome in a project-local config file under `migrations\u002F\u003Cproject>\u002Fconfig\u002F`.\n\nUse `.env` syntax (`KEY=value`) so humans can edit the files and generated scripts can\nload them without extra dependencies.\n\n## Secret-safe config handling\n\nTreat these as **secret-bearing files** once they may contain real user values:\n\n- `migrations\u002F\u003Cproject>\u002Fconfig\u002Fwix.env`\n- `migrations\u002F\u003Cproject>\u002Fconfig\u002Fsource.\u003Cplatform>.env`\n- any equivalent local env\u002Ftoml\u002Fjson file carrying auth tokens, passwords, API keys, or\n  application credentials\n\nRules:\n\n- Never print or paste the contents of those files into tool output, chat, artifacts, or\n  logs.\n- Do not read them with whole-file commands that echo contents verbatim (`cat`, broad\n  `sed`, `head`, `tail`, broad globs) after they may be populated.\n- Verify them with secret-safe checks only: file exists, required keys exist, and each key\n  is `present` \u002F `blank` \u002F `missing`.\n- If a file must be created as a template, create it with empty values and from that point\n  forward treat it as secret-bearing even if some values are still blank.\n- When reporting status, name keys only; never include values, partial values, or\n  redaction mistakes such as printing `KEY=value` lines.\n\nAlways create\u002Fverify:\n\n- `config\u002Fwix.env`\n  - `WIX_SITE_STRATEGY=`\n  - `WIX_SITE_ID=`\n  - `WIX_AUTH_TOKEN=`\n\nAfter the source system is identified or inferred, choose the source acquisition path\nwhen the platform supports multiple modes. For Shopify URL-based migrations, ask whether\nto use the Shopify Admin API or only publicly available storefront data. For WordPress \u002F\nWooCommerce URL-based migrations, ask whether to import only publicly available content\nor also include private\u002Fauthenticated data. Only the private\u002Fauthenticated choice should\nlead to a credentials request. Treat user-provided files\u002Fexports as a separate ingestion\nflow that begins from those files, not from a site URL probe.\n\nAfter the acquisition path is chosen, create\u002Fverify the adapter-specific source config.\nFor WordPress \u002F WooCommerce:\n\n- `config\u002Fsource.wordpress.env`\n  - `WP_BASE_URL=`\n  - `WP_USERNAME=`\n  - `WP_APPLICATION_PASSWORD=`\n  - `WC_CONSUMER_KEY=` (optional; only when WooCommerce does not accept the WordPress\n    Application Password)\n  - `WC_CONSUMER_SECRET=` (optional; same condition)\n\n### File-provided runs (CSV)\n\nWhen the user provides one or more CSV\u002Fexport files instead of a site URL, the run is\nfile-based from the start. There is **no acquisition-mode fork and no credentials request**.\n\n- Record `sourcePlatform=csv`, `sourceMode=files_only`, and **every** input file path in\n  `fileInputPaths` (an array) in `orchestration\u002Fdecisions.json`. Preflight requires no source\n  env keys for `csv`; it checks that `fileInputPaths` is non-empty instead. Until it is, the\n  run sits in `awaiting_files`.\n- Create\u002Fverify `config\u002Fsource.csv.env` with optional keys only:\n\n  ```bash\n  CSV_INPUT_ROOT=\n  CSV_DELIMITER=\n  CSV_ENCODING=\n  CSV_VENDOR=\n  CSV_MEDIA_URL_REWRITE_FROM=\n  CSV_MEDIA_URL_REWRITE_TO=\n  ```\n\n  Unlike `source.wordpress.env`, this file is **not secret-bearing** — it holds\n  delimiter\u002Fencoding\u002Fvendor\u002Frewrite hints only. Regular file handling applies. Every key is\n  optional: blank means auto-detect, so a blank file never blocks discovery.\n- Discovery then uses the `rp-source-csv` adapter, which identifies the vendor (Shopify,\n  WooCommerce, Magento, BigCommerce, or `custom`) from the header row. Ask the user to name\n  the vendor only if the adapter reports a low-confidence or near-miss detection.\n\nWorkflow:\n\n1. If `config\u002Fwix.env` is missing, create it with empty keys, the requested dry-run mode,\n   and safe mode enabled:\n\n   ```bash\n   WIX_SITE_STRATEGY=\n   WIX_SITE_ID=\n   WIX_AUTH_TOKEN=\n   DRY_RUN=false\n   SAFE_MODE=true\n   SAFE_MODE_PHONE_NUMBER=+972 50 0000000\n   ```\n\n   Safe mode replaces outbound Wix email\u002Fphone write values with deterministic mock values\n   unless the user explicitly sets `SAFE_MODE=false` before mapping.\n   Dry-run is disabled by default; `DRY_RUN=true` or `--dry-run` runs the same generated\n   setup\u002Fimport entrypoints while skipping Wix calls at the shared Wix boundary.\n   If the user asks to start, create, prepare, or run a migration \"in dry-run mode\",\n   write `DRY_RUN=true` into `config\u002Fwix.env` during scaffolding and carry that mode into\n   the execution-plan report. Do not later override it with `--no-dry-run` except for the\n   allowed new-site creation step or after explicit user approval to leave dry-run.\n2. Ask for the source site\u002Fapp URL before asking for the platform. Try to infer the\n   platform from that URL or from a lightweight probe of the source (for example, a known\n   REST index, platform-specific headers, or HTML\u002Fapplication markers). Only ask the user\n   to identify the platform if detection is inconclusive.\n3. If the inferred platform offers multiple acquisition modes, ask the user to choose the\n   right one before requesting credentials.\n   - For Shopify URL-based migrations, the fork is: `Shopify Admin API` vs `public\n     storefront data only`.\n   - For WordPress \u002F WooCommerce URL-based migrations, the fork is: `public content only`\n     vs `also include private\u002Fauthenticated data`.\n   - For the WordPress \u002F WooCommerce `public content only` path, do **not** ask for a\n     username, application password, or WooCommerce keys before discovery\u002Fimport. Proceed\n     unauthenticated and make clear that the run will include only public data.\n   - For the WordPress \u002F WooCommerce `also include private\u002Fauthenticated data` path, ask\n     for the required credentials after the user selects that mode.\n   Do not ask about manual exports at this step; exports\u002Ffiles are a separate flow used\n   when the user provides files instead of a site URL (see \"File-provided runs (CSV)\").\n4. Before asking for any Wix site ID, ask whether the destination should be a `new site`\n   or an `existing site`, and record that as `WIX_SITE_STRATEGY`.\n   - If the user chooses `existing`, ask for `WIX_SITE_ID` later when it is the next\n     missing Wix detail.\n   - If the user chooses `new`, do not ask for an existing site ID; route to the site\n     creation step and fill `WIX_SITE_ID` only after the new site exists.\n   - For `new site`, the next question should be about the kind of Wix site to create\n     (for example standard Wix site vs Wix Studio vs headless, or another site-creation\n     fork required by the active tooling) rather than asking for a site ID that does not\n     exist yet.\n  - RePlatform destinations are **Wix Managed Headless** sites. Create them with the **Wix\n    CLI headless scaffold** — see \"Headless site creation\" below. The site id comes from the\n    scaffolded `wix.config.json`, not from an API key, so do **not** ask for a site-creation\n    API key here; the only prerequisite is that the Wix CLI is logged in\n    (`npx @wix\u002Fcli@latest login`).\n5. Once the platform and acquisition mode are known, create the matching\n   `config\u002Fsource.\u003Cplatform>.env` with empty keys and ask for missing required values one\n   at a time.\n6. Treat blank required keys as `needs-user`; do not start discovery if the missing value\n   would make discovery incomplete. Optional keys may remain blank when the adapter says\n   they are optional.\n7. Generated scripts should load project-local config first, then process environment,\n   with real environment variables allowed to override file values. Blank config values\n   must never overwrite non-empty environment variables.\n\nNever print secret values back to the user. It is fine to say a required secret is\npresent or missing.\n\n## Headless site creation\n\nWhen `WIX_SITE_STRATEGY=new`, site creation happens before setup\u002Fimport. **Both delivery\nmodes create the site the same way** (see \"Delivery mode\"); `management` just stops before\nthe frontend build.\n\n**Create the site with the Wix CLI headless scaffold — not the account-level Projects API.**\nThe Projects API (`POST \u002Ffunnel\u002Fprojects\u002Fv1\u002Fcreate`) was the prior default but is\n**deprecated for this workflow**: in testing it produced sites that were **not** genuinely\nheadless and it silently dropped the `apps[]` install list. The CLI scaffold\n(`npm create @wix\u002Fnew@latest headless`, the same path the `wix-headless` skill uses) is the\nverified way to get a real Wix Managed Headless site.\n\n**Method (delegate to the `wix-headless` scaffold):**\n\n- **Prerequisite:** the Wix CLI must be logged in **to the account the user intends the site\n  to live on**. Check `npx @wix\u002Fcli@latest whoami`; if logged out, halt to needs-user to run\n  `npx @wix\u002Fcli@latest login` (interactive — it prints a URL + code; it cannot be done from a\n  raw API key). This replaces the old \"site-creation API key\" input — headless creation is\n  CLI-authenticated, tied to the logged-in Wix account.\n- **Confirm the account BEFORE scaffolding — this is a mandatory gate, not a nicety.** The\n  CLI silently creates the site on whatever account it is logged into, with no error if it's\n  the wrong one. Show the user the `whoami` email and confirm it is the intended Wix account.\n  If it is not (e.g. a personal Gmail account instead of the user's business account), halt to\n  needs-user: `npx @wix\u002Fcli@latest logout` then `login` as the correct account, and re-verify.\n  Do not scaffold against an unconfirmed account. **Use one account consistently for the whole\n  run** — the same CLI account creates the site *and* mints the import write token; never mix\n  in a separate `WIX_AUTH_TOKEN` API key that belongs to a different account (a create\u002Fimport\n  account split silently writes to the wrong place or 404\u002F403s).\n- **Scaffold inside the active migration project** with the Wix CLI create command (this is\n  the primary, self-contained path — it needs no other skill installed). Run it from\n  `migrations\u002F\u003Cproject>\u002F` and use `--folder-name frontend` unless the project artifacts\n  explicitly name a different scaffold folder. The command creates the `frontend\u002F`\n  subfolder; it does not replace the migration folder or become the migration root:\n\n  ```bash\n  npm create @wix\u002Fnew@latest -- headless \\\n    --business-name \"\u003CBrand Name>\" \\\n    --folder-name frontend \\\n    --site-template commerce --no-publish --skip-install\n  ```\n\n  This creates a real headless site and writes `frontend\u002Fwix.config.json` with `appId` and\n  `siteId`. This is the one step that may run live while the rest of the migration\n  remains in dry-run mode. Run the `npm create` command above directly —\n  `wix-headless` no longer ships a `scripts\u002Fscaffold.sh` wrapper, and this path\n  deliberately needs no other skill installed.\n- **`--site-template commerce` is load-bearing when the migration carries a product\n  catalog — never scaffold `blank`.** `--site-template` accepts\n  `commerce|scheduler|registration|blank`, and **passing it bare, with no value, means\n  `blank`** (\"no business solution preconfigured\"). On a blank site, installing Wix Stores\n  afterwards through the App Installation API provisions **Catalog V1**, which this workflow\n  does not support at all — the Stores primitives in `rp-target-wix` are V3-only. A site's\n  catalog version is **fixed at provisioning** — there is no in-place V1 → V3 switch — so a\n  blank scaffold silently costs the whole site and forces a rebuild. The `commerce` template\n  is Commerce (Wix Stores) and provisions Stores on **Catalog V3** at creation. In `website`\n  mode, treat its pages as scaffolding to restyle, not as the delivered design.\n- **Exactly one destination site per migration.** Site creation happens **once**. Before\n  scaffolding, read `WIX_SITE_ID` from `config\u002Fwix.env` — non-empty means the site already\n  exists, so do **not** scaffold again: not to retry a failed step, not to \"start clean\",\n  not after an error. **Never create a probe, test, or throwaway site** to verify what a\n  template or an install produced — every site lands in the user's real Wix account, stays\n  visible there, and has to be deleted by hand. Verify on the migration's own site with the\n  read-only catalog-version check below. If the site is genuinely unusable (e.g. it came up\n  `V1_CATALOG`), halt to needs-user with the site id and ask to approve a replacement rather\n  than rebuilding silently; on approval, write the new id into `config\u002Fwix.env` and report\n  the abandoned site id as safe to delete.\n- **Record ids from `wix.config.json`:** persist `siteId` into `config\u002Fwix.env` as\n  `WIX_SITE_ID`, and keep `appId` in project artifacts. Construct the dashboard URL from the\n  site's `metaSiteId` (resolve it via `ListWixSites`\u002Fsite query when needed).\n- **Auth for later site-level writes is a CLI token, not a raw API key.** Mint it without\n  printing the secret to the transcript by running `scripts\u002Fmint-token.sh` from the\n  migration project root. The canonical copy lives at\n  `skills\u002Freplatform\u002Fresources\u002Frp-execute-setup\u002Fscripts\u002Fmint-token.sh`; codegen copies it\n  into each migration project at scaffolding time. Run it via Bash:\n\n  ```bash\n  bash migrations\u002F\u003Cproject>\u002Fscripts\u002Fmint-token.sh\n  ```\n\n  Token shape: `OauthNG.JWS.\u003Cbase64>.\u003Cbase64>.\u003Csig>` — a single line on stdout with no JSON\n  wrapper. Send it as a `Bearer` token (`Authorization: Bearer \u003Ctoken>`, plus\n  `wix-site-id: \u003CsiteId>`). The generated import client must send it as a Bearer token.\n  (`WIX_AUTH_TOKEN` is no longer a create-time API key; if set, it is the site write\n  credential the generated code consumes.)\n\n  **Do not** run `npx @wix\u002Fcli@latest token` raw in a Bash tool call — it prints the\n  credential to stdout which lands in the transcript. Always route through `mint-token.sh`.\n\n**Wix Stores (and other apps) are NOT installed by the scaffold.** A freshly scaffolded\nheadless site has no Wix Stores — `stores\u002Fv3` returns `428 REQUIRED_APP_NOT_INSTALLED` until\nStores is installed. Install required apps as a distinct step after scaffolding, via the\nsame path `wix-headless` uses (its `SETUP.md` Step 3 → the `wix-manage` skill \u002F app-install\nAPI), authenticated with the CLI token. Verify installation (e.g. `stores\u002Fv3\u002Fproducts\u002Fcount`\nresponds) before importing. Do not assume creation installed Stores.\n\n**Then verify the catalog is V3 — before any Stores write.** Installing Stores does not\nguarantee Catalog V3 (a `blank`-scaffolded site comes up V1). Gate on the read-only\nCatalog Versioning API:\n\n```bash\ncurl -s -H \"Authorization: Bearer $WIX_AUTH_TOKEN\" -H \"wix-site-id: $WIX_SITE_ID\" \\\n  https:\u002F\u002Fwww.wixapis.com\u002Fstores\u002Fv3\u002Fprovision\u002Fversion\n```\n\n`catalogVersion` is `V3_CATALOG` (proceed), `STORES_NOT_INSTALLED` (install Stores, re-check),\nor `V1_CATALOG` (**stop — write nothing, and see the one-site rule above**). Record the\nresult in `setup\u002Fsetup-verification.json`. Do not skip this check on the assumption that\nevery Stores install is V3.\n\n**Wipe the default demo catalog before importing — in BOTH modes.** A fresh Wix Stores\ninstall (and `wix-headless`'s seed step) pre-populates the store with ~12 placeholder demo\nproducts and demo categories. Left in place they mix with the migrated catalog (a clean\n100-product import otherwise reads as 112). After Stores is installed and before\u002Fright after\nthe import, delete the default demo products and demo categories so the store holds **only**\nthe migrated data (keep the system `All Products` category). This is the same cleanup the\nwebsite-mode section requires; it applies to the default `management` mode too, because both\nmodes now start from a freshly-provisioned Stores catalog.\n\n**Site-scoping gotcha:** Wix Stores\u002FCategories site-level APIs scope by the site's\n**metaSiteId** in the `wix-site-id` header on some sites; if the scaffold `siteId` returns\n`404`\u002F`meta-site not found` on a Stores call, resolve and use the `metaSiteId`.\n\n## Website mode: build the storefront with `wix-headless`\n\nRun this only when the delivery mode is `website` (the user explicitly asked for a\nstorefront\u002Fwebsite\u002Ffrontend). In `management` mode, skip this section entirely — the run\nends after import.\n\n`wix-headless` builds a JavaScript storefront **only for a site it creates itself**; it\ncannot target a pre-existing site id. So in `website` mode let it own the CLI scaffold — do\n**not** run the \"Headless site creation\" scaffold yourself first (that would produce a\nsecond, empty site). RePlatform then imports the migrated catalog into the site\n`wix-headless` created.\n\nSequence:\n\n1. **Read-only migration prep first.** Run discovery → mapping (+ review checkpoint) →\n   setup-discovery → codegen as usual. Do **not** create a site yet, and leave\n   `WIX_SITE_ID` blank.\n2. **Hand off site creation + storefront to `wix-headless`.** Invoke the `wix-headless`\n   skill (Skill tool, name `wix-headless`; it starts at its own `SKILL.md`, which resolves the\n   project type and routes a new-site run to `references\u002Fmanaged\u002FCREATE.md`) with the store\n   intent and brand. It creates a new headless site with Wix Stores installed, scaffolds an\n   Astro storefront, and builds + releases it, yielding a live URL. Its demo seeding is\n   idempotent and its pages read the live catalog at request time.\n   **Tell it to scaffold `--site-template commerce`.** Its own create flow scaffolds the\n   `blank` template on the reasoning that the model owns the design — correct for a\n   build-from-a-prompt run, wrong here: a blank site's Stores install comes up **Catalog V1**\n   and cannot be converted (see \"Headless site creation\"). Its template pages are scaffolding\n   to restyle against the captured source, not the delivered design.\n3. **Adopt that site as the migration destination.** Read `siteId` from the `wix-headless`\n   project's `wix.config.json`, persist it into `config\u002Fwix.env` as `WIX_SITE_ID`, and keep\n   `WIX_SITE_STRATEGY=new`. The Wix auth used for import must be able to write to that site.\n   Then run the catalog-version gate from \"Headless site creation\" before any Stores write —\n   a site handed over by `wix-headless` is not exempt.\n4. **Import into it — after removing the demo catalog.** Because `wix-headless` seeds demo\n   products\u002Fcategories, first delete that demo catalog on the site, then run the generated\n   import (still behind the execution-plan approval gate) so the store holds only the\n   migrated data. Storefront pages query the live catalog, so the released site then serves\n   the migrated catalog; re-release only if statically generated routes must regenerate.\n5. **Report both layers.** The final handoff must state the storefront URL **and** keep the\n   `catalog\u002Fdata imported` vs `website\u002Fhomepage built` distinction (see `rp-execute-import`).\n\nIf `wix-headless` is unavailable in the runtime, halt to needs-user (it is required for\n`website` mode — the storefront build); do not fall back to hand-building a frontend.\n\n## Recovery\n\n- **Resume is the default.** If the workflow stopped mid-migration, re-running\n  orchestration inspects `orchestration\u002F` plus phase artifacts (Step 2) and routes to the first\n  material gap. No work is repeated unnecessarily.\n- **Never auto-delete.** Existing artifacts are preserved unless the user asks\n  otherwise.\n- **From scratch is explicit and whole-project.** Only when the user explicitly\n  asks to start over, delete the entire `migrations\u002F\u003Cproject>\u002F` directory and\n  re-run from discovery. Do not partially wipe individual stages.\n\n## Step 3: Choose the next step\n\nRoute according to the first material gap by consulting the matching internal resource\nunder `resources\u002F`:\n\n- Project-local config files missing or missing required values: create\u002Fupdate\n  `config\u002Fwix.env` and, after source platform is known, `config\u002Fsource.\u003Cplatform>.env`;\n  ask the user for missing details one at a time.\n- Source acquisition decisions are known but destination strategy is not: resolve\n  `deliveryMode` and `WIX_SITE_STRATEGY`, defaulting `deliveryMode=management` unless the\n  user explicitly asked for a storefront or frontend.\n- Source and destination decisions exist but deterministic preflight has not passed: run\n  the preflight contract and persist `orchestration\u002Fpreflight.json`.\n- No source-system understanding: consult `resources\u002Frp-discovery\u002F`.\n- Source schema exists but no approved mapping: consult `resources\u002Frp-mapper\u002F`.\n- Mapping plan exists but `mapping\u002Freview\u002Fmapping-summary.md` is missing: consult\n  `resources\u002Frp-mapper\u002F` to generate the summary and stop for user review.\n- Mapping summary exists but the mapping review checkpoint has not been accepted: surface\n  `mapping\u002Freview\u002Fmapping-summary.md`, ask the user to review it, and wait for acceptance before\n  continuing.\n- Mapping exists but Wix-side requirements are unclear: consult\n  `resources\u002Frp-setup-discovery\u002F`.\n- Mapping and setup requirements exist but import code is missing: consult\n  `resources\u002Frp-import-codegen\u002F`.\n- Safe mode or dry-run is enabled, but `execution\u002Freview\u002Fcode-safety-review.md` is\n  missing, stale, failed, or not yet accepted: consult `resources\u002Frp-import-codegen\u002F`,\n  run the automatic review, fix any gaps it finds, regenerate the artifact, then surface\n  the passing review for user acceptance before the execution approval gate.\n- **`website` mode, code generated but no destination site yet:** hand off to `wix-headless`\n  to create the site + storefront, then adopt its `siteId` (see \"Website mode: build the\n  storefront with `wix-headless`\") before setup\u002Fimport.\n- Setup artifacts exist but are not verified: consult\n  `resources\u002Frp-execute-setup\u002F`.\n- Code and setup are ready, any required code-safety review has been accepted, and\n  `execution\u002Fexecution-manifest.json` plus execution approval exist: consult\n  `resources\u002Frp-execute-import\u002F`.\n- **`website` mode, catalog imported:** confirm the storefront is released and serving the\n  migrated catalog; report its URL. In `management` mode the run is done after import — do\n  not build a frontend.\n\n## Output\n\nRespond minimally with:\n\n- active project path\n- artifacts found\n- critical gaps\n- exact next recommended skill\n- concrete next action\n\n## Guardrails\n\n- Do not guess the source schema when discovery artifacts are missing.\n- Do not generate import code before a mapping plan exists.\n- Do not execute import before setup verification and code review are complete.\n- When notification mute is in effect (spec 0012), never proceed to import writes\n  without a verified mute — a failed mute halts to needs-user, with no\n  continue-anyway path. Never report a site as muted from strategy\u002Fconfig inference;\n  only from recorded verification state. Never unmute unless the owner explicitly\n  asks.\n",{"data":32,"body":33},{"name":4,"description":6},{"type":34,"children":35},"root",[36,43,74,81,86,98,104,109,115,120,171,205,210,230,274,280,299,394,430,475,487,501,543,638,669,694,754,773,779,784,802,807,813,818,823,846,858,865,1240,1246,1280,1293,1331,1337,1342,1544,1549,1562,1574,1584,1590,1602,1623,1629,1641,1667,1672,1759,1764,1805,1810,1815,1879,1885,1896,2112,2117,2447,2489,2522,2527,2533,2559,2613,2628,3257,3314,3331,3408,3456,3495,3548,3559,3578,3615,3620,3830,3848,3854,3901,3907,3919,4167,4173,4178,4206,4212,4235],{"type":37,"tag":38,"props":39,"children":40},"element","h1",{"id":4},[41],{"type":42,"value":4},"text",{"type":37,"tag":44,"props":45,"children":46},"p",{},[47,49,56,58,64,66,72],{"type":42,"value":48},"Guide the user or agent to the next migration step by inspecting the active migration\nproject (default ",{"type":37,"tag":50,"props":51,"children":53},"code",{"className":52},[],[54],{"type":42,"value":55},"migrations\u002F\u003Cproject>\u002F",{"type":42,"value":57},"; see ",{"type":37,"tag":50,"props":59,"children":61},{"className":60},[],[62],{"type":42,"value":63},"CONVENTIONS.md",{"type":42,"value":65}," for ",{"type":37,"tag":50,"props":67,"children":69},{"className":68},[],[70],{"type":42,"value":71},"REPLATFORM_MIGRATIONS_DIR",{"type":42,"value":73},").",{"type":37,"tag":75,"props":76,"children":78},"h2",{"id":77},"purpose",[79],{"type":42,"value":80},"Purpose",{"type":37,"tag":44,"props":82,"children":83},{},[84],{"type":42,"value":85},"This skill is the traffic controller for RePlatform work. It should determine the active\nmigration project, inspect authoritative orchestration artifacts, identify the next\nmissing decision or deliverable, and route to the appropriate internal resource.",{"type":37,"tag":44,"props":87,"children":88},{},[89,91,96],{"type":42,"value":90},"Each migration project is fully isolated. Treat only artifacts inside the active\n",{"type":37,"tag":50,"props":92,"children":94},{"className":93},[],[95],{"type":42,"value":55},{"type":42,"value":97}," directory as authoritative for that run. Do not infer platform,\ncredentials, discovery results, mappings, setup, or approvals from sibling migration\nprojects, even when they target the same source URL or business.",{"type":37,"tag":75,"props":99,"children":101},{"id":100},"role",[102],{"type":42,"value":103},"Role",{"type":37,"tag":44,"props":105,"children":106},{},[107],{"type":42,"value":108},"You are the RePlatform expert. Your job is to help the user migrate their business from\nanother platform into Wix while maintaining business continuity. Guide the migration in a\nway that is careful, reliable, and easy for the user to follow.",{"type":37,"tag":75,"props":110,"children":112},{"id":111},"runtime-contract",[113],{"type":42,"value":114},"Runtime contract",{"type":37,"tag":44,"props":116,"children":117},{},[118],{"type":42,"value":119},"Every run follows one resumable orchestration pipeline:",{"type":37,"tag":44,"props":121,"children":122},{},[123,125,131,133,139,141,146,148,154,156,162,164,169],{"type":42,"value":124},"resolve project → load or create ",{"type":37,"tag":50,"props":126,"children":128},{"className":127},[],[129],{"type":42,"value":130},"orchestration\u002F",{"type":42,"value":132}," artifacts → collect source inputs →\nresolve destination strategy → deterministic preflight → discovery → mapping →\n",{"type":37,"tag":134,"props":135,"children":136},"strong",{},[137],{"type":42,"value":138},"mapping review checkpoint",{"type":42,"value":140}," → setup-discovery →\ncodegen → ",{"type":37,"tag":134,"props":142,"children":143},{},[144],{"type":42,"value":145},"code safety review checkpoint",{"type":42,"value":147}," (required when ",{"type":37,"tag":50,"props":149,"children":151},{"className":150},[],[152],{"type":42,"value":153},"SAFE_MODE=true",{"type":42,"value":155}," or ",{"type":37,"tag":50,"props":157,"children":159},{"className":158},[],[160],{"type":42,"value":161},"DRY_RUN=true",{"type":42,"value":163},") →\n",{"type":37,"tag":134,"props":165,"children":166},{},[167],{"type":42,"value":168},"execution approval gate",{"type":42,"value":170}," → setup provisioning → import → deterministic\ncompletion reporting",{"type":37,"tag":44,"props":172,"children":173},{},[174,179,181,187,189,195,197,203],{"type":37,"tag":134,"props":175,"children":176},{},[177],{"type":42,"value":178},"Telemetry companion (always active).",{"type":42,"value":180}," At the start of every run — including every\nresume — load the internal resource ",{"type":37,"tag":50,"props":182,"children":184},{"className":183},[],[185],{"type":42,"value":186},"resources\u002Frp-telemetry\u002F",{"type":42,"value":188}," and keep its instructions\nactive for the entire run. It records run telemetry through its bundled recorder\n(",{"type":37,"tag":50,"props":190,"children":192},{"className":191},[],[193],{"type":42,"value":194},"start",{"type":42,"value":196}," at run begin, stage\u002Fwait boundaries as the pipeline moves, events as they\noccur, ",{"type":37,"tag":50,"props":198,"children":200},{"className":199},[],[201],{"type":42,"value":202},"finalize",{"type":42,"value":204}," at a terminal state). This is the orchestrator's only telemetry\nintegration point; the migration skills do not change and telemetry is never\nhand-written.",{"type":37,"tag":44,"props":206,"children":207},{},[208],{"type":42,"value":209},"The orchestrator is deterministic-first:",{"type":37,"tag":211,"props":212,"children":213},"ul",{},[214,220,225],{"type":37,"tag":215,"props":216,"children":217},"li",{},[218],{"type":42,"value":219},"use durable JSON artifacts as the authoritative state contract",{"type":37,"tag":215,"props":221,"children":222},{},[223],{"type":42,"value":224},"prefer deterministic code and validators wherever the contract is already known",{"type":37,"tag":215,"props":226,"children":227},{},[228],{"type":42,"value":229},"use the LLM for user interaction, semantic mapping decisions, and structured recovery\ncases that need judgment",{"type":37,"tag":44,"props":231,"children":232},{},[233,235,241,243,249,251,256,258,264,266,272],{"type":42,"value":234},"The submission should collect these up front so the run does not block unexpectedly:\nsource site URL; the source acquisition mode when the platform offers more than one\nread path (for Shopify: Admin API vs public storefront; for WordPress \u002F WooCommerce:\npublic content only vs authenticated access that also includes private\u002Fgated data);\nsource credentials required by that acquisition mode; the Wix destination mode (",{"type":37,"tag":50,"props":236,"children":238},{"className":237},[],[239],{"type":42,"value":240},"new site",{"type":42,"value":242},"\nvs ",{"type":37,"tag":50,"props":244,"children":246},{"className":245},[],[247],{"type":42,"value":248},"existing site",{"type":42,"value":250},");\nWix authorization (new headless sites are created + written via the ",{"type":37,"tag":134,"props":252,"children":253},{},[254],{"type":42,"value":255},"Wix CLI",{"type":42,"value":257}," — it must be\nlogged in with ",{"type":37,"tag":50,"props":259,"children":261},{"className":260},[],[262],{"type":42,"value":263},"npx @wix\u002Fcli@latest login",{"type":42,"value":265},", and site-level writes use a CLI token minted per\nrun with ",{"type":37,"tag":50,"props":267,"children":269},{"className":268},[],[270],{"type":42,"value":271},"npx @wix\u002Fcli@latest token --site \"$WIX_SITE_ID\"",{"type":42,"value":273},"; a raw create-time API key is no\nlonger used); and explicit answers to known fidelity forks (comments:\nanonymize vs. skip; member-create notifications on\u002Foff; WP pages handling).",{"type":37,"tag":75,"props":275,"children":277},{"id":276},"delivery-mode-managed-backend-default-vs-storefront-website",[278],{"type":42,"value":279},"Delivery mode: managed backend (default) vs. storefront website",{"type":37,"tag":44,"props":281,"children":282},{},[283,285,290,292,297],{"type":42,"value":284},"A migration has two possible deliverables. Resolve which one applies ",{"type":37,"tag":134,"props":286,"children":287},{},[288],{"type":42,"value":289},"before",{"type":42,"value":291}," site\ncreation, and treat ",{"type":37,"tag":134,"props":293,"children":294},{},[295],{"type":42,"value":296},"management-only as the default",{"type":42,"value":298},":",{"type":37,"tag":211,"props":300,"children":301},{},[302,346],{"type":37,"tag":215,"props":303,"children":304},{},[305,316,318,323,325,330,332,337,339,344],{"type":37,"tag":134,"props":306,"children":307},{},[308,314],{"type":37,"tag":50,"props":309,"children":311},{"className":310},[],[312],{"type":42,"value":313},"management",{"type":42,"value":315}," (DEFAULT).",{"type":42,"value":317}," Migrate the business's data into a ",{"type":37,"tag":134,"props":319,"children":320},{},[321],{"type":42,"value":322},"Wix-managed headless\nbackend",{"type":42,"value":324}," — the catalog\u002Fcontent lives in Wix (Stores, CMS, Blog, …), manageable from the\nWix dashboard and served through Wix APIs. ",{"type":37,"tag":134,"props":326,"children":327},{},[328],{"type":42,"value":329},"No customer-facing website \u002F JavaScript\nfrontend is built.",{"type":42,"value":331}," This is a complete, valid deliverable on its own.\n",{"type":37,"tag":134,"props":333,"children":334},{},[335],{"type":42,"value":336},"Do not ask about a website in this mode.",{"type":42,"value":338}," If the user has not asked for a site,\nstorefront, or frontend, assume ",{"type":37,"tag":50,"props":340,"children":342},{"className":341},[],[343],{"type":42,"value":313},{"type":42,"value":345}," and proceed without a clarifying question.",{"type":37,"tag":215,"props":347,"children":348},{},[349,360,362,367,369,374,376,385,387,392],{"type":37,"tag":134,"props":350,"children":351},{},[352,358],{"type":37,"tag":50,"props":353,"children":355},{"className":354},[],[356],{"type":42,"value":357},"website",{"type":42,"value":359}," (OPT-IN).",{"type":42,"value":361}," Everything in ",{"type":37,"tag":50,"props":363,"children":365},{"className":364},[],[366],{"type":42,"value":313},{"type":42,"value":368},", ",{"type":37,"tag":134,"props":370,"children":371},{},[372],{"type":42,"value":373},"plus",{"type":42,"value":375}," a customer-facing storefront\n(a JavaScript frontend) built with the ",{"type":37,"tag":134,"props":377,"children":378},{},[379],{"type":37,"tag":50,"props":380,"children":382},{"className":381},[],[383],{"type":42,"value":384},"wix-headless",{"type":42,"value":386}," skill. Select this mode ",{"type":37,"tag":134,"props":388,"children":389},{},[390],{"type":42,"value":391},"only\nwhen the user explicitly asks",{"type":42,"value":393}," for a website, storefront, site frontend, \"a site people\ncan visit\", or names a frontend framework. Never infer it from the mere fact that the\nsource had a website — the source always did; that is not a request to rebuild one.",{"type":37,"tag":44,"props":395,"children":396},{},[397,399,405,407,413,415,421,423,428],{"type":42,"value":398},"Record the resolved mode in ",{"type":37,"tag":50,"props":400,"children":402},{"className":401},[],[403],{"type":42,"value":404},"orchestration\u002Fdecisions.json",{"type":42,"value":406}," and, when set, in\n",{"type":37,"tag":50,"props":408,"children":410},{"className":409},[],[411],{"type":42,"value":412},"config\u002Fwix.env",{"type":42,"value":414}," as ",{"type":37,"tag":50,"props":416,"children":418},{"className":417},[],[419],{"type":42,"value":420},"WIX_DELIVERY_MODE=management|website",{"type":42,"value":422},". ",{"type":37,"tag":134,"props":424,"children":425},{},[426],{"type":42,"value":427},"Both modes create the destination the same way",{"type":42,"value":429},"\n— a genuine Wix Managed Headless site via the Wix CLI scaffold (see \"Headless site\ncreation\"). The mode only decides whether a frontend is built:",{"type":37,"tag":211,"props":431,"children":432},{},[433,450],{"type":37,"tag":215,"props":434,"children":435},{},[436,438,443,445],{"type":42,"value":437},"In ",{"type":37,"tag":50,"props":439,"children":441},{"className":440},[],[442],{"type":42,"value":313},{"type":42,"value":444}," mode (default), scaffold the headless site, install Wix Stores (and any\nother required apps), and import the catalog. ",{"type":37,"tag":134,"props":446,"children":447},{},[448],{"type":42,"value":449},"Do not build or release a frontend.",{"type":37,"tag":215,"props":451,"children":452},{},[453,454,459,461,466,468,473],{"type":42,"value":437},{"type":37,"tag":50,"props":455,"children":457},{"className":456},[],[458],{"type":42,"value":357},{"type":42,"value":460}," mode, run the full ",{"type":37,"tag":50,"props":462,"children":464},{"className":463},[],[465],{"type":42,"value":384},{"type":42,"value":467}," flow (it performs the same CLI scaffold,\ninstalls apps, and additionally builds + releases the Astro storefront), then import the\ncatalog into that site (see \"Website mode: build the storefront with ",{"type":37,"tag":50,"props":469,"children":471},{"className":470},[],[472],{"type":42,"value":384},{"type":42,"value":474},"\").",{"type":37,"tag":44,"props":476,"children":477},{},[478,480,485],{"type":42,"value":479},"Site creation is identical across modes because a headless site is only produced correctly\nby the CLI scaffold; ",{"type":37,"tag":50,"props":481,"children":483},{"className":482},[],[484],{"type":42,"value":313},{"type":42,"value":486}," simply stops before the frontend build.",{"type":37,"tag":75,"props":488,"children":490},{"id":489},"notification-muting-the-mute-notifications-config-spec-0012",[491,493,499],{"type":42,"value":492},"Notification muting: the ",{"type":37,"tag":50,"props":494,"children":496},{"className":495},[],[497],{"type":42,"value":498},"mute-notifications",{"type":42,"value":500}," config (spec 0012)",{"type":37,"tag":44,"props":502,"children":503},{},[504,506,512,514,519,521,526,528,534,536,541],{"type":42,"value":505},"Migration writes can fire Wix site notifications (emails, dashboard alerts, pushes) for\nevery created entity. A single config governs whether the target site is muted before\nmigration writes, following the ",{"type":37,"tag":50,"props":507,"children":509},{"className":508},[],[510],{"type":42,"value":511},"WIX_DELIVERY_MODE",{"type":42,"value":513}," pattern: record it in\n",{"type":37,"tag":50,"props":515,"children":517},{"className":516},[],[518],{"type":42,"value":404},{"type":42,"value":520}," and mirror it in ",{"type":37,"tag":50,"props":522,"children":524},{"className":523},[],[525],{"type":42,"value":412},{"type":42,"value":527}," as\n",{"type":37,"tag":50,"props":529,"children":531},{"className":530},[],[532],{"type":42,"value":533},"WIX_MUTE_NOTIFICATIONS=on|off",{"type":42,"value":535},". The default resolves by site strategy and the resolved\nvalue is ",{"type":37,"tag":134,"props":537,"children":538},{},[539],{"type":42,"value":540},"always recorded explicitly",{"type":42,"value":542},", never left implicit:",{"type":37,"tag":211,"props":544,"children":545},{},[546,602],{"type":37,"tag":215,"props":547,"children":548},{},[549,568,570,576,578,584,586,592,594,600],{"type":37,"tag":134,"props":550,"children":551},{},[552,558,560,566],{"type":37,"tag":50,"props":553,"children":555},{"className":554},[],[556],{"type":42,"value":557},"WIX_SITE_STRATEGY=new",{"type":42,"value":559}," → ",{"type":37,"tag":50,"props":561,"children":563},{"className":562},[],[564],{"type":42,"value":565},"on",{"type":42,"value":567},", effectively forced.",{"type":42,"value":569}," Do not ask. ",{"type":37,"tag":50,"props":571,"children":573},{"className":572},[],[574],{"type":42,"value":575},"off",{"type":42,"value":577}," + ",{"type":37,"tag":50,"props":579,"children":581},{"className":580},[],[582],{"type":42,"value":583},"new",{"type":42,"value":585}," is a\nvalidation error (",{"type":37,"tag":50,"props":587,"children":589},{"className":588},[],[590],{"type":42,"value":591},"rp-setup-discovery",{"type":42,"value":593}," and ",{"type":37,"tag":50,"props":595,"children":597},{"className":596},[],[598],{"type":42,"value":599},"rp-import-codegen",{"type":42,"value":601}," both fail it), and the\nenforcement does not consult the config for new sites — it is unconditional.",{"type":37,"tag":215,"props":603,"children":604},{},[605,622,624,629,631,637],{"type":37,"tag":134,"props":606,"children":607},{},[608,614,615,620],{"type":37,"tag":50,"props":609,"children":611},{"className":610},[],[612],{"type":42,"value":613},"WIX_SITE_STRATEGY=existing",{"type":42,"value":559},{"type":37,"tag":50,"props":616,"children":618},{"className":617},[],[619],{"type":42,"value":575},{"type":42,"value":621},".",{"type":42,"value":623}," Do not ask up front. Muting a live site also\nsilences notifications for real visitor activity during the migration window, so it is\nan explicit opt-in (",{"type":37,"tag":50,"props":625,"children":627},{"className":626},[],[628],{"type":42,"value":565},{"type":42,"value":630},") the owner can request; when opted in, the mute and its\nconsequences are disclosed prominently at the execution-plan approval gate\n(",{"type":37,"tag":50,"props":632,"children":634},{"className":633},[],[635],{"type":42,"value":636},"rp-execute-import",{"type":42,"value":73},{"type":37,"tag":44,"props":639,"children":640},{},[641,646,648,653,655,661,663,668],{"type":37,"tag":134,"props":642,"children":643},{},[644],{"type":42,"value":645},"Hard invariant — no mute, no import.",{"type":42,"value":647}," When mute is in effect (always for new sites;\nopt-in for existing), a failed mute call at any point (setup provisioning, import-script\npreflight) halts the run to needs-user with the failure recorded. Never continue to\nimport writes with a warning, and never offer a continue-anyway option. Enforcement is\ndouble-locked downstream: a standing setup requirement (",{"type":37,"tag":50,"props":649,"children":651},{"className":650},[],[652],{"type":42,"value":591},{"type":42,"value":654}," →\n",{"type":37,"tag":50,"props":656,"children":658},{"className":657},[],[659],{"type":42,"value":660},"rp-execute-setup",{"type":42,"value":662},", ordered before all other setup writes) plus a preflight assertion in\nthe generated import script (",{"type":37,"tag":50,"props":664,"children":666},{"className":665},[],[667],{"type":42,"value":599},{"type":42,"value":73},{"type":37,"tag":44,"props":670,"children":671},{},[672,677,679,684,686,692],{"type":37,"tag":134,"props":673,"children":674},{},[675],{"type":42,"value":676},"Terminal-report disclosure — every terminal state.",{"type":42,"value":678}," Nothing in the flow unmutes\nautomatically, so any site the flow muted is still muted at completion, halt, or abort.\nWhatever report the run ends with must derive \"was muted\" from ",{"type":37,"tag":134,"props":680,"children":681},{},[682],{"type":42,"value":683},"recorded state",{"type":42,"value":685},"\n(",{"type":37,"tag":50,"props":687,"children":689},{"className":688},[],[690],{"type":42,"value":691},"setup\u002Fsetup-verification.json",{"type":42,"value":693}," mute item + the import run's preflight log entries) —\nnever infer it from strategy\u002Fconfig — and, when a successful mute is recorded, state in\nplain language:",{"type":37,"tag":211,"props":695,"children":696},{},[697,707,741],{"type":37,"tag":215,"props":698,"children":699},{},[700,705],{"type":37,"tag":134,"props":701,"children":702},{},[703],{"type":42,"value":704},"all site notifications are currently muted",{"type":42,"value":706},", and stay muted until re-enabled;",{"type":37,"tag":215,"props":708,"children":709},{},[710,715,717,723,725,731,733,739],{"type":37,"tag":134,"props":711,"children":712},{},[713],{"type":42,"value":714},"the owner can simply ask the agent to unmute them",{"type":42,"value":716}," whenever they want — on request,\ncall ",{"type":37,"tag":50,"props":718,"children":720},{"className":719},[],[721],{"type":42,"value":722},"unmuteSiteNotifications",{"type":42,"value":724}," (rp-target-wix) and confirm ",{"type":37,"tag":50,"props":726,"children":728},{"className":727},[],[729],{"type":42,"value":730},"muted: false",{"type":42,"value":732}," via\n",{"type":37,"tag":50,"props":734,"children":736},{"className":735},[],[737],{"type":42,"value":738},"getSiteMuteState",{"type":42,"value":740},";",{"type":37,"tag":215,"props":742,"children":743},{},[744,746,752],{"type":42,"value":745},"alternatively they can re-enable manually (UnmuteSite —\n",{"type":37,"tag":50,"props":747,"children":749},{"className":748},[],[750],{"type":42,"value":751},"POST \u002Fnotification-preferences\u002Fv1\u002Fsite-mute\u002Funmute",{"type":42,"value":753}," — or the dashboard path once one\nexists).",{"type":37,"tag":44,"props":755,"children":756},{},[757,759,764,766,771],{"type":42,"value":758},"For existing sites this disclosure is ",{"type":37,"tag":134,"props":760,"children":761},{},[762],{"type":42,"value":763},"mandatory and prominent",{"type":42,"value":765}," — it is the only\nremaining safeguard against a live business staying silenced. If no successful mute is\nrecorded, the report must not claim the site is muted. The unmute is ",{"type":37,"tag":134,"props":767,"children":768},{},[769],{"type":42,"value":770},"never",{"type":42,"value":772}," run as\npart of the flow itself — explicit owner request only.",{"type":37,"tag":75,"props":774,"children":776},{"id":775},"tone",[777],{"type":42,"value":778},"Tone",{"type":37,"tag":44,"props":780,"children":781},{},[782],{"type":42,"value":783},"Use a tone that is:",{"type":37,"tag":211,"props":785,"children":786},{},[787,792,797],{"type":37,"tag":215,"props":788,"children":789},{},[790],{"type":42,"value":791},"professional",{"type":37,"tag":215,"props":793,"children":794},{},[795],{"type":42,"value":796},"friendly",{"type":37,"tag":215,"props":798,"children":799},{},[800],{"type":42,"value":801},"confidence-building",{"type":37,"tag":44,"props":803,"children":804},{},[805],{"type":42,"value":806},"Explain the process clearly, avoid sounding uncertain when the workflow is defined, and\nhelp the user understand what is happening and what will happen next. Be direct, calm, and\npractical. Do not overwhelm the user with internal detail that does not help them make the\nnext decision.",{"type":37,"tag":75,"props":808,"children":810},{"id":809},"user-interaction-contract",[811],{"type":42,"value":812},"User interaction contract",{"type":37,"tag":44,"props":814,"children":815},{},[816],{"type":42,"value":817},"Keep interaction narrow and task-directed.",{"type":37,"tag":44,"props":819,"children":820},{},[821],{"type":42,"value":822},"Allowed interactions:",{"type":37,"tag":211,"props":824,"children":825},{},[826,831,836,841],{"type":37,"tag":215,"props":827,"children":828},{},[829],{"type":42,"value":830},"request one missing required input or credential",{"type":37,"tag":215,"props":832,"children":833},{},[834],{"type":42,"value":835},"ask the user to choose the active migration project when project resolution is genuinely ambiguous",{"type":37,"tag":215,"props":837,"children":838},{},[839],{"type":42,"value":840},"present the execution plan report and wait for explicit acceptance before any write",{"type":37,"tag":215,"props":842,"children":843},{},[844],{"type":42,"value":845},"halt to a defined needs-user state with the exact unblock action",{"type":37,"tag":44,"props":847,"children":848},{},[849,851,856],{"type":42,"value":850},"Ask questions ",{"type":37,"tag":134,"props":852,"children":853},{},[854],{"type":42,"value":855},"one by one",{"type":42,"value":857},". Do not bundle multiple unrelated questions into a single\nmessage. Ask the next question only after the previous one is answered, unless a later\nskill explicitly requires a single grouped approval artifact such as the execution plan.",{"type":37,"tag":859,"props":860,"children":862},"h3",{"id":861},"rules-that-hold-in-every-run",[863],{"type":42,"value":864},"Rules that hold in every run",{"type":37,"tag":211,"props":866,"children":867},{},[868,921,945,983,1045,1090,1126,1152,1178,1212,1230],{"type":37,"tag":215,"props":869,"children":870},{},[871,884,886,891,893,898,900,905,907,912,914,919],{"type":37,"tag":134,"props":872,"children":873},{},[874,876,882],{"type":42,"value":875},"One mandatory approval gate precedes ",{"type":37,"tag":877,"props":878,"children":879},"em",{},[880],{"type":42,"value":881},"all",{"type":42,"value":883}," writes to the user's site",{"type":42,"value":885}," — both setup\nprovisioning and the import. Before writing anything, present the ",{"type":37,"tag":134,"props":887,"children":888},{},[889],{"type":42,"value":890},"execution plan report",{"type":42,"value":892},"\nand wait for explicit user acceptance. The report covers: the ",{"type":37,"tag":134,"props":894,"children":895},{},[896],{"type":42,"value":897},"setup changes",{"type":42,"value":899}," that will\nbe made (apps to install, Wix Data enablement, collections to create), ",{"type":37,"tag":134,"props":901,"children":902},{},[903],{"type":42,"value":904},"what will be\nimported and where",{"type":42,"value":906}," (entities → Wix targets + counts), and ",{"type":37,"tag":134,"props":908,"children":909},{},[910],{"type":42,"value":911},"what can't be done and\nneeds manual action",{"type":42,"value":913},". The job pauses, surfaces the plan, and resumes only on accept.\nSee ",{"type":37,"tag":50,"props":915,"children":917},{"className":916},[],[918],{"type":42,"value":636},{"type":42,"value":920}," → Execution plan & user acceptance.",{"type":37,"tag":215,"props":922,"children":923},{},[924,929,931,936,938,943],{"type":37,"tag":134,"props":925,"children":926},{},[927],{"type":42,"value":928},"Read-only work runs before the gate; writes run after.",{"type":42,"value":930}," Discovery, mapping, codegen,\npreview, and ",{"type":37,"tag":134,"props":932,"children":933},{},[934],{"type":42,"value":935},"read-only setup verification",{"type":42,"value":937}," (checking what's installed\u002Fmissing) run\nbefore acceptance to make the plan accurate. The \"Migrate\" consent + credentials\nauthorize the migration but are ",{"type":37,"tag":134,"props":939,"children":940},{},[941],{"type":42,"value":942},"not",{"type":42,"value":944}," a green light to start writing — only plan\nacceptance is. After acceptance, run setup provisioning, then import, without\nre-prompting per app\u002Fcollection\u002Fwrite.",{"type":37,"tag":215,"props":946,"children":947},{},[948,953,955,960,962,967,968,973,975,981],{"type":37,"tag":134,"props":949,"children":950},{},[951],{"type":42,"value":952},"Dry-run remains sticky unless the user explicitly approves leaving it.",{"type":42,"value":954}," When\n",{"type":37,"tag":50,"props":956,"children":958},{"className":957},[],[959],{"type":42,"value":161},{"type":42,"value":961},", treat the project as dry-run-only by default. The one allowed exception\nis ",{"type":37,"tag":134,"props":963,"children":964},{},[965],{"type":42,"value":966},"new-site creation",{"type":42,"value":65},{"type":37,"tag":50,"props":969,"children":971},{"className":970},[],[972],{"type":42,"value":557},{"type":42,"value":974},": the Wix CLI headless scaffold may\nrun live even while the migration otherwise remains in dry-run mode, because no site\nexists yet to target. Every other live override (",{"type":37,"tag":50,"props":976,"children":978},{"className":977},[],[979],{"type":42,"value":980},"--no-dry-run",{"type":42,"value":982},", setup provisioning,\napp installation, live setup verification probes, demo-catalog cleanup, import writes)\nrequires explicit user approval to leave dry-run for that step or phase, and should be\navoided when a dry-run\u002Freport alternative exists.",{"type":37,"tag":215,"props":984,"children":985},{},[986,991,993,999,1001,1007,1009,1015,1017,1022,1024,1030,1032,1037,1038,1043],{"type":37,"tag":134,"props":987,"children":988},{},[989],{"type":42,"value":990},"Mapping review is a separate semantic checkpoint before setup\u002Fcodegen.",{"type":42,"value":992}," After\n",{"type":37,"tag":50,"props":994,"children":996},{"className":995},[],[997],{"type":42,"value":998},"rp-mapper",{"type":42,"value":1000}," writes ",{"type":37,"tag":50,"props":1002,"children":1004},{"className":1003},[],[1005],{"type":42,"value":1006},"mapping\u002Fmapping-plan.json",{"type":42,"value":1008},", it must also write a concise\n",{"type":37,"tag":50,"props":1010,"children":1012},{"className":1011},[],[1013],{"type":42,"value":1014},"mapping\u002Freview\u002Fmapping-summary.md",{"type":42,"value":1016}," for user review. Pause there and ask the user to review\n",{"type":37,"tag":50,"props":1018,"children":1020},{"className":1019},[],[1021],{"type":42,"value":1014},{"type":42,"value":1023}," first, using ",{"type":37,"tag":50,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":42,"value":1029},"mapping\u002Freview\u002Fmapping-plan.md",{"type":42,"value":1031}," for full details, and confirm that\nthe source entities, Wix targets, main gaps\u002Flossiness, and major setup implications\nmatch their intent. Do not proceed to ",{"type":37,"tag":50,"props":1033,"children":1035},{"className":1034},[],[1036],{"type":42,"value":591},{"type":42,"value":155},{"type":37,"tag":50,"props":1039,"children":1041},{"className":1040},[],[1042],{"type":42,"value":599},{"type":42,"value":1044},"\nuntil the user accepts this mapping review checkpoint.",{"type":37,"tag":215,"props":1046,"children":1047},{},[1048,1053,1055,1060,1061,1066,1067,1072,1074,1080,1082,1088],{"type":37,"tag":134,"props":1049,"children":1050},{},[1051],{"type":42,"value":1052},"Safe-mode \u002F dry-run code review is an agent-run checkpoint after codegen and before execution approval.",{"type":42,"value":1054},"\nWhen ",{"type":37,"tag":50,"props":1056,"children":1058},{"className":1057},[],[1059],{"type":42,"value":153},{"type":42,"value":155},{"type":37,"tag":50,"props":1062,"children":1064},{"className":1063},[],[1065],{"type":42,"value":161},{"type":42,"value":368},{"type":37,"tag":50,"props":1068,"children":1070},{"className":1069},[],[1071],{"type":42,"value":599},{"type":42,"value":1073}," must also write\n",{"type":37,"tag":50,"props":1075,"children":1077},{"className":1076},[],[1078],{"type":42,"value":1079},"execution\u002Freview\u002Fcode-safety-review.md",{"type":42,"value":1081},". The agent must perform this review itself by\ninspecting the generated code and the mapping artifacts before asking the user for final\napproval. That artifact must verify the generated code, not just the plan: every\nrelevant writer path passes ",{"type":37,"tag":50,"props":1083,"children":1085},{"className":1084},[],[1086],{"type":42,"value":1087},"safeModeOptions",{"type":42,"value":1089}," into the shared Wix runtime or direct REST\nwrapper where applicable; dry-run uses the same code path with Wix calls skipped only at\nthe shared boundary; dry-run reports do not claim live writes happened; and the resolved\nsafe-mode replacement paths match the mapping artifacts. If the review finds any gap,\nfix the code and regenerate the review artifact before surfacing it. The user approves\nwhether to proceed after the review passes; the user is not responsible for performing\nthe review itself.",{"type":37,"tag":215,"props":1091,"children":1092},{},[1093,1098,1100,1105,1106,1111,1113,1118,1119,1125],{"type":37,"tag":134,"props":1094,"children":1095},{},[1096],{"type":42,"value":1097},"Record every material decision",{"type":42,"value":1099}," in the project artifacts\n(",{"type":37,"tag":50,"props":1101,"children":1103},{"className":1102},[],[1104],{"type":42,"value":1029},{"type":42,"value":368},{"type":37,"tag":50,"props":1107,"children":1109},{"className":1108},[],[1110],{"type":42,"value":1014},{"type":42,"value":1112},",\n",{"type":37,"tag":50,"props":1114,"children":1116},{"className":1115},[],[1117],{"type":42,"value":691},{"type":42,"value":368},{"type":37,"tag":50,"props":1120,"children":1122},{"className":1121},[],[1123],{"type":42,"value":1124},"execution-log.md",{"type":42,"value":73},{"type":37,"tag":215,"props":1127,"children":1128},{},[1129,1134,1136,1142,1144,1150],{"type":37,"tag":134,"props":1130,"children":1131},{},[1132],{"type":42,"value":1133},"Promote verified write contracts before continuing.",{"type":42,"value":1135}," When same-session live\nverification changes a Wix target write assumption, require a machine-readable\n",{"type":37,"tag":50,"props":1137,"children":1139},{"className":1138},[],[1140],{"type":42,"value":1141},"contract-ledger-proposal.json",{"type":42,"value":1143},", promote the accepted proposal into shared\n",{"type":37,"tag":50,"props":1145,"children":1147},{"className":1146},[],[1148],{"type":42,"value":1149},"rp-target-wix",{"type":42,"value":1151}," domain metadata in the same session, or record an explicit deferral\nreason. Generated code may rely on promoted ledger entries, not unreviewed local probe\noutput.",{"type":37,"tag":215,"props":1153,"children":1154},{},[1155,1160,1162,1168,1170,1176],{"type":37,"tag":134,"props":1156,"children":1157},{},[1158],{"type":42,"value":1159},"Keep execution review artifacts fresh.",{"type":42,"value":1161}," ",{"type":37,"tag":50,"props":1163,"children":1165},{"className":1164},[],[1166],{"type":42,"value":1167},"execution\u002Freview\u002Fimport-plan.md",{"type":42,"value":1169}," must have\nfreshness metadata covering the source schema, mapping plan, setup verification,\ngenerated import code revision\u002Fhash, and target contract ledger revision. Before live\nimport and final reporting, check this metadata; if stale, regenerate the import plan or\nwrite ",{"type":37,"tag":50,"props":1171,"children":1173},{"className":1172},[],[1174],{"type":42,"value":1175},"execution\u002Freview\u002Fimport-plan-delta.md",{"type":42,"value":1177}," and make completion reporting reference\nthe latest accepted plan\u002Fdelta.",{"type":37,"tag":215,"props":1179,"children":1180},{},[1181,1186,1188,1194,1196,1202,1204,1210],{"type":37,"tag":134,"props":1182,"children":1183},{},[1184],{"type":42,"value":1185},"Be non-destructive and idempotent:",{"type":42,"value":1187}," never delete or overwrite existing user content;\ndedupe by source ID; resume rather than restart. Do not assume native Wix entity IDs can\nbe preserved or client-assigned. When the target API assigns IDs server-side, the\nworkflow must maintain a durable local ",{"type":37,"tag":50,"props":1189,"children":1191},{"className":1190},[],[1192],{"type":42,"value":1193},"sourceId -> targetId",{"type":42,"value":1195}," crosswalk under\n",{"type":37,"tag":50,"props":1197,"children":1199},{"className":1198},[],[1200],{"type":42,"value":1201},"migrations\u002F\u003Cproject>\u002Fstate\u002Fcrosswalk\u002F",{"type":42,"value":1203}," for resume and relationship resolution. CMS\n",{"type":37,"tag":50,"props":1205,"children":1207},{"className":1206},[],[1208],{"type":42,"value":1209},"ImportCrosswalk",{"type":42,"value":1211}," is optional site-local mirror\u002Fseed data for existing-site flows, not\nthe runtime source of truth.",{"type":37,"tag":215,"props":1213,"children":1214},{},[1215,1220,1222,1228],{"type":37,"tag":134,"props":1216,"children":1217},{},[1218],{"type":42,"value":1219},"Preserve public URL intent as local state:",{"type":42,"value":1221}," for every migrated public routed entity,\nmapping must capture route\u002Fbase-path and slug policy, and import execution must write\nlocal URL preservation artifacts under ",{"type":37,"tag":50,"props":1223,"children":1225},{"className":1224},[],[1226],{"type":42,"value":1227},"migrations\u002F\u003Cproject>\u002Fstate\u002Furl-preservation\u002F",{"type":42,"value":1229},".\nThe current import phase records base paths, URL ledger rows, unresolved route rows, and\nredirect plans, but does not apply Wix redirects or configure site routing.",{"type":37,"tag":215,"props":1231,"children":1232},{},[1233,1238],{"type":37,"tag":134,"props":1234,"children":1235},{},[1236],{"type":42,"value":1237},"Halt to needs-user only for:",{"type":42,"value":1239}," a missing\u002Finvalid required input or credential; a\ngenuinely manual step with no API (e.g. storage-plan upgrade); or a systemic failure \u002F\ndata-loss risk. When halting, write the reason to the artifacts and surface it — never\nsilently proceed and never silently stop.",{"type":37,"tag":75,"props":1241,"children":1243},{"id":1242},"step-1-resolve-the-active-project",[1244],{"type":42,"value":1245},"Step 1: Resolve the active project",{"type":37,"tag":44,"props":1247,"children":1248},{},[1249,1251,1257,1259,1264,1266,1272,1274,1279],{"type":42,"value":1250},"Resolve ",{"type":37,"tag":50,"props":1252,"children":1254},{"className":1253},[],[1255],{"type":42,"value":1256},"\u003Cmigrations-root>",{"type":42,"value":1258}," first: use ",{"type":37,"tag":50,"props":1260,"children":1262},{"className":1261},[],[1263],{"type":42,"value":71},{"type":42,"value":1265}," when set (absolute or\nrelative to cwd); otherwise default to ",{"type":37,"tag":50,"props":1267,"children":1269},{"className":1268},[],[1270],{"type":42,"value":1271},"migrations\u002F",{"type":42,"value":1273}," under the host project's cwd. See\n",{"type":37,"tag":50,"props":1275,"children":1277},{"className":1276},[],[1278],{"type":42,"value":63},{"type":42,"value":621},{"type":37,"tag":44,"props":1281,"children":1282},{},[1283,1285,1291],{"type":42,"value":1284},"Determine ",{"type":37,"tag":50,"props":1286,"children":1288},{"className":1287},[],[1289],{"type":42,"value":1290},"\u003Cmigrations-root>\u002F\u003Cproject>\u002F",{"type":42,"value":1292}," using this order:",{"type":37,"tag":1294,"props":1295,"children":1296},"ol",{},[1297,1302,1313,1326],{"type":37,"tag":215,"props":1298,"children":1299},{},[1300],{"type":42,"value":1301},"Explicit project name provided by the user.",{"type":37,"tag":215,"props":1303,"children":1304},{},[1305,1307,1312],{"type":42,"value":1306},"Current working context already referencing ",{"type":37,"tag":50,"props":1308,"children":1310},{"className":1309},[],[1311],{"type":42,"value":1290},{"type":42,"value":621},{"type":37,"tag":215,"props":1314,"children":1315},{},[1316,1318,1324],{"type":42,"value":1317},"If exactly one project exists under ",{"type":37,"tag":50,"props":1319,"children":1321},{"className":1320},[],[1322],{"type":42,"value":1323},"\u003Cmigrations-root>\u002F",{"type":42,"value":1325},", use it.",{"type":37,"tag":215,"props":1327,"children":1328},{},[1329],{"type":42,"value":1330},"If multiple projects exist and none is clearly active, ask the user to choose; do not infer.",{"type":37,"tag":75,"props":1332,"children":1334},{"id":1333},"step-2-inspect-project-artifacts",[1335],{"type":42,"value":1336},"Step 2: Inspect project artifacts",{"type":37,"tag":44,"props":1338,"children":1339},{},[1340],{"type":42,"value":1341},"Look for these artifacts first:",{"type":37,"tag":211,"props":1343,"children":1344},{},[1345,1353,1362,1371,1379,1388,1399,1408,1417,1426,1435,1443,1451,1460,1469,1477,1486,1494,1503,1511,1536],{"type":37,"tag":215,"props":1346,"children":1347},{},[1348],{"type":37,"tag":50,"props":1349,"children":1351},{"className":1350},[],[1352],{"type":42,"value":412},{"type":37,"tag":215,"props":1354,"children":1355},{},[1356],{"type":37,"tag":50,"props":1357,"children":1359},{"className":1358},[],[1360],{"type":42,"value":1361},"orchestration\u002Frun.json",{"type":37,"tag":215,"props":1363,"children":1364},{},[1365],{"type":37,"tag":50,"props":1366,"children":1368},{"className":1367},[],[1369],{"type":42,"value":1370},"orchestration\u002Fcheckpoints.json",{"type":37,"tag":215,"props":1372,"children":1373},{},[1374],{"type":37,"tag":50,"props":1375,"children":1377},{"className":1376},[],[1378],{"type":42,"value":404},{"type":37,"tag":215,"props":1380,"children":1381},{},[1382],{"type":37,"tag":50,"props":1383,"children":1385},{"className":1384},[],[1386],{"type":42,"value":1387},"orchestration\u002Fapprovals.json",{"type":37,"tag":215,"props":1389,"children":1390},{},[1391,1397],{"type":37,"tag":50,"props":1392,"children":1394},{"className":1393},[],[1395],{"type":42,"value":1396},"config\u002Fsource.\u003Cplatform>.env",{"type":42,"value":1398}," once the source platform is known",{"type":37,"tag":215,"props":1400,"children":1401},{},[1402],{"type":37,"tag":50,"props":1403,"children":1405},{"className":1404},[],[1406],{"type":42,"value":1407},"source-profile.md",{"type":37,"tag":215,"props":1409,"children":1410},{},[1411],{"type":37,"tag":50,"props":1412,"children":1414},{"className":1413},[],[1415],{"type":42,"value":1416},"source-schema.json",{"type":37,"tag":215,"props":1418,"children":1419},{},[1420],{"type":37,"tag":50,"props":1421,"children":1423},{"className":1422},[],[1424],{"type":42,"value":1425},"discovery\u002Frun.json",{"type":37,"tag":215,"props":1427,"children":1428},{},[1429],{"type":37,"tag":50,"props":1430,"children":1432},{"className":1431},[],[1433],{"type":42,"value":1434},"discovery\u002Fentities\u002Findex.json",{"type":37,"tag":215,"props":1436,"children":1437},{},[1438],{"type":37,"tag":50,"props":1439,"children":1441},{"className":1440},[],[1442],{"type":42,"value":1006},{"type":37,"tag":215,"props":1444,"children":1445},{},[1446],{"type":37,"tag":50,"props":1447,"children":1449},{"className":1448},[],[1450],{"type":42,"value":1014},{"type":37,"tag":215,"props":1452,"children":1453},{},[1454],{"type":37,"tag":50,"props":1455,"children":1457},{"className":1456},[],[1458],{"type":42,"value":1459},"setup\u002Fsetup-plan.json",{"type":37,"tag":215,"props":1461,"children":1462},{},[1463],{"type":37,"tag":50,"props":1464,"children":1466},{"className":1465},[],[1467],{"type":42,"value":1468},"setup\u002Fsetup-requirements.json",{"type":37,"tag":215,"props":1470,"children":1471},{},[1472],{"type":37,"tag":50,"props":1473,"children":1475},{"className":1474},[],[1476],{"type":42,"value":691},{"type":37,"tag":215,"props":1478,"children":1479},{},[1480],{"type":37,"tag":50,"props":1481,"children":1483},{"className":1482},[],[1484],{"type":42,"value":1485},"execution\u002Fexecution-manifest.json",{"type":37,"tag":215,"props":1487,"children":1488},{},[1489],{"type":37,"tag":50,"props":1490,"children":1492},{"className":1491},[],[1493],{"type":42,"value":1079},{"type":37,"tag":215,"props":1495,"children":1496},{},[1497],{"type":37,"tag":50,"props":1498,"children":1500},{"className":1499},[],[1501],{"type":42,"value":1502},"execution\u002Fcompletion-report.json",{"type":37,"tag":215,"props":1504,"children":1505},{},[1506],{"type":37,"tag":50,"props":1507,"children":1509},{"className":1508},[],[1510],{"type":42,"value":1167},{"type":37,"tag":215,"props":1512,"children":1513},{},[1514,1516,1522,1523,1529,1530],{"type":42,"value":1515},"generated code under ",{"type":37,"tag":50,"props":1517,"children":1519},{"className":1518},[],[1520],{"type":42,"value":1521},"src\u002Fsetup\u002F",{"type":42,"value":368},{"type":37,"tag":50,"props":1524,"children":1526},{"className":1525},[],[1527],{"type":42,"value":1528},"src\u002Fextract\u002F",{"type":42,"value":368},{"type":37,"tag":50,"props":1531,"children":1533},{"className":1532},[],[1534],{"type":42,"value":1535},"src\u002Fimport\u002F",{"type":37,"tag":215,"props":1537,"children":1538},{},[1539],{"type":37,"tag":50,"props":1540,"children":1542},{"className":1541},[],[1543],{"type":42,"value":1124},{"type":37,"tag":44,"props":1545,"children":1546},{},[1547],{"type":42,"value":1548},"Reuse existing files if they already exist. Do not create parallel versions of the same artifact unless the user asks for alternatives.",{"type":37,"tag":44,"props":1550,"children":1551},{},[1552,1554,1560],{"type":42,"value":1553},"Inspect only the active project's artifacts for resume and inference. Sibling\n",{"type":37,"tag":50,"props":1555,"children":1557},{"className":1556},[],[1558],{"type":42,"value":1559},"migrations\u002F\u003Cother-project>\u002F",{"type":42,"value":1561}," directories are out of scope and must not influence the\ncurrent run.",{"type":37,"tag":44,"props":1563,"children":1564},{},[1565,1567,1572],{"type":42,"value":1566},"Treat each artifact as a complete checkpoint only when it is well-formed (e.g.\n",{"type":37,"tag":50,"props":1568,"children":1570},{"className":1569},[],[1571],{"type":42,"value":1416},{"type":42,"value":1573}," parses and contains at least one entity; required JSON artifacts parse\nand contain their required top-level fields; markdown review artifacts are non-empty and\nnot truncated). A malformed or partial artifact means the stage\nthat produces it did NOT finish — re-run that stage rather than treating the file\nas present. Skills should finish writing an artifact in one pass so a half-written\nfile is never mistaken for a completed one.",{"type":37,"tag":44,"props":1575,"children":1576},{},[1577,1582],{"type":37,"tag":50,"props":1578,"children":1580},{"className":1579},[],[1581],{"type":42,"value":1124},{"type":42,"value":1583}," is not an authoritative resume source. Use it for chronology and\noperator\u002Fdebug context only. Resume state must come from the orchestration JSON artifacts\nplus the active phase artifacts.",{"type":37,"tag":75,"props":1585,"children":1587},{"id":1586},"step-21-verify-project-local-config-files-before-discovery",[1588],{"type":42,"value":1589},"Step 2.1: Verify project-local config files before discovery",{"type":37,"tag":44,"props":1591,"children":1592},{},[1593,1595,1601],{"type":42,"value":1594},"Before source discovery, make the migration project's config explicit. Any value that a\nskill, generated script, or setup step expects as an environment variable must have a\nhome in a project-local config file under ",{"type":37,"tag":50,"props":1596,"children":1598},{"className":1597},[],[1599],{"type":42,"value":1600},"migrations\u002F\u003Cproject>\u002Fconfig\u002F",{"type":42,"value":621},{"type":37,"tag":44,"props":1603,"children":1604},{},[1605,1607,1613,1615,1621],{"type":42,"value":1606},"Use ",{"type":37,"tag":50,"props":1608,"children":1610},{"className":1609},[],[1611],{"type":42,"value":1612},".env",{"type":42,"value":1614}," syntax (",{"type":37,"tag":50,"props":1616,"children":1618},{"className":1617},[],[1619],{"type":42,"value":1620},"KEY=value",{"type":42,"value":1622},") so humans can edit the files and generated scripts can\nload them without extra dependencies.",{"type":37,"tag":75,"props":1624,"children":1626},{"id":1625},"secret-safe-config-handling",[1627],{"type":42,"value":1628},"Secret-safe config handling",{"type":37,"tag":44,"props":1630,"children":1631},{},[1632,1634,1639],{"type":42,"value":1633},"Treat these as ",{"type":37,"tag":134,"props":1635,"children":1636},{},[1637],{"type":42,"value":1638},"secret-bearing files",{"type":42,"value":1640}," once they may contain real user values:",{"type":37,"tag":211,"props":1642,"children":1643},{},[1644,1653,1662],{"type":37,"tag":215,"props":1645,"children":1646},{},[1647],{"type":37,"tag":50,"props":1648,"children":1650},{"className":1649},[],[1651],{"type":42,"value":1652},"migrations\u002F\u003Cproject>\u002Fconfig\u002Fwix.env",{"type":37,"tag":215,"props":1654,"children":1655},{},[1656],{"type":37,"tag":50,"props":1657,"children":1659},{"className":1658},[],[1660],{"type":42,"value":1661},"migrations\u002F\u003Cproject>\u002Fconfig\u002Fsource.\u003Cplatform>.env",{"type":37,"tag":215,"props":1663,"children":1664},{},[1665],{"type":42,"value":1666},"any equivalent local env\u002Ftoml\u002Fjson file carrying auth tokens, passwords, API keys, or\napplication credentials",{"type":37,"tag":44,"props":1668,"children":1669},{},[1670],{"type":42,"value":1671},"Rules:",{"type":37,"tag":211,"props":1673,"children":1674},{},[1675,1680,1715,1742,1747],{"type":37,"tag":215,"props":1676,"children":1677},{},[1678],{"type":42,"value":1679},"Never print or paste the contents of those files into tool output, chat, artifacts, or\nlogs.",{"type":37,"tag":215,"props":1681,"children":1682},{},[1683,1685,1691,1693,1699,1700,1706,1707,1713],{"type":42,"value":1684},"Do not read them with whole-file commands that echo contents verbatim (",{"type":37,"tag":50,"props":1686,"children":1688},{"className":1687},[],[1689],{"type":42,"value":1690},"cat",{"type":42,"value":1692},", broad\n",{"type":37,"tag":50,"props":1694,"children":1696},{"className":1695},[],[1697],{"type":42,"value":1698},"sed",{"type":42,"value":368},{"type":37,"tag":50,"props":1701,"children":1703},{"className":1702},[],[1704],{"type":42,"value":1705},"head",{"type":42,"value":368},{"type":37,"tag":50,"props":1708,"children":1710},{"className":1709},[],[1711],{"type":42,"value":1712},"tail",{"type":42,"value":1714},", broad globs) after they may be populated.",{"type":37,"tag":215,"props":1716,"children":1717},{},[1718,1720,1726,1728,1734,1735,1741],{"type":42,"value":1719},"Verify them with secret-safe checks only: file exists, required keys exist, and each key\nis ",{"type":37,"tag":50,"props":1721,"children":1723},{"className":1722},[],[1724],{"type":42,"value":1725},"present",{"type":42,"value":1727}," \u002F ",{"type":37,"tag":50,"props":1729,"children":1731},{"className":1730},[],[1732],{"type":42,"value":1733},"blank",{"type":42,"value":1727},{"type":37,"tag":50,"props":1736,"children":1738},{"className":1737},[],[1739],{"type":42,"value":1740},"missing",{"type":42,"value":621},{"type":37,"tag":215,"props":1743,"children":1744},{},[1745],{"type":42,"value":1746},"If a file must be created as a template, create it with empty values and from that point\nforward treat it as secret-bearing even if some values are still blank.",{"type":37,"tag":215,"props":1748,"children":1749},{},[1750,1752,1757],{"type":42,"value":1751},"When reporting status, name keys only; never include values, partial values, or\nredaction mistakes such as printing ",{"type":37,"tag":50,"props":1753,"children":1755},{"className":1754},[],[1756],{"type":42,"value":1620},{"type":42,"value":1758}," lines.",{"type":37,"tag":44,"props":1760,"children":1761},{},[1762],{"type":42,"value":1763},"Always create\u002Fverify:",{"type":37,"tag":211,"props":1765,"children":1766},{},[1767],{"type":37,"tag":215,"props":1768,"children":1769},{},[1770,1775],{"type":37,"tag":50,"props":1771,"children":1773},{"className":1772},[],[1774],{"type":42,"value":412},{"type":37,"tag":211,"props":1776,"children":1777},{},[1778,1787,1796],{"type":37,"tag":215,"props":1779,"children":1780},{},[1781],{"type":37,"tag":50,"props":1782,"children":1784},{"className":1783},[],[1785],{"type":42,"value":1786},"WIX_SITE_STRATEGY=",{"type":37,"tag":215,"props":1788,"children":1789},{},[1790],{"type":37,"tag":50,"props":1791,"children":1793},{"className":1792},[],[1794],{"type":42,"value":1795},"WIX_SITE_ID=",{"type":37,"tag":215,"props":1797,"children":1798},{},[1799],{"type":37,"tag":50,"props":1800,"children":1802},{"className":1801},[],[1803],{"type":42,"value":1804},"WIX_AUTH_TOKEN=",{"type":37,"tag":44,"props":1806,"children":1807},{},[1808],{"type":42,"value":1809},"After the source system is identified or inferred, choose the source acquisition path\nwhen the platform supports multiple modes. For Shopify URL-based migrations, ask whether\nto use the Shopify Admin API or only publicly available storefront data. For WordPress \u002F\nWooCommerce URL-based migrations, ask whether to import only publicly available content\nor also include private\u002Fauthenticated data. Only the private\u002Fauthenticated choice should\nlead to a credentials request. Treat user-provided files\u002Fexports as a separate ingestion\nflow that begins from those files, not from a site URL probe.",{"type":37,"tag":44,"props":1811,"children":1812},{},[1813],{"type":42,"value":1814},"After the acquisition path is chosen, create\u002Fverify the adapter-specific source config.\nFor WordPress \u002F WooCommerce:",{"type":37,"tag":211,"props":1816,"children":1817},{},[1818],{"type":37,"tag":215,"props":1819,"children":1820},{},[1821,1827],{"type":37,"tag":50,"props":1822,"children":1824},{"className":1823},[],[1825],{"type":42,"value":1826},"config\u002Fsource.wordpress.env",{"type":37,"tag":211,"props":1828,"children":1829},{},[1830,1839,1848,1857,1868],{"type":37,"tag":215,"props":1831,"children":1832},{},[1833],{"type":37,"tag":50,"props":1834,"children":1836},{"className":1835},[],[1837],{"type":42,"value":1838},"WP_BASE_URL=",{"type":37,"tag":215,"props":1840,"children":1841},{},[1842],{"type":37,"tag":50,"props":1843,"children":1845},{"className":1844},[],[1846],{"type":42,"value":1847},"WP_USERNAME=",{"type":37,"tag":215,"props":1849,"children":1850},{},[1851],{"type":37,"tag":50,"props":1852,"children":1854},{"className":1853},[],[1855],{"type":42,"value":1856},"WP_APPLICATION_PASSWORD=",{"type":37,"tag":215,"props":1858,"children":1859},{},[1860,1866],{"type":37,"tag":50,"props":1861,"children":1863},{"className":1862},[],[1864],{"type":42,"value":1865},"WC_CONSUMER_KEY=",{"type":42,"value":1867}," (optional; only when WooCommerce does not accept the WordPress\nApplication Password)",{"type":37,"tag":215,"props":1869,"children":1870},{},[1871,1877],{"type":37,"tag":50,"props":1872,"children":1874},{"className":1873},[],[1875],{"type":42,"value":1876},"WC_CONSUMER_SECRET=",{"type":42,"value":1878}," (optional; same condition)",{"type":37,"tag":859,"props":1880,"children":1882},{"id":1881},"file-provided-runs-csv",[1883],{"type":42,"value":1884},"File-provided runs (CSV)",{"type":37,"tag":44,"props":1886,"children":1887},{},[1888,1890,1895],{"type":42,"value":1889},"When the user provides one or more CSV\u002Fexport files instead of a site URL, the run is\nfile-based from the start. There is ",{"type":37,"tag":134,"props":1891,"children":1892},{},[1893],{"type":42,"value":1894},"no acquisition-mode fork and no credentials request",{"type":42,"value":621},{"type":37,"tag":211,"props":1897,"children":1898},{},[1899,1963,2091],{"type":37,"tag":215,"props":1900,"children":1901},{},[1902,1904,1910,1911,1917,1919,1924,1926,1932,1934,1939,1941,1947,1949,1954,1956,1962],{"type":42,"value":1903},"Record ",{"type":37,"tag":50,"props":1905,"children":1907},{"className":1906},[],[1908],{"type":42,"value":1909},"sourcePlatform=csv",{"type":42,"value":368},{"type":37,"tag":50,"props":1912,"children":1914},{"className":1913},[],[1915],{"type":42,"value":1916},"sourceMode=files_only",{"type":42,"value":1918},", and ",{"type":37,"tag":134,"props":1920,"children":1921},{},[1922],{"type":42,"value":1923},"every",{"type":42,"value":1925}," input file path in\n",{"type":37,"tag":50,"props":1927,"children":1929},{"className":1928},[],[1930],{"type":42,"value":1931},"fileInputPaths",{"type":42,"value":1933}," (an array) in ",{"type":37,"tag":50,"props":1935,"children":1937},{"className":1936},[],[1938],{"type":42,"value":404},{"type":42,"value":1940},". Preflight requires no source\nenv keys for ",{"type":37,"tag":50,"props":1942,"children":1944},{"className":1943},[],[1945],{"type":42,"value":1946},"csv",{"type":42,"value":1948},"; it checks that ",{"type":37,"tag":50,"props":1950,"children":1952},{"className":1951},[],[1953],{"type":42,"value":1931},{"type":42,"value":1955}," is non-empty instead. Until it is, the\nrun sits in ",{"type":37,"tag":50,"props":1957,"children":1959},{"className":1958},[],[1960],{"type":42,"value":1961},"awaiting_files",{"type":42,"value":621},{"type":37,"tag":215,"props":1964,"children":1965},{},[1966,1968,1974,1976,2070,2074,2076,2082,2084,2089],{"type":42,"value":1967},"Create\u002Fverify ",{"type":37,"tag":50,"props":1969,"children":1971},{"className":1970},[],[1972],{"type":42,"value":1973},"config\u002Fsource.csv.env",{"type":42,"value":1975}," with optional keys only:",{"type":37,"tag":1977,"props":1978,"children":1983},"pre",{"className":1979,"code":1980,"language":1981,"meta":1982,"style":1982},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","CSV_INPUT_ROOT=\nCSV_DELIMITER=\nCSV_ENCODING=\nCSV_VENDOR=\nCSV_MEDIA_URL_REWRITE_FROM=\nCSV_MEDIA_URL_REWRITE_TO=\n","bash","",[1984],{"type":37,"tag":50,"props":1985,"children":1986},{"__ignoreMap":1982},[1987,2005,2018,2031,2044,2057],{"type":37,"tag":1988,"props":1989,"children":1992},"span",{"class":1990,"line":1991},"line",1,[1993,1999],{"type":37,"tag":1988,"props":1994,"children":1996},{"style":1995},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[1997],{"type":42,"value":1998},"CSV_INPUT_ROOT",{"type":37,"tag":1988,"props":2000,"children":2002},{"style":2001},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[2003],{"type":42,"value":2004},"=\n",{"type":37,"tag":1988,"props":2006,"children":2008},{"class":1990,"line":2007},2,[2009,2014],{"type":37,"tag":1988,"props":2010,"children":2011},{"style":1995},[2012],{"type":42,"value":2013},"CSV_DELIMITER",{"type":37,"tag":1988,"props":2015,"children":2016},{"style":2001},[2017],{"type":42,"value":2004},{"type":37,"tag":1988,"props":2019,"children":2021},{"class":1990,"line":2020},3,[2022,2027],{"type":37,"tag":1988,"props":2023,"children":2024},{"style":1995},[2025],{"type":42,"value":2026},"CSV_ENCODING",{"type":37,"tag":1988,"props":2028,"children":2029},{"style":2001},[2030],{"type":42,"value":2004},{"type":37,"tag":1988,"props":2032,"children":2034},{"class":1990,"line":2033},4,[2035,2040],{"type":37,"tag":1988,"props":2036,"children":2037},{"style":1995},[2038],{"type":42,"value":2039},"CSV_VENDOR",{"type":37,"tag":1988,"props":2041,"children":2042},{"style":2001},[2043],{"type":42,"value":2004},{"type":37,"tag":1988,"props":2045,"children":2047},{"class":1990,"line":2046},5,[2048,2053],{"type":37,"tag":1988,"props":2049,"children":2050},{"style":1995},[2051],{"type":42,"value":2052},"CSV_MEDIA_URL_REWRITE_FROM",{"type":37,"tag":1988,"props":2054,"children":2055},{"style":2001},[2056],{"type":42,"value":2004},{"type":37,"tag":1988,"props":2058,"children":2060},{"class":1990,"line":2059},6,[2061,2066],{"type":37,"tag":1988,"props":2062,"children":2063},{"style":1995},[2064],{"type":42,"value":2065},"CSV_MEDIA_URL_REWRITE_TO",{"type":37,"tag":1988,"props":2067,"children":2068},{"style":2001},[2069],{"type":42,"value":2004},{"type":37,"tag":2071,"props":2072,"children":2073},"br",{},[],{"type":42,"value":2075},"Unlike ",{"type":37,"tag":50,"props":2077,"children":2079},{"className":2078},[],[2080],{"type":42,"value":2081},"source.wordpress.env",{"type":42,"value":2083},", this file is ",{"type":37,"tag":134,"props":2085,"children":2086},{},[2087],{"type":42,"value":2088},"not secret-bearing",{"type":42,"value":2090}," — it holds\ndelimiter\u002Fencoding\u002Fvendor\u002Frewrite hints only. Regular file handling applies. Every key is\noptional: blank means auto-detect, so a blank file never blocks discovery.",{"type":37,"tag":215,"props":2092,"children":2093},{},[2094,2096,2102,2104,2110],{"type":42,"value":2095},"Discovery then uses the ",{"type":37,"tag":50,"props":2097,"children":2099},{"className":2098},[],[2100],{"type":42,"value":2101},"rp-source-csv",{"type":42,"value":2103}," adapter, which identifies the vendor (Shopify,\nWooCommerce, Magento, BigCommerce, or ",{"type":37,"tag":50,"props":2105,"children":2107},{"className":2106},[],[2108],{"type":42,"value":2109},"custom",{"type":42,"value":2111},") from the header row. Ask the user to name\nthe vendor only if the adapter reports a low-confidence or near-miss detection.",{"type":37,"tag":44,"props":2113,"children":2114},{},[2115],{"type":42,"value":2116},"Workflow:",{"type":37,"tag":1294,"props":2118,"children":2119},{},[2120,2288,2293,2369],{"type":37,"tag":215,"props":2121,"children":2122},{},[2123,2125,2130,2132,2240,2243,2245,2251,2253,2258,2259,2265,2267,2272,2274,2279,2281,2286],{"type":42,"value":2124},"If ",{"type":37,"tag":50,"props":2126,"children":2128},{"className":2127},[],[2129],{"type":42,"value":412},{"type":42,"value":2131}," is missing, create it with empty keys, the requested dry-run mode,\nand safe mode enabled:",{"type":37,"tag":1977,"props":2133,"children":2135},{"className":1979,"code":2134,"language":1981,"meta":1982,"style":1982},"WIX_SITE_STRATEGY=\nWIX_SITE_ID=\nWIX_AUTH_TOKEN=\nDRY_RUN=false\nSAFE_MODE=true\nSAFE_MODE_PHONE_NUMBER=+972 50 0000000\n",[2136],{"type":37,"tag":50,"props":2137,"children":2138},{"__ignoreMap":1982},[2139,2151,2163,2175,2194,2211],{"type":37,"tag":1988,"props":2140,"children":2141},{"class":1990,"line":1991},[2142,2147],{"type":37,"tag":1988,"props":2143,"children":2144},{"style":1995},[2145],{"type":42,"value":2146},"WIX_SITE_STRATEGY",{"type":37,"tag":1988,"props":2148,"children":2149},{"style":2001},[2150],{"type":42,"value":2004},{"type":37,"tag":1988,"props":2152,"children":2153},{"class":1990,"line":2007},[2154,2159],{"type":37,"tag":1988,"props":2155,"children":2156},{"style":1995},[2157],{"type":42,"value":2158},"WIX_SITE_ID",{"type":37,"tag":1988,"props":2160,"children":2161},{"style":2001},[2162],{"type":42,"value":2004},{"type":37,"tag":1988,"props":2164,"children":2165},{"class":1990,"line":2020},[2166,2171],{"type":37,"tag":1988,"props":2167,"children":2168},{"style":1995},[2169],{"type":42,"value":2170},"WIX_AUTH_TOKEN",{"type":37,"tag":1988,"props":2172,"children":2173},{"style":2001},[2174],{"type":42,"value":2004},{"type":37,"tag":1988,"props":2176,"children":2177},{"class":1990,"line":2033},[2178,2183,2188],{"type":37,"tag":1988,"props":2179,"children":2180},{"style":1995},[2181],{"type":42,"value":2182},"DRY_RUN",{"type":37,"tag":1988,"props":2184,"children":2185},{"style":2001},[2186],{"type":42,"value":2187},"=",{"type":37,"tag":1988,"props":2189,"children":2191},{"style":2190},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[2192],{"type":42,"value":2193},"false\n",{"type":37,"tag":1988,"props":2195,"children":2196},{"class":1990,"line":2046},[2197,2202,2206],{"type":37,"tag":1988,"props":2198,"children":2199},{"style":1995},[2200],{"type":42,"value":2201},"SAFE_MODE",{"type":37,"tag":1988,"props":2203,"children":2204},{"style":2001},[2205],{"type":42,"value":2187},{"type":37,"tag":1988,"props":2207,"children":2208},{"style":2190},[2209],{"type":42,"value":2210},"true\n",{"type":37,"tag":1988,"props":2212,"children":2213},{"class":1990,"line":2059},[2214,2219,2223,2228,2234],{"type":37,"tag":1988,"props":2215,"children":2216},{"style":1995},[2217],{"type":42,"value":2218},"SAFE_MODE_PHONE_NUMBER",{"type":37,"tag":1988,"props":2220,"children":2221},{"style":2001},[2222],{"type":42,"value":2187},{"type":37,"tag":1988,"props":2224,"children":2225},{"style":2190},[2226],{"type":42,"value":2227},"+972",{"type":37,"tag":1988,"props":2229,"children":2231},{"style":2230},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[2232],{"type":42,"value":2233}," 50",{"type":37,"tag":1988,"props":2235,"children":2237},{"style":2236},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[2238],{"type":42,"value":2239}," 0000000\n",{"type":37,"tag":2071,"props":2241,"children":2242},{},[],{"type":42,"value":2244},"Safe mode replaces outbound Wix email\u002Fphone write values with deterministic mock values\nunless the user explicitly sets ",{"type":37,"tag":50,"props":2246,"children":2248},{"className":2247},[],[2249],{"type":42,"value":2250},"SAFE_MODE=false",{"type":42,"value":2252}," before mapping.\nDry-run is disabled by default; ",{"type":37,"tag":50,"props":2254,"children":2256},{"className":2255},[],[2257],{"type":42,"value":161},{"type":42,"value":155},{"type":37,"tag":50,"props":2260,"children":2262},{"className":2261},[],[2263],{"type":42,"value":2264},"--dry-run",{"type":42,"value":2266}," runs the same generated\nsetup\u002Fimport entrypoints while skipping Wix calls at the shared Wix boundary.\nIf the user asks to start, create, prepare, or run a migration \"in dry-run mode\",\nwrite ",{"type":37,"tag":50,"props":2268,"children":2270},{"className":2269},[],[2271],{"type":42,"value":161},{"type":42,"value":2273}," into ",{"type":37,"tag":50,"props":2275,"children":2277},{"className":2276},[],[2278],{"type":42,"value":412},{"type":42,"value":2280}," during scaffolding and carry that mode into\nthe execution-plan report. Do not later override it with ",{"type":37,"tag":50,"props":2282,"children":2284},{"className":2283},[],[2285],{"type":42,"value":980},{"type":42,"value":2287}," except for the\nallowed new-site creation step or after explicit user approval to leave dry-run.",{"type":37,"tag":215,"props":2289,"children":2290},{},[2291],{"type":42,"value":2292},"Ask for the source site\u002Fapp URL before asking for the platform. Try to infer the\nplatform from that URL or from a lightweight probe of the source (for example, a known\nREST index, platform-specific headers, or HTML\u002Fapplication markers). Only ask the user\nto identify the platform if detection is inconclusive.",{"type":37,"tag":215,"props":2294,"children":2295},{},[2296,2298],{"type":42,"value":2297},"If the inferred platform offers multiple acquisition modes, ask the user to choose the\nright one before requesting credentials.",{"type":37,"tag":211,"props":2299,"children":2300},{},[2301,2321,2340,2358],{"type":37,"tag":215,"props":2302,"children":2303},{},[2304,2306,2312,2314,2320],{"type":42,"value":2305},"For Shopify URL-based migrations, the fork is: ",{"type":37,"tag":50,"props":2307,"children":2309},{"className":2308},[],[2310],{"type":42,"value":2311},"Shopify Admin API",{"type":42,"value":2313}," vs ",{"type":37,"tag":50,"props":2315,"children":2317},{"className":2316},[],[2318],{"type":42,"value":2319},"public storefront data only",{"type":42,"value":621},{"type":37,"tag":215,"props":2322,"children":2323},{},[2324,2326,2332,2333,2339],{"type":42,"value":2325},"For WordPress \u002F WooCommerce URL-based migrations, the fork is: ",{"type":37,"tag":50,"props":2327,"children":2329},{"className":2328},[],[2330],{"type":42,"value":2331},"public content only",{"type":42,"value":242},{"type":37,"tag":50,"props":2334,"children":2336},{"className":2335},[],[2337],{"type":42,"value":2338},"also include private\u002Fauthenticated data",{"type":42,"value":621},{"type":37,"tag":215,"props":2341,"children":2342},{},[2343,2345,2350,2352,2356],{"type":42,"value":2344},"For the WordPress \u002F WooCommerce ",{"type":37,"tag":50,"props":2346,"children":2348},{"className":2347},[],[2349],{"type":42,"value":2331},{"type":42,"value":2351}," path, do ",{"type":37,"tag":134,"props":2353,"children":2354},{},[2355],{"type":42,"value":942},{"type":42,"value":2357}," ask for a\nusername, application password, or WooCommerce keys before discovery\u002Fimport. Proceed\nunauthenticated and make clear that the run will include only public data.",{"type":37,"tag":215,"props":2359,"children":2360},{},[2361,2362,2367],{"type":42,"value":2344},{"type":37,"tag":50,"props":2363,"children":2365},{"className":2364},[],[2366],{"type":42,"value":2338},{"type":42,"value":2368}," path, ask\nfor the required credentials after the user selects that mode.\nDo not ask about manual exports at this step; exports\u002Ffiles are a separate flow used\nwhen the user provides files instead of a site URL (see \"File-provided runs (CSV)\").",{"type":37,"tag":215,"props":2370,"children":2371},{},[2372,2374,2379,2381,2386,2388,2393,2394],{"type":42,"value":2373},"Before asking for any Wix site ID, ask whether the destination should be a ",{"type":37,"tag":50,"props":2375,"children":2377},{"className":2376},[],[2378],{"type":42,"value":240},{"type":42,"value":2380},"\nor an ",{"type":37,"tag":50,"props":2382,"children":2384},{"className":2383},[],[2385],{"type":42,"value":248},{"type":42,"value":2387},", and record that as ",{"type":37,"tag":50,"props":2389,"children":2391},{"className":2390},[],[2392],{"type":42,"value":2146},{"type":42,"value":621},{"type":37,"tag":211,"props":2395,"children":2396},{},[2397,2417,2435],{"type":37,"tag":215,"props":2398,"children":2399},{},[2400,2402,2408,2410,2415],{"type":42,"value":2401},"If the user chooses ",{"type":37,"tag":50,"props":2403,"children":2405},{"className":2404},[],[2406],{"type":42,"value":2407},"existing",{"type":42,"value":2409},", ask for ",{"type":37,"tag":50,"props":2411,"children":2413},{"className":2412},[],[2414],{"type":42,"value":2158},{"type":42,"value":2416}," later when it is the next\nmissing Wix detail.",{"type":37,"tag":215,"props":2418,"children":2419},{},[2420,2421,2426,2428,2433],{"type":42,"value":2401},{"type":37,"tag":50,"props":2422,"children":2424},{"className":2423},[],[2425],{"type":42,"value":583},{"type":42,"value":2427},", do not ask for an existing site ID; route to the site\ncreation step and fill ",{"type":37,"tag":50,"props":2429,"children":2431},{"className":2430},[],[2432],{"type":42,"value":2158},{"type":42,"value":2434}," only after the new site exists.",{"type":37,"tag":215,"props":2436,"children":2437},{},[2438,2440,2445],{"type":42,"value":2439},"For ",{"type":37,"tag":50,"props":2441,"children":2443},{"className":2442},[],[2444],{"type":42,"value":240},{"type":42,"value":2446},", the next question should be about the kind of Wix site to create\n(for example standard Wix site vs Wix Studio vs headless, or another site-creation\nfork required by the active tooling) rather than asking for a site ID that does not\nexist yet.",{"type":37,"tag":211,"props":2448,"children":2449},{},[2450],{"type":37,"tag":215,"props":2451,"children":2452},{},[2453,2455,2460,2462,2467,2469,2475,2477,2481,2483,2488],{"type":42,"value":2454},"RePlatform destinations are ",{"type":37,"tag":134,"props":2456,"children":2457},{},[2458],{"type":42,"value":2459},"Wix Managed Headless",{"type":42,"value":2461}," sites. Create them with the ",{"type":37,"tag":134,"props":2463,"children":2464},{},[2465],{"type":42,"value":2466},"Wix\nCLI headless scaffold",{"type":42,"value":2468}," — see \"Headless site creation\" below. The site id comes from the\nscaffolded ",{"type":37,"tag":50,"props":2470,"children":2472},{"className":2471},[],[2473],{"type":42,"value":2474},"wix.config.json",{"type":42,"value":2476},", not from an API key, so do ",{"type":37,"tag":134,"props":2478,"children":2479},{},[2480],{"type":42,"value":942},{"type":42,"value":2482}," ask for a site-creation\nAPI key here; the only prerequisite is that the Wix CLI is logged in\n(",{"type":37,"tag":50,"props":2484,"children":2486},{"className":2485},[],[2487],{"type":42,"value":263},{"type":42,"value":73},{"type":37,"tag":1294,"props":2490,"children":2491},{"start":2046},[2492,2504,2517],{"type":37,"tag":215,"props":2493,"children":2494},{},[2495,2497,2502],{"type":42,"value":2496},"Once the platform and acquisition mode are known, create the matching\n",{"type":37,"tag":50,"props":2498,"children":2500},{"className":2499},[],[2501],{"type":42,"value":1396},{"type":42,"value":2503}," with empty keys and ask for missing required values one\nat a time.",{"type":37,"tag":215,"props":2505,"children":2506},{},[2507,2509,2515],{"type":42,"value":2508},"Treat blank required keys as ",{"type":37,"tag":50,"props":2510,"children":2512},{"className":2511},[],[2513],{"type":42,"value":2514},"needs-user",{"type":42,"value":2516},"; do not start discovery if the missing value\nwould make discovery incomplete. Optional keys may remain blank when the adapter says\nthey are optional.",{"type":37,"tag":215,"props":2518,"children":2519},{},[2520],{"type":42,"value":2521},"Generated scripts should load project-local config first, then process environment,\nwith real environment variables allowed to override file values. Blank config values\nmust never overwrite non-empty environment variables.",{"type":37,"tag":44,"props":2523,"children":2524},{},[2525],{"type":42,"value":2526},"Never print secret values back to the user. It is fine to say a required secret is\npresent or missing.",{"type":37,"tag":75,"props":2528,"children":2530},{"id":2529},"headless-site-creation",[2531],{"type":42,"value":2532},"Headless site creation",{"type":37,"tag":44,"props":2534,"children":2535},{},[2536,2538,2543,2545,2550,2552,2557],{"type":42,"value":2537},"When ",{"type":37,"tag":50,"props":2539,"children":2541},{"className":2540},[],[2542],{"type":42,"value":557},{"type":42,"value":2544},", site creation happens before setup\u002Fimport. ",{"type":37,"tag":134,"props":2546,"children":2547},{},[2548],{"type":42,"value":2549},"Both delivery\nmodes create the site the same way",{"type":42,"value":2551}," (see \"Delivery mode\"); ",{"type":37,"tag":50,"props":2553,"children":2555},{"className":2554},[],[2556],{"type":42,"value":313},{"type":42,"value":2558}," just stops before\nthe frontend build.",{"type":37,"tag":44,"props":2560,"children":2561},{},[2562,2567,2569,2575,2577,2582,2584,2588,2590,2596,2598,2604,2606,2611],{"type":37,"tag":134,"props":2563,"children":2564},{},[2565],{"type":42,"value":2566},"Create the site with the Wix CLI headless scaffold — not the account-level Projects API.",{"type":42,"value":2568},"\nThe Projects API (",{"type":37,"tag":50,"props":2570,"children":2572},{"className":2571},[],[2573],{"type":42,"value":2574},"POST \u002Ffunnel\u002Fprojects\u002Fv1\u002Fcreate",{"type":42,"value":2576},") was the prior default but is\n",{"type":37,"tag":134,"props":2578,"children":2579},{},[2580],{"type":42,"value":2581},"deprecated for this workflow",{"type":42,"value":2583},": in testing it produced sites that were ",{"type":37,"tag":134,"props":2585,"children":2586},{},[2587],{"type":42,"value":942},{"type":42,"value":2589}," genuinely\nheadless and it silently dropped the ",{"type":37,"tag":50,"props":2591,"children":2593},{"className":2592},[],[2594],{"type":42,"value":2595},"apps[]",{"type":42,"value":2597}," install list. The CLI scaffold\n(",{"type":37,"tag":50,"props":2599,"children":2601},{"className":2600},[],[2602],{"type":42,"value":2603},"npm create @wix\u002Fnew@latest headless",{"type":42,"value":2605},", the same path the ",{"type":37,"tag":50,"props":2607,"children":2609},{"className":2608},[],[2610],{"type":42,"value":384},{"type":42,"value":2612}," skill uses) is the\nverified way to get a real Wix Managed Headless site.",{"type":37,"tag":44,"props":2614,"children":2615},{},[2616],{"type":37,"tag":134,"props":2617,"children":2618},{},[2619,2621,2626],{"type":42,"value":2620},"Method (delegate to the ",{"type":37,"tag":50,"props":2622,"children":2624},{"className":2623},[],[2625],{"type":42,"value":384},{"type":42,"value":2627}," scaffold):",{"type":37,"tag":211,"props":2629,"children":2630},{},[2631,2663,2718,2910,3001,3060,3118],{"type":37,"tag":215,"props":2632,"children":2633},{},[2634,2639,2641,2646,2648,2654,2656,2661],{"type":37,"tag":134,"props":2635,"children":2636},{},[2637],{"type":42,"value":2638},"Prerequisite:",{"type":42,"value":2640}," the Wix CLI must be logged in ",{"type":37,"tag":134,"props":2642,"children":2643},{},[2644],{"type":42,"value":2645},"to the account the user intends the site\nto live on",{"type":42,"value":2647},". Check ",{"type":37,"tag":50,"props":2649,"children":2651},{"className":2650},[],[2652],{"type":42,"value":2653},"npx @wix\u002Fcli@latest whoami",{"type":42,"value":2655},"; if logged out, halt to needs-user to run\n",{"type":37,"tag":50,"props":2657,"children":2659},{"className":2658},[],[2660],{"type":42,"value":263},{"type":42,"value":2662}," (interactive — it prints a URL + code; it cannot be done from a\nraw API key). This replaces the old \"site-creation API key\" input — headless creation is\nCLI-authenticated, tied to the logged-in Wix account.",{"type":37,"tag":215,"props":2664,"children":2665},{},[2666,2671,2673,2679,2681,2687,2689,2695,2697,2702,2704,2709,2711,2716],{"type":37,"tag":134,"props":2667,"children":2668},{},[2669],{"type":42,"value":2670},"Confirm the account BEFORE scaffolding — this is a mandatory gate, not a nicety.",{"type":42,"value":2672}," The\nCLI silently creates the site on whatever account it is logged into, with no error if it's\nthe wrong one. Show the user the ",{"type":37,"tag":50,"props":2674,"children":2676},{"className":2675},[],[2677],{"type":42,"value":2678},"whoami",{"type":42,"value":2680}," email and confirm it is the intended Wix account.\nIf it is not (e.g. a personal Gmail account instead of the user's business account), halt to\nneeds-user: ",{"type":37,"tag":50,"props":2682,"children":2684},{"className":2683},[],[2685],{"type":42,"value":2686},"npx @wix\u002Fcli@latest logout",{"type":42,"value":2688}," then ",{"type":37,"tag":50,"props":2690,"children":2692},{"className":2691},[],[2693],{"type":42,"value":2694},"login",{"type":42,"value":2696}," as the correct account, and re-verify.\nDo not scaffold against an unconfirmed account. ",{"type":37,"tag":134,"props":2698,"children":2699},{},[2700],{"type":42,"value":2701},"Use one account consistently for the whole\nrun",{"type":42,"value":2703}," — the same CLI account creates the site ",{"type":37,"tag":877,"props":2705,"children":2706},{},[2707],{"type":42,"value":2708},"and",{"type":42,"value":2710}," mints the import write token; never mix\nin a separate ",{"type":37,"tag":50,"props":2712,"children":2714},{"className":2713},[],[2715],{"type":42,"value":2170},{"type":42,"value":2717}," API key that belongs to a different account (a create\u002Fimport\naccount split silently writes to the wrong place or 404\u002F403s).",{"type":37,"tag":215,"props":2719,"children":2720},{},[2721,2726,2728,2733,2735,2741,2743,2749,2751,2858,2861,2863,2869,2871,2877,2879,2885,2887,2893,2895,2900,2902,2908],{"type":37,"tag":134,"props":2722,"children":2723},{},[2724],{"type":42,"value":2725},"Scaffold inside the active migration project",{"type":42,"value":2727}," with the Wix CLI create command (this is\nthe primary, self-contained path — it needs no other skill installed). Run it from\n",{"type":37,"tag":50,"props":2729,"children":2731},{"className":2730},[],[2732],{"type":42,"value":55},{"type":42,"value":2734}," and use ",{"type":37,"tag":50,"props":2736,"children":2738},{"className":2737},[],[2739],{"type":42,"value":2740},"--folder-name frontend",{"type":42,"value":2742}," unless the project artifacts\nexplicitly name a different scaffold folder. The command creates the ",{"type":37,"tag":50,"props":2744,"children":2746},{"className":2745},[],[2747],{"type":42,"value":2748},"frontend\u002F",{"type":42,"value":2750},"\nsubfolder; it does not replace the migration folder or become the migration root:",{"type":37,"tag":1977,"props":2752,"children":2754},{"className":1979,"code":2753,"language":1981,"meta":1982,"style":1982},"npm create @wix\u002Fnew@latest -- headless \\\n  --business-name \"\u003CBrand Name>\" \\\n  --folder-name frontend \\\n  --site-template commerce --no-publish --skip-install\n",[2755],{"type":37,"tag":50,"props":2756,"children":2757},{"__ignoreMap":1982},[2758,2791,2818,2835],{"type":37,"tag":1988,"props":2759,"children":2760},{"class":1990,"line":1991},[2761,2766,2771,2776,2781,2786],{"type":37,"tag":1988,"props":2762,"children":2763},{"style":2230},[2764],{"type":42,"value":2765},"npm",{"type":37,"tag":1988,"props":2767,"children":2768},{"style":2190},[2769],{"type":42,"value":2770}," create",{"type":37,"tag":1988,"props":2772,"children":2773},{"style":2190},[2774],{"type":42,"value":2775}," @wix\u002Fnew@latest",{"type":37,"tag":1988,"props":2777,"children":2778},{"style":2190},[2779],{"type":42,"value":2780}," --",{"type":37,"tag":1988,"props":2782,"children":2783},{"style":2190},[2784],{"type":42,"value":2785}," headless",{"type":37,"tag":1988,"props":2787,"children":2788},{"style":1995},[2789],{"type":42,"value":2790}," \\\n",{"type":37,"tag":1988,"props":2792,"children":2793},{"class":1990,"line":2007},[2794,2799,2804,2809,2814],{"type":37,"tag":1988,"props":2795,"children":2796},{"style":2190},[2797],{"type":42,"value":2798},"  --business-name",{"type":37,"tag":1988,"props":2800,"children":2801},{"style":2001},[2802],{"type":42,"value":2803}," \"",{"type":37,"tag":1988,"props":2805,"children":2806},{"style":2190},[2807],{"type":42,"value":2808},"\u003CBrand Name>",{"type":37,"tag":1988,"props":2810,"children":2811},{"style":2001},[2812],{"type":42,"value":2813},"\"",{"type":37,"tag":1988,"props":2815,"children":2816},{"style":1995},[2817],{"type":42,"value":2790},{"type":37,"tag":1988,"props":2819,"children":2820},{"class":1990,"line":2020},[2821,2826,2831],{"type":37,"tag":1988,"props":2822,"children":2823},{"style":2190},[2824],{"type":42,"value":2825},"  --folder-name",{"type":37,"tag":1988,"props":2827,"children":2828},{"style":2190},[2829],{"type":42,"value":2830}," frontend",{"type":37,"tag":1988,"props":2832,"children":2833},{"style":1995},[2834],{"type":42,"value":2790},{"type":37,"tag":1988,"props":2836,"children":2837},{"class":1990,"line":2033},[2838,2843,2848,2853],{"type":37,"tag":1988,"props":2839,"children":2840},{"style":2190},[2841],{"type":42,"value":2842},"  --site-template",{"type":37,"tag":1988,"props":2844,"children":2845},{"style":2190},[2846],{"type":42,"value":2847}," commerce",{"type":37,"tag":1988,"props":2849,"children":2850},{"style":2190},[2851],{"type":42,"value":2852}," --no-publish",{"type":37,"tag":1988,"props":2854,"children":2855},{"style":2190},[2856],{"type":42,"value":2857}," --skip-install\n",{"type":37,"tag":2071,"props":2859,"children":2860},{},[],{"type":42,"value":2862},"This creates a real headless site and writes ",{"type":37,"tag":50,"props":2864,"children":2866},{"className":2865},[],[2867],{"type":42,"value":2868},"frontend\u002Fwix.config.json",{"type":42,"value":2870}," with ",{"type":37,"tag":50,"props":2872,"children":2874},{"className":2873},[],[2875],{"type":42,"value":2876},"appId",{"type":42,"value":2878}," and\n",{"type":37,"tag":50,"props":2880,"children":2882},{"className":2881},[],[2883],{"type":42,"value":2884},"siteId",{"type":42,"value":2886},". This is the one step that may run live while the rest of the migration\nremains in dry-run mode. Run the ",{"type":37,"tag":50,"props":2888,"children":2890},{"className":2889},[],[2891],{"type":42,"value":2892},"npm create",{"type":42,"value":2894}," command above directly —\n",{"type":37,"tag":50,"props":2896,"children":2898},{"className":2897},[],[2899],{"type":42,"value":384},{"type":42,"value":2901}," no longer ships a ",{"type":37,"tag":50,"props":2903,"children":2905},{"className":2904},[],[2906],{"type":42,"value":2907},"scripts\u002Fscaffold.sh",{"type":42,"value":2909}," wrapper, and this path\ndeliberately needs no other skill installed.",{"type":37,"tag":215,"props":2911,"children":2912},{},[2913,2930,2931,2937,2939,2945,2946,2956,2958,2963,2965,2970,2972,2977,2979,2985,2987,2992,2994,2999],{"type":37,"tag":134,"props":2914,"children":2915},{},[2916,2922,2924,2929],{"type":37,"tag":50,"props":2917,"children":2919},{"className":2918},[],[2920],{"type":42,"value":2921},"--site-template commerce",{"type":42,"value":2923}," is load-bearing when the migration carries a product\ncatalog — never scaffold ",{"type":37,"tag":50,"props":2925,"children":2927},{"className":2926},[],[2928],{"type":42,"value":1733},{"type":42,"value":621},{"type":42,"value":1161},{"type":37,"tag":50,"props":2932,"children":2934},{"className":2933},[],[2935],{"type":42,"value":2936},"--site-template",{"type":42,"value":2938}," accepts\n",{"type":37,"tag":50,"props":2940,"children":2942},{"className":2941},[],[2943],{"type":42,"value":2944},"commerce|scheduler|registration|blank",{"type":42,"value":1918},{"type":37,"tag":134,"props":2947,"children":2948},{},[2949,2951],{"type":42,"value":2950},"passing it bare, with no value, means\n",{"type":37,"tag":50,"props":2952,"children":2954},{"className":2953},[],[2955],{"type":42,"value":1733},{"type":42,"value":2957}," (\"no business solution preconfigured\"). On a blank site, installing Wix Stores\nafterwards through the App Installation API provisions ",{"type":37,"tag":134,"props":2959,"children":2960},{},[2961],{"type":42,"value":2962},"Catalog V1",{"type":42,"value":2964},", which this workflow\ndoes not support at all — the Stores primitives in ",{"type":37,"tag":50,"props":2966,"children":2968},{"className":2967},[],[2969],{"type":42,"value":1149},{"type":42,"value":2971}," are V3-only. A site's\ncatalog version is ",{"type":37,"tag":134,"props":2973,"children":2974},{},[2975],{"type":42,"value":2976},"fixed at provisioning",{"type":42,"value":2978}," — there is no in-place V1 → V3 switch — so a\nblank scaffold silently costs the whole site and forces a rebuild. The ",{"type":37,"tag":50,"props":2980,"children":2982},{"className":2981},[],[2983],{"type":42,"value":2984},"commerce",{"type":42,"value":2986}," template\nis Commerce (Wix Stores) and provisions Stores on ",{"type":37,"tag":134,"props":2988,"children":2989},{},[2990],{"type":42,"value":2991},"Catalog V3",{"type":42,"value":2993}," at creation. In ",{"type":37,"tag":50,"props":2995,"children":2997},{"className":2996},[],[2998],{"type":42,"value":357},{"type":42,"value":3000},"\nmode, treat its pages as scaffolding to restyle, not as the delivered design.",{"type":37,"tag":215,"props":3002,"children":3003},{},[3004,3009,3011,3016,3018,3023,3025,3030,3032,3036,3038,3043,3045,3051,3053,3058],{"type":37,"tag":134,"props":3005,"children":3006},{},[3007],{"type":42,"value":3008},"Exactly one destination site per migration.",{"type":42,"value":3010}," Site creation happens ",{"type":37,"tag":134,"props":3012,"children":3013},{},[3014],{"type":42,"value":3015},"once",{"type":42,"value":3017},". Before\nscaffolding, read ",{"type":37,"tag":50,"props":3019,"children":3021},{"className":3020},[],[3022],{"type":42,"value":2158},{"type":42,"value":3024}," from ",{"type":37,"tag":50,"props":3026,"children":3028},{"className":3027},[],[3029],{"type":42,"value":412},{"type":42,"value":3031}," — non-empty means the site already\nexists, so do ",{"type":37,"tag":134,"props":3033,"children":3034},{},[3035],{"type":42,"value":942},{"type":42,"value":3037}," scaffold again: not to retry a failed step, not to \"start clean\",\nnot after an error. ",{"type":37,"tag":134,"props":3039,"children":3040},{},[3041],{"type":42,"value":3042},"Never create a probe, test, or throwaway site",{"type":42,"value":3044}," to verify what a\ntemplate or an install produced — every site lands in the user's real Wix account, stays\nvisible there, and has to be deleted by hand. Verify on the migration's own site with the\nread-only catalog-version check below. If the site is genuinely unusable (e.g. it came up\n",{"type":37,"tag":50,"props":3046,"children":3048},{"className":3047},[],[3049],{"type":42,"value":3050},"V1_CATALOG",{"type":42,"value":3052},"), halt to needs-user with the site id and ask to approve a replacement rather\nthan rebuilding silently; on approval, write the new id into ",{"type":37,"tag":50,"props":3054,"children":3056},{"className":3055},[],[3057],{"type":42,"value":412},{"type":42,"value":3059}," and report\nthe abandoned site id as safe to delete.",{"type":37,"tag":215,"props":3061,"children":3062},{},[3063,3074,3076,3081,3082,3087,3088,3093,3095,3100,3102,3108,3110,3116],{"type":37,"tag":134,"props":3064,"children":3065},{},[3066,3068,3073],{"type":42,"value":3067},"Record ids from ",{"type":37,"tag":50,"props":3069,"children":3071},{"className":3070},[],[3072],{"type":42,"value":2474},{"type":42,"value":298},{"type":42,"value":3075}," persist ",{"type":37,"tag":50,"props":3077,"children":3079},{"className":3078},[],[3080],{"type":42,"value":2884},{"type":42,"value":2273},{"type":37,"tag":50,"props":3083,"children":3085},{"className":3084},[],[3086],{"type":42,"value":412},{"type":42,"value":527},{"type":37,"tag":50,"props":3089,"children":3091},{"className":3090},[],[3092],{"type":42,"value":2158},{"type":42,"value":3094},", and keep ",{"type":37,"tag":50,"props":3096,"children":3098},{"className":3097},[],[3099],{"type":42,"value":2876},{"type":42,"value":3101}," in project artifacts. Construct the dashboard URL from the\nsite's ",{"type":37,"tag":50,"props":3103,"children":3105},{"className":3104},[],[3106],{"type":42,"value":3107},"metaSiteId",{"type":42,"value":3109}," (resolve it via ",{"type":37,"tag":50,"props":3111,"children":3113},{"className":3112},[],[3114],{"type":42,"value":3115},"ListWixSites",{"type":42,"value":3117},"\u002Fsite query when needed).",{"type":37,"tag":215,"props":3119,"children":3120},{},[3121,3126,3128,3134,3136,3142,3144,3188,3191,3193,3199,3201,3207,3209,3215,3217,3223,3225,3230,3232,3235,3240,3242,3248,3250,3256],{"type":37,"tag":134,"props":3122,"children":3123},{},[3124],{"type":42,"value":3125},"Auth for later site-level writes is a CLI token, not a raw API key.",{"type":42,"value":3127}," Mint it without\nprinting the secret to the transcript by running ",{"type":37,"tag":50,"props":3129,"children":3131},{"className":3130},[],[3132],{"type":42,"value":3133},"scripts\u002Fmint-token.sh",{"type":42,"value":3135}," from the\nmigration project root. The canonical copy lives at\n",{"type":37,"tag":50,"props":3137,"children":3139},{"className":3138},[],[3140],{"type":42,"value":3141},"skills\u002Freplatform\u002Fresources\u002Frp-execute-setup\u002Fscripts\u002Fmint-token.sh",{"type":42,"value":3143},"; codegen copies it\ninto each migration project at scaffolding time. Run it via Bash:",{"type":37,"tag":1977,"props":3145,"children":3147},{"className":1979,"code":3146,"language":1981,"meta":1982,"style":1982},"bash migrations\u002F\u003Cproject>\u002Fscripts\u002Fmint-token.sh\n",[3148],{"type":37,"tag":50,"props":3149,"children":3150},{"__ignoreMap":1982},[3151],{"type":37,"tag":1988,"props":3152,"children":3153},{"class":1990,"line":1991},[3154,3158,3163,3168,3173,3178,3183],{"type":37,"tag":1988,"props":3155,"children":3156},{"style":2230},[3157],{"type":42,"value":1981},{"type":37,"tag":1988,"props":3159,"children":3160},{"style":2190},[3161],{"type":42,"value":3162}," migrations\u002F",{"type":37,"tag":1988,"props":3164,"children":3165},{"style":2001},[3166],{"type":42,"value":3167},"\u003C",{"type":37,"tag":1988,"props":3169,"children":3170},{"style":2190},[3171],{"type":42,"value":3172},"projec",{"type":37,"tag":1988,"props":3174,"children":3175},{"style":1995},[3176],{"type":42,"value":3177},"t",{"type":37,"tag":1988,"props":3179,"children":3180},{"style":2001},[3181],{"type":42,"value":3182},">",{"type":37,"tag":1988,"props":3184,"children":3185},{"style":2190},[3186],{"type":42,"value":3187},"\u002Fscripts\u002Fmint-token.sh\n",{"type":37,"tag":2071,"props":3189,"children":3190},{},[],{"type":42,"value":3192},"Token shape: ",{"type":37,"tag":50,"props":3194,"children":3196},{"className":3195},[],[3197],{"type":42,"value":3198},"OauthNG.JWS.\u003Cbase64>.\u003Cbase64>.\u003Csig>",{"type":42,"value":3200}," — a single line on stdout with no JSON\nwrapper. Send it as a ",{"type":37,"tag":50,"props":3202,"children":3204},{"className":3203},[],[3205],{"type":42,"value":3206},"Bearer",{"type":42,"value":3208}," token (",{"type":37,"tag":50,"props":3210,"children":3212},{"className":3211},[],[3213],{"type":42,"value":3214},"Authorization: Bearer \u003Ctoken>",{"type":42,"value":3216},", plus\n",{"type":37,"tag":50,"props":3218,"children":3220},{"className":3219},[],[3221],{"type":42,"value":3222},"wix-site-id: \u003CsiteId>",{"type":42,"value":3224},"). The generated import client must send it as a Bearer token.\n(",{"type":37,"tag":50,"props":3226,"children":3228},{"className":3227},[],[3229],{"type":42,"value":2170},{"type":42,"value":3231}," is no longer a create-time API key; if set, it is the site write\ncredential the generated code consumes.)",{"type":37,"tag":2071,"props":3233,"children":3234},{},[],{"type":37,"tag":134,"props":3236,"children":3237},{},[3238],{"type":42,"value":3239},"Do not",{"type":42,"value":3241}," run ",{"type":37,"tag":50,"props":3243,"children":3245},{"className":3244},[],[3246],{"type":42,"value":3247},"npx @wix\u002Fcli@latest token",{"type":42,"value":3249}," raw in a Bash tool call — it prints the\ncredential to stdout which lands in the transcript. Always route through ",{"type":37,"tag":50,"props":3251,"children":3253},{"className":3252},[],[3254],{"type":42,"value":3255},"mint-token.sh",{"type":42,"value":621},{"type":37,"tag":44,"props":3258,"children":3259},{},[3260,3265,3267,3273,3275,3281,3283,3288,3290,3296,3298,3304,3306,3312],{"type":37,"tag":134,"props":3261,"children":3262},{},[3263],{"type":42,"value":3264},"Wix Stores (and other apps) are NOT installed by the scaffold.",{"type":42,"value":3266}," A freshly scaffolded\nheadless site has no Wix Stores — ",{"type":37,"tag":50,"props":3268,"children":3270},{"className":3269},[],[3271],{"type":42,"value":3272},"stores\u002Fv3",{"type":42,"value":3274}," returns ",{"type":37,"tag":50,"props":3276,"children":3278},{"className":3277},[],[3279],{"type":42,"value":3280},"428 REQUIRED_APP_NOT_INSTALLED",{"type":42,"value":3282}," until\nStores is installed. Install required apps as a distinct step after scaffolding, via the\nsame path ",{"type":37,"tag":50,"props":3284,"children":3286},{"className":3285},[],[3287],{"type":42,"value":384},{"type":42,"value":3289}," uses (its ",{"type":37,"tag":50,"props":3291,"children":3293},{"className":3292},[],[3294],{"type":42,"value":3295},"SETUP.md",{"type":42,"value":3297}," Step 3 → the ",{"type":37,"tag":50,"props":3299,"children":3301},{"className":3300},[],[3302],{"type":42,"value":3303},"wix-manage",{"type":42,"value":3305}," skill \u002F app-install\nAPI), authenticated with the CLI token. Verify installation (e.g. ",{"type":37,"tag":50,"props":3307,"children":3309},{"className":3308},[],[3310],{"type":42,"value":3311},"stores\u002Fv3\u002Fproducts\u002Fcount",{"type":42,"value":3313},"\nresponds) before importing. Do not assume creation installed Stores.",{"type":37,"tag":44,"props":3315,"children":3316},{},[3317,3322,3324,3329],{"type":37,"tag":134,"props":3318,"children":3319},{},[3320],{"type":42,"value":3321},"Then verify the catalog is V3 — before any Stores write.",{"type":42,"value":3323}," Installing Stores does not\nguarantee Catalog V3 (a ",{"type":37,"tag":50,"props":3325,"children":3327},{"className":3326},[],[3328],{"type":42,"value":1733},{"type":42,"value":3330},"-scaffolded site comes up V1). Gate on the read-only\nCatalog Versioning API:",{"type":37,"tag":1977,"props":3332,"children":3334},{"className":1979,"code":3333,"language":1981,"meta":1982,"style":1982},"curl -s -H \"Authorization: Bearer $WIX_AUTH_TOKEN\" -H \"wix-site-id: $WIX_SITE_ID\" \\\n  https:\u002F\u002Fwww.wixapis.com\u002Fstores\u002Fv3\u002Fprovision\u002Fversion\n",[3335],{"type":37,"tag":50,"props":3336,"children":3337},{"__ignoreMap":1982},[3338,3400],{"type":37,"tag":1988,"props":3339,"children":3340},{"class":1990,"line":1991},[3341,3346,3351,3356,3360,3365,3370,3374,3378,3382,3387,3392,3396],{"type":37,"tag":1988,"props":3342,"children":3343},{"style":2230},[3344],{"type":42,"value":3345},"curl",{"type":37,"tag":1988,"props":3347,"children":3348},{"style":2190},[3349],{"type":42,"value":3350}," -s",{"type":37,"tag":1988,"props":3352,"children":3353},{"style":2190},[3354],{"type":42,"value":3355}," -H",{"type":37,"tag":1988,"props":3357,"children":3358},{"style":2001},[3359],{"type":42,"value":2803},{"type":37,"tag":1988,"props":3361,"children":3362},{"style":2190},[3363],{"type":42,"value":3364},"Authorization: Bearer ",{"type":37,"tag":1988,"props":3366,"children":3367},{"style":1995},[3368],{"type":42,"value":3369},"$WIX_AUTH_TOKEN",{"type":37,"tag":1988,"props":3371,"children":3372},{"style":2001},[3373],{"type":42,"value":2813},{"type":37,"tag":1988,"props":3375,"children":3376},{"style":2190},[3377],{"type":42,"value":3355},{"type":37,"tag":1988,"props":3379,"children":3380},{"style":2001},[3381],{"type":42,"value":2803},{"type":37,"tag":1988,"props":3383,"children":3384},{"style":2190},[3385],{"type":42,"value":3386},"wix-site-id: ",{"type":37,"tag":1988,"props":3388,"children":3389},{"style":1995},[3390],{"type":42,"value":3391},"$WIX_SITE_ID",{"type":37,"tag":1988,"props":3393,"children":3394},{"style":2001},[3395],{"type":42,"value":2813},{"type":37,"tag":1988,"props":3397,"children":3398},{"style":1995},[3399],{"type":42,"value":2790},{"type":37,"tag":1988,"props":3401,"children":3402},{"class":1990,"line":2007},[3403],{"type":37,"tag":1988,"props":3404,"children":3405},{"style":2190},[3406],{"type":42,"value":3407},"  https:\u002F\u002Fwww.wixapis.com\u002Fstores\u002Fv3\u002Fprovision\u002Fversion\n",{"type":37,"tag":44,"props":3409,"children":3410},{},[3411,3417,3419,3425,3427,3433,3435,3440,3442,3447,3449,3454],{"type":37,"tag":50,"props":3412,"children":3414},{"className":3413},[],[3415],{"type":42,"value":3416},"catalogVersion",{"type":42,"value":3418}," is ",{"type":37,"tag":50,"props":3420,"children":3422},{"className":3421},[],[3423],{"type":42,"value":3424},"V3_CATALOG",{"type":42,"value":3426}," (proceed), ",{"type":37,"tag":50,"props":3428,"children":3430},{"className":3429},[],[3431],{"type":42,"value":3432},"STORES_NOT_INSTALLED",{"type":42,"value":3434}," (install Stores, re-check),\nor ",{"type":37,"tag":50,"props":3436,"children":3438},{"className":3437},[],[3439],{"type":42,"value":3050},{"type":42,"value":3441}," (",{"type":37,"tag":134,"props":3443,"children":3444},{},[3445],{"type":42,"value":3446},"stop — write nothing, and see the one-site rule above",{"type":42,"value":3448},"). Record the\nresult in ",{"type":37,"tag":50,"props":3450,"children":3452},{"className":3451},[],[3453],{"type":42,"value":691},{"type":42,"value":3455},". Do not skip this check on the assumption that\nevery Stores install is V3.",{"type":37,"tag":44,"props":3457,"children":3458},{},[3459,3464,3466,3471,3473,3478,3480,3486,3488,3493],{"type":37,"tag":134,"props":3460,"children":3461},{},[3462],{"type":42,"value":3463},"Wipe the default demo catalog before importing — in BOTH modes.",{"type":42,"value":3465}," A fresh Wix Stores\ninstall (and ",{"type":37,"tag":50,"props":3467,"children":3469},{"className":3468},[],[3470],{"type":42,"value":384},{"type":42,"value":3472},"'s seed step) pre-populates the store with ~12 placeholder demo\nproducts and demo categories. Left in place they mix with the migrated catalog (a clean\n100-product import otherwise reads as 112). After Stores is installed and before\u002Fright after\nthe import, delete the default demo products and demo categories so the store holds ",{"type":37,"tag":134,"props":3474,"children":3475},{},[3476],{"type":42,"value":3477},"only",{"type":42,"value":3479},"\nthe migrated data (keep the system ",{"type":37,"tag":50,"props":3481,"children":3483},{"className":3482},[],[3484],{"type":42,"value":3485},"All Products",{"type":42,"value":3487}," category). This is the same cleanup the\nwebsite-mode section requires; it applies to the default ",{"type":37,"tag":50,"props":3489,"children":3491},{"className":3490},[],[3492],{"type":42,"value":313},{"type":42,"value":3494}," mode too, because both\nmodes now start from a freshly-provisioned Stores catalog.",{"type":37,"tag":44,"props":3496,"children":3497},{},[3498,3503,3505,3509,3511,3517,3519,3524,3526,3532,3534,3540,3542,3547],{"type":37,"tag":134,"props":3499,"children":3500},{},[3501],{"type":42,"value":3502},"Site-scoping gotcha:",{"type":42,"value":3504}," Wix Stores\u002FCategories site-level APIs scope by the site's\n",{"type":37,"tag":134,"props":3506,"children":3507},{},[3508],{"type":42,"value":3107},{"type":42,"value":3510}," in the ",{"type":37,"tag":50,"props":3512,"children":3514},{"className":3513},[],[3515],{"type":42,"value":3516},"wix-site-id",{"type":42,"value":3518}," header on some sites; if the scaffold ",{"type":37,"tag":50,"props":3520,"children":3522},{"className":3521},[],[3523],{"type":42,"value":2884},{"type":42,"value":3525}," returns\n",{"type":37,"tag":50,"props":3527,"children":3529},{"className":3528},[],[3530],{"type":42,"value":3531},"404",{"type":42,"value":3533},"\u002F",{"type":37,"tag":50,"props":3535,"children":3537},{"className":3536},[],[3538],{"type":42,"value":3539},"meta-site not found",{"type":42,"value":3541}," on a Stores call, resolve and use the ",{"type":37,"tag":50,"props":3543,"children":3545},{"className":3544},[],[3546],{"type":42,"value":3107},{"type":42,"value":621},{"type":37,"tag":75,"props":3549,"children":3551},{"id":3550},"website-mode-build-the-storefront-with-wix-headless",[3552,3554],{"type":42,"value":3553},"Website mode: build the storefront with ",{"type":37,"tag":50,"props":3555,"children":3557},{"className":3556},[],[3558],{"type":42,"value":384},{"type":37,"tag":44,"props":3560,"children":3561},{},[3562,3564,3569,3571,3576],{"type":42,"value":3563},"Run this only when the delivery mode is ",{"type":37,"tag":50,"props":3565,"children":3567},{"className":3566},[],[3568],{"type":42,"value":357},{"type":42,"value":3570}," (the user explicitly asked for a\nstorefront\u002Fwebsite\u002Ffrontend). In ",{"type":37,"tag":50,"props":3572,"children":3574},{"className":3573},[],[3575],{"type":42,"value":313},{"type":42,"value":3577}," mode, skip this section entirely — the run\nends after import.",{"type":37,"tag":44,"props":3579,"children":3580},{},[3581,3586,3588,3593,3595,3600,3602,3606,3608,3613],{"type":37,"tag":50,"props":3582,"children":3584},{"className":3583},[],[3585],{"type":42,"value":384},{"type":42,"value":3587}," builds a JavaScript storefront ",{"type":37,"tag":134,"props":3589,"children":3590},{},[3591],{"type":42,"value":3592},"only for a site it creates itself",{"type":42,"value":3594},"; it\ncannot target a pre-existing site id. So in ",{"type":37,"tag":50,"props":3596,"children":3598},{"className":3597},[],[3599],{"type":42,"value":357},{"type":42,"value":3601}," mode let it own the CLI scaffold — do\n",{"type":37,"tag":134,"props":3603,"children":3604},{},[3605],{"type":42,"value":942},{"type":42,"value":3607}," run the \"Headless site creation\" scaffold yourself first (that would produce a\nsecond, empty site). RePlatform then imports the migrated catalog into the site\n",{"type":37,"tag":50,"props":3609,"children":3611},{"className":3610},[],[3612],{"type":42,"value":384},{"type":42,"value":3614}," created.",{"type":37,"tag":44,"props":3616,"children":3617},{},[3618],{"type":42,"value":3619},"Sequence:",{"type":37,"tag":1294,"props":3621,"children":3622},{},[3623,3646,3718,3776,3793],{"type":37,"tag":215,"props":3624,"children":3625},{},[3626,3631,3633,3637,3639,3644],{"type":37,"tag":134,"props":3627,"children":3628},{},[3629],{"type":42,"value":3630},"Read-only migration prep first.",{"type":42,"value":3632}," Run discovery → mapping (+ review checkpoint) →\nsetup-discovery → codegen as usual. Do ",{"type":37,"tag":134,"props":3634,"children":3635},{},[3636],{"type":42,"value":942},{"type":42,"value":3638}," create a site yet, and leave\n",{"type":37,"tag":50,"props":3640,"children":3642},{"className":3641},[],[3643],{"type":42,"value":2158},{"type":42,"value":3645}," blank.",{"type":37,"tag":215,"props":3647,"children":3648},{},[3649,3660,3662,3667,3669,3674,3676,3682,3684,3690,3692,3703,3705,3710,3712,3716],{"type":37,"tag":134,"props":3650,"children":3651},{},[3652,3654,3659],{"type":42,"value":3653},"Hand off site creation + storefront to ",{"type":37,"tag":50,"props":3655,"children":3657},{"className":3656},[],[3658],{"type":42,"value":384},{"type":42,"value":621},{"type":42,"value":3661}," Invoke the ",{"type":37,"tag":50,"props":3663,"children":3665},{"className":3664},[],[3666],{"type":42,"value":384},{"type":42,"value":3668},"\nskill (Skill tool, name ",{"type":37,"tag":50,"props":3670,"children":3672},{"className":3671},[],[3673],{"type":42,"value":384},{"type":42,"value":3675},"; it starts at its own ",{"type":37,"tag":50,"props":3677,"children":3679},{"className":3678},[],[3680],{"type":42,"value":3681},"SKILL.md",{"type":42,"value":3683},", which resolves the\nproject type and routes a new-site run to ",{"type":37,"tag":50,"props":3685,"children":3687},{"className":3686},[],[3688],{"type":42,"value":3689},"references\u002Fmanaged\u002FCREATE.md",{"type":42,"value":3691},") with the store\nintent and brand. It creates a new headless site with Wix Stores installed, scaffolds an\nAstro storefront, and builds + releases it, yielding a live URL. Its demo seeding is\nidempotent and its pages read the live catalog at request time.\n",{"type":37,"tag":134,"props":3693,"children":3694},{},[3695,3697,3702],{"type":42,"value":3696},"Tell it to scaffold ",{"type":37,"tag":50,"props":3698,"children":3700},{"className":3699},[],[3701],{"type":42,"value":2921},{"type":42,"value":621},{"type":42,"value":3704}," Its own create flow scaffolds the\n",{"type":37,"tag":50,"props":3706,"children":3708},{"className":3707},[],[3709],{"type":42,"value":1733},{"type":42,"value":3711}," template on the reasoning that the model owns the design — correct for a\nbuild-from-a-prompt run, wrong here: a blank site's Stores install comes up ",{"type":37,"tag":134,"props":3713,"children":3714},{},[3715],{"type":42,"value":2962},{"type":42,"value":3717},"\nand cannot be converted (see \"Headless site creation\"). Its template pages are scaffolding\nto restyle against the captured source, not the delivered design.",{"type":37,"tag":215,"props":3719,"children":3720},{},[3721,3726,3728,3733,3735,3740,3742,3747,3749,3754,3755,3760,3762,3767,3769,3774],{"type":37,"tag":134,"props":3722,"children":3723},{},[3724],{"type":42,"value":3725},"Adopt that site as the migration destination.",{"type":42,"value":3727}," Read ",{"type":37,"tag":50,"props":3729,"children":3731},{"className":3730},[],[3732],{"type":42,"value":2884},{"type":42,"value":3734}," from the ",{"type":37,"tag":50,"props":3736,"children":3738},{"className":3737},[],[3739],{"type":42,"value":384},{"type":42,"value":3741},"\nproject's ",{"type":37,"tag":50,"props":3743,"children":3745},{"className":3744},[],[3746],{"type":42,"value":2474},{"type":42,"value":3748},", persist it into ",{"type":37,"tag":50,"props":3750,"children":3752},{"className":3751},[],[3753],{"type":42,"value":412},{"type":42,"value":414},{"type":37,"tag":50,"props":3756,"children":3758},{"className":3757},[],[3759],{"type":42,"value":2158},{"type":42,"value":3761},", and keep\n",{"type":37,"tag":50,"props":3763,"children":3765},{"className":3764},[],[3766],{"type":42,"value":557},{"type":42,"value":3768},". The Wix auth used for import must be able to write to that site.\nThen run the catalog-version gate from \"Headless site creation\" before any Stores write —\na site handed over by ",{"type":37,"tag":50,"props":3770,"children":3772},{"className":3771},[],[3773],{"type":42,"value":384},{"type":42,"value":3775}," is not exempt.",{"type":37,"tag":215,"props":3777,"children":3778},{},[3779,3784,3786,3791],{"type":37,"tag":134,"props":3780,"children":3781},{},[3782],{"type":42,"value":3783},"Import into it — after removing the demo catalog.",{"type":42,"value":3785}," Because ",{"type":37,"tag":50,"props":3787,"children":3789},{"className":3788},[],[3790],{"type":42,"value":384},{"type":42,"value":3792}," seeds demo\nproducts\u002Fcategories, first delete that demo catalog on the site, then run the generated\nimport (still behind the execution-plan approval gate) so the store holds only the\nmigrated data. Storefront pages query the live catalog, so the released site then serves\nthe migrated catalog; re-release only if statically generated routes must regenerate.",{"type":37,"tag":215,"props":3794,"children":3795},{},[3796,3801,3803,3807,3809,3815,3816,3822,3824,3829],{"type":37,"tag":134,"props":3797,"children":3798},{},[3799],{"type":42,"value":3800},"Report both layers.",{"type":42,"value":3802}," The final handoff must state the storefront URL ",{"type":37,"tag":134,"props":3804,"children":3805},{},[3806],{"type":42,"value":2708},{"type":42,"value":3808}," keep the\n",{"type":37,"tag":50,"props":3810,"children":3812},{"className":3811},[],[3813],{"type":42,"value":3814},"catalog\u002Fdata imported",{"type":42,"value":2313},{"type":37,"tag":50,"props":3817,"children":3819},{"className":3818},[],[3820],{"type":42,"value":3821},"website\u002Fhomepage built",{"type":42,"value":3823}," distinction (see ",{"type":37,"tag":50,"props":3825,"children":3827},{"className":3826},[],[3828],{"type":42,"value":636},{"type":42,"value":73},{"type":37,"tag":44,"props":3831,"children":3832},{},[3833,3834,3839,3841,3846],{"type":42,"value":2124},{"type":37,"tag":50,"props":3835,"children":3837},{"className":3836},[],[3838],{"type":42,"value":384},{"type":42,"value":3840}," is unavailable in the runtime, halt to needs-user (it is required for\n",{"type":37,"tag":50,"props":3842,"children":3844},{"className":3843},[],[3845],{"type":42,"value":357},{"type":42,"value":3847}," mode — the storefront build); do not fall back to hand-building a frontend.",{"type":37,"tag":75,"props":3849,"children":3851},{"id":3850},"recovery",[3852],{"type":42,"value":3853},"Recovery",{"type":37,"tag":211,"props":3855,"children":3856},{},[3857,3874,3884],{"type":37,"tag":215,"props":3858,"children":3859},{},[3860,3865,3867,3872],{"type":37,"tag":134,"props":3861,"children":3862},{},[3863],{"type":42,"value":3864},"Resume is the default.",{"type":42,"value":3866}," If the workflow stopped mid-migration, re-running\norchestration inspects ",{"type":37,"tag":50,"props":3868,"children":3870},{"className":3869},[],[3871],{"type":42,"value":130},{"type":42,"value":3873}," plus phase artifacts (Step 2) and routes to the first\nmaterial gap. No work is repeated unnecessarily.",{"type":37,"tag":215,"props":3875,"children":3876},{},[3877,3882],{"type":37,"tag":134,"props":3878,"children":3879},{},[3880],{"type":42,"value":3881},"Never auto-delete.",{"type":42,"value":3883}," Existing artifacts are preserved unless the user asks\notherwise.",{"type":37,"tag":215,"props":3885,"children":3886},{},[3887,3892,3894,3899],{"type":37,"tag":134,"props":3888,"children":3889},{},[3890],{"type":42,"value":3891},"From scratch is explicit and whole-project.",{"type":42,"value":3893}," Only when the user explicitly\nasks to start over, delete the entire ",{"type":37,"tag":50,"props":3895,"children":3897},{"className":3896},[],[3898],{"type":42,"value":55},{"type":42,"value":3900}," directory and\nre-run from discovery. Do not partially wipe individual stages.",{"type":37,"tag":75,"props":3902,"children":3904},{"id":3903},"step-3-choose-the-next-step",[3905],{"type":42,"value":3906},"Step 3: Choose the next step",{"type":37,"tag":44,"props":3908,"children":3909},{},[3910,3912,3918],{"type":42,"value":3911},"Route according to the first material gap by consulting the matching internal resource\nunder ",{"type":37,"tag":50,"props":3913,"children":3915},{"className":3914},[],[3916],{"type":42,"value":3917},"resources\u002F",{"type":42,"value":298},{"type":37,"tag":211,"props":3920,"children":3921},{},[3922,3941,3968,3980,3992,4004,4023,4035,4047,4059,4078,4114,4126,4145],{"type":37,"tag":215,"props":3923,"children":3924},{},[3925,3927,3932,3934,3939],{"type":42,"value":3926},"Project-local config files missing or missing required values: create\u002Fupdate\n",{"type":37,"tag":50,"props":3928,"children":3930},{"className":3929},[],[3931],{"type":42,"value":412},{"type":42,"value":3933}," and, after source platform is known, ",{"type":37,"tag":50,"props":3935,"children":3937},{"className":3936},[],[3938],{"type":42,"value":1396},{"type":42,"value":3940},";\nask the user for missing details one at a time.",{"type":37,"tag":215,"props":3942,"children":3943},{},[3944,3946,3952,3953,3958,3960,3966],{"type":42,"value":3945},"Source acquisition decisions are known but destination strategy is not: resolve\n",{"type":37,"tag":50,"props":3947,"children":3949},{"className":3948},[],[3950],{"type":42,"value":3951},"deliveryMode",{"type":42,"value":593},{"type":37,"tag":50,"props":3954,"children":3956},{"className":3955},[],[3957],{"type":42,"value":2146},{"type":42,"value":3959},", defaulting ",{"type":37,"tag":50,"props":3961,"children":3963},{"className":3962},[],[3964],{"type":42,"value":3965},"deliveryMode=management",{"type":42,"value":3967}," unless the\nuser explicitly asked for a storefront or frontend.",{"type":37,"tag":215,"props":3969,"children":3970},{},[3971,3973,3979],{"type":42,"value":3972},"Source and destination decisions exist but deterministic preflight has not passed: run\nthe preflight contract and persist ",{"type":37,"tag":50,"props":3974,"children":3976},{"className":3975},[],[3977],{"type":42,"value":3978},"orchestration\u002Fpreflight.json",{"type":42,"value":621},{"type":37,"tag":215,"props":3981,"children":3982},{},[3983,3985,3991],{"type":42,"value":3984},"No source-system understanding: consult ",{"type":37,"tag":50,"props":3986,"children":3988},{"className":3987},[],[3989],{"type":42,"value":3990},"resources\u002Frp-discovery\u002F",{"type":42,"value":621},{"type":37,"tag":215,"props":3993,"children":3994},{},[3995,3997,4003],{"type":42,"value":3996},"Source schema exists but no approved mapping: consult ",{"type":37,"tag":50,"props":3998,"children":4000},{"className":3999},[],[4001],{"type":42,"value":4002},"resources\u002Frp-mapper\u002F",{"type":42,"value":621},{"type":37,"tag":215,"props":4005,"children":4006},{},[4007,4009,4014,4016,4021],{"type":42,"value":4008},"Mapping plan exists but ",{"type":37,"tag":50,"props":4010,"children":4012},{"className":4011},[],[4013],{"type":42,"value":1014},{"type":42,"value":4015}," is missing: consult\n",{"type":37,"tag":50,"props":4017,"children":4019},{"className":4018},[],[4020],{"type":42,"value":4002},{"type":42,"value":4022}," to generate the summary and stop for user review.",{"type":37,"tag":215,"props":4024,"children":4025},{},[4026,4028,4033],{"type":42,"value":4027},"Mapping summary exists but the mapping review checkpoint has not been accepted: surface\n",{"type":37,"tag":50,"props":4029,"children":4031},{"className":4030},[],[4032],{"type":42,"value":1014},{"type":42,"value":4034},", ask the user to review it, and wait for acceptance before\ncontinuing.",{"type":37,"tag":215,"props":4036,"children":4037},{},[4038,4040,4046],{"type":42,"value":4039},"Mapping exists but Wix-side requirements are unclear: consult\n",{"type":37,"tag":50,"props":4041,"children":4043},{"className":4042},[],[4044],{"type":42,"value":4045},"resources\u002Frp-setup-discovery\u002F",{"type":42,"value":621},{"type":37,"tag":215,"props":4048,"children":4049},{},[4050,4052,4058],{"type":42,"value":4051},"Mapping and setup requirements exist but import code is missing: consult\n",{"type":37,"tag":50,"props":4053,"children":4055},{"className":4054},[],[4056],{"type":42,"value":4057},"resources\u002Frp-import-codegen\u002F",{"type":42,"value":621},{"type":37,"tag":215,"props":4060,"children":4061},{},[4062,4064,4069,4071,4076],{"type":42,"value":4063},"Safe mode or dry-run is enabled, but ",{"type":37,"tag":50,"props":4065,"children":4067},{"className":4066},[],[4068],{"type":42,"value":1079},{"type":42,"value":4070}," is\nmissing, stale, failed, or not yet accepted: consult ",{"type":37,"tag":50,"props":4072,"children":4074},{"className":4073},[],[4075],{"type":42,"value":4057},{"type":42,"value":4077},",\nrun the automatic review, fix any gaps it finds, regenerate the artifact, then surface\nthe passing review for user acceptance before the execution approval gate.",{"type":37,"tag":215,"props":4079,"children":4080},{},[4081,4091,4093,4098,4100,4105,4107,4112],{"type":37,"tag":134,"props":4082,"children":4083},{},[4084,4089],{"type":37,"tag":50,"props":4085,"children":4087},{"className":4086},[],[4088],{"type":42,"value":357},{"type":42,"value":4090}," mode, code generated but no destination site yet:",{"type":42,"value":4092}," hand off to ",{"type":37,"tag":50,"props":4094,"children":4096},{"className":4095},[],[4097],{"type":42,"value":384},{"type":42,"value":4099},"\nto create the site + storefront, then adopt its ",{"type":37,"tag":50,"props":4101,"children":4103},{"className":4102},[],[4104],{"type":42,"value":2884},{"type":42,"value":4106}," (see \"Website mode: build the\nstorefront with ",{"type":37,"tag":50,"props":4108,"children":4110},{"className":4109},[],[4111],{"type":42,"value":384},{"type":42,"value":4113},"\") before setup\u002Fimport.",{"type":37,"tag":215,"props":4115,"children":4116},{},[4117,4119,4125],{"type":42,"value":4118},"Setup artifacts exist but are not verified: consult\n",{"type":37,"tag":50,"props":4120,"children":4122},{"className":4121},[],[4123],{"type":42,"value":4124},"resources\u002Frp-execute-setup\u002F",{"type":42,"value":621},{"type":37,"tag":215,"props":4127,"children":4128},{},[4129,4131,4136,4138,4144],{"type":42,"value":4130},"Code and setup are ready, any required code-safety review has been accepted, and\n",{"type":37,"tag":50,"props":4132,"children":4134},{"className":4133},[],[4135],{"type":42,"value":1485},{"type":42,"value":4137}," plus execution approval exist: consult\n",{"type":37,"tag":50,"props":4139,"children":4141},{"className":4140},[],[4142],{"type":42,"value":4143},"resources\u002Frp-execute-import\u002F",{"type":42,"value":621},{"type":37,"tag":215,"props":4146,"children":4147},{},[4148,4158,4160,4165],{"type":37,"tag":134,"props":4149,"children":4150},{},[4151,4156],{"type":37,"tag":50,"props":4152,"children":4154},{"className":4153},[],[4155],{"type":42,"value":357},{"type":42,"value":4157}," mode, catalog imported:",{"type":42,"value":4159}," confirm the storefront is released and serving the\nmigrated catalog; report its URL. In ",{"type":37,"tag":50,"props":4161,"children":4163},{"className":4162},[],[4164],{"type":42,"value":313},{"type":42,"value":4166}," mode the run is done after import — do\nnot build a frontend.",{"type":37,"tag":75,"props":4168,"children":4170},{"id":4169},"output",[4171],{"type":42,"value":4172},"Output",{"type":37,"tag":44,"props":4174,"children":4175},{},[4176],{"type":42,"value":4177},"Respond minimally with:",{"type":37,"tag":211,"props":4179,"children":4180},{},[4181,4186,4191,4196,4201],{"type":37,"tag":215,"props":4182,"children":4183},{},[4184],{"type":42,"value":4185},"active project path",{"type":37,"tag":215,"props":4187,"children":4188},{},[4189],{"type":42,"value":4190},"artifacts found",{"type":37,"tag":215,"props":4192,"children":4193},{},[4194],{"type":42,"value":4195},"critical gaps",{"type":37,"tag":215,"props":4197,"children":4198},{},[4199],{"type":42,"value":4200},"exact next recommended skill",{"type":37,"tag":215,"props":4202,"children":4203},{},[4204],{"type":42,"value":4205},"concrete next action",{"type":37,"tag":75,"props":4207,"children":4209},{"id":4208},"guardrails",[4210],{"type":42,"value":4211},"Guardrails",{"type":37,"tag":211,"props":4213,"children":4214},{},[4215,4220,4225,4230],{"type":37,"tag":215,"props":4216,"children":4217},{},[4218],{"type":42,"value":4219},"Do not guess the source schema when discovery artifacts are missing.",{"type":37,"tag":215,"props":4221,"children":4222},{},[4223],{"type":42,"value":4224},"Do not generate import code before a mapping plan exists.",{"type":37,"tag":215,"props":4226,"children":4227},{},[4228],{"type":42,"value":4229},"Do not execute import before setup verification and code review are complete.",{"type":37,"tag":215,"props":4231,"children":4232},{},[4233],{"type":42,"value":4234},"When notification mute is in effect (spec 0012), never proceed to import writes\nwithout a verified mute — a failed mute halts to needs-user, with no\ncontinue-anyway path. Never report a site as muted from strategy\u002Fconfig inference;\nonly from recorded verification state. Never unmute unless the owner explicitly\nasks.",{"type":37,"tag":4236,"props":4237,"children":4238},"style",{},[4239],{"type":42,"value":4240},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":4242,"total":4336},[4243,4249,4266,4280,4298,4310,4322],{"slug":4,"name":4,"fn":5,"description":6,"org":4244,"tags":4245,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4246,4247,4248],{"name":15,"slug":16,"type":13},{"name":18,"slug":19,"type":13},{"name":9,"slug":8,"type":13},{"slug":4250,"name":4250,"fn":4251,"description":4252,"org":4253,"tags":4254,"stars":20,"repoUrl":21,"updatedAt":4265},"wix-app","build Wix CLI app extensions","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.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4255,4258,4261,4264],{"name":4256,"slug":4257,"type":13},"Backend","backend",{"name":4259,"slug":4260,"type":13},"CLI","cli",{"name":4262,"slug":4263,"type":13},"Frontend","frontend",{"name":9,"slug":8,"type":13},"2026-04-16T04:58:00.157961",{"slug":4267,"name":4267,"fn":4268,"description":4269,"org":4270,"tags":4271,"stars":20,"repoUrl":21,"updatedAt":4279},"wix-auth","authenticate with Wix APIs","Authenticate with Wix to obtain an access token for calling Wix APIs. Use when an agent needs a valid Wix access token and has none, or when the stored token is expired.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4272,4275,4278],{"name":4273,"slug":4274,"type":13},"API Development","api-development",{"name":4276,"slug":4277,"type":13},"Auth","auth",{"name":9,"slug":8,"type":13},"2026-07-07T06:47:46.95263",{"slug":4281,"name":4281,"fn":4282,"description":4283,"org":4284,"tags":4285,"stars":20,"repoUrl":21,"updatedAt":4297},"wix-design-system","build UIs with Wix Design System","Wix Design System component reference. Use when building UI with @wix\u002Fdesign-system, choosing components, checking props and examples, or writing tests with component testkits. Triggers on \"what component\", \"how do I make\", \"WDS\", \"show me props\", \"testkit\", \"driver\", or component names like Button, Card, Modal, Box, Text.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4286,4289,4292,4293,4296],{"name":4287,"slug":4288,"type":13},"Design","design",{"name":4290,"slug":4291,"type":13},"Design System","design-system",{"name":4262,"slug":4263,"type":13},{"name":4294,"slug":4295,"type":13},"UI Components","ui-components",{"name":9,"slug":8,"type":13},"2026-04-29T05:33:44.561687",{"slug":4299,"name":4299,"fn":4300,"description":4301,"org":4302,"tags":4303,"stars":20,"repoUrl":21,"updatedAt":4309},"wix-docs","lookup Wix API documentation","Look up the Wix API\u002FSDK documentation to confirm an exact endpoint, HTTP method, request\u002Fresponse shape, field, enum, or error before writing Wix code — never guess a Wix API from memory. A lookup is a short flow: find the right page, then read it. Two ways: (1) plain `curl` (zero dependencies) — find a page by **semantic search** (`POST \u002Fmcp-docs-search\u002Fv1\u002Fdocs\u002Fsearch`, natural-language `{ search_term, document_type }`) **or by browsing** the docs tree as a menu — a structured, typed, counted browse of the REST API reference (`POST \u002Fmcp-docs-search\u002Fv1\u002Fdocs\u002Fmenu\u002Fbrowse`), or the `.md` menu tree from the `llms.txt` root for any portal — then read the page by appending `.md` to its URL; and (2) the Wix MCP doc tools when your agent has them. Triggers: look up a Wix API, find the Wix endpoint\u002Fmethod, confirm a Wix request body or field, verify a Wix API shape, explore Wix docs, which Wix API do I call, read a Wix method schema.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4304,4305,4308],{"name":4273,"slug":4274,"type":13},{"name":4306,"slug":4307,"type":13},"Documentation","documentation",{"name":9,"slug":8,"type":13},"2026-08-09T04:09:08.812155",{"slug":384,"name":384,"fn":4311,"description":4312,"org":4313,"tags":4314,"stars":20,"repoUrl":21,"updatedAt":4321},"build Wix Managed Headless sites","Connect Wix business services (Stores, Bookings, CMS, Blog, Events, Forms, and more) to a Wix Headless frontend — infer the needed capabilities, install the apps, seed backend content, and produce an SDK-integration guide. For managed (Wix-hosted) projects it can also build the frontend: scaffold a new site (create) or wire an existing\u002Fbrought-in design (connect), then build and release. Works across managed, self-managed, and stripe project types. Triggers: set up a Wix Headless backend, add Wix business features to my app, build or host a Wix site, connect\u002Fimplement this design with Wix.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4315,4316,4317,4320],{"name":4287,"slug":4288,"type":13},{"name":4262,"slug":4263,"type":13},{"name":4318,"slug":4319,"type":13},"Web Development","web-development",{"name":9,"slug":8,"type":13},"2026-07-28T05:35:03.480007",{"slug":3303,"name":3303,"fn":4323,"description":4324,"org":4325,"tags":4326,"stars":20,"repoUrl":21,"updatedAt":4335},"manage Wix business solutions via API","Wix business solution management recipes — REST API operations for configuring and managing Wix business solutions. Routes to: stores, bookings, get-paid, CMS, contacts, forms, media, app-installation, pricing-plans, restaurants, rich-content, sites, blog, calendar, domains, site-properties, ecommerce, marketing, google-ads, analytics, dashboard-navigation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4327,4328,4331,4334],{"name":4273,"slug":4274,"type":13},{"name":4329,"slug":4330,"type":13},"CMS","cms",{"name":4332,"slug":4333,"type":13},"E-commerce","e-commerce",{"name":9,"slug":8,"type":13},"2026-08-06T05:40:43.565659",8,{"items":4338,"total":4415},[4339,4345,4352,4358,4366,4372,4379,4386,4401],{"slug":4,"name":4,"fn":5,"description":6,"org":4340,"tags":4341,"stars":20,"repoUrl":21,"updatedAt":22},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4342,4343,4344],{"name":15,"slug":16,"type":13},{"name":18,"slug":19,"type":13},{"name":9,"slug":8,"type":13},{"slug":4250,"name":4250,"fn":4251,"description":4252,"org":4346,"tags":4347,"stars":20,"repoUrl":21,"updatedAt":4265},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4348,4349,4350,4351],{"name":4256,"slug":4257,"type":13},{"name":4259,"slug":4260,"type":13},{"name":4262,"slug":4263,"type":13},{"name":9,"slug":8,"type":13},{"slug":4267,"name":4267,"fn":4268,"description":4269,"org":4353,"tags":4354,"stars":20,"repoUrl":21,"updatedAt":4279},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4355,4356,4357],{"name":4273,"slug":4274,"type":13},{"name":4276,"slug":4277,"type":13},{"name":9,"slug":8,"type":13},{"slug":4281,"name":4281,"fn":4282,"description":4283,"org":4359,"tags":4360,"stars":20,"repoUrl":21,"updatedAt":4297},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4361,4362,4363,4364,4365],{"name":4287,"slug":4288,"type":13},{"name":4290,"slug":4291,"type":13},{"name":4262,"slug":4263,"type":13},{"name":4294,"slug":4295,"type":13},{"name":9,"slug":8,"type":13},{"slug":4299,"name":4299,"fn":4300,"description":4301,"org":4367,"tags":4368,"stars":20,"repoUrl":21,"updatedAt":4309},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4369,4370,4371],{"name":4273,"slug":4274,"type":13},{"name":4306,"slug":4307,"type":13},{"name":9,"slug":8,"type":13},{"slug":384,"name":384,"fn":4311,"description":4312,"org":4373,"tags":4374,"stars":20,"repoUrl":21,"updatedAt":4321},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4375,4376,4377,4378],{"name":4287,"slug":4288,"type":13},{"name":4262,"slug":4263,"type":13},{"name":4318,"slug":4319,"type":13},{"name":9,"slug":8,"type":13},{"slug":3303,"name":3303,"fn":4323,"description":4324,"org":4380,"tags":4381,"stars":20,"repoUrl":21,"updatedAt":4335},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4382,4383,4384,4385],{"name":4273,"slug":4274,"type":13},{"name":4329,"slug":4330,"type":13},{"name":4332,"slug":4333,"type":13},{"name":9,"slug":8,"type":13},{"slug":4387,"name":4387,"fn":4388,"description":4389,"org":4390,"tags":4391,"stars":20,"repoUrl":21,"updatedAt":4400},"wix-vibe-headless","connect frontend projects to Wix sites","Client-only, dependency-free REST scaffolds for connecting an already-built front end (a vibe-coded app, an HTML\u002FJSX\u002FVite project, a design-tool export) to a live Wix site over the site's public WIX_CLIENT_ID — the browser talks to Wix directly, no SDK, no backend, no build step. One skill covering every Wix business solution: Stores\u002FeCommerce storefront (products, cart, checkout), Bookings (services, slots, appointments), Blog (posts, categories, tags), Events & Tickets (browse, RSVP, ticketing), Portfolio (collections, projects, galleries), Restaurants (menu, online ordering, reservations), CMS \u002F Wix Data (list, detail, filter, forms, CRUD), Pricing Plans (memberships, subscriptions, checkout), and Members (custom login — email+password, Google\u002FFacebook, and custom SSO — plus account areas and member-gated content). Each vertical ships a copy-as-is REST layer plus wiring instructions. Read-only over the owner's content — never provisions, never mocks data. Triggers: connect my Wix store\u002Fshop, build a storefront over Wix, add a cart and checkout, connect Wix Bookings, take appointments\u002Freservations, show my Wix blog, list my Wix events, sell tickets, take RSVPs, build a portfolio from Wix Portfolio, show my restaurant menu \u002F order online \u002F book a table, display my Wix CMS collection, wire a contact form to Wix, sell membership\u002Fsubscription plans, add member login \u002F sign up, let members log in with Google or Facebook, custom login page, account \u002F profile page, gate content behind login, sign in with SSO\u002FOkta, 'here is my WIX_CLIENT_ID', connect this app to my Wix site over REST. Use this for CLIENT-ONLY REST integration over an existing site; use `wix-headless` instead for SDK + Wix CLI builds, hosting, and one-prompt new-site creation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4392,4393,4396,4399],{"name":4262,"slug":4263,"type":13},{"name":4394,"slug":4395,"type":13},"Integrations","integrations",{"name":4397,"slug":4398,"type":13},"REST API","rest-api",{"name":9,"slug":8,"type":13},"2026-08-09T04:09:10.988718",{"slug":4402,"name":4402,"fn":4403,"description":4404,"org":4405,"tags":4406,"stars":2033,"repoUrl":4413,"updatedAt":4414},"interactor","add declarative animations with Interact","Use when user asks to add\u002Fedit motion without specific library, or with @wix\u002Finteract - hover, click, view\u002Fscroll triggered, scroll-driven, and pointer-driven animations for web. Wire animations to user interactions; install or set up @wix\u002Finteract; or edit an existing interact config. Do NOT use for other animation libraries.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4407,4410,4411,4412],{"name":4408,"slug":4409,"type":13},"Animation","animation",{"name":4287,"slug":4288,"type":13},{"name":4262,"slug":4263,"type":13},{"name":9,"slug":8,"type":13},"https:\u002F\u002Fgithub.com\u002Fwix\u002Finteract","2026-08-03T06:01:39.765624",9]