@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
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
class ReadBackBudgetError extends Error {
|
|
4
|
+
constructor(reason = 'read-budget-exhausted') {
|
|
5
|
+
super(reason);
|
|
6
|
+
this.code = reason;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
class ReadBackReads {
|
|
10
|
+
constructor(client, {
|
|
11
|
+
now = () => performance.now(),
|
|
12
|
+
sleep = ms => new Promise(r => setTimeout(r, ms)),
|
|
13
|
+
budgetMs = 600000,
|
|
14
|
+
settlementMs = 60000,
|
|
15
|
+
pacingMs = 200
|
|
16
|
+
} = {}) {
|
|
17
|
+
Object.assign(this, {
|
|
18
|
+
client,
|
|
19
|
+
now,
|
|
20
|
+
sleep,
|
|
21
|
+
budgetMs,
|
|
22
|
+
settlementMs,
|
|
23
|
+
pacingMs
|
|
24
|
+
});
|
|
25
|
+
this.stats = {
|
|
26
|
+
attempts: 0,
|
|
27
|
+
timeouts: 0,
|
|
28
|
+
readMs: 0,
|
|
29
|
+
pacingMs: 0,
|
|
30
|
+
retryMs: 0,
|
|
31
|
+
settlementMs: 0
|
|
32
|
+
};
|
|
33
|
+
this.nextAt = 0;
|
|
34
|
+
this.queue = Promise.resolve();
|
|
35
|
+
this.wix = {
|
|
36
|
+
send: request => this.send(request)
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
remaining() {
|
|
40
|
+
return Math.max(0, this.budgetMs - ['readMs', 'pacingMs', 'retryMs', 'settlementMs'].reduce((n, k) => n + this.stats[k], 0));
|
|
41
|
+
}
|
|
42
|
+
async timed(kind, fn) {
|
|
43
|
+
const start = this.now();
|
|
44
|
+
try {
|
|
45
|
+
return await fn();
|
|
46
|
+
} finally {
|
|
47
|
+
this.stats[kind] += Math.max(0, this.now() - start);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async wait(ms, kind) {
|
|
51
|
+
if (ms > this.remaining()) throw new ReadBackBudgetError();
|
|
52
|
+
await this.timed(kind, () => this.sleep(ms));
|
|
53
|
+
if (this.remaining() <= 0) throw new ReadBackBudgetError();
|
|
54
|
+
}
|
|
55
|
+
async settle() {
|
|
56
|
+
if (this.settlementMs - this.stats.settlementMs < 60000) throw new ReadBackBudgetError('media-settlement-exhausted');
|
|
57
|
+
await this.wait(60000, 'settlementMs');
|
|
58
|
+
}
|
|
59
|
+
send(request) {
|
|
60
|
+
const task = this.queue.then(() => this.attempt(request));
|
|
61
|
+
this.queue = task.catch(() => {});
|
|
62
|
+
return task;
|
|
63
|
+
}
|
|
64
|
+
async attempt(request) {
|
|
65
|
+
for (let i = 0; i < 4; i++) {
|
|
66
|
+
if (this.remaining() <= 0) throw new ReadBackBudgetError();
|
|
67
|
+
const delay = Math.max(0, this.nextAt - this.now());
|
|
68
|
+
if (delay) await this.wait(delay, 'pacingMs');
|
|
69
|
+
this.stats.attempts++;
|
|
70
|
+
try {
|
|
71
|
+
const result = await this.timed('readMs', () => this.client.send(require('../resources/rp-target-wix/lib/wix-writers').buildBoundedReadRequest(request, Math.min(10000, this.remaining()))));
|
|
72
|
+
this.nextAt = this.now() + this.pacingMs;
|
|
73
|
+
return result;
|
|
74
|
+
} catch (e) {
|
|
75
|
+
this.nextAt = this.now() + this.pacingMs;
|
|
76
|
+
if (e.readTimedOut) this.stats.timeouts++;
|
|
77
|
+
if (e.status === 401 || e.status === 403) {
|
|
78
|
+
e.code = e.status === 401 ? 'auth-failed' : 'permission-denied';
|
|
79
|
+
throw e;
|
|
80
|
+
}
|
|
81
|
+
const retry = e.readTimedOut || !e.status || [429, 500, 502, 503, 504].includes(e.status) || e.status >= 200 && e.status < 300 && e.outcomeKnown === false || e.status === 404 && e.outcomeKnown === true;
|
|
82
|
+
if (!retry || i === 3) {
|
|
83
|
+
e.code ||= retry ? 'read-unavailable' : 'read-rejected';
|
|
84
|
+
throw e;
|
|
85
|
+
}
|
|
86
|
+
await this.wait(e.status === 429 && e.retryAfterMs != null ? e.retryAfterMs : 1000 * 2 ** i, 'retryMs');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
module.exports = {
|
|
92
|
+
ReadBackReads,
|
|
93
|
+
ReadBackBudgetError
|
|
94
|
+
};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const fs = require('node:fs/promises');
|
|
4
|
+
const path = require('node:path');
|
|
5
|
+
const crypto = require('node:crypto');
|
|
6
|
+
const local = require('./local-state');
|
|
7
|
+
const FILE = 'execution/read-back-gate.json';
|
|
8
|
+
async function readJson(projectDir, name, fallback) {
|
|
9
|
+
try {
|
|
10
|
+
return JSON.parse(await fs.readFile(path.join(projectDir, name), 'utf8'));
|
|
11
|
+
} catch (e) {
|
|
12
|
+
if (e.code === 'ENOENT' && fallback !== undefined) return structuredClone(fallback);
|
|
13
|
+
throw e;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async function atomic(projectDir, name, value) {
|
|
17
|
+
const file = path.join(projectDir, name),
|
|
18
|
+
temp = `${file}.${crypto.randomUUID()}.tmp`;
|
|
19
|
+
await fs.mkdir(path.dirname(file), {
|
|
20
|
+
recursive: true
|
|
21
|
+
});
|
|
22
|
+
try {
|
|
23
|
+
await fs.writeFile(temp, JSON.stringify(value, null, 2) + '\n', {
|
|
24
|
+
mode: 0o600
|
|
25
|
+
});
|
|
26
|
+
await fs.rename(temp, file);
|
|
27
|
+
} finally {
|
|
28
|
+
await fs.rm(temp, {
|
|
29
|
+
force: true
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// Use the project's existing lock. Contending local writers retry instead of losing updates.
|
|
34
|
+
const localQueues = new Map();
|
|
35
|
+
function locked(projectDir, fn) {
|
|
36
|
+
const key = path.resolve(projectDir),
|
|
37
|
+
previous = localQueues.get(key) || Promise.resolve();
|
|
38
|
+
const task = previous.catch(() => {}).then(() => acquire(projectDir, fn));
|
|
39
|
+
localQueues.set(key, task);
|
|
40
|
+
return task.finally(() => {
|
|
41
|
+
if (localQueues.get(key) === task) localQueues.delete(key);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
async function acquire(projectDir, fn) {
|
|
45
|
+
const deadline = Date.now() + 30000;
|
|
46
|
+
for (;;) {
|
|
47
|
+
try {
|
|
48
|
+
return await local.withStateLock(projectDir, fn);
|
|
49
|
+
} catch (e) {
|
|
50
|
+
if (!/state lock already held/.test(e.message) || Date.now() >= deadline) throw e;
|
|
51
|
+
await new Promise(r => setTimeout(r, crypto.randomInt(10, 40)));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function load(projectDir) {
|
|
56
|
+
let state;
|
|
57
|
+
try {
|
|
58
|
+
state = await readJson(projectDir, FILE);
|
|
59
|
+
} catch (e) {
|
|
60
|
+
if (e.code !== 'ENOENT') throw new Error('gate history unreadable', {
|
|
61
|
+
cause: e
|
|
62
|
+
});
|
|
63
|
+
const store = require('./write-verification-state');
|
|
64
|
+
let hasHistory = false;
|
|
65
|
+
const snapshot = await readJson(projectDir, 'state/write-verification.json', null);
|
|
66
|
+
if (snapshot) {
|
|
67
|
+
const recovered = await store.load(projectDir, snapshot.siteId);
|
|
68
|
+
hasHistory = Object.values(recovered.rows).some(r => r.kind === 'read-back-gate');
|
|
69
|
+
} else {
|
|
70
|
+
// An un-compacted journal also proves a gate existed.
|
|
71
|
+
let files = [];
|
|
72
|
+
try {
|
|
73
|
+
files = await fs.readdir(path.join(projectDir, 'state/write-verification-journal'));
|
|
74
|
+
} catch (err) {
|
|
75
|
+
if (err.code !== 'ENOENT') throw err;
|
|
76
|
+
}
|
|
77
|
+
for (const file of files.filter(f => f.endsWith('.json'))) {
|
|
78
|
+
const delta = await readJson(projectDir, `state/write-verification-journal/${file}`);
|
|
79
|
+
if (Object.values(delta.rows || {}).some(r => r.kind === 'read-back-gate')) hasHistory = true;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (hasHistory) throw new Error('gate history unreadable');
|
|
83
|
+
state = {
|
|
84
|
+
schemaVersion: 1,
|
|
85
|
+
observedLosses: [],
|
|
86
|
+
runs: {}
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
if (state.schemaVersion !== 1 || !Array.isArray(state.observedLosses) || !state.runs || Array.isArray(state.runs)) throw new Error('gate history unreadable');
|
|
90
|
+
return state;
|
|
91
|
+
}
|
|
92
|
+
async function update(projectDir, mutate) {
|
|
93
|
+
return locked(projectDir, async () => {
|
|
94
|
+
const state = await load(projectDir);
|
|
95
|
+
const result = await mutate(state);
|
|
96
|
+
await atomic(projectDir, FILE, state);
|
|
97
|
+
return result;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
module.exports = {
|
|
101
|
+
FILE,
|
|
102
|
+
readJson,
|
|
103
|
+
atomic,
|
|
104
|
+
locked,
|
|
105
|
+
load,
|
|
106
|
+
update
|
|
107
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const state = require('./read-back-state');
|
|
4
|
+
const FIELD_CATEGORIES = ['verified', 'changed', 'dropped', 'refused', 'unverifiable', 'guardDropped', 'notExercised'];
|
|
5
|
+
const numeric = (object, keys) => Object.fromEntries(keys.filter(key => typeof object?.[key] === 'number' && Number.isFinite(object[key])).map(key => [key, Math.max(0, object[key])]));
|
|
6
|
+
function identity(value) {
|
|
7
|
+
if (!value) return null;
|
|
8
|
+
return { userId: value.userId || null, displayName: value.displayName || null, source: value.source || null, observedAt: value.observedAt || null };
|
|
9
|
+
}
|
|
10
|
+
function acknowledgement(value) {
|
|
11
|
+
if (!value) return { status: 'pending' };
|
|
12
|
+
return { status: value.status, requestId: value.requestId || null, answeredAt: value.answeredAt || null, recordedBy: identity(value.recordedBy) };
|
|
13
|
+
}
|
|
14
|
+
function currentEntries(gate) {
|
|
15
|
+
return Object.entries(gate.runs || {}).flatMap(([runId, run]) => Object.entries(run.entities || {}).filter(([entity, item]) => !(item.supersededBy && gate.runs[item.supersededBy]?.entities?.[entity])).map(([entity, item]) => ({ runId, entity, item })));
|
|
16
|
+
}
|
|
17
|
+
function projectReadBackSummary(gate, { entity: filter } = {}) {
|
|
18
|
+
const runs = new Map();
|
|
19
|
+
let observedLossCount = 0;
|
|
20
|
+
for (const { runId, entity, item } of currentEntries(gate)) {
|
|
21
|
+
if (filter && filter !== entity) continue;
|
|
22
|
+
if (!runs.has(runId)) runs.set(runId, []);
|
|
23
|
+
if (item.gated === false) {
|
|
24
|
+
const declared = require('./read-back-gate').declaration(entity, item);
|
|
25
|
+
if (declared.gated) throw new Error('Gated entity cannot be reported as a non-gated declaration');
|
|
26
|
+
runs.get(runId).push({ ...declared, status: 'not-covered' });
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
const guardDropped = item.guardDropped || [];
|
|
30
|
+
const guardPaths = [...new Set(guardDropped.map(row => row.path).filter(Boolean))].sort();
|
|
31
|
+
const fieldCounts = Object.fromEntries(FIELD_CATEGORIES.map(kind => [kind, kind === 'guardDropped' ? guardPaths.length : new Set(item.paths?.[kind] || []).size]));
|
|
32
|
+
const losses = (gate.observedLosses || []).filter(row => row.entity === entity);
|
|
33
|
+
observedLossCount += losses.length;
|
|
34
|
+
runs.get(runId).push({
|
|
35
|
+
entity, gated: true, status: item.status, stopReason: item.stopReason || null,
|
|
36
|
+
canaryCount: item.canaries?.length || 0, endOfRunVerified: item.endOfRunVerified === true,
|
|
37
|
+
fieldCounts, observedPathCounts: fieldCounts,
|
|
38
|
+
guardDropped: { recordCount: new Set(guardDropped.map(row => row.sourceId)).size, paths: guardPaths },
|
|
39
|
+
observedLossCount: losses.length,
|
|
40
|
+
approvedOmissions: (item.approvedOmissions || []).map(row => ({ path: row.path, kind: row.kind, recordCount: row.recordCount, approvedBy: identity(row.approvedBy), merchantAcknowledgement: acknowledgement(row.merchantAcknowledgement) })),
|
|
41
|
+
pendingSettlementCount: (item.settlements || []).filter(row => row.status !== 'passed').length,
|
|
42
|
+
timing: numeric(item.timing, ['elapsedMs', 'preparationMs', 'writeMs', 'activeReadMs']),
|
|
43
|
+
retryStats: numeric(item.retryStats, ['attempts', 'timeouts', 'readMs', 'pacingMs', 'retryMs', 'settlementMs', 'remainingMs'])
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
return { schemaVersion: 1, status: runs.size ? 'recorded' : 'not-run', observedLossCount, runs: [...runs].map(([runId, entities]) => ({ runId, entities: entities.sort((a, b) => a.entity.localeCompare(b.entity)) })) };
|
|
47
|
+
}
|
|
48
|
+
async function recordDeclaration(projectDir, runId, entity, options) {
|
|
49
|
+
const declared = require('./read-back-gate').declaration(entity, options);
|
|
50
|
+
if (declared.gated) throw new Error('Gated entity requires ReadBackGate; a declaration cannot bypass it');
|
|
51
|
+
if (typeof runId !== 'string' || !runId.trim() || typeof entity !== 'string' || !entity.trim()) throw new Error('Declaration requires run and entity');
|
|
52
|
+
return state.update(projectDir, gate => {
|
|
53
|
+
// Never overwrite earlier gate evidence, including a stopped or superseded row.
|
|
54
|
+
const history = Object.values(gate.runs).flatMap(run => Object.entries(run.entities || {})).filter(([name]) => name === entity);
|
|
55
|
+
if (history.some(([, item]) => item.gated !== false || item.status !== 'not-covered')) throw new Error('Declaration cannot replace existing gate history');
|
|
56
|
+
for (const [previousId, previous] of Object.entries(gate.runs)) {
|
|
57
|
+
if (previousId !== runId && Object.hasOwn(previous.entities || {}, entity)) previous.entities[entity].supersededBy = runId;
|
|
58
|
+
}
|
|
59
|
+
const run = Object.hasOwn(gate.runs, runId) ? gate.runs[runId] : { entities: {} };
|
|
60
|
+
gate.runs = { ...gate.runs, [runId]: { ...run, entities: { ...run.entities, [entity]: { ...declared, status: 'not-covered' } } } };
|
|
61
|
+
return declared;
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function renderReadBackSummary(summary) {
|
|
65
|
+
const lines = ['', '## Read-Back Verification', '', `- Status: ${summary.status}.`];
|
|
66
|
+
for (const run of summary.runs) for (const item of run.entities) {
|
|
67
|
+
lines.push('', `### ${item.entity} (${run.runId})`, '');
|
|
68
|
+
if (!item.gated) {
|
|
69
|
+
lines.push(`- Outside the four-entity field gate; verification: ${item.verificationKind}; reason: ${item.reason}.`);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
lines.push(`- Gate: ${item.status}; final record verified: ${item.endOfRunVerified ? 'yes' : 'no'}${item.stopReason ? `; reason: ${item.stopReason}` : ''}.`);
|
|
73
|
+
lines.push(`- Field counts: ${Object.entries(item.fieldCounts).map(([key, value]) => `${key}: ${value}`).join('; ')}.`);
|
|
74
|
+
lines.push(`- Guard-dropped: ${item.guardDropped.recordCount} records; ${item.guardDropped.paths.length} paths. Pending settlements: ${item.pendingSettlementCount}.`);
|
|
75
|
+
lines.push(`- Timing: ${Object.entries(item.timing).map(([key, value]) => `${key}: ${value} ms`).join('; ') || 'not recorded'}.`);
|
|
76
|
+
lines.push(`- Read activity: ${Object.entries(item.retryStats).map(([key, value]) => `${key}: ${value}`).join('; ') || 'not recorded'}.`);
|
|
77
|
+
for (const omission of item.approvedOmissions) lines.push(`- Approved omission: ${omission.path} (${omission.kind}, ${omission.recordCount == null ? 'unknown' : omission.recordCount} records); approved by ${omission.approvedBy?.displayName || 'not recorded'} (${omission.approvedBy?.userId || 'no stable id'}); merchant acknowledgement: ${omission.merchantAcknowledgement.status}.`);
|
|
78
|
+
}
|
|
79
|
+
return lines;
|
|
80
|
+
}
|
|
81
|
+
module.exports = { FIELD_CATEGORIES, currentEntries, projectReadBackSummary, recordDeclaration, renderReadBackSummary };
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// What happens when a rerun's update collides with a change somebody
|
|
4
|
+
// made in Wix since the previous import.
|
|
5
|
+
//
|
|
6
|
+
// The whole point of this module is that it CANNOT resolve a conflict on its own. There is no
|
|
7
|
+
// "fetch the latest revision and retry" function here, deliberately: that is the one behaviour
|
|
8
|
+
// is forbidden outright, because it silently overwrites a merchant's own edit with source
|
|
9
|
+
// data and leaves no trace that a decision was ever made. Every path out of a conflict runs
|
|
10
|
+
// through a recorded user answer, including in one-click mode.
|
|
11
|
+
|
|
12
|
+
const crypto = require('node:crypto');
|
|
13
|
+
|
|
14
|
+
// Do not label every HTTP 409 or validation/auth error a revision conflict. A 409 on this
|
|
15
|
+
// platform also means ALREADY_EXISTS (product tags) and other non-revision states, so the code
|
|
16
|
+
// is what classifies, not the status.
|
|
17
|
+
//
|
|
18
|
+
// ONLY live-observed codes belong here. `INVALID_REVISION` is the one this repo has actually
|
|
19
|
+
// seen: a real 409 INVALID_REVISION from addDeliveryRegion on a stale
|
|
20
|
+
// delivery-profile revision, and wix-writers.js:2859 documents it. Codes for Products v3 and
|
|
21
|
+
// Contacts v5 conflicts have NOT been observed, so they are deliberately absent rather than
|
|
22
|
+
// guessed — a guessed allowlist is untestable (every test would feed it a code it already
|
|
23
|
+
// contains) and silently downgrades a real conflict to an ordinary failure.
|
|
24
|
+
//
|
|
25
|
+
// Two things make an incomplete list safe rather than catastrophic:
|
|
26
|
+
// 1. `revisionConflictCodes` is injectable, so the entity's declared classification (the accepted mapping declares a
|
|
27
|
+
// conflict-error classification per entity) drives it.
|
|
28
|
+
// 2. An UNRECOGNIZED failure on a revision-carrying update is classified
|
|
29
|
+
// `possible_revision_conflict`, never `other`. It goes to a human instead of being
|
|
30
|
+
// swallowed. That is the fail-safe for exactly the case a test cannot predict.
|
|
31
|
+
const OBSERVED_REVISION_CONFLICT_CODES = new Set(['INVALID_REVISION']);
|
|
32
|
+
|
|
33
|
+
// Kept as the historical export name; now sourced from the observed set only.
|
|
34
|
+
const REVISION_CONFLICT_CODES = OBSERVED_REVISION_CONFLICT_CODES;
|
|
35
|
+
|
|
36
|
+
const CONFLICT_CHOICES = new Set(['override', 'keep']);
|
|
37
|
+
|
|
38
|
+
// Enforcement, not documentation. "Each entity needs a verified update
|
|
39
|
+
// operation and conflict protection; if either is unavailable, report the changed record for
|
|
40
|
+
// review rather than overwriting it through its create/import operation."
|
|
41
|
+
//
|
|
42
|
+
// Orders are named explicitly because the failure mode is silent data loss, and live evidence
|
|
43
|
+
// recorded it: Update Order exposes a restricted field set with no general revision
|
|
44
|
+
// parameter, and re-sending Import Order with the same id REPLACES the whole body, clearing
|
|
45
|
+
// omitted fields. A future importer must not be able to route a changed order through this flow
|
|
46
|
+
// just because the prose said not to.
|
|
47
|
+
const UPDATE_DENIED_ENTITIES = new Map([
|
|
48
|
+
['ecom/order', 'Update Order exposes a restricted field set and no general revision parameter, and a same-id Import Order is an unguarded whole-body replacement that clears omitted fields. Report the changed order for review.'],
|
|
49
|
+
['ecom/order-line-item', 'Written through the parent order, which has no revision-protected update path.'],
|
|
50
|
+
['ecom/order-line-item-options', 'Written through the parent order, which has no revision-protected update path.'],
|
|
51
|
+
['ecom/order-applied-discount', 'Written through the parent order, which has no revision-protected update path.'],
|
|
52
|
+
['ecom/order-merchant-note', 'Written through the parent order, which has no revision-protected update path.'],
|
|
53
|
+
['ecom/order-refund', 'Written through the parent order, which has no revision-protected update path.'],
|
|
54
|
+
]);
|
|
55
|
+
|
|
56
|
+
// `declaredUpdateWriters` comes from the accepted mapping: { 'stores/product': { writerId,
|
|
57
|
+
// revisionParam } }. An entity absent from it has no verified update path as far as this run is
|
|
58
|
+
// concerned, which is a review outcome — never a create/import fallback.
|
|
59
|
+
function updateSupportFor(entityRef, { declaredUpdateWriters = {} } = {}) {
|
|
60
|
+
if (!entityRef || typeof entityRef !== 'string') {
|
|
61
|
+
return { supported: false, action: 'report_for_review', reason: 'no_entity_ref' };
|
|
62
|
+
}
|
|
63
|
+
if (UPDATE_DENIED_ENTITIES.has(entityRef)) {
|
|
64
|
+
return {
|
|
65
|
+
supported: false,
|
|
66
|
+
action: 'report_for_review',
|
|
67
|
+
reason: 'update_path_unsafe_for_entity',
|
|
68
|
+
detail: UPDATE_DENIED_ENTITIES.get(entityRef),
|
|
69
|
+
neverFallBackToCreate: true,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const declared = declaredUpdateWriters[entityRef];
|
|
73
|
+
if (!declared || !declared.writerId) {
|
|
74
|
+
return { supported: false, action: 'report_for_review', reason: 'no_verified_update_writer' };
|
|
75
|
+
}
|
|
76
|
+
if (!declared.revisionParam) {
|
|
77
|
+
// A verified writer with no revision parameter has no conflict protection, which is
|
|
78
|
+
// required alongside the writer itself.
|
|
79
|
+
return { supported: false, action: 'report_for_review', reason: 'no_conflict_protection' };
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
supported: true,
|
|
83
|
+
action: 'update',
|
|
84
|
+
writerId: declared.writerId,
|
|
85
|
+
revisionParam: declared.revisionParam,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function errorCodeOf(error) {
|
|
90
|
+
if (!error || typeof error !== 'object') {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
const details = error.details || (error.body && error.body.details) || {};
|
|
94
|
+
const applicationError = details.applicationError || {};
|
|
95
|
+
return (
|
|
96
|
+
applicationError.code
|
|
97
|
+
|| error.code
|
|
98
|
+
|| (error.body && error.body.code)
|
|
99
|
+
|| null
|
|
100
|
+
);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function httpStatusOf(error) {
|
|
104
|
+
if (!error || typeof error !== 'object') {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
return error.status ?? error.httpStatus ?? error.statusCode ?? null;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// Returns the classification only — never a remedy.
|
|
111
|
+
//
|
|
112
|
+
// `entityConflictCodes` lets the accepted mapping declare this entity's real conflict codes
|
|
113
|
+
// (declared per entity in the accepted mapping). `sentRevision` says whether the failed call actually carried a revision: when it did,
|
|
114
|
+
// an unrecognized failure that could plausibly be a concurrency error becomes
|
|
115
|
+
// `possible_revision_conflict` and goes to a human, because classifying it `other` would skip
|
|
116
|
+
// the override/keep flow that is the whole point of this flow.
|
|
117
|
+
function classifyUpdateError(error, { entityConflictCodes = null, sentRevision = false } = {}) {
|
|
118
|
+
const code = errorCodeOf(error);
|
|
119
|
+
const status = httpStatusOf(error);
|
|
120
|
+
const upper = code ? String(code).toUpperCase() : null;
|
|
121
|
+
const known = new Set([
|
|
122
|
+
...OBSERVED_REVISION_CONFLICT_CODES,
|
|
123
|
+
...(Array.isArray(entityConflictCodes) ? entityConflictCodes.map((c) => String(c).toUpperCase()) : []),
|
|
124
|
+
]);
|
|
125
|
+
if (upper && known.has(upper)) {
|
|
126
|
+
return { kind: 'revision_conflict', code, httpStatus: status, matchedBy: OBSERVED_REVISION_CONFLICT_CODES.has(upper) ? 'observed' : 'declared' };
|
|
127
|
+
}
|
|
128
|
+
if (status === 401 || status === 403) {
|
|
129
|
+
return { kind: 'auth', code, httpStatus: status };
|
|
130
|
+
}
|
|
131
|
+
if (status === 404) {
|
|
132
|
+
return { kind: 'not_found', code, httpStatus: status };
|
|
133
|
+
}
|
|
134
|
+
// A 409 on a revision-carrying update is the ambiguous case the allowlist cannot settle. It is
|
|
135
|
+
// NOT auto-treated as a conflict (that would let a real ALREADY_EXISTS drive an override), and
|
|
136
|
+
// NOT dropped to `other` either. It is surfaced for review with its real code intact.
|
|
137
|
+
if (status === 409 && sentRevision) {
|
|
138
|
+
return {
|
|
139
|
+
kind: 'possible_revision_conflict',
|
|
140
|
+
code,
|
|
141
|
+
httpStatus: status,
|
|
142
|
+
needsHumanClassification: true,
|
|
143
|
+
note: 'A 409 on a revision-carrying update whose code is not in the observed or declared conflict list. Do not auto-retry; classify it, then add the code to the entity\'s declared conflict codes.',
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
if (status === 400 || status === 422 || status === 428) {
|
|
147
|
+
return { kind: 'validation', code, httpStatus: status };
|
|
148
|
+
}
|
|
149
|
+
// Everything else keeps its real API error and stays an ordinary failure.
|
|
150
|
+
return { kind: 'other', code, httpStatus: status };
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function stableStringify(value) {
|
|
154
|
+
if (value === null || typeof value !== 'object') {
|
|
155
|
+
return JSON.stringify(value ?? null);
|
|
156
|
+
}
|
|
157
|
+
if (Array.isArray(value)) {
|
|
158
|
+
return `[${value.map(stableStringify).join(',')}]`;
|
|
159
|
+
}
|
|
160
|
+
return `{${Object.keys(value).sort().map((k) => `${JSON.stringify(k)}:${stableStringify(value[k])}`).join(',')}}`;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
function fingerprint(parts) {
|
|
164
|
+
return crypto.createHash('sha256').update(stableStringify(parts)).digest('hex').slice(0, 32);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// What the user is shown. Identity, the real error, both revisions, the source version, and
|
|
168
|
+
// the fields that would change — including whole-array replacements, which are the ones most
|
|
169
|
+
// likely to destroy Wix-only data (for Products, arrays require complete intended
|
|
170
|
+
// contents).
|
|
171
|
+
function buildConflictReview({
|
|
172
|
+
sourceStableKey,
|
|
173
|
+
targetId,
|
|
174
|
+
entity,
|
|
175
|
+
error,
|
|
176
|
+
savedTargetRevision = null,
|
|
177
|
+
currentTargetRevision = null,
|
|
178
|
+
sourceVersion = null,
|
|
179
|
+
sourceHash = null,
|
|
180
|
+
proposedFields = {},
|
|
181
|
+
currentTargetValues = {},
|
|
182
|
+
entityConflictCodes = null,
|
|
183
|
+
sentRevision = true,
|
|
184
|
+
} = {}) {
|
|
185
|
+
if (!sourceStableKey || !targetId) {
|
|
186
|
+
throw new Error('buildConflictReview: sourceStableKey and targetId are required');
|
|
187
|
+
}
|
|
188
|
+
// A review is only ever built for a call that carried a revision, so sentRevision defaults true.
|
|
189
|
+
const classification = classifyUpdateError(error, { entityConflictCodes, sentRevision });
|
|
190
|
+
const changes = [];
|
|
191
|
+
for (const key of Object.keys(proposedFields).sort()) {
|
|
192
|
+
const to = proposedFields[key];
|
|
193
|
+
const from = currentTargetValues[key];
|
|
194
|
+
const replacesArray = Array.isArray(to);
|
|
195
|
+
if (stableStringify(from) === stableStringify(to)) {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
changes.push({
|
|
199
|
+
field: key,
|
|
200
|
+
currentWixValue: from,
|
|
201
|
+
proposedValue: to,
|
|
202
|
+
// Flagged because an array write is a replacement, not a merge: anything present in Wix
|
|
203
|
+
// and absent from `to` disappears.
|
|
204
|
+
replacesEntireArray: replacesArray,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
const review = {
|
|
208
|
+
entity: entity || null,
|
|
209
|
+
sourceStableKey,
|
|
210
|
+
targetId,
|
|
211
|
+
classification,
|
|
212
|
+
error: {
|
|
213
|
+
code: classification.code,
|
|
214
|
+
httpStatus: classification.httpStatus,
|
|
215
|
+
message: (error && (error.message || error.msg)) || null,
|
|
216
|
+
},
|
|
217
|
+
savedTargetRevision: savedTargetRevision || null,
|
|
218
|
+
reviewedTargetRevision: currentTargetRevision || null,
|
|
219
|
+
sourceVersion: sourceVersion ?? null,
|
|
220
|
+
sourceHash: sourceHash ?? null,
|
|
221
|
+
changes,
|
|
222
|
+
// Approval binds to the source values, the proposed writes AND the reviewed Wix
|
|
223
|
+
// revision together. Any of the three moving invalidates it.
|
|
224
|
+
bindingFingerprint: fingerprint({
|
|
225
|
+
sourceStableKey,
|
|
226
|
+
targetId,
|
|
227
|
+
sourceVersion: sourceVersion ?? null,
|
|
228
|
+
sourceHash: sourceHash ?? null,
|
|
229
|
+
proposedFields,
|
|
230
|
+
reviewedTargetRevision: currentTargetRevision || null,
|
|
231
|
+
}),
|
|
232
|
+
};
|
|
233
|
+
return review;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Record the user's answer. `choice` is asked once for the presented record, never per
|
|
237
|
+
// field. No answer at all is not modelled here on purpose — an unanswered conflict stays
|
|
238
|
+
// unresolved, which is the absence of a record rather than a third choice.
|
|
239
|
+
function recordConflictDecision({ review, choice, decidedBy = null, decidedAt = null } = {}) {
|
|
240
|
+
if (!review || !review.bindingFingerprint) {
|
|
241
|
+
throw new Error('recordConflictDecision: a review from buildConflictReview is required');
|
|
242
|
+
}
|
|
243
|
+
if (!CONFLICT_CHOICES.has(choice)) {
|
|
244
|
+
throw new Error(`recordConflictDecision: choice must be one of ${Array.from(CONFLICT_CHOICES).join(', ')}`);
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
kind: 'rerun_conflict_decision',
|
|
248
|
+
choice,
|
|
249
|
+
sourceStableKey: review.sourceStableKey,
|
|
250
|
+
targetId: review.targetId,
|
|
251
|
+
entity: review.entity,
|
|
252
|
+
sourceVersion: review.sourceVersion,
|
|
253
|
+
sourceHash: review.sourceHash,
|
|
254
|
+
reviewedTargetRevision: review.reviewedTargetRevision,
|
|
255
|
+
bindingFingerprint: review.bindingFingerprint,
|
|
256
|
+
decidedBy: decidedBy || null,
|
|
257
|
+
decidedAt: decidedAt || null,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// An approval authorizes exactly the write that was reviewed. Re-checked immediately before
|
|
262
|
+
// the retry — if the source changed again, or Wix moved again, or the proposed body differs, the
|
|
263
|
+
// answer no longer applies and the user is asked again.
|
|
264
|
+
function approvalApplies({ decision, review } = {}) {
|
|
265
|
+
if (!decision || !review) {
|
|
266
|
+
return { applies: false, reason: 'missing_decision_or_review' };
|
|
267
|
+
}
|
|
268
|
+
if (decision.sourceStableKey !== review.sourceStableKey || decision.targetId !== review.targetId) {
|
|
269
|
+
return { applies: false, reason: 'different_record' };
|
|
270
|
+
}
|
|
271
|
+
if (decision.bindingFingerprint !== review.bindingFingerprint) {
|
|
272
|
+
return { applies: false, reason: 'reviewed_state_changed' };
|
|
273
|
+
}
|
|
274
|
+
return { applies: true, reason: 'binding_matches', choice: decision.choice };
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// The override write plan. It uses the revision the user actually reviewed — never an
|
|
278
|
+
// omitted revision, and never a freshly fetched one the user never saw.
|
|
279
|
+
function buildOverrideWritePlan({ decision, review } = {}) {
|
|
280
|
+
const check = approvalApplies({ decision, review });
|
|
281
|
+
if (!check.applies) {
|
|
282
|
+
return { ok: false, reason: check.reason, askAgain: true };
|
|
283
|
+
}
|
|
284
|
+
if (decision.choice !== 'override') {
|
|
285
|
+
return { ok: false, reason: 'not_an_override_decision', askAgain: false };
|
|
286
|
+
}
|
|
287
|
+
if (!review.reviewedTargetRevision) {
|
|
288
|
+
// Without a reviewed revision there is nothing to write against, and omitting the revision
|
|
289
|
+
// is exactly the unguarded overwrite this flow forbids.
|
|
290
|
+
return { ok: false, reason: 'no_reviewed_revision', askAgain: true };
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
ok: true,
|
|
294
|
+
targetId: review.targetId,
|
|
295
|
+
revision: review.reviewedTargetRevision,
|
|
296
|
+
fields: review.changes.reduce((acc, change) => {
|
|
297
|
+
acc[change.field] = change.proposedValue;
|
|
298
|
+
return acc;
|
|
299
|
+
}, {}),
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// A keep-Wix answer is remembered against the exact source change and the exact Wix
|
|
304
|
+
// state that were reviewed — and it lives in the recovery log, NOT as a crosswalk baseline,
|
|
305
|
+
// because the source version was never applied to Wix. Reusing it more broadly would silently
|
|
306
|
+
// swallow a later, different change.
|
|
307
|
+
function keepDecisionApplies({ decision, sourceVersion = null, sourceHash = null, currentTargetRevision = null } = {}) {
|
|
308
|
+
if (!decision || decision.choice !== 'keep') {
|
|
309
|
+
return { applies: false, reason: 'not_a_keep_decision' };
|
|
310
|
+
}
|
|
311
|
+
const sameSourceChange = stableStringify(decision.sourceVersion ?? null) === stableStringify(sourceVersion ?? null)
|
|
312
|
+
&& stableStringify(decision.sourceHash ?? null) === stableStringify(sourceHash ?? null);
|
|
313
|
+
if (!sameSourceChange) {
|
|
314
|
+
return { applies: false, reason: 'new_source_change' };
|
|
315
|
+
}
|
|
316
|
+
if (stableStringify(decision.reviewedTargetRevision ?? null) !== stableStringify(currentTargetRevision ?? null)) {
|
|
317
|
+
return { applies: false, reason: 'wix_changed_again' };
|
|
318
|
+
}
|
|
319
|
+
return { applies: true, reason: 'same_source_change_and_wix_state' };
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
module.exports = {
|
|
323
|
+
REVISION_CONFLICT_CODES,
|
|
324
|
+
OBSERVED_REVISION_CONFLICT_CODES,
|
|
325
|
+
UPDATE_DENIED_ENTITIES,
|
|
326
|
+
updateSupportFor,
|
|
327
|
+
CONFLICT_CHOICES,
|
|
328
|
+
classifyUpdateError,
|
|
329
|
+
buildConflictReview,
|
|
330
|
+
recordConflictDecision,
|
|
331
|
+
approvalApplies,
|
|
332
|
+
buildOverrideWritePlan,
|
|
333
|
+
keepDecisionApplies,
|
|
334
|
+
};
|