@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
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"id": "quick-woocommerce",
|
|
4
|
+
"version": "1.1.0",
|
|
5
|
+
"platform": "woocommerce",
|
|
6
|
+
"minimumProbeConfidence": "high",
|
|
7
|
+
"requiredProbeStrategies": [
|
|
8
|
+
"wc.store.products",
|
|
9
|
+
"wp.posts"
|
|
10
|
+
],
|
|
11
|
+
"publicAuth": "none",
|
|
12
|
+
"entities": [
|
|
13
|
+
{
|
|
14
|
+
"id": "product_category",
|
|
15
|
+
"route": "/wp-json/wc/store/v1/products/categories",
|
|
16
|
+
"target": "stores/category",
|
|
17
|
+
"dependsOn": []
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "product_tag",
|
|
21
|
+
"route": "/wp-json/wc/store/v1/products/tags",
|
|
22
|
+
"target": "stores/product-tag",
|
|
23
|
+
"dependsOn": []
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "blog_category",
|
|
27
|
+
"route": "/wp-json/wp/v2/categories",
|
|
28
|
+
"target": "blog/category",
|
|
29
|
+
"dependsOn": []
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"id": "blog_tag",
|
|
33
|
+
"route": "/wp-json/wp/v2/tags",
|
|
34
|
+
"target": "blog/tag",
|
|
35
|
+
"dependsOn": []
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"id": "post",
|
|
39
|
+
"route": "/wp-json/wp/v2/posts",
|
|
40
|
+
"target": "blog/post",
|
|
41
|
+
"dependsOn": [
|
|
42
|
+
"blog_category",
|
|
43
|
+
"blog_tag"
|
|
44
|
+
]
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"id": "product",
|
|
48
|
+
"route": "/wp-json/wc/store/v1/products",
|
|
49
|
+
"target": "stores/product",
|
|
50
|
+
"dependsOn": [
|
|
51
|
+
"product_category",
|
|
52
|
+
"product_tag"
|
|
53
|
+
]
|
|
54
|
+
}
|
|
55
|
+
],
|
|
56
|
+
"requiredWixCapabilities": [
|
|
57
|
+
"stores",
|
|
58
|
+
"blog"
|
|
59
|
+
],
|
|
60
|
+
"excluded": [
|
|
61
|
+
"customers",
|
|
62
|
+
"members",
|
|
63
|
+
"orders",
|
|
64
|
+
"refunds",
|
|
65
|
+
"coupons",
|
|
66
|
+
"taxes",
|
|
67
|
+
"reviews",
|
|
68
|
+
"shipping",
|
|
69
|
+
"payments",
|
|
70
|
+
"plugin-data",
|
|
71
|
+
"draft-private-password-protected-content",
|
|
72
|
+
"unreferenced-media"
|
|
73
|
+
],
|
|
74
|
+
"excludedCapabilities": {
|
|
75
|
+
"customers": "crm.contact",
|
|
76
|
+
"members": "identity.member",
|
|
77
|
+
"orders": "commerce.orders",
|
|
78
|
+
"refunds": "commerce.order-refunds",
|
|
79
|
+
"coupons": "commerce.coupons",
|
|
80
|
+
"taxes": "commerce.tax-settings",
|
|
81
|
+
"reviews": "commerce.product-reviews",
|
|
82
|
+
"shipping": "commerce.shipping-rate",
|
|
83
|
+
"payments": "commerce.order-payments",
|
|
84
|
+
"plugin-data": "source-scope.plugin-data",
|
|
85
|
+
"draft-private-password-protected-content": "source-scope.draft-private-password-protected-content",
|
|
86
|
+
"unreferenced-media": "source-scope.unreferenced-media"
|
|
87
|
+
},
|
|
88
|
+
"setupOperations": [
|
|
89
|
+
"blog-fallback-author"
|
|
90
|
+
]
|
|
91
|
+
}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
// Public-only, read-only WooCommerce quick-mode capture. This deliberately contains no
|
|
5
|
+
// credentials, browser automation, or fallback endpoint guessing.
|
|
6
|
+
const capabilities = require('../../../lib/execution-capability');
|
|
7
|
+
const fs = require('node:fs/promises');
|
|
8
|
+
const path = require('node:path');
|
|
9
|
+
const crypto = require('node:crypto');
|
|
10
|
+
|
|
11
|
+
const ADAPTER_DIR = path.resolve(__dirname, '..');
|
|
12
|
+
const CONTRACT_PATH = path.join(ADAPTER_DIR, 'quick-mode.json');
|
|
13
|
+
const CONTRACT = require(CONTRACT_PATH);
|
|
14
|
+
const sourceCoverage = require(path.join(ADAPTER_DIR, '..', '..', 'lib', 'source-coverage.js'));
|
|
15
|
+
const recovery = require(path.join(ADAPTER_DIR, '..', 'rp-quick-runtime', 'lib', 'limit-recovery.js'));
|
|
16
|
+
const importProgress = require(path.join(ADAPTER_DIR, '..', 'rp-quick-runtime', 'lib', 'import-progress.js'));
|
|
17
|
+
// On the public Store API this is a no-op — `src` there is already the original — so
|
|
18
|
+
// the URLs produced here do not change. It is called anyway because naming an image field
|
|
19
|
+
// directly is how a whole catalog once shipped as thumbnails: the same idiom got copied onto the
|
|
20
|
+
// authenticated wc/v3 payload, where `src` can be the smallest crop.
|
|
21
|
+
const { resolveImageUrls } = require(path.join(ADAPTER_DIR, '..', 'rp-source-wordpress', 'lib', 'wp-image-url.js'));
|
|
22
|
+
const { composeProductDescription } = require(path.join(ADAPTER_DIR, '..', 'rp-target-wix', 'lib', 'wix-build.js'));
|
|
23
|
+
|
|
24
|
+
async function readJson(filePath) {
|
|
25
|
+
return JSON.parse(await fs.readFile(filePath, 'utf8'));
|
|
26
|
+
}
|
|
27
|
+
async function writeJson(filePath, value) {
|
|
28
|
+
await fs.mkdir(path.dirname(filePath), { recursive: true });
|
|
29
|
+
await fs.writeFile(filePath, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
|
|
30
|
+
}
|
|
31
|
+
// A dry run never touches the live audit log.
|
|
32
|
+
async function appendAudit(projectDir, entry, dryRun = false) {
|
|
33
|
+
if (dryRun) return;
|
|
34
|
+
const file = path.join(projectDir, 'logs', 'quick-mode-audit.ndjson');
|
|
35
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
36
|
+
await fs.appendFile(file, `${JSON.stringify({ timestamp: new Date().toISOString(), ...entry })}\n`, 'utf8');
|
|
37
|
+
}
|
|
38
|
+
function origin(value) {
|
|
39
|
+
const url = new URL(value);
|
|
40
|
+
if (!['http:', 'https:'].includes(url.protocol)) throw new Error('sourceUrl must use http or https');
|
|
41
|
+
return url.origin;
|
|
42
|
+
}
|
|
43
|
+
function fingerprint(value) {
|
|
44
|
+
return crypto.createHash('sha256').update(JSON.stringify(value)).digest('hex');
|
|
45
|
+
}
|
|
46
|
+
async function projectContext(projectDir) {
|
|
47
|
+
const decisions = await readJson(path.join(projectDir, 'orchestration', 'decisions.json'));
|
|
48
|
+
const sourceUrl = decisions.sourceUrl && decisions.sourceUrl.value;
|
|
49
|
+
const sourcePlatform = decisions.sourcePlatform && decisions.sourcePlatform.value;
|
|
50
|
+
if (!sourceUrl) throw new Error('quick mode requires orchestration.decisions.sourceUrl');
|
|
51
|
+
if (sourcePlatform !== 'woocommerce') throw new Error(`quick WooCommerce adapter requires sourcePlatform=woocommerce (got ${sourcePlatform || 'missing'})`);
|
|
52
|
+
return { sourceUrl: origin(sourceUrl), decisions };
|
|
53
|
+
}
|
|
54
|
+
async function fetchCollection(baseUrl, route) {
|
|
55
|
+
const records = [];
|
|
56
|
+
const pages = [];
|
|
57
|
+
for (let page = 1; ; page += 1) {
|
|
58
|
+
const url = new URL(route, `${baseUrl}/`);
|
|
59
|
+
url.searchParams.set('page', String(page));
|
|
60
|
+
url.searchParams.set('per_page', '100');
|
|
61
|
+
const response = await fetch(url, { headers: { accept: 'application/json' } });
|
|
62
|
+
const text = await response.text();
|
|
63
|
+
let body;
|
|
64
|
+
try { body = text ? JSON.parse(text) : null; } catch { body = null; }
|
|
65
|
+
if (!response.ok || !Array.isArray(body)) {
|
|
66
|
+
return { ok: false, status: response.status, url: url.toString(), bodyType: Array.isArray(body) ? 'array' : typeof body, records, pages };
|
|
67
|
+
}
|
|
68
|
+
records.push(...body);
|
|
69
|
+
pages.push({ page, count: body.length, url: url.toString() });
|
|
70
|
+
const totalPages = Number(response.headers.get('x-wp-totalpages'));
|
|
71
|
+
if (Number.isFinite(totalPages) ? page >= totalPages : body.length < 100) break;
|
|
72
|
+
}
|
|
73
|
+
return { ok: true, records, pages };
|
|
74
|
+
}
|
|
75
|
+
async function preflight(projectDir) {
|
|
76
|
+
const { sourceUrl } = await projectContext(projectDir);
|
|
77
|
+
const checks = [];
|
|
78
|
+
for (const entity of CONTRACT.entities) {
|
|
79
|
+
const result = await fetchCollection(sourceUrl, entity.route);
|
|
80
|
+
checks.push({ entity: entity.id, route: entity.route, ok: result.ok, status: result.status || 200, url: result.url || result.pages[0]?.url || null, responseShape: result.ok ? 'array' : result.bodyType });
|
|
81
|
+
}
|
|
82
|
+
const out = { schemaVersion: 1, generatedAt: new Date().toISOString(), adapter: { id: CONTRACT.id, version: CONTRACT.version, fingerprint: fingerprint(CONTRACT) }, sourceUrl, status: checks.every((check) => check.ok) ? 'passed' : 'blocked', checks };
|
|
83
|
+
await writeJson(path.join(projectDir, 'quick-mode', 'preflight.json'), out);
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
async function plan(projectDir) {
|
|
87
|
+
const { sourceUrl } = await projectContext(projectDir);
|
|
88
|
+
const preflightResult = await readJson(path.join(projectDir, 'quick-mode', 'preflight.json'));
|
|
89
|
+
if (preflightResult.status !== 'passed') throw new Error('quick mode preflight must pass before planning');
|
|
90
|
+
const adapter = { id: CONTRACT.id, version: CONTRACT.version, fingerprint: fingerprint(CONTRACT) };
|
|
91
|
+
const generatedAt = new Date().toISOString();
|
|
92
|
+
// Every excluded[] capability becomes a declared-exclusion coverage row, checked by the same
|
|
93
|
+
// reconcile rule as a full run before the plan is written.
|
|
94
|
+
const coverage = await sourceCoverage.writeQuickPlanCoverage(projectDir, CONTRACT, { rawText: await fs.readFile(CONTRACT_PATH, 'utf8'), generatedAt });
|
|
95
|
+
const planResult = { schemaVersion: 1, generatedAt, managementImportMode: 'quick', adapter, sourceUrl, entities: CONTRACT.entities, requiredWixCapabilities: CONTRACT.requiredWixCapabilities, excluded: CONTRACT.excluded, excludedCapabilities: CONTRACT.excludedCapabilities, sourceAuth: 'none', sourceCoverageContract: coverage.sourceCoverageContract };
|
|
96
|
+
await writeJson(path.join(projectDir, 'quick-mode', 'plan.json'), planResult);
|
|
97
|
+
await writeJson(path.join(projectDir, 'execution', 'execution-manifest.json'), { schemaVersion: 1, generatedAt: planResult.generatedAt, managementImportMode: 'quick', adapter, extractCommand: 'rp-quick-woocommerce extract', importCommand: 'rp-quick-woocommerce import', entities: CONTRACT.entities.map((entity) => entity.id) });
|
|
98
|
+
return planResult;
|
|
99
|
+
}
|
|
100
|
+
async function extract(projectDir) {
|
|
101
|
+
const { sourceUrl } = await projectContext(projectDir);
|
|
102
|
+
const planResult = await readJson(path.join(projectDir, 'quick-mode', 'plan.json'));
|
|
103
|
+
if (planResult.adapter.fingerprint !== fingerprint(CONTRACT)) throw new Error('quick adapter contract changed; re-run preflight and plan');
|
|
104
|
+
const entities = {};
|
|
105
|
+
for (const entity of CONTRACT.entities) {
|
|
106
|
+
const result = await fetchCollection(sourceUrl, entity.route);
|
|
107
|
+
if (!result.ok) throw new Error(`${entity.id} extraction failed: ${result.status} ${result.url}`);
|
|
108
|
+
const file = path.join(projectDir, 'data', 'source-extract', `${entity.id}.ndjson`);
|
|
109
|
+
await fs.mkdir(path.dirname(file), { recursive: true });
|
|
110
|
+
await fs.writeFile(file, result.records.map((record) => JSON.stringify(record)).join('\n') + (result.records.length ? '\n' : ''), 'utf8');
|
|
111
|
+
entities[entity.id] = { file: path.relative(projectDir, file), route: entity.route, recordCount: result.records.length, pages: result.pages };
|
|
112
|
+
}
|
|
113
|
+
const manifest = { schemaVersion: 1, generatedAt: new Date().toISOString(), managementImportMode: 'quick', adapter: planResult.adapter, sourceUrl, entities };
|
|
114
|
+
await writeJson(path.join(projectDir, 'data', 'source-extract', 'manifest.json'), manifest);
|
|
115
|
+
return manifest;
|
|
116
|
+
}
|
|
117
|
+
function nonEmpty(value) { const text = value == null ? '' : String(value).trim(); return text || undefined; }
|
|
118
|
+
function text(value) { return String(value || '').replace(/<[^>]*>/g, '').replace(/&/g, '&').replace(/"/g, '"').trim(); }
|
|
119
|
+
function slug(value) { return nonEmpty(value)?.toLowerCase().replace(/[_\s]+/g, '-').replace(/[^a-z0-9-]+/g, '-').replace(/-+/g, '-').replace(/^-|-$/g, '') || undefined; }
|
|
120
|
+
function price(value, minor = 2) { const n = Number(value); return Number.isFinite(n) ? (n / (10 ** Number(minor || 2))).toFixed(Number(minor || 2)) : '0.00'; }
|
|
121
|
+
async function readLines(filePath) { const raw = await fs.readFile(filePath, 'utf8'); return raw.split(/\r?\n/).filter(Boolean).map(JSON.parse); }
|
|
122
|
+
async function loadWixEnv(projectDir) {
|
|
123
|
+
const values = {};
|
|
124
|
+
try {
|
|
125
|
+
for (const line of (await fs.readFile(path.join(projectDir, 'config', 'wix.env'), 'utf8')).split(/\r?\n/)) {
|
|
126
|
+
const m = line.trim().match(/^([A-Z0-9_]+)=(.*)$/); if (m) values[m[1]] = m[2].replace(/^['"]|['"]$/g, '').trim();
|
|
127
|
+
}
|
|
128
|
+
} catch (error) { if (error.code !== 'ENOENT') throw error; }
|
|
129
|
+
return { ...values, ...process.env };
|
|
130
|
+
}
|
|
131
|
+
async function loadCrosswalk(projectDir) {
|
|
132
|
+
try { return await readJson(path.join(projectDir, 'state', 'crosswalk', 'quick-mode.json')); }
|
|
133
|
+
catch (error) { if (error.code === 'ENOENT') return {}; throw error; }
|
|
134
|
+
}
|
|
135
|
+
async function ensureFallbackAuthor(projectDir) {
|
|
136
|
+
const env = await loadWixEnv(projectDir);
|
|
137
|
+
if (env.WIX_BLOG_FALLBACK_MEMBER_ID) return { status: 'already_configured', memberId: env.WIX_BLOG_FALLBACK_MEMBER_ID };
|
|
138
|
+
if (!env.WIX_AUTH_TOKEN || !env.WIX_SITE_ID) throw new Error('WIX_AUTH_TOKEN and WIX_SITE_ID are required to provision the Blog fallback author');
|
|
139
|
+
const writers = require(path.join(ADAPTER_DIR, '..', 'rp-target-wix', 'lib', 'wix-writers.js'));
|
|
140
|
+
const dryRun = writers.createDryRunConfig(env, process.argv.slice(2)).dryRun;
|
|
141
|
+
if (dryRun) return { status: 'planned_dry_run', memberId: null };
|
|
142
|
+
const quickRun = capabilities.startQuickRun({ projectDir, adapterId: 'quick-woocommerce', siteId: env.WIX_SITE_ID, dryRun: false });
|
|
143
|
+
const wix = writers.createWixClient({ capability: capabilities.bindQuickSetup(quickRun, 'blog-fallback-author'), authToken: env.WIX_AUTH_TOKEN });
|
|
144
|
+
const projectId = path.basename(projectDir).toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'migration';
|
|
145
|
+
const email = `replatform+${projectId}@wix.com`;
|
|
146
|
+
const listed = await writers.listMembers(wix, { limit: 100 });
|
|
147
|
+
let member = (listed.members || []).find((item) => String(item.loginEmail || '').toLowerCase() === email);
|
|
148
|
+
if (!member) member = await writers.ensureBlogFallbackAuthor(wix, { email, name: 'Imported content', slug: `imported-content-${projectId}` });
|
|
149
|
+
if (!member || !member.id) throw new Error('fallback Blog author was not created');
|
|
150
|
+
const configPath = path.join(projectDir, 'config', 'wix.env');
|
|
151
|
+
let raw = ''; try { raw = await fs.readFile(configPath, 'utf8'); } catch (error) { if (error.code !== 'ENOENT') throw error; }
|
|
152
|
+
await fs.mkdir(path.dirname(configPath), { recursive: true });
|
|
153
|
+
await fs.writeFile(configPath, `${raw.replace(/\n?WIX_BLOG_FALLBACK_MEMBER_ID=.*(?:\n|$)/g, '\n').replace(/\s*$/, '\n')}WIX_BLOG_FALLBACK_MEMBER_ID=${member.id}\n`, 'utf8');
|
|
154
|
+
return { status: 'provisioned', memberId: member.id };
|
|
155
|
+
}
|
|
156
|
+
async function importData(projectDir) {
|
|
157
|
+
const planResult = await readJson(path.join(projectDir, 'quick-mode', 'plan.json'));
|
|
158
|
+
const manifest = await readJson(path.join(projectDir, 'data', 'source-extract', 'manifest.json'));
|
|
159
|
+
importProgress.assertQuickImportAdapter({ plan: planResult, manifest, current: { id: CONTRACT.id, version: CONTRACT.version, fingerprint: fingerprint(CONTRACT) } });
|
|
160
|
+
// Fail closed before any write: a stamped plan with a missing or unreconciled coverage file
|
|
161
|
+
// must not produce a completion summary.
|
|
162
|
+
await sourceCoverage.quickSummaryCoverage(projectDir);
|
|
163
|
+
const env = await loadWixEnv(projectDir);
|
|
164
|
+
if (!env.WIX_AUTH_TOKEN || !env.WIX_SITE_ID) throw new Error('WIX_AUTH_TOKEN and WIX_SITE_ID are required for quick import');
|
|
165
|
+
const writers = require(path.join(ADAPTER_DIR, '..', 'rp-target-wix', 'lib', 'wix-writers.js'));
|
|
166
|
+
const dryRun = writers.createDryRunConfig(env, process.argv.slice(2)).dryRun;
|
|
167
|
+
const quickRun = capabilities.startQuickRun({ projectDir, adapterId: 'quick-woocommerce', siteId: env.WIX_SITE_ID, dryRun });
|
|
168
|
+
const clientFor = (id) => writers.createWixClient({ capability: capabilities.bindQuickEntity(quickRun, id), authToken: env.WIX_AUTH_TOKEN });
|
|
169
|
+
let wix = clientFor('product_category');
|
|
170
|
+
const sourceDir = path.join(projectDir, 'data', 'source-extract');
|
|
171
|
+
const crosswalk = await loadCrosswalk(projectDir);
|
|
172
|
+
// Durable pre-write evidence, before the first destination create. Some
|
|
173
|
+
// crosswalk checkpoints are deferred (blog tags, products), so the crosswalk cannot serve.
|
|
174
|
+
if (!dryRun) await importProgress.writeQuickImportStartedMarker(projectDir, planResult.adapter);
|
|
175
|
+
const seen = (entity, sourceId) => crosswalk[entity] && crosswalk[entity][String(sourceId)];
|
|
176
|
+
const remember = (entity, sourceId, targetId) => { if (!dryRun) { crosswalk[entity] ||= {}; crosswalk[entity][String(sourceId)] = targetId; } };
|
|
177
|
+
const checkpointCrosswalk = async () => { if (!dryRun) await writeJson(path.join(projectDir, 'state', 'crosswalk', 'quick-mode.json'), crosswalk); };
|
|
178
|
+
const summary = { schemaVersion: 1, generatedAt: new Date().toISOString(), managementImportMode: 'quick', adapter: planResult.adapter, dryRun, imported: {}, recovered: 0, recoveryCounts: {}, excluded: CONTRACT.excluded };
|
|
179
|
+
const categoryIds = new Map(); const productTagIds = new Map(); const blogCategoryIds = new Map(); const blogTagIds = new Map();
|
|
180
|
+
const existingCategories = new Map((await writers.queryAllStoresCategories(wix)).map((item) => [slug(item.slug), item]));
|
|
181
|
+
for (const row of await readLines(path.join(sourceDir, 'product_category.ndjson'))) {
|
|
182
|
+
if (seen('product_category', row.id)) { categoryIds.set(String(row.id), seen('product_category', row.id)); continue; }
|
|
183
|
+
const sourceSlug = slug(row.slug); const existing = existingCategories.get(sourceSlug);
|
|
184
|
+
const target = existing || await writers.createStoresCategory(wix, { name: text(row.name), slug: sourceSlug, description: nonEmpty(text(row.description).slice(0, 600)), treeReference: writers.STORES_TREE_REFERENCE }); categoryIds.set(String(row.id), target.id);
|
|
185
|
+
remember('product_category', row.id, target.id); await checkpointCrosswalk();
|
|
186
|
+
}
|
|
187
|
+
summary.imported.product_category = categoryIds.size;
|
|
188
|
+
capabilities.finishQuickEntity(quickRun, 'product_category'); wix = clientFor('product_tag');
|
|
189
|
+
const existingProductTags = new Map(((await wix.send(writers.buildListStoresProductTagsRequest())).tags || []).map((item) => [slug(item.name), item]));
|
|
190
|
+
for (const row of await readLines(path.join(sourceDir, 'product_tag.ndjson'))) {
|
|
191
|
+
if (seen('product_tag', row.id)) { productTagIds.set(String(row.id), seen('product_tag', row.id)); continue; }
|
|
192
|
+
const key = slug(row.name); const existing = existingProductTags.get(key);
|
|
193
|
+
const response = existing || (await wix.send(writers.buildCreateStoresProductTagRequest(text(row.name)))).tag;
|
|
194
|
+
productTagIds.set(String(row.id), response.id); remember('product_tag', row.id, response.id); await checkpointCrosswalk();
|
|
195
|
+
}
|
|
196
|
+
summary.imported.product_tag = productTagIds.size;
|
|
197
|
+
capabilities.finishQuickEntity(quickRun, 'product_tag'); wix = clientFor('blog_category');
|
|
198
|
+
const existingBlogCategories = new Map(((await wix.send(writers.buildQueryBlogCategoriesRequest())).categories || []).map((item) => [slug(item.slug), item]));
|
|
199
|
+
for (const row of await readLines(path.join(sourceDir, 'blog_category.ndjson'))) { if (seen('blog_category', row.id)) { blogCategoryIds.set(String(row.id), seen('blog_category', row.id)); continue; } const existing = existingBlogCategories.get(slug(row.slug)); const created = existing || await writers.createBlogCategory(wix, { label: text(row.name), slug: slug(row.slug), description: nonEmpty(text(row.description)) }); blogCategoryIds.set(String(row.id), created.id); remember('blog_category', row.id, created.id); await checkpointCrosswalk(); }
|
|
200
|
+
summary.imported.blog_category = blogCategoryIds.size;
|
|
201
|
+
capabilities.finishQuickEntity(quickRun, 'blog_category'); wix = clientFor('blog_tag');
|
|
202
|
+
for (const row of await readLines(path.join(sourceDir, 'blog_tag.ndjson'))) { if (seen('blog_tag', row.id)) { blogTagIds.set(String(row.id), seen('blog_tag', row.id)); continue; } const created = await writers.createBlogTag(wix, { label: text(row.name) }); blogTagIds.set(String(row.id), created.id); remember('blog_tag', row.id, created.id); }
|
|
203
|
+
summary.imported.blog_tag = blogTagIds.size;
|
|
204
|
+
capabilities.finishQuickEntity(quickRun, 'blog_tag'); wix = clientFor('post');
|
|
205
|
+
const fallbackMemberId = env.WIX_BLOG_FALLBACK_MEMBER_ID;
|
|
206
|
+
if (!fallbackMemberId) throw new Error('setup must provision WIX_BLOG_FALLBACK_MEMBER_ID before importing blog posts');
|
|
207
|
+
let posts = 0;
|
|
208
|
+
for (const row of await readLines(path.join(sourceDir, 'post.ndjson'))) {
|
|
209
|
+
if (seen('post', row.id)) { posts += 1; continue; }
|
|
210
|
+
await appendAudit(projectDir, { phase: 'post', sourceId: String(row.id), state: 'creating_draft' }, dryRun);
|
|
211
|
+
const draft = await writers.createDraftPost(wix, { title: text(row.title?.rendered), memberId: fallbackMemberId, richContent: await writers.convertHtmlToRichContent(wix, row.content?.rendered || '<p></p>'), excerpt: text(row.excerpt?.rendered), slug: slug(row.slug), categoryIds: (row.categories || []).map((id) => blogCategoryIds.get(String(id))).filter(Boolean), tagIds: (row.tags || []).map((id) => blogTagIds.get(String(id))).filter(Boolean), firstPublishedDate: Number.isNaN(new Date(row.date).valueOf()) ? undefined : new Date(row.date).toISOString() });
|
|
212
|
+
await appendAudit(projectDir, { phase: 'post', sourceId: String(row.id), state: 'publishing_draft', targetId: draft.id }, dryRun);
|
|
213
|
+
if (!dryRun) await writers.publishDraftPost(wix, draft.id); remember('post', row.id, draft.id); posts += 1;
|
|
214
|
+
await checkpointCrosswalk(); await appendAudit(projectDir, { phase: 'post', sourceId: String(row.id), state: 'completed', targetId: draft.id }, dryRun);
|
|
215
|
+
}
|
|
216
|
+
summary.imported.post = posts;
|
|
217
|
+
capabilities.finishQuickEntity(quickRun, 'post'); wix = clientFor('product');
|
|
218
|
+
let products = 0;
|
|
219
|
+
// A process can stop after a product create succeeds but before the crosswalk is
|
|
220
|
+
// checkpointed. Build a complete destination slug index up front so a resumed run
|
|
221
|
+
// recovers that write instead of treating the source record as a new product.
|
|
222
|
+
const existingProducts = new Map(
|
|
223
|
+
(await writers.queryAllStoresProducts(wix)).map((item) => [slug(item.slug), item]),
|
|
224
|
+
);
|
|
225
|
+
const productRows = await readLines(path.join(sourceDir, 'product.ndjson'));
|
|
226
|
+
const productSlugCounts = new Map();
|
|
227
|
+
for (const row of productRows) {
|
|
228
|
+
const key = slug(row.slug);
|
|
229
|
+
productSlugCounts.set(key, (productSlugCounts.get(key) || 0) + 1);
|
|
230
|
+
}
|
|
231
|
+
for (const row of productRows) {
|
|
232
|
+
if (seen('product', row.id)) { products += 1; continue; }
|
|
233
|
+
const baseSlug = slug(row.slug);
|
|
234
|
+
const sourceSlug = productSlugCounts.get(baseSlug) > 1 ? `${baseSlug}-${row.id}` : baseSlug;
|
|
235
|
+
const actualPrice = price(row.prices?.price, row.prices?.currency_minor_unit); const regular = price(row.prices?.regular_price, row.prices?.currency_minor_unit);
|
|
236
|
+
const normalized = recovery.normalizeProduct({ sourceId: row.id, sku: nonEmpty(row.sku) || '', tagIds: (row.tags || []).map((tag) => productTagIds.get(String(tag.id))).filter(Boolean) });
|
|
237
|
+
const created = existingProducts.get(sourceSlug) || (productSlugCounts.get(baseSlug) > 1 && existingProducts.get(baseSlug)) || await writers.createStoresProduct(wix, { name: text(row.name), slug: sourceSlug, description: composeProductDescription({ description: row.description, shortDescription: row.short_description }), productType: 'PHYSICAL', visible: true, tags: { publicTags: { tagIds: normalized.tagIds } }, media: { itemsInfo: { items: resolveImageUrls(row.images).map(({ url, altText, displayName }) => ({ url, ...(altText ? { altText } : {}), ...(displayName ? { displayName } : {}) })) } }, variantsInfo: { variants: [{ visible: true, sku: normalized.sku || undefined, inStock: row.is_in_stock !== false, price: { actualPrice: { amount: actualPrice }, ...(Number(regular) > Number(actualPrice) ? { compareAtPrice: { amount: regular } } : {}) } }] } });
|
|
238
|
+
if (normalized.recoveries.length) { if (!dryRun) await recovery.appendRecoveries(projectDir, planResult.adapter, row.id, normalized.recoveries); recovery.recordRecoveredRecord(summary, normalized.recoveries); }
|
|
239
|
+
const targets = (row.categories || []).map((category) => categoryIds.get(String(category.id))).filter(Boolean); if (targets.length) await writers.bulkAddItemToCategories(wix, { productId: created.id, categoryIds: targets }); remember('product', row.id, created.id); products += 1;
|
|
240
|
+
}
|
|
241
|
+
summary.imported.product = products;
|
|
242
|
+
capabilities.finishQuickEntity(quickRun, 'product');
|
|
243
|
+
if (!dryRun) await writeJson(path.join(projectDir, 'state', 'crosswalk', 'quick-mode.json'), crosswalk);
|
|
244
|
+
Object.assign(summary, await sourceCoverage.quickSummaryCoverage(projectDir));
|
|
245
|
+
await recovery.writeFinalReport(projectDir, summary, { dryRun });
|
|
246
|
+
await writeJson(path.join(projectDir, 'execution', dryRun ? 'dry-run-completion-report.json' : 'completion-report.json'), summary);
|
|
247
|
+
return summary;
|
|
248
|
+
}
|
|
249
|
+
async function main() {
|
|
250
|
+
const [command, projectDirArg] = process.argv.slice(2);
|
|
251
|
+
if (!command || !projectDirArg || !['preflight', 'plan', 'setup-author', 'extract', 'import'].includes(command)) throw new Error('Usage: quick-mode.js <preflight|plan|setup-author|extract|import> <projectDir>');
|
|
252
|
+
const result = await ({ preflight, plan, 'setup-author': ensureFallbackAuthor, extract, import: importData })[command](path.resolve(projectDirArg));
|
|
253
|
+
process.stdout.write(`${JSON.stringify({ ok: true, command, status: result.status || 'completed' })}\n`);
|
|
254
|
+
}
|
|
255
|
+
main().catch((error) => { process.stderr.write(`${error.message}\n`); process.exit(1); });
|
|
@@ -9,6 +9,35 @@ description: >-
|
|
|
9
9
|
|
|
10
10
|
Determine the Wix-side setup required before import can run safely.
|
|
11
11
|
|
|
12
|
+
## Declaring user-defined extended fields
|
|
13
|
+
|
|
14
|
+
When a mapping needs a source-only value on a native Wix record, declare it as a setup
|
|
15
|
+
requirement rather than letting a writer improvise one. The requirement and the step that
|
|
16
|
+
executes it are a fixed pair:
|
|
17
|
+
|
|
18
|
+
- the requirement is `kind: "extendedFieldSchema"` in `setup/setup-requirements.json`, carrying
|
|
19
|
+
`schemaKind`, `targetRef`, `fqdn`, `namespace: "_user_fields"`, and its `fields`;
|
|
20
|
+
- the plan step that provisions it is **`provision-extended-fields`** in `setup/setup-plan.json`.
|
|
21
|
+
|
|
22
|
+
Emit both or neither. A requirement with no matching step provisions nothing, and every writer
|
|
23
|
+
that needs those fields then refuses its write — correct, but the run fails late and for a
|
|
24
|
+
confusing reason. `rp-execute-setup` fails closed on that mismatch rather than proceeding.
|
|
25
|
+
|
|
26
|
+
Supported targets, and nothing else:
|
|
27
|
+
|
|
28
|
+
| Target | `schemaKind` | `fqdn` / surface | Types |
|
|
29
|
+
| --- | --- | --- | --- |
|
|
30
|
+
| eCommerce Order | `data-extension-schema` | `wix.ecom.*.order` | `string` (needs `maxLength`) |
|
|
31
|
+
| Product | `data-extension-schema` | `wix.stores.catalog.*.product` (filterable) | `string` |
|
|
32
|
+
| Contact (default) | `data-extension-schema` | `wix.contacts.*.contact`, `contactWriteSurface: "contacts-v5"` | `string` |
|
|
33
|
+
| Contact (legacy, explicit opt-in only) | `crm-contact-extended-field` | `contactWriteSurface: "contacts-v4"`, no `fqdn`/`namespace`; fields carry `displayName` + `dataType` | `TEXT` |
|
|
34
|
+
|
|
35
|
+
Checkout, Bookings, Booking Services and nested order subrecords (`extensionPoint`) are refused
|
|
36
|
+
before any network call — route such fields to CMS. Use `permissionsPreset: "migration-internal"`
|
|
37
|
+
(Wix users and apps read, Wix users write, no visitor access); visitor exposure is a manual
|
|
38
|
+
dashboard change by the site owner afterwards, never a setup default. Never emit both contact
|
|
39
|
+
surfaces for one field, and never plan a V4 fallback for a V5 contact field.
|
|
40
|
+
|
|
12
41
|
## Purpose
|
|
13
42
|
|
|
14
43
|
This skill analyzes the approved mapping artifacts and derives environment prerequisites
|
|
@@ -23,6 +52,23 @@ permissions, and any other target-system configuration dependencies.
|
|
|
23
52
|
- `migrations/<project>/orchestration/approvals.json`
|
|
24
53
|
- any Wix environment constraints or destination account details provided by the user
|
|
25
54
|
|
|
55
|
+
For `managementImportMode=quick`, replace the mapping inputs above with
|
|
56
|
+
`migrations/<project>/quick-mode/plan.json`. Its `requiredWixCapabilities` and entity graph are
|
|
57
|
+
the setup authority. Generate the same setup artifacts and standing notification/Catalog-V3
|
|
58
|
+
requirements; do not demand a mapping plan or ask an agent to infer additional quick entities.
|
|
59
|
+
When the plan includes blog posts, add an automatable dedicated fallback Blog author member,
|
|
60
|
+
persist its ID as `WIX_BLOG_FALLBACK_MEMBER_ID`, and disclose the attribution policy in the
|
|
61
|
+
setup summary. This is mandatory setup, never a user decision or import blocker.
|
|
62
|
+
|
|
63
|
+
Generate the quick-mode setup artifacts deterministically:
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
node skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js <projectDir>
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The adapter declares its entity graph and capabilities; this shared generator owns universal
|
|
70
|
+
destination setup policy and must not infer additional import entities.
|
|
71
|
+
|
|
26
72
|
## Workflow
|
|
27
73
|
|
|
28
74
|
1. Confirm the mapping review checkpoint has been accepted, then read the mapping plan and
|
|
@@ -34,8 +80,26 @@ permissions, and any other target-system configuration dependencies.
|
|
|
34
80
|
3. Determine which Wix apps must be installed or enabled.
|
|
35
81
|
4. Determine which SMC collections must exist.
|
|
36
82
|
5. Determine which extended-fields schemas, references, enums, or validation rules must exist.
|
|
37
|
-
6. Capture dependency ordering where setup steps depend on each other.
|
|
83
|
+
6. Capture dependency ordering where setup steps depend on each other. Every setup step
|
|
84
|
+
declares its canonical `entityRefs`. Where imports consume a setup-produced value,
|
|
85
|
+
declare optional `referenceKeys: [{ ref, sourceStableKey, paths: string[] }]` for that
|
|
86
|
+
step. Each ref must be in its `entityRefs`; keys come from the reviewed source mapping,
|
|
87
|
+
and paths name the exact dependent payload fields. Never invent a target ID in the plan.
|
|
88
|
+
Keep every setup-produced dependency `task-complete`, even when its target value is
|
|
89
|
+
used on individual records.
|
|
38
90
|
7. Write a setup artifact that downstream execution can verify.
|
|
91
|
+
8. Bind `setup/setup-plan.json` to the mapping plan it was derived from (a no-op when the
|
|
92
|
+
project has no plugin coverage):
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
node skills/wix-replatform/scripts/cms-fallback.js stamp-plan --project-dir <project> --plan setup
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
It copies `mapping-plan.json` `inputs.cmsFallbackDigest` into `setup-plan.json`
|
|
99
|
+
`inputs.cmsFallbackDigest`. The router treats a setup plan without it, or with a different
|
|
100
|
+
one, as stale (`setup_plan_stale_cms_fallback`) and routes back here before any setup or
|
|
101
|
+
import step. Create CMS collections only for capabilities the mapping plan maps to CMS: a
|
|
102
|
+
recognized capability whose CMS fallback is pending or declined gets no collection.
|
|
39
103
|
|
|
40
104
|
## Artifact to create or update
|
|
41
105
|
|
|
@@ -96,13 +160,15 @@ exist in Wix with the names/types you state — never invent them.
|
|
|
96
160
|
|
|
97
161
|
- Verify at the moment you write the requirement; do not defer it. Verify **enum
|
|
98
162
|
values**, not just names: confirm each `Field.type` against the Create Data Collection
|
|
99
|
-
schema. (
|
|
163
|
+
schema. (`SLUG` **does** exist in that enum, documented for dynamic page URLs. Use `TEXT` for
|
|
164
|
+
a preserved source slug held as identity/SEO data and `SLUG` when the target generates the
|
|
165
|
+
dynamic-page URL from it — never record `SLUG` as a type that does not exist.)
|
|
100
166
|
- If a Wix tool surface such as Wix MCP is available, use it as a fast verification aid.
|
|
101
167
|
- If no Wix tool surface is available, rely on `rp-target-wix`'s verified contracts plus
|
|
102
168
|
published Wix REST/SDK documentation and conservative, known-good names, and mark the
|
|
103
169
|
requirement `unverified` so a human confirms it before `rp-execute-setup` runs.
|
|
104
170
|
|
|
105
|
-
## Standing requirement: mute site notifications
|
|
171
|
+
## Standing requirement: mute site notifications
|
|
106
172
|
|
|
107
173
|
Emit a **`mute-site-notifications`** requirement into `setup/setup-plan.json` and
|
|
108
174
|
`setup/setup-requirements.json` whenever mute is in effect:
|
|
@@ -149,13 +215,17 @@ Do not assert "manual" / "cannot self-provision" by assumption — check the API
|
|
|
149
215
|
- Enabling a Wix app (Blog, Members, etc.) **is** automatable via the App Installation
|
|
150
216
|
API; classify it automatable and cite the method. (Common trap: do not mark Blog or
|
|
151
217
|
Members "cannot self-provision" — both are installable via the API.)
|
|
152
|
-
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
218
|
+
- Catalog V3 is guaranteed at provisioning regardless of scaffold template
|
|
219
|
+
so a Wix Stores install on a site this
|
|
220
|
+
run created needs no separate catalog-version requirement — do not emit one. This
|
|
221
|
+
guarantee does not extend to an existing site this run did not create: when
|
|
222
|
+
`WIX_SITE_STRATEGY=existing` and the migration carries a product catalog, still emit the
|
|
223
|
+
**`stores-catalog-v3` requirement** alongside the Wix Stores app install — expected state
|
|
224
|
+
`catalogVersion: V3_CATALOG`, verified read-only via
|
|
225
|
+
`GET https://www.wixapis.com/stores/v3/provision/version`, severity **blocker**,
|
|
226
|
+
automation mode `automatable`. A pre-existing site's catalog version predates this
|
|
227
|
+
guarantee, so it must still be confirmed rather than assumed (see `rp-execute-setup` →
|
|
228
|
+
"A `V1_CATALOG` verdict is terminal here").
|
|
159
229
|
- Creating CMS collections is automatable; enabling Wix Data itself is automatable by
|
|
160
230
|
installing the **Wix Data app `appDefId e593b0bd-b783-45b8-97c2-873d42aacaf4`** via the
|
|
161
231
|
App Installation API, after which `POST /wix-data/v2/collections` creates NATIVE
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const fs = require('node:fs/promises');
|
|
5
|
+
const path = require('node:path');
|
|
6
|
+
|
|
7
|
+
async function readJson(file) { return JSON.parse(await fs.readFile(file, 'utf8')); }
|
|
8
|
+
async function writeJson(file, value) { await fs.mkdir(path.dirname(file), { recursive: true }); await fs.writeFile(file, `${JSON.stringify(value, null, 2)}\n`, 'utf8'); }
|
|
9
|
+
function envValue(text, key) { const match = text.match(new RegExp(`^${key}=(.*)$`, 'm')); return match ? match[1].trim() : null; }
|
|
10
|
+
async function siteStrategy(projectDir) { try { return envValue(await fs.readFile(path.join(projectDir, 'config', 'wix.env'), 'utf8'), 'WIX_SITE_STRATEGY'); } catch (error) { if (error.code === 'ENOENT') return null; throw error; } }
|
|
11
|
+
function requirementsFor(plan, strategy) {
|
|
12
|
+
const capabilities = new Set(plan.requiredWixCapabilities || []);
|
|
13
|
+
const hasPosts = (plan.entities || []).some((entity) => entity.id === 'post');
|
|
14
|
+
const result = [];
|
|
15
|
+
if (strategy === 'new') result.push({ id: 'mute-site-notifications', order: 10, severity: 'blocker', automation: 'automatable', expected: 'site notifications are muted', verification: 'getSiteMuteState returns muted=true' });
|
|
16
|
+
if (capabilities.has('stores')) result.push({ id: 'wix-stores', order: 20, severity: 'blocker', automation: 'automatable', expected: 'Wix Stores is installed', verification: 'app installation state is enabled' });
|
|
17
|
+
if (capabilities.has('stores') && strategy === 'existing') result.push({ id: 'stores-catalog-v3', order: 30, severity: 'blocker', automation: 'automatable', expected: 'catalogVersion is V3_CATALOG', verification: 'GET /stores/v3/provision/version' });
|
|
18
|
+
if (capabilities.has('blog')) result.push({ id: 'wix-blog', order: 40, severity: 'blocker', automation: 'automatable', expected: 'Wix Blog is installed', verification: 'app installation state is enabled' });
|
|
19
|
+
if (hasPosts) result.push({ id: 'blog-fallback-author', order: 50, severity: 'blocker', automation: 'automatable', expected: 'dedicated fallback Blog member exists and WIX_BLOG_FALLBACK_MEMBER_ID is persisted', verification: 'member lookup and config key status' });
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
async function main() {
|
|
23
|
+
const projectDir = process.argv[2] && path.resolve(process.argv[2]);
|
|
24
|
+
if (!projectDir) throw new Error('Usage: quick-setup-plan.js <projectDir>');
|
|
25
|
+
const plan = await readJson(path.join(projectDir, 'quick-mode', 'plan.json'));
|
|
26
|
+
if (plan.managementImportMode !== 'quick' || !plan.adapter || !Array.isArray(plan.entities)) throw new Error('quick-mode/plan.json is not a valid quick plan');
|
|
27
|
+
const strategy = await siteStrategy(projectDir);
|
|
28
|
+
if (!strategy) throw new Error('WIX_SITE_STRATEGY is required before quick setup discovery');
|
|
29
|
+
const requirements = requirementsFor(plan, strategy);
|
|
30
|
+
const generatedAt = new Date().toISOString();
|
|
31
|
+
const common = { schemaVersion: 1, generatedAt, managementImportMode: 'quick', adapter: plan.adapter, sourcePlan: 'quick-mode/plan.json', siteStrategy: strategy, requirements };
|
|
32
|
+
await writeJson(path.join(projectDir, 'setup', 'setup-plan.json'), { ...common, steps: requirements.map((requirement) => ({ ...requirement, action: requirement.id })) });
|
|
33
|
+
await writeJson(path.join(projectDir, 'setup', 'setup-requirements.json'), common);
|
|
34
|
+
// setup-blockers.json is no longer seeded here: execute-setup.js is the sole writer of
|
|
35
|
+
// real blocker content (empty on full success, populated on a genuine failure), so a
|
|
36
|
+
// permanent blockers:[] stub written before setup ever runs would otherwise let a stale
|
|
37
|
+
// "no blockers" file survive a later failure. Its absence before setup runs is itself the
|
|
38
|
+
// correct "setup hasn't run yet" signal.
|
|
39
|
+
await writeJson(path.join(projectDir, 'setup', 'llm-handoff.json'), { schemaVersion: 1, generatedAt, needsLlm: false, reason: 'Quick setup requirements are derived from the adapter contract.' });
|
|
40
|
+
await fs.mkdir(path.join(projectDir, 'setup', 'review'), { recursive: true });
|
|
41
|
+
await fs.writeFile(path.join(projectDir, 'setup', 'review', 'setup-summary.md'), `# Quick setup summary\n\n${requirements.map((item) => `- ${item.id}: ${item.expected}`).join('\n')}\n`, 'utf8');
|
|
42
|
+
console.log(JSON.stringify({ ok: true, requirements: requirements.map((item) => item.id) }));
|
|
43
|
+
}
|
|
44
|
+
main().catch((error) => { console.error(error.message); process.exit(1); });
|
|
@@ -100,6 +100,9 @@ There is **no acquisition-mode fork and no credentials request** for a CSV run.
|
|
|
100
100
|
drift, mapping hints, entities and relations. **This is what `rp-discovery` synthesizes
|
|
101
101
|
`source-schema.json` from.**
|
|
102
102
|
- `raw-capture.json` — per-column detail plus head/tail samples.
|
|
103
|
+
- `source-coverage.json` — always written (`rows: []` when clean): one row per file with an
|
|
104
|
+
unknown role and per stream whose layout halted, so the decision a halt asks for cannot
|
|
105
|
+
disappear. `rp-discovery` promotes it.
|
|
103
106
|
- `<role>--<entity>.md` — one per entity.
|
|
104
107
|
|
|
105
108
|
4. **Honor the halt.** When the capture reports `halt: true` (ambiguous layout, unknown file
|
|
Binary file
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
const fs = require('node:fs/promises');
|
|
4
4
|
const path = require('node:path');
|
|
5
5
|
const { createProgressLogger, parseProgressArgs } = require('../../../lib/progress-log.js');
|
|
6
|
+
const { buildCsvCoverageRows, buildCoverageFile, ADAPTER_RAW_DIRS } = require('../../../lib/source-coverage.js');
|
|
6
7
|
|
|
7
8
|
// Parse, dialect detection, and type sniffing live in the shared adapter lib so
|
|
8
9
|
// the bulk-extract reader generated by rp-import-codegen inherits exactly the
|
|
@@ -844,6 +845,22 @@ async function capture(args) {
|
|
|
844
845
|
};
|
|
845
846
|
}
|
|
846
847
|
|
|
848
|
+
// A file with an unknown role and a stream whose layout halted to a decision are
|
|
849
|
+
// both inputs this capture could not turn into entities. Always written, `rows: []` when clean.
|
|
850
|
+
function sourceCoveragePayload(result) {
|
|
851
|
+
return buildCoverageFile({
|
|
852
|
+
platform: 'csv',
|
|
853
|
+
adapter: 'csv',
|
|
854
|
+
generatedAt: result.generatedAt,
|
|
855
|
+
rows: buildCsvCoverageRows({
|
|
856
|
+
sourceFiles: result.sourceFiles,
|
|
857
|
+
streams: result.streams,
|
|
858
|
+
csvInputRoot: result.csvInputRoot,
|
|
859
|
+
rawDir: ADAPTER_RAW_DIRS.csv,
|
|
860
|
+
}),
|
|
861
|
+
});
|
|
862
|
+
}
|
|
863
|
+
|
|
847
864
|
function commonDirectory(files) {
|
|
848
865
|
if (files.length === 0) {
|
|
849
866
|
return process.cwd();
|
|
@@ -868,6 +885,7 @@ async function writeOutputs(outDir, result) {
|
|
|
868
885
|
|
|
869
886
|
await fs.writeFile(path.join(outDir, 'fileset.json'), `${JSON.stringify(filesetPayload(result), null, 2)}\n`, 'utf8');
|
|
870
887
|
await fs.writeFile(path.join(outDir, 'raw-capture.json'), `${JSON.stringify(rawCapturePayload(result), null, 2)}\n`, 'utf8');
|
|
888
|
+
await fs.writeFile(path.join(outDir, 'source-coverage.json'), `${JSON.stringify(sourceCoveragePayload(result), null, 2)}\n`, 'utf8');
|
|
871
889
|
progress?.progress('Wrote CSV discovery machine capture', { phase: 'discovery', step: 'write-artifact', artifact: path.join(outDir, 'fileset.json') });
|
|
872
890
|
|
|
873
891
|
let entityCount = 0;
|
|
@@ -890,7 +908,7 @@ async function writeOutputs(outDir, result) {
|
|
|
890
908
|
async function main() {
|
|
891
909
|
const parsed = parseProgressArgs(process.argv.slice(2));
|
|
892
910
|
progress = createProgressLogger({
|
|
893
|
-
script: 'skills/replatform/resources/rp-source-csv/scripts/csv-discovery.js',
|
|
911
|
+
script: 'skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js',
|
|
894
912
|
...parsed.progress,
|
|
895
913
|
});
|
|
896
914
|
progress.start('CSV discovery started', { phase: 'discovery' });
|
|
@@ -945,5 +963,7 @@ module.exports = {
|
|
|
945
963
|
renderEntityFile,
|
|
946
964
|
filesetPayload,
|
|
947
965
|
rawCapturePayload,
|
|
966
|
+
sourceCoveragePayload,
|
|
948
967
|
capture,
|
|
968
|
+
writeOutputs,
|
|
949
969
|
};
|