@wix/agent-skills 1.33.0 → 1.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- package/package.json +2 -2
- package/skills/wix-app/references/DASHBOARD_PAGE.md +1 -1
- package/skills/wix-export/SKILL.md +83 -0
- package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
- package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
- package/skills/wix-harmony-editor/SKILL.md +317 -0
- package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
- package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
- package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
- package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
- package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
- package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
- package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
- package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
- package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
- package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
- package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
- package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
- package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
- package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
- package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
- package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
- package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
- package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
- package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
- package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
- package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
- package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
- package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
- package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
- package/skills/wix-headless/SKILL.md +7 -2
- package/skills/wix-headless/references/CAPABILITIES.md +6 -1
- package/skills/wix-headless/references/DISCOVERY.md +2 -1
- package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
- package/skills/wix-headless/references/SEED.md +3 -2
- package/skills/wix-headless/references/SETUP.md +1 -0
- package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
- package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
- package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
- package/skills/wix-headless/references/managed/CREATE.md +1 -1
- package/skills/wix-headless-kit/SKILL.md +110 -21
- package/skills/wix-headless-kit/guides/api-run.md +15 -13
- package/skills/wix-headless-kit/guides/existing-site.md +31 -0
- package/skills/wix-headless-kit/guides/migration.md +49 -17
- package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
- package/skills/wix-headless-kit/install/context.mjs +61 -6
- package/skills/wix-headless-kit/install/pins.json +1 -1
- package/skills/wix-headless-kit/install/setup.mjs +107 -12
- package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
- package/skills/wix-headless-replatform/SKILL.md +116 -0
- package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
- package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
- package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
- package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
- package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
- package/skills/wix-headless-replatform/references/output-contract.md +93 -0
- package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
- package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
- package/skills/wix-headless-replatform/references/safety.md +19 -0
- package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
- package/skills/wix-headless-replatform/references/workflow.md +157 -0
- package/skills/wix-headless-replatform/registry/README.md +20 -0
- package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
- package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
- package/skills/wix-headless-replatform/registry/registry.json +36 -0
- package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
- package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
- package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
- package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
- package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
- package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
- package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
- package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
- package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
- package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
- package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
- package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
- package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
- package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
- package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
- package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
- package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
- package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
- package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
- package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
- package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
- package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
- package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
- package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
- package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
- package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
- package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
- package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
- package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
- package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
- package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
- package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
- package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
- package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
- package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
- package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
- package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
- package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
- package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
- package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
- package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
- package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
- package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
- package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
- package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
- package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
- package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
- package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
- package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
- package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
- package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
- package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
- package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
- package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
- package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
- package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
- package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
- package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
- package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
- package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
- package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
- package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
- package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
- package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
- package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
- package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
- package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
- package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
- package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
- package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
- package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
- package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
- package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
- package/skills/wix-import/SKILL.md +90 -0
- package/skills/wix-manage/SKILL.md +38 -10
- package/skills/wix-manage/references/automations/actions.md +11 -11
- package/skills/wix-manage/references/automations/activation-status.md +6 -9
- package/skills/wix-manage/references/automations/api-catalog.md +48 -32
- package/skills/wix-manage/references/automations/automation-model.md +97 -22
- package/skills/wix-manage/references/automations/bracket-expressions.md +7 -7
- package/skills/wix-manage/references/automations/build-and-manage-automations.md +140 -309
- package/skills/wix-manage/references/automations/conditions.md +187 -0
- package/skills/wix-manage/references/automations/schemas-and-scheduling.md +191 -0
- package/skills/wix-manage/references/automations/special-actions.md +210 -0
- package/skills/wix-manage/references/automations/triggers.md +47 -10
- package/skills/wix-manage/references/automations/validation-and-verification.md +320 -0
- package/skills/wix-manage/references/custom-apps/use-app-tools.md +124 -0
- package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
- package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
- package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
- package/skills/wix-manage/references/events/create-wix-event.md +136 -73
- package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
- package/skills/wix-manage/references/events/manage-event-guests.md +366 -0
- package/skills/wix-manage/references/events/manage-event-tickets.md +293 -0
- package/skills/wix-manage/references/events/manage-wix-events.md +313 -55
- package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
- package/skills/wix-manage/references/sites/upload-static-site.md +127 -8
- package/skills/wix-manage/references/stores/update-product-with-options.md +58 -2
- package/skills/wix-replatform/.publish-manifest.json +5 -5
- package/skills/wix-replatform/CLI.md +162 -0
- package/skills/wix-replatform/README.md +52 -0
- package/skills/wix-replatform/SKILL.md +229 -684
- package/skills/wix-replatform/console/account.css +1 -0
- package/skills/wix-replatform/console/app.css +1 -0
- package/skills/wix-replatform/console/app.js +117 -0
- package/skills/wix-replatform/console/index.html +4 -0
- package/skills/wix-replatform/console/json.css +11 -0
- package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
- package/skills/wix-replatform/lib/app-page-routing.js +75 -0
- package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
- package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
- package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
- package/skills/wix-replatform/lib/completion-report.js +1393 -13
- package/skills/wix-replatform/lib/config-env.js +85 -11
- package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
- package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
- package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
- package/skills/wix-replatform/lib/destination-choice.js +163 -0
- package/skills/wix-replatform/lib/destination-handoff.js +62 -0
- package/skills/wix-replatform/lib/destination-http.js +81 -0
- package/skills/wix-replatform/lib/destination-route.js +98 -0
- package/skills/wix-replatform/lib/destination.js +919 -0
- package/skills/wix-replatform/lib/discovered-census.js +231 -0
- package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
- package/skills/wix-replatform/lib/document-url-guard.js +203 -0
- package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
- package/skills/wix-replatform/lib/entity-verification.js +18 -0
- package/skills/wix-replatform/lib/execution-capability.js +120 -0
- package/skills/wix-replatform/lib/execution-log.js +170 -0
- package/skills/wix-replatform/lib/execution-manifest.js +20 -2
- package/skills/wix-replatform/lib/execution-state.js +22 -0
- package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
- package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
- package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
- package/skills/wix-replatform/lib/import-recovery.js +800 -6
- package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
- package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
- package/skills/wix-replatform/lib/link-audit.js +173 -0
- package/skills/wix-replatform/lib/link-census.js +194 -0
- package/skills/wix-replatform/lib/link-plan.js +148 -0
- package/skills/wix-replatform/lib/link-verification.js +274 -0
- package/skills/wix-replatform/lib/link-write-journal.js +42 -0
- package/skills/wix-replatform/lib/local-state.js +869 -30
- package/skills/wix-replatform/lib/member-completion.js +658 -0
- package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
- package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
- package/skills/wix-replatform/lib/migration-completion.js +311 -0
- package/skills/wix-replatform/lib/operator-identity.js +47 -0
- package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
- package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
- package/skills/wix-replatform/lib/orchestration-router.js +608 -32
- package/skills/wix-replatform/lib/orchestration-state.js +188 -12
- package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
- package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
- package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
- package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
- package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
- package/skills/wix-replatform/lib/progress-log.js +19 -3
- package/skills/wix-replatform/lib/read-back-approval.js +184 -0
- package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
- package/skills/wix-replatform/lib/read-back-contract.js +243 -0
- package/skills/wix-replatform/lib/read-back-extract.js +118 -0
- package/skills/wix-replatform/lib/read-back-gate.js +734 -0
- package/skills/wix-replatform/lib/read-back-reads.js +94 -0
- package/skills/wix-replatform/lib/read-back-state.js +107 -0
- package/skills/wix-replatform/lib/read-back-summary.js +81 -0
- package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
- package/skills/wix-replatform/lib/run-controller.js +401 -0
- package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
- package/skills/wix-replatform/lib/setup-verification.js +148 -0
- package/skills/wix-replatform/lib/source-access.js +231 -0
- package/skills/wix-replatform/lib/source-coverage.js +1130 -0
- package/skills/wix-replatform/lib/source-secrets.js +277 -0
- package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
- package/skills/wix-replatform/lib/task-state.js +110 -0
- package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
- package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
- package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
- package/skills/wix-replatform/lib/url-verification.js +315 -0
- package/skills/wix-replatform/lib/user-action-effects.js +42 -0
- package/skills/wix-replatform/lib/user-actions.js +264 -0
- package/skills/wix-replatform/lib/website-handoff.js +1220 -0
- package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
- package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
- package/skills/wix-replatform/lib/write-verification-state.js +92 -0
- package/skills/wix-replatform/lib/write-verification.js +274 -0
- package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
- package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
- package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
- package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
- package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
- package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
- package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
- package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
- package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
- package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
- package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
- package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
- package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
- package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
- package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
- package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
- package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
- package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
- package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
- package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
- package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
- package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
- package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
- package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
- package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
- package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
- package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
- package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
- package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
- package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
- package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
- package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
- package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
- package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
- package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
- package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
- package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
- package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
- package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
- package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
- package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
- package/skills/wix-replatform/scripts/discovered-census.js +26 -0
- package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
- package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
- package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
- package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
- package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
- package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
- package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
- package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
- package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
- package/skills/wix-replatform/scripts/migration-completion.js +76 -0
- package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
- package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
- package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
- package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
- package/skills/wix-replatform/scripts/replatform-console.js +146 -0
- package/skills/wix-replatform/scripts/replatform.js +436 -0
- package/skills/wix-replatform/scripts/source-secrets.js +77 -0
- package/skills/wix-replatform/scripts/url-redirects.js +286 -0
- package/skills/wix-replatform/scripts/user-action.js +58 -0
- package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
- package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
- package/skills/wix-replatform/scripts/wix-destination.js +143 -0
- package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
- package/skills/wix-vibe-headless/SKILL.md +7 -3
- package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
- package/skills/wix-vibe-headless/platforms/base44.md +1 -0
- package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
- package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
- package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
- package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
- package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
- package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
- package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
- package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
- package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +0 -208
- package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
|
@@ -12,6 +12,18 @@ verified once here so the platform-agnostic stages and per-project codegen never
|
|
|
12
12
|
re-derive (and re-break) it. This is the symmetric counterpart to `rp-source-wordpress`:
|
|
13
13
|
that adapter owns *reading* a source platform; this one owns *writing* to Wix.
|
|
14
14
|
|
|
15
|
+
## Verified variant inventory import
|
|
16
|
+
|
|
17
|
+
`lib/stores-inventory.js` exports `inventoryForVariant`, `resolveInventoryLocation`, and
|
|
18
|
+
`reconcileInventory(wix, rows, {expectedCount, gaps, locationId?})`. Rows carry resolved
|
|
19
|
+
`productId`, `variantId`, and `inventory: {inStock:boolean}` OR `{quantity:integer}`.
|
|
20
|
+
`expectedCount` must equal rows plus named source gaps. Bulk writes follow complete location-
|
|
21
|
+
scoped reads; existing items reconcile or update by revision, then values and availability
|
|
22
|
+
are read back. Failure remains partial and the next invocation re-reads before writing.
|
|
23
|
+
The existing single-create inventory helpers remain available for narrow probes; imports
|
|
24
|
+
use the bulk reconciliation path. `trackQuantity` is derived and must never be sent.
|
|
25
|
+
Read `domains/stores/entities/inventory-item.json` and the setup inventory-probe contract.
|
|
26
|
+
|
|
15
27
|
## When this skill is used
|
|
16
28
|
|
|
17
29
|
Not a stage in the flow — a reference + shared library consulted by:
|
|
@@ -28,6 +40,26 @@ Because the Wix surface is identical across source platforms, adding a new sourc
|
|
|
28
40
|
|
|
29
41
|
## Shared runtime boundary
|
|
30
42
|
|
|
43
|
+
### App page routing
|
|
44
|
+
|
|
45
|
+
`app-page-routing-capabilities.json` is the per-family gate for
|
|
46
|
+
`lib/app-page-routing.js` and `scripts/internal-link-audit.js route`. The shared
|
|
47
|
+
`lib/url-mapper-transport.js` builds writer-side create/update/read requests over an
|
|
48
|
+
injected authenticated sender and requires destination inspection. Only the Stores
|
|
49
|
+
product URL Mapper payload currently has a recorded request and saved-state read-back
|
|
50
|
+
shape. Its writer-side pattern may be configured after Stores installation and before
|
|
51
|
+
frontend creation, but it is **not** evidence that the frontend serves that route. The
|
|
52
|
+
generated transport supplies the migration credential and writer-side read/write methods;
|
|
53
|
+
the public reader's empty mapping is not a valid read-back. Use the recorded request
|
|
54
|
+
and read-back fixture in `app-page-routing-capabilities.json`.
|
|
55
|
+
|
|
56
|
+
Every other discovered app family remains `unverified` until its exact key, page
|
|
57
|
+
identifier, variables, supported method, request and read-back fixture are committed to
|
|
58
|
+
the capability file and tested. Portfolio and Builder Blog remain unverified. Never infer
|
|
59
|
+
one family's adapter from another or use full-site registration. A missing or conflicting
|
|
60
|
+
route produces a local route result and an Import Operator item; it does not become a
|
|
61
|
+
served route through the URL ledger.
|
|
62
|
+
|
|
31
63
|
This adapter owns the **shared Wix layer** written once for all migrations.
|
|
32
64
|
|
|
33
65
|
It should own:
|
|
@@ -41,7 +73,10 @@ It should own:
|
|
|
41
73
|
- local crosswalk helpers (`state/crosswalk/crosswalk.ndjson` authority, append-only
|
|
42
74
|
attempt journal, optional CMS mirror seed/upload adapters)
|
|
43
75
|
- URL preservation helpers (`state/url-preservation/` base paths, ledger, planned
|
|
44
|
-
redirects, and unresolved route rows)
|
|
76
|
+
redirects, and unresolved route rows) and the SEO Redirects writer
|
|
77
|
+
(`lib/seo-redirects.js`: Bulk Create only, declared APP/WIX_USER identity with Manage SEO Settings, no `forceReplace`,
|
|
78
|
+
durable write intents and List Redirects reconciliation; user-token API create/read-back
|
|
79
|
+
verified, frontend serving and full live acceptance still unverified)
|
|
45
80
|
- NDJSON record-stream I/O (`lib/ndjson.js`): streaming read/write, batching by count and by
|
|
46
81
|
cost, cursoring, and append-only producers. Migration data files are record streams, so the
|
|
47
82
|
scan/batch/cursor primitives live here once instead of being re-derived by codegen.
|
|
@@ -56,10 +91,35 @@ Per-migration code generation should own only:
|
|
|
56
91
|
- write specs
|
|
57
92
|
- setup-plan renderings
|
|
58
93
|
- entity ordering
|
|
59
|
-
- dependency wiring
|
|
94
|
+
- dependency wiring — populate `WriteSpec.dependencyRefs` from each in-scope entity's
|
|
95
|
+
domain-knowledge `dependsOn` field, not re-derived per project
|
|
60
96
|
|
|
61
97
|
## Write contract (the verified Wix surface)
|
|
62
98
|
|
|
99
|
+
### Capability and dependency boundary
|
|
100
|
+
|
|
101
|
+
`createWixClient` accepts only object-identity capabilities issued by the shared runtime.
|
|
102
|
+
An unprivileged client admits registered read builders only; a raw request is not a
|
|
103
|
+
trusted read. Import clients require a bound task plus the gate's current per-batch
|
|
104
|
+
`readinessGrant` and `sourceStableKey` on every write, including auxiliary writes and
|
|
105
|
+
dry-run captures. Every import write must retain the closed writer builder’s object identity and sealed method, URL, body and headers. A raw, copied or modified request is refused even with a valid grant; use the shared marked builders and grant wrappers. Use `writers.bindRecordClient(taskClient, { readinessGrant, sourceStableKey })` for library composites, or `writers.withReadinessGrant(request, { readinessGrant, sourceStableKey })` for individual builders; these preserve trusted builder marks. Before standard product inventory reconciliation, read the current product through that record client and call `registerImportInventoryScope(recordClient, canonicalProduct, targetProduct)`. It requires a same-record successful product write or current site-bound crosswalk, correlates variants by choices, and binds stock to that record, product, variants and read location/item revisions. Standard reviewed quantity/location behavior remains available; quick Shopify retains its separate boolean/default-location scope. A serialized/copied capability, caller phase or stale/foreign-site grant
|
|
106
|
+
is refused before transport. Setup and quick mode use their own bounded issuers, never an
|
|
107
|
+
import bypass. Disposable probes require the explicit ownership confirmation and are
|
|
108
|
+
restricted to the shipped verification callers.
|
|
109
|
+
|
|
110
|
+
Use `lib/dependency-readiness.js` for producer binding, task evaluation and record-level
|
|
111
|
+
reference resolution. Its closed states distinguish complete, empty, partial, setup-passed,
|
|
112
|
+
approved/unapproved exclusion and unknown evidence. Setup remains task-complete. The
|
|
113
|
+
diagnostic projection is not an input. Keep latest journal outcomes, site-bound pass
|
|
114
|
+
evidence and existing contact/product verification as the authority; task ordering alone
|
|
115
|
+
cannot grant write permission.
|
|
116
|
+
|
|
117
|
+
Quick mode loads only its shipped adapter contract and keeps declared dependencies in
|
|
118
|
+
contract order. Shopify product capability additionally admits exactly product tags and
|
|
119
|
+
bounded inventory work for products created/read through that same client. Inventory still
|
|
120
|
+
correlates real product, variant, item and location evidence, preserves partial stock
|
|
121
|
+
outcomes, and never receives a raw-transport or probe exception.
|
|
122
|
+
|
|
63
123
|
`lib/wix-writers.js` exposes pure request builders (`build*Request`) + executors. Shapes
|
|
64
124
|
marked **VERIFIED** were validated by a real call against a live site, not just read from
|
|
65
125
|
docs. Shapes marked **UNVERIFIED** are docs-schema/MCP-derived bootstrap primitives that
|
|
@@ -112,6 +172,24 @@ domain knowledge, run:
|
|
|
112
172
|
node scripts/domain-knowledge-validate.js --write-index
|
|
113
173
|
```
|
|
114
174
|
|
|
175
|
+
**Authoring or editing any entity file also requires the dependency check**, both
|
|
176
|
+
directions: (1) what does *this* entity need to already exist and be crosswalked — record it in
|
|
177
|
+
`dependsOn: string[]` (a `domain/entity` ref array; empty is a real, reviewed answer, not the same
|
|
178
|
+
as the field being absent); (2) does this entity change what an *already-written* entity's
|
|
179
|
+
`dependsOn` should say (e.g. authoring `gift-cards/gift-card` should have prompted revisiting
|
|
180
|
+
`ecom/order.json` — it hadn't, until it was caught by hand). `domain-knowledge-validate.js`
|
|
181
|
+
checks `dependsOn` refs resolve and the whole graph stays acyclic whenever the field is present, but
|
|
182
|
+
it is not yet required on every entity — `node scripts/domain-knowledge-validate.js
|
|
183
|
+
--list-missing-deps` prints the live backlog of entities that have never had it authored at all;
|
|
184
|
+
that command is the source of truth, not a hand-maintained list.
|
|
185
|
+
|
|
186
|
+
`domains/SERVICE-PLUGINS.md` covers the escalation ladder for a source capability with no native
|
|
187
|
+
Wix primitive: **native primitive first, always**, then a Wix **service plugin** (Wix calls an
|
|
188
|
+
endpoint we host and we answer per request), and only then a recorded gap. It carries the cost list,
|
|
189
|
+
a worked example — bounded quantity discount bands, implemented live 2026-08-31 — and a catalog of
|
|
190
|
+
all 25 service plugins with per-plugin migration relevance. Read it before writing "Wix cannot
|
|
191
|
+
express this" into a gap report.
|
|
192
|
+
|
|
115
193
|
`writerId` values in entity files must match exported functions from `lib/wix-writers.js`;
|
|
116
194
|
use `null` for direct REST plans, setup/manual work, or unsupported native gaps.
|
|
117
195
|
|
|
@@ -129,7 +207,7 @@ target write assumption, emit a proposal artifact and let the orchestrator promo
|
|
|
129
207
|
deliberately:
|
|
130
208
|
|
|
131
209
|
```bash
|
|
132
|
-
node skills/replatform/resources/rp-target-wix/scripts/verify-stores.js stores subscription-create \
|
|
210
|
+
node skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js stores subscription-create \
|
|
133
211
|
--artifact migrations/<project>/setup/stores-subscription-verification.json \
|
|
134
212
|
--proposal-artifact migrations/<project>/setup/contract-ledger-proposal.json
|
|
135
213
|
```
|
|
@@ -140,26 +218,37 @@ nor explicitly deferred is stale product knowledge. Codegen should consume
|
|
|
140
218
|
`fieldContracts[]` through `scripts/domain-knowledge.js summarize-entities`, which
|
|
141
219
|
includes promoted contracts.
|
|
142
220
|
|
|
221
|
+
### Dual product descriptions
|
|
222
|
+
|
|
223
|
+
When a canonical product contains both `shortDescription` and `description`,
|
|
224
|
+
`lib/wix-build.js` writes one Stores `plainDescription`: short body, `<hr />`, then long
|
|
225
|
+
body. HTML-empty bodies and normalized, case-insensitive `lorem ipsum…` filler are
|
|
226
|
+
treated as empty independently, so a real companion body remains. The horizontal-rule
|
|
227
|
+
serialization is unverified in a live Wix storefront: canary it and capture a Hebrew/RTL
|
|
228
|
+
screenshot before any bulk import or remediation backfill.
|
|
229
|
+
|
|
143
230
|
| Capability | Endpoint | Notes / traps |
|
|
144
231
|
| --- | --- | --- |
|
|
145
232
|
| HTML → rich content | `POST /ricos/v1/ricos-document/convert/to-ricos` | VERIFIED. `options.plugins` enum is **UPPERCASE** — the docs example shows lowercase and 400s. |
|
|
146
233
|
| Import media from URL | `POST /site-media/v1/files/import` | VERIFIED. **Async**: response is `PENDING`; poll `GET /site-media/v1/files/{id}` for `READY` before referencing. |
|
|
147
234
|
| Blog category | `POST /blog/v3/categories` | VERIFIED. body `{ category: { label, slug, description } }`. |
|
|
148
235
|
| Blog tag | `POST /blog/v3/tags` | VERIFIED. Body is **top-level `{ label, language }`** — NOT `{ tag: { label, slug } }`; slug is derived. |
|
|
149
|
-
| Blog post | `POST /blog/v3/draft-posts` → `…/{id}/publish` | VERIFIED. `memberId` **required** (3rd-party). VERIFIED (2026-08-02): the **site owner's auto-created user-member** satisfies it — it was already present on our API-provisioned test site with zero Members-area interaction (single-site observation), so attribute-to-owner needs no member provisioning. **Resolve it via `listMembers` + `loginEmail` match — never derive it from the account/user GUID** (the observed id equality is
|
|
236
|
+
| Blog post | `POST /blog/v3/draft-posts` → `…/{id}/publish` | VERIFIED. `memberId` **required** (3rd-party). VERIFIED (2026-08-02): the **site owner's auto-created user-member** satisfies it — it was already present on our API-provisioned test site with zero Members-area interaction (single-site observation), so attribute-to-owner needs no member provisioning. **Resolve it via `listMembers` + `loginEmail` match — never derive it from the account/user GUID** (the observed id equality is a single observation, undocumented). Also VERIFIED (2026-08-02): author is **re-assignable after publish** — `PATCH /blog/v3/draft-posts/{id}` `{ draftPost: { memberId } }` then republish updates the published post's author (post id == draft id; republish fires non-suppressed events — do author-upgrade passes inside the notification-mute window). Visible custom cover media requires **both** `heroImage.id` and `media: { displayed:true, custom:true, wixMedia:{ image:{ id }}}`. `heroImage.id` alone leaves the cover hidden. |
|
|
150
237
|
| Blog posts (bulk) | `POST /blog/v3/bulk/draft-posts/create` | UNVERIFIED bootstrap (public docs + wix/skills `wix-manage` recipe, 2026-07-21). Max **20 posts/call**; `bulkCreateDraftPosts` chunks larger inputs. Prefer over per-post creates for N ≥ 2 (single create runs ~25–30s/call per the recipe). Publish is still per-post — a bulk `publish` flag is unverified. Surface in the execution plan until the live contract call promotes it. |
|
|
151
238
|
| CMS item | `POST /wix-data/v2/items` | VERIFIED. `{ dataCollectionId, dataItem: { data } }`. Requires Wix Data enabled (else `WDE0110`). |
|
|
152
|
-
| Members | `GET`/`POST /members/v1/members` | VERIFIED. dedup by `loginEmail` (gated PII; use a fallback member when absent). VERIFIED (2026-08-02, single-site observation): the target-site member list can already contain **auto-created user-members** for the owner/contributing Wix users (`status: APPROVED`; resolve by `loginEmail`, never by deriving from the account GUID — the observed id equality is undocumented) — never dedupe or count these against source-site members; `DELETE /members/v1/members/{id}` works for cleaning up importer-created members. Throughput: **no bulk create; documented ≥1s spacing** (10k ≈ 3h serial floor — plan + resume via crosswalk). Create sends **no email** and does **not** fire the signup automations trigger (source-confirmed) — silent by default. **Activation policy (decided 2026-08-03): passwords are never imported, and passwordless members complete the standard forgot-password flow (confirmed).** Delivery = post-import **label-wave automation**: owner creates one dashboard automation (trigger `label added`, e.g. `migrated-2026` → owner-branded email: "Log in → Forgot password"); importer applies the label via API in batches for rate control/re-targeting; enable only after the import window
|
|
239
|
+
| Members | `GET`/`POST /members/v1/members` | VERIFIED. dedup by `loginEmail` (gated PII; use a fallback member when absent). VERIFIED (2026-08-02, single-site observation): the target-site member list can already contain **auto-created user-members** for the owner/contributing Wix users (`status: APPROVED`; resolve by `loginEmail`, never by deriving from the account GUID — the observed id equality is undocumented) — never dedupe or count these against source-site members; `DELETE /members/v1/members/{id}` works for cleaning up importer-created members. Throughput: **no bulk create; documented ≥1s spacing** (10k ≈ 3h serial floor — plan + resume via crosswalk). Create sends **no email** and does **not** fire the signup automations trigger (source-confirmed) — silent by default. **Activation policy (decided 2026-08-03): passwords are never imported, and passwordless members complete the standard forgot-password flow (confirmed).** Delivery = post-import **label-wave automation**: owner creates one dashboard automation (trigger `label added`, e.g. `migrated-2026` → owner-branded email: "Log in → Forgot password"); importer applies the label via API in batches for rate control/re-targeting; enable only after the import window. **Never mass-send** `send-set-password-email` (3h single-use link), and never fetch/store per-member reset links — they are credential-equivalent secrets and the no-link flow needs none. |
|
|
153
240
|
| Stores product (BULK — the scale path) | `POST /stores/v3/bulk/products-with-inventory/create` | UNVERIFIED bootstrap. **Use this, not per-product creates, for any catalog above a handful** — 1000 products is 11 calls instead of 1000. Creates up to 100 products with inline options, inline brand/ribbon/infoSections, all variants AND per-variant inventory items in one request. **Five caps apply simultaneously and exceeding ANY ONE rejects the whole request:** products ≤100, `variantsInfo.variants` ≤1000 total, `options` ≤100 total, `modifiers` ≤100 total, `infoSections` ≤100 total. With 2 options per product the options cap binds at **50** products, not 100 — so batch with `lib/ndjson.js` → `readBatchesByLimits` using the exported `BULK_PRODUCT_LIMITS` + `storesProductBulkCost`, never on record count alone. **TRAP: bulk is NOT atomic** — a `200` can carry per-item failures in `results[].itemMetadata.success`; never infer success from the HTTP status. **TRAP: correlate results by `itemMetadata.originalIndex`**, not response position. **TRAP: `bulkActionMetadata.undetailedFailures`** counts failures whose detail the server dropped; ignoring it silently loses records. `returnEntity:false` (default) still returns `itemMetadata.id`, which is all a crosswalk needs — pass `true` only for a contract probe that must inspect the created entity. `bulkCreateStoresProductsWithInventory` handles normalization, correlation and the unaccounted-item check, returning `{ results, succeeded, failed, undetailedFailures, unaccounted }`. Normalization is purely local — HTML descriptions travel as `plainDescription` for Wix to convert server-side — so a batch is **one** HTTP call. It used to convert one description per product first, which made a 100-product batch 101 calls and reliably tripped the Ricos endpoint's 403 throttle. |
|
|
154
|
-
| Stores product | `POST /stores/v3/products`, `POST /stores/v3/products/query`, `PATCH /stores/v3/products/{id}`, `GET /stores/v3/products/{id}`, `GET /stores/v3/products/slug/{slug}` | VERIFIED (2026-07-05; media patch verified
|
|
155
|
-
| Stores category | `POST /categories/v1/categories`, `POST /categories/v1/categories/query` | VERIFIED (2026-07-05) for create. Body `{ category, treeReference }` — `treeReference` is **top-level** (sibling of `category`, `{appNamespace:"@wix/stores"}`); nesting it 400s "treeReference must not be empty". Empty optional strings such as `description: ""` are omitted. **Query:** same top-level `treeReference` trap applies. `queryStoresCategories(wix)` returns **one page (100 max)** unwrapped to the array — it does **not** return all categories, and the unwrap discards the cursor so it cannot be paged. Any dedupe/upsert index must use **`queryAllStoresCategories(wix)`**, which follows `pagingMetadata.cursors.next` and throws rather than returning a partial index.
|
|
241
|
+
| Stores product | `POST /stores/v3/products`, `POST /stores/v3/products/query`, `PATCH /stores/v3/products/{id}`, `GET /stores/v3/products/{id}`, `GET /stores/v3/products/slug/{slug}` | VERIFIED (2026-07-05; media patch verified live). `buildCreateStoresProductRequest` runs `normalizeStoresProductV3`, which bakes in the create traps: PHYSICAL requires `physicalProperties:{}`; simple/V1-ish top-level `price`, `sku`, and physical properties are moved into a single V3 variant; option/variant choice names clamped to 50 (identical truncation both places); variant `optionChoiceNames.renderType` defaulted to `TEXT_CHOICES`; `compareAtPrice` dropped unless strictly > `actualPrice`; variant `price` must be a **money object** (`{ actualPrice: { amount: "14.95" } }`) — a bare string/number 400s "Expected an object" (verified 2026-07-19), so the normalizer coerces scalar prices. **Descriptions:** a string `description` is HTML and is moved to **`plainDescription`** by `normalizeStoresProductV3`; Wix converts that to rich content server-side, so the product path never calls the Ricos endpoint (`description` proper is a Ricos document *object* — HTML there is a type error). **TRAP: `plainDescription` is silently ignored when `description` is also set** — a 200 with an empty description — so the normalizer throws when both are present. **TRAP: hard cap of 16,000 characters** (the old Ricos path chunked at 28k and merged, so it was effectively unbounded); over-long bodies throw rather than truncate, and need an info section or an explicit `mapping-gaps.json` entry. For product media, prefer `media.itemsInfo.items[]` with external `url` values when the source URLs are publicly reachable: the Stores product API ingests them in the background, avoiding the slower, heavily-throttled Media Manager pre-import path. Use pre-imported Wix media ids only when the target flow requires them. **Upsert lookups:** `getStoresProduct(wix, id)` and `getStoresProductBySlug(wix, slug)` return the product or throw 404 — callers should catch and treat as `null` for "not found". **Catalog sweeps:** `queryStoresProducts` returns **one page** unwrapped to the array with the cursor discarded, so a crosswalk-recovery or name-match safety net must use **`queryAllStoresProducts(wix)`**, which follows the cursor and throws rather than returning a partial index. **Slugs:** sanitizing is owned by `lib/wix-build.js` (`toWixSlug`, applied automatically via the `coerce: 'slug'` rule on `product.slug`), not by this module and deliberately not by `normalizeStoresProductV3` — the writer passes the caller's slug through unchanged so URL preservation can record the original next to the derived `plannedTargetSlug`. It matters because Wix rejects anything outside `[a-z0-9-]` and slug validation precedes application, so one bad slug (Shopify mints `ph-5_5` from a "pH 5.5" title) 400s the entire bulk batch rather than just that product. **General patch:** `patchStoresProduct(wix, { productId, revision, ...fields })` applies `normalizeStoresProductV3`, so a string `description` moves to `plainDescription` here too; `revision` from the existing product is required. UNVERIFIED for get-by-id, get-by-slug, and general-field patch (endpoint VERIFIED; arbitrary-field patching and slug lookup not yet live-tested). **Variable products / variant matrices:** Wix Stores V3 requires server-assigned `optionChoiceId` GUIDs before a variant matrix can be built — those IDs do not exist until after the initial `createStoresProduct` call returns. A single-pass import therefore cannot create a full variant matrix in one call. The two-pass approach: (1) create the product with options declared (but no variants), (2) create each option choice via `POST /stores/v3/products/{id}/options/{optionId}/choices` to obtain server-assigned choice IDs, (3) create variants via `POST /stores/v3/products/{id}/variants`. When the two-pass flow is out of scope (e.g. public-data single-pass run), import as a single-variant product at the base price, record the fidelity loss in `mapping-gaps.json`, surface it in the execution-plan report, and ensure the generated product detail page renders `productOptions` when non-empty so the storefront is ready once options are added. |
|
|
242
|
+
| Stores category | `POST /categories/v1/categories`, `POST /categories/v1/categories/query` | VERIFIED (2026-07-05) for create. Body `{ category, treeReference }` — `treeReference` is **top-level** (sibling of `category`, `{appNamespace:"@wix/stores"}`); nesting it 400s "treeReference must not be empty". Empty optional strings such as `description: ""` are omitted. **Query:** same top-level `treeReference` trap applies. `queryStoresCategories(wix)` returns **one page (100 max)** unwrapped to the array — it does **not** return all categories, and the unwrap discards the cursor so it cannot be paged. Any dedupe/upsert index must use **`queryAllStoresCategories(wix)`**, which follows `pagingMetadata.cursors.next` and throws rather than returning a partial index. A site with more than 100 categories reads back only 100 through the single-page call, which would duplicate the missing ones. UNVERIFIED for query (not yet live-tested). |
|
|
156
243
|
| Wix Tag (global) | `POST /tags/v1/tags` | UNVERIFIED bootstrap. Body `{ tag: { name, fqdn } }`. FQDN for Stores V3 products: `"wix.stores.catalog.v3.product"`. Max 100 tags per FQDN. Create tags before products; crosswalk tag IDs into product `tags.publicTags.tagIds[]` at create time. Tags are a native Wix entity — do not route product tags to CMS. |
|
|
157
|
-
| Stores inventory
|
|
158
|
-
| Stores category membership | `POST /categories/v1/bulk/categories/add-item` | VERIFIED (2026-07-05). `{ item:{ catalogItemId, appId }, categoryIds[], treeReference }`; `appId` = Wix Stores `215238eb-…`, `catalogItemId` = Wix product id. |
|
|
244
|
+
| Stores inventory | `POST /stores/v3/inventory-items`, `POST /stores/v3/bulk/inventory-items/create`, `POST /stores/v3/bulk/inventory-items/update` | VERIFIED LIVE for single create, bulk create/update, Inventory and default-location Catalog read-back. Imports use `reconcileInventory` with the full expected variant count; persist its report and complete the inventory checkpoint only when `status:complete` and `complete:true`. No-data remains distinct. `buildCreateInventoryItemRequest` requires exactly one explicit `inStock` boolean or `quantity` integer; omitting both now throws instead of sending an unspecified stock policy. `trackQuantity` is validated for compatibility but omitted from requests because it is read-only. |
|
|
245
|
+
| Stores category membership | `POST /categories/v1/bulk/categories/add-item` | VERIFIED (2026-07-05). `{ item:{ catalogItemId, appId }, categoryIds[], treeReference }`; `appId` = Wix Stores `215238eb-…`, `catalogItemId` = Wix product id. **`bulkAddItemToCategories(wix, payload)` takes exactly one `{ productId, categoryIds }` object — never extra positional arguments** (a generated call site once passed three, silently dropping the third and sending `undefined` for both fields on every call; see `lib/stores-category-attach.js`). Do not call it inline and trust the resolved promise: use `reconcileCategoryAttachment(wix, rows, opts)`, which calls it with the correct shape, never swallows a write error, and reads every product back (`DIRECT_CATEGORIES_INFO`) before marking a row attached — an ADD is confirmed by "every expected id present", never exact set equality. |
|
|
159
246
|
| Contacts | `POST /contacts/v5/contacts`, `POST /contacts/v5/bulk/contacts/upsert`, `POST /contacts/v5/contacts/query`, `GET /contacts/v5/contacts/{id}`, `PATCH /contacts/v5/contacts/{id}` | **GA** (docs verified 2026-08-04 — was Developer Preview when selected on 2026-07-26). Do not fall back to V4 unless a migration explicitly chooses a legacy compatibility path. **The GA contact shape is FLAT** — no `info` wrapper, no `emails.items`/`phones.items` list wrappers: one main `email`/`phone` (contact matching + subscription status live on these) plus `additionalEmails`/`additionalPhones` arrays; `addresses[]` keeps postal fields **nested under `address`**; `company` is `{ name, jobTitle }`. Create and update both take `{ contact, allowDuplicates }`; update requires the current `revision` and has **no fieldMask**. Phone tags: `OTHER`/`MAIN`/`HOME`/`MOBILE`/`WORK`/`FAX` (no `UNTAGGED`). `buildCreateContactRequest`/`buildUpdateContactRequest` accept the flat GA `contact` (legacy `info` payloads convert strictly — non-mechanical keys like `extendedFields`/`labelKeys` throw). Live create/query/update verification is still pending a token with Contacts permissions (2026-07-26 probe got `403`) — keep V5 writers surfaced as UNVERIFIED in execution reports until a live contract test promotes them. **Custom fields (GA):** the V5 contact carries `extendedFields.namespaces.<ns>`; per the V5 contact-object docs, definitions go through the **Data Extension Schema API with FQDN `wix.contacts.*.contact`** (user-defined values under `_user_fields`). The V4 Contacts Extended Fields API (`POST /contacts/v4/extended-fields`, values under `info.extendedFields`) pairs with the V4 surface only — do not mix. CAVEAT: the Data Extension Schema intro's supported-objects table does not list contacts yet (docs inconsistency at GA cutover); verify the DES path live during setup before relying on it. **Labels → tags:** V5 exposes `tags.privateTags.tagIds[]` managed via the Tags API (same FQDN); V4 label APIs and the `labels_added` automation trigger are a V4-surface concept — resolve the tag/label story during setup before planning post-import label waves through V5 writers. |
|
|
160
|
-
| Coupons | `POST /stores/v2/coupons`, `POST /stores/v2/coupons/query` |
|
|
161
|
-
|
|
|
162
|
-
|
|
|
247
|
+
| Coupons | `POST /stores/v2/coupons`, `POST /stores/v2/coupons/query`, `DELETE /stores/v2/coupons/{id}` | `createCoupon` VERIFIED LIVE (stores/coupon entity, multi-thousand import). **Contract:** use `ensureCoupon({ specification })` — Query Coupons by exact `specification.code` (paced, retried; the write is not readable immediately), zero matches creates, one reconciles, more is ambiguous and creates nothing. The specification comes from `rp-source-wordpress/lib/coupon-discovery.js` `mapCouponToWix`; never hand-roll it (epoch-ms times, explicit `appliesToSubscriptions`, exhausted codes `active: false`). **Redeemability is REFUSED unless it was decided:** `ensureCoupon`, `bulkCreateCoupons` and `normalizeCouponSpecification` all throw before any network call unless the specification carries a boolean `active` and either a positive-integer `usageLimit` or the directive `usageUnlimited: true` (stripped before the body is built; `usageLimit: 0` is rejected by the target, so unlimited has no sentinel number). Both fields are optional on the API and each omission resolves the expensive way -- absent `active` reads as ON, and the target's own usage count starts at zero. CREATE paths only: `updateCouponFields` must keep carrying only the fields being changed. **Scope is enforced by the writer**, so a hand-rolled specification now fails locally instead of on the store: `normalizeCouponSpecification` derives `scope.namespace` from `scope.group.name` (`product`/`collection` -> `stores`, `form` -> `forms`; never a flat constant) and REFUSES an unenumerated group name, a nameless group, a group with no `entityId`, or a namespace/group pair that is not one of the five accepted pairs -- naming the field, the value and the accepted values. A refusal throws; it never drops the scope, because a dropped scope is a storewide coupon. `bulkCreateCoupons` sets refused specifications aside BEFORE it sends, reports each one `coupon-scope-shape-invalid` keyed by code, and writes the rest in one call. A scoped coupon should carry `scopeTarget: {visible}` -- the caller's verdict on the restricted product or collection: `{visible: false}` is refused unsent as `coupon-scope-target-hidden` (never widened to storewide, never parked with `active: false`), and an omitted `scopeTarget` writes but marks the result `coupon-scope-target-visibility-unchecked`. |
|
|
248
|
+
| Members | `POST /members/v1/members`, `POST /members/v1/members/query`, `GET /members/v1/members/{id}`, `POST /contacts/v5/contacts/query` | Create VERIFIED LIVE. **Contract:** `ensureMember({ loginEmail, contact, knownMemberId })` (`customer-member.js` builds `contact` from a source customer — `buildMemberContact`, phone via `normalizePhoneE164`, never sent un-converted: Create Member 400s on anything not already E.164). Reconciles by a crosswalk row read back and verified (`member-crosswalk-row-stale` if not), else Query Members by `loginEmail` (one match reconciles, more is ambiguous); before every create that carries a phone, Contacts V5 is queried by that phone and it is DROPPED (`member-phone-collision-dropped`) on a match — Create Member reuses an existing contact with a matching phone even from a DELETED member, and two different customers would otherwise merge into one Wix identity. Persist `loginEmail` on the crosswalk row (`lib/member-crosswalk.js`) or `resolveOrderBuyer` cannot link anything. Create Member ≥1s apart (documented floor). |
|
|
249
|
+
| Pricing plans | `POST /pricing-plans/v3/plans`, `POST /pricing-plans/v3/plans/query`, `POST /pricing-plans/v2/plans/{id}/archive` | Create VERIFIED LIVE 2026-08-16 (pricing-plans/plan entity). **Contract:** `ensurePlanDefinition({ plan, idempotencyKey, knownPlanId })` — the reconciliation IDENTITY is the client-minted `pricingVariants[].id` (offer-derived, preserved by Wix), never the name (names are cut to 50 chars and collide). A `knownPlanId` is read back (`GET /pricing-plans/v3/plans/{id}`) and adopted only if it exists, is not archived and carries our variant id, else `plan-crosswalk-row-stale`; then Query Plans by name, filtered to plans carrying our variant id (one reconciles, more is ambiguous, a merchant's same-named plan is ignored); then Create Plan ≥1s apart with `idempotencyKey` in the BODY beside `plan` (a header is ignored). An adopted plan that is ours but no longer inert is reported (`plan-reconciled-not-inert`), not archived. The body comes from `lib/pricing-plan-definition.js` `buildPlanDefinition` and is REFUSED unless `visibility: PRIVATE` and `buyable: false`; the CREATED plan is checked too and archived at once if it came back purchasable (`plan-failed`, cause `created-plan-not-inert`, `archived: true|false` — a FAILED archive is reported as such with `archiveError`, and `tallyPlanWriteOutcomes` counts it on `plans-live-hazard`, which blocks the report). `status: ACTIVE` is required though undocumented. Archive is the V2 call; V3 has none. |
|
|
250
|
+
| eCom order | **`POST /ecom/v1/orders/import`** (historical orders), `POST /ecom/v1/orders/query`, `POST /ecom/v1/orders/{orderId}/activities/add` | **VERIFIED LIVE** (2026-08-12; re-verified 2026-08-16 with applied discounts, line-item description lines and merchant notes). Import Order is the only import-safe path — see `ecom/order.json`. **Caller-supplied `id` VERIFIED LIVE 2026-09-05:** a never-seen GUID is accepted and kept; a re-send with an existing id silently REPLACES the whole body (attached payments and extendedFields survive); a non-GUID is a 400. `lib/order-history.js` derives the id from the source — do not pick one, and never re-send an existing order. **`POST /ecom/v1/orders` (createOrder) remains BLOCKED for migration**: it decrements inventory, emails the buyer and auto-creates contacts. TRAP: `order.number` must be numeric — a prefixed source number fails the whole call with a bare `400 {"message":"Not a numeric value"}` and no field path. |
|
|
251
|
+
| Site notifications mute | `POST /notification-preferences/v1/site-mute/mute`, `POST /notification-preferences/v1/site-mute/unmute`, `GET /notification-preferences/v1/site-mute` | VERIFIED (2026-08-04, full cycle live on a test target: mute → state read → idempotent re-mute → unmute → state restored, all 200). Mutes **all** notifications of the site in context — all recipients, all channels; sendability denied regardless of recipient-level preferences. All three calls return `{ siteMuteState: { muted, reason?, mutedBy: { wixUserId } } }`; executors unwrap to `siteMuteState`. Mute body `{ reason?: string }` (≤500, clamped by the builder) — always pass a project-identifying reason (`RePlatform migration — <project>`) so the mute is auditable. **TRAP: re-mute overwrites `reason`** (last caller wins) — the import preflight's idempotent re-call must pass the same reason as setup. **AUTH TRAP: user tokens only** — the CLI-minted `OauthNG` site token (`WIX_AUTH_TOKEN` from `config/wix.env`) works; an account API key gets a uniform empty-body 403 on all three endpoints. Hard invariant: when mute is in effect (always for `WIX_SITE_STRATEGY=new`; explicit opt-in for existing sites), a failed mute halts the run before any import write — no degraded mode. `unmuteSiteNotifications` is **never called by the flow itself** — explicit owner request only; after an on-request unmute, confirm `muted: false` via `getSiteMuteState`. |
|
|
163
252
|
| Direct native REST | any Wix REST path derived by codegen | UNVERIFIED generated path for native Wix entities missing a dedicated adapter writer. Must log, call `notifyMissingWriter`, and be shown in the execution plan. |
|
|
164
253
|
|
|
165
254
|
## Safe-mode contact replacement
|
|
@@ -214,7 +303,7 @@ subscription payloads to Wix to discover field errors live.
|
|
|
214
303
|
Catalog V3 subscriptions are a native Stores target, not an automatic CMS fallback or
|
|
215
304
|
semantic loss. Product create with `subscriptionDetails.allowOneTimePurchases` and
|
|
216
305
|
`subscriptions[]` entries containing `title`, `description`, `frequency`, `interval`, and
|
|
217
|
-
`autoRenewal` was verified live on 2026-07-26
|
|
306
|
+
`autoRenewal` was verified live on 2026-07-26; Wix returned
|
|
218
307
|
server-assigned subscription option ids. Mapping/codegen should emit native recurring product
|
|
219
308
|
creates when the source cadence is known. General subscription patching remains unverified.
|
|
220
309
|
|
|
@@ -224,15 +313,15 @@ Use the shared Stores verification CLI for live target checks that would otherwi
|
|
|
224
313
|
migration-local snippets:
|
|
225
314
|
|
|
226
315
|
```bash
|
|
227
|
-
node skills/replatform/resources/rp-target-wix/scripts/verify-stores.js stores subscription-create \
|
|
316
|
+
node skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js stores subscription-create \
|
|
228
317
|
--artifact migrations/<project>/setup/stores-subscription-verification.json \
|
|
229
318
|
--proposal-artifact migrations/<project>/setup/contract-ledger-proposal.json
|
|
230
|
-
node skills/replatform/resources/rp-target-wix/scripts/verify-stores.js stores product-count \
|
|
319
|
+
node skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js stores product-count \
|
|
231
320
|
--artifact migrations/<project>/execution/stores-product-count-verification.json
|
|
232
|
-
node skills/replatform/resources/rp-target-wix/scripts/verify-stores.js stores product-by-source-marker \
|
|
321
|
+
node skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js stores product-by-source-marker \
|
|
233
322
|
--marker-path customFields.sourceId --marker-value <source-id> \
|
|
234
323
|
--artifact migrations/<project>/execution/stores-product-marker-verification.json
|
|
235
|
-
node skills/replatform/resources/rp-target-wix/scripts/verify-stores.js stores delete-probe \
|
|
324
|
+
node skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js stores delete-probe \
|
|
236
325
|
--product-id <probe-product-id> \
|
|
237
326
|
--artifact migrations/<project>/setup/stores-probe-cleanup.json
|
|
238
327
|
```
|
|
@@ -439,6 +528,43 @@ The shared runtime contract should preserve explicit artifact authority:
|
|
|
439
528
|
The runtime should not force downstream consumers to reconstruct final outcome by reading
|
|
440
529
|
raw audit logs or chronological execution logs.
|
|
441
530
|
|
|
531
|
+
### A rejected write and a write of unknown outcome are different results
|
|
532
|
+
|
|
533
|
+
`createWixClient().send` checks the response status **before** it tries to read
|
|
534
|
+
the body, and every failure it throws says which of two things happened:
|
|
535
|
+
|
|
536
|
+
- **Rejected.** The response body parsed. The target made a decision and stands behind it.
|
|
537
|
+
`outcomeKnown: true`, `status` set, `body` parsed, `applicationErrorCode` populated when
|
|
538
|
+
the envelope carried one. Report it and classify it by status; only the duplicate-protected transient paths below may retry.
|
|
539
|
+
- **Unknown.** The body did not parse — a gateway or protection layer answered ahead of the
|
|
540
|
+
service with an HTML error page — or the transport threw before any response arrived.
|
|
541
|
+
`outcomeKnown: false`, with `rawBody` holding the first 400 characters of what actually
|
|
542
|
+
came back and `status` set to what the target returned (`null` only when no response
|
|
543
|
+
arrived at all). Nobody knows whether the write was applied, and the honest report says so.
|
|
544
|
+
|
|
545
|
+
A **2xx** whose body does not parse is *unknown*, not a success: it usually means the request
|
|
546
|
+
never reached the service, and returning `null` there is how an unwritten record becomes a
|
|
547
|
+
written one in the report. An **empty** body on a 2xx is not unparseable and still returns
|
|
548
|
+
`null`, as several Wix deletes answer exactly that way.
|
|
549
|
+
|
|
550
|
+
`describeError` carries `outcomeKnown: false` through to the results ledger, so the
|
|
551
|
+
distinction survives being written down.
|
|
552
|
+
|
|
553
|
+
**One exported test decides whether a failure is worth trying again:
|
|
554
|
+
`isTransientWixError` (with `TRANSIENT_WIX_STATUSES`), from `lib/wix-writers.js`.** It keys
|
|
555
|
+
on the target's numeric status (`429`, `500`, `502`, `503`, `504`) and on the
|
|
556
|
+
no-response-at-all marker, and on nothing else — never on the error's message text, which is
|
|
557
|
+
truncated at 400 characters by design, and never on `applicationErrorCode`, in either
|
|
558
|
+
direction. `403` is excluded: it is one endpoint's observed throttle and a real permission
|
|
559
|
+
failure everywhere else. No caller may define its own copy.
|
|
560
|
+
|
|
561
|
+
It answers "is this condition likely to clear". It does **not** answer "is it safe to try
|
|
562
|
+
again" — only the call site knows that. Exactly two write paths retry (3 attempts, with 500 /
|
|
563
|
+
1500 ms between attempts): the order import and the reconcile-plus-payment-write pair, both inside
|
|
564
|
+
`importOrderHistory`, and both only because they reconcile against the target first. Nothing
|
|
565
|
+
else does, because a write that is not reconciled first and fails after the target committed
|
|
566
|
+
would be retried into a duplicate record.
|
|
567
|
+
|
|
442
568
|
### Retry and throttling policy
|
|
443
569
|
|
|
444
570
|
This adapter should define one shared retry/throttling contract rather than letting each
|
|
@@ -472,6 +598,90 @@ first or can be ingested through the entity API itself.
|
|
|
472
598
|
- **Wix Stores products:** prefer external URLs on `media.itemsInfo.items[]` and let the
|
|
473
599
|
product API ingest them in the background. This is the default path when the URLs are
|
|
474
600
|
publicly reachable.
|
|
601
|
+
|
|
602
|
+
What one item accepts, from the machine-readable Catalog V3 spec (component
|
|
603
|
+
`ProductMedia`) — not from the prose article, which disagrees on the cap:
|
|
604
|
+
|
|
605
|
+
| Field | Direction | Constraint |
|
|
606
|
+
| --- | --- | --- |
|
|
607
|
+
| `setBy.id` **or** `setBy.url` | **in** | a `oneOf` — exactly one per item |
|
|
608
|
+
| `altText` | **in** | 1–1000 characters |
|
|
609
|
+
| `displayName` | **in** | max 80, and **only** accepted when the item is set by `url` |
|
|
610
|
+
| `mediaType`, `uploadId` | out | read-only |
|
|
611
|
+
| `media.image`, `media.video` | out | read-only; populated when the item is set by `id` |
|
|
612
|
+
| `thumbnail` | out | Wix-generated; needs `THUMBNAIL` in the request's `fields` array |
|
|
613
|
+
| `media.main` (on the parent) | out | read-only; always the first entry of `itemsInfo.items` — reorder the array to change it |
|
|
614
|
+
|
|
615
|
+
⚠️ **`thumbnail` is not an input.** It looks like a second image URL you could supply and
|
|
616
|
+
it is not — `fields` is defined as *"Fields to include in the response"*, so `THUMBNAIL`
|
|
617
|
+
only asks Wix to return a derivative it generated from the one file you uploaded. There is
|
|
618
|
+
no input that influences it, and none that raises an already-ingested item's quality: the
|
|
619
|
+
URL you send is that image's permanent ceiling. Send the source's original, maximum-
|
|
620
|
+
resolution file — the source adapter owns that choice (WordPress sources: `wp-image-url.js`).
|
|
621
|
+
|
|
622
|
+
⚠️ **The cap is disputed by Wix's own docs.** The schema says `maxItems: 50` on
|
|
623
|
+
`itemsInfo.items`; the *About Product Media* article says 15. Follow the schema and do not
|
|
624
|
+
design near either bound.
|
|
625
|
+
|
|
626
|
+
⚠️ The article also says `width`/`height` are not populated for URL-set media. Observed
|
|
627
|
+
behaviour contradicts it — a URL-set item read back live returned both — so reading
|
|
628
|
+
dimensions back is a usable post-ingest check. Confirm at first live run before reporting
|
|
629
|
+
it as a guarantee.
|
|
630
|
+
|
|
631
|
+
⚠️ **The 200 is a queue acknowledgement, not a delivery — and a failed ingest empties the
|
|
632
|
+
gallery.** This is the most expensive trap on this endpoint, so it gets its own paragraph.
|
|
633
|
+
The write returns 200 with the item echoed back as `mediaType: "UNKNOWN_MEDIA_TYPE"` and an
|
|
634
|
+
`uploadId`; Wix fetches the URL afterwards, on its own side, with no callback and no status
|
|
635
|
+
endpoint. `media.itemsInfo.items` is a **full replace**, so the product's existing image is
|
|
636
|
+
discarded the moment the PATCH is accepted. When the later fetch fails, Wix **drops the item**
|
|
637
|
+
and the product is left with **no images at all** — 200 on the write, no error anywhere, and
|
|
638
|
+
the old picture already gone.
|
|
639
|
+
|
|
640
|
+
It is transient and unattributable: observed live on a valid, publicly reachable 2048×2048
|
|
641
|
+
JPEG that ingested fine on the very next identical attempt. Nothing about the file or the
|
|
642
|
+
request predicts it, so there is nothing to validate up front.
|
|
643
|
+
|
|
644
|
+
| Observed live | Frequency |
|
|
645
|
+
| --- | --- |
|
|
646
|
+
| Items not ingested 60 s after an accepted write | a sizable minority |
|
|
647
|
+
| Of those, fixed by one identical retry | nearly all |
|
|
648
|
+
| Writes refused by an **edge-level 429** whose body is an HTML page, not JSON | occasional |
|
|
649
|
+
|
|
650
|
+
So: **never treat a 200 as done.** Read the product back with `?fields=MEDIA_ITEMS_INFO`
|
|
651
|
+
(a plain `GET` returns only `media.main` and looks empty even when healthy), and re-send
|
|
652
|
+
anything whose items lack an `image.id`. A miss is *not yet known*, never *failed* — only
|
|
653
|
+
re-sending distinguishes "still in flight" from "dropped and gone". Use
|
|
654
|
+
`patchStoresProductMediaVerified`, which does this, rather than `patchStoresProductMedia`,
|
|
655
|
+
which returns on the 200. Re-read the `revision` each round: the accepted-but-not-ingested
|
|
656
|
+
write already incremented it.
|
|
657
|
+
|
|
658
|
+
⚠️ Two different failures, **one retry list**. A write refused with 429 leaves the OLD image
|
|
659
|
+
in place; a write accepted but never ingested leaves NOTHING. Anything that did not reach the
|
|
660
|
+
verified state goes into the next round, whatever went wrong — recording one of them as an
|
|
661
|
+
error and dropping it out of the loop is how a run reports success over products it never
|
|
662
|
+
fixed. Keep the write pool small (3 concurrent, not 6) so the edge limiter is not the thing
|
|
663
|
+
the retry loop spends its rounds on.
|
|
664
|
+
|
|
665
|
+
**WordPress-family URL provenance is enforced here.** A generated importer uses the exact
|
|
666
|
+
`confirmedPictures` instance exported by `wix-writers.js` for declaration, source reads and
|
|
667
|
+
confirmation; a separately required toolkit or vendored copy does not activate this writer.
|
|
668
|
+
After declaring `orchestration/decisions.json` → `sourcePlatform.value`, guarded importers call
|
|
669
|
+
`assertProductMediaGuardActive()` at startup and stop if this writer's own guard is inactive.
|
|
670
|
+
Under exact `woocommerce` or `wordpress` declarations, `buildStoresProductMedia` accepts URL
|
|
671
|
+
items only when the complete ordered list came from `confirmPictures` (or an exact
|
|
672
|
+
normalization registered by `deriveConfirmed`). Create, bulk create, general patch, media
|
|
673
|
+
patch and verified media patch all cross this boundary; the verified path checks before its
|
|
674
|
+
first read. Hand-built strings, objects, clones, subsets, extensions and reorders throw before
|
|
675
|
+
any Wix request. Wix media ids, other source identities and undeclared legacy callers retain
|
|
676
|
+
their current behavior.
|
|
677
|
+
|
|
678
|
+
⚠️ **A round that failed must back off before the next one, and it is a different wait from
|
|
679
|
+
the settle wait.** The settle wait comes *after* an accepted write, so a round that throws
|
|
680
|
+
never reaches it — retry immediately and the loop burns all its rounds in milliseconds against
|
|
681
|
+
a rate limit that lasts tens of seconds, which is a retry loop that only looks like one. Two
|
|
682
|
+
waits, two purposes: `settleMs` waits for an accepted write to finish ingesting, `retryDelayMs`
|
|
683
|
+
waits for a refusal to lift. Skip the delay after the final round — there is nothing left to
|
|
684
|
+
wait for and the caller should not pay for it.
|
|
475
685
|
- **Wix Blog cover images and other surfaces that require a Wix media id at create/update
|
|
476
686
|
time:** import media first, then pass the Wix media id into the entity payload.
|
|
477
687
|
- **Generic Media Manager import** is a fallback/shared primitive, not the default for
|
|
@@ -542,23 +752,191 @@ accommodates. The V3 create traps are handled in `lib/wix-writers.js`
|
|
|
542
752
|
(`normalizeStoresProductV3` + the top-level `treeReference` builder), so callers never
|
|
543
753
|
re-hit them.
|
|
544
754
|
|
|
545
|
-
**
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
755
|
+
**On a site this run created, a Stores install is guaranteed Catalog V3.** This section
|
|
756
|
+
used to require verifying that live, because a site scaffolded
|
|
757
|
+
from the `blank` headless template, with Stores installed afterwards through the App
|
|
758
|
+
Installation API, could come up `V1_CATALOG` — Catalog version is fixed at provisioning, so
|
|
759
|
+
every V3 write on such a site failed and the site had to be abandoned. The Wix platform has
|
|
760
|
+
since changed: Catalog V3 is now guaranteed at provisioning regardless of scaffold
|
|
761
|
+
template, so that failure mode can no longer occur for a newly-created site, and neither
|
|
762
|
+
the `--site-template commerce` requirement nor the pre-write version gate apply anymore.
|
|
551
763
|
|
|
552
|
-
|
|
764
|
+
This does **not** extend to an existing site this run did not create — `rp-execute-setup`
|
|
765
|
+
("A `V1_CATALOG` verdict is terminal here") still treats that case as a live risk and
|
|
766
|
+
halts on it, since a pre-existing site's catalog version predates this guarantee.
|
|
553
767
|
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
768
|
+
## Order history: payment records, refunds and preserved invoice documents
|
|
769
|
+
|
|
770
|
+
Import Order creates **no** payment record — a freshly imported order reads back with
|
|
771
|
+
`payments: []` — so payment history is a separate write, and refunds have nothing to reference
|
|
772
|
+
until it exists. And the order write itself has no idempotency unless it is given an id.
|
|
773
|
+
|
|
774
|
+
**The contract is one call: `importOrderHistory` in `lib/order-history.js`.** It owns
|
|
775
|
+
the per-order sequence — derive the order id, read or write the crosswalk, import, gate, one
|
|
776
|
+
reconciliation read, payment, refunds, invoice document — and returns every stage's outcome:
|
|
777
|
+
|
|
778
|
+
```js
|
|
779
|
+
const { importOrderHistory, createProjectOrderCrosswalk } = require('./lib/order-history.js');
|
|
780
|
+
const result = await importOrderHistory(wix, {
|
|
781
|
+
order, // mapped Import Order body, no `id`
|
|
782
|
+
sourceId, sourceSiteHost,
|
|
783
|
+
evidence, // { amount, paidDate, altPaidDate, currency, status, methodName, providerTransactionId,
|
|
784
|
+
// offlinePayment, cardDisplay, refunds: [{ sourceId, amount, reason }],
|
|
785
|
+
// invoice: { approval, sourceUrl, invoiceNumber, pendingMediaFileId },
|
|
786
|
+
// utcOffsetMinutes, // a fact about the SHOP
|
|
787
|
+
// paidDateZone, altPaidDateZone } // 'utc' | 'site-local', a fact about
|
|
788
|
+
// each source KEY. The offset is applied only to a stamp declared 'site-local'.
|
|
789
|
+
// Supplying utcOffsetMinutes beside a present stamp with no clock is REFUSED.
|
|
790
|
+
crosswalk, // createProjectOrderCrosswalk({ projectDir }) — required, persisted
|
|
791
|
+
setupVerification, // setup/extended-field-verification.json, read once per run
|
|
792
|
+
});
|
|
793
|
+
// result.outcomes = { order, payment, refunds: [{ sourceId, sourceOccurrence, outcome, refundId, paymentId }], invoice }
|
|
794
|
+
// result.findings, result.errors (partial failures carry a cause), result.orderId, result.paymentId
|
|
795
|
+
```
|
|
796
|
+
|
|
797
|
+
Its guarantees, each the answer to a failure mode seen in end-to-end testing:
|
|
798
|
+
|
|
799
|
+
- The **order id is derived** from `sourceSiteHost` and `sourceId` and the crosswalk row is
|
|
800
|
+
written before any further write. Hit or miss, the target is asked by id once — a read, not a
|
|
801
|
+
duplicated store, and not a phantom order either. A crosswalk row from before derived ids (a Wix-minted id) wins and
|
|
802
|
+
is counted as `order-id-from-crosswalk`. An existing order is **never re-sent**: Import Order's
|
|
803
|
+
replace is silent and would overwrite a merchant's edits.
|
|
804
|
+
- **Evidence keys are a contract.** An unknown key throws and names the right one; it does not
|
|
805
|
+
report an ineligible order. The target currency is `order.currency`.
|
|
806
|
+
- **One reconciliation read per order**, shared by the payment and every refund. Refund occurrences
|
|
807
|
+
are assigned inside from source ids; pass all of an order's refunds together.
|
|
808
|
+
- **Every stage returns an outcome**, and a stage that failed after the order existed returns
|
|
809
|
+
`payment-failed` / `refund-failed` / `invoice-failed` with `errors.<stage>.cause`, so a resume
|
|
810
|
+
reconciles the order and retries only what failed. An order-stage failure fails the rest for the
|
|
811
|
+
cause `order-not-imported`; a target that cannot be read is `order-target-read-failed` and
|
|
812
|
+
writes nothing.
|
|
813
|
+
- **The buyer's member id comes through `buyer`, never on the body**, and the body's `buyerInfo.email` must be the billing email the member was corroborated against.
|
|
814
|
+
`lib/order-buyer.js` `resolveOrderBuyer({ sourceCustomerId, billingEmail, memberCrosswalk,
|
|
815
|
+
contactCrosswalk })` links `buyerInfo.memberId` only when the member crosswalk row's `loginEmail`
|
|
816
|
+
equals the order's billing email; a guest, a missing row or a mismatch links nothing and reports
|
|
817
|
+
(`buyer-*` outcomes). The result is stamped; the composite sets `buyerInfo` from it and refuses a
|
|
818
|
+
body that carries `memberId` itself. Import Order stores ANY GUID there unvalidated (verified
|
|
819
|
+
live), so this is the only guard.
|
|
820
|
+
- The invoice `approval` goes to the writer unchanged. The merchant opt-in is applied when the
|
|
821
|
+
plan is built, nowhere else — and `resolvePreservationPlan()` stamps what it approves
|
|
822
|
+
(`lib/preservation-approval-stamp.js`), so the writer refuses an opt-in that did not come from
|
|
823
|
+
the plan. A READY Media file whose order patch failed comes back as
|
|
824
|
+
`invoice-fields-write-failed` with `pendingMediaFileId`; the composite remembers it in the
|
|
825
|
+
crosswalk (`getInvoiceFile`/`setInvoiceFile`) and the resume records that file instead of
|
|
826
|
+
importing another. The crosswalk contract is four methods, all required.
|
|
827
|
+
- **Every crosswalk hit is verified with one paced order read.** A hit is not proof: a row
|
|
828
|
+
pointing at an order the target no longer has (a cleared migration) is re-imported under the
|
|
829
|
+
derived id and counted as `order-reimported-after-deletion`. One read per order per run, hit or
|
|
830
|
+
miss.
|
|
831
|
+
|
|
832
|
+
Live: `tests/target-wix/order-history-live-sentinel.js` (credential-gated) — three runs against a
|
|
833
|
+
disposable site, one order and one payment afterwards, cleaned up through Bulk Delete Imported
|
|
834
|
+
Orders. Passed 2026-09-05.
|
|
835
|
+
|
|
836
|
+
### Per-writer reference — what the composite calls, in this order
|
|
837
|
+
|
|
838
|
+
The writers keep their contracts and remain callable; the composite is a new caller of them. This
|
|
839
|
+
is what each one guarantees, kept here because the guarantees are the reason the sequence is safe:
|
|
840
|
+
|
|
841
|
+
1. **Gate on the source, first.** `evaluatePaymentEligibility()` in `lib/order-payment-mapping.js`
|
|
842
|
+
requires a positive amount AND a source paid date. An order total is not evidence of payment;
|
|
843
|
+
neither is an order status, and neither is a transaction reference. Ineligible orders are
|
|
844
|
+
reported under a named reason and never reach the target — which is also what keeps target
|
|
845
|
+
reads proportional to evidenced payments rather than to the whole order population.
|
|
846
|
+
2. **Build the record**, with `buildPaymentRecord()`. `status` sits at payment level, not inside
|
|
847
|
+
`regularPaymentDetails`. `savedPaymentMethod` is never set: the field is writable but no
|
|
848
|
+
reusable credential can accompany it, so setting it asserts a charging agreement that does not
|
|
849
|
+
exist. An unknown offline/online class is OMITTED, never guessed — that is how a card payment
|
|
850
|
+
ends up labelled as cash.
|
|
851
|
+
3. **Reconcile before creating**, with `writeOrderPayment()`. It reads the order's existing
|
|
852
|
+
payments every run and matches by provider reference, else by an exact fingerprint of the
|
|
853
|
+
payment facts. The migration's own crosswalk is a hint, not proof of target state: it does not
|
|
854
|
+
survive "Wix write succeeded, crosswalk write failed", and it is blind to payments the merchant
|
|
855
|
+
created by hand. Exactly one match reconciles, more than one is ambiguous and prohibits
|
|
856
|
+
creation, and a failed target read is its own outcome — **never** permission to create. Add
|
|
857
|
+
Payments fails the ENTIRE call if a duplicate external transaction id is present, so writing
|
|
858
|
+
blind breaks the run and can double recorded revenue.
|
|
859
|
+
4. **Refund only what the source evidences**, with `ensureOrderPaymentAndRefund()`. Assign
|
|
860
|
+
occurrence numbers first and pass `sourceOccurrence` (the composite does this from the refunds'
|
|
861
|
+
source ids; a direct caller uses `assignRefundOccurrences()`): two
|
|
862
|
+
distinct source refunds can share a payment and an amount, and without it the second one
|
|
863
|
+
reconciles against the first and is silently dropped. It no longer
|
|
864
|
+
fabricates a payment to give a refund something to point at; a qualified refund whose order
|
|
865
|
+
evidences no payment is reported as `refund-without-payment`. `externalRefund` is a hardcoded
|
|
866
|
+
literal `true` — it defaults to `false`, which calls the payment provider for real. Omit
|
|
867
|
+
`sideEffects` entirely: that is what suppresses restock and the customer email. The refund date
|
|
868
|
+
cannot be preserved (read-only and immutable), so every written refund discloses that loss, and
|
|
869
|
+
the true date must not be smuggled into the customer-visible `customerReason`.
|
|
870
|
+
5. **Preserve invoice documents by reference**, with `preserveOrderInvoiceDocument()`. Pass the
|
|
871
|
+
`approval` straight from `resolvePreservationPlan()`, and pass `sourceSiteHost` with it. The
|
|
872
|
+
writer refuses anything that is not an approval naming that exact URL, and it re-derives the
|
|
873
|
+
DECISION from its own classification rather than trusting the approval's `action`: a document
|
|
874
|
+
that is not on the source site needs `merchantOptedIn` however the approval is labelled — and
|
|
875
|
+
the opt-in is believed only under the planner's provenance stamp.
|
|
876
|
+
`action` is caller-supplied, and trusting it meant a caller could relabel a third-party
|
|
877
|
+
document `preserve` and have it imported on nobody's authority. With no `sourceSiteHost` the
|
|
878
|
+
guard answers `third-party`, so omitting it fails closed. Pass the persisted
|
|
879
|
+
`setup/extended-field-verification.json` as `setupVerification`. When a previous run left an
|
|
880
|
+
import in flight, pass its `pendingMediaFileId` back so the import RESUMES instead of creating
|
|
881
|
+
another private orphan. It reads the
|
|
882
|
+
order itself — pass an `orderId`, not an order object — so an existing file id suppresses the
|
|
883
|
+
import and a re-run cannot import a second copy of a tax document. Pass the setup verification
|
|
884
|
+
receipt (`setup/extended-field-verification.json`): without it the write is refused as
|
|
885
|
+
`invoice-fields-not-provisioned`. The file is imported `private: true`; only the returned id is kept,
|
|
886
|
+
because the Import File response echoes `sourceUrl` and that URL is a bearer link. Update Order MERGES the `extendedFields` object it is given — verified live: a foreign
|
|
887
|
+
key survived a patch that never mentioned it. The write still sends the complete object, which
|
|
888
|
+
is precautionary rather than load-bearing. Do not describe it as preventing data loss; the API
|
|
889
|
+
does that itself. The Data Extension SCHEMA PUT is the opposite — there the merge is the only
|
|
890
|
+
thing preserving a merchant's fields.
|
|
891
|
+
|
|
892
|
+
**Never call the invoicing service.** Re-issuing a historical tax document mints a second legal
|
|
893
|
+
document under a different number, and whether publishing one emails the customer is undocumented
|
|
894
|
+
in either direction. The contract is non-use, and it is provable:
|
|
895
|
+
`tests/target-wix/no-invoices-api-contract-test.js` scans the published tree.
|
|
896
|
+
|
|
897
|
+
Extended fields must be provisioned and verified before any value is written — see
|
|
898
|
+
`lib/data-extension-schema.js` (orders, products, Contacts V5), `lib/contact-extended-fields.js`
|
|
899
|
+
(legacy Contacts V4, explicit opt-in only) and the provisioning section in `rp-execute-setup`. A
|
|
900
|
+
value write is blocked until setup verified that exact field. Contact values go under
|
|
901
|
+
`extendedFields.namespaces._user_fields` with V5 writers, or `info.extendedFields.<verifiedKey>`
|
|
902
|
+
with V4 writers — never both.
|
|
903
|
+
|
|
904
|
+
## Coupons, coupon usage and plan definitions
|
|
905
|
+
|
|
906
|
+
Four small target-side pieces, all pure except the writers named in the table above:
|
|
907
|
+
|
|
908
|
+
- `lib/coupon-redemption-drift.js` — **a bearer voucher is money, and its redeemability must be
|
|
909
|
+
decided at write time, not from the discovery snapshot.** `isBearerVoucher(coupon)` narrows to
|
|
910
|
+
the money-instrument shape (a fixed amount, no scope, no minimum, `usage_limit: 1`);
|
|
911
|
+
`classifySnapshot({ capturedAt, now, maxAgeMs })` refuses an undated or stale snapshot;
|
|
912
|
+
`classifyPreWriteDrift` refuses to write a voucher spent since capture (`coupons-spent-after-capture`)
|
|
913
|
+
and refuses to write one it cannot decide; `classifyPostImportDrift` + `buildVoucherDriftPlan`
|
|
914
|
+
produce the cutover remedy plan, with face value and affected orders per code;
|
|
915
|
+
`verifyRemedyApplied` insists on a post-settle read-back.
|
|
916
|
+
**One measured fact drives all of it.** Update Coupon WRITES when the specification carries
|
|
917
|
+
ONLY the changed fields plus a field mask — so a spent voucher is deactivated in place, keeping
|
|
918
|
+
its id, code, dates and amount. Send the FULL specification alongside a narrow mask and it
|
|
919
|
+
returns **200 with an empty body and writes nothing**: the shape everyone reaches for first, and
|
|
920
|
+
a pass that counts 2xx responses reports a false pass on money. `buildRemedyRequest` can only
|
|
921
|
+
emit the minimal form; `verifyRemedyApplied` refuses to call any 2xx applied without a
|
|
922
|
+
post-settle read-back. `specification.tags` is the one usable marker field (every alternative is
|
|
923
|
+
silently dropped) and the vocabulary is frozen: `Imported` on everything a migration
|
|
924
|
+
writes, plus `Already_Used` or `Disabled_At_Source` on a disabled one. All recorded as pitfalls
|
|
925
|
+
on `domains/stores/entities/coupon.json`.
|
|
926
|
+
- `lib/order-applied-discount-build.js` — `buildCouponAppliedDiscounts({ couponLines,
|
|
927
|
+
resolveCoupon })` turns a source order's coupon lines into `appliedDiscounts[]` entries of the
|
|
928
|
+
`coupon` variant (`{ id, code, name, amount: { amount } }`, `discountType: GLOBAL`) for the
|
|
929
|
+
Import Order body. There is no standalone write: the entity `ecom/order-applied-discount` is
|
|
930
|
+
written through `importOrder`. A code the coupon crosswalk cannot resolve produces NO entry and
|
|
931
|
+
an unresolved line — never a dangling coupon id. Import Order stores money as-is, so
|
|
932
|
+
`priceSummary.discount` must already agree with the entries.
|
|
933
|
+
- `lib/pricing-plan-definition.js` — `evaluatePlanSources({ B1, B2, B3 })` (the row-count gate
|
|
934
|
+
and the "none found" wording), `buildPlanDefinition(offer)` (PRIVATE, unbuyable, ACTIVE; name
|
|
935
|
+
and description truncated WITH a finding; 7-day minimum cycle and 10-year maximum), and
|
|
936
|
+
`assertInertPlan`, which the request builder and writer both call.
|
|
937
|
+
- Live: `tests/target-wix/coupon-plan-live-sentinel.js` (credential-gated, cleans up) — one coupon
|
|
938
|
+
of each mapped type including an expired and an exhausted one, one inert plan, one imported
|
|
939
|
+
order carrying a coupon usage. Its verdicts are recorded as pitfalls on the entity files.
|
|
562
940
|
|
|
563
941
|
## What stays in codegen (not here)
|
|
564
942
|
|
|
@@ -630,3 +1008,39 @@ Examples:
|
|
|
630
1008
|
- compact reports preserve stable top-level fields
|
|
631
1009
|
- completion reports preserve stable top-level fields
|
|
632
1010
|
- audit events preserve the agreed machine-readable shape
|
|
1011
|
+
|
|
1012
|
+
Default-location `reconcileInventory` outcomes include `catalogVerification`: exact Catalog variant availability must agree even when no stock write is needed. Catalog reads are grouped per product with at most four concurrent reads and bounded retries. Non-default locations mark this check `not-applicable`; Inventory-only success is not a default-location Catalog completion verdict.
|
|
1013
|
+
|
|
1014
|
+
|
|
1015
|
+
## Verified contact and product import callers
|
|
1016
|
+
|
|
1017
|
+
Use `lib/contact-import.js` `importContacts` and `lib/product-import.js` `importProducts`
|
|
1018
|
+
for standard imports. They reconcile source identities before writes, persist candidate
|
|
1019
|
+
IDs in project-local state, and publish crosswalks only after identity/value read-back.
|
|
1020
|
+
The request primitives do not themselves certify a mapping. `lib/bulk-results.js` selects
|
|
1021
|
+
rules through explicit Contacts V5 / products-with-inventory / Inventory adapters; missing
|
|
1022
|
+
indexes are unresolved, never positional fallbacks. Blog bulk remains outside those adapters.
|
|
1023
|
+
|
|
1024
|
+
Product SEO runs inside `importProducts` for rows carrying `seo` (a
|
|
1025
|
+
`lib/product-seo.js` `planProductSeo` plan). It writes only proven or owner-materialized
|
|
1026
|
+
title/description tags through `product.seoData`, verifies each field on the product and in
|
|
1027
|
+
Item SEO `resolvedTags`, and reports `report.seo.stageResiduals`. Item SEO bulk set is refused
|
|
1028
|
+
for `STORES_PRODUCT`. Verification is bounded: at most 3 products in flight, every read through
|
|
1029
|
+
the shared `sharedTargetReadPacer()` (start slots reserved atomically and re-checked after a late timer wake, so actual starts
|
|
1030
|
+
stay >=60 ms apart), an
|
|
1031
|
+
immediate first `resolvedTags` read, and batch retry rounds whose settle wait stays within
|
|
1032
|
+
31 s per stage. `report.seo.timing` reports `settleWaitMs`, `pacingWaitMs` and `backoffWaitMs`
|
|
1033
|
+
separately; the last two are summed per-call waits, never added to wall-clock.
|
|
1034
|
+
|
|
1035
|
+
`lib/write-verification.js` forwards to the shared runtime comparators in
|
|
1036
|
+
`skills/wix-replatform/lib/write-verification.js`. Contacts normalize only the
|
|
1037
|
+
main email (trim/lowercase) and compare other mapped values exactly after the existing
|
|
1038
|
+
per-source sanitizer. Phone-only identity and distinct source keys sharing a target block
|
|
1039
|
+
and report. Product variant matching uses source-fixed projections and exact target IDs;
|
|
1040
|
+
stock and default-location Catalog verification remain in `reconcileInventory`.
|
|
1041
|
+
|
|
1042
|
+
The existing subscription probe now records `valueEvidence`. Contract-ledger proposal
|
|
1043
|
+
creation and promotion recheck those inputs; toggling `status` or supplying only present
|
|
1044
|
+
paths cannot establish verified values. Existing published contracts remain in place.
|
|
1045
|
+
These changes add no automatic probe or global canary gate. Schema fingerprints retained
|
|
1046
|
+
as development evidence must be computed from saved docs-tool output, not authored claims.
|