@wix/agent-skills 1.33.0 → 1.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -0
- package/package.json +2 -2
- package/skills/wix-app/references/DASHBOARD_PAGE.md +1 -1
- package/skills/wix-export/SKILL.md +83 -0
- package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
- package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
- package/skills/wix-harmony-editor/SKILL.md +317 -0
- package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
- package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
- package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
- package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
- package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
- package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
- package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
- package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
- package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
- package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
- package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
- package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
- package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
- package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
- package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
- package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
- package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
- package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
- package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
- package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
- package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
- package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
- package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
- package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
- package/skills/wix-headless/SKILL.md +7 -2
- package/skills/wix-headless/references/CAPABILITIES.md +6 -1
- package/skills/wix-headless/references/DISCOVERY.md +2 -1
- package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
- package/skills/wix-headless/references/SEED.md +3 -2
- package/skills/wix-headless/references/SETUP.md +1 -0
- package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
- package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
- package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
- package/skills/wix-headless/references/managed/CREATE.md +1 -1
- package/skills/wix-headless-kit/SKILL.md +110 -21
- package/skills/wix-headless-kit/guides/api-run.md +15 -13
- package/skills/wix-headless-kit/guides/existing-site.md +31 -0
- package/skills/wix-headless-kit/guides/migration.md +49 -17
- package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
- package/skills/wix-headless-kit/install/context.mjs +61 -6
- package/skills/wix-headless-kit/install/pins.json +1 -1
- package/skills/wix-headless-kit/install/setup.mjs +107 -12
- package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
- package/skills/wix-headless-replatform/SKILL.md +116 -0
- package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
- package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
- package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
- package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
- package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
- package/skills/wix-headless-replatform/references/output-contract.md +93 -0
- package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
- package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
- package/skills/wix-headless-replatform/references/safety.md +19 -0
- package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
- package/skills/wix-headless-replatform/references/workflow.md +157 -0
- package/skills/wix-headless-replatform/registry/README.md +20 -0
- package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
- package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
- package/skills/wix-headless-replatform/registry/registry.json +36 -0
- package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
- package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
- package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
- package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
- package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
- package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
- package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
- package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
- package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
- package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
- package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
- package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
- package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
- package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
- package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
- package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
- package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
- package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
- package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
- package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
- package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
- package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
- package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
- package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
- package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
- package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
- package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
- package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
- package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
- package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
- package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
- package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
- package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
- package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
- package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
- package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
- package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
- package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
- package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
- package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
- package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
- package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
- package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
- package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
- package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
- package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
- package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
- package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
- package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
- package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
- package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
- package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
- package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
- package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
- package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
- package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
- package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
- package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
- package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
- package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
- package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
- package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
- package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
- package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
- package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
- package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
- package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
- package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
- package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
- package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
- package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
- package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
- package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
- package/skills/wix-import/SKILL.md +90 -0
- package/skills/wix-manage/SKILL.md +38 -10
- package/skills/wix-manage/references/automations/actions.md +11 -11
- package/skills/wix-manage/references/automations/activation-status.md +6 -9
- package/skills/wix-manage/references/automations/api-catalog.md +48 -32
- package/skills/wix-manage/references/automations/automation-model.md +97 -22
- package/skills/wix-manage/references/automations/bracket-expressions.md +7 -7
- package/skills/wix-manage/references/automations/build-and-manage-automations.md +140 -309
- package/skills/wix-manage/references/automations/conditions.md +187 -0
- package/skills/wix-manage/references/automations/schemas-and-scheduling.md +191 -0
- package/skills/wix-manage/references/automations/special-actions.md +210 -0
- package/skills/wix-manage/references/automations/triggers.md +47 -10
- package/skills/wix-manage/references/automations/validation-and-verification.md +320 -0
- package/skills/wix-manage/references/custom-apps/use-app-tools.md +124 -0
- package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
- package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
- package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
- package/skills/wix-manage/references/events/create-wix-event.md +136 -73
- package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
- package/skills/wix-manage/references/events/manage-event-guests.md +366 -0
- package/skills/wix-manage/references/events/manage-event-tickets.md +293 -0
- package/skills/wix-manage/references/events/manage-wix-events.md +313 -55
- package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
- package/skills/wix-manage/references/sites/upload-static-site.md +127 -8
- package/skills/wix-manage/references/stores/update-product-with-options.md +58 -2
- package/skills/wix-replatform/.publish-manifest.json +5 -5
- package/skills/wix-replatform/CLI.md +162 -0
- package/skills/wix-replatform/README.md +52 -0
- package/skills/wix-replatform/SKILL.md +229 -684
- package/skills/wix-replatform/console/account.css +1 -0
- package/skills/wix-replatform/console/app.css +1 -0
- package/skills/wix-replatform/console/app.js +117 -0
- package/skills/wix-replatform/console/index.html +4 -0
- package/skills/wix-replatform/console/json.css +11 -0
- package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
- package/skills/wix-replatform/lib/app-page-routing.js +75 -0
- package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
- package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
- package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
- package/skills/wix-replatform/lib/completion-report.js +1393 -13
- package/skills/wix-replatform/lib/config-env.js +85 -11
- package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
- package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
- package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
- package/skills/wix-replatform/lib/destination-choice.js +163 -0
- package/skills/wix-replatform/lib/destination-handoff.js +62 -0
- package/skills/wix-replatform/lib/destination-http.js +81 -0
- package/skills/wix-replatform/lib/destination-route.js +98 -0
- package/skills/wix-replatform/lib/destination.js +919 -0
- package/skills/wix-replatform/lib/discovered-census.js +231 -0
- package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
- package/skills/wix-replatform/lib/document-url-guard.js +203 -0
- package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
- package/skills/wix-replatform/lib/entity-verification.js +18 -0
- package/skills/wix-replatform/lib/execution-capability.js +120 -0
- package/skills/wix-replatform/lib/execution-log.js +170 -0
- package/skills/wix-replatform/lib/execution-manifest.js +20 -2
- package/skills/wix-replatform/lib/execution-state.js +22 -0
- package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
- package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
- package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
- package/skills/wix-replatform/lib/import-recovery.js +800 -6
- package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
- package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
- package/skills/wix-replatform/lib/link-audit.js +173 -0
- package/skills/wix-replatform/lib/link-census.js +194 -0
- package/skills/wix-replatform/lib/link-plan.js +148 -0
- package/skills/wix-replatform/lib/link-verification.js +274 -0
- package/skills/wix-replatform/lib/link-write-journal.js +42 -0
- package/skills/wix-replatform/lib/local-state.js +869 -30
- package/skills/wix-replatform/lib/member-completion.js +658 -0
- package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
- package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
- package/skills/wix-replatform/lib/migration-completion.js +311 -0
- package/skills/wix-replatform/lib/operator-identity.js +47 -0
- package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
- package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
- package/skills/wix-replatform/lib/orchestration-router.js +608 -32
- package/skills/wix-replatform/lib/orchestration-state.js +188 -12
- package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
- package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
- package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
- package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
- package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
- package/skills/wix-replatform/lib/progress-log.js +19 -3
- package/skills/wix-replatform/lib/read-back-approval.js +184 -0
- package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
- package/skills/wix-replatform/lib/read-back-contract.js +243 -0
- package/skills/wix-replatform/lib/read-back-extract.js +118 -0
- package/skills/wix-replatform/lib/read-back-gate.js +734 -0
- package/skills/wix-replatform/lib/read-back-reads.js +94 -0
- package/skills/wix-replatform/lib/read-back-state.js +107 -0
- package/skills/wix-replatform/lib/read-back-summary.js +81 -0
- package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
- package/skills/wix-replatform/lib/run-controller.js +401 -0
- package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
- package/skills/wix-replatform/lib/setup-verification.js +148 -0
- package/skills/wix-replatform/lib/source-access.js +231 -0
- package/skills/wix-replatform/lib/source-coverage.js +1130 -0
- package/skills/wix-replatform/lib/source-secrets.js +277 -0
- package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
- package/skills/wix-replatform/lib/task-state.js +110 -0
- package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
- package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
- package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
- package/skills/wix-replatform/lib/url-verification.js +315 -0
- package/skills/wix-replatform/lib/user-action-effects.js +42 -0
- package/skills/wix-replatform/lib/user-actions.js +264 -0
- package/skills/wix-replatform/lib/website-handoff.js +1220 -0
- package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
- package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
- package/skills/wix-replatform/lib/write-verification-state.js +92 -0
- package/skills/wix-replatform/lib/write-verification.js +274 -0
- package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
- package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
- package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
- package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
- package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
- package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
- package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
- package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
- package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
- package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
- package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
- package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
- package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
- package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
- package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
- package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
- package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
- package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
- package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
- package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
- package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
- package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
- package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
- package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
- package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
- package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
- package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
- package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
- package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
- package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
- package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
- package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
- package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
- package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
- package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
- package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
- package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
- package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
- package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
- package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
- package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
- package/skills/wix-replatform/scripts/discovered-census.js +26 -0
- package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
- package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
- package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
- package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
- package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
- package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
- package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
- package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
- package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
- package/skills/wix-replatform/scripts/migration-completion.js +76 -0
- package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
- package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
- package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
- package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
- package/skills/wix-replatform/scripts/replatform-console.js +146 -0
- package/skills/wix-replatform/scripts/replatform.js +436 -0
- package/skills/wix-replatform/scripts/source-secrets.js +77 -0
- package/skills/wix-replatform/scripts/url-redirects.js +286 -0
- package/skills/wix-replatform/scripts/user-action.js +58 -0
- package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
- package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
- package/skills/wix-replatform/scripts/wix-destination.js +143 -0
- package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
- package/skills/wix-vibe-headless/SKILL.md +7 -3
- package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
- package/skills/wix-vibe-headless/platforms/base44.md +1 -0
- package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
- package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
- package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
- package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
- package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
- package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
- package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
- package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
- package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +0 -208
- package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
// One reusable check that answers exactly one question about a long-running
|
|
5
|
+
// generated script: healthy, stalled, or complete. Reads only the artifacts the progress-log and
|
|
6
|
+
// execution contracts already define (`execution/progress.ndjson`, `execution/completion-
|
|
7
|
+
// report.json`, the `state/.lock/` PID/host claim model rp-execute-import/SKILL.md already
|
|
8
|
+
// describes) -- it defines no new state and writes none.
|
|
9
|
+
//
|
|
10
|
+
// This does not change the progress-log format, event names, or polling contract; it is
|
|
11
|
+
// the "so nobody hand-rolls this per run" check layered on top of them.
|
|
12
|
+
|
|
13
|
+
const fs = require('node:fs');
|
|
14
|
+
const os = require('node:os');
|
|
15
|
+
const path = require('node:path');
|
|
16
|
+
const { createProgressLogger, parseProgressArgs } = require('../lib/progress-log.js');
|
|
17
|
+
// Note: `process.kill(pid, 0)` throwing does not
|
|
18
|
+
// by itself mean the process is dead -- Node surfaces the same exception for ESRCH (no such
|
|
19
|
+
// process) and EPERM (a real, live process this user cannot signal, e.g. owned by a different
|
|
20
|
+
// UID on a shared sandbox). Only ESRCH means dead. This used to be a separate copy of the same
|
|
21
|
+
// check duplicated from `local-state.js`'s `withStateLock` -- now shared from one place.
|
|
22
|
+
const { isProcessAlive } = require('../lib/local-state.js');
|
|
23
|
+
|
|
24
|
+
const DEFAULT_SCRIPT = 'run-import';
|
|
25
|
+
const DEFAULT_STALE_AFTER = '5m';
|
|
26
|
+
|
|
27
|
+
let progress;
|
|
28
|
+
|
|
29
|
+
function usage() {
|
|
30
|
+
console.error(`Usage:
|
|
31
|
+
node skills/wix-replatform/scripts/execution-health-check.js <projectDir> [--script <name>] [--stale-after <duration>]
|
|
32
|
+
|
|
33
|
+
Reads <projectDir>/execution/progress.ndjson (the NDJSON progress contract) and
|
|
34
|
+
<projectDir>/execution/completion-report.json and reports whether the named script's most
|
|
35
|
+
recent run is healthy, stalled, or complete. Writes no state and touches no target.
|
|
36
|
+
|
|
37
|
+
--script script id to filter progress records by (substring match against each
|
|
38
|
+
record's own "script" field); default "${DEFAULT_SCRIPT}"
|
|
39
|
+
--stale-after how old the most recent matching record may be before it counts as stale,
|
|
40
|
+
absent a live local process claim; default "${DEFAULT_STALE_AFTER}"
|
|
41
|
+
(accepts "<n>ms", "<n>s", "<n>m", "<n>h", "<n>d", or a bare millisecond
|
|
42
|
+
integer)
|
|
43
|
+
`);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function parseArgs(argv) {
|
|
47
|
+
const args = { script: DEFAULT_SCRIPT, staleAfter: DEFAULT_STALE_AFTER };
|
|
48
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
49
|
+
const token = argv[i];
|
|
50
|
+
if (token === '--script') {
|
|
51
|
+
args.script = argv[i + 1];
|
|
52
|
+
i += 1;
|
|
53
|
+
} else if (token === '--stale-after') {
|
|
54
|
+
args.staleAfter = argv[i + 1];
|
|
55
|
+
i += 1;
|
|
56
|
+
} else if (!args.projectDir) {
|
|
57
|
+
args.projectDir = token;
|
|
58
|
+
} else {
|
|
59
|
+
throw new Error(`unknown argument: ${token}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return args;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const DURATION_RE = /^(\d+(?:\.\d+)?)(ms|s|m|h|d)?$/i;
|
|
66
|
+
const DURATION_UNIT_MS = { ms: 1, s: 1000, m: 60000, h: 3600000, d: 86400000 };
|
|
67
|
+
|
|
68
|
+
function parseDurationMs(value) {
|
|
69
|
+
const match = DURATION_RE.exec(String(value === undefined ? '' : value).trim());
|
|
70
|
+
if (!match) {
|
|
71
|
+
throw new Error(`invalid --stale-after duration: ${JSON.stringify(value)} (expected e.g. "5m", "30s", "1h", or a bare millisecond integer)`);
|
|
72
|
+
}
|
|
73
|
+
const amount = Number(match[1]);
|
|
74
|
+
const unit = (match[2] || 'ms').toLowerCase();
|
|
75
|
+
return amount * DURATION_UNIT_MS[unit];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function readProgressRecords(progressLogPath) {
|
|
79
|
+
let raw;
|
|
80
|
+
try {
|
|
81
|
+
raw = fs.readFileSync(progressLogPath, 'utf8');
|
|
82
|
+
} catch (error) {
|
|
83
|
+
if (error && error.code === 'ENOENT') {
|
|
84
|
+
return { records: [], anyLineSeen: false };
|
|
85
|
+
}
|
|
86
|
+
throw error;
|
|
87
|
+
}
|
|
88
|
+
const records = [];
|
|
89
|
+
let anyLineSeen = false;
|
|
90
|
+
const lines = raw.split(/\r?\n/);
|
|
91
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
92
|
+
const line = lines[index].trim();
|
|
93
|
+
if (!line) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
anyLineSeen = true;
|
|
97
|
+
try {
|
|
98
|
+
records.push(JSON.parse(line));
|
|
99
|
+
} catch (error) {
|
|
100
|
+
// This used to throw and crash the WHOLE health-check on a
|
|
101
|
+
// single malformed/truncated line -- e.g. a generated run-import.js SIGKILLed/OOM-killed
|
|
102
|
+
// mid-write leaves a truncated final line in progress.ndjson. That turned the exact
|
|
103
|
+
// crashed-process case this tool exists to diagnose into an opaque failure (exit 1 instead
|
|
104
|
+
// of "stalled"), and every future poll on that project would fail the same way, since the
|
|
105
|
+
// append-only file is never rewritten. Skip the malformed line and keep reading: the health
|
|
106
|
+
// check still evaluates off the last VALID record, which is exactly what "healthy, stalled,
|
|
107
|
+
// or complete" needs. `local-state.js` already tolerates malformed/historical rows the same
|
|
108
|
+
// way on read for the same reason (see tolerateIdentifierOnlyMessage).
|
|
109
|
+
process.stderr.write(`warning: ${progressLogPath}:${index + 1} invalid NDJSON, skipped: ${error.message}\n`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// `records.length === 0` alone cannot tell "the log never
|
|
113
|
+
// existed / has zero lines" apart from "the log has lines, but every one was malformed and
|
|
114
|
+
// skipped above" -- both looked identical to `checkHealth`'s `noProgressRecordsAtAll`, letting
|
|
115
|
+
// an all-malformed log fall through to trusting a stale, unrelated completion-report.json as
|
|
116
|
+
// proof of completion. `anyLineSeen` lets the caller tell the two apart.
|
|
117
|
+
return { records, anyLineSeen };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Per the progress-log contract: `seq` is only strictly increasing WITHIN one `runId` -- a shared file can
|
|
121
|
+
// interleave more than one `runId`'s lines. "The current state of this script" is therefore the
|
|
122
|
+
// highest-`seq` record belonging to the MOST RECENT `runId` that produced a matching line, never
|
|
123
|
+
// the raw last line in file order and never a max `seq` compared across different `runId`s.
|
|
124
|
+
// "The most recent runId" used to be picked by array position --
|
|
125
|
+
// whichever matching record happened to be LAST IN FILE-APPEND ORDER (`matching[matching.length -
|
|
126
|
+
// 1].runId`), not by actual timestamp. That is racy if two processes for the same --script ever
|
|
127
|
+
// append to the same progress.ndjson concurrently (e.g. a health-check falsely reports "stalled"
|
|
128
|
+
// on a run that's actually alive, the driving agent redispatches per this file's own SKILL.md
|
|
129
|
+
// guidance without confirming the first process is dead, and now two processes append heartbeats
|
|
130
|
+
// to the same file): whichever write reaches the file last would silently win, ignoring the other
|
|
131
|
+
// process's later completion or crash. Every record already carries its own genuine `ts`
|
|
132
|
+
// (progress-log.js's `append` writes `new Date().toISOString()` on every record, never supplied
|
|
133
|
+
// by a caller), so pick the runId that owns the record with the latest real timestamp instead of
|
|
134
|
+
// trusting file position. A millisecond-exact tie between two different runIds' records is not
|
|
135
|
+
// disambiguated further (ISO timestamps only carry millisecond resolution) -- an acceptable
|
|
136
|
+
// residual limitation, not the append-order bug this closes.
|
|
137
|
+
function latestMatchingRecord(records, scriptFilter) {
|
|
138
|
+
const matching = records.filter((record) => (
|
|
139
|
+
record && typeof record.script === 'string' && record.script.includes(scriptFilter)
|
|
140
|
+
));
|
|
141
|
+
if (!matching.length) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
const recordTimeMs = (record) => {
|
|
145
|
+
const parsed = Date.parse(record?.ts);
|
|
146
|
+
return Number.isFinite(parsed) ? parsed : -Infinity;
|
|
147
|
+
};
|
|
148
|
+
const mostRecentRunId = matching.reduce((best, record) => (
|
|
149
|
+
best === null || recordTimeMs(record) > recordTimeMs(best) ? record : best
|
|
150
|
+
), null).runId;
|
|
151
|
+
const sameRun = matching.filter((record) => record.runId === mostRecentRunId);
|
|
152
|
+
return sameRun.reduce((best, record) => (
|
|
153
|
+
best === null || (Number(record.seq) || 0) > (Number(best.seq) || 0) ? record : best
|
|
154
|
+
), null);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Best-effort, local-machine-only liveness: reuses the SAME PID/host claim
|
|
158
|
+
// model `state/.lock/` already uses (see local-state.js's withStateLock and
|
|
159
|
+
// rp-execute-import/SKILL.md). A run driven from a different host cannot be corroborated this
|
|
160
|
+
// way -- staleness alone still produces a correct verdict for it.
|
|
161
|
+
//
|
|
162
|
+
// This only ever covers a process that calls `withStateLock` -- an import writer. A read-only
|
|
163
|
+
// script (a generated `run-extract.js`, or any future non-writing script) never acquires this
|
|
164
|
+
// lock even while genuinely alive, so this check alone cannot corroborate it. See
|
|
165
|
+
// `hasLiveRecordedPid` below for the script-agnostic complement.
|
|
166
|
+
// this used to treat ANY live PID claim under state/.lock/ for
|
|
167
|
+
// this host as proof the QUERIED script (`scriptFilter`) was alive, regardless of which
|
|
168
|
+
// script/writer actually holds that claim. A genuinely crashed run-import.js could be falsely
|
|
169
|
+
// reported healthy merely because an unrelated concurrent writer (e.g. run-extract.js) holds its
|
|
170
|
+
// own live claim in the same project. `local-state.js`'s `withStateLock` now writes a `script`
|
|
171
|
+
// field into the claim's own JSON content (defaulting to `process.argv[1]` of whichever process
|
|
172
|
+
// acquired it) -- require that identity to match `scriptFilter` before trusting the claim at all,
|
|
173
|
+
// mirroring how `hasLiveRecordedPid` below is already scoped to a specific progress record's own
|
|
174
|
+
// `script` field rather than any record's pid.
|
|
175
|
+
function hasLiveLocalProcess(projectDir, scriptFilter) {
|
|
176
|
+
const lockDir = path.join(projectDir, 'state', '.lock');
|
|
177
|
+
let entries;
|
|
178
|
+
try {
|
|
179
|
+
entries = fs.readdirSync(lockDir);
|
|
180
|
+
} catch (error) {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
const host = Buffer.from(os.hostname()).toString('base64url');
|
|
184
|
+
for (const entry of entries) {
|
|
185
|
+
const match = /^([^.]+)\.(\d+)\.[a-f0-9-]+\.owner$/.exec(entry);
|
|
186
|
+
if (!match || match[1] !== host) {
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
let claim = null;
|
|
190
|
+
try {
|
|
191
|
+
claim = JSON.parse(fs.readFileSync(path.join(lockDir, entry), 'utf8'));
|
|
192
|
+
} catch (error) {
|
|
193
|
+
// Unreadable/malformed/removed-mid-read claim: its identity cannot be corroborated, so it
|
|
194
|
+
// cannot count as evidence for ANY specific script. Keep checking other claims present.
|
|
195
|
+
}
|
|
196
|
+
// A claim written before this field existed, or with no recognizable script identity, cannot
|
|
197
|
+
// be trusted as evidence for this specific scriptFilter either -- the whole point of this
|
|
198
|
+
// fix is that an uncorroborated claim must not pass as "this script is alive".
|
|
199
|
+
if (!claim || typeof claim.script !== 'string' || !claim.script.includes(scriptFilter)) {
|
|
200
|
+
continue;
|
|
201
|
+
}
|
|
202
|
+
if (isProcessAlive(Number(match[2]))) {
|
|
203
|
+
return true;
|
|
204
|
+
}
|
|
205
|
+
// ESRCH: that claim's process is dead; keep checking any other claim present.
|
|
206
|
+
}
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// Script-agnostic complement to `hasLiveLocalProcess`: every progress-log record now carries its
|
|
211
|
+
// own writer's `host`/`pid` (see lib/progress-log.js), so a read-only script that never touches
|
|
212
|
+
// `state/.lock/` -- an extraction pass, or anything else that only reads -- can still be
|
|
213
|
+
// corroborated as live directly from its own most recent heartbeat, the same way an import
|
|
214
|
+
// writer is corroborated via its lock claim. Only trusts a pid on THIS host, same as the lock
|
|
215
|
+
// check.
|
|
216
|
+
function hasLiveRecordedPid(record) {
|
|
217
|
+
if (!record || typeof record.pid !== 'number' || typeof record.host !== 'string') {
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
if (record.host !== Buffer.from(os.hostname()).toString('base64url')) {
|
|
221
|
+
return false;
|
|
222
|
+
}
|
|
223
|
+
return isProcessAlive(record.pid);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Either signal corroborates liveness: an import writer's lock claim (now scoped to the same
|
|
227
|
+
// scriptFilter this whole check is asked about), or (for any script, writer or read-only) its own
|
|
228
|
+
// most recent heartbeat's recorded pid still being alive on this host.
|
|
229
|
+
function hasLiveSignal(projectDir, latestRecord, scriptFilter) {
|
|
230
|
+
return hasLiveLocalProcess(projectDir, scriptFilter) || hasLiveRecordedPid(latestRecord);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
function checkHealth({ projectDir, scriptFilter, staleAfterMs }) {
|
|
234
|
+
const completionReportPath = path.join(projectDir, 'execution', 'completion-report.json');
|
|
235
|
+
const progressLogPath = path.join(projectDir, 'execution', 'progress.ndjson');
|
|
236
|
+
const { records, anyLineSeen } = readProgressRecords(progressLogPath);
|
|
237
|
+
const latest = latestMatchingRecord(records, scriptFilter);
|
|
238
|
+
const lastEventAt = latest ? latest.ts : null;
|
|
239
|
+
const runId = latest ? latest.runId : null;
|
|
240
|
+
// A missing/unparsable `ts` used to throw here, crashing the
|
|
241
|
+
// whole check (exit 1) instead of producing a verdict -- the same failure mode the
|
|
242
|
+
// malformed-NDJSON-line fix closed for a syntactically-broken line, just left open for a
|
|
243
|
+
// schema-level defect (no `ts`, or one `Date.parse` can't read) in an otherwise-valid record,
|
|
244
|
+
// e.g. from a hand-rolled heartbeat that never went through lib/progress-log.js's `append()`.
|
|
245
|
+
// Treat it as "this record can't corroborate freshness" rather than fatal: `ageMs` stays null,
|
|
246
|
+
// which the staleness check below (`ageMs <= staleAfterMs`) cannot satisfy, so evaluation falls
|
|
247
|
+
// through to the live-signal checks instead of ever treating an unknown age as fresh.
|
|
248
|
+
let ageMs = null;
|
|
249
|
+
if (latest) {
|
|
250
|
+
const parsedAgeMs = Date.now() - Date.parse(latest.ts);
|
|
251
|
+
if (!Number.isNaN(parsedAgeMs)) {
|
|
252
|
+
ageMs = parsedAgeMs;
|
|
253
|
+
} else {
|
|
254
|
+
process.stderr.write(`warning: ${progressLogPath}: most recent matching record has an unparsable ts, treating its age as unknown: ${JSON.stringify(latest.ts)}\n`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// A completion artifact settles the verdict regardless of progress-log staleness -- the run
|
|
259
|
+
// finished, so a stale-looking last heartbeat before completion is not evidence of a stall.
|
|
260
|
+
// But a completion report is only evidence for the run it was written for: a resumed project
|
|
261
|
+
// carries its PREVIOUS run's completion-report.json into the new run's entire duration (it is
|
|
262
|
+
// only overwritten at the new run's own end), so existence alone would falsely call an actively
|
|
263
|
+
// resuming run "complete" from its very first tick. Only trust it when its own recorded `runId`
|
|
264
|
+
// matches the most recent run this progress log has seen -- if a newer `runId` is already
|
|
265
|
+
// writing progress lines, the report is stale evidence of a PRIOR run, not this one.
|
|
266
|
+
let completionReport = null;
|
|
267
|
+
if (fs.existsSync(completionReportPath)) {
|
|
268
|
+
try {
|
|
269
|
+
completionReport = JSON.parse(fs.readFileSync(completionReportPath, 'utf8'));
|
|
270
|
+
} catch (error) {
|
|
271
|
+
throw new Error(`${completionReportPath}: invalid JSON: ${error.message}`);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// `runId` (from `latest`) is null in two different situations that must NOT be conflated:
|
|
275
|
+
// the progress log has no records at all (a legacy script never instrumented with
|
|
276
|
+
// heartbeats -- the completion report is the only signal there is and must be trusted), or
|
|
277
|
+
// the progress log has records, just none matching THIS `--script` filter (a filter/script-id
|
|
278
|
+
// mismatch, or a different script actively writing under a name this call isn't watching).
|
|
279
|
+
// Only the first case may fall back to trusting an unmatched completion report; the second
|
|
280
|
+
// must not, or a caller who mis-names `--script` gets a false "complete" from some unrelated
|
|
281
|
+
// run's leftover report instead of a "stalled"/"no signal" verdict it would actually notice.
|
|
282
|
+
//
|
|
283
|
+
// Even the first case must not trust the report BLINDLY: a resumed/fresh run can be genuinely
|
|
284
|
+
// alive and simply hasn't flushed its first heartbeat yet, while a stale completion-report.json
|
|
285
|
+
// from a wholly earlier run still sits on disk. Corroborate with the same liveness signal used
|
|
286
|
+
// everywhere else in this file -- if something claims to be running right now, that wins over
|
|
287
|
+
// an old report, exactly like the "past the staleness window but a live claim exists" branch
|
|
288
|
+
// below already does for the non-empty-log case.
|
|
289
|
+
//
|
|
290
|
+
// Note: a redispatched run that crashes
|
|
291
|
+
// before writing its first heartbeat or acquiring its lock claim is, from this file's evidence
|
|
292
|
+
// alone, INDISTINGUISHABLE from "a legacy script that never emits heartbeats at all" -- both
|
|
293
|
+
// produce zero progress records and no live signal. A runId-based heuristic was tried here and
|
|
294
|
+
// reverted: `tests/execution-health/execution-health-check-test.js`'s own "a legacy
|
|
295
|
+
// uninstrumented script's completion report is still trusted" case deliberately gives its
|
|
296
|
+
// completion report a real, non-null `runId` (`'legacy-run'`), so "does the report have a real
|
|
297
|
+
// runId" cannot separate the two cases -- it isn't a signal this file has. Closing this race
|
|
298
|
+
// for real needs a NEW artifact recording that a dispatch attempt started (written by the
|
|
299
|
+
// dispatcher before it launches the script, not by the script itself, since the crash this
|
|
300
|
+
// finding describes happens before the script can write anything) -- out of scope for a
|
|
301
|
+
// same-file fix; flagged as a known, accepted limitation rather than silently left unaddressed.
|
|
302
|
+
const noProgressRecordsAtAll = !anyLineSeen;
|
|
303
|
+
const legacyReportTrustworthy = noProgressRecordsAtAll && !hasLiveSignal(projectDir, null, scriptFilter);
|
|
304
|
+
if (completionReport && (legacyReportTrustworthy || (runId && completionReport.runId === runId))) {
|
|
305
|
+
return {
|
|
306
|
+
ok: true,
|
|
307
|
+
status: 'complete',
|
|
308
|
+
lastEventAt,
|
|
309
|
+
ageMs,
|
|
310
|
+
runId,
|
|
311
|
+
detail: `${completionReportPath} exists and matches the most recent run (${completionReport.runId})`,
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
if (!latest) {
|
|
316
|
+
// No matching heartbeat AND no (trustworthy) completion report. A live local process claim
|
|
317
|
+
// still corroborates "genuinely running, just hasn't flushed its first heartbeat yet" over
|
|
318
|
+
// "stalled" -- the same "a live claim beats an old/absent signal" rule the staleness branch
|
|
319
|
+
// below applies. `hasLiveRecordedPid` needs a record to check a pid against, so only the
|
|
320
|
+
// lock-claim signal is available here.
|
|
321
|
+
if (hasLiveLocalProcess(projectDir, scriptFilter)) {
|
|
322
|
+
return {
|
|
323
|
+
ok: true,
|
|
324
|
+
status: 'healthy',
|
|
325
|
+
lastEventAt: null,
|
|
326
|
+
ageMs: null,
|
|
327
|
+
runId: null,
|
|
328
|
+
detail: `no progress record for script matching "${scriptFilter}" in ${progressLogPath} yet, but a live local process claim was found`,
|
|
329
|
+
};
|
|
330
|
+
}
|
|
331
|
+
return {
|
|
332
|
+
ok: true,
|
|
333
|
+
status: 'stalled',
|
|
334
|
+
lastEventAt: null,
|
|
335
|
+
ageMs: null,
|
|
336
|
+
runId: null,
|
|
337
|
+
detail: `no progress record for script matching "${scriptFilter}" in ${progressLogPath}, and no completion report`,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
if (ageMs !== null && ageMs <= staleAfterMs) {
|
|
342
|
+
return {
|
|
343
|
+
ok: true,
|
|
344
|
+
status: 'healthy',
|
|
345
|
+
lastEventAt,
|
|
346
|
+
ageMs,
|
|
347
|
+
runId,
|
|
348
|
+
detail: `last matching event ${ageMs}ms ago, within the ${staleAfterMs}ms staleness window`,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
if (!hasLiveSignal(projectDir, latest, scriptFilter)) {
|
|
353
|
+
return {
|
|
354
|
+
ok: true,
|
|
355
|
+
status: 'stalled',
|
|
356
|
+
lastEventAt,
|
|
357
|
+
ageMs,
|
|
358
|
+
runId,
|
|
359
|
+
detail: `last matching event ${ageMs}ms ago, past the ${staleAfterMs}ms staleness window, and no live local process claim or recorded pid was found`,
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
// Older than the staleness window but a live local process claim OR the record's own recorded
|
|
364
|
+
// pid still claims this run: the process being alive is the stronger signal when the two
|
|
365
|
+
// disagree. A slow batch without a fresh heartbeat is not itself a failure.
|
|
366
|
+
return {
|
|
367
|
+
ok: true,
|
|
368
|
+
status: 'healthy',
|
|
369
|
+
lastEventAt,
|
|
370
|
+
ageMs,
|
|
371
|
+
runId,
|
|
372
|
+
detail: `last matching event ${ageMs}ms ago, past the ${staleAfterMs}ms staleness window, but a live local process claim or recorded pid was found`,
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
function main() {
|
|
377
|
+
const parsed = parseProgressArgs(process.argv.slice(2));
|
|
378
|
+
progress = createProgressLogger({
|
|
379
|
+
script: 'skills/wix-replatform/scripts/execution-health-check.js',
|
|
380
|
+
...parsed.progress,
|
|
381
|
+
});
|
|
382
|
+
progress.start('Execution health check started', { phase: 'execution', step: 'health-check' });
|
|
383
|
+
|
|
384
|
+
const args = parseArgs(parsed.args);
|
|
385
|
+
if (!args.projectDir) {
|
|
386
|
+
usage();
|
|
387
|
+
throw new Error('Missing project directory');
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
const projectDir = path.resolve(args.projectDir);
|
|
391
|
+
const staleAfterMs = parseDurationMs(args.staleAfter);
|
|
392
|
+
const result = checkHealth({ projectDir, scriptFilter: args.script, staleAfterMs });
|
|
393
|
+
|
|
394
|
+
console.log(JSON.stringify(result, null, 2));
|
|
395
|
+
progress.complete('Execution health check completed', {
|
|
396
|
+
phase: 'execution',
|
|
397
|
+
step: 'health-check',
|
|
398
|
+
artifact: projectDir,
|
|
399
|
+
status: result.status,
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
try {
|
|
404
|
+
main();
|
|
405
|
+
process.exit(0);
|
|
406
|
+
} catch (error) {
|
|
407
|
+
if (progress) {
|
|
408
|
+
progress.error(error && error.message ? error.message : 'Execution health check failed', {
|
|
409
|
+
phase: 'execution',
|
|
410
|
+
step: 'health-check',
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
console.error(error && error.message ? error.message : error);
|
|
414
|
+
process.exit(1);
|
|
415
|
+
}
|
|
@@ -11,7 +11,7 @@ let progress;
|
|
|
11
11
|
async function main() {
|
|
12
12
|
const parsed = parseProgressArgs(process.argv.slice(2));
|
|
13
13
|
progress = createProgressLogger({
|
|
14
|
-
script: 'skills/replatform/scripts/execution-manifest-validate.js',
|
|
14
|
+
script: 'skills/wix-replatform/scripts/execution-manifest-validate.js',
|
|
15
15
|
...parsed.progress,
|
|
16
16
|
});
|
|
17
17
|
progress.start('Execution manifest validation started', { phase: 'validation' });
|
|
@@ -75,7 +75,7 @@ async function readMirrorRows(projectDir, specs) {
|
|
|
75
75
|
async function main() {
|
|
76
76
|
const parsed = parseProgressArgs(process.argv.slice(2));
|
|
77
77
|
progress = createProgressLogger({
|
|
78
|
-
script: 'skills/replatform/scripts/execution-state-prepare.js',
|
|
78
|
+
script: 'skills/wix-replatform/scripts/execution-state-prepare.js',
|
|
79
79
|
...parsed.progress,
|
|
80
80
|
});
|
|
81
81
|
progress.start('Execution state preparation started', { phase: 'execution', step: 'prepare-state' });
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const path = require('node:path');
|
|
5
|
+
const { appendExpectation } = require('../lib/expectations-ledger.js');
|
|
6
|
+
const { loadArtifacts } = require('../lib/orchestration-state.js');
|
|
7
|
+
|
|
8
|
+
function parseArgs(argv) {
|
|
9
|
+
const args = { artifactRef: [] };
|
|
10
|
+
for (let index = 0; index < argv.length; index += 1) {
|
|
11
|
+
const token = argv[index];
|
|
12
|
+
if (!token.startsWith('--')) continue;
|
|
13
|
+
const key = token.slice(2).replace(/-([a-z])/g, (_, char) => char.toUpperCase());
|
|
14
|
+
const value = argv[index + 1];
|
|
15
|
+
if (key === 'artifactRef') args.artifactRef.push(value);
|
|
16
|
+
else args[key] = value;
|
|
17
|
+
index += 1;
|
|
18
|
+
}
|
|
19
|
+
return args;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
async function main() {
|
|
23
|
+
const args = parseArgs(process.argv.slice(2));
|
|
24
|
+
if (!args.projectDir || !args.expectation) {
|
|
25
|
+
throw new Error('Usage: expectations-ledger.js --project-dir <migration-dir> --expectation <note> [--artifact-ref <project-relative-path>]');
|
|
26
|
+
}
|
|
27
|
+
const projectDir = path.resolve(args.projectDir);
|
|
28
|
+
const artifacts = await loadArtifacts(projectDir);
|
|
29
|
+
const result = await appendExpectation(projectDir, args.expectation, {
|
|
30
|
+
phase: args.phase || artifacts.run?.activePhase,
|
|
31
|
+
state: args.state || artifacts.run?.currentState,
|
|
32
|
+
resource: args.resource,
|
|
33
|
+
source: args.source,
|
|
34
|
+
target: args.target,
|
|
35
|
+
decision: args.decision,
|
|
36
|
+
artifactRefs: args.artifactRef,
|
|
37
|
+
});
|
|
38
|
+
console.log(JSON.stringify({ ok: true, expectationId: result.id, file: result.file, redacted: result.redacted }, null, 2));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
main().catch((error) => {
|
|
42
|
+
console.error(error.message || error);
|
|
43
|
+
process.exit(1);
|
|
44
|
+
});
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
// Layer 2 — the committed pre-write gate.
|
|
5
|
+
//
|
|
6
|
+
// Layer 1 is the generated entrypoint checking itself: `run-import.js` calls
|
|
7
|
+
// `assertGeneratedImporterContract` as the first statement of `main()`, so an operator cannot
|
|
8
|
+
// skip it. This is the outside check, run before the first write, that catches the importer
|
|
9
|
+
// which never emitted that call at all — such an importer also cannot answer `--describe`.
|
|
10
|
+
//
|
|
11
|
+
// Neither layer replaces the other. Layer 1 covers the run an operator starts directly; layer 2
|
|
12
|
+
// is what makes the boundary testable, because a test can spawn a real script the same way the
|
|
13
|
+
// suite already spawns execution-state-prepare.js.
|
|
14
|
+
//
|
|
15
|
+
// This writes no state and touches no target.
|
|
16
|
+
|
|
17
|
+
const fsSync = require('node:fs');
|
|
18
|
+
const path = require('node:path');
|
|
19
|
+
const { spawnSync } = require('node:child_process');
|
|
20
|
+
const { verifyPluginHandoff } = require('../lib/generated-plugin-handoff.js');
|
|
21
|
+
const { parseSelectionArgs } = require('../resources/rp-source-wordpress/lib/plugin-entity-read-plan.js');
|
|
22
|
+
const { assertGeneratedImporterContract } = require('../lib/import-recovery.js');
|
|
23
|
+
const { createProgressLogger, parseProgressArgs } = require('../lib/progress-log.js');
|
|
24
|
+
|
|
25
|
+
const DEFAULT_ENTRYPOINTS = ['src/import/run-import.js'];
|
|
26
|
+
const DESCRIBE_TIMEOUT_MS = 30000;
|
|
27
|
+
|
|
28
|
+
let progress;
|
|
29
|
+
|
|
30
|
+
function usage() {
|
|
31
|
+
console.error(`Usage:
|
|
32
|
+
node skills/wix-replatform/scripts/import-contract-verify.js <projectDir> [--entrypoint <path>]
|
|
33
|
+
|
|
34
|
+
Spawns each generated import entrypoint with --describe, parses the single JSON object it
|
|
35
|
+
prints, and checks it against the generated-importer contract. Exits non-zero naming every
|
|
36
|
+
missing selection mode and every misplaced ledger path. Writes no state, touches no target.
|
|
37
|
+
|
|
38
|
+
--entrypoint may be repeated; paths are resolved against <projectDir>. When omitted, the
|
|
39
|
+
conventional entrypoint ${DEFAULT_ENTRYPOINTS.join(', ')} is used.
|
|
40
|
+
`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function parseArgs(argv) {
|
|
44
|
+
const args = { entrypoints: [], selection: {} };
|
|
45
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
46
|
+
const token = argv[i];
|
|
47
|
+
if (token === '--') {
|
|
48
|
+
args.selection = parseSelectionArgs(argv.slice(i + 1));
|
|
49
|
+
break;
|
|
50
|
+
} else if (token === '--extract-entrypoint') {
|
|
51
|
+
args.extractEntrypoint = argv[++i];
|
|
52
|
+
} else if (token === '--entrypoint') {
|
|
53
|
+
args.entrypoints.push(argv[i + 1]);
|
|
54
|
+
i += 1;
|
|
55
|
+
} else if (!args.projectDir) {
|
|
56
|
+
args.projectDir = token;
|
|
57
|
+
} else {
|
|
58
|
+
throw new Error(`unknown argument: ${token}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return args;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// The entrypoint prints ONE JSON object. Generated importers habitually log a banner line
|
|
65
|
+
// first, so take the last balanced top-level object rather than demanding a pristine stdout —
|
|
66
|
+
// but never guess: unparsable stdout is a gate failure, not a pass.
|
|
67
|
+
function parseDescriptor(stdout) {
|
|
68
|
+
const trimmed = String(stdout || '').trim();
|
|
69
|
+
if (!trimmed) {
|
|
70
|
+
throw new Error('printed nothing on --describe (an entrypoint that ignores --describe fails the gate)');
|
|
71
|
+
}
|
|
72
|
+
const start = trimmed.indexOf('{');
|
|
73
|
+
const end = trimmed.lastIndexOf('}');
|
|
74
|
+
if (start < 0 || end <= start) {
|
|
75
|
+
throw new Error(`printed no JSON object on --describe: ${trimmed.slice(0, 200)}`);
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
return JSON.parse(trimmed.slice(start, end + 1));
|
|
79
|
+
} catch (error) {
|
|
80
|
+
throw new Error(`printed unparsable JSON on --describe: ${error.message}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function verifyEntrypoint(projectDir, relativePath) {
|
|
85
|
+
const absolute = path.resolve(projectDir, relativePath);
|
|
86
|
+
if (!fsSync.existsSync(absolute)) {
|
|
87
|
+
return { entrypoint: relativePath, ok: false, error: 'entrypoint not found' };
|
|
88
|
+
}
|
|
89
|
+
const described = spawnSync(process.execPath, [absolute, '--describe'], {
|
|
90
|
+
cwd: projectDir,
|
|
91
|
+
encoding: 'utf8',
|
|
92
|
+
timeout: DESCRIBE_TIMEOUT_MS,
|
|
93
|
+
});
|
|
94
|
+
if (described.error) {
|
|
95
|
+
return { entrypoint: relativePath, ok: false, error: `could not run --describe: ${described.error.message}` };
|
|
96
|
+
}
|
|
97
|
+
if (described.status !== 0) {
|
|
98
|
+
const detail = (described.stderr || described.stdout || '').trim().slice(0, 400);
|
|
99
|
+
return { entrypoint: relativePath, ok: false, error: `--describe exited ${described.status}: ${detail}` };
|
|
100
|
+
}
|
|
101
|
+
let descriptor;
|
|
102
|
+
try {
|
|
103
|
+
descriptor = parseDescriptor(described.stdout);
|
|
104
|
+
} catch (error) {
|
|
105
|
+
return { entrypoint: relativePath, ok: false, error: error.message };
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
assertGeneratedImporterContract(descriptor);
|
|
109
|
+
const readiness = require('../lib/import-readiness-contract').verifyReadinessContract(projectDir, descriptor);
|
|
110
|
+
if (!readiness.ok) throw new Error(readiness.errors.join(';'));
|
|
111
|
+
} catch (error) {
|
|
112
|
+
return { entrypoint: relativePath, ok: false, error: error.message };
|
|
113
|
+
}
|
|
114
|
+
return { entrypoint: relativePath, ok: true, error: null };
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function main() {
|
|
118
|
+
const parsed = parseProgressArgs(process.argv.slice(2));
|
|
119
|
+
progress = createProgressLogger({
|
|
120
|
+
script: 'skills/wix-replatform/scripts/import-contract-verify.js',
|
|
121
|
+
...parsed.progress,
|
|
122
|
+
});
|
|
123
|
+
progress.start('Import contract verification started', { phase: 'execution', step: 'verify-import-contract' });
|
|
124
|
+
|
|
125
|
+
const args = parseArgs(parsed.args);
|
|
126
|
+
if (!args.projectDir) {
|
|
127
|
+
usage();
|
|
128
|
+
progress.error('Missing project directory', { phase: 'execution', step: 'verify-import-contract' });
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
const projectDir = path.resolve(args.projectDir);
|
|
133
|
+
const entrypoints = args.entrypoints.length ? args.entrypoints : DEFAULT_ENTRYPOINTS;
|
|
134
|
+
// Inspect canonical inventory and exact generated bytes BEFORE executing --describe.
|
|
135
|
+
const plugin = verifyPluginHandoff(projectDir, args.selection);
|
|
136
|
+
if (plugin.applicable && entrypoints.some((entrypoint) => entrypoint !== 'src/import/run-import.js')) throw new Error('unsupported generated plugin importer entrypoint');
|
|
137
|
+
if (plugin.applicable && args.extractEntrypoint && args.extractEntrypoint !== 'src/extract/run-extract.js') throw new Error('unsupported generated plugin extractor entrypoint');
|
|
138
|
+
const results = entrypoints.map((entrypoint) => verifyEntrypoint(projectDir, entrypoint));
|
|
139
|
+
const failures = results.filter((result) => !result.ok);
|
|
140
|
+
|
|
141
|
+
console.log(JSON.stringify({
|
|
142
|
+
ok: failures.length === 0,
|
|
143
|
+
projectDir,
|
|
144
|
+
entrypoints: results,
|
|
145
|
+
}, null, 2));
|
|
146
|
+
|
|
147
|
+
if (failures.length) {
|
|
148
|
+
for (const failure of failures) {
|
|
149
|
+
console.error(`${failure.entrypoint}: ${failure.error}`);
|
|
150
|
+
}
|
|
151
|
+
console.error('Import aborted: the generated importer does not satisfy the entry contract. Route back to codegen — there is no degraded mode and no skip flag.');
|
|
152
|
+
progress.error('Import contract verification failed', {
|
|
153
|
+
phase: 'execution',
|
|
154
|
+
step: 'verify-import-contract',
|
|
155
|
+
artifact: projectDir,
|
|
156
|
+
count: failures.length,
|
|
157
|
+
unit: 'entrypoints',
|
|
158
|
+
});
|
|
159
|
+
process.exit(1);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
progress.complete('Import contract verification passed', {
|
|
163
|
+
phase: 'execution',
|
|
164
|
+
step: 'verify-import-contract',
|
|
165
|
+
artifact: projectDir,
|
|
166
|
+
count: results.length,
|
|
167
|
+
unit: 'entrypoints',
|
|
168
|
+
});
|
|
169
|
+
process.exit(0);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
try {
|
|
173
|
+
main();
|
|
174
|
+
} catch (error) {
|
|
175
|
+
if (progress) {
|
|
176
|
+
progress.error(error && error.message ? error.message : 'Import contract verification failed', {
|
|
177
|
+
phase: 'execution',
|
|
178
|
+
step: 'verify-import-contract',
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
console.error(error && error.message ? error.message : error);
|
|
182
|
+
process.exit(1);
|
|
183
|
+
}
|