@wix/agent-skills 1.33.1 → 1.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/package.json +1 -1
- package/skills/wix-export/SKILL.md +83 -0
- package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
- package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
- package/skills/wix-harmony-editor/SKILL.md +317 -0
- package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
- package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
- package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
- package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
- package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
- package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
- package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
- package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
- package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
- package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
- package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
- package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
- package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
- package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
- package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
- package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
- package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
- package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
- package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
- package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
- package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
- package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
- package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
- package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
- package/skills/wix-headless/SKILL.md +7 -2
- package/skills/wix-headless/references/CAPABILITIES.md +6 -1
- package/skills/wix-headless/references/DISCOVERY.md +2 -1
- package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
- package/skills/wix-headless/references/SEED.md +3 -2
- package/skills/wix-headless/references/SETUP.md +1 -0
- package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
- package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
- package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
- package/skills/wix-headless/references/managed/CREATE.md +1 -1
- package/skills/wix-headless-kit/SKILL.md +110 -21
- package/skills/wix-headless-kit/guides/api-run.md +15 -13
- package/skills/wix-headless-kit/guides/existing-site.md +31 -0
- package/skills/wix-headless-kit/guides/migration.md +49 -17
- package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
- package/skills/wix-headless-kit/install/context.mjs +61 -6
- package/skills/wix-headless-kit/install/pins.json +1 -1
- package/skills/wix-headless-kit/install/setup.mjs +107 -12
- package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
- package/skills/wix-headless-replatform/SKILL.md +116 -0
- package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
- package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
- package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
- package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
- package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
- package/skills/wix-headless-replatform/references/output-contract.md +93 -0
- package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
- package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
- package/skills/wix-headless-replatform/references/safety.md +19 -0
- package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
- package/skills/wix-headless-replatform/references/workflow.md +157 -0
- package/skills/wix-headless-replatform/registry/README.md +20 -0
- package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
- package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
- package/skills/wix-headless-replatform/registry/registry.json +36 -0
- package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
- package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
- package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
- package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
- package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
- package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
- package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
- package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
- package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
- package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
- package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
- package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
- package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
- package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
- package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
- package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
- package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
- package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
- package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
- package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
- package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
- package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
- package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
- package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
- package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
- package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
- package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
- package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
- package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
- package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
- package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
- package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
- package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
- package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
- package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
- package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
- package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
- package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
- package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
- package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
- package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
- package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
- package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
- package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
- package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
- package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
- package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
- package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
- package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
- package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
- package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
- package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
- package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
- package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
- package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
- package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
- package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
- package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
- package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
- package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
- package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
- package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
- package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
- package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
- package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
- package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
- package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
- package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
- package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
- package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
- package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
- package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
- package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
- package/skills/wix-import/SKILL.md +90 -0
- package/skills/wix-manage/SKILL.md +14 -4
- package/skills/wix-manage/references/blog/how-to-create-blog-posts.md +2 -0
- package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
- package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
- package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
- package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
- package/skills/wix-manage/references/seo/manage-content-plan.md +207 -222
- package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
- package/skills/wix-manage/references/sites/upload-static-site.md +128 -8
- package/skills/wix-readme/SKILL.md +166 -0
- package/skills/wix-replatform/.publish-manifest.json +5 -5
- package/skills/wix-replatform/CLI.md +162 -0
- package/skills/wix-replatform/README.md +52 -0
- package/skills/wix-replatform/SKILL.md +229 -684
- package/skills/wix-replatform/console/account.css +1 -0
- package/skills/wix-replatform/console/app.css +1 -0
- package/skills/wix-replatform/console/app.js +117 -0
- package/skills/wix-replatform/console/index.html +4 -0
- package/skills/wix-replatform/console/json.css +11 -0
- package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
- package/skills/wix-replatform/lib/app-page-routing.js +75 -0
- package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
- package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
- package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
- package/skills/wix-replatform/lib/completion-report.js +1393 -13
- package/skills/wix-replatform/lib/config-env.js +85 -11
- package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
- package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
- package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
- package/skills/wix-replatform/lib/destination-choice.js +163 -0
- package/skills/wix-replatform/lib/destination-handoff.js +62 -0
- package/skills/wix-replatform/lib/destination-http.js +81 -0
- package/skills/wix-replatform/lib/destination-route.js +98 -0
- package/skills/wix-replatform/lib/destination.js +919 -0
- package/skills/wix-replatform/lib/discovered-census.js +231 -0
- package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
- package/skills/wix-replatform/lib/document-url-guard.js +203 -0
- package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
- package/skills/wix-replatform/lib/entity-verification.js +18 -0
- package/skills/wix-replatform/lib/execution-capability.js +120 -0
- package/skills/wix-replatform/lib/execution-log.js +170 -0
- package/skills/wix-replatform/lib/execution-manifest.js +20 -2
- package/skills/wix-replatform/lib/execution-state.js +22 -0
- package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
- package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
- package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
- package/skills/wix-replatform/lib/import-recovery.js +800 -6
- package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
- package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
- package/skills/wix-replatform/lib/link-audit.js +173 -0
- package/skills/wix-replatform/lib/link-census.js +194 -0
- package/skills/wix-replatform/lib/link-plan.js +148 -0
- package/skills/wix-replatform/lib/link-verification.js +274 -0
- package/skills/wix-replatform/lib/link-write-journal.js +42 -0
- package/skills/wix-replatform/lib/local-state.js +869 -30
- package/skills/wix-replatform/lib/member-completion.js +658 -0
- package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
- package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
- package/skills/wix-replatform/lib/migration-completion.js +311 -0
- package/skills/wix-replatform/lib/operator-identity.js +47 -0
- package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
- package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
- package/skills/wix-replatform/lib/orchestration-router.js +608 -32
- package/skills/wix-replatform/lib/orchestration-state.js +188 -12
- package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
- package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
- package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
- package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
- package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
- package/skills/wix-replatform/lib/progress-log.js +19 -3
- package/skills/wix-replatform/lib/read-back-approval.js +184 -0
- package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
- package/skills/wix-replatform/lib/read-back-contract.js +243 -0
- package/skills/wix-replatform/lib/read-back-extract.js +118 -0
- package/skills/wix-replatform/lib/read-back-gate.js +734 -0
- package/skills/wix-replatform/lib/read-back-reads.js +94 -0
- package/skills/wix-replatform/lib/read-back-state.js +107 -0
- package/skills/wix-replatform/lib/read-back-summary.js +81 -0
- package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
- package/skills/wix-replatform/lib/run-controller.js +401 -0
- package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
- package/skills/wix-replatform/lib/setup-verification.js +148 -0
- package/skills/wix-replatform/lib/source-access.js +231 -0
- package/skills/wix-replatform/lib/source-coverage.js +1130 -0
- package/skills/wix-replatform/lib/source-secrets.js +277 -0
- package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
- package/skills/wix-replatform/lib/task-state.js +110 -0
- package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
- package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
- package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
- package/skills/wix-replatform/lib/url-verification.js +315 -0
- package/skills/wix-replatform/lib/user-action-effects.js +42 -0
- package/skills/wix-replatform/lib/user-actions.js +264 -0
- package/skills/wix-replatform/lib/website-handoff.js +1220 -0
- package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
- package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
- package/skills/wix-replatform/lib/write-verification-state.js +92 -0
- package/skills/wix-replatform/lib/write-verification.js +274 -0
- package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
- package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
- package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
- package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
- package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
- package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
- package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
- package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
- package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
- package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
- package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
- package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
- package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
- package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
- package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
- package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
- package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
- package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
- package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
- package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
- package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
- package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
- package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
- package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
- package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
- package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
- package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
- package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
- package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
- package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
- package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
- package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
- package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
- package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
- package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
- package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
- package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
- package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
- package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
- package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
- package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
- package/skills/wix-replatform/scripts/discovered-census.js +26 -0
- package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
- package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
- package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
- package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
- package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
- package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
- package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
- package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
- package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
- package/skills/wix-replatform/scripts/migration-completion.js +76 -0
- package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
- package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
- package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
- package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
- package/skills/wix-replatform/scripts/replatform-console.js +146 -0
- package/skills/wix-replatform/scripts/replatform.js +436 -0
- package/skills/wix-replatform/scripts/source-secrets.js +77 -0
- package/skills/wix-replatform/scripts/url-redirects.js +286 -0
- package/skills/wix-replatform/scripts/user-action.js +58 -0
- package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
- package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
- package/skills/wix-replatform/scripts/wix-destination.js +143 -0
- package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
- package/skills/wix-vibe-headless/SKILL.md +7 -3
- package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
- package/skills/wix-vibe-headless/platforms/base44.md +1 -0
- package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
- package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
- package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
- package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
- package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
- package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
- package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
- package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
- package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.account-check{display:flex;justify-content:space-between;gap:16px;align-items:flex-start;border:1px solid #cbdbe7;background:#f4f8fb;border-radius:9px;padding:14px;margin:16px 0}.account-heading{font-weight:700;margin:0 0 7px!important}.account-check code{display:block;max-width:500px;overflow-wrap:anywhere;color:#173f5f;font:600 13px ui-monospace,SFMono-Regular,Menlo,monospace;margin:3px 0 7px}.account-check .muted code{display:inline;font:inherit}.account-check .error{display:block;margin:5px 0 0}.account-check button{flex:none}@media(max-width:520px){.account-check{flex-direction:column}.account-check button{width:100%}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
:root{font-family:ui-sans-serif,system-ui,sans-serif;color:#18212b;background:#f6f8fa}*{box-sizing:border-box}body{margin:0}header{height:58px;background:#fff;border-bottom:1px solid #dce3e9;display:flex;align-items:center;justify-content:space-between;padding:0 22px}.brand{font-weight:750;color:#152f48;text-decoration:none}.brand span{font-weight:400;color:#647487;margin-left:8px}#connection{font-size:12px;color:#647487}main{display:grid;grid-template-columns:230px minmax(0,1fr);height:calc(100vh - 58px)}aside{background:#fff;border-right:1px solid #dce3e9;padding:16px}aside button,#new-project{width:100%}h1{margin:0 0 6px;font-size:26px}h2{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:#647487;margin:24px 0 8px}.project{width:100%;text-align:left;background:transparent;color:#263442;padding:10px;border:0;border-radius:8px;margin:2px 0}.project:hover,.project.active{background:#edf3f8}.project small{display:block;color:#647487;margin-top:3px}#content{padding:30px;max-width:1050px;width:100%;min-height:0;overflow:hidden}.empty{max-width:480px;margin:15vh auto}.status{display:flex;gap:12px;align-items:center;margin-bottom:22px;color:#5d6d7e}.pill{font-size:12px;border-radius:999px;padding:5px 9px;background:#e8eef4;color:#314a62;font-weight:700}.attention{background:#fff8e7;border:1px solid #ecd99e;border-radius:10px;padding:16px;margin:20px 0;display:flex;gap:16px;align-items:center}.attention p{margin:4px 0 0;color:#5e5131}.attention button{margin-left:auto}.grid{display:grid;grid-template-columns:1fr 280px;gap:24px}.card{background:#fff;border:1px solid #dce3e9;border-radius:11px;padding:18px}.card h3{font-size:14px;margin:0 0 12px}.work-card{margin:0 0 24px}.work-heading{display:flex;justify-content:space-between;gap:18px;align-items:flex-start}.work-heading h3{margin-bottom:3px}.work-heading p{margin:0}.work-summary{font-size:13px;color:#314a62;font-weight:650}.task-list,.agent-list{list-style:none;padding:0;margin:14px 0 0}.task-row{border-top:1px solid #edf0f3;padding:12px 0}.task-main,.agent-row{display:flex;align-items:center;gap:9px}.task-main{align-items:flex-start}.task-title{font-weight:700}.task-completed{text-decoration:line-through;color:#68798b}.task-check{color:#257349;font-size:17px;font-weight:800;line-height:18px}.task-state-icon{color:#7d8b98;font-size:18px;line-height:17px}.spinner{width:16px;height:16px;border:2px solid #bdd0df;border-top-color:#23669e;border-radius:50%;display:inline-block;flex:0 0 auto;animation:spin .8s linear infinite}.spinner.small{width:12px;height:12px;border-width:2px}.agent-list{margin:9px 0 0 25px}.agent-row{font-size:13px;padding:4px 0}.agent-row.agent-child{margin-left:16px}.agent-row .muted{margin-left:auto}.agent-empty{margin:8px 0 0 25px}@keyframes spin{to{transform:rotate(360deg)}}.activity-card{height:calc(100vh - 340px);min-height:260px;display:flex;flex-direction:column;min-height:0}.activity-feed{overflow-y:auto;min-height:0;padding-right:4px}.event{padding:12px 0;border-bottom:1px solid #edf0f3;font-size:14px}.event summary{cursor:pointer}.event summary::marker{color:#647487}.event small{display:block;color:#68798b;margin-top:3px}.event pre{white-space:pre-wrap;overflow-wrap:anywhere;background:#f4f7f9;border-radius:7px;padding:10px;font-size:12px;line-height:1.4;color:#334759}.event.heartbeat{color:#788796}button{font:inherit;border:0;border-radius:8px;padding:9px 12px;font-weight:650;background:#e8eef4;color:#20384d;cursor:pointer}button.primary{background:#23669e;color:#fff}button.danger{color:#9b3030;background:#fff;border:1px solid #d99d9d}.actions{display:flex;gap:8px;flex-wrap:wrap}.muted{color:#68798b;font-size:13px}dialog{border:0;border-radius:12px;padding:0;max-width:720px;width:calc(100% - 32px);max-height:calc(100vh - 32px);overflow:hidden;box-shadow:0 20px 60px #0004}dialog::backdrop{background:#14233388}.dialog-body{padding:26px}.dialog-body h1{font-size:22px}.dialog-body p{line-height:1.5}.artifact{display:flex;justify-content:space-between;align-items:center;border:1px solid #dce3e9;padding:12px;border-radius:9px;margin:15px 0}.choice{display:block;border:1px solid #d4dee7;border-radius:9px;padding:12px;margin:9px 0}.choice small{display:block;margin:4px 0 0 24px;color:#68798b}.choice input{margin-right:8px}textarea,input,select{font:inherit;width:100%;padding:9px;border:1px solid #bdcbd7;border-radius:7px;margin:5px 0 12px}label{font-size:13px;font-weight:650;display:block}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}.form-grid label{min-width:0}.file-preview{max-height:min(58vh,560px);overflow:auto;white-space:pre;overflow-wrap:normal;background:#f4f7f9;border:1px solid #dce3e9;border-radius:7px;padding:12px;font:12px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;color:#334759}.footer{display:flex;justify-content:space-between;gap:10px;margin-top:22px}.error{color:#9c3030;margin-top:12px}@media(max-width:720px){main{grid-template-columns:1fr;height:auto;min-height:calc(100vh - 58px)}aside{border-right:0;border-bottom:1px solid #dce3e9}.grid{grid-template-columns:1fr}#content{padding:20px;overflow:visible}.activity-card{height:60vh}.file-preview{max-height:48vh}.form-grid{grid-template-columns:1fr}.attention{align-items:flex-start;flex-direction:column}.attention button{margin-left:0}.work-heading{flex-direction:column;gap:4px}}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
const token = new URLSearchParams(location.search).get('token');
|
|
2
|
+
const q = (s) => document.querySelector(s); let selected = null; let events = []; let stream;
|
|
3
|
+
const api = async (path, options = {}) => { const join = path.includes('?') ? '&' : '?'; const res = await fetch(`${path}${join}token=${encodeURIComponent(token)}`, { ...options, headers: { 'content-type': 'application/json', ...(options.headers || {}) } }); const data = await res.json(); if (!res.ok) throw new Error(data.error || 'Request failed'); return data; };
|
|
4
|
+
const esc = (value) => String(value ?? '').replace(/[&<>"]/g, (c) => ({ '&':'&','<':'<','>':'>','"':'"' }[c]));
|
|
5
|
+
function routeState() { const params = new URLSearchParams(location.search); return { project: params.get('project'), request: params.get('request'), artifact: params.get('artifact'), cursor: params.get('cursor') }; }
|
|
6
|
+
function updateRoute(values) { const url = new URL(location.href); for (const [key, value] of Object.entries(values)) { if (value === null || value === undefined || value === '') url.searchParams.delete(key); else url.searchParams.set(key, value); } history.replaceState(null, '', `${url.pathname}?${url.searchParams.toString()}${url.hash}`); }
|
|
7
|
+
function statusName(s) { if (/_running$/.test(s || '')) return 'Ready to continue'; return ({ running:'Running', waiting_for_user:'Waiting for you', awaiting_user_action:'Waiting for you', blocked:'Blocked', canceled:'Canceled', interrupted:'Interrupted', timed_out:'Timed out', completed:'Completed', failed:'Failed' })[s] || 'Ready to start'; }
|
|
8
|
+
function readable(value) { return String(value || '').replaceAll('_', ' ').replace(/\b\w/g, (c) => c.toUpperCase()); }
|
|
9
|
+
function structuredArtifact(file) {
|
|
10
|
+
const structured = /(?:application\/(?:json|x-ndjson)|(?:json|jsonl|ndjson))/.test(`${file.mediaType} ${file.path}`.toLowerCase());
|
|
11
|
+
if (!structured) return null;
|
|
12
|
+
try {
|
|
13
|
+
const isLines = /(?:jsonl|ndjson)/.test(`${file.mediaType} ${file.path}`.toLowerCase());
|
|
14
|
+
return isLines ? file.content.split('\n').filter(Boolean).map((line) => JSON.parse(line)) : JSON.parse(file.content);
|
|
15
|
+
} catch { return null; }
|
|
16
|
+
}
|
|
17
|
+
function jsonMarkup(value) {
|
|
18
|
+
const raw = JSON.stringify(value, null, 2);
|
|
19
|
+
return raw.replace(/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/g, (match, string, colon, literal) => {
|
|
20
|
+
const kind = string ? (colon ? 'json-key' : 'json-string') : literal ? 'json-literal' : 'json-number';
|
|
21
|
+
return `<span class="${kind}">${esc(string || literal || match)}</span>${colon || ''}`;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function fileLanguage(file) {
|
|
25
|
+
const source = `${file.mediaType || ''} ${file.path || ''}`.toLowerCase();
|
|
26
|
+
if (/(?:application\/(?:json|x-ndjson)|(?:json|jsonl|ndjson))/.test(source)) return 'json';
|
|
27
|
+
if (/(?:javascript|ecmascript|\.m?js\b|\.cjs\b)/.test(source)) return 'javascript';
|
|
28
|
+
if (/(?:typescript|\.tsx?\b)/.test(source)) return 'typescript';
|
|
29
|
+
if (/(?:text\/css|\.css\b)/.test(source)) return 'css';
|
|
30
|
+
if (/(?:text\/html|\.html?\b)/.test(source)) return 'html';
|
|
31
|
+
if (/(?:text\/markdown|\.md\b)/.test(source)) return 'markdown';
|
|
32
|
+
return 'text';
|
|
33
|
+
}
|
|
34
|
+
function codeMarkup(content, language) {
|
|
35
|
+
const escaped = esc(content);
|
|
36
|
+
if (language === 'json') return escaped;
|
|
37
|
+
if (language === 'html') return escaped.replace(/(<\/?)([A-Za-z][\w-]*)([^&]*?)(\/??>)/g, '$1<span class="syntax-tag">$2</span>$3$4');
|
|
38
|
+
if (language === 'markdown') return escaped.replace(/^(#{1,6}\s.*)$/gm, '<span class="syntax-heading">$1</span>').replace(/(`[^`]+`)/g, '<span class="syntax-code">$1</span>');
|
|
39
|
+
if (language === 'javascript' || language === 'typescript') return escaped.replace(/(\/\/[^\n]*|\/\*[\s\S]*?\*\/)/g, '<span class="syntax-comment">$1</span>').replace(/\b(const|let|var|function|async|await|return|if|else|for|while|class|new|import|from|export|throw|try|catch)\b/g, '<span class="syntax-keyword">$1</span>');
|
|
40
|
+
if (language === 'css') return escaped.replace(/(\/\*[\s\S]*?\*\/)/g, '<span class="syntax-comment">$1</span>').replace(/(^|\n)([^{}\n]+)(?=\s*\{)/g, '$1<span class="syntax-selector">$2</span>');
|
|
41
|
+
return escaped;
|
|
42
|
+
}
|
|
43
|
+
async function projects() { try { const data = await api('/api/projects'); q('#projects').innerHTML = data.projects.map((p) => `<button class="project ${p.project === selected ? 'active':''}" data-project="${esc(p.project)}">${esc(p.project)}<small>${esc(statusName(p.router?.state || p.activeRun?.status || p.orchestration?.status))}</small></button>`).join('') || '<p class="muted">No migration projects yet.</p>'; document.querySelectorAll('[data-project]').forEach((b) => b.onclick = () => openProject(b.dataset.project)); } catch (e) { q('#projects').textContent = e.message; } }
|
|
44
|
+
function eventMarkup(event) { return `<details class="event ${event.type === 'heartbeat' ? 'heartbeat':''}" data-event-id="${esc(event.eventId || '')}"><summary><strong>${esc(readable(event.type))}</strong><small>${esc(event.message || '')} · ${esc(event.timestamp ? new Date(event.timestamp).toLocaleString() : 'just now')}</small></summary><pre>${esc(JSON.stringify(event, null, 2))}</pre></details>`; }
|
|
45
|
+
function appendActivity(event) { const feed = q('.activity-feed'); if (!feed) return; feed.querySelector('.empty-activity')?.remove(); feed.insertAdjacentHTML('afterbegin', eventMarkup(event)); }
|
|
46
|
+
function taskIcon(state) { return state === 'running' ? '<span class="spinner" aria-hidden="true"></span>' : state === 'completed' ? '<span class="task-check" aria-hidden="true">✓</span>' : '<span class="task-state-icon" aria-hidden="true">•</span>'; }
|
|
47
|
+
function workMarkup(data) {
|
|
48
|
+
const tasks = data?.tasks || []; const agents = data?.agents || []; const runningTasks = tasks.filter((task) => task.state === 'running').length; const runningAgents = agents.filter((agent) => agent.state === 'running').length;
|
|
49
|
+
if (!tasks.length) return `<div class="work-heading"><div><h3>Work</h3><p class="muted">Persisted work state</p></div><p class="muted">No tasks recorded</p></div><p class="muted">Work details will appear after the supervisor records a route. Observed activity below is not treated as task state.</p>`;
|
|
50
|
+
const rows = tasks.map((task) => {
|
|
51
|
+
const assigned = agents.filter((agent) => agent.taskId === task.taskId); const active = assigned.filter((agent) => agent.state === 'running');
|
|
52
|
+
const agentRows = assigned.length ? `<ul class="agent-list">${assigned.map((agent) => `<li class="agent-row agent-${esc(agent.state)} ${agent.parentAgentId ? 'agent-child':''}">${agent.state === 'running' ? '<span class="spinner small" aria-hidden="true"></span>' : agent.state === 'completed' ? '<span class="task-check" aria-hidden="true">✓</span>' : '<span class="task-state-icon" aria-hidden="true">•</span>'}<span>${esc(agent.label)}</span><span class="muted">${esc(readable(agent.state))}</span></li>`).join('')}</ul>` : '<p class="agent-empty muted">No agent has been recorded for this task.</p>';
|
|
53
|
+
const topology = active.length && !active.some((agent) => agent.parentAgentId) ? '<p class="agent-empty muted">No additional agent detail reported.</p>' : '';
|
|
54
|
+
return `<li class="task-row task-${esc(task.state)}" data-task-id="${esc(task.taskId)}"><div class="task-main">${taskIcon(task.state)}<div><div class="task-title ${task.state === 'completed' ? 'task-completed':''}">${esc(task.title)}</div><div class="muted">${esc(readable(task.state))}${task.route?.reason ? ` · ${esc(readable(task.route.reason))}` : ''}</div></div></div>${agentRows}${topology}</li>`;
|
|
55
|
+
}).join('');
|
|
56
|
+
return `<div class="work-heading"><div><h3>Work</h3><p class="muted">Persisted work state</p></div><p class="work-summary">${runningTasks ? `${runningTasks} running task${runningTasks === 1 ? '' : 's'}` : 'No running tasks'} · ${runningAgents} active agent${runningAgents === 1 ? '' : 's'}</p></div><ul class="task-list">${rows}</ul>`;
|
|
57
|
+
}
|
|
58
|
+
function renderWork(tasks) { const panel = q('#work-panel'); if (panel) panel.innerHTML = workMarkup(tasks); }
|
|
59
|
+
function panelMarkup(status, requests) {
|
|
60
|
+
const state = status.activeRun?.status || status.latestResult?.outcome || status.orchestration?.status || 'ready'; const pending = requests.find((r) => r.status === 'pending');
|
|
61
|
+
const attention = pending ? `<div class="attention"><div><strong>${esc(pending.title)}</strong><p>${esc(pending.prompt)}</p></div><button class="primary" id="open-request">Review decision</button></div>` : '';
|
|
62
|
+
const rawState = status.router?.reason || status.latestResult?.nextAction || 'ready';
|
|
63
|
+
return { state, pending, attention, current: `<div class="card"><h3>Current state</h3><p>${esc(readable(rawState))}</p><p class="muted">Technical state: ${esc(rawState)}</p><div class="actions">${!status.activeRun && state !== 'completed' ? '<button class="primary" id="resume">Resume</button>' : ''}${status.activeRun ? '<button class="danger" id="cancel">Stop migration</button>' : ''}</div></div>`, requests: `<div class="card" style="margin-top:16px"><h3>Requests</h3><p class="muted">${requests.length} total · ${requests.filter((r)=>r.status==='pending').length} pending</p></div>` };
|
|
64
|
+
}
|
|
65
|
+
function bindPanels(pending) {
|
|
66
|
+
if (pending) q('#open-request').onclick = () => requestView(pending); if (q('#resume')) q('#resume').onclick = () => start(true); if (q('#cancel')) q('#cancel').onclick = cancelRun;
|
|
67
|
+
}
|
|
68
|
+
function renderDurablePanels(status, requests) {
|
|
69
|
+
const panel = panelMarkup(status, requests); const statusLine = q('#status-line'); if (!statusLine) return;
|
|
70
|
+
statusLine.innerHTML = `<span class="pill">${esc(statusName(panel.state))}</span><span>${status.eventStream?.lastEventAt ? `Last observed ${esc(new Date(status.eventStream.lastEventAt).toLocaleString())}` : 'No recent observation'}</span>`;
|
|
71
|
+
q('#attention-area').innerHTML = panel.attention; q('#current-state-card').innerHTML = panel.current; q('#requests-card').innerHTML = panel.requests; bindPanels(panel.pending);
|
|
72
|
+
}
|
|
73
|
+
function render(status, requests, tasks) {
|
|
74
|
+
const rows = events.slice(-200).reverse().map(eventMarkup).join('') || '<p class="muted empty-activity">No observed activity yet.</p>';
|
|
75
|
+
q('#content').innerHTML = `<h1>${esc(selected)}</h1><div class="status" id="status-line"></div><div id="attention-area"></div><section class="card work-card" id="work-panel">${workMarkup(tasks)}</section><div class="grid"><div class="card activity-card"><h3>Observed activity</h3><div class="activity-feed" aria-label="Observed migration activity">${rows}</div></div><div><div id="current-state-card"></div><div id="requests-card"></div></div></div>`;
|
|
76
|
+
renderDurablePanels(status, requests);
|
|
77
|
+
}
|
|
78
|
+
async function refreshTasks() { if (!selected) return null; const tasks = await api(`/api/tasks?project=${encodeURIComponent(selected)}`); renderWork(tasks); return tasks; }
|
|
79
|
+
async function refresh() { if (!selected) return null; const [status, requests, tasks] = await Promise.all([api(`/api/status?project=${encodeURIComponent(selected)}`), api(`/api/requests?project=${encodeURIComponent(selected)}`), api(`/api/tasks?project=${encodeURIComponent(selected)}`)]); render(status, requests, tasks); return { status, requests, tasks }; }
|
|
80
|
+
let durableRefreshTimer;
|
|
81
|
+
function scheduleDurableRefresh() { if (durableRefreshTimer || !selected) return; durableRefreshTimer = setTimeout(async () => { durableRefreshTimer = null; try { const [status, requests, tasks] = await Promise.all([api(`/api/status?project=${encodeURIComponent(selected)}`), api(`/api/requests?project=${encodeURIComponent(selected)}`), api(`/api/tasks?project=${encodeURIComponent(selected)}`)]); renderDurablePanels(status, requests); renderWork(tasks); projects().catch(() => {}); } catch {} }, 100); }
|
|
82
|
+
function connect() { stream?.close(); if (!selected) return; stream = new EventSource(`/api/events?project=${encodeURIComponent(selected)}&token=${encodeURIComponent(token)}`); stream.onopen = () => { q('#connection').textContent = 'Live'; scheduleDurableRefresh(); }; stream.onerror = () => q('#connection').textContent = 'Reconnecting…'; stream.addEventListener('migration', (message) => { const event = JSON.parse(message.data); if (events.some((x) => x.eventId && x.eventId === event.eventId)) return; events.push(event); appendActivity(event); scheduleDurableRefresh(); }); }
|
|
83
|
+
async function openProject(project, { updateUrl = true } = {}) { if (updateUrl) updateRoute({ project, request: null, artifact: null, cursor: null }); selected = project; events = []; await projects(); const state = await refresh(); connect(); return state; }
|
|
84
|
+
function cancelRun() { const d = modal(`<form class="dialog-body" id="cancel-form"><h1>Stop migration?</h1><p>This asks the supervisor to stop gracefully. Recovery artifacts are preserved, and you can resume later.</p><label>Reason<input id="cancel-reason" value="canceled by operator"></label><p class="error" id="cancel-error"></p><div class="footer"><button type="button" data-close>Keep running</button><button class="danger" type="submit">Stop migration</button></div></form>`); q('#cancel-form').onsubmit = async (event) => { event.preventDefault(); try { await api('/api/cancel', { method:'POST', body:JSON.stringify({ project:selected, reason:q('#cancel-reason').value }) }); d.close(); await refresh(); } catch (e) { q('#cancel-error').textContent = e.message; } }; }
|
|
85
|
+
function modal(html, { onClose = null } = {}) { const d = q('#dialog'); d.innerHTML = html; if (!d.open) d.showModal(); d.querySelector('[data-close]')?.addEventListener('click', () => d.close()); d.onclose = onClose; return d; }
|
|
86
|
+
async function showArtifact(item, cursor = 0, opener = null, { updateUrl = true } = {}) { const d = q('#file-dialog'); if (opener) d.returnFocus = opener; if (updateUrl) updateRoute({ artifact: item, cursor: String(cursor) }); try { const file = await api(`/api/show?project=${encodeURIComponent(selected)}&item=${encodeURIComponent(item)}&cursor=${cursor}`); const language = fileLanguage(file); const parsed = structuredArtifact(file); const content = parsed === null ? codeMarkup(file.content, language) : jsonMarkup(parsed); d.innerHTML = `<div class="dialog-body"><h1>${esc(file.path)}</h1><p class="muted">${esc(file.mediaType)} · showing ${file.emittedBytes} of ${file.totalBytes} bytes</p><pre class="file-preview language-${language}${parsed === null ? '' : ' structured-json'}" aria-label="${esc(file.path)} preview">${content}</pre><div class="footer">${file.nextCursor !== null ? '<button id="more">Show more</button>' : '<span></span>'}<button data-close>Close</button></div></div>`; if (!d.open) d.showModal(); d.querySelector('[data-close]').onclick = () => d.close(); d.onclose = () => { updateRoute({ artifact: null, cursor: null }); d.returnFocus?.focus(); d.returnFocus = null; }; if (file.nextCursor !== null) d.querySelector('#more').onclick = () => showArtifact(item, file.nextCursor); } catch (e) { alert(e.message); } }
|
|
87
|
+
async function loadWixAccount() {
|
|
88
|
+
const result = q('#wix-account-result'); const acknowledgement = q('#ack');
|
|
89
|
+
if (!result) return;
|
|
90
|
+
result.textContent = 'Checking the local Wix CLI account…';
|
|
91
|
+
try {
|
|
92
|
+
const account = await api('/api/account');
|
|
93
|
+
if (account.authState === 'authenticated' && account.identity) {
|
|
94
|
+
result.innerHTML = `<strong>Authenticated Wix CLI identity</strong><code>${esc(account.identity)}</code><span class="muted">Reported directly by <code>wix whoami</code>. Confirm that this account is authorized before continuing.</span>`;
|
|
95
|
+
acknowledgement?.removeAttribute('disabled');
|
|
96
|
+
} else result.innerHTML = `<strong>Wix CLI identity could not be confirmed</strong><span class="error">${esc(account.reason || 'Run wix login, then refresh this check.')}</span>`;
|
|
97
|
+
} catch (error) { result.innerHTML = `<strong>Wix CLI identity could not be confirmed</strong><span class="error">${esc(error.message)}</span>`; }
|
|
98
|
+
}
|
|
99
|
+
async function requestView(row, { updateUrl = true } = {}) {
|
|
100
|
+
const request = await api(`/api/show?project=${encodeURIComponent(selected)}&item=${encodeURIComponent(row.requestId)}`);
|
|
101
|
+
if (updateUrl) updateRoute({ project: selected, request: request.requestId, artifact: null, cursor: null });
|
|
102
|
+
const artifacts = request.artifactRefs.map((a) => `<div class="artifact"><span><strong>${esc(a.path)}</strong><br><span class="muted">${esc(a.mediaType)}</span></span><button data-artifact="${esc(a.path)}">Open</button></div>`).join('');
|
|
103
|
+
const operatorInstructions = request.operatorInstructions ? `<section class="operator-instructions"><p><strong>Open Terminal and run this:</strong></p><pre class="file-preview" aria-label="Terminal command">${esc(request.operatorInstructions.command)}</pre><button type="button" id="copy-terminal-command">Copy command</button><p class="muted">${esc(request.operatorInstructions.confirmation)}</p></section>` : '';
|
|
104
|
+
const destinationAccountCheck = request.kind === 'manual_action' && request.stage === 'destination'; let response = '';
|
|
105
|
+
if (request.response.mode === 'choice') response = `<fieldset><legend>Your decision</legend>${request.choices.map((c) => `<label class="choice"><input required type="radio" name="answer" value="${esc(c.id)}">${esc(c.label)}${c.description ? `<small>${esc(c.description)}</small>`:''}</label>`).join('')}</fieldset><label>Review note <span class="muted">(optional)</span><textarea id="answer-note" maxlength="10000" placeholder="Add context for this decision"></textarea></label>`;
|
|
106
|
+
else if (request.response.mode === 'text') response = '<label>Response<textarea id="answer" maxlength="10000" required></textarea></label>';
|
|
107
|
+
else response = destinationAccountCheck ? '<label>Confirmation<textarea id="ack-note" maxlength="10000" required placeholder="I confirm the CLI identity is authorized to create this destination."></textarea></label><p class="muted">Your confirmation will be recorded with the required acknowledgement.</p>' : '<label class="choice"><input type="checkbox" id="ack" required>I completed the required manual step.</label>';
|
|
108
|
+
const accountCheck = destinationAccountCheck ? '<section class="account-check" aria-live="polite"><div><p class="account-heading">Current Wix CLI account</p><div id="wix-account-result">Checking the local Wix CLI account…</div></div><button type="button" id="refresh-wix-account">Refresh</button></section>' : '';
|
|
109
|
+
const d = modal(`<form class="dialog-body" id="answer-form"><div class="pill">${esc(request.kind)}</div><h1>${esc(request.title)}</h1><p>${esc(request.prompt)}</p>${operatorInstructions}${accountCheck}${artifacts}${response}<p class="error" id="form-error"></p><div class="footer"><button type="button" data-close>Cancel</button><span><button type="submit" name="mode" value="save">Save answer only</button> <button class="primary" type="submit" name="mode" value="continue">Submit and resume</button></span></div></form>`, { onClose: () => updateRoute({ request: null, artifact: null, cursor: null }) });
|
|
110
|
+
d.querySelectorAll('[data-artifact]').forEach((b) => b.onclick = (event) => showArtifact(b.dataset.artifact, 0, event.currentTarget));
|
|
111
|
+
d.querySelector('#copy-terminal-command')?.addEventListener('click', async () => { try { await navigator.clipboard.writeText(request.operatorInstructions.command); d.querySelector('#copy-terminal-command').textContent = 'Copied'; } catch { d.querySelector('#copy-terminal-command').textContent = 'Copy unavailable'; } });
|
|
112
|
+
if (destinationAccountCheck) { q('#refresh-wix-account').onclick = loadWixAccount; loadWixAccount(); }
|
|
113
|
+
q('#answer-form').onsubmit = async (event) => { event.preventDefault(); const submit = event.submitter.value; const payload = { project:selected, requestId:request.requestId, continue:submit === 'continue' }; if (request.response.mode === 'choice') { payload.choice = new FormData(event.currentTarget).get('answer'); const note = q('#answer-note').value.trim(); if (note) payload.note = note; } else if (request.response.mode === 'text') payload.text = q('#answer').value; else if (destinationAccountCheck) { payload.acknowledged = true; payload.note = q('#ack-note').value.trim(); } else payload.acknowledged = q('#ack').checked; try { await api('/api/answer', { method:'POST', body:JSON.stringify(payload) }); d.close(); await refresh(); } catch (e) { q('#form-error').textContent = e.message; } };
|
|
114
|
+
}
|
|
115
|
+
function start(resume = false) { if (resume) return api('/api/run', {method:'POST',body:JSON.stringify({project:selected,resume:true})}).then(refresh).catch((e)=>alert(e.message)); const d = modal(`<form class="dialog-body" id="new-form"><h1>New migration</h1><div class="form-grid"><label>Project name<input name="project" required pattern="[A-Za-z0-9][A-Za-z0-9_-]{0,99}"></label><label>Source URL<input name="sourceUrl" type="url"></label><label>Source mode<select name="sourceMode"><option value="public_content">Public content</option><option value="authenticated_api">Authenticated API</option><option value="private_data">Private data</option><option value="files_only">Files only</option></select></label><label>Delivery mode<select name="deliveryMode"><option value="management">Management</option><option value="website">Website</option><option value="management_and_website">Management + website</option></select></label><label>Destination<input name="destination" placeholder="new or existing:site-id" value="new"></label><label>Agent<select name="agent"><option value="auto">Automatic</option><option value="codex">Codex</option><option value="claude">Claude</option></select></label><label>Import mode<select name="managementImportMode"><option value="standard">Standard</option><option value="quick">Quick</option></select></label></div><label>Files (optional)<input id="files" type="file" multiple></label><p class="error" id="new-error"></p><div class="footer"><button type="button" data-close>Cancel</button><button class="primary">Check and start migration</button></div></form>`); q('#new-form').onsubmit = async (e) => { e.preventDefault(); const data = Object.fromEntries(new FormData(e.currentTarget)); try { const doctor = await api(`/api/doctor?agent=${encodeURIComponent(data.agent)}`); if (!doctor.adapters.some((adapter) => adapter.ok)) throw new Error('No selected agent is ready. Complete the local authentication/prerequisite shown by replatform doctor, then retry.'); const files=[]; for (const file of q('#files').files) { const base64 = await new Promise((resolve,reject)=>{const r=new FileReader();r.onload=()=>resolve(String(r.result).split(',')[1]);r.onerror=reject;r.readAsDataURL(file);}); const result=await api('/api/upload',{method:'POST',body:JSON.stringify({project:data.project,name:file.name,contentBase64:base64})});files.push(result.name); } await api('/api/run',{method:'POST',body:JSON.stringify({project:data.project,options:{...data,files}})}); d.close(); await openProject(data.project); } catch (err) { q('#new-error').textContent=err.message; } }; }
|
|
116
|
+
async function restoreRoute() { const route = routeState(); if (!route.project) return; const state = await openProject(route.project, { updateUrl: false }); if (!route.request) return; const row = state?.requests.find((item) => item.requestId === route.request && item.status === 'pending'); if (!row) { updateRoute({ request: null, artifact: null, cursor: null }); return; } await requestView(row, { updateUrl: false }); if (route.artifact) await showArtifact(route.artifact, Number(route.cursor) || 0, null, { updateUrl: false }); }
|
|
117
|
+
q('#new-project').onclick = () => start(false); projects().then(restoreRoute).catch((error) => { q('#content').textContent = error.message; });
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>RePlatform console</title><link rel="stylesheet" href="/app.css"><link rel="stylesheet" href="/json.css"><link rel="stylesheet" href="/account.css"></head>
|
|
3
|
+
<body><header><a href="/" class="brand">RePlatform <span>Migration console</span></a><div id="connection">Choose a migration</div></header>
|
|
4
|
+
<main><aside><button id="new-project">New migration</button><h2>Migrations</h2><div id="projects" aria-live="polite"></div></aside><section id="content" aria-live="polite"><div class="empty"><h1>Choose a migration</h1><p>Open an existing project or start a new migration.</p></div></section></main><dialog id="dialog"></dialog><dialog id="file-dialog"></dialog><script src="/app.js"></script></body></html>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
.structured-json { color: #263947; }
|
|
2
|
+
.structured-json .json-key { color: #175f9f; }
|
|
3
|
+
.structured-json .json-string { color: #8b3d20; }
|
|
4
|
+
.structured-json .json-number { color: #7650a8; }
|
|
5
|
+
.structured-json .json-literal { color: #267052; font-weight: 650; }
|
|
6
|
+
.file-preview .syntax-comment { color: #647487; font-style: italic; }
|
|
7
|
+
.file-preview .syntax-keyword { color: #7650a8; font-weight: 650; }
|
|
8
|
+
.file-preview .syntax-tag { color: #175f9f; font-weight: 650; }
|
|
9
|
+
.file-preview .syntax-heading { color: #175f9f; font-weight: 700; }
|
|
10
|
+
.file-preview .syntax-code { color: #8b3d20; }
|
|
11
|
+
.file-preview .syntax-selector { color: #175f9f; font-weight: 650; }
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { spawn, spawnSync } = require('node:child_process');
|
|
4
|
+
|
|
5
|
+
const ADAPTERS = {
|
|
6
|
+
codex: {
|
|
7
|
+
executable: 'codex',
|
|
8
|
+
args(prompt) { return ['exec', '--json', prompt]; },
|
|
9
|
+
},
|
|
10
|
+
claude: {
|
|
11
|
+
executable: 'claude',
|
|
12
|
+
args(prompt) { return ['-p', '--output-format', 'stream-json', '--verbose', prompt]; },
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
function probe(id, { executablePath } = {}) {
|
|
17
|
+
const adapter = ADAPTERS[id];
|
|
18
|
+
if (!adapter) return { ok: false, id, reason: 'unknown_adapter' };
|
|
19
|
+
const executable = executablePath || adapter.executable;
|
|
20
|
+
const result = spawnSync(executable, ['--version'], { encoding: 'utf8', timeout: 5000 });
|
|
21
|
+
if (result.error) return { ok: false, id, executable, reason: result.error.code === 'ENOENT' ? 'not_installed' : 'probe_failed' };
|
|
22
|
+
if (result.status !== 0) return { ok: false, id, executable, reason: 'version_failed' };
|
|
23
|
+
return { ok: true, id, executable, version: `${result.stdout || result.stderr}`.trim(), capabilities: ['headless', 'events', 'session', 'cwd', 'cancel'] };
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function chooseAdapter(id = 'auto', options = {}) {
|
|
27
|
+
const ids = id === 'auto' ? ['codex', 'claude'] : [id];
|
|
28
|
+
const probes = ids.map((candidate) => probe(candidate, { executablePath: options.agentPath }));
|
|
29
|
+
const selected = probes.find((result) => result.ok);
|
|
30
|
+
return selected ? { ...selected, probes } : { ok: false, reason: id === 'auto' ? 'no_compatible_agent' : 'agent_unavailable', probes };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function launch(id, { cwd, prompt, executablePath, onEvent, onWorker }) {
|
|
34
|
+
const adapter = ADAPTERS[id];
|
|
35
|
+
if (!adapter) throw new Error(`unknown adapter: ${id}`);
|
|
36
|
+
const child = spawn(executablePath || adapter.executable, adapter.args(prompt), {
|
|
37
|
+
cwd,
|
|
38
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
39
|
+
detached: process.platform !== 'win32',
|
|
40
|
+
});
|
|
41
|
+
let buffered = '';
|
|
42
|
+
child.stdout.on('data', (chunk) => {
|
|
43
|
+
buffered += chunk;
|
|
44
|
+
let newline;
|
|
45
|
+
while ((newline = buffered.indexOf('\n')) >= 0) {
|
|
46
|
+
const line = buffered.slice(0, newline);
|
|
47
|
+
buffered = buffered.slice(newline + 1);
|
|
48
|
+
if (!line.trim()) continue;
|
|
49
|
+
let raw;
|
|
50
|
+
try { raw = JSON.parse(line); } catch { raw = { text: line }; }
|
|
51
|
+
onEvent?.({ type: 'vendor_event', raw });
|
|
52
|
+
// Worker reporting is an explicit adapter capability. Do not infer workers from a
|
|
53
|
+
// vendor event unless a future adapter supplies this parser and its own schema.
|
|
54
|
+
if (typeof adapter.workerReport === 'function') {
|
|
55
|
+
const worker = adapter.workerReport(raw);
|
|
56
|
+
if (worker) onWorker?.(worker);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
child.stderr.on('data', (chunk) => onEvent?.({ type: 'vendor_stderr', message: String(chunk).trim() }));
|
|
61
|
+
return child;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function requestCancel(child) {
|
|
65
|
+
if (!child || child.exitCode !== null) return false;
|
|
66
|
+
if (process.platform !== 'win32' && child.pid) process.kill(-child.pid, 'SIGTERM');
|
|
67
|
+
else child.kill('SIGTERM');
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
module.exports = { ADAPTERS, probe, chooseAdapter, launch, requestCancel };
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// A capability is enabled by payload and read-back evidence for this exact page family.
|
|
4
|
+
// Served support is a separate post-frontend result, never inferred from a successful write.
|
|
5
|
+
function validateCapability(row) {
|
|
6
|
+
if (!row || typeof row !== 'object' || !row.family || !row.frontendType) throw new Error('route capability needs family and frontendType');
|
|
7
|
+
if (row.supported) {
|
|
8
|
+
for (const key of ['key', 'pageIdentifier', 'pageIdentifierType', 'variable', 'readMethod', 'writeMethod', 'evidence']) {
|
|
9
|
+
if (typeof row[key] !== 'string' || !row[key]) throw new Error(`supported route capability ${row.family} missing ${key}`);
|
|
10
|
+
}
|
|
11
|
+
if (!['tpaPageId', 'pageId'].includes(row.pageIdentifierType)) throw new Error('unsupported pageIdentifierType');
|
|
12
|
+
if (!row.request || row.request.urlMapping?.pageIdentifier !== row.pageIdentifier || row.request.urlMapping?.pageIdentifierType !== row.pageIdentifierType || !row.readBackFixture || row.readBackFixture.pageIdentifier !== row.pageIdentifier || row.readBackFixture.mapping !== row.request.urlMapping.mapping) {
|
|
13
|
+
throw new Error(`supported route capability ${row.family} needs matching request and read-back fixture`);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return row;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function inspectRoute(source, capability, existing) {
|
|
20
|
+
validateCapability(capability);
|
|
21
|
+
if (!source || source.family !== capability.family || !source.pattern) throw new Error('route source needs matching family and pattern');
|
|
22
|
+
if (!capability.supported) return { ...source, status: 'unverified', reason: capability.reason || 'missing-adapter-evidence' };
|
|
23
|
+
if (!source.pattern.includes(`{{${capability.variable}}}`) || /[?#]/.test(source.pattern)) {
|
|
24
|
+
return { ...source, status: 'unverified', reason: 'unsupported-source-pattern' };
|
|
25
|
+
}
|
|
26
|
+
if (existing && existing.owner && existing.owner !== capability.key) {
|
|
27
|
+
return { ...source, status: 'conflict', reason: 'occupied-address', existing };
|
|
28
|
+
}
|
|
29
|
+
if (existing && existing.mapping === source.pattern && existing.pageIdentifier === capability.pageIdentifier) {
|
|
30
|
+
return { ...source, status: 'reused', readBack: existing, served: false };
|
|
31
|
+
}
|
|
32
|
+
if (existing && existing.mapping && existing.mapping !== source.pattern) {
|
|
33
|
+
return { ...source, status: 'conflict', reason: 'different-existing-mapping', existing };
|
|
34
|
+
}
|
|
35
|
+
return { ...source, status: 'write-required', existing: existing || null, served: false };
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function configureRoute(plan, capability, transport) {
|
|
39
|
+
if (plan.status !== 'write-required') return plan;
|
|
40
|
+
validateCapability(capability);
|
|
41
|
+
if (!capability.supported) throw new Error('unsupported capability cannot write');
|
|
42
|
+
if (!transport || typeof transport.write !== 'function' || typeof transport.read !== 'function') throw new Error('route transport needs write and read');
|
|
43
|
+
const payload = {
|
|
44
|
+
key: capability.key,
|
|
45
|
+
urlMapping: {
|
|
46
|
+
key: capability.key,
|
|
47
|
+
pageIdentifier: capability.pageIdentifier,
|
|
48
|
+
pageIdentifierType: capability.pageIdentifierType,
|
|
49
|
+
mapping: plan.pattern,
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
await transport.write(payload, capability, { mode: plan.existing ? 'update' : 'create' });
|
|
53
|
+
const readBack = await transport.read(capability.key, capability);
|
|
54
|
+
if (!readBack || readBack.mapping !== plan.pattern || readBack.pageIdentifier !== capability.pageIdentifier) {
|
|
55
|
+
return { ...plan, status: 'readback-failed', payload, readBack: readBack || null, served: false };
|
|
56
|
+
}
|
|
57
|
+
return { ...plan, status: 'configured', payload, readBack, served: false };
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function expectedPath(pattern, slug) {
|
|
61
|
+
if (!pattern || typeof slug !== 'string' || !slug || !pattern.includes('{{slug}}')) throw new Error('read-back pattern and slug required');
|
|
62
|
+
const path = `/${pattern.replace(/^\/+/, '').replace('{{slug}}', encodeURIComponent(slug))}`;
|
|
63
|
+
if (path.includes('{{')) throw new Error('unresolved route variable');
|
|
64
|
+
return path;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function verifyServedRoute(result, check) {
|
|
68
|
+
if (!['configured', 'reused'].includes(result.status)) return result;
|
|
69
|
+
if (!check || !check.deploymentId || !check.targetRecordId || !check.path || !check.identityMatched || !check.generatedUrlMatched) {
|
|
70
|
+
return { ...result, served: false, servedReason: check && check.reason || 'route-identity-unverified' };
|
|
71
|
+
}
|
|
72
|
+
return { ...result, served: true, servedEvidence: check };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
module.exports = { validateCapability, inspectRoute, configureRoute, expectedPath, verifyServedRoute };
|
|
@@ -74,10 +74,20 @@ function createFreshnessMetadata({
|
|
|
74
74
|
createdAt = new Date().toISOString(),
|
|
75
75
|
} = {}) {
|
|
76
76
|
if (!projectDir) throw new Error('projectDir is required');
|
|
77
|
+
const additional = {};
|
|
78
|
+
const schemaFile = path.join(projectDir, 'source-schema.json');
|
|
79
|
+
const schema = fs.existsSync(schemaFile) ? JSON.parse(fs.readFileSync(schemaFile, 'utf8')) : {};
|
|
80
|
+
const entities = Array.isArray(schema.entities) ? schema.entities : Object.values(schema.entities || {});
|
|
81
|
+
if (entities.some((entity) => entity.sourceMeta?.extractionPlan)) {
|
|
82
|
+
const { planFreshnessReferences } = require('../resources/rp-source-wordpress/lib/plugin-entity-read-plan.js');
|
|
83
|
+
for (const reference of planFreshnessReferences({ projectDir, entities })) additional[`pluginInput:${reference.path}`] = { path: reference.path, sha256: hashArtifact(projectDir, reference.path) };
|
|
84
|
+
for (const input of ['src/extract', 'src/lib', 'src/project', 'src/import/plugin-handoff.js']) additional[`pluginCode:${input}`] = { path: input, sha256: hashArtifact(projectDir, input) };
|
|
85
|
+
}
|
|
77
86
|
return {
|
|
78
87
|
schemaVersion: SCHEMA_VERSION,
|
|
79
88
|
createdAt,
|
|
80
89
|
artifacts: {
|
|
90
|
+
...additional,
|
|
81
91
|
sourceSchema: {
|
|
82
92
|
path: artifactPaths.sourceSchema || DEFAULT_ARTIFACTS.sourceSchema,
|
|
83
93
|
sha256: hashArtifact(projectDir, artifactPaths.sourceSchema || DEFAULT_ARTIFACTS.sourceSchema),
|
|
@@ -111,7 +121,7 @@ function compareFreshnessMetadata(current, recorded) {
|
|
|
111
121
|
if (recorded.schemaVersion !== SCHEMA_VERSION) {
|
|
112
122
|
changes.push({ field: 'schemaVersion', expected: SCHEMA_VERSION, actual: recorded.schemaVersion });
|
|
113
123
|
}
|
|
114
|
-
for (const name of Object.keys(current.artifacts || {})) {
|
|
124
|
+
for (const name of new Set([...Object.keys(current.artifacts || {}), ...Object.keys(recorded.artifacts || {})])) {
|
|
115
125
|
const currentEntry = current.artifacts[name] || {};
|
|
116
126
|
const recordedEntry = (recorded.artifacts && recorded.artifacts[name]) || {};
|
|
117
127
|
if (currentEntry.sha256 !== recordedEntry.sha256) {
|