@wix/agent-skills 1.33.1 → 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 +2 -0
- package/package.json +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 +13 -3
- 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/events-dashboard-navigation.md +81 -0
- 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-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-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
|
@@ -34,7 +34,9 @@ Do not proceed until:
|
|
|
34
34
|
- when `SAFE_MODE=true` or `DRY_RUN=true`, the post-codegen code-safety review exists and
|
|
35
35
|
has been accepted before execution approval is sought
|
|
36
36
|
- the **execution plan report has been presented and the user has accepted it** (see
|
|
37
|
-
below)
|
|
37
|
+
below). In explicit user-requested `1-click mode` (`automationMode=one_click`,
|
|
38
|
+
`source=user`), the same report is still required, but it is recorded as accepted by the
|
|
39
|
+
agent once all blockers/gaps are surfaced and no unresolved hard stop remains.
|
|
38
40
|
|
|
39
41
|
Prefer the machine-readable execution artifacts above. `execution/review/import-plan.md`
|
|
40
42
|
is a human-facing review artifact, not the primary execution contract.
|
|
@@ -43,8 +45,8 @@ Before live import and again before final reporting, validate
|
|
|
43
45
|
`execution/review/import-plan.freshness.json` with the deterministic freshness helper:
|
|
44
46
|
|
|
45
47
|
```bash
|
|
46
|
-
node skills/replatform/scripts/artifact-freshness.js check migrations/<project> \
|
|
47
|
-
--domains-dir skills/replatform/resources/rp-target-wix/domains \
|
|
48
|
+
node skills/wix-replatform/scripts/artifact-freshness.js check migrations/<project> \
|
|
49
|
+
--domains-dir skills/wix-replatform/resources/rp-target-wix/domains \
|
|
48
50
|
--delta execution/review/import-plan-delta.md
|
|
49
51
|
```
|
|
50
52
|
|
|
@@ -87,15 +89,64 @@ the user accepts. The report must show:
|
|
|
87
89
|
source IDs are the stable migration key, while many native Wix target IDs are
|
|
88
90
|
server-assigned. The plan must state whether each entity re-run resolves via a
|
|
89
91
|
client-controlled source-id field on the target or via the durable local
|
|
90
|
-
`sourceId -> targetId` crosswalk.
|
|
91
|
-
|
|
92
|
+
`sourceId -> targetId` crosswalk. Local `state/crosswalk/crosswalk.ndjson` is the sole
|
|
93
|
+
runtime authority for resume/idempotency — never CMS. The plan must state the crosswalk
|
|
94
|
+
authority (`local`) and the mapper-selected CMS mirror mode (`none`, `download`, `upload`,
|
|
95
|
+
or `download-and-upload`); CMS `ImportCrosswalk` is OPTIONAL by design, not a default,
|
|
96
|
+
because Wix CMS quotas are plan-based and shared across every custom collection on the
|
|
97
|
+
site — a large migration's full crosswalk can be many times a lower-tier plan's total item
|
|
98
|
+
quota, so treating the mirror as mandatory risks spending site data capacity the migration
|
|
99
|
+
has no business claiming by default. Only enable a mirror mode when the user opted into
|
|
100
|
+
site-local reference data (see `rp-execute-setup` → "Import crosswalk CMS mirror").
|
|
101
|
+
When a mirror mode other than `none` IS selected: provisioning the collection is not the
|
|
102
|
+
same thing as keeping it in sync — a run can provision the
|
|
103
|
+
collection at setup time and then never write to it again during import, leaving every
|
|
104
|
+
entity's crosswalk invisible on the site itself until a one-time backfill catches it up.
|
|
105
|
+
`rp-target-wix/lib/wix-writers.js`'s `syncImportCrosswalk` (batches of up to 1000 through
|
|
106
|
+
`bulkSaveDataItems`, item id the row's own `sourceStableKey`, matching the approved
|
|
107
|
+
download-side dedupe contract exactly — see the KNOWN, UNRESOLVED LIMITATION comment on
|
|
108
|
+
`buildImportCrosswalkItem`: sourceStableKey is only unique within one migration, so two different projects against the same source system that happen to import the
|
|
109
|
+
same entityType+sourceId still collide, and closing that gap needs its own approved
|
|
110
|
+
identity/schema decision, not an ad hoc id prefix) is the primitive that keeps it current, and
|
|
111
|
+
`rp-import-codegen` wires it in: a generated run with a mirror mode of `upload` or
|
|
112
|
+
`download-and-upload` performs **exactly one snapshot pass, after the last entity write**,
|
|
113
|
+
projecting the finished local crosswalk through `local-state.js`'s
|
|
114
|
+
`crosswalkRowsToMirrorItemInputs` and uploading it with `syncImportCrosswalk`. The pass is
|
|
115
|
+
never inline per entity and never a per-batch checkpoint: a mirror write riding alongside
|
|
116
|
+
each record multiplies the calls the site absorbs during the run and makes a slow collection
|
|
117
|
+
a drag on the import it only describes. With `none` or `download` the generated run touches
|
|
118
|
+
the collection zero times — no reads, no writes, no empty pass reported as success — because
|
|
119
|
+
site storage is a shared plan-based allowance and a large ledger can be a meaningful
|
|
120
|
+
fraction of a smaller plan's whole quota.
|
|
121
|
+
Never make native-entity import correctness
|
|
122
|
+
depend on the mirror succeeding: a non-zero `totalFailures`, or a thrown transport error,
|
|
123
|
+
marks the mirror step failed and is reported as a shortfall in the execution artifacts, while
|
|
124
|
+
every imported record stays imported and the run itself is not failed.
|
|
125
|
+
- **Destination and collisions — required whenever `WIX_SITE_STRATEGY=existing`.** Name
|
|
126
|
+
the destination site, and say plainly that it is a site the user already owns and that
|
|
127
|
+
this import will change it. Then quantify the overlap: for each entity type, how many
|
|
128
|
+
source records match something already on the site (by crosswalk, then by the mapping's
|
|
129
|
+
natural key), and what will happen to each — **skipped** or **augmented**, never replaced
|
|
130
|
+
and never deleted. A user accepting "Migrate" on their live store is accepting these
|
|
131
|
+
specific writes; a plan that reports only "120 products" is asking them to consent to
|
|
132
|
+
something they cannot see. If the overlap cannot be computed before writing, say that
|
|
133
|
+
too, and say what the import will do when it meets one.
|
|
92
134
|
- **URL preservation:** for public routed entities, state that source URL artifacts will
|
|
93
135
|
be captured locally under `state/url-preservation/`. List the public entity types whose
|
|
94
136
|
base paths and slugs will be tracked, any entity whose target route is deferred to the
|
|
95
137
|
website-builder phase, and whether redirects will be recorded as plans. The current
|
|
96
138
|
import phase must say that redirects and site routing are **not applied**.
|
|
97
|
-
|
|
98
|
-
|
|
139
|
+
Backend import stays plan-only: it records source URLs and source-authored redirect
|
|
140
|
+
definitions (`node skills/wix-replatform/scripts/url-redirects.js sources`), then runs the
|
|
141
|
+
offline `url-redirects.js report` and passes its projection
|
|
142
|
+
(`execution/url-preservation-report.json`, status `pending_website_build` until final routes
|
|
143
|
+
exist) as `completion-report.json.urlPreservation`. It never runs `apply` or `verify`, never
|
|
144
|
+
probes the public website and never changes DNS; those are post-build helper operations the
|
|
145
|
+
cutover step schedules.
|
|
146
|
+
- **Notification mute.** State that site notifications will be muted before
|
|
147
|
+
import when required by the resolved site strategy/config, and how the owner can later
|
|
148
|
+
ask for an unmute. State that site notifications will be muted before migration writes
|
|
149
|
+
begin when mute is in effect. For a **new site** this is a one-line
|
|
99
150
|
factual disclosure (the mute is unconditional). For an **existing site that opted in**
|
|
100
151
|
(`WIX_MUTE_NOTIFICATIONS=on`) the disclosure is **mandatory and prominent** and must
|
|
101
152
|
state all three points:
|
|
@@ -109,6 +160,11 @@ the user accepts. The report must show:
|
|
|
109
160
|
rejects the mute line, revert to the existing-site default (`off`) and regenerate the
|
|
110
161
|
affected artifacts before seeking acceptance again.
|
|
111
162
|
|
|
163
|
+
In explicit user-requested `1-click mode`, do not skip this report. Generate it, make sure it
|
|
164
|
+
reflects the real setup changes / data writes / blockers, record it as accepted by the agent,
|
|
165
|
+
and continue without waiting for a human response. A missing mode or a non-user-authored
|
|
166
|
+
`one_click` value must follow the normal user-approval path.
|
|
167
|
+
|
|
112
168
|
Persist this in `execution/review/import-plan.md` (or a sibling report). This is the defined approval
|
|
113
169
|
checkpoint: the job pauses, surfaces the plan to the user, and resumes **only** on
|
|
114
170
|
accept. Nothing is written before acceptance.
|
|
@@ -189,7 +245,8 @@ contain required values:
|
|
|
189
245
|
- `SAFE_MODE_PHONE_NUMBER` when `SAFE_MODE` is enabled
|
|
190
246
|
- `migrations/<project>/config/source.<platform>.env`
|
|
191
247
|
- platform-specific source values, for example WordPress:
|
|
192
|
-
`WP_BASE_URL
|
|
248
|
+
`WP_BASE_URL`; `WP_USERNAME` and `WP_APPLICATION_PASSWORD` for authenticated REST
|
|
249
|
+
reads; and `WMH2_MIGRATION_KEY` when the generated bridge reader selected signed auth
|
|
193
250
|
|
|
194
251
|
The generated script should load these files and then allow process env to override them.
|
|
195
252
|
`WIX_SITE_STRATEGY` is always required. `WIX_SITE_ID` is required before execution writes
|
|
@@ -203,9 +260,9 @@ the generated runtime supports that same key. If the generated import path needs
|
|
|
203
260
|
different Wix credential, name that key explicitly in the generated artifacts.
|
|
204
261
|
|
|
205
262
|
If execution is blocked because a RePlatform `new site` + `headless` target was never
|
|
206
|
-
created, route back to
|
|
207
|
-
|
|
208
|
-
|
|
263
|
+
created, route back to `resources/rp-destination/`, which scaffolds via
|
|
264
|
+
`npm create @wix/new@latest headless`. The account-level Projects API is deprecated for
|
|
265
|
+
this workflow (it produced non-headless sites).
|
|
209
266
|
|
|
210
267
|
When the accepted next run is dry-run, missing or blank `WIX_AUTH_TOKEN` and
|
|
211
268
|
`WIX_SITE_ID` are not blockers unless a local artifact requires the site ID as a stable
|
|
@@ -239,10 +296,12 @@ CLI account should create the site and mint this token.
|
|
|
239
296
|
1. Resolve the active project.
|
|
240
297
|
2. Review the machine execution artifacts and generated code; present the execution plan
|
|
241
298
|
report and obtain acceptance (see above) before any write.
|
|
242
|
-
2b.
|
|
299
|
+
2b. **Precondition, not a step you can skip by not reading this line.** The import path checks
|
|
300
|
+
that execution state was prepared and refuses to write without it. Prepare deterministic
|
|
301
|
+
local execution state before any setup/import write:
|
|
243
302
|
|
|
244
303
|
```bash
|
|
245
|
-
node skills/replatform/scripts/execution-state-prepare.js migrations/<project>
|
|
304
|
+
node skills/wix-replatform/scripts/execution-state-prepare.js migrations/<project>
|
|
246
305
|
```
|
|
247
306
|
|
|
248
307
|
This validates `execution/execution-manifest.json`, initializes or validates
|
|
@@ -250,6 +309,47 @@ CLI account should create the site and mint this token.
|
|
|
250
309
|
`state/attempts/write-attempts.ndjson`, initializes `state/url-preservation/`
|
|
251
310
|
artifacts when URL preservation is enabled, and blocks CMS mirror download flows unless
|
|
252
311
|
local state is absent and explicit CMS mirror rows have been provided to seed it.
|
|
312
|
+
2d. Verify the generated import entrypoints satisfy the entry contract, before any entity
|
|
313
|
+
write:
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
node skills/wix-replatform/scripts/import-contract-verify.js migrations/<project>
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
For a filtered run, pass its identical selection after `--` (for example
|
|
320
|
+
`-- --entity <entity> --failed-only`). For selected bridge-backed entities/dependants,
|
|
321
|
+
the verifier first checks actual generated wiring and helper versions against the
|
|
322
|
+
committed emitter, before running any generated entrypoint. An unrelated native-only
|
|
323
|
+
selection does not check another plugin's artifact readiness. Source preparation/full
|
|
324
|
+
manifests are checked by the shared runtime at selected dispatch; missing preparation
|
|
325
|
+
holds only affected scopes with existing Import Operator tasks. Follow
|
|
326
|
+
`rp-source-wordpress/PLUGIN-READ-PLANS.md`; do not bypass those wrappers.
|
|
327
|
+
|
|
328
|
+
This then spawns each generated import entrypoint with `--describe`, parses the single JSON
|
|
329
|
+
object it prints, and checks it against the generated-importer contract. It writes no state
|
|
330
|
+
and touches no target. A non-zero exit **aborts the import** and routes back to codegen —
|
|
331
|
+
no degraded mode, no skip flag — naming every missing selection mode and every misplaced
|
|
332
|
+
ledger path at once.
|
|
333
|
+
|
|
334
|
+
The selective modes (`--entity`, `--source-type`, `--missing-only`, `--failed-only`,
|
|
335
|
+
`--deferred-only`, `--unresolved-only`) are a **requirement on the generated importer**, not
|
|
336
|
+
an operator option: an importer that cannot offer targeted recovery is one whose only
|
|
337
|
+
recovery is an unfiltered full re-pass, which is how a journal ends up with several rows per
|
|
338
|
+
record. The importer also checks itself, as the first statement of its `main()`; this step
|
|
339
|
+
is what catches an importer that never emitted that check at all.
|
|
340
|
+
|
|
341
|
+
2c. Resolve every request under `state/blocked-data-requests/` with the shared
|
|
342
|
+
`lib/blocked-data-requests.js` helper before normal extraction. Reuse a current immutable
|
|
343
|
+
snapshot within `fulfillment.freshnessWindowHours` without probing the source. After the
|
|
344
|
+
window, attempt exactly one refresh: write the next version on success; on failure keep the
|
|
345
|
+
prior snapshot and mark it `stale: true`. With no snapshot, `csv-upload` checks and parses
|
|
346
|
+
`expectedInputPath`, while `bridge-plugin` probes the live `/wp-json` namespace list and then
|
|
347
|
+
calls `extractionRoute`; never check a local path for a bridge request. Reconciled data is
|
|
348
|
+
merged into that capability's extraction input. Present-but-invalid or partial data is
|
|
349
|
+
discarded and marked `invalid`; missing data uses the target entity's existing default.
|
|
350
|
+
Never create `declined` unless a human explicitly declined during an interactive review.
|
|
351
|
+
Stamp every write attempt using real blocked data with the snapshot version, extraction
|
|
352
|
+
timestamp, and checksum it actually consumed.
|
|
253
353
|
3. Run a safe validation path first when possible, such as dry-run, sample batch, or read-only validation.
|
|
254
354
|
For dry-run, invoke the same generated setup/import entrypoints with `DRY_RUN=true` or
|
|
255
355
|
`--dry-run`. Do not use an agent/MCP hand-built substitute. The shared Wix runtime must
|
|
@@ -270,15 +370,38 @@ CLI account should create the site and mint this token.
|
|
|
270
370
|
that record to Wix.
|
|
271
371
|
If the run needs live Stores evidence during setup or recovery, use the shared
|
|
272
372
|
verification CLI and persist its JSON artifact:
|
|
273
|
-
`node skills/replatform/resources/rp-target-wix/scripts/verify-stores.js stores product-count --artifact migrations/<project>/execution/stores-product-count-verification.json`
|
|
373
|
+
`node skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js stores product-count --artifact migrations/<project>/execution/stores-product-count-verification.json`
|
|
274
374
|
or `stores product-by-source-marker --marker-path <path> --marker-value <value>`.
|
|
275
375
|
Do not write migration-local verification snippets for Stores product counts,
|
|
276
376
|
source-marker lookups, subscription probes, or probe cleanup.
|
|
277
|
-
3b. **Clear the default demo catalog first
|
|
278
|
-
`wix-headless`'s seed) ships ~12 placeholder
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
377
|
+
3b. **Clear the default demo catalog first — only when all three conditions hold.** A
|
|
378
|
+
freshly provisioned Wix Stores catalog (and `wix-headless`'s seed) ships ~12 placeholder
|
|
379
|
+
demo products + demo categories. Wiping them before importing is correct ONLY on a site
|
|
380
|
+
you created on this turn from a live source — never as a general cleanup step. All three
|
|
381
|
+
must hold; check them before deleting anything:
|
|
382
|
+
|
|
383
|
+
1. `WIX_SITE_STRATEGY=new`, **and**
|
|
384
|
+
2. the source is a **live site**, not supplied files (`sourceMode=files_only`), **and**
|
|
385
|
+
3. **you created the destination site on this turn.**
|
|
386
|
+
|
|
387
|
+
Each one guards against a different way of destroying data that is not template seed:
|
|
388
|
+
|
|
389
|
+
- **Existing site ⇒ never.** The catalog belongs to the owner; a bulk delete here is
|
|
390
|
+
data loss this pipeline cannot undo.
|
|
391
|
+
- **File-provided run ⇒ never, whatever the strategy.** File drops are recurring by
|
|
392
|
+
design — they can accumulate onto one site over multiple runs, so wiping on drop 2..N
|
|
393
|
+
would delete what an earlier drop imported, and the wipe cannot tell template seed
|
|
394
|
+
from migrated data.
|
|
395
|
+
- **A later turn ⇒ never.** This is the condition most likely to be missed: on turn two
|
|
396
|
+
of a new-site run, `WIX_SITE_STRATEGY` still reads `new` and the source is still a
|
|
397
|
+
live site, so only "did I create the destination on this turn" separates clearing the
|
|
398
|
+
template's placeholders from deleting the previous turn's import.
|
|
399
|
+
|
|
400
|
+
When in doubt, skip it — leaving a few template products behind is a cosmetic defect the
|
|
401
|
+
owner can fix later; deleting their catalog is not recoverable. When all three hold,
|
|
402
|
+
delete the default demo products and categories (keep the system `All Products`
|
|
403
|
+
category) so the final store holds only the migrated data — otherwise a clean
|
|
404
|
+
100-product import reads as 112. Applies in both delivery modes.
|
|
282
405
|
4. **Run source extraction first** using the generated extraction entrypoint (for example
|
|
283
406
|
`node src/extract/run-extract.js`). This step writes durable source files under the
|
|
284
407
|
project and must complete before the write phase unless the extraction artifacts are
|
|
@@ -302,20 +425,291 @@ CLI account should create the site and mint this token.
|
|
|
302
425
|
If the execution manifest enables CMS mirror download, fetch CMS rows before this step
|
|
303
426
|
and pass them to the deterministic state-preparation layer; the generated import may use
|
|
304
427
|
only local crosswalk state after preparation succeeds.
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
428
|
+
5b. **App routes and internal links.** After relevant apps are
|
|
429
|
+
installed, inspect/configure only the schema-backed per-family routes supported by
|
|
430
|
+
`rp-target-wix` capability knowledge; store saved-state read-back under
|
|
431
|
+
`state/url-preservation/app-page-routes.json`. After backend import, run the generated
|
|
432
|
+
`internal-link-audit.js plan` input over the complete captured inventory. It performs
|
|
433
|
+
local counting with no destination request or model call and writes
|
|
434
|
+
`state/url-preservation/link-audit.json`. A backend-only run leaves destinations pending
|
|
435
|
+
and unresolved occurrences without invented paths. Do not call the post-frontend
|
|
436
|
+
`verify` entrypoint until the frontend exists. That step first makes at most 20 read-only
|
|
437
|
+
calibration checks inside a two-minute sub-cap, records the estimate against the
|
|
438
|
+
approved 30-minute live-work and 100,000 exception-review-token ceilings, then checks
|
|
439
|
+
samples and destinations and invokes only compatible non-blog writers. Unknown or
|
|
440
|
+
incompatible writer ownership blocks affected writes before mutation, while disjoint
|
|
441
|
+
safe fields may proceed. Blog-post link writes remain pending until a dedicated writer
|
|
442
|
+
can consume verified destinations through its checkpointed post-frontend lifecycle.
|
|
443
|
+
Supply planned destination content revisions with containing record identities. The
|
|
444
|
+
shared verifier applies structured patches once per logical record and field through
|
|
445
|
+
its durable write journal; adapter callbacks supply revisioned read/write and rendered
|
|
446
|
+
checks, not direct per-link repair. A budget hold survives re-planning and resumes only
|
|
447
|
+
after the plan records the owner's decision reference and approved ceilings.
|
|
448
|
+
Refresh the audit, completion report and website handoff after the post-frontend step
|
|
449
|
+
and after affected source catch-up. Keep incomplete writer integration and unverified
|
|
450
|
+
link coverage pending in those artifacts.
|
|
451
|
+
6. Use `lib/dependency-readiness.js` immediately before each dependent batch, including
|
|
452
|
+
selective recovery. The generated importer binds its task, evaluates current readiness,
|
|
453
|
+
and calls `gateBatch`; only its `send` payloads may reach a task-capability Wix client,
|
|
454
|
+
carrying `sourceStableKey` and the current `readinessGrant`. A task-level unknown or
|
|
455
|
+
unapproved exclusion stops before its first batch. A permitted partial per-record
|
|
456
|
+
dependency defers only records whose required references are unresolved. Setup is
|
|
457
|
+
all-or-nothing: every bound step must pass on the current destination before any
|
|
458
|
+
setup-derived reference can resolve. An empty dependency passes only with a current
|
|
459
|
+
complete zero-row extract and full task-pass evidence. Never infer readiness from task
|
|
460
|
+
order, a success count, a crosswalk row alone, dry-run state, or prose best-effort consent.
|
|
461
|
+
Capture compact reports, audit-log references, errors, retries, skipped records, and
|
|
462
|
+
checkpoint information from the shared runtime outputs.
|
|
310
463
|
Safe-mode outputs must be summarized by counts and paths only: include skipped
|
|
311
464
|
safe-mode blocked record counts, the project-relative
|
|
312
465
|
`state/safe-mode/blocked-records.ndjson` path when present, and the
|
|
313
466
|
`state/safe-mode/email-replacements.ndjson` row count/path when replacement rows were
|
|
314
467
|
written. Do not print original email addresses or phone numbers from the recovery
|
|
315
468
|
ledger.
|
|
469
|
+
6b. **Reconcile bearer-voucher drift against a fresh source read — required, before cutover.**
|
|
470
|
+
Run this after every write pass has finished and before anything declares the run
|
|
471
|
+
complete. It is required whenever the accepted scope included coupons **and** the source
|
|
472
|
+
carried at least one coupon with a usage limit. When neither holds, record
|
|
473
|
+
`voucherReconciliation: "not-applicable"` in the completion report and do nothing else — a
|
|
474
|
+
source with no usage-limited coupons still answers out loud, because silence and success look
|
|
475
|
+
identical in a report.
|
|
476
|
+
|
|
477
|
+
**Deadline: before cutover, while the source is still the system of record.** Two reasons,
|
|
478
|
+
and together they are why running it late is the same as never running it:
|
|
479
|
+
|
|
480
|
+
1. the step compares a **fresh read of the source** against the target, and once the source
|
|
481
|
+
stops being the system of record that fresh source read stops existing; and
|
|
482
|
+
2. the **target exposes no redemption count** for a coupon on any surface, so the question
|
|
483
|
+
cannot be answered from the target alone afterwards.
|
|
484
|
+
|
|
485
|
+
Miss the deadline and which codes were already spent becomes permanently unknowable, on an
|
|
486
|
+
instrument made of money.
|
|
487
|
+
|
|
488
|
+
**Use the shipped module, `rp-target-wix/lib/coupon-redemption-drift.js`.** A
|
|
489
|
+
migration-local reimplementation of the classification, the plan, the request builder or the
|
|
490
|
+
verification is forbidden: each one carries a trap that stays invisible until it costs money.
|
|
491
|
+
|
|
492
|
+
1. Re-read the source coupon rows **now** — never the discovery snapshot, which is precisely
|
|
493
|
+
what went stale — and read each imported coupon back from the target.
|
|
494
|
+
2. Per import receipt: `classifyPostImportDrift({ receipt, freshCoupon, targetCoupon })`. It
|
|
495
|
+
returns exactly five post-import outcomes: `voucher-drift-reconciled`,
|
|
496
|
+
`voucher-drift-remedy-pending`, `voucher-source-row-missing`, `voucher-target-row-missing`
|
|
497
|
+
and `voucher-target-state-unreadable`. An unsupported face-value precision is the boolean
|
|
498
|
+
`verdict.facePrecisionUnsupported` riding alongside whichever of those five applies —
|
|
499
|
+
wire on that flag; it is never `verdict.outcome`, so a branch for it in a
|
|
500
|
+
`switch (verdict.outcome)` is a branch nothing can ever reach.
|
|
501
|
+
3. `buildVoucherDriftPlan({ verdicts, ordersByCouponCode, currency })` turns the verdicts into
|
|
502
|
+
the owner-approval plan: `counts`, one `rows` entry per code carrying its face value, the
|
|
503
|
+
orders that reference it and the proposed remedy, and `liability` — the money still live.
|
|
504
|
+
The plan is `readOnly: true` and has no apply path, by construction. Run twice on the same
|
|
505
|
+
inputs it produces the same plan.
|
|
506
|
+
4. **The owner rules per code, including in one-click mode.** One-click is a promise about how
|
|
507
|
+
little the operator has to decide, never a licence to decide on the merchant's behalf about
|
|
508
|
+
their money: deactivating a code a customer legitimately holds destroys value too, and the
|
|
509
|
+
merchant might already have honoured a voucher off-system. Nothing in this step writes
|
|
510
|
+
without an explicit per-code decision.
|
|
511
|
+
5. Build an approved remedy **only** with `buildRemedyRequest({ couponId, remedy, setTags })`.
|
|
512
|
+
It emits the one request shape that actually writes — a specification carrying only the
|
|
513
|
+
changed fields plus the matching field mask. **Never build the body from the coupon you
|
|
514
|
+
just read:** the full specification alongside a narrow field mask is accepted with `200`,
|
|
515
|
+
an empty body, and no write at all. Record the response status; do not interpret it.
|
|
516
|
+
6. Wait a settle, read the coupon back, and let
|
|
517
|
+
`verifyRemedyApplied({ remedy, responseStatus, readBackAfterSettle, settleMs })` decide. A
|
|
518
|
+
2xx is not evidence. No read-back, a read-back that still shows the coupon live, and a
|
|
519
|
+
read-back with no readable `active` flag are each `remedy-unverified` — reported unknown,
|
|
520
|
+
never applied. For a deactivation, a coupon that does not read back at all is unknown too,
|
|
521
|
+
never success.
|
|
522
|
+
|
|
523
|
+
⚠️ **This is not the coupon pass and must not be folded into it.** The coupon pass writes
|
|
524
|
+
coupons; this step re-reads the source *afterwards*, which is the entire point. Run inside the
|
|
525
|
+
import, it returns the answer the import already had.
|
|
526
|
+
|
|
527
|
+
⚠️ **It is not the rerun pass either** (see "Rerunning an import for new and modified
|
|
528
|
+
records"). A rerun covers new and changed records; a voucher spent since the write is neither
|
|
529
|
+
— nothing the rerun compares changed. They are separate obligations at an agreed cutover.
|
|
530
|
+
|
|
531
|
+
⚠️ **Expect to run this step more than once.** It is idempotent and safe at the end of every
|
|
532
|
+
execution, but its deadline is cutover, so re-invoke it close to actual cutover. The
|
|
533
|
+
completion record from the **last invocation before cutover** is the authoritative answer; an
|
|
534
|
+
earlier `not-run` or `plan-pending-owner` is a warning that the obligation is still open, not
|
|
535
|
+
a verdict that it was skipped.
|
|
536
|
+
|
|
537
|
+
Record the result in `execution/completion-report.json` as `voucherReconciliation`, one of
|
|
538
|
+
`not-applicable | reconciled | plan-pending-owner | remedied | not-run` (see "Completion
|
|
539
|
+
report contract").
|
|
540
|
+
|
|
316
541
|
7. Save durable execution artifacts, including the authoritative completion artifact and
|
|
317
542
|
deterministic user-facing completion summary.
|
|
318
543
|
|
|
544
|
+
## Contacts/Members disposition (safe-mode vs. real, live at the destination)
|
|
545
|
+
|
|
546
|
+
LIVE-VERIFIED: when `SAFE_MODE=true` covers `crm/contact`, every created Contact carries a
|
|
547
|
+
mock `replatform+contact_<id>@wix.com` email (see `mockEmailForEntity` in
|
|
548
|
+
`rp-target-wix/lib/wix-writers.js`). What that means for login identity depends on whether
|
|
549
|
+
`members/member` is itself a generated import target for this run, per `rp-import-codegen`'s
|
|
550
|
+
member pass:
|
|
551
|
+
|
|
552
|
+
- **`members/member` NOT in the generated scope:** the contact-import pass alone builds no
|
|
553
|
+
Wix Members (`memberCrosswalk` is stubbed to always return `null` so order/blog author
|
|
554
|
+
resolution has something safe to call), so no customer gets a real, usable login identity
|
|
555
|
+
from this run at all — safe-mode or not. Promoting a contact to real-email-plus-Member is
|
|
556
|
+
then a distinct, separate, later write (see `rp-target-wix/lib/wix-writers.js`'s
|
|
557
|
+
`ensureMember` composite: read the contact's current revision, update its email/phone from
|
|
558
|
+
the real source values only when the current email still matches the safe-mode mock
|
|
559
|
+
pattern, then call `ensureMember` with the same real loginEmail so the created Member lands
|
|
560
|
+
on that same contact rather than a duplicate).
|
|
561
|
+
- **`members/member` IS in the generated scope:** the generated member pass runs `ensureMember`
|
|
562
|
+
directly against each registered customer's REAL email in its own loop before order history,
|
|
563
|
+
regardless of the `crm/contact` SAFE_MODE setting — that pass does not read or wait on the
|
|
564
|
+
safe-mode mock email at all, it goes straight to `ensureMember({loginEmail: customer.email, ...})`.
|
|
565
|
+
In this case customers DO get a real Member from the entity-import pass itself; a contact
|
|
566
|
+
left on a safe-mode mock email from a separate `crm/contact` pass is not the same customer
|
|
567
|
+
state as "no Member exists" and must not be reported as if it were.
|
|
568
|
+
|
|
569
|
+
Do not state either version as the migration's blanket behavior without checking which one
|
|
570
|
+
this run's actual generated scope produces.
|
|
571
|
+
|
|
572
|
+
Two requirements follow, both non-negotiable when `crm/contact` is in scope:
|
|
573
|
+
|
|
574
|
+
1. **Ask before the contact import runs, in plain language — but only offer a choice the
|
|
575
|
+
generated scope can actually honor, not by assuming a SAFE_MODE default:**
|
|
576
|
+
- If `members/member` is NOT a generated target for this run: this pass never creates a
|
|
577
|
+
Member either way (see above), so do not offer "create a Wix Member directly" as an
|
|
578
|
+
option — that path does not exist without a member pass. Ask instead: "Import contacts
|
|
579
|
+
with their real email now, or with temporary safe-mode emails for review first? Either
|
|
580
|
+
way, no customer gets a Member or a login identity from this run alone — that is always
|
|
581
|
+
a distinct, later step (add `members/member` to the scope, or run the separate
|
|
582
|
+
promotion write afterward)." Record the answer in the execution plan/consent artifact
|
|
583
|
+
next to the SAFE_MODE decision; do not let an unset `SAFE_MODE` env var (which defaults
|
|
584
|
+
to `true`) decide this silently.
|
|
585
|
+
- If `members/member` IS a generated target: do **not** offer the safe-mode-contacts
|
|
586
|
+
choice at all. The member pass creates each registered customer's Member
|
|
587
|
+
directly against their REAL email regardless of `crm/contact`'s own SAFE_MODE setting,
|
|
588
|
+
and reconciles by that real loginEmail — a contact the SAFE_MODE pass created earlier
|
|
589
|
+
under the mock email will not match it, so the member pass creates a SECOND, separate
|
|
590
|
+
contact on the real email instead of landing on the existing one. This is a real
|
|
591
|
+
duplicate-contact gap, not a hypothetical: the ordering rule needed to prevent it (never
|
|
592
|
+
pre-create a safe-mode contact for someone who will become a member) is tracked as an
|
|
593
|
+
open, unresolved decision, not something already implemented. Until that ordering is
|
|
594
|
+
implemented, `crm/contact` must run in real-email mode whenever `members/member` is
|
|
595
|
+
also in scope, and the plan must say so plainly rather than presenting a safe-mode
|
|
596
|
+
choice it cannot deliver.
|
|
597
|
+
2. **Every completion/status summary that touches contacts must report the disposition
|
|
598
|
+
explicitly and by count**, whichever path was chosen: how many contacts still carry a
|
|
599
|
+
safe-mode temp email with no Member (and therefore need a follow-up promotion run before
|
|
600
|
+
they have a real email on file or can log in), vs. how many were promoted to a real email
|
|
601
|
+
+ Member. A status report that only says "N contacts imported" without this breakdown is
|
|
602
|
+
incomplete — the operator cannot tell from that alone whether any customer can currently be
|
|
603
|
+
reached or log in.
|
|
604
|
+
|
|
605
|
+
## Email marketing consent
|
|
606
|
+
|
|
607
|
+
When the source records a real per-record consent signal for marketing email (e.g. a
|
|
608
|
+
WooCommerce order's checkout consent-checkbox meta, not mere presence as a customer), do not
|
|
609
|
+
write it to Wix Email Subscriptions yet. `crm/email-subscription`'s `bulkUpsertEmailSubscriptions`
|
|
610
|
+
writer (`rp-target-wix/lib/wix-writers.js`) is mechanically live-verified — keyed by email
|
|
611
|
+
address, covers guest-checkout consent with no Contact behind it, sets a status only with no
|
|
612
|
+
confirmation/marketing email triggered — but the entity's `preferredWrite.importSafe` stays
|
|
613
|
+
`false` because two product decisions are still unresolved: how several orders for one email
|
|
614
|
+
fold to a single subscription state (`order-scoped-consent-has-no-decided-fold-rule`), and
|
|
615
|
+
whether Email Subscriptions or the separate Marketing Consent API is the authoritative write
|
|
616
|
+
target (`email-subscriptions-vs-marketing-consent-api-unresolved`). Surface the gap and these
|
|
617
|
+
two open questions to the user rather than deciding either one inside an import run; only
|
|
618
|
+
proceed once both are resolved and `importSafe` reflects that.
|
|
619
|
+
|
|
620
|
+
## Rerunning an import for new and modified records
|
|
621
|
+
|
|
622
|
+
The source keeps trading after an import finishes: newer records arrive, earlier
|
|
623
|
+
records change, earlier failures are still missing. A rerun reuses the same project,
|
|
624
|
+
destination, mapping, generated importer and crosswalk — it is not a fresh migration, and any
|
|
625
|
+
mapping or scope change goes back through the existing gates.
|
|
626
|
+
|
|
627
|
+
Catch-up may extend the end of the range to the new capture time. It does **not** pull older
|
|
628
|
+
history the accepted scope excluded, and it does **not** propagate deletions.
|
|
629
|
+
|
|
630
|
+
⚠️ A rerun does **not** cover bearer-voucher drift, and must never be reported as having done
|
|
631
|
+
so. A voucher spent at source since the import is neither a new record nor a changed one in
|
|
632
|
+
anything `selectRerunRecords` compares. That obligation is workflow step 6b, it is separate,
|
|
633
|
+
and it is deadlined at cutover.
|
|
634
|
+
|
|
635
|
+
**Selection.** Refresh the agreed scope and bucket it against the crosswalk with
|
|
636
|
+
`lib/import-recovery.js`'s `selectRerunRecords` — create missing, skip unchanged, update
|
|
637
|
+
changed, and report `unknown` where there is no usable comparison evidence. The pre-existing
|
|
638
|
+
`--missing-only` and `--failed-only` filters are **not** a delta between them: missing-only
|
|
639
|
+
excludes every crosswalk hit, so a changed record is never seen, and failed-only only revisits
|
|
640
|
+
what was already attempted. Read refreshed files covering the whole agreed scope; a
|
|
641
|
+
modified-since optimization is allowed only when it still includes boundary records, older
|
|
642
|
+
retries and unresolved decisions.
|
|
643
|
+
|
|
644
|
+
**The version pair.** Every confirmed write records the source's version (`sourceVersionField`
|
|
645
|
+
+ `sourceVersion`, or a declared `sourceHash` fallback) and the Wix `targetRevision` returned by
|
|
646
|
+
that write, via `nextCrosswalkBaseline`. A confirmed write that returns **no** revision does not
|
|
647
|
+
advance the pair at all — **including a first create**. Half a pair is not a baseline: a source
|
|
648
|
+
version saying "applied" with no revision leaves the next update with no concurrency guard, and
|
|
649
|
+
on a re-write it would pair a new source version with a pre-write revision and self-conflict.
|
|
650
|
+
Both reconcile instead. A linked record with no saved revision is likewise reported `unknown`
|
|
651
|
+
rather than updated, which also covers legacy rows written before the pair existed. Treat both as opaque; never increment a revision
|
|
652
|
+
locally. A failed, conflicted, dry-run or skipped write **must not** advance the pair — that is
|
|
653
|
+
what keeps the record eligible for recovery instead of recorded as applied. Missing metadata on
|
|
654
|
+
an old row is `unknown`, never "unchanged".
|
|
655
|
+
|
|
656
|
+
**Conflicts are a user decision, including in one-click mode.** When Wix rejects an update
|
|
657
|
+
because its revision moved, stop updating that record and show the user the error, the record,
|
|
658
|
+
and the source changes proposed for it — `lib/rerun-conflicts.js` builds that review and
|
|
659
|
+
classifies the error. Ask once per record, not per field. **Never silently fetch a newer
|
|
660
|
+
revision and retry**; there is deliberately no such helper. Unrelated records continue; work
|
|
661
|
+
depending on the unresolved update stays blocked.
|
|
662
|
+
|
|
663
|
+
⚠️ **The conflict-code list is incomplete by design.** Only `INVALID_REVISION` has been
|
|
664
|
+
observed live (on a delivery profile). Products v3 and Contacts v5 conflict codes
|
|
665
|
+
are **not** known, so they are absent rather than guessed. Two things keep that safe: the
|
|
666
|
+
accepted mapping can declare an entity's real codes (`entityConflictCodes`), and an
|
|
667
|
+
unrecognized 409 on a revision-carrying update classifies as `possible_revision_conflict` —
|
|
668
|
+
which goes to a human, never to an auto-retry and never silently into an ordinary failure. When
|
|
669
|
+
a real conflict code is observed, record it in the entity's declared codes and in
|
|
670
|
+
`OBSERVED_REVISION_CONFLICT_CODES` with its evidence.
|
|
671
|
+
|
|
672
|
+
On **override**, read the latest Wix record, show which values would be replaced, and write
|
|
673
|
+
against the revision the user actually reviewed. A further conflict is another decision. On
|
|
674
|
+
**keep**, leave Wix alone and record the choice against that exact source version and reviewed
|
|
675
|
+
revision in the recovery log — never as a crosswalk baseline, because the source version was
|
|
676
|
+
never applied — persist it through the recovery entry's `conflictDecisions[]` and read it back
|
|
677
|
+
with `latestConflictDecisionFor`, so a later rerun does not re-ask a question the user already
|
|
678
|
+
answered or silently overwrite what they chose to keep. `loadRecoveryLog` returns an **array**;
|
|
679
|
+
pass it straight in. Do not report a kept change as imported,
|
|
680
|
+
and do not retry it silently later.
|
|
681
|
+
|
|
682
|
+
**Dependencies and safety.** Resolve contacts, products and other dependencies before their
|
|
683
|
+
dependants. A record with an uncertain prior attempt (`deferred`, `needs_verification`,
|
|
684
|
+
`succeeded_unverified`, `started`) is reconciled before it is written — `selectRerunRecords`
|
|
685
|
+
routes it to `needsReconciliation` whether it is linked or not. Unlinked, an unconfirmed earlier
|
|
686
|
+
write may already exist and creating again would duplicate it. **Linked, the danger is subtler:**
|
|
687
|
+
if the previous write landed and the process died before saving its baseline, the saved revision
|
|
688
|
+
is already stale, so re-sending it makes the importer collide with its own write and report that
|
|
689
|
+
to the user as a merchant edit.
|
|
690
|
+
|
|
691
|
+
Updates touch only the fields the accepted mapping covers and preserve unrelated Wix values.
|
|
692
|
+
Each entity needs a verified update operation **and** conflict protection; without both,
|
|
693
|
+
`updateSupportFor` returns `report_for_review` and the record is reported rather than pushed
|
|
694
|
+
through a create/import operation. This is **enforced in code**, not only documented: the
|
|
695
|
+
accepted mapping declares `{ writerId, revisionParam }` per entity, and an entity missing
|
|
696
|
+
either is refused. It **fails closed** — a rerun that does not declare `targetEntityRef` at all
|
|
697
|
+
gets `report_for_review` for every changed record, because an absent declaration is not evidence
|
|
698
|
+
that an update is safe. The order family (`ecom/order` and its child entities) is denied outright
|
|
699
|
+
with `neverFallBackToCreate` — Update Order exposes a restricted field set and no general
|
|
700
|
+
revision parameter, and a same-id Import Order is an unguarded whole-body replacement that
|
|
701
|
+
clears omitted fields.
|
|
702
|
+
|
|
703
|
+
**Scope and deletions.** Pass the accepted scope as `inScope`; excluded records are reported
|
|
704
|
+
`outOfScope` and never actioned. Deletions need no rule beyond the refreshed set: a record
|
|
705
|
+
absent from the source is never iterated, so absence can never become a delete instruction.
|
|
706
|
+
|
|
707
|
+
**Reporting.** Before writes, show the selected scope with counts of new, changed, unchanged
|
|
708
|
+
and unresolved. Afterwards report created, updated, unchanged, kept-in-Wix-by-user-choice,
|
|
709
|
+
conflicted, failed, blocked and out-of-scope, with errors and affected records. Unknown counts
|
|
710
|
+
are not zero. Name the source capture time: a trading source may need another rerun or an
|
|
711
|
+
agreed cutover.
|
|
712
|
+
|
|
319
713
|
## Required final report contents
|
|
320
714
|
|
|
321
715
|
When execution finishes, the deterministic completion outputs must explicitly include:
|
|
@@ -335,12 +729,28 @@ When execution finishes, the deterministic completion outputs must explicitly in
|
|
|
335
729
|
would update, would delete, would require live lookup, and local validation failures.
|
|
336
730
|
Do not report dry-run rows as created, updated, imported, installed, published, or
|
|
337
731
|
verified in Wix.
|
|
732
|
+
- blocked-data request outcomes from `completion-report.json`, including every dependent
|
|
733
|
+
entity/field outcome, the worst-severity aggregate, whether a used snapshot is stale, and the
|
|
734
|
+
exact snapshot version/extraction timestamp/checksum. A 1-click `missing` request must say the
|
|
735
|
+
run did not pause to ask; an invalid input that fell back successfully is a warning, not a
|
|
736
|
+
write failure.
|
|
338
737
|
- an explicit statement that URL redirects/site routing were not applied in the current
|
|
339
|
-
import phase when `urlPreservation.applyRedirects` is `false
|
|
738
|
+
import phase when `urlPreservation.applyRedirects` is `false`, the old-link status from
|
|
739
|
+
`completion-report.json.urlPreservation`, and that old emails and bookmarks may fail until
|
|
740
|
+
redirects are applied and verified on the public domain
|
|
340
741
|
- a plain-language distinction between:
|
|
341
742
|
- **catalog/data imported successfully**
|
|
342
743
|
- **website/homepage built successfully**
|
|
343
|
-
- **
|
|
744
|
+
- **the voucher-reconciliation answer — in every terminal report of a run whose accepted
|
|
745
|
+
scope included coupons** (workflow step 6b). State in plain language which of
|
|
746
|
+
`not-applicable`, `reconciled`, `plan-pending-owner`, `remedied` or `not-run` the run
|
|
747
|
+
recorded, and say what it means: `plan-pending-owner` means money is still redeemable a
|
|
748
|
+
second time on the merchant's live store and the owner has decisions outstanding per code;
|
|
749
|
+
`not-run` means the step was due and did not happen, and that the answer expires at cutover
|
|
750
|
+
because the fresh source read stops existing and the target exposes no redemption count.
|
|
751
|
+
Never infer this from the coupon write counts — report the recorded field, and report a
|
|
752
|
+
missing field as `not-run`.
|
|
753
|
+
- **notification-mute state — in every terminal report** (completed, halted
|
|
344
754
|
to needs-user, or aborted; an aborted run is exactly the case where the owner is least
|
|
345
755
|
likely to remember the mute happened). Derive "was muted" **only from recorded state**
|
|
346
756
|
— the `mute-site-notifications` item in `setup/setup-verification.json` and the import
|
|
@@ -357,7 +767,7 @@ Do not report a successful catalog import as if it automatically means a finishe
|
|
|
357
767
|
website. If the homepage/root preview is still blank or no site shell has been built,
|
|
358
768
|
say that explicitly in the final report.
|
|
359
769
|
|
|
360
|
-
State the **delivery mode** explicitly (see `replatform` → "Delivery mode"):
|
|
770
|
+
State the **delivery mode** explicitly (see `wix-replatform` → "Delivery mode"):
|
|
361
771
|
|
|
362
772
|
- **`management` mode (default):** report that the deliverable is a **Wix-managed headless
|
|
363
773
|
backend** — data migrated and manageable from the dashboard, with **no customer-facing
|
|
@@ -367,6 +777,21 @@ State the **delivery mode** explicitly (see `replatform` → "Delivery mode"):
|
|
|
367
777
|
- **`website` mode:** report the **storefront URL** produced by `wix-headless` and confirm
|
|
368
778
|
the released site serves the migrated catalog (not demo data).
|
|
369
779
|
|
|
780
|
+
## Inventory completion and resume
|
|
781
|
+
|
|
782
|
+
Run the generated inventory reconciliation for new AND previously crosswalked products.
|
|
783
|
+
Require the current inventory setup/canary receipt before stock writes, retaining the run's
|
|
784
|
+
notification guard. After each batch persist stock outcomes separately from product success.
|
|
785
|
+
If stock failed, resume only stock using existing product/variant IDs; never recreate a
|
|
786
|
+
product or increment a quantity to recover it.
|
|
787
|
+
|
|
788
|
+
Include `state/inventory-report.json` in the completion inputs: intended variant denominator,
|
|
789
|
+
reconciled/created/updated, failed/unverified, and source decision-needed counts. Unknown stock
|
|
790
|
+
and missing variants remain visible. Any unresolved inventory makes catalog completion partial;
|
|
791
|
+
a product count or HTTP 200 cannot clear it. Compare source versus verified target availability
|
|
792
|
+
per variant and summarize out-of-stock counts. A source with available variants cannot pass
|
|
793
|
+
with an entirely unavailable target. Dry-run inventory outcomes are simulated, never live proof.
|
|
794
|
+
|
|
370
795
|
## Completion artifact authority
|
|
371
796
|
|
|
372
797
|
At the end of the run, artifact authority should be explicit:
|
|
@@ -379,6 +804,267 @@ At the end of the run, artifact authority should be explicit:
|
|
|
379
804
|
This skill should not treat `execution-log.md` as the canonical source for final
|
|
380
805
|
imported/skipped/failed counts when `completion-report.json` exists.
|
|
381
806
|
|
|
807
|
+
That ordering is unchanged. What changed is that all four artifacts now actually get written,
|
|
808
|
+
by shipped code, rather than being required by this document and produced by nothing:
|
|
809
|
+
|
|
810
|
+
- `execution-log.md` — `appendExecutionLog(projectDir, entry)` in `lib/execution-log.js`.
|
|
811
|
+
Append-only: a resumed or recovery pass adds entries and never truncates or regenerates the
|
|
812
|
+
file, and every entry carries its own `runId` so a later pass's entries are distinguishable
|
|
813
|
+
from the first pass's without reading timestamps. Append one entry per lifecycle event: each
|
|
814
|
+
import step started and finished, every batch flush, every recovery pass, the completion
|
|
815
|
+
write, and the handoff generation.
|
|
816
|
+
- `execution/completion-report.json` and `execution/review/completion-summary.md` —
|
|
817
|
+
`writeCompletionReport(projectDir, report)` in `lib/completion-report.js`. The summary is
|
|
818
|
+
**rendered from the report object**, never composed independently and never derived from
|
|
819
|
+
`execution-log.md`. The writer itself joins source coverage (below); pass it the report from
|
|
820
|
+
`createCompletionReport` unchanged and never add `sourceCoverage` yourself — it refuses that.
|
|
821
|
+
- `execution/live-import-summary.json` — `writeLiveImportSummary` in `lib/import-recovery.js`,
|
|
822
|
+
called after **every batch**, not once at the end. See "Per-batch accounting" below.
|
|
823
|
+
|
|
824
|
+
For order history, use the generated accounting block from `rp-import-codegen`: collect the
|
|
825
|
+
final per-order stage outcomes with `collectOrderStageResiduals` and pass its rows to
|
|
826
|
+
`createCompletionReport` before calling `writeCompletionReport`. Omitted stage accounting is
|
|
827
|
+
refused for order reports. Persist these compact outcomes with batch accounting and restore
|
|
828
|
+
them on resume; a retry is not a second imported order, and a recovered stage must replace
|
|
829
|
+
its earlier failure. Check the saved report and summary for both the incomplete status and
|
|
830
|
+
the affected source keys when any payment, refund, or invoice stage failed.
|
|
831
|
+
|
|
832
|
+
`appendExecutionLog` is not a heartbeat. Liveness and progress output for watching a running
|
|
833
|
+
script is `lib/progress-log.js`, writes to a caller-supplied path, and is a separate contract.
|
|
834
|
+
|
|
835
|
+
### Poll the health-check script, and redispatch on a stalled verdict
|
|
836
|
+
|
|
837
|
+
Do not drive a long-running generated `run-import.js`/`run-extract.js` by raw `tail -n 1`
|
|
838
|
+
alone once it has been launched. After dispatching the script, poll
|
|
839
|
+
`skills/wix-replatform/scripts/execution-health-check.js <projectDir> [--script <name>]
|
|
840
|
+
[--stale-after <duration>]` on an interval — default every 3 minutes; a shorter interval is
|
|
841
|
+
fine for a small run — instead of, or in addition to, the raw last-line tail. The
|
|
842
|
+
script reads `execution/progress.ndjson` and `execution/completion-report.json` and
|
|
843
|
+
answers exactly one question: `healthy`, `stalled`, or `complete`.
|
|
844
|
+
|
|
845
|
+
On a `stalled` verdict, treat it **exactly like a crashed process already found in
|
|
846
|
+
`execution/progress.ndjson`** — the same recovery as any other abnormal exit: redispatch a
|
|
847
|
+
fresh run from the last durable checkpoint. Never wait indefinitely on a subagent's own
|
|
848
|
+
promised resume ("it will pick back up on its own") once the health check reports
|
|
849
|
+
`stalled`; a subagent's own claim about its future behavior is not evidence, and what
|
|
850
|
+
this check exists to catch is a healthy run mistaken for one that would
|
|
851
|
+
never call back. A `healthy` verdict is not itself proof of eventual completion — keep
|
|
852
|
+
polling on the same interval until the verdict is `complete` or `stalled`.
|
|
853
|
+
|
|
854
|
+
Before redispatching on a `stalled` verdict, confirm the project's `run-import.js` (or
|
|
855
|
+
`run-extract.js`) was actually generated with the heartbeat wrapping — a project
|
|
856
|
+
codegen'd before this instruction existed may have entity-pass functions that never call
|
|
857
|
+
`withHeartbeat`/`startHeartbeat` at all, in which case `stalled` reflects an instrumentation
|
|
858
|
+
gap in that generated file, not the process. Grep the generated script for `withHeartbeat` /
|
|
859
|
+
`startHeartbeat`; if a write loop is missing it, retrofit that loop the same way
|
|
860
|
+
`rp-import-codegen/SKILL.md` describes for newly generated code before trusting the verdict
|
|
861
|
+
enough to kill and redispatch.
|
|
862
|
+
|
|
863
|
+
### Entity-by-entity QA is mandatory before treating an import phase as done
|
|
864
|
+
|
|
865
|
+
`wix-replatform`'s router requires a phase-level QA subagent at the end of the import phase
|
|
866
|
+
(its "Route before acting" step 5). For import, that review must be entity-by-entity against
|
|
867
|
+
the accepted mapping plan (`mapping/entity-decisions/*.json`), not a read of the top-level
|
|
868
|
+
`status` field in `execution/completion-report.json` or a paragraph of prose asserting the run
|
|
869
|
+
went well. A dedicated QA subagent — never the Developer subagent that produced the report,
|
|
870
|
+
and never the routing agent's own read of the summary — must, for every mapped entity/subtype:
|
|
871
|
+
|
|
872
|
+
- confirm its `completion-report.json` row reconciles (`imported + alreadyPresentByCrosswalk +
|
|
873
|
+
deferred + failed == inScope`) and is backed by real rows in `state/attempts/write-attempts.ndjson`
|
|
874
|
+
or `state/crosswalk/crosswalk.ndjson` — a bare counter with no corresponding ledger rows is a
|
|
875
|
+
swallowed error, not a clean pass;
|
|
876
|
+
- for any entity reported blocked, deferred, or skipped, independently re-verify the stated
|
|
877
|
+
reason is still true right now (spot-check the live source data or the live destination API,
|
|
878
|
+
not the report's own prose) — a blocked reason written on an earlier pass can go stale the
|
|
879
|
+
moment its underlying cause is fixed elsewhere, and nothing re-checks it automatically;
|
|
880
|
+
- treat "the user already decided to defer this" as a real answer only when a decision file
|
|
881
|
+
actually records that choice; an assumption that a gap must be a deferred product decision,
|
|
882
|
+
invented to explain why nothing ran, is not a substitute for checking.
|
|
883
|
+
|
|
884
|
+
If QA finds a stale reason, an unverified blocked status, or a swallowed failure, it must
|
|
885
|
+
demand a fresh Developer dispatch for that entity before the phase is reviewed — a plausible
|
|
886
|
+
top-level status string never closes this out on its own. Repeat this full entity-by-entity
|
|
887
|
+
pass after every resumed or recovery run, not only the first: a dispatch that fixes one
|
|
888
|
+
entity's crash or slowness does not certify any other entity's completeness, and a phase
|
|
889
|
+
already marked reviewed goes back to "needs review" the moment a later pass changes its
|
|
890
|
+
completion report.
|
|
891
|
+
|
|
892
|
+
**Finish the pass by writing the attestation, not by saying so in prose**. Once
|
|
893
|
+
every mapped entity/subtype above has been checked, compile the per-entity results (the ten
|
|
894
|
+
`completion-report.js` fields for a full-mode row, or `imported`/`skipped` for a quick-mode
|
|
895
|
+
row, plus `blockedReasonsReverified` for any row with a blocked, deferred, failed, unresolved
|
|
896
|
+
or skipped count) into a JSON array and run:
|
|
897
|
+
|
|
898
|
+
```
|
|
899
|
+
node skills/wix-replatform/scripts/entity-qa-attestation.js <projectDir> \
|
|
900
|
+
--entities-file <path to the compiled per-entity results> \
|
|
901
|
+
--verified-by <QA subagent label>
|
|
902
|
+
```
|
|
903
|
+
|
|
904
|
+
This computes the completion report's own digest, resolves the independent mapped-entity
|
|
905
|
+
coverage source (`mapping/mapping-plan.json`, or `quick-mode/plan.json` for quick mode), and
|
|
906
|
+
writes `execution/qa/entity-qa-attestation.json` only if it validates. Finalization
|
|
907
|
+
(`orchestration-router.js` / `scripts/migration-completion.js`) now refuses without a fresh,
|
|
908
|
+
complete attestation matching the report that is shipping — a missing, stale or failed
|
|
909
|
+
attestation routes the run back to this pass, never to a silent "completed". A count the
|
|
910
|
+
writer reports as mismatched is the same defect this section already requires: send that
|
|
911
|
+
entity back to a fresh Developer dispatch, then re-run the full pass and the writer.
|
|
912
|
+
|
|
913
|
+
## Per-batch accounting
|
|
914
|
+
|
|
915
|
+
Flush the run's accounting into the project after every batch, through the same shared writer
|
|
916
|
+
that produces the final record. An importer that holds its counters until the end loses them to
|
|
917
|
+
any interruption, and a long import redirected to a temporary file loses them to the shell; a
|
|
918
|
+
run that dies halfway must still leave a truthful partial account.
|
|
919
|
+
|
|
920
|
+
**Counts are held, never re-derived.** The figures come from the importer's own counters for the
|
|
921
|
+
current run. A count recovered by re-reading the append-only attempt ledger afterwards sweeps in
|
|
922
|
+
dry-run passes, retried batches and earlier recovery passes — that is how a run's counts inflate well past the number of records.
|
|
923
|
+
|
|
924
|
+
### Coverage check against the attempt journal
|
|
925
|
+
|
|
926
|
+
Every `writeLiveImportSummary` flush that names a run id checks its held counters against that
|
|
927
|
+
run's own rows in `state/attempts/write-attempts.ndjson`, and adds the result as `coverageCheck`
|
|
928
|
+
on the written summary. The held counters are never replaced; a disagreement is reported, not
|
|
929
|
+
hidden, and the write still completes.
|
|
930
|
+
|
|
931
|
+
At the end of the run, pass the run's own `coverageCheck` to `createCompletionReport` — read it
|
|
932
|
+
back from `execution/live-import-summary.json` and use it only when its `runId` equals the run
|
|
933
|
+
being completed (`input.runId`); `live-import-summary.json` is one file shared by every run,
|
|
934
|
+
so "the last `coverageCheck` in the file" is never a safe substitute for checking the run id. Also
|
|
935
|
+
pass `coverageCheckExpected: true` whenever this run called `writeLiveImportSummary` with a run id
|
|
936
|
+
at least once, so an omitted or rejected-run-id check is recognized as this run's own unresolved
|
|
937
|
+
gap rather than silently ignored. This is opt-in: an existing importer that
|
|
938
|
+
has not adopted this contract never sets `coverageCheckExpected`, and a missing check there changes
|
|
939
|
+
nothing — do not set it for a project that never calls `writeLiveImportSummary` with a run id.
|
|
940
|
+
|
|
941
|
+
Do not present a held count as confirmed before this check runs: `coverageCheck.status` is
|
|
942
|
+
`"agrees"`, `"mismatch"`, or `"unchecked"`, and only `"agrees"` means the journal
|
|
943
|
+
corroborates it.
|
|
944
|
+
|
|
945
|
+
## Reporting records that did not arrive
|
|
946
|
+
|
|
947
|
+
Records that did not arrive go into four separate sections of the completion report, never
|
|
948
|
+
merged into one list of issues, because they need four different responses:
|
|
949
|
+
|
|
950
|
+
| Field | Meaning |
|
|
951
|
+
| --- | --- |
|
|
952
|
+
| `losses[]` | Permanent losses — the destination cannot represent the record and no retry changes that |
|
|
953
|
+
| `exclusions[]` | Deliberate exclusions — we chose not to import these, with a count, a rationale, and whether an operator gate was recorded |
|
|
954
|
+
| `unresolved[]` | Written to the destination but not mapped, or mapped but unaccounted |
|
|
955
|
+
| `droppedFields[]` | The record arrived in a degraded form — the one that vanishes most easily, because the record count reconciles perfectly |
|
|
956
|
+
|
|
957
|
+
Each section renders even when empty, with an explicit "None." An omitted section is
|
|
958
|
+
indistinguishable from one nobody checked.
|
|
959
|
+
|
|
960
|
+
Anything the operator must do by hand goes in `operatorActions[]`, which renders **above** the
|
|
961
|
+
counts, each entry carrying a severity and a deadline reason.
|
|
962
|
+
|
|
963
|
+
`writeCompletionReport` also appends source access that outlives the migration
|
|
964
|
+
(`lib/source-access.js`). For a Shopify private-data run that connected, that is
|
|
965
|
+
`shopify-staff-account-removal` (`high`, entity the store domain): the store owner removes the
|
|
966
|
+
migration staff account after cutover and after the last Shopify read. It is listed on every
|
|
967
|
+
report, including an otherwise complete one, until the Import Operator records the owner's
|
|
968
|
+
confirmation with `rp-source-shopify` `scripts/shopify-session-check.js --confirm-staff-removal
|
|
969
|
+
owner-removed-account`; when the record is unreadable or missing the action says so and
|
|
970
|
+
`--repair-staff-access` rebuilds it as pending. It never changes the report's status.
|
|
971
|
+
|
|
972
|
+
For a Shopify run with any `shopify:customer-<kind>`, `shopify:order-<kind>` or
|
|
973
|
+
`shopify:customers-withheld-identity` coverage row, the writer also appends
|
|
974
|
+
`shopify-withheld-details-export` (`high`). A loss disposition does not close it: Shopify still
|
|
975
|
+
holds the only copy. After the final catch-up, the merchant exports customers and orders from
|
|
976
|
+
Shopify Admin; **Requires Import Operator** to run `rp-source-shopify`'s
|
|
977
|
+
`shopify-discovery.js --project <project> --confirm-withheld-export owner-exported`, regenerate
|
|
978
|
+
the report and verify the action is gone. A later extract `readAt` or a new withheld row reopens
|
|
979
|
+
it. The catch-up/checklist integration is not wired yet; the completion report is the
|
|
980
|
+
current durable handoff.
|
|
981
|
+
|
|
982
|
+
Shopify extract stop codes (`rp-source-shopify`), each a stop, never a retry loop. A source
|
|
983
|
+
catch-up (rerun for new and modified records) runs `shopify-extract.js --catch-up`, which reads
|
|
984
|
+
the whole store again in full; its **final re-read after Shopify activity stops** is a cutover
|
|
985
|
+
task for the Import Operator (check that `data/source-extract/extract-manifest.json` is
|
|
986
|
+
`complete` and every `readAt` is after the time activity stopped):
|
|
987
|
+
|
|
988
|
+
| Code | Meaning / next step |
|
|
989
|
+
| --- | --- |
|
|
990
|
+
| `source_auth_expired` | The CLI session lapsed. The stopping script creates a `manual_action` (`stage: execution`); run the session check (with `--connect` if asked), answer it, and the extract resumes from its manifest. **Requires Import Operator** |
|
|
991
|
+
| `shopify_throttled` | Shopify throttled one read on all 6 calls (31 s of backoff); re-run the extract later |
|
|
992
|
+
| `shopify_bulk_overdue` | A Shopify bulk export is still preparing after 4 hours. The extract holds at `awaiting_user_action` (exit 3) with one `question` action: answer `wait` (4 more hours) or `abort`, then run `shopify-extract.js` again. No duplicate question is created on restart |
|
|
993
|
+
| `shopify_bulk_overdue_aborted` | The operator answered `abort`: that dataset is `failed` with its `capture-failed` row `shopify:<entity>`; Shopify's operation is not cancelled. **Requires Import Operator**: `shopify-extract.js --retry-failed` reads it again |
|
|
994
|
+
| `shopify_bulk_failed` | A bulk dataset failed twice, was refused with `ACCESS_DENIED` and an unattributed cause, or is still `failed` from an earlier start. The extract stops on every start until the operator runs `shopify-extract.js --retry-failed` after fixing the cause in the message; then record the coverage decision `provided` for `shopify:<entity>`, or show the merchant the row at mapping. **Requires Import Operator** |
|
|
995
|
+
| `shopify_protected_fields_withheld` | A customer/order denial was re-probed with four ordinary 3-record reads and one or more error paths named a newly withheld kind, or a customer had no readable identity after projection. The new row is already upserted and promoted. Return through mapping for that exact coverageId; after mapping, the denied query resets with the narrower projection and finished queries do not rerun. A pathless or unrelated diagnostic uses `shopify_bulk_failed` instead and never narrows the projection |
|
|
996
|
+
| `shopify_bulk_download_failed` | The bulk file could not be downloaded whole (wrong status, size, final newline or a line that does not parse; or expired links) after the bounded retries. Same recovery as `shopify_bulk_failed` |
|
|
997
|
+
| `shopify_bulk_orphan_child` | A bulk file had a child row with no parent, or of a type the adapter does not fold. Same recovery; report it, because the bulk format may have changed |
|
|
998
|
+
| `shopify_extract_count_short` | The extract received fewer customers or orders than Shopify's exact count. The row `shopify:customers` / `shopify:orders` goes back through mapping for the merchant's decision; `--retry-failed` reads the dataset again |
|
|
999
|
+
| `shopify_extract_count_inexact` | Shopify gave only an "at least" count (or the count read failed). Never a pass: same row and recovery |
|
|
1000
|
+
| `shopify_gift_card_codes_unreadable` | Gift cards first appeared during extract. `shopify:gift-card-codes` was added and promoted; return to mapping for its disposition before continuing |
|
|
1001
|
+
| `shopify_gift_card_count_short` | The gift-card bulk read contains fewer cards created by its start than Shopify's exact count. The entry is `failed`; fix the cause and run `shopify-extract.js --retry-failed` for a new gated read. **Requires Import Operator** |
|
|
1002
|
+
| `shopify_gift_card_count_inexact` | Shopify returned a non-`EXACT` count, rejected the read-bound filter, or the count still failed after its bounded retries. Same failed-entry recovery; never treat it as zero or nothing owed |
|
|
1003
|
+
| `shopify_gift_card_amount_invalid` | A gift-card balance or initial value was not a plain decimal. The gated read failed before `done`; fix/report the source shape and use `--retry-failed` |
|
|
1004
|
+
| `shopify_extract_store_mismatch` / `shopify_extract_files_missing` | The extract manifest belongs to another store, or says `complete` but its final files are gone (run `shopify-extract.js --catch-up`). Nothing was read or changed |
|
|
1005
|
+
| `shopify_cli_node_unsupported` | Node.js older than 22.12: switch this terminal to Node.js 22.12 or later (for example the current LTS), check `node --version`, run the session check again. Nothing was installed or read. **Requires Import Operator** |
|
|
1006
|
+
| `shopify_cli_version_changed` | The adapter's CLI is not 4.8.3; reinstall through the session check with `--install` (operator consent) |
|
|
1007
|
+
| `shopify_cli_incompatible` | The adapter's CLI install is damaged; reinstall with `--install` |
|
|
1008
|
+
| `shopify_api_version_unsupported` | Shopify no longer accepts the pinned API version; stop and report — moving the pin is a tested code change |
|
|
1009
|
+
|
|
1010
|
+
### CMS fallback for recognized plugin capabilities
|
|
1011
|
+
|
|
1012
|
+
A recognized plugin capability reaches CMS only with a signed eligibility entry **and** this
|
|
1013
|
+
migration's merchant approval (`pluginCmsFallback:<capability>`, recorded at the mapping
|
|
1014
|
+
review). Apply only the CMS fallbacks the merchant approved; write nothing for pending or
|
|
1015
|
+
declined ones; never delete or overwrite CMS data an earlier run wrote.
|
|
1016
|
+
|
|
1017
|
+
**Write-time guard (before any CMS write of a recognized capability).** Run it with the
|
|
1018
|
+
capability the plan is about to write, and write zero records for it unless it is allowed:
|
|
1019
|
+
|
|
1020
|
+
```bash
|
|
1021
|
+
node skills/wix-replatform/scripts/cms-fallback.js guard --project-dir <project> --capability <capability>
|
|
1022
|
+
```
|
|
1023
|
+
|
|
1024
|
+
Exit `2` means refused: the coverage row is not an approved CMS fallback, the approval fails
|
|
1025
|
+
the shape check or no longer matches the register, or the current resolution digest differs
|
|
1026
|
+
from the one in `plugin-coverage.json`, the mapping plan or the setup plan. Generated import
|
|
1027
|
+
code may call `cmsFallbackWriteGuard(projectDir, { attempted })` from
|
|
1028
|
+
`skills/wix-replatform/lib/plugin-cms-fallback.js` directly. The router is the primary gate;
|
|
1029
|
+
this is defence in depth.
|
|
1030
|
+
|
|
1031
|
+
**Completion.** Pass `cmsFallback: { coverage, refusals, writes, previousReport }` to
|
|
1032
|
+
`createCompletionReport` — `coverage` is `discovery/plugin-coverage.json`, `refusals` the
|
|
1033
|
+
guard's refusals, `writes` this run's CMS writes per approved capability
|
|
1034
|
+
(`{ capability, collections[], count }`), `previousReport` the prior
|
|
1035
|
+
`execution/completion-report.json` when one exists. It derives one operator action per case
|
|
1036
|
+
and persists `cmsFallbackWrites` for the next run:
|
|
1037
|
+
|
|
1038
|
+
| `code` | Severity | When |
|
|
1039
|
+
| --- | --- | --- |
|
|
1040
|
+
| `plugin-cms-fallback-feature-absent` | medium | an approved fallback: records archived in CMS; the plugin's feature is not restored — rebuild or replace it in Wix |
|
|
1041
|
+
| `plugin-cms-fallback-undecided` | high when records exist | eligible but pending (awaiting, stale, quarantined, or target knowledge unavailable): records were not migrated |
|
|
1042
|
+
| `plugin-cms-fallback-declined` | high when records exist | the merchant declined: records were not migrated |
|
|
1043
|
+
| `plugin-cms-fallback-withdrawn` | high | CMS records written by an earlier run under an answer that no longer applies (declined, stale, superseded by a native target, no longer eligible): names the collection(s) and count; the Cutover Operator keeps or removes them by hand |
|
|
1044
|
+
| `plugin-cms-fallback-write-refused` | high | the write-time guard refused a write. **Requires Import Operator:** rerun from the router so coverage and both plans are regenerated, then import again |
|
|
1045
|
+
|
|
1046
|
+
Resolution stays split: a reconciled CMS collection resolves *storage* only; the
|
|
1047
|
+
`feature-absent` item is resolved only by a manual check that the replacement feature works on
|
|
1048
|
+
the Wix site.
|
|
1049
|
+
|
|
1050
|
+
## Cause attribution
|
|
1051
|
+
|
|
1052
|
+
A failure carried into the completion report or the handoff takes one of exactly three shapes.
|
|
1053
|
+
There is no fourth, and no bare free-text cause:
|
|
1054
|
+
|
|
1055
|
+
| `causeConfidence` | Requires | Renders as |
|
|
1056
|
+
| --- | --- | --- |
|
|
1057
|
+
| `verified-source` | a named destination-side check that ruled the destination out, recorded with its result | the cause, followed by the check |
|
|
1058
|
+
| `verified-target` | a named destination-side check that confirmed a destination or same-run cause | the cause, followed by the check |
|
|
1059
|
+
| `unverified` | nothing | `cause unverified`, and **no cause text at all** |
|
|
1060
|
+
|
|
1061
|
+
The check is recorded as `{ kind, target, result }`. An `unverified` row must not carry a
|
|
1062
|
+
`cause` string — `writeCompletionReport` refuses one that does. A hypothesis printed next to the
|
|
1063
|
+
word "unverified" is read as a finding by everyone skimming. A migration must not copy a source
|
|
1064
|
+
defect forward, and it must equally not invent one: an unchecked "the source data is bad" costs
|
|
1065
|
+
the merchant a trip into their old platform to fix data that was never broken, and it closes the
|
|
1066
|
+
only investigation that would have found the real cause.
|
|
1067
|
+
|
|
382
1068
|
## Localhost media before live import
|
|
383
1069
|
|
|
384
1070
|
When source media URLs are local/private, ask the user to choose one path before live
|
|
@@ -404,20 +1090,51 @@ Non-media entities may continue if the execution plan clearly excludes or defers
|
|
|
404
1090
|
- `migrations/<project>/execution/live-import-summary.json`
|
|
405
1091
|
- `migrations/<project>/execution/completion-report.json`
|
|
406
1092
|
- `migrations/<project>/execution/review/completion-summary.md`
|
|
1093
|
+
- `migrations/<project>/execution/review/migration-handoff.md` and its
|
|
1094
|
+
`migration-handoff.json` sidecar — the run's account of the migration, generated **after the
|
|
1095
|
+
last write** from the final outcome record. `generatePostExecutionHandoff` refuses and returns
|
|
1096
|
+
a typed reason when there is no `execution/completion-report.json`; it never writes a clean
|
|
1097
|
+
document from the plan
|
|
407
1098
|
- `migrations/<project>/execution/recovery-log.json` for every resumed, partial,
|
|
408
|
-
missing-only, failed-only, or
|
|
1099
|
+
missing-only, failed-only, deferred-only, or unresolved-only run
|
|
1100
|
+
- `migrations/<project>/execution/unresolved-writes.ndjson` — the re-read queue: one row per
|
|
1101
|
+
record whose latest journal status is unresolved (`succeeded_unverified`, or a `started` row
|
|
1102
|
+
with no terminal follow-on). A projection rebuilt from the attempt journal, never a source of
|
|
1103
|
+
truth; deleting it loses nothing
|
|
1104
|
+
- `migrations/<project>/state/attempts/write-attempts.ndjson` — the append-only per-record
|
|
1105
|
+
ledger. Never rewritten, trimmed or rotated; a validation pass writes to
|
|
1106
|
+
`state/sample/attempts/write-attempts.ndjson` instead and never opens this file
|
|
409
1107
|
- audit/report artifacts emitted by the shared import runtime
|
|
410
1108
|
|
|
1109
|
+
## Dependency recovery and cutover handoff
|
|
1110
|
+
|
|
1111
|
+
Read `execution/dependency-readiness.json` for task blockers, affected source keys and the
|
|
1112
|
+
named recovery. The gate derives it from current site-bound task passes, latest attempt
|
|
1113
|
+
outcomes, verified local mappings, setup receipt and approved census/field rules; editing
|
|
1114
|
+
the projection cannot unlock writes. Preserve `state/readiness/task-passes.ndjson` across
|
|
1115
|
+
resumes. Legacy or foreign-site evidence requires the named reconciliation/read-back.
|
|
1116
|
+
Never adopt an unverified candidate ID or resend an order to repair dependency evidence.
|
|
1117
|
+
|
|
1118
|
+
Retain record deferrals in the existing attempt journal and reference-fidelity/cardinality
|
|
1119
|
+
gaps in `mapping/review/mapping-gaps.json`. Generate the shared completion report so its
|
|
1120
|
+
`operatorActions` carry the affected work, prerequisites, next action, resolution evidence
|
|
1121
|
+
and **Requires Import Operator** / **Copy prompt for Import Operator** instructions.
|
|
1122
|
+
The Cutover Operator works on another machine: recovery requiring the original project
|
|
1123
|
+
must name that role and prompt. Resolve the underlying producer/approval/reference,
|
|
1124
|
+
reevaluate, then resume only eligible deferred records. These artifacts preserve the handoff;
|
|
1125
|
+
future cutover UI ingestion is not yet wired.
|
|
1126
|
+
|
|
411
1127
|
## Recovery artifact contract
|
|
412
1128
|
|
|
413
1129
|
Targeted recovery is a first-class import mode, not a side script. Every selective,
|
|
414
|
-
resumed, partial, missing-only, failed-only, or
|
|
1130
|
+
resumed, partial, missing-only, failed-only, deferred-only, or unresolved-only run must append one entry to
|
|
415
1131
|
`execution/recovery-log.json` and update `execution/live-import-summary.json` through the
|
|
416
1132
|
same shared summary writer used by the main import path.
|
|
417
1133
|
|
|
418
1134
|
Each recovery entry must include:
|
|
419
1135
|
|
|
420
1136
|
- recovery id
|
|
1137
|
+
- run id — the id the importer minted at process start, so the entry is attributable to a pass
|
|
421
1138
|
- timestamp
|
|
422
1139
|
- selection filters
|
|
423
1140
|
- reason
|
|
@@ -427,6 +1144,9 @@ Each recovery entry must include:
|
|
|
427
1144
|
- already present
|
|
428
1145
|
- failed
|
|
429
1146
|
- deferred
|
|
1147
|
+
- unresolved — its own count, **never** summed into `failed`. A write whose outcome we do not
|
|
1148
|
+
know is read back, not re-sent, and a recovery record that folds it into the failure count
|
|
1149
|
+
reconciles arithmetically and is wrong
|
|
430
1150
|
- crosswalk changes
|
|
431
1151
|
- summary changes
|
|
432
1152
|
- operator-visible outcome
|
|
@@ -436,6 +1156,27 @@ Do not overwrite earlier recovery entries. Failed or deferred records from an ea
|
|
|
436
1156
|
attempt must remain visible after a later successful recovery; the newer recovery entry and
|
|
437
1157
|
summary delta explain what changed.
|
|
438
1158
|
|
|
1159
|
+
## Shipping delivery estimates on a finished project
|
|
1160
|
+
|
|
1161
|
+
Before the delivery-estimate fix, generated importers sent the delivery estimate under a name Wix drops, so
|
|
1162
|
+
their shipping options show no delivery time. Earlier migrations are reported, **never edited**.
|
|
1163
|
+
For a finished project whose importer predates that fix, run:
|
|
1164
|
+
|
|
1165
|
+
```bash
|
|
1166
|
+
node skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js --project-dir <projectDir>
|
|
1167
|
+
```
|
|
1168
|
+
|
|
1169
|
+
- It only reads Wix (GET); it never POSTs or PATCHes. It reads the crosswalk, the attempt
|
|
1170
|
+
journal, `orchestration/decisions.json`, the extract if present, and Site Properties once.
|
|
1171
|
+
- It writes `execution/shipping-estimates.json`, replaces the shipping `operatorActions` in
|
|
1172
|
+
`execution/completion-report.json`, and regenerates the post-execution handoff.
|
|
1173
|
+
- The only other local write is one crosswalk upsert when a recorded
|
|
1174
|
+
`shipping-option-target-missing:<optionKey>` decision of `recreated:<id>` adopts a new id.
|
|
1175
|
+
- Rerun it after a decision is recorded or a delivery time is entered in Business Manager. That is
|
|
1176
|
+
how a finished project closes its shipping items.
|
|
1177
|
+
- `--list <code>` prints every option recorded under that code, with no Wix call. Use it to relay
|
|
1178
|
+
a list of more than 15 options to the Cutover Operator.
|
|
1179
|
+
|
|
439
1180
|
## Completion report contract
|
|
440
1181
|
|
|
441
1182
|
This skill should expect the shared import runtime to emit a machine-readable completion
|
|
@@ -454,7 +1195,37 @@ artifact and should preserve it as the primary post-run result.
|
|
|
454
1195
|
- grouped failure outcomes
|
|
455
1196
|
- mismatch rows where source, import, and crosswalk counts do not reconcile
|
|
456
1197
|
- URL preservation summary counts and artifact paths when URL preservation is enabled
|
|
1198
|
+
- `voucherReconciliation` — the answer to workflow step 6b, exactly one of:
|
|
1199
|
+
|
|
1200
|
+
| Value | Meaning |
|
|
1201
|
+
| --- | --- |
|
|
1202
|
+
| `not-applicable` | the accepted scope excluded coupons, or the source carried no usage-limited coupon |
|
|
1203
|
+
| `reconciled` | the step ran and every voucher reconciled |
|
|
1204
|
+
| `plan-pending-owner` | a plan was produced and is awaiting the owner's decisions per code |
|
|
1205
|
+
| `remedied` | approved remedies were applied and each was confirmed by a post-settle read-back |
|
|
1206
|
+
| `not-run` | the step was due and did not run |
|
|
1207
|
+
|
|
1208
|
+
There is no default. For a run whose scope included coupons, a **missing field reads as
|
|
1209
|
+
`not-run`, never as `not-applicable`** — an absent answer is exactly the state this field
|
|
1210
|
+
exists to make visible, and defaulting it to the benign value rebuilds the defect. `not-run`
|
|
1211
|
+
and `plan-pending-owner` are named in the completion headline and raise the final status to
|
|
1212
|
+
at least `complete_with_warnings` under the highest-severity rule below.
|
|
457
1213
|
- dashboard/editor/preview destinations
|
|
1214
|
+
- `sourceCoverage[]` and `sourceCoverageRecorded` (report schema v2) — what the source held
|
|
1215
|
+
that was never captured. `writeCompletionReport` joins `discovery/source-coverage.json`,
|
|
1216
|
+
`mapping/review/mapping-gaps.json` and `orchestration/decisions.json` by `coverageId` and folds
|
|
1217
|
+
the result into the one status. An open row is a gated exclusion (no floor; one grouped
|
|
1218
|
+
headline line), an ungated exclusion (`complete_with_warnings`), an accepted loss
|
|
1219
|
+
(`incomplete_with_failures`), or unresolved data — auth-gated, unsupported, skipped by rule,
|
|
1220
|
+
failed or declared-not-observed with a gap or a `declined` decision —
|
|
1221
|
+
(`incomplete_with_mismatches`, one headline line per capability). In-scope auth-gated,
|
|
1222
|
+
capture-failed and declared-not-observed rows also add a `high` `operatorActions[]` row: the
|
|
1223
|
+
source is still the only copy. The writer refuses when a stamped project's coverage file is
|
|
1224
|
+
missing or does not reconcile. A project whose `source-schema.json` has no
|
|
1225
|
+
`sourceCoverageContract` stamp (discovery from before this contract) records
|
|
1226
|
+
`sourceCoverageRecorded: false` and at least `complete_with_warnings`. Recovering a source
|
|
1227
|
+
route or credential is Import Operator work before execution; the handoff's *Not migrated
|
|
1228
|
+
from the source* section only tells the Cutover Operator what to recreate or confirm in Wix.
|
|
458
1229
|
- artifact references for logs and diagnostics
|
|
459
1230
|
|
|
460
1231
|
`execution/live-import-summary.json` should carry the same `entityCompleteness` accounting
|
|
@@ -527,3 +1298,72 @@ for final imported/skipped/failed counts.
|
|
|
527
1298
|
- Prefer dry-runs or sample batches before full import.
|
|
528
1299
|
- Stop on systemic mapping or write failures rather than amplifying bad writes.
|
|
529
1300
|
- Preserve enough logging to support replay and debugging.
|
|
1301
|
+
|
|
1302
|
+
### On a destination the run did not create, the import is ADDITIVE — always
|
|
1303
|
+
|
|
1304
|
+
Every rule below is unconditional when `WIX_SITE_STRATEGY=existing`. The site holds the
|
|
1305
|
+
owner's live business data, and nothing in this pipeline can undo a bulk write.
|
|
1306
|
+
|
|
1307
|
+
- **Never delete a pre-existing entity.** No products, categories, collections, posts,
|
|
1308
|
+
media or coupons — not to clear a failed partial import, not to "start clean" before a
|
|
1309
|
+
retry, not to resolve a collision. There is no reason good enough; a failed import is
|
|
1310
|
+
recovered by re-running an idempotent one, not by clearing the target.
|
|
1311
|
+
- **Never wipe the demo catalog.** That cleanup exists for a template's placeholder
|
|
1312
|
+
products on a site this run just scaffolded (see `resources/rp-destination/`). On an
|
|
1313
|
+
existing site those products are the owner's.
|
|
1314
|
+
- **Skip, do not overwrite.** A record already present — by crosswalk, then by the
|
|
1315
|
+
mapping's natural key — is skipped and counted as `skipped`, not rewritten. Only augment
|
|
1316
|
+
a pre-existing entity when the plan the user accepted says so for that entity type.
|
|
1317
|
+
**One narrow exception: a rerun's accepted update path.** A linked record whose
|
|
1318
|
+
source version changed may be updated through its entity's verified update writer, carrying
|
|
1319
|
+
the crosswalk's saved `targetRevision`. The crosswalk check still runs before every create;
|
|
1320
|
+
what the exception replaces is only the blanket skip of linked records, and only for the
|
|
1321
|
+
accepted update path. Matching a *pre-existing* Wix record by natural key never authorizes
|
|
1322
|
+
updating it — that stays the collision policy above.
|
|
1323
|
+
- **Never blank a field the source does not carry.** A source without a field means "no
|
|
1324
|
+
information", not "empty" — writing the empty value deletes data the owner entered by
|
|
1325
|
+
hand. Send partial updates; never a full replace built from source-only fields.
|
|
1326
|
+
- **Report what was left alone.** The completion report must count `skipped` alongside
|
|
1327
|
+
`imported` and `failed`, so the user can reconcile the plan's collision inventory against
|
|
1328
|
+
what actually happened. "Nothing was touched here" is a result, not an omission.
|
|
1329
|
+
|
|
1330
|
+
Default-location inventory completion requires both the Inventory item and the same Catalog variant to agree on availability. The reconciler checks this on fresh writes and no-write reruns. A Catalog disagreement or failed read stays unverified; retain it for recovery without blindly rewriting stock.
|
|
1331
|
+
|
|
1332
|
+
|
|
1333
|
+
## Contact/product verification before completion
|
|
1334
|
+
|
|
1335
|
+
Execute generated contact/product callers through the shared verified import wrappers.
|
|
1336
|
+
Use the verification-state loader to read `state/write-verification.json` plus atomic
|
|
1337
|
+
batch checkpoints in `state/write-verification-journal/`. It replays committed checkpoints
|
|
1338
|
+
after interruption; the final snapshot compacts them. Published crosswalks carry receipt
|
|
1339
|
+
references, while expected/actual entities remain in protected verification state. Candidate IDs are recovery information, not usable mappings. A crosswalk hit
|
|
1340
|
+
or a `--missing-only` selection still requires target identity/value verification.
|
|
1341
|
+
Preserve uncertain write outcomes and reconcile before retrying; do not create again
|
|
1342
|
+
because the response was lost. Never repair historical contamination by blanket clearing.
|
|
1343
|
+
|
|
1344
|
+
Shared completion inputs must include `siteId`, each contact/product row's intended
|
|
1345
|
+
`sourceKeys`, `verificationKind: "contact"` or `"product"` from the accepted mapping,
|
|
1346
|
+
and `verification[entity]` from the wrapper. Declare `verificationKind: "none"` explicitly
|
|
1347
|
+
for entities outside these comparators; an unknown name without a policy stays incomplete. Count-only completion cannot
|
|
1348
|
+
satisfy these entities. Missing or conflicting evidence yields incomplete status and a
|
|
1349
|
+
reconciliation action. Explicitly empty source sets have no data; empty reports cannot
|
|
1350
|
+
cover a nonempty set. Quick Shopify separately records its product read-back results and
|
|
1351
|
+
keeps stock permission failures partial and resumable; setup still does not write stock.
|
|
1352
|
+
|
|
1353
|
+
|
|
1354
|
+
The mere presence of `state/.lock/` does not mean an importer is running. Each importer
|
|
1355
|
+
owns a uniquely named PID/host claim there, and a resume automatically removes claims
|
|
1356
|
+
whose local process is dead (including after SIGKILL). A live process continues to block
|
|
1357
|
+
concurrent imports. For a claim from another host, an unrecognized legacy file, or a reused
|
|
1358
|
+
PID, first confirm that its importer is stopped on the owning host, then remove only that
|
|
1359
|
+
claim file and rerun the same command. Do not remove a live owner's claim or the whole state
|
|
1360
|
+
folder. An empty legacy `.lock` directory needs no manual cleanup.
|
|
1361
|
+
|
|
1362
|
+
A failed target read keeps the previous verified crosswalk mapping and receipt reference.
|
|
1363
|
+
The current verification report remains partial, so that retained mapping does not turn a
|
|
1364
|
+
failed read into a new completion claim. Revoke mappings when identity is contradicted;
|
|
1365
|
+
value-only differences require the existing update/review flow.
|
|
1366
|
+
|
|
1367
|
+
## Discovered-set outcome handoff
|
|
1368
|
+
|
|
1369
|
+
After writing the final completion report and before generating the post-execution handoff, run `node scripts/discovered-set-status.js build <projectDir>` in standard mode. It joins the approved discovered scope to actual outcomes, with unknown counts retained as unknown. Its Import Operator prompts stay in the handoff under Urgent Operator Actions; send those prompts to the Import Operator for recovery in the original migration environment. Do not resolve partial, failed, deferred or pending scope by ticking a manual acknowledgement. Only a merchant or Cutover Operator may record completed `manual-open` work through `scripts/discovered-set-status.js resolve`, with short evidence containing no record values. Quick mode keeps its existing path.
|