@wix/agent-skills 1.33.1 → 1.35.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 +3 -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 +14 -4
- package/skills/wix-manage/references/blog/how-to-create-blog-posts.md +2 -0
- package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
- package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
- package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
- package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
- package/skills/wix-manage/references/seo/manage-content-plan.md +207 -222
- package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
- package/skills/wix-manage/references/sites/upload-static-site.md +128 -8
- package/skills/wix-readme/SKILL.md +166 -0
- 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
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const capabilities = require('../../../lib/execution-capability');
|
|
5
|
+
const fs = require('node:fs/promises');
|
|
6
|
+
const path = require('node:path');
|
|
7
|
+
const crypto = require('node:crypto');
|
|
8
|
+
const REAL_WRITERS = require('../../rp-target-wix/lib/wix-writers.js');
|
|
9
|
+
const { SCHEMA_KIND: CONTACT_V4_SCHEMA_KIND } = require('../../rp-target-wix/lib/contact-extended-fields.js');
|
|
10
|
+
const { hashArtifact } = require('../../../lib/artifact-freshness.js');
|
|
11
|
+
const { validatePlanShape, validateSetupVerification } = require('../../../lib/setup-verification.js');
|
|
12
|
+
|
|
13
|
+
// NOTE: 'wix-stores' intentionally still maps to 1380b703-... (Wix eCommerce, not Wix
|
|
14
|
+
// Stores) here — a separate, independently-tracked defect, not part of this change. See
|
|
15
|
+
// wix-writers.js's WIX_STORES_APP_ID (215238eb-...) for the correct id.
|
|
16
|
+
const APPS = { 'wix-stores': '1380b703-ce81-ff05-f115-39571d94dfcd', 'wix-blog': '14bcded7-0066-7c35-14d7-466cb3f09103' };
|
|
17
|
+
|
|
18
|
+
// Additional app-install step ids, added for projects whose setup plan needs apps this
|
|
19
|
+
// executor previously had no executor for at all (a plan naming any of these used to fail
|
|
20
|
+
// closed with NO_EXECUTOR_FOR_REQUIREMENT). Ids verified live against dev.wix.com's "Apps
|
|
21
|
+
// Created by Wix" reference table, 2026-08-29 -- not from a docs example, and not reusing
|
|
22
|
+
// the known-wrong 'wix-stores' id above. Idempotent: an app already installed is a pass,
|
|
23
|
+
// not a redundant install call (see the isWixAppInstalled check in runStep below).
|
|
24
|
+
const INSTALL_STEPS = {
|
|
25
|
+
'install-wix-stores': '215238eb-22a5-4c36-9e7b-e7c08025e04e',
|
|
26
|
+
'install-wix-gift-cards': 'd80111c5-a0f4-47a8-b63a-65b54d774a27',
|
|
27
|
+
'install-wix-blog': '14bcded7-0066-7c35-14d7-466cb3f09103',
|
|
28
|
+
'install-wix-events': '140603ad-af8d-84a5-2c80-a0f60cb47351',
|
|
29
|
+
'install-wix-data': 'e593b0bd-b783-45b8-97c2-873d42aacaf4',
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
async function readJson(file) {
|
|
33
|
+
return JSON.parse(await fs.readFile(file, 'utf8'));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function readJsonIfExists(file) {
|
|
37
|
+
try {
|
|
38
|
+
return await readJson(file);
|
|
39
|
+
} catch (error) {
|
|
40
|
+
if (error.code === 'ENOENT') return null;
|
|
41
|
+
throw error;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async function readEnv(dir) {
|
|
46
|
+
const raw = await fs.readFile(path.join(dir, 'config', 'wix.env'), 'utf8');
|
|
47
|
+
return Object.fromEntries(
|
|
48
|
+
raw
|
|
49
|
+
.split(/\r?\n/)
|
|
50
|
+
.map((line) => line.match(/^([A-Z0-9_]+)=(.*)$/))
|
|
51
|
+
.filter(Boolean)
|
|
52
|
+
.map(([, key, value]) => [key, value.trim()]),
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function fallbackAuthor(dir, wix, writers) {
|
|
57
|
+
const id = path.basename(dir);
|
|
58
|
+
const email = `replatform-${id}@example.com`;
|
|
59
|
+
const listed = await writers.listMembers(wix, { limit: 100 });
|
|
60
|
+
let member = (listed.members || []).find((item) => String(item.loginEmail || '').toLowerCase() === email);
|
|
61
|
+
if (!member) member = await (writers.ensureBlogFallbackAuthor || writers.createMember)(wix, { email, name: 'Imported content', slug: `imported-content-${id}` });
|
|
62
|
+
if (!member?.id) throw new Error('fallback Blog author was not created');
|
|
63
|
+
const file = path.join(dir, 'config', 'wix.env');
|
|
64
|
+
const raw = await fs.readFile(file, 'utf8');
|
|
65
|
+
await fs.writeFile(
|
|
66
|
+
file,
|
|
67
|
+
`${raw.replace(/\n?WIX_BLOG_FALLBACK_MEMBER_ID=.*(?:\n|$)/g, '\n').replace(/\s*$/, '\n')}WIX_BLOG_FALLBACK_MEMBER_ID=${member.id}\n`,
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Creates one Wix Data collection via the real, verified request shape (top-level key is
|
|
72
|
+
// `collection`, NOT `dataCollection` — confirmed live 2026-08-29 against a 400 "collection
|
|
73
|
+
// must not be empty" response from the wrong key, and against CreateDataCollectionRequest's
|
|
74
|
+
// real schema). Idempotent: a collection id that already exists (409 or an existing-id list
|
|
75
|
+
// hit) is a pass, never a delete-and-recreate — matches this skill's own "never delete or
|
|
76
|
+
// recreate an entity to fix a mismatch" rule.
|
|
77
|
+
async function createCmsCollectionsStep({ dir, wix, writers }) {
|
|
78
|
+
const requirements = await readJsonIfExists(path.join(dir, 'setup', 'setup-requirements.json'));
|
|
79
|
+
const list = Array.isArray(requirements) ? requirements : requirements?.requirements;
|
|
80
|
+
const requirement = (list || []).find((item) => item && item.id === 'create-cms-collections');
|
|
81
|
+
if (!requirement) throw new Error('setup-requirements.json has no create-cms-collections requirement');
|
|
82
|
+
|
|
83
|
+
const existing = await wix.send(writers.buildListCmsCollectionsRequest());
|
|
84
|
+
const existingIds = new Set((existing.collections || []).map((c) => c.id));
|
|
85
|
+
|
|
86
|
+
const fields = (requirement.fieldSchemaPerCollection || []).map((f) => ({
|
|
87
|
+
key: f.key,
|
|
88
|
+
type: f.type,
|
|
89
|
+
displayName: f.displayName,
|
|
90
|
+
...(f.required ? { required: true } : {}),
|
|
91
|
+
}));
|
|
92
|
+
|
|
93
|
+
for (const collection of requirement.collections || []) {
|
|
94
|
+
if (existingIds.has(collection.id)) continue; // already provisioned, not a redo
|
|
95
|
+
await writers.ensureCmsCollection(wix, { id: collection.id, displayName: collection.displayName, fields, permissions: requirement.permissions });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Runs one setup-plan step. Throws (with `blockerCode`/`recommendedAction` attached where
|
|
100
|
+
// the failure is a recognized, expected condition rather than a genuinely unexpected one)
|
|
101
|
+
// on anything short of full success — the caller records the failure and stops the run
|
|
102
|
+
// rather than letting a step's exception propagate past a recorded outcome.
|
|
103
|
+
// Provisions every `extendedFieldSchema` requirement in the plan before any
|
|
104
|
+
// writer can put a value in one. Blocked reasons become setup blockers rather than being retried
|
|
105
|
+
// or worked around: a breaking schema change and an archived-key collision are both decisions for
|
|
106
|
+
// a human, not for this executor.
|
|
107
|
+
// A step is a provisioning step if it SAYS so, not only if it happens to be spelled
|
|
108
|
+
// `provision-extended-fields`. Recognising one literal id meant discovery emitting a valid
|
|
109
|
+
// requirement under any other natural id -- `setup-order-extended-fields`, say -- failed closed
|
|
110
|
+
// with NO_EXECUTOR_FOR_REQUIREMENT and produced no receipt at all.
|
|
111
|
+
const EXTENDED_FIELD_STEP_ID = 'provision-extended-fields';
|
|
112
|
+
|
|
113
|
+
// A step provisions extended fields if it SAYS so -- by the conventional id, by declaring the
|
|
114
|
+
// kind, or by a requirement naming it. Matching one literal id meant a requirement scheduled
|
|
115
|
+
// under any other natural id (`setup-order-extended-fields`, say) was both reported as
|
|
116
|
+
// unscheduled AND unexecutable. The scheduling guard and the dispatcher share this predicate so
|
|
117
|
+
// they can never disagree about which steps count.
|
|
118
|
+
function stepProvisionsExtendedFields(step, declaredList) {
|
|
119
|
+
if (!step) return false;
|
|
120
|
+
if (step.id === EXTENDED_FIELD_STEP_ID) return true;
|
|
121
|
+
if (step.kind === 'extendedFieldSchema') return true;
|
|
122
|
+
return (declaredList || []).some((item) => item
|
|
123
|
+
&& item.kind === 'extendedFieldSchema'
|
|
124
|
+
&& (item.setupStepId === step.id || item.id === step.id));
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function isExtendedFieldStep(step, dir) {
|
|
128
|
+
const requirements = await readJsonIfExists(path.join(dir, 'setup', 'setup-requirements.json'));
|
|
129
|
+
const list = Array.isArray(requirements) ? requirements : requirements?.requirements;
|
|
130
|
+
return stepProvisionsExtendedFields(step, list);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Blocker codes that name their own remedy. Everything else stays EXTENDED_FIELD_SCHEMA_BLOCKED.
|
|
134
|
+
const EXTENDED_FIELD_BLOCKERS = {
|
|
135
|
+
CONTACTS_V5_DES_UNVERIFIED: 'The Contacts V5 Data Extension Schema path is not verified on this site. Wait until it is verified, or explicitly route the mapping to contactWriteSurface "contacts-v4" (legacy), then re-run setup. Setup does not fall back automatically.',
|
|
136
|
+
EXTENDED_FIELD_SCHEMA_CONFLICT_EXHAUSTED: 'Another change kept updating this schema while setup ran. Re-run setup once the concurrent edits stop; nothing was overwritten.',
|
|
137
|
+
'schema-budget-exceeded': 'The namespace byte budget cannot hold these fields. Route the excess fields to a CMS collection instead of extended fields, then re-run setup.',
|
|
138
|
+
'contact-extended-field-mismatch': 'A legacy contact extended field on the site does not match what the migration needs (another type or namespace, or a key different from the one an earlier run verified). Wix keys cannot change, and approving a migration action cannot repair this. Decide with the site owner how to handle the existing field; do not create a second field for the same data. Then re-run setup.',
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
// Lower-case writer codes that get their own blocker code rather than the generic one.
|
|
142
|
+
const EXTENDED_FIELD_BLOCKER_CODES = {
|
|
143
|
+
'contact-extended-field-mismatch': 'CONTACT_EXTENDED_FIELD_MISMATCH',
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
function extendedFieldBlockerCode(code) {
|
|
147
|
+
if (EXTENDED_FIELD_BLOCKER_CODES[code]) return EXTENDED_FIELD_BLOCKER_CODES[code];
|
|
148
|
+
return EXTENDED_FIELD_BLOCKERS[code] && /^[A-Z0-9_]+$/.test(code) ? code : 'EXTENDED_FIELD_SCHEMA_BLOCKED';
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async function provisionExtendedFieldsStep({ dir, wix, writers, dryRun, priorVerification = null }) {
|
|
152
|
+
const requirements = await readJsonIfExists(path.join(dir, 'setup', 'setup-requirements.json'));
|
|
153
|
+
const list = Array.isArray(requirements) ? requirements : requirements?.requirements;
|
|
154
|
+
const schemaRequirements = (list || []).filter((item) => item && item.kind === 'extendedFieldSchema');
|
|
155
|
+
if (schemaRequirements.length === 0) {
|
|
156
|
+
throw new Error('setup-requirements.json has no extendedFieldSchema requirement');
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const verifications = [];
|
|
160
|
+
for (const requirement of schemaRequirements) {
|
|
161
|
+
// Routed by the requirement's own schemaKind (DES for orders/products/contacts-v5, CRM
|
|
162
|
+
// Extended Fields for contacts-v4). Older writer fixtures expose only the DES entry point.
|
|
163
|
+
const provision = writers.provisionExtendedFieldRequirement || writers.provisionExtendedFieldSchema;
|
|
164
|
+
// eslint-disable-next-line no-await-in-loop
|
|
165
|
+
const result = await provision(wix, { requirement, dryRun, priorVerification });
|
|
166
|
+
if (result.blocking.length > 0) {
|
|
167
|
+
const first = result.blocking[0];
|
|
168
|
+
const named = EXTENDED_FIELD_BLOCKERS[first.code];
|
|
169
|
+
const where = requirement.fqdn ? `${requirement.fqdn} ${requirement.namespace}` : `${requirement.schemaKind} ${requirement.contactWriteSurface || ''}`.trim();
|
|
170
|
+
throw Object.assign(new Error(`${where}: ${first.detail}`), {
|
|
171
|
+
blockerCode: extendedFieldBlockerCode(first.code),
|
|
172
|
+
recommendedAction: named || 'Resolve the schema conflict on the destination site, or approve the migration action explicitly, then re-run setup.',
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
if (result.verification) verifications.push(result.verification);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (!dryRun) {
|
|
179
|
+
// The writer guard reads this: a value write is refused unless setup verified that field.
|
|
180
|
+
await publishAtomically(
|
|
181
|
+
path.join(dir, 'setup', 'extended-field-verification.json'),
|
|
182
|
+
`${JSON.stringify({ schemaVersion: 1, verifications }, null, 2)}\n`,
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
return verifications;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
async function runStep(step, { dir, env, wix, writers, priorExtendedFieldVerification = null }) {
|
|
189
|
+
if (step.id === 'mute-site-notifications') {
|
|
190
|
+
const state = await writers.muteSiteNotifications(wix, { reason: `RePlatform migration — ${path.basename(dir)}` });
|
|
191
|
+
if (!state?.muted) throw new Error('notification mute verification failed');
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
if (APPS[step.id]) {
|
|
195
|
+
await writers.installWixApp(wix, { appDefId: APPS[step.id], siteId: env.WIX_SITE_ID });
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (INSTALL_STEPS[step.id]) {
|
|
199
|
+
const appDefId = INSTALL_STEPS[step.id];
|
|
200
|
+
// isWixAppInstalled is optional (older writers fixtures/tests for the APPS path above
|
|
201
|
+
// don't provide it) -- fall back to an unconditional install when it's unavailable.
|
|
202
|
+
const alreadyInstalled = writers.isWixAppInstalled ? await writers.isWixAppInstalled(wix, appDefId) : false;
|
|
203
|
+
if (!alreadyInstalled) await writers.installWixApp(wix, { appDefId, siteId: env.WIX_SITE_ID });
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
if (await isExtendedFieldStep(step, dir)) {
|
|
207
|
+
await provisionExtendedFieldsStep({ dir, wix, writers, dryRun: false, priorVerification: priorExtendedFieldVerification });
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
if (step.id === 'create-cms-collections') {
|
|
211
|
+
await createCmsCollectionsStep({ dir, wix, writers });
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
if (step.id === 'stores-catalog-v3') {
|
|
215
|
+
const result = await wix.send(writers.buildGetStoresCatalogVersionRequest());
|
|
216
|
+
if (result.catalogVersion !== 'V3_CATALOG') {
|
|
217
|
+
throw Object.assign(new Error(`Catalog V3 required (got ${result.catalogVersion || 'unknown'})`), {
|
|
218
|
+
blockerCode: 'CATALOG_V1',
|
|
219
|
+
recommendedAction: 'Use a destination site provisioned with Catalog V3, or omit Stores from this migration.',
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (step.id === 'blog-fallback-author') {
|
|
225
|
+
await fallbackAuthor(dir, wix, writers);
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
if (step.intent?.writerId) {
|
|
229
|
+
const executor = writers.createWixSetupExecutor({ wixClient: wix });
|
|
230
|
+
await executor.executeSetupStep(step);
|
|
231
|
+
// A declared reference is verified through its registered read builder, once per setup target.
|
|
232
|
+
if (step.referenceKeys?.length) {
|
|
233
|
+
const read = writers[step.intent.readWriterId];
|
|
234
|
+
if (typeof read !== 'function' || !/^build(Get|Query)/.test(step.intent.readWriterId || '')) throw new Error('setup_reference_readback_missing');
|
|
235
|
+
await wix.send(read(...(step.intent.readArgs || [])));
|
|
236
|
+
}
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
throw Object.assign(new Error(`No executor implements setup step "${step.id}"`), {
|
|
240
|
+
blockerCode: 'NO_EXECUTOR_FOR_REQUIREMENT',
|
|
241
|
+
recommendedAction: 'Add an executor for this step id in execute-setup.js, or remove it from the setup plan.',
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
async function writeBlockers(setupDir, generatedAt, blockers) {
|
|
246
|
+
await fs.writeFile(
|
|
247
|
+
path.join(setupDir, 'setup-blockers.json'),
|
|
248
|
+
`${JSON.stringify({ schemaVersion: 1, generatedAt, blockers }, null, 2)}\n`,
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Writes the final file via a temp-then-rename so a crash mid-write can never leave a
|
|
253
|
+
// corrupt or partial receipt where a trusted one is expected — the rename is atomic on the
|
|
254
|
+
// same filesystem/directory.
|
|
255
|
+
async function publishAtomically(filePath, contents) {
|
|
256
|
+
const tmpPath = path.join(path.dirname(filePath), `.${path.basename(filePath)}.${crypto.randomUUID()}.tmp`);
|
|
257
|
+
await fs.writeFile(tmpPath, contents);
|
|
258
|
+
await fs.rename(tmpPath, filePath);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Core logic, independent of the CLI entry point below so tests can inject a fake
|
|
262
|
+
// `writers` module instead of making real Wix API calls. Performs every file write itself
|
|
263
|
+
// (the receipt, the blockers file) and returns a summary rather than throwing on a
|
|
264
|
+
// recognized blocker — `main()` decides how to surface that to the process exit code.
|
|
265
|
+
async function executeSetup({ dir, dryRun = false, writers = REAL_WRITERS }) {
|
|
266
|
+
const env = await readEnv(dir);
|
|
267
|
+
if (!env.WIX_SITE_ID || !env.WIX_AUTH_TOKEN) throw new Error('WIX_SITE_ID and WIX_AUTH_TOKEN are required');
|
|
268
|
+
|
|
269
|
+
const setupDir = path.join(dir, 'setup');
|
|
270
|
+
const verificationPath = path.join(setupDir, 'setup-verification.json');
|
|
271
|
+
const plan = await readJsonIfExists(path.join(setupDir, 'setup-plan.json'));
|
|
272
|
+
const generatedAt = new Date().toISOString();
|
|
273
|
+
|
|
274
|
+
// Read BEFORE the receipt is invalidated below: the legacy contacts-v4 path must prove a field's
|
|
275
|
+
// key did not change since an earlier verified run (Wix keys cannot change). Only used for that
|
|
276
|
+
// comparison, never as evidence that anything is provisioned now.
|
|
277
|
+
// Only a missing file means "no earlier run". A receipt that exists but cannot be read or
|
|
278
|
+
// parsed may hold keys a legacy contacts-v4 write already used; treating it as absent would let
|
|
279
|
+
// Find Or Create accept a different key and split old and new values across two fields.
|
|
280
|
+
let priorExtendedFieldVerification = null;
|
|
281
|
+
let priorReceiptError = null;
|
|
282
|
+
try {
|
|
283
|
+
priorExtendedFieldVerification = await readJsonIfExists(path.join(setupDir, 'extended-field-verification.json'));
|
|
284
|
+
} catch (error) {
|
|
285
|
+
priorReceiptError = error;
|
|
286
|
+
}
|
|
287
|
+
if (priorReceiptError) {
|
|
288
|
+
const declaredForPrior = await readJsonIfExists(path.join(setupDir, 'setup-requirements.json'));
|
|
289
|
+
const declaredPriorList = Array.isArray(declaredForPrior) ? declaredForPrior : declaredForPrior?.requirements;
|
|
290
|
+
const needsPriorKeys = (declaredPriorList || []).some((item) => item && item.kind === 'extendedFieldSchema' && item.schemaKind === CONTACT_V4_SCHEMA_KIND);
|
|
291
|
+
if (needsPriorKeys) {
|
|
292
|
+
const blocker = {
|
|
293
|
+
code: 'PRIOR_EXTENDED_FIELD_RECEIPT_UNREADABLE',
|
|
294
|
+
severity: 'blocker',
|
|
295
|
+
requirementId: null,
|
|
296
|
+
description: `setup/extended-field-verification.json exists but could not be read: ${String(priorReceiptError.message).slice(0, 200)}`,
|
|
297
|
+
whyBlocked: 'the legacy contact extended-field keys an earlier run verified cannot be checked, so a changed key could split contact values across two fields',
|
|
298
|
+
recommendedAction: 'Restore setup/extended-field-verification.json from the earlier run (it was left in place). Remove it only if no earlier import wrote legacy contact extended-field values. Then re-run setup.',
|
|
299
|
+
};
|
|
300
|
+
// Leave the unreadable receipt where it is for recovery; only the setup receipt is invalidated.
|
|
301
|
+
if (!dryRun) {
|
|
302
|
+
await fs.rm(verificationPath, { force: true });
|
|
303
|
+
await writeBlockers(setupDir, generatedAt, [blocker]);
|
|
304
|
+
}
|
|
305
|
+
return { ok: false, dryRun, requirements: [], blocker };
|
|
306
|
+
}
|
|
307
|
+
// DES-only runs never read prior keys, so an unreadable earlier receipt is simply replaced.
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
if (!dryRun) {
|
|
311
|
+
// Invalidate any prior receipt the instant a new live attempt begins — before we even
|
|
312
|
+
// know whether this attempt will succeed. A crash partway through this run (or a
|
|
313
|
+
// failure to reach the blocker-write below) must never leave an earlier, possibly
|
|
314
|
+
// no-longer-true success receipt sitting there looking trusted.
|
|
315
|
+
await fs.rm(verificationPath, { force: true });
|
|
316
|
+
// Same reasoning for the extended-field receipt: the writers consult it before putting a
|
|
317
|
+
// value in one of those fields, so a receipt from an earlier run must not outlive it.
|
|
318
|
+
await fs.rm(path.join(setupDir, 'extended-field-verification.json'), { force: true });
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const planShape = validatePlanShape(plan);
|
|
322
|
+
if (!planShape.ok) {
|
|
323
|
+
const blocker = {
|
|
324
|
+
code: 'INVALID_SETUP_PLAN',
|
|
325
|
+
severity: 'blocker',
|
|
326
|
+
requirementId: null,
|
|
327
|
+
description: `setup-plan.json is invalid: ${planShape.reasons.join(', ')}`,
|
|
328
|
+
whyBlocked: planShape.reasons.join(', '),
|
|
329
|
+
recommendedAction: 'Regenerate setup/setup-plan.json with a valid schemaVersion, a steps array, and unique, non-empty step ids.',
|
|
330
|
+
};
|
|
331
|
+
if (dryRun) throw new Error(blocker.description);
|
|
332
|
+
await writeBlockers(setupDir, generatedAt, [blocker]);
|
|
333
|
+
return { ok: false, dryRun: false, requirements: [], blocker };
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
const planDigest = hashArtifact(dir, path.join('setup', 'setup-plan.json'));
|
|
337
|
+
const setupRun = capabilities.startSetupRun({ projectDir: dir, siteId: env.WIX_SITE_ID, dryRun });
|
|
338
|
+
|
|
339
|
+
// A requirement nobody scheduled provisions nothing. The writers that need those fields then
|
|
340
|
+
// refuse their writes, which is safe but fails late and for a reason that points at the wrong
|
|
341
|
+
// place -- so the mismatch is caught here, where the plan and the requirements are both in hand.
|
|
342
|
+
const declared = await readJsonIfExists(path.join(dir, 'setup', 'setup-requirements.json'));
|
|
343
|
+
const declaredList = Array.isArray(declared) ? declared : declared?.requirements;
|
|
344
|
+
const needsExtendedFields = (declaredList || []).some((item) => item && item.kind === 'extendedFieldSchema');
|
|
345
|
+
const schedulesExtendedFields = ((plan && plan.steps) || []).some((step) => stepProvisionsExtendedFields(step, declaredList));
|
|
346
|
+
if (needsExtendedFields && !schedulesExtendedFields) {
|
|
347
|
+
const blocker = {
|
|
348
|
+
code: 'EXTENDED_FIELD_REQUIREMENT_UNSCHEDULED',
|
|
349
|
+
severity: 'blocker',
|
|
350
|
+
requirementId: null,
|
|
351
|
+
description: 'setup-requirements.json declares an extendedFieldSchema requirement but setup-plan.json has no provision-extended-fields step',
|
|
352
|
+
whyBlocked: 'the fields would never be provisioned, and every writer that needs them would refuse its write later in the run',
|
|
353
|
+
recommendedAction: 'Add a "provision-extended-fields" step to the setup plan, or remove the extendedFieldSchema requirement.',
|
|
354
|
+
};
|
|
355
|
+
// A dry run reports; it does not leave artifacts behind. Writing the blockers file here made
|
|
356
|
+
// `dryRun: true` mutate the project and report itself as a live run.
|
|
357
|
+
if (!dryRun) await writeBlockers(path.join(dir, 'setup'), new Date().toISOString(), [blocker]);
|
|
358
|
+
return { ok: false, dryRun, requirements: [], blocker };
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
const requirements = [];
|
|
362
|
+
let blocker = null;
|
|
363
|
+
|
|
364
|
+
for (const step of plan.steps) {
|
|
365
|
+
if (dryRun) {
|
|
366
|
+
requirements.push({ id: step.id, status: 'planned_dry_run' });
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
try {
|
|
370
|
+
const stepCapability = capabilities.bindSetupStep(setupRun, step.id);
|
|
371
|
+
const wix = writers.createWixClient({ capability: stepCapability, authToken: env.WIX_AUTH_TOKEN });
|
|
372
|
+
await runStep(step, { dir, env, wix, writers, priorExtendedFieldVerification });
|
|
373
|
+
const referenceBindings = step.referenceKeys?.length ? writers.captureSetupReferenceBindings(wix, step) : undefined;
|
|
374
|
+
requirements.push({ id: step.id, status: 'passed', ...(referenceBindings ? { referenceBindings } : {}) });
|
|
375
|
+
} catch (error) {
|
|
376
|
+
requirements.push({ id: step.id, status: 'blocked', detail: error.message });
|
|
377
|
+
blocker = {
|
|
378
|
+
code: error.blockerCode || 'UNEXPECTED_SETUP_ERROR',
|
|
379
|
+
severity: 'blocker',
|
|
380
|
+
requirementId: step.id,
|
|
381
|
+
description: error.message,
|
|
382
|
+
whyBlocked: error.message,
|
|
383
|
+
recommendedAction: error.recommendedAction || 'Investigate the underlying error and re-run setup once resolved.',
|
|
384
|
+
};
|
|
385
|
+
break; // Stop at the first failure — later steps were never attempted, not skipped.
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
if (dryRun) {
|
|
390
|
+
await fs.writeFile(
|
|
391
|
+
path.join(setupDir, 'setup-dry-run.json'),
|
|
392
|
+
`${JSON.stringify({ schemaVersion: 1, generatedAt, dryRun: true, requirements }, null, 2)}\n`,
|
|
393
|
+
);
|
|
394
|
+
return { ok: true, dryRun: true, requirements, blocker: null };
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
if (blocker) {
|
|
398
|
+
// The old receipt (if any) was already removed above, before this attempt began.
|
|
399
|
+
await writeBlockers(setupDir, generatedAt, [blocker]);
|
|
400
|
+
return { ok: false, dryRun: false, requirements, blocker };
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// Full success: every planned requirement passed. Self-check the candidate against the
|
|
404
|
+
// exact same validator the router uses before publishing it — there must be exactly one
|
|
405
|
+
// definition of "valid", shared, never re-implemented separately here.
|
|
406
|
+
const candidate = { schemaVersion: 1, generatedAt, siteId: env.WIX_SITE_ID, dryRun: false, planDigest, requirements };
|
|
407
|
+
const selfCheck = validateSetupVerification({ verification: candidate, plan, planDigest, siteId: env.WIX_SITE_ID });
|
|
408
|
+
if (!selfCheck.ok) {
|
|
409
|
+
const internalBlocker = {
|
|
410
|
+
code: 'INTERNAL_VALIDATION_FAILURE',
|
|
411
|
+
severity: 'blocker',
|
|
412
|
+
requirementId: null,
|
|
413
|
+
description: `execute-setup.js produced a receipt that failed its own validator: ${selfCheck.reasons.join(', ')}`,
|
|
414
|
+
whyBlocked: selfCheck.reasons.join(', '),
|
|
415
|
+
recommendedAction: 'This indicates a bug in execute-setup.js itself — investigate rather than retrying.',
|
|
416
|
+
};
|
|
417
|
+
await writeBlockers(setupDir, generatedAt, [internalBlocker]);
|
|
418
|
+
return { ok: false, dryRun: false, requirements, blocker: internalBlocker };
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
await writeBlockers(setupDir, generatedAt, []);
|
|
422
|
+
await publishAtomically(verificationPath, `${JSON.stringify(candidate, null, 2)}\n`);
|
|
423
|
+
return { ok: true, dryRun: false, requirements, blocker: null };
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
async function main() {
|
|
427
|
+
const dir = process.argv[2] && path.resolve(process.argv[2]);
|
|
428
|
+
if (!dir) throw new Error('Usage: execute-setup.js <projectDir> [--dry-run]');
|
|
429
|
+
const dryRun = process.argv.includes('--dry-run');
|
|
430
|
+
const result = await executeSetup({ dir, dryRun });
|
|
431
|
+
if (result.blocker) throw new Error(result.blocker.description);
|
|
432
|
+
console.log(JSON.stringify({ ok: true, dryRun }));
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
if (require.main === module) {
|
|
436
|
+
main().catch((error) => {
|
|
437
|
+
console.error(error.message);
|
|
438
|
+
process.exit(1);
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
module.exports = { executeSetup, runStep };
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: rp-execution-policy
|
|
3
|
+
description: >-
|
|
4
|
+
Applies cross-stage execution safety policy and writes the aggregate migration completion
|
|
5
|
+
artifact after all delivery-specific terminal evidence validates.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# rp-execution-policy
|
|
9
|
+
|
|
10
|
+
Use this resource for the execution approval gate and aggregate finalization.
|
|
11
|
+
|
|
12
|
+
For `awaiting_execution_approval`, present the generated execution plan, wait for the
|
|
13
|
+
required user acceptance in normal mode, and persist it in `orchestration/approvals.json`.
|
|
14
|
+
In explicit user-requested 1-click mode (`automationMode=one_click`, `source=user`), use the
|
|
15
|
+
deterministic agent approval helper only after the plan and any required code-safety review
|
|
16
|
+
validate. Then route again. A non-user-authored `one_click` value is normal interactive mode
|
|
17
|
+
and must wait for user acceptance.
|
|
18
|
+
|
|
19
|
+
## Disclosing what was read from a credential-bearing source surface
|
|
20
|
+
|
|
21
|
+
If the run read payment-gateway configuration from the source, the plan presented at the
|
|
22
|
+
approval gate must say so: that gateway configuration was read, which gateways were found, how
|
|
23
|
+
many are enabled, how many credential fields are configured, and that **no credential value was
|
|
24
|
+
retained**. The source adapter produces that line — for WordPress, `describeGatewaySummary()` in
|
|
25
|
+
`rp-source-wordpress/lib/gateway-summary.mjs`.
|
|
26
|
+
|
|
27
|
+
A run that reports "N gateways, M enabled, K credential fields present, 0 values retained" is
|
|
28
|
+
auditable. One that read the same thing silently is not, and the user approving the plan has no
|
|
29
|
+
way to tell the two apart. Never put a credential value, prefix, length or hash into the plan
|
|
30
|
+
report itself.
|
|
31
|
+
|
|
32
|
+
## Reporting the payments section of the plan
|
|
33
|
+
|
|
34
|
+
If the run imports payment records, refunds or invoice documents, build that section of the plan
|
|
35
|
+
with `lib/payments-report.js` rather than by hand. It enforces three things a hand-written summary
|
|
36
|
+
has got wrong before, and it BLOCKS the approval gate rather than printing a caveat:
|
|
37
|
+
|
|
38
|
+
- **The payment outcomes must sum to the discovered source-order population.** A report whose
|
|
39
|
+
numbers do not add up is hiding orders. The builder returns `approvable: false` with the
|
|
40
|
+
shortfall named.
|
|
41
|
+
- **Zero is a result.** Every outcome and every count is emitted even at zero, so "0 refunds
|
|
42
|
+
found" is reviewable at a glance. An implausible number is cheapest to catch here.
|
|
43
|
+
- **Candidate coverage is not writable coverage.** Orders carrying a reference-shaped value and
|
|
44
|
+
orders whose reference can be defensibly attributed are separate lines. Collapsing them
|
|
45
|
+
overstates fidelity.
|
|
46
|
+
|
|
47
|
+
The denominator must come from the run's own reconciled reads (`from: 'run-reconciled-read'`), not
|
|
48
|
+
from a prior survey. Where a survey counted differently, both numbers are shown and the
|
|
49
|
+
discrepancy must be reconciled before the pilot.
|
|
50
|
+
|
|
51
|
+
The provider inventory carries identifier, display name and enabled state only — a
|
|
52
|
+
credential-shaped field on a provider blocks the gate. The phrase "you will lose your history" is
|
|
53
|
+
prohibited: it is false for payment records, which are provider-independent.
|
|
54
|
+
|
|
55
|
+
Run:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
node skills/wix-replatform/scripts/migration-completion.js <projectDir>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
This command validates backend completion accounting and, for website delivery, the
|
|
62
|
+
frontend completion receipt. It writes `completion/migration-completion.json` atomically.
|
|
63
|
+
|
|
64
|
+
It also refuses, on **both** delivery modes, unless the run produced its post-execution
|
|
65
|
+
handoff and its execution log. A `management` run produces no website and used to require no
|
|
66
|
+
handoff at all, which is how a backend-only migration could finalize with no account of itself
|
|
67
|
+
anywhere in the project. The typed refusal reasons are:
|
|
68
|
+
|
|
69
|
+
| Reason | Meaning |
|
|
70
|
+
| --- | --- |
|
|
71
|
+
| `missing_execution_log` | no `execution-log.md`; route back to the import step that owes the chronology |
|
|
72
|
+
| `missing_post_execution_handoff` | no `execution/review/migration-handoff.json`; generate it from the final outcome record |
|
|
73
|
+
| `completion_report_missing_last_write` | the completion report records no `lastWriteAt`, so nothing can prove the handoff postdates the import |
|
|
74
|
+
| `post_execution_handoff_predates_last_write` | the handoff was generated before the run's last write — it describes the plan, not the run |
|
|
75
|
+
|
|
76
|
+
The last two compare against the completion report's own recorded last-write timestamp, never
|
|
77
|
+
a file mtime: an mtime is refreshed by a copy and proves nothing.
|
|
78
|
+
If validation fails, do not manufacture completion; route again to the module that owns the
|
|
79
|
+
missing or stale artifact.
|
|
80
|
+
|
|
81
|
+
### Entity-QA attestation gate
|
|
82
|
+
|
|
83
|
+
The same finalizer also refuses without a fresh, complete `execution/qa/entity-qa-attestation.json`
|
|
84
|
+
that matches the current `execution/completion-report.json` digest and covers every mapped
|
|
85
|
+
entity/subtype with matching counts (`rp-execute-import/SKILL.md`'s "Entity-by-entity QA"
|
|
86
|
+
section). The refusal carries `entityQa: { qaStatus, entities, recheck }`:
|
|
87
|
+
|
|
88
|
+
| `qaStatus` | Meaning | Action |
|
|
89
|
+
| --- | --- | --- |
|
|
90
|
+
| `missing` | no attestation file, it doesn't parse as JSON, its schema is invalid, there is no usable completion report to compare against, or the independent mapped-entity coverage source (`mapping/mapping-plan.json` or, for quick mode, `quick-mode/plan.json`) is unavailable | run the full entity-by-entity QA pass from `rp-execute-import`, then `scripts/entity-qa-attestation.js` |
|
|
91
|
+
| `stale` | the attestation's `completionReportDigest` does not match the report that is shipping — a later pass rewrote it | run the full entity-by-entity QA pass again, then the writer; the shipped prose treats any report change as reopening the whole review |
|
|
92
|
+
| `failed` | the attestation disagrees with the independent mapped-entity list or the report's own counts for one or more entities, named in `entityQa.entities` | dispatch a fresh Developer for the listed entities, then run the full QA pass and the writer |
|
|
93
|
+
|
|
94
|
+
A valid attestation proves import-row freshness and coverage only (`scope:
|
|
95
|
+
'import-entity-coverage'` in `migration-completion.json`) — never business setup or launch
|
|
96
|
+
readiness, and never proof the QA pass itself happened rather than a copy of the report's own
|
|
97
|
+
counts.
|
|
98
|
+
|
|
99
|
+
## Reporting coupons, currency and plan definitions
|
|
100
|
+
|
|
101
|
+
`lib/coupon-currency-plan-report.js` `buildCouponCurrencyPlanReport` renders the section and
|
|
102
|
+
decides approvability the same way `payments-report.js` does: every line with its count including
|
|
103
|
+
zero; per area `written + excluded + skipped = discovered`; exactly one currency outcome, and a
|
|
104
|
+
mismatch or multi-currency history BLOCKS as a halt; the coupon-usage surface must be named. Two
|
|
105
|
+
phrases are refused wherever they appear — "imported N coupons" (the honest headline is the
|
|
106
|
+
redeemability breakdown) and "not supported" (zero plan rows is "none found", a measured fact).
|
|
107
|
+
|
|
108
|
+
## Discovered-set status and safe refinalization
|
|
109
|
+
|
|
110
|
+
For every standard-mode finalization, build `execution/discovered-set-status.json` with `node scripts/discovered-set-status.js build <projectDir>` after the completion report, then regenerate the post-execution handoff, retain the current entity-QA attestation, and run `node scripts/migration-completion.js <projectDir>`. Missing or stale census approval, reconciliation or status is a hold; rebuild the owning artifact and obtain a fresh mapping review where required. The final receipt is version 2. Open discovered-set rows keep a complete backend at `complete_with_warnings`, and the handoff and receipt must agree.
|
|
111
|
+
|
|
112
|
+
On `reviewOnly: true`, refinalization uses the existing import outcomes. Make no Wix client, setup, codegen, import or website dispatch. Rebuild only the discovered-set status and post-execution handoff, then the aggregate completion; the writer archives the original version-1 receipt once. Any other route is held for the Import Operator. Manual work can be recorded only for a `manual-open` row, by the merchant or Cutover Operator through `node scripts/discovered-set-status.js resolve <projectDir> --census-id <id> --by merchant|cutover-operator --evidence <short non-record evidence>`. All other open outcomes require their existing mapping/import recovery path. Quick mode requires no discovered-set status.
|