@wix/agent-skills 1.33.0 → 1.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- package/package.json +2 -2
- package/skills/wix-app/references/DASHBOARD_PAGE.md +1 -1
- package/skills/wix-export/SKILL.md +83 -0
- package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
- package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
- package/skills/wix-harmony-editor/SKILL.md +317 -0
- package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
- package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
- package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
- package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
- package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
- package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
- package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
- package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
- package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
- package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
- package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
- package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
- package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
- package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
- package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
- package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
- package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
- package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
- package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
- package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
- package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
- package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
- package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
- package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
- package/skills/wix-headless/SKILL.md +7 -2
- package/skills/wix-headless/references/CAPABILITIES.md +6 -1
- package/skills/wix-headless/references/DISCOVERY.md +2 -1
- package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
- package/skills/wix-headless/references/SEED.md +3 -2
- package/skills/wix-headless/references/SETUP.md +1 -0
- package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
- package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
- package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
- package/skills/wix-headless/references/managed/CREATE.md +1 -1
- package/skills/wix-headless-kit/SKILL.md +110 -21
- package/skills/wix-headless-kit/guides/api-run.md +15 -13
- package/skills/wix-headless-kit/guides/existing-site.md +31 -0
- package/skills/wix-headless-kit/guides/migration.md +49 -17
- package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
- package/skills/wix-headless-kit/install/context.mjs +61 -6
- package/skills/wix-headless-kit/install/pins.json +1 -1
- package/skills/wix-headless-kit/install/setup.mjs +107 -12
- package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
- package/skills/wix-headless-replatform/SKILL.md +116 -0
- package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
- package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
- package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
- package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
- package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
- package/skills/wix-headless-replatform/references/output-contract.md +93 -0
- package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
- package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
- package/skills/wix-headless-replatform/references/safety.md +19 -0
- package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
- package/skills/wix-headless-replatform/references/workflow.md +157 -0
- package/skills/wix-headless-replatform/registry/README.md +20 -0
- package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
- package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
- package/skills/wix-headless-replatform/registry/registry.json +36 -0
- package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
- package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
- package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
- package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
- package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
- package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
- package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
- package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
- package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
- package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
- package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
- package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
- package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
- package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
- package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
- package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
- package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
- package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
- package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
- package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
- package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
- package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
- package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
- package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
- package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
- package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
- package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
- package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
- package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
- package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
- package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
- package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
- package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
- package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
- package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
- package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
- package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
- package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
- package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
- package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
- package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
- package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
- package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
- package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
- package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
- package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
- package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
- package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
- package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
- package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
- package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
- package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
- package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
- package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
- package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
- package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
- package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
- package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
- package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
- package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
- package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
- package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
- package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
- package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
- package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
- package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
- package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
- package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
- package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
- package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
- package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
- package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
- package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
- package/skills/wix-import/SKILL.md +90 -0
- package/skills/wix-manage/SKILL.md +38 -10
- package/skills/wix-manage/references/automations/actions.md +11 -11
- package/skills/wix-manage/references/automations/activation-status.md +6 -9
- package/skills/wix-manage/references/automations/api-catalog.md +48 -32
- package/skills/wix-manage/references/automations/automation-model.md +97 -22
- package/skills/wix-manage/references/automations/bracket-expressions.md +7 -7
- package/skills/wix-manage/references/automations/build-and-manage-automations.md +140 -309
- package/skills/wix-manage/references/automations/conditions.md +187 -0
- package/skills/wix-manage/references/automations/schemas-and-scheduling.md +191 -0
- package/skills/wix-manage/references/automations/special-actions.md +210 -0
- package/skills/wix-manage/references/automations/triggers.md +47 -10
- package/skills/wix-manage/references/automations/validation-and-verification.md +320 -0
- package/skills/wix-manage/references/custom-apps/use-app-tools.md +124 -0
- package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
- package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
- package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
- package/skills/wix-manage/references/events/create-wix-event.md +136 -73
- package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
- package/skills/wix-manage/references/events/manage-event-guests.md +366 -0
- package/skills/wix-manage/references/events/manage-event-tickets.md +293 -0
- package/skills/wix-manage/references/events/manage-wix-events.md +313 -55
- package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
- package/skills/wix-manage/references/sites/upload-static-site.md +127 -8
- package/skills/wix-manage/references/stores/update-product-with-options.md +58 -2
- package/skills/wix-replatform/.publish-manifest.json +5 -5
- package/skills/wix-replatform/CLI.md +162 -0
- package/skills/wix-replatform/README.md +52 -0
- package/skills/wix-replatform/SKILL.md +229 -684
- package/skills/wix-replatform/console/account.css +1 -0
- package/skills/wix-replatform/console/app.css +1 -0
- package/skills/wix-replatform/console/app.js +117 -0
- package/skills/wix-replatform/console/index.html +4 -0
- package/skills/wix-replatform/console/json.css +11 -0
- package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
- package/skills/wix-replatform/lib/app-page-routing.js +75 -0
- package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
- package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
- package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
- package/skills/wix-replatform/lib/completion-report.js +1393 -13
- package/skills/wix-replatform/lib/config-env.js +85 -11
- package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
- package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
- package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
- package/skills/wix-replatform/lib/destination-choice.js +163 -0
- package/skills/wix-replatform/lib/destination-handoff.js +62 -0
- package/skills/wix-replatform/lib/destination-http.js +81 -0
- package/skills/wix-replatform/lib/destination-route.js +98 -0
- package/skills/wix-replatform/lib/destination.js +919 -0
- package/skills/wix-replatform/lib/discovered-census.js +231 -0
- package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
- package/skills/wix-replatform/lib/document-url-guard.js +203 -0
- package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
- package/skills/wix-replatform/lib/entity-verification.js +18 -0
- package/skills/wix-replatform/lib/execution-capability.js +120 -0
- package/skills/wix-replatform/lib/execution-log.js +170 -0
- package/skills/wix-replatform/lib/execution-manifest.js +20 -2
- package/skills/wix-replatform/lib/execution-state.js +22 -0
- package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
- package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
- package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
- package/skills/wix-replatform/lib/import-recovery.js +800 -6
- package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
- package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
- package/skills/wix-replatform/lib/link-audit.js +173 -0
- package/skills/wix-replatform/lib/link-census.js +194 -0
- package/skills/wix-replatform/lib/link-plan.js +148 -0
- package/skills/wix-replatform/lib/link-verification.js +274 -0
- package/skills/wix-replatform/lib/link-write-journal.js +42 -0
- package/skills/wix-replatform/lib/local-state.js +869 -30
- package/skills/wix-replatform/lib/member-completion.js +658 -0
- package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
- package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
- package/skills/wix-replatform/lib/migration-completion.js +311 -0
- package/skills/wix-replatform/lib/operator-identity.js +47 -0
- package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
- package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
- package/skills/wix-replatform/lib/orchestration-router.js +608 -32
- package/skills/wix-replatform/lib/orchestration-state.js +188 -12
- package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
- package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
- package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
- package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
- package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
- package/skills/wix-replatform/lib/progress-log.js +19 -3
- package/skills/wix-replatform/lib/read-back-approval.js +184 -0
- package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
- package/skills/wix-replatform/lib/read-back-contract.js +243 -0
- package/skills/wix-replatform/lib/read-back-extract.js +118 -0
- package/skills/wix-replatform/lib/read-back-gate.js +734 -0
- package/skills/wix-replatform/lib/read-back-reads.js +94 -0
- package/skills/wix-replatform/lib/read-back-state.js +107 -0
- package/skills/wix-replatform/lib/read-back-summary.js +81 -0
- package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
- package/skills/wix-replatform/lib/run-controller.js +401 -0
- package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
- package/skills/wix-replatform/lib/setup-verification.js +148 -0
- package/skills/wix-replatform/lib/source-access.js +231 -0
- package/skills/wix-replatform/lib/source-coverage.js +1130 -0
- package/skills/wix-replatform/lib/source-secrets.js +277 -0
- package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
- package/skills/wix-replatform/lib/task-state.js +110 -0
- package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
- package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
- package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
- package/skills/wix-replatform/lib/url-verification.js +315 -0
- package/skills/wix-replatform/lib/user-action-effects.js +42 -0
- package/skills/wix-replatform/lib/user-actions.js +264 -0
- package/skills/wix-replatform/lib/website-handoff.js +1220 -0
- package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
- package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
- package/skills/wix-replatform/lib/write-verification-state.js +92 -0
- package/skills/wix-replatform/lib/write-verification.js +274 -0
- package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
- package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
- package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
- package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
- package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
- package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
- package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
- package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
- package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
- package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
- package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
- package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
- package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
- package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
- package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
- package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
- package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
- package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
- package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
- package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
- package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
- package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
- package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
- package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
- package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
- package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
- package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
- package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
- package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
- package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
- package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
- package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
- package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
- package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
- package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
- package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
- package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
- package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
- package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
- package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
- package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
- package/skills/wix-replatform/scripts/discovered-census.js +26 -0
- package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
- package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
- package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
- package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
- package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
- package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
- package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
- package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
- package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
- package/skills/wix-replatform/scripts/migration-completion.js +76 -0
- package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
- package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
- package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
- package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
- package/skills/wix-replatform/scripts/replatform-console.js +146 -0
- package/skills/wix-replatform/scripts/replatform.js +436 -0
- package/skills/wix-replatform/scripts/source-secrets.js +77 -0
- package/skills/wix-replatform/scripts/url-redirects.js +286 -0
- package/skills/wix-replatform/scripts/user-action.js +58 -0
- package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
- package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
- package/skills/wix-replatform/scripts/wix-destination.js +143 -0
- package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
- package/skills/wix-vibe-headless/SKILL.md +7 -3
- package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
- package/skills/wix-vibe-headless/platforms/base44.md +1 -0
- package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
- package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
- package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
- package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
- package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
- package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
- package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
- package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
- package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +0 -208
- package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
|
@@ -11,11 +11,19 @@ const CLASSIFICATIONS = new Set([
|
|
|
11
11
|
'setup-config',
|
|
12
12
|
'skip-by-default',
|
|
13
13
|
'unsupported-native-gap',
|
|
14
|
+
// For manual-mapping: a complete, decided mapping with no write for our code to make — the entity
|
|
15
|
+
// carries `manualSteps` instead of a working `preferredWrite`. Deliberately not added to
|
|
16
|
+
// NATIVE_CLASSIFICATIONS below: import codegen must never treat this as a write target.
|
|
17
|
+
'manual-mapping',
|
|
14
18
|
]);
|
|
15
19
|
const ID_POLICIES = new Set(['client-assigned', 'server-assigned', 'natural-key', 'not-applicable']);
|
|
16
20
|
const VERIFICATIONS = new Set(['verified-live', 'docs', 'source-review', 'internal-only', 'unverified', 'none']);
|
|
17
21
|
const RELIABILITY = new Set(['reliable', 'partially-reliable', 'unreliable', 'unknown']);
|
|
22
|
+
const SURVEY_VERDICTS = new Set(['claimed', 'not-importable', 'not-relevant', 'gap', 'unreviewed']);
|
|
23
|
+
const NATIVE_CLASSIFICATIONS = new Set(['native', 'native-plus-cms']);
|
|
18
24
|
const SAFE_MODE_CONTACT_KINDS = new Set(['email', 'phone']);
|
|
25
|
+
const BLOCKED_DEPENDENCY_DEGRADATIONS = new Set(['warning', 'deferred']);
|
|
26
|
+
const MANUAL_STEP_ACTORS = new Set(['merchant', 'external', 'wix-automatable']);
|
|
19
27
|
const WRITER_IDS = new Set(Object.keys(wixWriters).filter((name) => typeof wixWriters[name] === 'function'));
|
|
20
28
|
|
|
21
29
|
function knowledgeRoot(rootDir = path.resolve(__dirname, '..')) {
|
|
@@ -66,6 +74,7 @@ function generateIndex(domainsDir) {
|
|
|
66
74
|
domains: {},
|
|
67
75
|
sourceAliasIndex: {},
|
|
68
76
|
routeAliasIndex: {},
|
|
77
|
+
capabilityIndex: {},
|
|
69
78
|
flags: {},
|
|
70
79
|
};
|
|
71
80
|
|
|
@@ -85,6 +94,10 @@ function generateIndex(domainsDir) {
|
|
|
85
94
|
reliabilityFlags: (entity.reliability && entity.reliability.flags) || [],
|
|
86
95
|
summary: firstPitfallOrGuidance(entity),
|
|
87
96
|
};
|
|
97
|
+
if (entity.capability) {
|
|
98
|
+
if (!index.capabilityIndex[entity.capability]) index.capabilityIndex[entity.capability] = [];
|
|
99
|
+
index.capabilityIndex[entity.capability].push(`${domain}/${entityId}`);
|
|
100
|
+
}
|
|
88
101
|
for (const alias of entity.sourceAliases || []) {
|
|
89
102
|
const key = `${alias.sourceSystem}:${alias.sourceEntity}`;
|
|
90
103
|
if (!index.sourceAliasIndex[key]) index.sourceAliasIndex[key] = [];
|
|
@@ -107,7 +120,7 @@ function generateIndex(domainsDir) {
|
|
|
107
120
|
};
|
|
108
121
|
}
|
|
109
122
|
|
|
110
|
-
for (const collection of [index.sourceAliasIndex, index.routeAliasIndex, index.flags]) {
|
|
123
|
+
for (const collection of [index.sourceAliasIndex, index.routeAliasIndex, index.capabilityIndex, index.flags]) {
|
|
111
124
|
for (const key of Object.keys(collection)) collection[key] = Array.from(new Set(collection[key])).sort();
|
|
112
125
|
}
|
|
113
126
|
|
|
@@ -147,6 +160,42 @@ function validateKnowledge(domainsDir) {
|
|
|
147
160
|
errors.push(`${domain}/domain.json: defaultImportOrder references missing entity ${entityId}`);
|
|
148
161
|
}
|
|
149
162
|
}
|
|
163
|
+
// REACHABILITY, the other direction — and the one that actually bites. The check above
|
|
164
|
+
// catches an order naming an entity that does not exist, which fails loudly. The reverse
|
|
165
|
+
// fails SILENTLY: an entity that is authored, has a verified writer, is covered by tests,
|
|
166
|
+
// and is named in no import order at all. Nothing errors, every test passes, and a run
|
|
167
|
+
// simply never writes it. That is how three separate entities shipped unreachable
|
|
168
|
+
// (ecom/shipping-option, ecom/pickup-location, site/business-contact) — each found only
|
|
169
|
+
// when a migrated site was missing the data and a human noticed.
|
|
170
|
+
//
|
|
171
|
+
// Rule: an entity with a writerId MUST be in its domain's defaultImportOrder. An entity
|
|
172
|
+
// with `writerId: null` has nothing to run and is legitimately absent, so the exclusion is
|
|
173
|
+
// derived from the entity's own contract rather than a hand-maintained opt-out list that
|
|
174
|
+
// would drift the same way.
|
|
175
|
+
const entitiesPath = path.join(domainsDir, domain, 'entities');
|
|
176
|
+
if (fs.existsSync(entitiesPath)) {
|
|
177
|
+
const order = new Set(domainJson.defaultImportOrder || []);
|
|
178
|
+
for (const fileName of fs.readdirSync(entitiesPath).filter((f) => f.endsWith('.json')).sort()) {
|
|
179
|
+
const entityId = fileName.replace(/\.json$/, '');
|
|
180
|
+
if (order.has(entityId)) continue;
|
|
181
|
+
let entityJson = null;
|
|
182
|
+
try {
|
|
183
|
+
entityJson = JSON.parse(fs.readFileSync(path.join(entitiesPath, fileName), 'utf8'));
|
|
184
|
+
} catch (error) {
|
|
185
|
+
continue; // the entity's own parse error is reported by validateEntity
|
|
186
|
+
}
|
|
187
|
+
if (entityJson && entityJson.preferredWrite && entityJson.preferredWrite.writerId) {
|
|
188
|
+
errors.push(`${domain}/domain.json: entity ${entityId} has writerId ${entityJson.preferredWrite.writerId} but is not in defaultImportOrder — a writer nothing runs migrates nothing. Add it to the order, or set preferredWrite.writerId to null if it genuinely cannot be written yet.`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (fs.existsSync(entitiesPath)) {
|
|
193
|
+
const entities = listEntityFiles(entitiesPath).map((fileName) => ({
|
|
194
|
+
id: fileName.replace(/\.json$/, ''),
|
|
195
|
+
dependsOn: loadEntity(domainsDir, domain, fileName.replace(/\.json$/, '')).dependsOn,
|
|
196
|
+
}));
|
|
197
|
+
errors.push(...validateDependsOnPromotion(domain, domainJson.dependsOnRequired, entities));
|
|
198
|
+
}
|
|
150
199
|
validateEvidence(domainJson.evidence || [], `${domain}/domain.json`, errors);
|
|
151
200
|
|
|
152
201
|
for (const fileName of listEntityFiles(path.join(domainsDir, domain))) {
|
|
@@ -155,6 +204,8 @@ function validateKnowledge(domainsDir) {
|
|
|
155
204
|
const label = `${domain}/entities/${fileName}`;
|
|
156
205
|
validateEntity(entity, domain, entityId, label, errors);
|
|
157
206
|
}
|
|
207
|
+
|
|
208
|
+
validateDocsSurvey(domainsDir, domain, domainJson, errors);
|
|
158
209
|
}
|
|
159
210
|
|
|
160
211
|
if (!index) {
|
|
@@ -168,9 +219,285 @@ function validateKnowledge(domainsDir) {
|
|
|
168
219
|
validateIndexConsistency(index, domainsDir, errors);
|
|
169
220
|
}
|
|
170
221
|
|
|
222
|
+
validateDependsOn(domainsDir, errors);
|
|
223
|
+
|
|
171
224
|
return { ok: errors.length === 0, errors, generatedIndex: generated };
|
|
172
225
|
}
|
|
173
226
|
|
|
227
|
+
function validateDependsOnPromotion(domain, dependsOnRequired, entities) {
|
|
228
|
+
const errors = [];
|
|
229
|
+
if (typeof dependsOnRequired !== 'boolean') {
|
|
230
|
+
errors.push(`${domain}/domain.json: dependsOnRequired must be a boolean`);
|
|
231
|
+
return errors;
|
|
232
|
+
}
|
|
233
|
+
const undeclared = entities.filter((entity) => entity.dependsOn === undefined);
|
|
234
|
+
if (dependsOnRequired && undeclared.length) {
|
|
235
|
+
for (const entity of undeclared) {
|
|
236
|
+
errors.push(`${domain}/domain.json: dependsOnRequired is true but ${domain}/entities/${entity.id}.json has no dependsOn; review and declare its dependencies`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
if (!dependsOnRequired && undeclared.length === 0) {
|
|
240
|
+
errors.push(`${domain}/domain.json: dependsOnRequired is false but every entity is declared; promote this domain by setting dependsOnRequired to true`);
|
|
241
|
+
}
|
|
242
|
+
return errors;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// The dependsOn graph across every entity that has it. Pure disk read, no validation —
|
|
246
|
+
// `validateDependsOn` (ref resolution, cycles) and `checkScope` (rp-mapper's review-gate check)
|
|
247
|
+
// both build on this so the graph is assembled exactly once, the same way, everywhere it's needed.
|
|
248
|
+
function buildDependsOnGraph(domainsDir) {
|
|
249
|
+
const graph = new Map(); // ref -> dependsOn refs
|
|
250
|
+
for (const domain of listDomainDirs(domainsDir)) {
|
|
251
|
+
for (const fileName of listEntityFiles(path.join(domainsDir, domain))) {
|
|
252
|
+
const entityId = fileName.replace(/\.json$/, '');
|
|
253
|
+
const entity = loadEntity(domainsDir, domain, entityId);
|
|
254
|
+
if (entity.dependsOn === undefined) continue;
|
|
255
|
+
const ref = `${domain}/${entityId}`;
|
|
256
|
+
graph.set(ref, Array.isArray(entity.dependsOn) ? entity.dependsOn : []);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return graph;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// dependsOn is optional only in a domain that has not yet been promoted. Once a
|
|
263
|
+
// domain's explicit dependsOnRequired flag is true, validateKnowledge rejects an undeclared
|
|
264
|
+
// entity; in every domain a present declaration must resolve and the graph must stay acyclic.
|
|
265
|
+
// Builds its own local graph rather than calling buildDependsOnGraph afterward — this function
|
|
266
|
+
// already reads and parses every entity file once for ref-resolution/array-type checks, so
|
|
267
|
+
// reusing that same read for cycle detection (instead of a second full read+parse pass) halves
|
|
268
|
+
// the I/O of every `domain-knowledge-validate.js` run.
|
|
269
|
+
function validateDependsOn(domainsDir, errors) {
|
|
270
|
+
const graph = new Map();
|
|
271
|
+
for (const domain of listDomainDirs(domainsDir)) {
|
|
272
|
+
for (const fileName of listEntityFiles(path.join(domainsDir, domain))) {
|
|
273
|
+
const entityId = fileName.replace(/\.json$/, '');
|
|
274
|
+
const entity = loadEntity(domainsDir, domain, entityId);
|
|
275
|
+
const label = `${domain}/entities/${fileName}`;
|
|
276
|
+
if (entity.dependsOn === undefined) continue;
|
|
277
|
+
if (!Array.isArray(entity.dependsOn)) {
|
|
278
|
+
errors.push(`${label}: dependsOn must be an array when present`);
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
graph.set(`${domain}/${entityId}`, entity.dependsOn);
|
|
282
|
+
for (const [ref, mode] of Object.entries(entity.dependencyModes || {})) {
|
|
283
|
+
if (mode !== 'per-record' || !entity.dependsOn.includes(ref) || !Array.isArray(entity.dependencyReferenceFields?.[ref]) || !entity.dependencyReferenceFields[ref].length) errors.push(`dependency_mode_invalid:${domain}/${entityId}:${ref}`);
|
|
284
|
+
const [producerDomain, producerEntity] = ref.split('/');
|
|
285
|
+
if (fs.existsSync(path.join(domainsDir, producerDomain || '', 'entities', `${producerEntity}.json`)) && loadEntity(domainsDir, producerDomain, producerEntity).target?.classification === 'setup-config') errors.push(`dependency_mode_invalid:${domain}/${entityId}:${ref}`);
|
|
286
|
+
}
|
|
287
|
+
for (const dep of entity.dependsOn) {
|
|
288
|
+
const segments = String(dep).split('/');
|
|
289
|
+
const [depDomain, depEntity] = segments;
|
|
290
|
+
if (segments.length !== 2 || !depDomain || !depEntity || !fs.existsSync(path.join(domainsDir, depDomain, 'entities', `${depEntity}.json`))) {
|
|
291
|
+
errors.push(`${label}: dependsOn entry "${dep}" does not resolve to an entity file`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
const cycle = findCycle(graph);
|
|
298
|
+
if (cycle) errors.push(`dependsOn graph has a cycle: ${cycle.join(' -> ')}`);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function findCycle(graph) {
|
|
302
|
+
const WHITE = 0;
|
|
303
|
+
const GRAY = 1;
|
|
304
|
+
const BLACK = 2;
|
|
305
|
+
const color = new Map();
|
|
306
|
+
const stack = [];
|
|
307
|
+
|
|
308
|
+
function visit(node) {
|
|
309
|
+
color.set(node, GRAY);
|
|
310
|
+
stack.push(node);
|
|
311
|
+
for (const next of graph.get(node) || []) {
|
|
312
|
+
const state = color.get(next) || WHITE;
|
|
313
|
+
if (state === GRAY) return [...stack, next];
|
|
314
|
+
if (state === WHITE && graph.has(next)) {
|
|
315
|
+
const found = visit(next);
|
|
316
|
+
if (found) return found;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
stack.pop();
|
|
320
|
+
color.set(node, BLACK);
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
for (const node of graph.keys()) {
|
|
325
|
+
if ((color.get(node) || WHITE) === WHITE) {
|
|
326
|
+
const found = visit(node);
|
|
327
|
+
if (found) return found;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
return null;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// Every entity ref that actually exists on disk, regardless of whether it has dependsOn authored.
|
|
334
|
+
// checkScope needs this to tell "unknown ref" (not in this set) apart from "known but unreviewed"
|
|
335
|
+
// (in this set, absent from the dependsOn graph).
|
|
336
|
+
function listAllEntityRefs(domainsDir) {
|
|
337
|
+
const refs = [];
|
|
338
|
+
for (const domain of listDomainDirs(domainsDir)) {
|
|
339
|
+
for (const fileName of listEntityFiles(path.join(domainsDir, domain))) {
|
|
340
|
+
refs.push(`${domain}/${fileName.replace(/\.json$/, '')}`);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return refs;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// The rp-mapper review-gate check, as a pure function (the caller does not compute the transitive
|
|
347
|
+
// closure, and unknown refs and never-reviewed entities are never passed as though they were
|
|
348
|
+
// "reviewed, no dependencies").
|
|
349
|
+
// Given every real entity ref, the dependsOn graph, and the plan's own selected scope (only —
|
|
350
|
+
// the caller does not pre-expand anything), this walks dependsOn edges outward itself and reports
|
|
351
|
+
// three distinct, non-overlapping failure categories. `checkScope` below is the disk-reading
|
|
352
|
+
// wrapper `rp-mapper`/an agent/the CLI actually calls.
|
|
353
|
+
function computeScopeCheck(allRefs, graph, selectedRefs) {
|
|
354
|
+
const selectedSet = new Set((selectedRefs || []).map((ref) => String(ref)));
|
|
355
|
+
const unknownRefs = new Set(Array.from(selectedSet).filter((ref) => !allRefs.has(ref)));
|
|
356
|
+
const validSelected = Array.from(selectedSet).filter((ref) => allRefs.has(ref));
|
|
357
|
+
|
|
358
|
+
const visited = new Set();
|
|
359
|
+
const queue = [...validSelected];
|
|
360
|
+
const unreviewedRefs = [];
|
|
361
|
+
const missingByRef = new Map();
|
|
362
|
+
|
|
363
|
+
while (queue.length) {
|
|
364
|
+
const ref = queue.shift();
|
|
365
|
+
if (visited.has(ref)) continue;
|
|
366
|
+
visited.add(ref);
|
|
367
|
+
|
|
368
|
+
if (!allRefs.has(ref)) {
|
|
369
|
+
// Reached only via a dependsOn edge (never itself in selectedRefs, or `selectedSet` would
|
|
370
|
+
// already have caught it above) — a dangling/typo'd ref, not merely unreviewed.
|
|
371
|
+
unknownRefs.add(ref);
|
|
372
|
+
continue;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
if (!graph.has(ref)) {
|
|
376
|
+
// Reachable, resolves to a real entity, but dependsOn has never been authored at all —
|
|
377
|
+
// fail-closed: "not yet reviewed" is not the same fact as "reviewed, no dependencies."
|
|
378
|
+
unreviewedRefs.push(ref);
|
|
379
|
+
continue;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
const deps = graph.get(ref);
|
|
383
|
+
const missing = deps.filter((dep) => !selectedSet.has(dep));
|
|
384
|
+
if (missing.length) missingByRef.set(ref, missing);
|
|
385
|
+
for (const dep of deps) {
|
|
386
|
+
if (!visited.has(dep)) queue.push(dep);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
const missingDependencies = Array.from(missingByRef.entries())
|
|
391
|
+
.map(([ref, missing]) => ({ ref, missing }))
|
|
392
|
+
.sort((a, b) => a.ref.localeCompare(b.ref));
|
|
393
|
+
|
|
394
|
+
return {
|
|
395
|
+
ok: unknownRefs.size === 0 && missingDependencies.length === 0 && unreviewedRefs.length === 0,
|
|
396
|
+
unknownRefs: Array.from(unknownRefs).sort(),
|
|
397
|
+
missingDependencies,
|
|
398
|
+
unreviewedRefs: unreviewedRefs.sort(),
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Disk-reading wrapper — this is what `domain-knowledge-validate.js --check-scope` and rp-mapper's
|
|
403
|
+
// review gate should call, passing only the plan's own selected scope. See computeScopeCheck for
|
|
404
|
+
// the pure algorithm and why each failure category exists.
|
|
405
|
+
function checkScope(domainsDir, selectedRefs) {
|
|
406
|
+
return computeScopeCheck(new Set(listAllEntityRefs(domainsDir)), buildDependsOnGraph(domainsDir), selectedRefs);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// The live backlog: every entity that has never had dependsOn authored at all (field
|
|
410
|
+
// absent, not merely empty). Non-blocking by design — this is a report, not a validation error.
|
|
411
|
+
// `node domain-knowledge-validate.js --list-missing-deps` is the intended way to read it, so the
|
|
412
|
+
// backlog never drifts out of sync with a hand-maintained list the way a markdown table would.
|
|
413
|
+
function listMissingDependsOn(domainsDir) {
|
|
414
|
+
const missing = [];
|
|
415
|
+
for (const domain of listDomainDirs(domainsDir)) {
|
|
416
|
+
for (const fileName of listEntityFiles(path.join(domainsDir, domain))) {
|
|
417
|
+
const entityId = fileName.replace(/\.json$/, '');
|
|
418
|
+
const entity = loadEntity(domainsDir, domain, entityId);
|
|
419
|
+
if (entity.dependsOn === undefined) missing.push(`${domain}/${entityId}`);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
return missing.sort();
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
// Every domain with entities carries a docs survey in which every
|
|
426
|
+
// docs-menu surface is triaged, and its native entities cite their object
|
|
427
|
+
// page. The backfill completed 2026-08-11, so a missing survey is an error.
|
|
428
|
+
function validateDocsSurvey(domainsDir, domain, domainJson, errors) {
|
|
429
|
+
const surveyPath = path.join(domainsDir, domain, 'docs-survey.json');
|
|
430
|
+
const hasEntities = listEntityFiles(path.join(domainsDir, domain)).length > 0;
|
|
431
|
+
if (!fs.existsSync(surveyPath)) {
|
|
432
|
+
if (hasEntities) errors.push(`${domain}: missing docs-survey.json; run docs-survey-sync.js ${domain} and triage`);
|
|
433
|
+
return;
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
const label = `${domain}/docs-survey.json`;
|
|
437
|
+
const survey = readJson(surveyPath);
|
|
438
|
+
requireFields(survey, ['schemaVersion', 'domain', 'fetchedAt', 'roots', 'surfaces'], label, errors);
|
|
439
|
+
if (survey.schemaVersion !== 1) errors.push(`${label}: schemaVersion must be 1`);
|
|
440
|
+
if (survey.domain !== domain) errors.push(`${label}: domain must match directory`);
|
|
441
|
+
|
|
442
|
+
const declaredRoots = JSON.stringify([...(domainJson.docsRoots || [])].sort());
|
|
443
|
+
const surveyRoots = JSON.stringify([...(survey.roots || [])].sort());
|
|
444
|
+
if (declaredRoots !== surveyRoots) {
|
|
445
|
+
errors.push(`${label}: roots must match ${domain}/domain.json docsRoots; re-run docs-survey-sync.js ${domain}`);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
for (const surface of survey.surfaces || []) {
|
|
449
|
+
const surfaceLabel = `${label}: ${surface.id || '<missing id>'}`;
|
|
450
|
+
requireFields(surface, ['id', 'title', 'url', 'verdict'], surfaceLabel, errors);
|
|
451
|
+
if (surface.removed) {
|
|
452
|
+
errors.push(`${surfaceLabel}: surface no longer in the docs menu; delete the entry or revisit the facts that cited it`);
|
|
453
|
+
continue;
|
|
454
|
+
}
|
|
455
|
+
if (!SURVEY_VERDICTS.has(surface.verdict)) {
|
|
456
|
+
errors.push(`${surfaceLabel}: invalid verdict ${surface.verdict}`);
|
|
457
|
+
continue;
|
|
458
|
+
}
|
|
459
|
+
if (surface.verdict === 'unreviewed') {
|
|
460
|
+
errors.push(`${surfaceLabel}: unreviewed surface; triage it (claimed / not-importable / not-relevant / gap)`);
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
if (!surface.reviewedOn) errors.push(`${surfaceLabel}: triaged surface must carry reviewedOn`);
|
|
464
|
+
if (surface.verdict === 'claimed') {
|
|
465
|
+
if (!Array.isArray(surface.refs) || surface.refs.length === 0) {
|
|
466
|
+
errors.push(`${surfaceLabel}: claimed surface must list refs[]`);
|
|
467
|
+
} else {
|
|
468
|
+
for (const ref of surface.refs) {
|
|
469
|
+
const [refDomain, refEntity] = String(ref).split('/');
|
|
470
|
+
if (!refDomain || !refEntity || !fs.existsSync(path.join(domainsDir, refDomain, 'entities', `${refEntity}.json`))) {
|
|
471
|
+
errors.push(`${surfaceLabel}: claimed ref ${ref} does not resolve to an entity file`);
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
if ((surface.verdict === 'not-importable' || surface.verdict === 'not-relevant') && !surface.reason) {
|
|
477
|
+
errors.push(`${surfaceLabel}: ${surface.verdict} requires a reason`);
|
|
478
|
+
}
|
|
479
|
+
if (surface.verdict === 'gap' && (!surface.reason || !surface.tracking)) {
|
|
480
|
+
errors.push(`${surfaceLabel}: gap requires reason and tracking`);
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
for (const fileName of listEntityFiles(path.join(domainsDir, domain))) {
|
|
485
|
+
const entityId = fileName.replace(/\.json$/, '');
|
|
486
|
+
const entity = loadEntity(domainsDir, domain, entityId);
|
|
487
|
+
if (!NATIVE_CLASSIFICATIONS.has(entity.target && entity.target.classification)) continue;
|
|
488
|
+
const citesObjectPage = (entity.evidence || []).some(
|
|
489
|
+
(item) => typeof item.url === 'string' && /-object$/.test(item.url.replace(/\.md$/, ''))
|
|
490
|
+
);
|
|
491
|
+
// A surface with no …-object reference page (e.g. Comments, which has no
|
|
492
|
+
// REST reference at all) declares objectPageException with the reason —
|
|
493
|
+
// explicit and greppable, never silent.
|
|
494
|
+
const hasException = typeof entity.objectPageException === 'string' && entity.objectPageException.length > 0;
|
|
495
|
+
if (!citesObjectPage && !hasException) {
|
|
496
|
+
errors.push(`${domain}/entities/${fileName}: native target must cite its docs object page (…-object URL) in evidence[], or declare objectPageException with a reason`);
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
|
|
174
501
|
function requireFields(value, fields, label, errors) {
|
|
175
502
|
for (const field of fields) {
|
|
176
503
|
if (value[field] === undefined) errors.push(`${label}: missing required field ${field}`);
|
|
@@ -197,10 +524,79 @@ function validateEntity(entity, domain, entityId, label, errors) {
|
|
|
197
524
|
for (const alias of entity.sourceAliases || []) {
|
|
198
525
|
if (!alias.sourceSystem || !alias.sourceEntity) errors.push(`${label}: sourceAliases entries must include sourceSystem and sourceEntity`);
|
|
199
526
|
}
|
|
527
|
+
if (entity.target && entity.target.classification === 'manual-mapping') {
|
|
528
|
+
validateManualMapping(entity, label, errors);
|
|
529
|
+
} else if (entity.manualSteps !== undefined) {
|
|
530
|
+
errors.push(`${label}: manualSteps is only allowed when target.classification is manual-mapping`);
|
|
531
|
+
}
|
|
200
532
|
validateSafeModeContactFields(entity.safeModeContactFields, label, errors);
|
|
533
|
+
validateBlockedSourceDependencies(entity, label, errors);
|
|
201
534
|
validateEvidence(entity.evidence || [], label, errors);
|
|
202
535
|
}
|
|
203
536
|
|
|
537
|
+
function validateBlockedSourceDependencies(entity, label, errors) {
|
|
538
|
+
if (entity.blockedSourceDependencies === undefined) return;
|
|
539
|
+
if (!Array.isArray(entity.blockedSourceDependencies)) {
|
|
540
|
+
errors.push(`${label}: blockedSourceDependencies must be an array when present`);
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
const pitfallCodes = new Set((entity.pitfalls || []).map((pitfall) => pitfall.code));
|
|
544
|
+
const seen = new Set();
|
|
545
|
+
entity.blockedSourceDependencies.forEach((dependency, index) => {
|
|
546
|
+
const dependencyLabel = `${label}: blockedSourceDependencies[${index}]`;
|
|
547
|
+
if (!dependency || typeof dependency !== 'object' || Array.isArray(dependency)) {
|
|
548
|
+
errors.push(`${dependencyLabel} must be an object`);
|
|
549
|
+
return;
|
|
550
|
+
}
|
|
551
|
+
for (const field of ['sourceEntityRef', 'degradedField', 'pitfallCode', 'degradation']) {
|
|
552
|
+
if (!dependency[field] || typeof dependency[field] !== 'string') errors.push(`${dependencyLabel}.${field} must be a non-empty string`);
|
|
553
|
+
}
|
|
554
|
+
if (dependency.sourceEntityRef && !/^plugin\.[^.]+\.[^.]+$/.test(dependency.sourceEntityRef)) {
|
|
555
|
+
errors.push(`${dependencyLabel}.sourceEntityRef must use plugin.<slug>.<entity>`);
|
|
556
|
+
}
|
|
557
|
+
if (dependency.pitfallCode && !pitfallCodes.has(dependency.pitfallCode)) {
|
|
558
|
+
errors.push(`${dependencyLabel}.pitfallCode ${dependency.pitfallCode} does not resolve in this entity's pitfalls[]`);
|
|
559
|
+
}
|
|
560
|
+
if (dependency.degradation && !BLOCKED_DEPENDENCY_DEGRADATIONS.has(dependency.degradation)) {
|
|
561
|
+
errors.push(`${dependencyLabel}.degradation must be warning or deferred`);
|
|
562
|
+
}
|
|
563
|
+
const key = `${dependency.sourceEntityRef}:${dependency.degradedField}`;
|
|
564
|
+
if (seen.has(key)) errors.push(`${dependencyLabel} duplicates ${key}`);
|
|
565
|
+
seen.add(key);
|
|
566
|
+
});
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
// For manual-mapping: a manual-mapping entity performs no write, so its preferredWrite must
|
|
570
|
+
// be structurally inert (nothing for import codegen to accidentally call), and its manualSteps
|
|
571
|
+
// must actually contain a runbook — an empty or missing one would render nothing to the
|
|
572
|
+
// merchant, which is worse than not classifying it manual-mapping at all.
|
|
573
|
+
function validateManualMapping(entity, label, errors) {
|
|
574
|
+
const pw = entity.preferredWrite || {};
|
|
575
|
+
if (pw.endpoint !== null) errors.push(`${label}: manual-mapping requires preferredWrite.endpoint === null`);
|
|
576
|
+
if (pw.writerId !== null) errors.push(`${label}: manual-mapping requires preferredWrite.writerId === null`);
|
|
577
|
+
if (pw.verification !== 'none') errors.push(`${label}: manual-mapping requires preferredWrite.verification === 'none'`);
|
|
578
|
+
if (pw.importSafe !== false) errors.push(`${label}: manual-mapping requires preferredWrite.importSafe === false`);
|
|
579
|
+
if (pw.bulk !== false) errors.push(`${label}: manual-mapping requires preferredWrite.bulk === false`);
|
|
580
|
+
|
|
581
|
+
const manualSteps = entity.manualSteps;
|
|
582
|
+
if (!manualSteps || typeof manualSteps !== 'object') {
|
|
583
|
+
errors.push(`${label}: manual-mapping requires a manualSteps object`);
|
|
584
|
+
return;
|
|
585
|
+
}
|
|
586
|
+
if (!Array.isArray(manualSteps.steps) || manualSteps.steps.length === 0) {
|
|
587
|
+
errors.push(`${label}: manualSteps.steps must be a non-empty array`);
|
|
588
|
+
return;
|
|
589
|
+
}
|
|
590
|
+
manualSteps.steps.forEach((step, index) => {
|
|
591
|
+
if (!step || !MANUAL_STEP_ACTORS.has(step.actor)) {
|
|
592
|
+
errors.push(`${label}: manualSteps.steps[${index}].actor must be one of ${Array.from(MANUAL_STEP_ACTORS).join(', ')}`);
|
|
593
|
+
}
|
|
594
|
+
if (!step || typeof step.text !== 'string' || step.text.trim() === '') {
|
|
595
|
+
errors.push(`${label}: manualSteps.steps[${index}].text must be a non-empty string`);
|
|
596
|
+
}
|
|
597
|
+
});
|
|
598
|
+
}
|
|
599
|
+
|
|
204
600
|
function validateSafeModeContactFields(fields, label, errors) {
|
|
205
601
|
if (fields === undefined) return;
|
|
206
602
|
if (!Array.isArray(fields)) {
|
|
@@ -351,6 +747,15 @@ function listFlagged(domainsDir, flag) {
|
|
|
351
747
|
});
|
|
352
748
|
}
|
|
353
749
|
|
|
750
|
+
// Lazily required: domain-knowledge is loaded by tooling that has no need for the schema library,
|
|
751
|
+
// and a hard dependency at module load is how one domain file breaks everything (learned the hard
|
|
752
|
+
// way when a generic library loaded an eCommerce entity at init).
|
|
753
|
+
function stampSetupRequirement(requirement) {
|
|
754
|
+
if (!requirement || requirement.kind !== 'extendedFieldSchema') return requirement;
|
|
755
|
+
// eslint-disable-next-line global-require
|
|
756
|
+
return require('./data-extension-schema.js').stampRequirement(requirement);
|
|
757
|
+
}
|
|
758
|
+
|
|
354
759
|
function summarizeEntities(domainsDir, refs, { includeEvidence = false } = {}) {
|
|
355
760
|
return refs.map((ref) => {
|
|
356
761
|
const entity = readEntityByRef(domainsDir, ref);
|
|
@@ -362,18 +767,64 @@ function summarizeEntities(domainsDir, refs, { includeEvidence = false } = {}) {
|
|
|
362
767
|
reliability: entity.reliability,
|
|
363
768
|
pitfalls: entity.pitfalls,
|
|
364
769
|
mappingGuidance: entity.mappingGuidance,
|
|
365
|
-
|
|
770
|
+
// Stamped HERE, at the producer the shipped path actually uses. The stamp used to live only
|
|
771
|
+
// on a domain adapter that setup discovery never calls, so the real chain emitted unstamped
|
|
772
|
+
// requirements and every invoice write was refused by a guard that was working correctly.
|
|
773
|
+
setupRequirements: (entity.setupRequirements || []).map(stampSetupRequirement),
|
|
366
774
|
fieldContracts: entity.fieldContracts || [],
|
|
775
|
+
blockedSourceDependencies: entity.blockedSourceDependencies || [],
|
|
776
|
+
extendedFields: entity.extendedFields || null,
|
|
367
777
|
};
|
|
368
778
|
if (includeEvidence) summary.evidence = entity.evidence;
|
|
369
779
|
return summary;
|
|
370
780
|
});
|
|
371
781
|
}
|
|
372
782
|
|
|
783
|
+
// Compact cross-adapter view consumed by the WordPress plugin knowledge base so plugin
|
|
784
|
+
// profiles can be validated against real Wix target refs and capability claims without
|
|
785
|
+
// each adapter re-reading the other's tree.
|
|
786
|
+
function knowledgeSummary(domainsDir) {
|
|
787
|
+
const index = loadIndex(domainsDir);
|
|
788
|
+
const knownRefs = new Set();
|
|
789
|
+
const verificationByRef = new Map();
|
|
790
|
+
// manual-mapping entities only — lets classifyCoverage tell a manual-mapping
|
|
791
|
+
// target apart from a real write target using only this compact summary, with no need to
|
|
792
|
+
// re-read the full rp-target-wix entity tree from the WordPress side.
|
|
793
|
+
const manualStepsByRef = new Map();
|
|
794
|
+
const blockedSourceDependenciesByRef = new Map();
|
|
795
|
+
for (const [domain, domainEntry] of Object.entries(index.domains || {})) {
|
|
796
|
+
for (const entityId of Object.keys(domainEntry.entities || {})) {
|
|
797
|
+
const ref = `${domain}/${entityId}`;
|
|
798
|
+
knownRefs.add(ref);
|
|
799
|
+
const entity = loadEntity(domainsDir, domain, entityId);
|
|
800
|
+
verificationByRef.set(ref, entity.preferredWrite && entity.preferredWrite.verification);
|
|
801
|
+
if (entity.target && entity.target.classification === 'manual-mapping' && entity.manualSteps) {
|
|
802
|
+
manualStepsByRef.set(ref, entity.manualSteps);
|
|
803
|
+
}
|
|
804
|
+
if (Array.isArray(entity.blockedSourceDependencies) && entity.blockedSourceDependencies.length > 0) {
|
|
805
|
+
blockedSourceDependenciesByRef.set(ref, entity.blockedSourceDependencies);
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
const capabilityRefs = new Map(Object.entries(index.capabilityIndex || {}));
|
|
810
|
+
return { knownRefs, capabilityRefs, verificationByRef, manualStepsByRef, blockedSourceDependenciesByRef };
|
|
811
|
+
}
|
|
812
|
+
|
|
373
813
|
module.exports = {
|
|
374
814
|
knowledgeRoot,
|
|
375
815
|
generateIndex,
|
|
816
|
+
knowledgeSummary,
|
|
376
817
|
validateKnowledge,
|
|
818
|
+
validateDependsOnPromotion,
|
|
819
|
+
validateDependsOn,
|
|
820
|
+
validateEntity,
|
|
821
|
+
validateBlockedSourceDependencies,
|
|
822
|
+
buildDependsOnGraph,
|
|
823
|
+
findCycle,
|
|
824
|
+
listAllEntityRefs,
|
|
825
|
+
computeScopeCheck,
|
|
826
|
+
checkScope,
|
|
827
|
+
listMissingDependsOn,
|
|
377
828
|
writeJson,
|
|
378
829
|
listDomains,
|
|
379
830
|
listEntities,
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { isBlank } = require('./value-utils.js');
|
|
4
|
+
|
|
5
|
+
// rp-target-wix — balance-reconciliation REPORTING, not a write path.
|
|
6
|
+
//
|
|
7
|
+
// Wix's gift-cards API has no balance-increase/credit method (the "no-credit-API
|
|
8
|
+
// finding": create, send-email, query/search, disable, find-by-email, redeem, void — nothing that
|
|
9
|
+
// raises a balance). The only correction for a card already created wrong is disable-and-replace,
|
|
10
|
+
// a code change that alters the customer-facing code and needs its own human sign-off (see
|
|
11
|
+
// gift-cards/gift-card.json's pitfalls) — never a silent balance patch. This module therefore only
|
|
12
|
+
// ever REPORTS drift; it never proposes "replay the difference," which is exactly the
|
|
13
|
+
// double-decrement risk that is ruled out (a card must never be built by
|
|
14
|
+
// gift-card-build.js twice under different balance policies).
|
|
15
|
+
//
|
|
16
|
+
// BLOCKED on input: `sourceBalance` below is meant to come from
|
|
17
|
+
// the bridge plugin, which is code-only and not yet installed/live-tested on any real
|
|
18
|
+
// site. This module is ready to consume that data the moment it exists.
|
|
19
|
+
|
|
20
|
+
function normalizeMoney(value) {
|
|
21
|
+
if (isBlank(value)) return null;
|
|
22
|
+
const numeric = Number(value);
|
|
23
|
+
if (!Number.isFinite(numeric)) return null;
|
|
24
|
+
return Math.round(numeric * 100) / 100;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// One card's reconciliation row. `policy` records which balance policy the card was
|
|
28
|
+
// CREATED under — required, because the correct verdict for an identical mismatch differs by
|
|
29
|
+
// policy: under Policy A (face value, no replay) an overstatement is the known, accepted
|
|
30
|
+
// consequence of that choice; the same mismatch under Policy B (verified balance at creation) or
|
|
31
|
+
// Policy C (face value, then corrected by replaying real order-linked redemptions — see
|
|
32
|
+
// gift-card-redemption-build.js) means the card was born wrong, or its replay is incomplete/wrong,
|
|
33
|
+
// and needs investigation, not passive acceptance. Policy C is included here alongside B, not
|
|
34
|
+
// given its own "in-progress replay" leniency: a reconciliation check is the caller's to run only
|
|
35
|
+
// once replay is believed complete, not this module's to guess at.
|
|
36
|
+
function buildBalanceReconciliationRow({ sourceNumber, policy, sourceBalance, wixBalance } = {}) {
|
|
37
|
+
if (isBlank(sourceNumber)) {
|
|
38
|
+
return {
|
|
39
|
+
sourceNumber: sourceNumber == null ? null : sourceNumber,
|
|
40
|
+
ok: false,
|
|
41
|
+
gap: { code: 'missing-source-number', summary: 'sourceNumber is required to report a reconciliation row against.' },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (policy !== 'A' && policy !== 'B' && policy !== 'C') {
|
|
45
|
+
return {
|
|
46
|
+
sourceNumber,
|
|
47
|
+
ok: false,
|
|
48
|
+
gap: { code: 'invalid-policy', summary: `policy must be "A", "B", or "C" — got ${JSON.stringify(policy)}.` },
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const source = normalizeMoney(sourceBalance);
|
|
53
|
+
if (source === null) {
|
|
54
|
+
return {
|
|
55
|
+
sourceNumber,
|
|
56
|
+
ok: false,
|
|
57
|
+
gap: { code: 'unavailable-source-balance', summary: `no verified current balance available for card ${sourceNumber} from the bridge plugin — report this card as unreconciled rather than assuming it matches.` },
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const wix = normalizeMoney(wixBalance);
|
|
61
|
+
if (wix === null) {
|
|
62
|
+
return {
|
|
63
|
+
sourceNumber,
|
|
64
|
+
ok: false,
|
|
65
|
+
gap: { code: 'unavailable-wix-balance', summary: `no Wix balance available for card ${sourceNumber} — read it back via Get Gift Card before reconciling.` },
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
const drift = Math.round((wix - source) * 100) / 100;
|
|
70
|
+
if (drift === 0) {
|
|
71
|
+
return { sourceNumber, ok: true, policy, sourceBalance: source, wixBalance: wix, drift: 0, verdict: 'matches', action: 'none' };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (policy === 'A' && drift > 0) {
|
|
75
|
+
return {
|
|
76
|
+
sourceNumber,
|
|
77
|
+
ok: false,
|
|
78
|
+
policy,
|
|
79
|
+
sourceBalance: source,
|
|
80
|
+
wixBalance: wix,
|
|
81
|
+
drift,
|
|
82
|
+
verdict: 'expected-overstatement',
|
|
83
|
+
action: 'disable-and-replace-or-accept',
|
|
84
|
+
summary: `card ${sourceNumber} shows ${wix} in Wix but ${source} at the source — the known, accepted overstatement of Policy A (face value at creation, no replay). Correcting it requires disabling and replacing the card (no balance-credit API exists), which changes the customer-facing code and needs its own human sign-off.`,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Any other direction/policy combination is not a shape any policy's documented behavior
|
|
89
|
+
// produces on its own (e.g. Policy A showing a Wix balance BELOW the source, or any mismatch at
|
|
90
|
+
// all under Policy B/C) — a real anomaly, not something to explain away.
|
|
91
|
+
return {
|
|
92
|
+
sourceNumber,
|
|
93
|
+
ok: false,
|
|
94
|
+
policy,
|
|
95
|
+
sourceBalance: source,
|
|
96
|
+
wixBalance: wix,
|
|
97
|
+
drift,
|
|
98
|
+
verdict: 'unexpected-drift',
|
|
99
|
+
action: 'investigate',
|
|
100
|
+
summary: `card ${sourceNumber} shows ${wix} in Wix vs ${source} at the source (drift ${drift}) under Policy ${policy} — not a shape any policy's documented behavior explains; investigate before accepting or correcting it.`,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function buildBalanceReconciliationReport(cards) {
|
|
105
|
+
const rows = (cards || []).map((card) => buildBalanceReconciliationRow(card));
|
|
106
|
+
const mismatches = rows.filter((row) => !row.ok);
|
|
107
|
+
return {
|
|
108
|
+
totalCards: rows.length,
|
|
109
|
+
matched: rows.length - mismatches.length,
|
|
110
|
+
mismatches,
|
|
111
|
+
rows,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
module.exports = {
|
|
116
|
+
normalizeMoney,
|
|
117
|
+
buildBalanceReconciliationRow,
|
|
118
|
+
buildBalanceReconciliationReport,
|
|
119
|
+
};
|