@wix/agent-skills 1.33.1 → 1.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/package.json +1 -1
- package/skills/wix-export/SKILL.md +83 -0
- package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
- package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
- package/skills/wix-harmony-editor/SKILL.md +317 -0
- package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
- package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
- package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
- package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
- package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
- package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
- package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
- package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
- package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
- package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
- package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
- package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
- package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
- package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
- package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
- package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
- package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
- package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
- package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
- package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
- package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
- package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
- package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
- package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
- package/skills/wix-headless/SKILL.md +7 -2
- package/skills/wix-headless/references/CAPABILITIES.md +6 -1
- package/skills/wix-headless/references/DISCOVERY.md +2 -1
- package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
- package/skills/wix-headless/references/SEED.md +3 -2
- package/skills/wix-headless/references/SETUP.md +1 -0
- package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
- package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
- package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
- package/skills/wix-headless/references/managed/CREATE.md +1 -1
- package/skills/wix-headless-kit/SKILL.md +110 -21
- package/skills/wix-headless-kit/guides/api-run.md +15 -13
- package/skills/wix-headless-kit/guides/existing-site.md +31 -0
- package/skills/wix-headless-kit/guides/migration.md +49 -17
- package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
- package/skills/wix-headless-kit/install/context.mjs +61 -6
- package/skills/wix-headless-kit/install/pins.json +1 -1
- package/skills/wix-headless-kit/install/setup.mjs +107 -12
- package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
- package/skills/wix-headless-replatform/SKILL.md +116 -0
- package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
- package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
- package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
- package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
- package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
- package/skills/wix-headless-replatform/references/output-contract.md +93 -0
- package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
- package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
- package/skills/wix-headless-replatform/references/safety.md +19 -0
- package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
- package/skills/wix-headless-replatform/references/workflow.md +157 -0
- package/skills/wix-headless-replatform/registry/README.md +20 -0
- package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
- package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
- package/skills/wix-headless-replatform/registry/registry.json +36 -0
- package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
- package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
- package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
- package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
- package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
- package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
- package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
- package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
- package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
- package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
- package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
- package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
- package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
- package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
- package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
- package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
- package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
- package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
- package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
- package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
- package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
- package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
- package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
- package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
- package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
- package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
- package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
- package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
- package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
- package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
- package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
- package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
- package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
- package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
- package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
- package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
- package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
- package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
- package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
- package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
- package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
- package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
- package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
- package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
- package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
- package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
- package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
- package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
- package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
- package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
- package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
- package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
- package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
- package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
- package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
- package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
- package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
- package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
- package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
- package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
- package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
- package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
- package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
- package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
- package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
- package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
- package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
- package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
- package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
- package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
- package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
- package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
- package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
- package/skills/wix-import/SKILL.md +90 -0
- package/skills/wix-manage/SKILL.md +13 -3
- package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
- package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
- package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
- package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
- package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
- package/skills/wix-manage/references/sites/upload-static-site.md +127 -8
- package/skills/wix-replatform/.publish-manifest.json +5 -5
- package/skills/wix-replatform/CLI.md +162 -0
- package/skills/wix-replatform/README.md +52 -0
- package/skills/wix-replatform/SKILL.md +229 -684
- package/skills/wix-replatform/console/account.css +1 -0
- package/skills/wix-replatform/console/app.css +1 -0
- package/skills/wix-replatform/console/app.js +117 -0
- package/skills/wix-replatform/console/index.html +4 -0
- package/skills/wix-replatform/console/json.css +11 -0
- package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
- package/skills/wix-replatform/lib/app-page-routing.js +75 -0
- package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
- package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
- package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
- package/skills/wix-replatform/lib/completion-report.js +1393 -13
- package/skills/wix-replatform/lib/config-env.js +85 -11
- package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
- package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
- package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
- package/skills/wix-replatform/lib/destination-choice.js +163 -0
- package/skills/wix-replatform/lib/destination-handoff.js +62 -0
- package/skills/wix-replatform/lib/destination-http.js +81 -0
- package/skills/wix-replatform/lib/destination-route.js +98 -0
- package/skills/wix-replatform/lib/destination.js +919 -0
- package/skills/wix-replatform/lib/discovered-census.js +231 -0
- package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
- package/skills/wix-replatform/lib/document-url-guard.js +203 -0
- package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
- package/skills/wix-replatform/lib/entity-verification.js +18 -0
- package/skills/wix-replatform/lib/execution-capability.js +120 -0
- package/skills/wix-replatform/lib/execution-log.js +170 -0
- package/skills/wix-replatform/lib/execution-manifest.js +20 -2
- package/skills/wix-replatform/lib/execution-state.js +22 -0
- package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
- package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
- package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
- package/skills/wix-replatform/lib/import-recovery.js +800 -6
- package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
- package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
- package/skills/wix-replatform/lib/link-audit.js +173 -0
- package/skills/wix-replatform/lib/link-census.js +194 -0
- package/skills/wix-replatform/lib/link-plan.js +148 -0
- package/skills/wix-replatform/lib/link-verification.js +274 -0
- package/skills/wix-replatform/lib/link-write-journal.js +42 -0
- package/skills/wix-replatform/lib/local-state.js +869 -30
- package/skills/wix-replatform/lib/member-completion.js +658 -0
- package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
- package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
- package/skills/wix-replatform/lib/migration-completion.js +311 -0
- package/skills/wix-replatform/lib/operator-identity.js +47 -0
- package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
- package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
- package/skills/wix-replatform/lib/orchestration-router.js +608 -32
- package/skills/wix-replatform/lib/orchestration-state.js +188 -12
- package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
- package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
- package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
- package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
- package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
- package/skills/wix-replatform/lib/progress-log.js +19 -3
- package/skills/wix-replatform/lib/read-back-approval.js +184 -0
- package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
- package/skills/wix-replatform/lib/read-back-contract.js +243 -0
- package/skills/wix-replatform/lib/read-back-extract.js +118 -0
- package/skills/wix-replatform/lib/read-back-gate.js +734 -0
- package/skills/wix-replatform/lib/read-back-reads.js +94 -0
- package/skills/wix-replatform/lib/read-back-state.js +107 -0
- package/skills/wix-replatform/lib/read-back-summary.js +81 -0
- package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
- package/skills/wix-replatform/lib/run-controller.js +401 -0
- package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
- package/skills/wix-replatform/lib/setup-verification.js +148 -0
- package/skills/wix-replatform/lib/source-access.js +231 -0
- package/skills/wix-replatform/lib/source-coverage.js +1130 -0
- package/skills/wix-replatform/lib/source-secrets.js +277 -0
- package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
- package/skills/wix-replatform/lib/task-state.js +110 -0
- package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
- package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
- package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
- package/skills/wix-replatform/lib/url-verification.js +315 -0
- package/skills/wix-replatform/lib/user-action-effects.js +42 -0
- package/skills/wix-replatform/lib/user-actions.js +264 -0
- package/skills/wix-replatform/lib/website-handoff.js +1220 -0
- package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
- package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
- package/skills/wix-replatform/lib/write-verification-state.js +92 -0
- package/skills/wix-replatform/lib/write-verification.js +274 -0
- package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
- package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
- package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
- package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
- package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
- package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
- package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
- package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
- package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
- package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
- package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
- package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
- package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
- package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
- package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
- package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
- package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
- package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
- package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
- package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
- package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
- package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
- package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
- package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
- package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
- package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
- package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
- package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
- package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
- package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
- package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
- package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
- package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
- package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
- package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
- package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
- package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
- package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
- package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
- package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
- package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
- package/skills/wix-replatform/scripts/discovered-census.js +26 -0
- package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
- package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
- package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
- package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
- package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
- package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
- package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
- package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
- package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
- package/skills/wix-replatform/scripts/migration-completion.js +76 -0
- package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
- package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
- package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
- package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
- package/skills/wix-replatform/scripts/replatform-console.js +146 -0
- package/skills/wix-replatform/scripts/replatform.js +436 -0
- package/skills/wix-replatform/scripts/source-secrets.js +77 -0
- package/skills/wix-replatform/scripts/url-redirects.js +286 -0
- package/skills/wix-replatform/scripts/user-action.js +58 -0
- package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
- package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
- package/skills/wix-replatform/scripts/wix-destination.js +143 -0
- package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
- package/skills/wix-vibe-headless/SKILL.md +7 -3
- package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
- package/skills/wix-vibe-headless/platforms/base44.md +1 -0
- package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
- package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
- package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
- package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
- package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
- package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
- package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
- package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
- package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"domain": "tax",
|
|
4
|
+
"entity": "tax-settings",
|
|
5
|
+
"displayName": "Wix Tax Settings",
|
|
6
|
+
"capability": "commerce.tax-settings",
|
|
7
|
+
"target": {
|
|
8
|
+
"classification": "setup-config",
|
|
9
|
+
"nativeEntity": "TaxSettings",
|
|
10
|
+
"verifiedFqdn": "wix.billing.tax.v1.tax_settings",
|
|
11
|
+
"idPolicy": "not-applicable",
|
|
12
|
+
"crosswalkRequired": false
|
|
13
|
+
},
|
|
14
|
+
"sourceAliases": [
|
|
15
|
+
{
|
|
16
|
+
"sourceSystem": "woocommerce",
|
|
17
|
+
"sourceEntity": "settings.woocommerce_prices_include_tax",
|
|
18
|
+
"routes": ["/wc/v3/settings/tax"],
|
|
19
|
+
"confidence": "high",
|
|
20
|
+
"note": "A direct boolean 1:1: WooCommerce 'yes'/'no' -> Wix taxIncludedInItemPrices true/false. This is a single site-level flag, not a per-record entity -- there is exactly one TaxSettings resource per site (upsert, not create)."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"dependsOn": [],
|
|
24
|
+
"preferredWrite": {
|
|
25
|
+
"surface": "Tax Settings",
|
|
26
|
+
"endpoint": "POST /billing/v1/tax-settings",
|
|
27
|
+
"writerId": "upsertTaxSettings",
|
|
28
|
+
"verification": "verified-live",
|
|
29
|
+
"importSafe": true,
|
|
30
|
+
"bulk": false
|
|
31
|
+
},
|
|
32
|
+
"fallbacks": [],
|
|
33
|
+
"reliability": { "status": "reliable", "flags": [] },
|
|
34
|
+
"pitfalls": [
|
|
35
|
+
{
|
|
36
|
+
"code": "single-site-level-resource-not-a-crosswalked-record",
|
|
37
|
+
"severity": "info",
|
|
38
|
+
"summary": "There is exactly one TaxSettings object per site (Get returns defaults if never set; Upsert creates-or-updates the same singleton). Treat this as ordinary setup/config work, never a per-record write with a crosswalk."
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"code": "display-flag-only-does-not-reprice-the-catalog",
|
|
42
|
+
"severity": "info",
|
|
43
|
+
"summary": "`taxIncludedInItemPrices` only changes how checkout DISPLAYS/treats existing catalog prices (tax-inclusive vs. added-on-top); it does not rewrite product prices. Setting it does not require touching already-imported product prices."
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"code": "shared-across-all-wix-products-on-the-site",
|
|
47
|
+
"severity": "warning",
|
|
48
|
+
"summary": "Per Wix's own docs, this setting is 'shared across all Wix products on the site' -- if the destination site later gets a second sales channel/app relying on a different price-inclusion convention, changing this affects it too. Not a concern for a single-purpose migration, but don't set it speculatively on a site with pre-existing unrelated commerce config."
|
|
49
|
+
}
|
|
50
|
+
],
|
|
51
|
+
"mappingGuidance": [
|
|
52
|
+
"Dependencies: no other modeled record must exist first; Tax Settings is a single site-level configuration resource.",
|
|
53
|
+
"Read the source's woocommerce_prices_include_tax setting and the destination's Get Tax Settings response; call Upsert Tax Settings only when they differ. Live verification confirmed that a source value of 'no' can already match Wix's false default, requiring no write."
|
|
54
|
+
],
|
|
55
|
+
"setupRequirements": [],
|
|
56
|
+
"evidence": [
|
|
57
|
+
{ "type": "wix-docs", "url": "https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/extensions/tax/tax-settings/tax-settings-object" },
|
|
58
|
+
{ "type": "wix-docs", "url": "https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/extensions/tax/tax-settings/get-tax-settings" },
|
|
59
|
+
{ "type": "wix-docs", "url": "https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/extensions/tax/tax-settings/upsert-tax-settings" },
|
|
60
|
+
{
|
|
61
|
+
"type": "live-verification",
|
|
62
|
+
"path": "anonymized-live-verification"
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Blog post author attribution: resolve a real Wix member for each distinct source blog author,
|
|
4
|
+
// instead of attributing every imported post to the site owner.
|
|
5
|
+
//
|
|
6
|
+
// THE PITFALL: every imported blog post could carry the SAME memberId -- the site owner's own
|
|
7
|
+
// auto-created user-member -- regardless of which WordPress author actually wrote the post. The
|
|
8
|
+
// source data (data/source-extract/post.ndjson, via `_embedded.author`) names each post's
|
|
9
|
+
// distinct author, and all of them were discarded on import in favor of one hardcoded
|
|
10
|
+
// `WIX_BLOG_AUTHOR_MEMBER_ID`. Root cause: a stale
|
|
11
|
+
// assumption in wix-writers.js's members section ("attribute-to-owner blog imports need no
|
|
12
|
+
// member provisioning") -- a deliberate but wrong simplification, because Wix Blog's `memberId`
|
|
13
|
+
// is required and has no "unauthored" option.
|
|
14
|
+
//
|
|
15
|
+
// The sanctioned fix, verified directly against Wix's own documentation -- the internal skill
|
|
16
|
+
// doc "How to Create Blog Posts" (dev.wix.com/docs/api-reference/business-solutions/blog/skills/
|
|
17
|
+
// how-to-create-blog-posts, "Part 0: Get an Author/Member ID") -- is to CREATE a member when
|
|
18
|
+
// there is no existing member to reuse for an author: its `profile.nickname` (derived from
|
|
19
|
+
// `contact.firstName`) is the name the blog displays as the author, and "If the user named an
|
|
20
|
+
// author, use their name." The same doc, and wix-writers.js's own VERIFIED notes near
|
|
21
|
+
// `createMember`, confirm Create Member sends no email and fires no signup-automation trigger --
|
|
22
|
+
// member creation here is silent, not a notification risk.
|
|
23
|
+
//
|
|
24
|
+
// This creates ONE member per distinct SOURCE AUTHOR, never one per post: callers must resolve
|
|
25
|
+
// through a crosswalk keyed by `sourceAuthorId` (see the `crosswalk` param below) so two posts by
|
|
26
|
+
// the same WordPress author resolve to the same Wix member, and a resumed/re-run import never
|
|
27
|
+
// creates a second member for an author it already provisioned. Recording that crosswalk row
|
|
28
|
+
// after a successful create is the CALLER's responsibility (mirrors `customer-member.js` /
|
|
29
|
+
// `member-crosswalk.js`'s own ensure-then-persist split for the order-buyer member pass) --
|
|
30
|
+
// this module only resolves and creates; see rp-import-codegen/SKILL.md's "Blog post author
|
|
31
|
+
// attribution" section for the generated call site that does both.
|
|
32
|
+
//
|
|
33
|
+
// Not every migration source populates author info on every post (`_embedded.author` is a
|
|
34
|
+
// WordPress `_embed` convenience, not a guarantee across every source platform this toolkit
|
|
35
|
+
// supports) -- resolution falls back to the existing site-owner attribution when a post simply
|
|
36
|
+
// has no source author data, rather than making author resolution a hard requirement that blocks
|
|
37
|
+
// import.
|
|
38
|
+
|
|
39
|
+
const w = require('./wix-writers.js');
|
|
40
|
+
|
|
41
|
+
const OUTCOMES = Object.freeze([
|
|
42
|
+
'blog-author-reconciled-existing', // crosswalk already had a member for this source author
|
|
43
|
+
'blog-author-created', // no crosswalk row for this source author; a new member was created
|
|
44
|
+
'blog-author-owner-fallback', // post carries no source author info at all; owner attribution
|
|
45
|
+
]);
|
|
46
|
+
|
|
47
|
+
// RFC 2606 reserves `.invalid` for addresses guaranteed never to resolve or be deliverable --
|
|
48
|
+
// unlike `example.com`/`example.org`, which some mail systems do attempt to resolve, `.invalid`
|
|
49
|
+
// is the correct TLD for a placeholder address that must never receive mail. The local part
|
|
50
|
+
// carries ONLY the opaque source author id (never the author's real name or any other PII) --
|
|
51
|
+
// the whole point of this fix is that the human's NAME is what is supposed to show up as
|
|
52
|
+
// "posted by X" on the blog, deliberately, via `profile.nickname`/`contact.firstName`; the
|
|
53
|
+
// placeholder address that makes the member creatable carries none of it. The domain is scoped
|
|
54
|
+
// per `siteId` so the SAME source author id across two different projects' migrations can never
|
|
55
|
+
// collide into the same placeholder address -- loginEmail uniqueness is per-site in Wix Members,
|
|
56
|
+
// so this costs nothing and removes any cross-project ambiguity from the scheme.
|
|
57
|
+
//
|
|
58
|
+
// Pattern: `blog-author-{hash(sourceAuthorId)}@{hash(siteId)}.invalid` (see the collision fix
|
|
59
|
+
// below for why each component is a hash of the raw value rather than the raw value itself).
|
|
60
|
+
//
|
|
61
|
+
// COLLISION FIX: an earlier version of this function
|
|
62
|
+
// derived the token via a lossy, human-readable sanitization (lowercase, then collapse every run
|
|
63
|
+
// of non-alphanumeric characters to a single `-`). That is not injective: two different raw
|
|
64
|
+
// values that differ only in WHICH separator character they use collapse to the identical token
|
|
65
|
+
// -- e.g. sourceAuthorId `'1-2'` and `'1@2'` both sanitized to `'1-2'`, so two genuinely distinct
|
|
66
|
+
// WordPress authors would have collided onto the SAME placeholder `loginEmail` and therefore the
|
|
67
|
+
// SAME Wix member, silently misattributing one author's posts to the other. The fix derives the
|
|
68
|
+
// token from a hash of the RAW, un-sanitized value instead: distinct inputs can never collide
|
|
69
|
+
// (short of a SHA-1 collision). This token is never exposed as user-facing content -- it only
|
|
70
|
+
// ever appears inside the `.invalid` placeholder email's local part; the real, human-readable
|
|
71
|
+
// author name goes solely into `profile.nickname`/`contact.firstName` (see
|
|
72
|
+
// `resolveBlogAuthorMemberId` below) -- so there is no readability requirement to trade off here.
|
|
73
|
+
function sanitizeForEmailToken(value) {
|
|
74
|
+
const raw = value === undefined || value === null ? '' : String(value);
|
|
75
|
+
return require('node:crypto').createHash('sha1').update(raw).digest('hex').slice(0, 16);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function buildPlaceholderAuthorEmail({ sourceAuthorId, siteId }) {
|
|
79
|
+
if (sourceAuthorId === undefined || sourceAuthorId === null || sourceAuthorId === '') {
|
|
80
|
+
throw new Error('buildPlaceholderAuthorEmail requires sourceAuthorId');
|
|
81
|
+
}
|
|
82
|
+
const authorToken = sanitizeForEmailToken(sourceAuthorId);
|
|
83
|
+
const siteToken = sanitizeForEmailToken(siteId || 'site');
|
|
84
|
+
return `blog-author-${authorToken}@${siteToken}.invalid`;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// CORRECTED: this module previously paced its own Create
|
|
88
|
+
// Member write against a module-private `lastAuthorMemberWriteAt` clock, entirely disjoint from
|
|
89
|
+
// `ensureMember`'s own `lastMemberWriteAt` in wix-writers.js -- the two never saw each other's
|
|
90
|
+
// writes despite sharing the same `MEMBER_WRITE_MIN_INTERVAL_MS` constant. wix-writers.js's own
|
|
91
|
+
// comment documents the >=1s Create Member floor as a constraint on the Wix API endpoint
|
|
92
|
+
// itself, not on whichever function happens to call it, and rp-import-codegen/SKILL.md's
|
|
93
|
+
// generated importers run passes sequentially in ONE process -- so a migration's member
|
|
94
|
+
// pass (`ensureMember`) and blog-author pass (`resolveBlogAuthorMemberId`) could issue two
|
|
95
|
+
// Create Member calls under 1s apart. Fixed by going through wix-writers.js's exported
|
|
96
|
+
// `pacedCreateMember`, which reads and stamps the SAME clock `ensureMember` uses, so every
|
|
97
|
+
// Create Member call in the process -- regardless of which pass issues it -- is correctly
|
|
98
|
+
// spaced against every other one.
|
|
99
|
+
if (typeof w.pacedCreateMember !== 'function') {
|
|
100
|
+
throw new Error('blog-author-attribution.js requires wix-writers.js to export pacedCreateMember');
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// wix: the Wix API client (wix-writers.js's createWixClient()).
|
|
104
|
+
// sourceAuthorId / sourceAuthorName: pulled straight from the source post's author reference
|
|
105
|
+
// (e.g. WordPress `_embedded.author[0].id`/`.name`) -- null/undefined/'' means the source gave
|
|
106
|
+
// no author for this post at all.
|
|
107
|
+
// crosswalk: an object exposing async get(sourceAuthorId) -> { memberId, loginEmail } | null,
|
|
108
|
+
// such as `member-crosswalk.js`'s createProjectMemberCrosswalk({ projectDir, sourceSystem,
|
|
109
|
+
// sourceEntityType: 'blog-author' }). Required whenever sourceAuthorId is present -- this is
|
|
110
|
+
// what makes repeat resolution of the same author idempotent across resumed runs.
|
|
111
|
+
// siteId: folded into the placeholder email's domain (see buildPlaceholderAuthorEmail).
|
|
112
|
+
// ownerMemberId: the existing single-owner attribution fallback, used only when the source gives
|
|
113
|
+
// no author info for this post.
|
|
114
|
+
async function resolveBlogAuthorMemberId(wix, {
|
|
115
|
+
sourceAuthorId = null,
|
|
116
|
+
sourceAuthorName = null,
|
|
117
|
+
crosswalk = null,
|
|
118
|
+
siteId = null,
|
|
119
|
+
ownerMemberId = null,
|
|
120
|
+
safeModeOptions,
|
|
121
|
+
sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)),
|
|
122
|
+
} = {}) {
|
|
123
|
+
if (sourceAuthorId === null || sourceAuthorId === undefined || sourceAuthorId === '') {
|
|
124
|
+
if (!ownerMemberId) {
|
|
125
|
+
throw new Error('resolveBlogAuthorMemberId: post has no source author and no ownerMemberId fallback was supplied');
|
|
126
|
+
}
|
|
127
|
+
return { outcome: 'blog-author-owner-fallback', memberId: String(ownerMemberId), created: false };
|
|
128
|
+
}
|
|
129
|
+
if (!crosswalk || typeof crosswalk.get !== 'function') {
|
|
130
|
+
throw new Error('resolveBlogAuthorMemberId: a post with a source author requires a crosswalk with an async get(sourceAuthorId) lookup');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const existing = await crosswalk.get(sourceAuthorId);
|
|
134
|
+
if (existing && existing.memberId) {
|
|
135
|
+
return { outcome: 'blog-author-reconciled-existing', memberId: String(existing.memberId), created: false };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const displayName = (sourceAuthorName && String(sourceAuthorName).trim()) || `Author ${sourceAuthorId}`;
|
|
139
|
+
const loginEmail = buildPlaceholderAuthorEmail({ sourceAuthorId, siteId });
|
|
140
|
+
|
|
141
|
+
const member = await w.pacedCreateMember(wix, { email: loginEmail, name: displayName }, safeModeOptions, sleep);
|
|
142
|
+
// createMember only ever skips on an empty email (buildCreateMemberRequest's own guard);
|
|
143
|
+
// buildPlaceholderAuthorEmail never produces one, so reaching `skipped` means a caller bypassed
|
|
144
|
+
// it -- surfaced as an error rather than silently falling through to the owner.
|
|
145
|
+
if (member && member.skipped) {
|
|
146
|
+
throw new Error(`resolveBlogAuthorMemberId: member creation was skipped unexpectedly: ${member.reason}`);
|
|
147
|
+
}
|
|
148
|
+
if (!member || !member.id) {
|
|
149
|
+
throw new Error('resolveBlogAuthorMemberId: Create Member returned no id');
|
|
150
|
+
}
|
|
151
|
+
return {
|
|
152
|
+
outcome: 'blog-author-created',
|
|
153
|
+
memberId: String(member.id),
|
|
154
|
+
created: true,
|
|
155
|
+
loginEmail,
|
|
156
|
+
displayName,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
module.exports = {
|
|
161
|
+
OUTCOMES,
|
|
162
|
+
sanitizeForEmailToken,
|
|
163
|
+
buildPlaceholderAuthorEmail,
|
|
164
|
+
resolveBlogAuthorMemberId,
|
|
165
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const WIXAPIS = 'https://www.wixapis.com';
|
|
4
|
+
const writers = require('./wix-writers');
|
|
5
|
+
|
|
6
|
+
function unwrap(response, field) {
|
|
7
|
+
const value = response?.[field];
|
|
8
|
+
if (!value) throw new Error(`Wix Blog response lacks ${field}`);
|
|
9
|
+
return value;
|
|
10
|
+
}
|
|
11
|
+
function readUrl(surface, id) {
|
|
12
|
+
const encoded = encodeURIComponent(id);
|
|
13
|
+
return `${WIXAPIS}/blog/v3/${surface}/${encoded}?fieldsets=RICH_CONTENT&fieldsets=URL`;
|
|
14
|
+
}
|
|
15
|
+
function createBlogBuildClient(wix, { fetchPage, fetchImage } = {}) {
|
|
16
|
+
if (!wix || typeof wix.send !== 'function') throw new Error('blog build client needs wix.send');
|
|
17
|
+
return {
|
|
18
|
+
async createDraft(post) {
|
|
19
|
+
const response = await wix.send({ method: 'POST', url: `${WIXAPIS}/blog/v3/draft-posts`,
|
|
20
|
+
body: { draftPost: post, fieldsets: ['RICH_CONTENT', 'URL'] } });
|
|
21
|
+
return unwrap(response, 'draftPost');
|
|
22
|
+
},
|
|
23
|
+
async updateDraft(id, projection) {
|
|
24
|
+
const response = await wix.send({ method: 'PATCH', url: `${WIXAPIS}/blog/v3/draft-posts/${encodeURIComponent(id)}`,
|
|
25
|
+
body: { action: 'UPDATE', draftPost: { id, ...projection }, fieldsets: ['RICH_CONTENT', 'URL'] } });
|
|
26
|
+
return unwrap(response, 'draftPost');
|
|
27
|
+
},
|
|
28
|
+
async publishDraft(id) { return writers.publishDraftPost(wix, id); },
|
|
29
|
+
async getDraft(id) { return unwrap(await wix.send({ method: 'GET', url: readUrl('draft-posts', id) }), 'draftPost'); },
|
|
30
|
+
async getPost(id) { return unwrap(await wix.send({ method: 'GET', url: readUrl('posts', id) }), 'post'); },
|
|
31
|
+
async listDrafts({ cursor } = {}) {
|
|
32
|
+
const params = new URLSearchParams({ 'paging.limit': '100', status: 'UNPUBLISHED' });
|
|
33
|
+
if (cursor?.startsWith('offset:')) params.set('paging.offset', cursor.slice('offset:'.length));
|
|
34
|
+
else if (cursor) params.set('paging.cursor', cursor);
|
|
35
|
+
const response = await wix.send({ method: 'GET', url: `${WIXAPIS}/blog/v3/draft-posts?${params}` });
|
|
36
|
+
const drafts = response?.draftPosts;
|
|
37
|
+
if (!Array.isArray(drafts)) throw new Error('Wix Blog list response lacks draftPosts');
|
|
38
|
+
// Blog List Draft Posts exposes metaData; other Wix list APIs use pagingMetadata.
|
|
39
|
+
// Accept either documented envelope, but never silently truncate an uncertain page.
|
|
40
|
+
const metadata = response?.metaData || response?.pagingMetadata;
|
|
41
|
+
if (!metadata) throw new Error('Wix Blog list response lacks pagination metadata');
|
|
42
|
+
let nextCursor = metadata.cursors?.next || metadata.nextCursor || null;
|
|
43
|
+
if (!nextCursor && Number.isFinite(metadata.total) && Number.isFinite(metadata.offset) &&
|
|
44
|
+
metadata.offset + drafts.length < metadata.total) {
|
|
45
|
+
if (!drafts.length) throw new Error('Wix Blog list made no offset progress');
|
|
46
|
+
nextCursor = `offset:${metadata.offset + drafts.length}`;
|
|
47
|
+
}
|
|
48
|
+
if (!nextCursor && drafts.length === 100 && !Number.isFinite(metadata.total)) {
|
|
49
|
+
throw new Error('Wix Blog list ended on a full page without pagination evidence');
|
|
50
|
+
}
|
|
51
|
+
return { drafts, nextCursor };
|
|
52
|
+
},
|
|
53
|
+
async deletePost(id) { return writers.deletePost(wix, id); },
|
|
54
|
+
async deleteDraft(id) { return wix.send(writers.buildDeleteDraftPostRequest(id)); },
|
|
55
|
+
...(fetchPage ? { fetchPage } : {}),
|
|
56
|
+
...(fetchImage ? { fetchImage } : {}),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
module.exports = { createBlogBuildClient };
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const ledger = require('./blog-post-build-ledger');
|
|
4
|
+
const reports = require('./blog-post-build-report');
|
|
5
|
+
|
|
6
|
+
function pairKey(key, extraId) { return `${key}\u0000${extraId}`; }
|
|
7
|
+
function currentPair(projectDir, key, extraId) {
|
|
8
|
+
return ledger.fold(ledger.readRows(projectDir)).duplicates.get(pairKey(key, extraId));
|
|
9
|
+
}
|
|
10
|
+
function append(projectDir, key, recordedDraftId, extraDraftId, event, rest = {}) {
|
|
11
|
+
return ledger.appendRow(projectDir, { kind: 'duplicate', sourceStableKey: key,
|
|
12
|
+
recordedDraftId, extraDraftId, event, ...rest });
|
|
13
|
+
}
|
|
14
|
+
function isNotFound(error) {
|
|
15
|
+
if (error?.status !== 404) return false;
|
|
16
|
+
const code = error.code || error.applicationErrorCode || error.details?.code ||
|
|
17
|
+
error.body?.details?.applicationError?.code;
|
|
18
|
+
const message = error.body?.message || error.message || '';
|
|
19
|
+
return ['NOT_FOUND', 'ENTITY_NOT_FOUND'].includes(code) ||
|
|
20
|
+
(!code && error.outcomeKnown === true && /^entity not found\b/i.test(String(message)));
|
|
21
|
+
}
|
|
22
|
+
async function readOrNull(fn, id) {
|
|
23
|
+
try { return await fn(id); } catch (error) { if (isNotFound(error)) return null; throw error; }
|
|
24
|
+
}
|
|
25
|
+
async function listAll(client) {
|
|
26
|
+
const drafts = [];
|
|
27
|
+
let cursor = null;
|
|
28
|
+
const cursors = new Set();
|
|
29
|
+
for (let n = 0; n < 1000; n += 1) {
|
|
30
|
+
const page = await client.listDrafts({ cursor });
|
|
31
|
+
if (!Array.isArray(page?.drafts)) throw new Error('draft listing lacks drafts array');
|
|
32
|
+
drafts.push(...page.drafts);
|
|
33
|
+
if (!page.nextCursor) return drafts;
|
|
34
|
+
if (cursors.has(page.nextCursor)) throw new Error('draft listing cursor repeated');
|
|
35
|
+
cursors.add(page.nextCursor);
|
|
36
|
+
cursor = page.nextCursor;
|
|
37
|
+
}
|
|
38
|
+
throw new Error('draft listing page cap reached');
|
|
39
|
+
}
|
|
40
|
+
function sourceRows(state, key) {
|
|
41
|
+
return state.posts.get(key)?.rows || [];
|
|
42
|
+
}
|
|
43
|
+
function intentAndCreate(state, key) {
|
|
44
|
+
const rows = sourceRows(state, key);
|
|
45
|
+
const create = [...rows].reverse().find(row => row.kind === 'phase' && ['drafted', 'contain-drafted'].includes(row.phase));
|
|
46
|
+
return {
|
|
47
|
+
intent: [...rows].reverse().find(row => row.seq < create?.seq && row.kind === 'phase' &&
|
|
48
|
+
['creating', 'contain-recreating'].includes(row.phase)),
|
|
49
|
+
create,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function recordedElsewhere(state, id, key, crosswalk) {
|
|
53
|
+
if (typeof crosswalk?.idOwners !== 'function') return true;
|
|
54
|
+
for (const [otherKey, post] of state.posts) {
|
|
55
|
+
if (otherKey !== key && post.rows.some(row => row.draftId === id || row.postId === id)) return true;
|
|
56
|
+
}
|
|
57
|
+
return Boolean(crosswalk?.idOwners?.(id)?.some(owner => String(owner) !== key));
|
|
58
|
+
}
|
|
59
|
+
function assessProvenance(state, key, extraId, draft, crosswalk) {
|
|
60
|
+
const { intent, create } = intentAndCreate(state, key);
|
|
61
|
+
const sourceFp = intent?.fingerprint;
|
|
62
|
+
const creation = Date.parse(draft?.createdDate || draft?.createdAt);
|
|
63
|
+
const edited = Date.parse(draft?.editedDate || draft?.updatedDate);
|
|
64
|
+
const started = Date.parse(intent?.ts);
|
|
65
|
+
const finished = Date.parse(create?.ts);
|
|
66
|
+
const tests = {
|
|
67
|
+
fingerprint: Boolean(draft && sourceFp && ledger.fingerprint(draft) === sourceFp),
|
|
68
|
+
storedBody: Boolean(draft && create?.storedBodySha && ledger.bodySha(draft) === create.storedBodySha),
|
|
69
|
+
creationWindow: Number.isFinite(creation) && Number.isFinite(started) && Number.isFinite(finished) &&
|
|
70
|
+
creation >= started - 5 * 60_000 && creation <= finished,
|
|
71
|
+
unedited: Number.isFinite(edited) && Number.isFinite(creation) && Math.abs(edited - creation) <= 1000,
|
|
72
|
+
unowned: !recordedElsewhere(state, extraId, key, crosswalk),
|
|
73
|
+
};
|
|
74
|
+
return { status: Object.values(tests).every(Boolean) ? 'consistent' : 'inconsistent', tests,
|
|
75
|
+
title: draft?.title || null, createdDate: draft?.createdDate || draft?.createdAt || null };
|
|
76
|
+
}
|
|
77
|
+
async function recordProvenance(projectDir, key, extraId, client, crosswalk, alreadyRead) {
|
|
78
|
+
const pair = currentPair(projectDir, key, extraId);
|
|
79
|
+
if (!pair || pair.closed) throw new Error('no open duplicate pair');
|
|
80
|
+
let draft = alreadyRead;
|
|
81
|
+
let readError;
|
|
82
|
+
if (!draft) {
|
|
83
|
+
try { draft = await client.getDraft(extraId); }
|
|
84
|
+
catch (error) { readError = error.message; }
|
|
85
|
+
}
|
|
86
|
+
const state = ledger.fold(ledger.readRows(projectDir));
|
|
87
|
+
const evidence = draft ? assessProvenance(state, key, extraId, draft, crosswalk)
|
|
88
|
+
: { status: 'inconsistent', tests: {}, readError };
|
|
89
|
+
append(projectDir, key, pair.recordedDraftId, extraId, 'provenance', { evidence });
|
|
90
|
+
return evidence;
|
|
91
|
+
}
|
|
92
|
+
async function finishPendingEvidence(projectDir, client, crosswalk) {
|
|
93
|
+
const state = ledger.fold(ledger.readRows(projectDir));
|
|
94
|
+
for (const pair of state.duplicates.values()) {
|
|
95
|
+
if (!pair.closed && !pair.evidence) await recordProvenance(projectDir, pair.sourceStableKey, pair.extraDraftId, client, crosswalk);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async function detectExtraDrafts(projectDir, client, crosswalk, onlyKey) {
|
|
99
|
+
const state = ledger.fold(ledger.readRows(projectDir));
|
|
100
|
+
const targets = [...state.posts.entries()].filter(([key, post]) => (!onlyKey || key === onlyKey) &&
|
|
101
|
+
post.rows.some(row => ['drafted', 'contain-drafted'].includes(row.phase) && row.recreatedAfterIntent));
|
|
102
|
+
if (!targets.length) return [];
|
|
103
|
+
const drafts = await listAll(client);
|
|
104
|
+
const added = [];
|
|
105
|
+
for (const [key, post] of targets) {
|
|
106
|
+
const { intent, create } = intentAndCreate(state, key);
|
|
107
|
+
if (!intent || !create) continue;
|
|
108
|
+
const intentBody = [...post.rows].reverse().find(row => row.kind === 'desired-state' &&
|
|
109
|
+
row.seq < intent.seq);
|
|
110
|
+
if (!intentBody) throw new Error(`blog duplicate ${key}: create intent has no pinned body`);
|
|
111
|
+
const expectedTitle = ledger.loadGeneration(projectDir, intentBody.snapshotSha, key).desiredPost.title;
|
|
112
|
+
for (const draft of drafts) {
|
|
113
|
+
if (draft.id === create.draftId || draft.title !== expectedTitle) continue;
|
|
114
|
+
if (currentPair(projectDir, key, draft.id)) continue;
|
|
115
|
+
// List responses need not include every fingerprint field; use one full read
|
|
116
|
+
// for matching and provenance rather than missing a late-visible duplicate.
|
|
117
|
+
let full;
|
|
118
|
+
try { full = await client.getDraft(draft.id); }
|
|
119
|
+
catch (error) {
|
|
120
|
+
append(projectDir, key, create.draftId, draft.id, 'detected');
|
|
121
|
+
append(projectDir, key, create.draftId, draft.id, 'provenance',
|
|
122
|
+
{ evidence: { status: 'inconsistent', tests: {}, readError: error.message } });
|
|
123
|
+
added.push({ sourceStableKey: key, extraDraftId: draft.id });
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (ledger.fingerprint(full) !== intent.fingerprint) continue;
|
|
127
|
+
append(projectDir, key, create.draftId, draft.id, 'detected');
|
|
128
|
+
added.push({ sourceStableKey: key, extraDraftId: draft.id });
|
|
129
|
+
await recordProvenance(projectDir, key, draft.id, client, crosswalk, full);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return added;
|
|
133
|
+
}
|
|
134
|
+
function ensureEvidence(pair, expected = 'consistent') {
|
|
135
|
+
if (!pair || pair.closed || pair.evidence?.status !== expected) throw new Error(`duplicate needs current ${expected} evidence`);
|
|
136
|
+
}
|
|
137
|
+
function confirmOwnership(projectDir, key, extraId, chosenBy, note) {
|
|
138
|
+
return ledger.withLock(projectDir, async () => {
|
|
139
|
+
const pair = currentPair(projectDir, key, extraId);
|
|
140
|
+
ensureEvidence(pair);
|
|
141
|
+
if (!String(chosenBy || '').trim() || !String(note || '').trim()) throw new Error('ownership needs named person and their explanation');
|
|
142
|
+
const row = append(projectDir, key, pair.recordedDraftId, extraId, 'ownership-confirmed', { chosenBy, note });
|
|
143
|
+
return { row, ...(await reports.refreshBlogHandoff(projectDir)) };
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
function keepOrNotImporter(projectDir, key, extraId, event, chosenBy, note) {
|
|
147
|
+
return ledger.withLock(projectDir, async () => {
|
|
148
|
+
const pair = currentPair(projectDir, key, extraId);
|
|
149
|
+
if (!pair || pair.closed) throw new Error('no open duplicate pair');
|
|
150
|
+
if (!['kept', 'not-importer'].includes(event)) throw new Error('invalid duplicate closure');
|
|
151
|
+
if (!String(note || '').trim()) throw new Error('the person’s note is required');
|
|
152
|
+
if (event === 'kept' && !String(chosenBy || '').trim()) throw new Error('chosenBy required');
|
|
153
|
+
const row = append(projectDir, key, pair.recordedDraftId, extraId, event, { chosenBy, note });
|
|
154
|
+
return { row, ...(await reports.refreshBlogHandoff(projectDir)) };
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
async function deleteConfirmedExtra(projectDir, key, extraId, chosenBy, note, client, crosswalk) {
|
|
158
|
+
return ledger.withLock(projectDir, async () => {
|
|
159
|
+
let pair = currentPair(projectDir, key, extraId);
|
|
160
|
+
ensureEvidence(pair);
|
|
161
|
+
if (!pair.confirmation || !String(chosenBy || '').trim() || !String(note || '').trim()) {
|
|
162
|
+
throw new Error('current ownership confirmation and a separate named delete choice required');
|
|
163
|
+
}
|
|
164
|
+
if (!pair.choice) append(projectDir, key, pair.recordedDraftId, extraId, 'delete-chosen', { chosenBy, note });
|
|
165
|
+
const draft = await readOrNull(value => client.getDraft(value), extraId);
|
|
166
|
+
if (!draft) {
|
|
167
|
+
const post = await readOrNull(value => client.getPost(value), extraId);
|
|
168
|
+
if (!post) {
|
|
169
|
+
append(projectDir, key, pair.recordedDraftId, extraId, 'removed');
|
|
170
|
+
return (await reports.refreshBlogHandoff(projectDir)).report;
|
|
171
|
+
}
|
|
172
|
+
append(projectDir, key, pair.recordedDraftId, extraId, 'unresolved',
|
|
173
|
+
{ evidence: { status: 'inconsistent', tests: { unpublished: false } } });
|
|
174
|
+
return (await reports.refreshBlogHandoff(projectDir)).report;
|
|
175
|
+
}
|
|
176
|
+
const evidence = assessProvenance(ledger.fold(ledger.readRows(projectDir)), key, extraId, draft, crosswalk);
|
|
177
|
+
if (evidence.status !== 'consistent') {
|
|
178
|
+
append(projectDir, key, pair.recordedDraftId, extraId, 'unresolved', { evidence });
|
|
179
|
+
return (await reports.refreshBlogHandoff(projectDir)).report;
|
|
180
|
+
}
|
|
181
|
+
if (typeof client.deleteDraft !== 'function') throw new Error('client needs deleteDraft for chosen duplicate deletion');
|
|
182
|
+
await client.deleteDraft(extraId);
|
|
183
|
+
const draftAfter = await readOrNull(value => client.getDraft(value), extraId);
|
|
184
|
+
const postAfter = await readOrNull(value => client.getPost(value), extraId);
|
|
185
|
+
if (draftAfter || postAfter) throw new Error('extra draft deletion not confirmed on both surfaces');
|
|
186
|
+
pair = currentPair(projectDir, key, extraId);
|
|
187
|
+
append(projectDir, key, pair.recordedDraftId, extraId, 'removed');
|
|
188
|
+
return (await reports.refreshBlogHandoff(projectDir)).report;
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function recheckProvenance(projectDir, key, extraId, client, crosswalk) {
|
|
193
|
+
return ledger.withLock(projectDir, async () => {
|
|
194
|
+
const evidence = await recordProvenance(projectDir, key, extraId, client, crosswalk);
|
|
195
|
+
return { evidence, ...(await reports.refreshBlogHandoff(projectDir)) };
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
module.exports = { pairKey, currentPair, assessProvenance,
|
|
200
|
+
finishPendingEvidence, detectExtraDrafts, confirmOwnership, keepOrNotImporter,
|
|
201
|
+
deleteConfirmedExtra, recheckProvenance };
|