@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,150 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
// Fetch a domain's dev.wix.com docs menu(s) and sync
|
|
5
|
+
// domains/<domain>/docs-survey.json. The script owns the surface list (id,
|
|
6
|
+
// title, url, group); verdict fields are authored by hand and preserved
|
|
7
|
+
// across syncs. New surfaces arrive as "unreviewed", which fails validation
|
|
8
|
+
// until triaged; surfaces gone from the docs are marked "removed", which
|
|
9
|
+
// also fails validation until the entry is deleted or its facts revisited.
|
|
10
|
+
//
|
|
11
|
+
// Usage: node docs-survey-sync.js <domain> [<domain>...]
|
|
12
|
+
// Requires domains/<domain>/domain.json to declare docsRoots[] (paths under
|
|
13
|
+
// https://dev.wix.com/docs/, e.g. "api-reference/business-solutions/events").
|
|
14
|
+
|
|
15
|
+
const path = require('node:path');
|
|
16
|
+
const fs = require('node:fs');
|
|
17
|
+
const { knowledgeRoot, writeJson } = require('../lib/domain-knowledge.js');
|
|
18
|
+
|
|
19
|
+
const DOCS_BASE = 'https://dev.wix.com/docs/';
|
|
20
|
+
const HEADING_RE = /^(#{1,6}) \[([^\]]+)\]\((https:\/\/dev\.wix\.com\/docs\/[^)]+?)(?:\.md)?\)\s*$/;
|
|
21
|
+
|
|
22
|
+
async function fetchMenuMarkdown(root) {
|
|
23
|
+
const url = `${DOCS_BASE}${root}.md`;
|
|
24
|
+
const response = await fetch(url, { redirect: 'follow' });
|
|
25
|
+
if (!response.ok) throw new Error(`GET ${url} -> HTTP ${response.status}`);
|
|
26
|
+
return response.text();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// A menu page lists its whole ancestry too (# Api Reference, ## Business
|
|
30
|
+
// Solutions, ...). Only headings strictly below the fetched root are the
|
|
31
|
+
// domain's own; among those, the surfaces are the deepest headings — the
|
|
32
|
+
// ones with no child headings.
|
|
33
|
+
function extractSurfaces(markdown, root) {
|
|
34
|
+
const headings = [];
|
|
35
|
+
let rootTitle = null;
|
|
36
|
+
for (const line of markdown.split('\n')) {
|
|
37
|
+
const match = line.match(HEADING_RE);
|
|
38
|
+
if (!match) continue;
|
|
39
|
+
const docsPath = match[3].slice(DOCS_BASE.length);
|
|
40
|
+
if (docsPath === root) rootTitle = match[2];
|
|
41
|
+
if (!docsPath.startsWith(`${root}/`)) continue;
|
|
42
|
+
headings.push({ level: match[1].length, title: match[2], docsPath });
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// A flat tree (all methods as bullets, no sub-headings) is still one
|
|
46
|
+
// surface — the root itself. Never let a root vanish silently.
|
|
47
|
+
if (headings.length === 0) {
|
|
48
|
+
return [
|
|
49
|
+
{
|
|
50
|
+
id: root,
|
|
51
|
+
title: rootTitle || root.split('/').pop(),
|
|
52
|
+
url: `${DOCS_BASE}${root}`,
|
|
53
|
+
group: null,
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const surfaces = [];
|
|
59
|
+
for (let i = 0; i < headings.length; i += 1) {
|
|
60
|
+
const heading = headings[i];
|
|
61
|
+
const next = headings[i + 1];
|
|
62
|
+
const hasChildren = next && next.level > heading.level;
|
|
63
|
+
if (hasChildren) continue;
|
|
64
|
+
const group = [];
|
|
65
|
+
for (let j = i - 1, level = heading.level; j >= 0; j -= 1) {
|
|
66
|
+
if (headings[j].level < level) {
|
|
67
|
+
group.unshift(headings[j].title);
|
|
68
|
+
level = headings[j].level;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
surfaces.push({
|
|
72
|
+
id: heading.docsPath,
|
|
73
|
+
title: heading.title,
|
|
74
|
+
url: `${DOCS_BASE}${heading.docsPath}`,
|
|
75
|
+
group: group.join(' › ') || null,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return surfaces;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function mergeSurvey(existing, domain, roots, fetched) {
|
|
82
|
+
const previous = new Map(((existing && existing.surfaces) || []).map((entry) => [entry.id, entry]));
|
|
83
|
+
const surfaces = fetched.map((surface) => {
|
|
84
|
+
const kept = previous.get(surface.id);
|
|
85
|
+
previous.delete(surface.id);
|
|
86
|
+
const verdictFields = kept
|
|
87
|
+
? {
|
|
88
|
+
verdict: kept.verdict,
|
|
89
|
+
refs: kept.refs,
|
|
90
|
+
reason: kept.reason,
|
|
91
|
+
tracking: kept.tracking,
|
|
92
|
+
reviewedOn: kept.reviewedOn,
|
|
93
|
+
}
|
|
94
|
+
: { verdict: 'unreviewed' };
|
|
95
|
+
for (const key of Object.keys(verdictFields)) {
|
|
96
|
+
if (verdictFields[key] === undefined) delete verdictFields[key];
|
|
97
|
+
}
|
|
98
|
+
return { ...surface, ...verdictFields };
|
|
99
|
+
});
|
|
100
|
+
for (const gone of previous.values()) {
|
|
101
|
+
surfaces.push({ ...gone, removed: true });
|
|
102
|
+
}
|
|
103
|
+
surfaces.sort((a, b) => a.id.localeCompare(b.id));
|
|
104
|
+
return {
|
|
105
|
+
schemaVersion: 1,
|
|
106
|
+
domain,
|
|
107
|
+
fetchedAt: new Date().toISOString().slice(0, 10),
|
|
108
|
+
roots,
|
|
109
|
+
surfaces,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
async function syncDomain(domainsDir, domain) {
|
|
114
|
+
const domainJsonPath = path.join(domainsDir, domain, 'domain.json');
|
|
115
|
+
const domainJson = JSON.parse(fs.readFileSync(domainJsonPath, 'utf8'));
|
|
116
|
+
const roots = domainJson.docsRoots;
|
|
117
|
+
if (!Array.isArray(roots) || roots.length === 0) {
|
|
118
|
+
throw new Error(`${domain}/domain.json has no docsRoots[]; declare the domain's docs menu roots first`);
|
|
119
|
+
}
|
|
120
|
+
const fetchedByRoot = await Promise.all(
|
|
121
|
+
roots.map((root) => fetchMenuMarkdown(root).then((md) => extractSurfaces(md, root))),
|
|
122
|
+
);
|
|
123
|
+
const fetched = fetchedByRoot.flat();
|
|
124
|
+
|
|
125
|
+
const surveyPath = path.join(domainsDir, domain, 'docs-survey.json');
|
|
126
|
+
const existing = fs.existsSync(surveyPath) ? JSON.parse(fs.readFileSync(surveyPath, 'utf8')) : null;
|
|
127
|
+
const survey = mergeSurvey(existing, domain, roots, fetched);
|
|
128
|
+
writeJson(surveyPath, survey);
|
|
129
|
+
|
|
130
|
+
const unreviewed = survey.surfaces.filter((s) => s.verdict === 'unreviewed').length;
|
|
131
|
+
const removed = survey.surfaces.filter((s) => s.removed).length;
|
|
132
|
+
process.stdout.write(
|
|
133
|
+
`${domain}: ${survey.surfaces.length} surfaces (${unreviewed} unreviewed, ${removed} removed) -> ${path.relative(process.cwd(), surveyPath)}\n`
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
async function main() {
|
|
138
|
+
const domains = process.argv.slice(2).filter((arg) => !arg.startsWith('--'));
|
|
139
|
+
if (domains.length === 0) {
|
|
140
|
+
process.stderr.write('Usage: docs-survey-sync.js <domain> [<domain>...]\n');
|
|
141
|
+
process.exit(2);
|
|
142
|
+
}
|
|
143
|
+
const domainsDir = knowledgeRoot(path.resolve(__dirname, '..'));
|
|
144
|
+
for (const domain of domains) await syncDomain(domainsDir, domain);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
main().catch((error) => {
|
|
148
|
+
process.stderr.write(`ERROR: ${error.message}\n`);
|
|
149
|
+
process.exit(1);
|
|
150
|
+
});
|
|
@@ -2,11 +2,49 @@
|
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
const path = require('node:path');
|
|
5
|
-
const { knowledgeRoot, validateKnowledge, writeJson } = require('../lib/domain-knowledge.js');
|
|
5
|
+
const { knowledgeRoot, validateKnowledge, writeJson, listMissingDependsOn, checkScope } = require('../lib/domain-knowledge.js');
|
|
6
6
|
|
|
7
7
|
function main() {
|
|
8
|
-
const
|
|
8
|
+
const argv = process.argv.slice(2);
|
|
9
|
+
const args = new Set(argv);
|
|
9
10
|
const domainsDir = knowledgeRoot(path.resolve(__dirname, '..'));
|
|
11
|
+
|
|
12
|
+
if (args.has('--list-missing-deps')) {
|
|
13
|
+
// The live backlog — entities that have never had dependsOn authored at all.
|
|
14
|
+
// Non-blocking report, not a validation error; this is the thing to run instead of
|
|
15
|
+
// trusting a hand-maintained list to stay accurate.
|
|
16
|
+
const missing = listMissingDependsOn(domainsDir);
|
|
17
|
+
process.stdout.write(`${missing.length} entit${missing.length === 1 ? 'y has' : 'ies have'} no dependsOn yet:\n`);
|
|
18
|
+
for (const ref of missing) process.stdout.write(` ${ref}\n`);
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const checkScopeIndex = argv.indexOf('--check-scope');
|
|
23
|
+
if (checkScopeIndex !== -1) {
|
|
24
|
+
// The rp-mapper review-gate check: pass only the plan's own selected scope — checkScope
|
|
25
|
+
// walks the transitive closure itself. --check-scope stores/product,gift-cards/gift-card,ecom/order
|
|
26
|
+
const inScopeRefs = (argv[checkScopeIndex + 1] || '').split(',').map((s) => s.trim()).filter(Boolean);
|
|
27
|
+
if (inScopeRefs.length === 0) {
|
|
28
|
+
process.stderr.write('ERROR: --check-scope requires a comma-separated list of domain/entity refs\n');
|
|
29
|
+
process.exit(1);
|
|
30
|
+
}
|
|
31
|
+
const result = checkScope(domainsDir, inScopeRefs);
|
|
32
|
+
if (result.ok) {
|
|
33
|
+
process.stdout.write('OK: every selected ref resolves, every reachable dependency is in scope, and every reachable entity has been reviewed\n');
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
for (const ref of result.unknownRefs) {
|
|
37
|
+
process.stdout.write(`UNKNOWN: ${ref} does not resolve to a real domain/entity file\n`);
|
|
38
|
+
}
|
|
39
|
+
for (const { ref, missing } of result.missingDependencies) {
|
|
40
|
+
process.stdout.write(`MISSING: ${ref} depends on ${missing.join(', ')}, not in scope for this plan\n`);
|
|
41
|
+
}
|
|
42
|
+
for (const ref of result.unreviewedRefs) {
|
|
43
|
+
process.stdout.write(`UNREVIEWED: ${ref} is reachable from this scope but has never had dependsOn authored\n`);
|
|
44
|
+
}
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
|
|
10
48
|
const result = validateKnowledge(domainsDir);
|
|
11
49
|
|
|
12
50
|
if (args.has('--write-index')) {
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
'use strict';
|
|
3
|
+
const { startDevProbe } = require('../../../lib/execution-capability');
|
|
3
4
|
|
|
4
5
|
const fs = require('fs');
|
|
5
6
|
const path = require('path');
|
|
@@ -13,6 +14,7 @@ const {
|
|
|
13
14
|
function usage() {
|
|
14
15
|
console.error(`Usage:
|
|
15
16
|
node scripts/verify-stores.js stores subscription-create --artifact <file> [--proposal-artifact <file>] [--marker <id>] [--no-cleanup]
|
|
17
|
+
node scripts/verify-stores.js stores inventory-import --env <test-target-config> --artifact <file>
|
|
16
18
|
node scripts/verify-stores.js stores product-count --artifact <file>
|
|
17
19
|
node scripts/verify-stores.js stores product-by-source-marker --marker-path <path> --marker-value <value> --artifact <file>
|
|
18
20
|
node scripts/verify-stores.js stores delete-probe --product-id <id> --artifact <file>
|
|
@@ -60,7 +62,7 @@ function loadEnvFile(file) {
|
|
|
60
62
|
const authToken = process.env.WIX_AUTH_TOKEN;
|
|
61
63
|
const siteId = process.env.WIX_SITE_ID;
|
|
62
64
|
if (!authToken || !siteId) throw new Error('WIX_AUTH_TOKEN and WIX_SITE_ID are required');
|
|
63
|
-
const wix = w.createWixClient({ authToken, siteId });
|
|
65
|
+
const wix = w.createWixClient({ authToken, capability: startDevProbe({ siteId, confirmation: process.env.RP_SENTINEL_CONFIRM }) });
|
|
64
66
|
const common = { wix, siteId, artifactPath: options.artifact };
|
|
65
67
|
|
|
66
68
|
let result;
|
|
@@ -84,6 +86,9 @@ function loadEnvFile(file) {
|
|
|
84
86
|
fs.writeFileSync(options.artifact, `${JSON.stringify(result, null, 2)}\n`);
|
|
85
87
|
}
|
|
86
88
|
}
|
|
89
|
+
} else if (command === 'inventory-import') {
|
|
90
|
+
if (!options.artifact) throw new Error('inventory-import requires --artifact for recovery and verification evidence');
|
|
91
|
+
result = await verify.verifyStoresInventoryImport(common);
|
|
87
92
|
} else if (command === 'product-count') {
|
|
88
93
|
result = await verify.verifyStoresProductCount(common);
|
|
89
94
|
} else if (command === 'product-by-source-marker') {
|
|
@@ -60,10 +60,20 @@ what to fix.
|
|
|
60
60
|
| `meter [--api-ms N --model-ms N --script-ms N --input-tokens N …]` | Measured latency/token counts for a stage. Call it whenever you have real numbers; see "Metering" below. |
|
|
61
61
|
| `wait start [--halt <subtype> --skill <s> [--what '<text>']]` / `wait end` | The moment the run halts for the user, and the moment it resumes. This is how user latency stays out of `active_ms` — never estimate elapsed time yourself. Pass `--halt` for a needs-user halt and the recorder emits the paired `halt_needs_user` event for you. |
|
|
62
62
|
| `record '<event-json>'` | The moment something observable happens (taxonomy below). |
|
|
63
|
+
| `digest --transcript <path> [--offline]` | Just before `finalize` — a deterministic parse of this run's Claude Code session transcript (cost, turn counts, tool failures, retry loops, hook errors). Never authored by you; `--offline` re-runs it later against a checkpointed or local transcript for a run that died before calling it. |
|
|
63
64
|
| `finalize '<rollup-json>'` | When the run reaches a terminal state. |
|
|
64
65
|
| `rebuild [--attempt <n>] [--push]` | Only on request, to re-assemble a past run's signal document from its archived journal after a recorder fix — never during a run. `--push` re-emits the rebuilt run to the BI sink (backfill after an outage; idempotent — the reviewer dedupes at query time). |
|
|
65
66
|
| `status` | To orient after a resume. |
|
|
66
67
|
|
|
68
|
+
Preflight reads that same `status` and reports whether a journal exists — `active`,
|
|
69
|
+
`absent`, `finalized_only` or `unreadable` — as a non-blocking line in its result. When
|
|
70
|
+
nothing is recording, the preflight script then calls `start` itself (moving an
|
|
71
|
+
unreplayable journal aside first) and adds a `recovery` field to that line. This is a
|
|
72
|
+
safety net, not the main path: `start` at run begin below stays required. A
|
|
73
|
+
`recovery: failed` reading falls under the "never mention" rule below — it is recorded for
|
|
74
|
+
the RePlatform team in the preflight result and progress log, never told to the person
|
|
75
|
+
running the migration, and never blocks the run.
|
|
76
|
+
|
|
67
77
|
### Run lifecycle
|
|
68
78
|
|
|
69
79
|
1. **`start`** as the first telemetry act of the run, with whatever dimensions are already
|
|
@@ -80,6 +90,23 @@ what to fix.
|
|
|
80
90
|
one more session) and closes any open wait interval. `start` after a finalized run
|
|
81
91
|
opens the next attempt. Never try to manage run identity yourself.
|
|
82
92
|
|
|
93
|
+
**Always `start` on resume, even mid-stage.** Besides the session accounting, the
|
|
94
|
+
resume is a BI heal point: the recorder re-pushes everything the previous session's
|
|
95
|
+
transport may have lost (push failures are journaled, then healed at the next
|
|
96
|
+
opportunity — a halted run may never reach finalize, so skipping the resume `start`
|
|
97
|
+
can strand the run's tail in the local journal). `status` shows `bi_backlog: true`
|
|
98
|
+
when unpushed rows are pending.
|
|
99
|
+
|
|
100
|
+
A safety net backs this up, and it does not replace your `start`: the start of a
|
|
101
|
+
`replatform run`/`resume` supervisor process, and the orchestration route script after
|
|
102
|
+
at least 15 minutes of journal silence, record the resumed session themselves on an
|
|
103
|
+
open recording (tagged with a `trigger`). A `start` within a minute of such an automatic
|
|
104
|
+
session, or at any point during the live supervisor run that opened it, joins that
|
|
105
|
+
session instead of opening another — it still records the dimensions you pass. The
|
|
106
|
+
15-minute gap is a heuristic about sittings, not a detected session. A failed or
|
|
107
|
+
skipped automatic resume falls under the "never mention" rule below: it goes only to
|
|
108
|
+
the progress log or the supervisor's run record.
|
|
109
|
+
|
|
83
110
|
`source_acquisition` is an open set of class tokens, but reuse an established one
|
|
84
111
|
(`admin_api`, `public_storefront`, `public_content`, `file_export`) rather than
|
|
85
112
|
minting a synonym — cross-run folding depends on stable tokens.
|
|
@@ -104,6 +131,29 @@ what to fix.
|
|
|
104
131
|
dims (a runtime with better provenance than the recorder can infer), but normally you
|
|
105
132
|
leave them to auto-resolve.
|
|
106
133
|
|
|
134
|
+
**Operator identity is auto-stamped too — you don't pass it, and you must not
|
|
135
|
+
invent it.** At `start` the recorder resolves `wix_user_id` (the operator's Wix
|
|
136
|
+
user GUID) from the Wix CLI's login artifact, `~/.wix/auth/account.json`. If the
|
|
137
|
+
CLI isn't logged in, resolution returns nothing and the run proceeds
|
|
138
|
+
**unattributed**: it completes normally, its local record is untouched and
|
|
139
|
+
authoritative, but **BI receives nothing** — the sink cannot route a row without a
|
|
140
|
+
real user, and a fabricated subject was verified to ingest nothing. The
|
|
141
|
+
loss is journaled as `no_operator_identity` and flagged in the rollup as
|
|
142
|
+
`operator_identity_unresolved`; `rebuild --push` backfills it if identity later
|
|
143
|
+
becomes available.
|
|
144
|
+
|
|
145
|
+
**Never mention any of this to the person running the migration.** Telemetry
|
|
146
|
+
health is our signal, not theirs: it says nothing about whether their migration
|
|
147
|
+
worked, and an unattributed run is complete and correct. It is read from BI and
|
|
148
|
+
the local rollup, not narrated in a completion report. The same goes for push
|
|
149
|
+
failures and `bi_push` counts — they belong in the telemetry record only.
|
|
150
|
+
|
|
151
|
+
You may pass `wix_user_id` explicitly in the `start` dims and it wins over
|
|
152
|
+
resolution, but only when the runtime genuinely knows better (a hosted runner
|
|
153
|
+
that authenticated the operator itself). Never pass a GUID you guessed, copied
|
|
154
|
+
from another run, or read off a site — a wrong identity misattributes the run to
|
|
155
|
+
a real person and is worse than no identity at all.
|
|
156
|
+
|
|
107
157
|
2. **Stage boundaries** as the pipeline moves. Map orchestrator steps to stages like this:
|
|
108
158
|
|
|
109
159
|
| Stage | Covers |
|
|
@@ -131,9 +181,14 @@ what to fix.
|
|
|
131
181
|
`extract` stage exists to prevent.
|
|
132
182
|
|
|
133
183
|
When the `discovery` stage ends, **always** stamp what it learned:
|
|
134
|
-
`dims '{"source_platform_version":"...","source_extensions":["..."]
|
|
135
|
-
|
|
136
|
-
|
|
184
|
+
`dims '{"source_platform_version":"...","source_extensions":["..."],
|
|
185
|
+
"discovered_entity_types":["post","product","event"]}'` — pass `[]` explicitly when
|
|
186
|
+
discovery found no extensions (or, improbably, no entity types); a null left behind is
|
|
187
|
+
flagged in `telemetry_health` as `source_extensions_null_after_discovery` /
|
|
188
|
+
`discovered_entity_types_null_after_discovery`. `discovered_entity_types` lists every
|
|
189
|
+
source entity class discovery found in use — including classes with no Wix target; it
|
|
190
|
+
is what finalize cross-checks the `volumes` rows against, so the "what we couldn't
|
|
191
|
+
import" demand signal cannot be silently under-reported.
|
|
137
192
|
|
|
138
193
|
3. **`wait start` / `wait end`** around every needs-user halt: credential requests, the
|
|
139
194
|
mapping-review checkpoint, the approval gate, any halt-to-needs-user. Pass the halt
|
|
@@ -151,7 +206,12 @@ what to fix.
|
|
|
151
206
|
4. **`record`** events as they happen (next section). Record in the moment, not
|
|
152
207
|
retrospectively — improvisation and halts are only reliably knowable when they occur.
|
|
153
208
|
|
|
154
|
-
5. **`
|
|
209
|
+
5. **`digest --transcript <path to this session's CC transcript>`** just before `finalize`.
|
|
210
|
+
It parses the Claude Code session transcript, deterministically — no model, no
|
|
211
|
+
judgment, nothing for you to say. If it fails, carry on to `finalize` anyway;
|
|
212
|
+
telemetry never blocks a migration.
|
|
213
|
+
|
|
214
|
+
6. **`finalize`** once, at a terminal state, with the rollup:
|
|
155
215
|
|
|
156
216
|
```bash
|
|
157
217
|
node scripts/rp-telemetry.js finalize '{"terminal_state":"completed",
|
|
@@ -171,7 +231,9 @@ what to fix.
|
|
|
171
231
|
skipped: N`, `target: none` where no target exists, `planned` 0 or null). "What we
|
|
172
232
|
cannot or chose not to import" must be signal-layer arithmetic, never an evidence
|
|
173
233
|
dig — rows only for imported types silently erase the excluded half of the approved
|
|
174
|
-
plan.
|
|
234
|
+
plan. This is enforced mechanically: on a completed run, any class stamped in
|
|
235
|
+
`discovered_entity_types` with no volume row is flagged
|
|
236
|
+
`volume_row_missing:<type>` in `telemetry_health`.
|
|
175
237
|
- `verification` makes the finish step's spot-checks countable. `checked: 0` is an
|
|
176
238
|
honest "written but unverified" — report it rather than papering over it.
|
|
177
239
|
- Do **not** finalize a halt you expect the user to resume — leave the run unfinalized
|
|
@@ -179,6 +241,17 @@ what to fix.
|
|
|
179
241
|
being closed out in a stalled state. A user who declines the plan is
|
|
180
242
|
`abandoned_by_user` (plus a `user_decision` event with `subtype: declined`), never
|
|
181
243
|
`halted_needs_user` or `failed`.
|
|
244
|
+
- **Check the returned `bi_push`.** If it reports `failed > 0` or `skipped > 0`, the
|
|
245
|
+
run (or part of it) did not reach the central BI record: retry once with
|
|
246
|
+
`rebuild --push`, and if it still fails, tell the operator in the completion report
|
|
247
|
+
that the run exists only locally — never let a run silently vanish from the shared
|
|
248
|
+
record. `skipped > 0` means `RP_TELEMETRY_BI_DISABLED` was set during the session;
|
|
249
|
+
on a real migration run that env var must never be set. **A clean `bi_push` result
|
|
250
|
+
(`failed: 0`, `skipped: 0`) means the rows were handed to frog, not that they have
|
|
251
|
+
arrived in BI** — per `bi-sink.js`'s own transport code, a 2xx is not an ingestion
|
|
252
|
+
receipt; only a Trino read-back proves arrival, and no such read-back is available
|
|
253
|
+
from inside a run. Report `bi_push` success as "handed off," never as "confirmed in
|
|
254
|
+
BI."
|
|
182
255
|
|
|
183
256
|
### Metering — splitting `active_ms` into where the time actually went
|
|
184
257
|
|
|
@@ -201,8 +274,8 @@ node scripts/meter-from-audit.js --project <migration dir> --stage import # --
|
|
|
201
274
|
|
|
202
275
|
It reads `logs/import-audit.ndjson` and emits measured `api_ms` / `api_calls` / `api_retries`.
|
|
203
276
|
It exists because a bulk write logs **one audit row per item, each carrying the batch's total
|
|
204
|
-
latency** — summing rows multiplies one call's latency by its item count, which
|
|
205
|
-
|
|
277
|
+
latency** — summing rows multiplies one call's latency by its item count, which can
|
|
278
|
+
report several times more API time than the stage existed for. The helper
|
|
206
279
|
collapses rows per distinct `(runId, endpoint, batch, latencyMs)`, so a batch counts once while
|
|
207
280
|
genuinely separate calls each count.
|
|
208
281
|
|
|
@@ -234,6 +307,34 @@ The rollup's `timing.agentic_ms` vs `timing.deterministic_ms` (and `agentic_shar
|
|
|
234
307
|
that shows whether moving work into deterministic code is paying off. `agentic_share` is `null` when
|
|
235
308
|
nothing was metered rather than `0`, which would falsely read as a fully deterministic run.
|
|
236
309
|
|
|
310
|
+
### Source key/value reads — the one capability that widened what we can read
|
|
311
|
+
|
|
312
|
+
The WordPress bridge can read key/value ("EAV") tables like `postmeta`, key-scoped.
|
|
313
|
+
That is the largest widening of source-read reach this pipeline has taken, so it is counted.
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
node scripts/rp-telemetry.js source-read --discovery-queries 1 --discovery-table postmeta --redacted-values 0 --project <dir>
|
|
317
|
+
node scripts/rp-telemetry.js source-read --scoped-queries 6 --scoped-table postmeta --redacted-values 2 --project <dir>
|
|
318
|
+
node scripts/rp-telemetry.js source-read --tier-refusals 1 --project <dir>
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
Counts accumulate across calls, so report per batch rather than holding a running total.
|
|
322
|
+
`wix-wp-plugin-v2-client.js` derives the per-read counts for you and hands them to its
|
|
323
|
+
`onSourceRead` hook — use that rather than counting at a call site, because the call site that
|
|
324
|
+
forgets is what makes a run's total quietly wrong.
|
|
325
|
+
|
|
326
|
+
**`redacted_values` is the field worth watching across runs.** The other three describe how one
|
|
327
|
+
migration read one site. A non-zero redaction total means a source site keeps a credential in a
|
|
328
|
+
column nobody expected, which is a fleet-level signal no single run can see. `tier_refusals` has
|
|
329
|
+
to be reported by the caller rather than inferred, because the plugin answers a tier violation
|
|
330
|
+
with the same 400 as a nonexistent column — deliberately, so a refusal never discloses which
|
|
331
|
+
column holds the values.
|
|
332
|
+
|
|
333
|
+
**Key names are never telemetry.** The run's own artifacts hold those. `discovery_tables` and
|
|
334
|
+
`scoped_tables` carry bare WordPress table names (`postmeta`), which are structural, not customer
|
|
335
|
+
data; the validator rejects anything that is not `^[A-Za-z0-9_]+$`, and rejects a `pinned_keys`
|
|
336
|
+
field outright as unknown. Nothing here should ever be able to carry a value.
|
|
337
|
+
|
|
237
338
|
### Collecting `operator_acceptance`
|
|
238
339
|
|
|
239
340
|
At the finish handoff, ask the operator one plain question: does the migrated result look
|
|
@@ -319,6 +420,41 @@ active `rp-*` resource, e.g. `"rp-mapper"`), `severity` (`blocking` | `degraded`
|
|
|
319
420
|
or misleading as evidence) | `other`. Name the artifacts and their states in
|
|
320
421
|
`what_happened` — names and states, never contents.
|
|
321
422
|
|
|
423
|
+
9. **`source_plugin_coverage`** — which of the source site's plugins we could **not** resolve,
|
|
424
|
+
plus one run-level summary. Record after discovery writes
|
|
425
|
+
`discovery/plugin-coverage.json`.
|
|
426
|
+
|
|
427
|
+
**Record one event per unresolved item only.** The unresolved set is: every `pending` row
|
|
428
|
+
(including `reason: cannot-tell` and unread candidate namespaces), every
|
|
429
|
+
`requires-development` row, and every row carrying `blocked[]` entries (a
|
|
430
|
+
`user-file` / `credential` / `surface-changed` blocker, declined or not). **These are the
|
|
431
|
+
whole point of this event type** — they are the only signal that says which plugin profile
|
|
432
|
+
to write next, and without them that ordering is guesswork.
|
|
433
|
+
|
|
434
|
+
**Do not emit a per-row event for anything already resolved**: `migration-planned` rows
|
|
435
|
+
with `confidence: confirmed`, or `no-need-to-migrate` rows with `basis: list` or
|
|
436
|
+
`basis: decision` (a human already signed that verdict). On a
|
|
437
|
+
55-plugin store that would be ~29 events restating a checked-in list — telemetry with no
|
|
438
|
+
information content, which makes the real backlog harder to see, not easier. (A
|
|
439
|
+
`migration-planned` or `no-need-to-migrate` row that automation *derived* —
|
|
440
|
+
`confidence: proposed` / `basis: proposed` — is reported through `skill_coverage_gap`
|
|
441
|
+
(`guessed_value`), not here.)
|
|
442
|
+
|
|
443
|
+
**Emit exactly one aggregate event per run** carrying the distribution: plugins installed,
|
|
444
|
+
counts by the four statuses (and by `via` / `confidence` for planned rows), blocked counts
|
|
445
|
+
by kind, and whether the plugin list was available. That preserves the cross-run view of
|
|
446
|
+
how coverage is trending without one event per plugin.
|
|
447
|
+
|
|
448
|
+
Per-event fields: `subtype` is the row's status (`pending` | `requires_development`) or
|
|
449
|
+
`blocked` for a blocker entry (then also carry the blocker `kind`); carry the plugin slug
|
|
450
|
+
and version, the capability, the read channel, whether the row was `recognized`, and
|
|
451
|
+
`source_api_surface` as the endpoint class. Slug and version are required — without them
|
|
452
|
+
a cross-run view cannot tell which plugin caused what. Plugin slugs and versions are
|
|
453
|
+
software identifiers, not client data; still never record site URLs or record contents.
|
|
454
|
+
|
|
455
|
+
A `requires-development` row additionally pairs with `api_gap`, and a lossy `via: cms` row
|
|
456
|
+
with `fidelity_loss` — this event reports *distribution and backlog*, never the gap itself.
|
|
457
|
+
|
|
322
458
|
### `evidence_refs` — rare, not routine
|
|
323
459
|
|
|
324
460
|
Author every event to be **self-sufficient**: coded fields + bounded free text +
|
|
@@ -333,7 +469,11 @@ when files regenerate). Never reference secret-bearing config files.
|
|
|
333
469
|
- Never hand-write, edit, or re-read `run-telemetry.json` or `telemetry/` files — the
|
|
334
470
|
recorder appends; you only call it.
|
|
335
471
|
- Never record client data values, names, URLs beyond the recorded source origin, or
|
|
336
|
-
secrets — in any field, including shapes and locators.
|
|
472
|
+
secrets — in any field, including shapes and locators. For a credential-bearing source
|
|
473
|
+
surface such as a payment gateway's configuration, telemetry may carry the **field name** and
|
|
474
|
+
its state (`present` / `blank` / `absent`) and nothing else: never the value, never a prefix
|
|
475
|
+
of it, never its length, never a hash. A length narrows a brute force and a hash confirms a
|
|
476
|
+
guess, so neither is a safe substitute for the value.
|
|
337
477
|
- Never record a fix, root cause, or recommendation — observations only.
|
|
338
478
|
- Never estimate durations — timing comes from `stage`/`wait` boundary calls.
|
|
339
479
|
- Never skip a rejected call: fix the listed fields and retry. Rejections are counted
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
// Wix BI sink for the telemetry recorder — the one transport path
|
|
3
|
+
// Wix BI sink for the telemetry recorder — the one transport path.
|
|
4
4
|
//
|
|
5
|
-
// Wire format (proven end-to-end 2026-07-26
|
|
5
|
+
// Wire format (proven end-to-end 2026-07-26):
|
|
6
6
|
// POST https://frog.wix.com/migration-data-validator with a JSON batch envelope
|
|
7
7
|
// {"dt":0,"g":{"src":10,"evid":<evid>},"e":[{"dt":0,"f":{...fields}}]}
|
|
8
8
|
// capped at 100 events / ~240KB per request. No transport auth — identity is the
|
|
@@ -15,6 +15,10 @@
|
|
|
15
15
|
// 2. Every GUID-typed field must be a real GUID; a non-hex value fails
|
|
16
16
|
// validation before routing and drops the whole event.
|
|
17
17
|
// 3. Every row carries `logged_user_id` = the operator's wix_user_id (GUID).
|
|
18
|
+
// A run with no identity is NOT pushed: BI discards rows whose subject is not
|
|
19
|
+
// a real user, so a fabricated one (verified 2026-09-02 with the nil UUID)
|
|
20
|
+
// returns 2xx and ingests nothing. Better to journal the loss than to fake a
|
|
21
|
+
// success.
|
|
18
22
|
//
|
|
19
23
|
// frog's HTTP status is not an ingestion receipt — only a Trino read-back proves
|
|
20
24
|
// arrival. The recorder treats any non-2xx or network error as a push failure
|
|
@@ -84,9 +88,12 @@ function startedRunRow(runStart, wixUserId) {
|
|
|
84
88
|
}
|
|
85
89
|
|
|
86
90
|
// `replatform_run` phase:finalized — the complete rollup. Local names map to the
|
|
87
|
-
// as-registered BI names here and nowhere else (
|
|
88
|
-
// schema_version→schemaVersions, verification→verificationType. skills_commit
|
|
89
|
-
// local-only (not
|
|
91
|
+
// as-registered BI names here and nowhere else (see the Registration notes):
|
|
92
|
+
// schema_version→schemaVersions, verification→verificationType. skills_commit and
|
|
93
|
+
// discovered_entity_types are local-only (not registered BI columns) and
|
|
94
|
+
// deliberately not sent — the entity-class demand signal reaches BI through the
|
|
95
|
+
// `volumes` column; the dim exists for the finalize cross-check, whose flags
|
|
96
|
+
// travel in telemetryHealth.
|
|
90
97
|
function finalizedRunRow(rollup) {
|
|
91
98
|
const f = { phase: 'finalized' };
|
|
92
99
|
put(f, 'runId', rollup.run_id, { guid: true });
|
|
@@ -118,6 +125,31 @@ function finalizedRunRow(rollup) {
|
|
|
118
125
|
put(f, 'runStarted', rollup.run_started);
|
|
119
126
|
put(f, 'runEnded', rollup.run_ended);
|
|
120
127
|
put(f, 'bundleManifest', rollup.bundle_manifest, { json: true });
|
|
128
|
+
// The transcript_digest is a run-grain fact, so it rides the
|
|
129
|
+
// existing finalized row rather than opening a new BI call — one JSON field,
|
|
130
|
+
// matching how `stages`/`volumes` already travel, rather than one registered
|
|
131
|
+
// column per sub-field. A run with no digest (offline recompute skipped, or
|
|
132
|
+
// a run that predates 1.5.0) simply omits the field, same as any unknown.
|
|
133
|
+
//
|
|
134
|
+
// Known limitation (verified live): as of 2026-08-17, `bi_events_raw`
|
|
135
|
+
// shows evid 5012 rows with an EMPTY dimensions/measures map for every one of them —
|
|
136
|
+
// this field will land alongside `terminalState`/`volumes`/every other field already
|
|
137
|
+
// on this row and be equally unqueryable until whoever owns the BI schema resolves
|
|
138
|
+
// why 5012/5013 aren't materializing their payload. Nothing to fix here: this `put()`
|
|
139
|
+
// call matches the pattern every other field on the row already uses correctly.
|
|
140
|
+
put(f, 'transcriptDigest', rollup.transcript_digest, { json: true });
|
|
141
|
+
// The run's key/value source-read counts. Rides the finalized row as one
|
|
142
|
+
// JSON field, exactly like transcript_digest above and for the same reason -- it is a
|
|
143
|
+
// run-grain fact, not a new grain.
|
|
144
|
+
//
|
|
145
|
+
// This has to leave the machine to be worth anything. `redacted_values` is explicitly a
|
|
146
|
+
// CROSS-RUN signal: one run's non-zero count says little, while a rate across runs says
|
|
147
|
+
// some sites keep credentials where nobody expects them, and that is a fleet-level fact no
|
|
148
|
+
// single run can see. Computing it into a local file and stopping there would satisfy the
|
|
149
|
+
// letter of "record it" and none of the point.
|
|
150
|
+
//
|
|
151
|
+
// Same known 5012/5013 materialization limitation the comment above documents applies.
|
|
152
|
+
put(f, 'sourceReads', rollup.source_reads, { json: true });
|
|
121
153
|
return { evid: EVID_RUN, fields: f };
|
|
122
154
|
}
|
|
123
155
|
|
|
@@ -173,28 +205,54 @@ function shedOversize(event) {
|
|
|
173
205
|
return shed ? { ...event, f } : null;
|
|
174
206
|
}
|
|
175
207
|
|
|
176
|
-
|
|
208
|
+
// `signal` (optional) is the caller's cancellation. The request is aborted when either the
|
|
209
|
+
// per-request PUSH_TIMEOUT_MS expires or the caller aborts; the combined signal is built with a
|
|
210
|
+
// local controller (listener + cleared timer) so nothing outlives the call and no Node API newer
|
|
211
|
+
// than the supported runtime is needed. A caller abort maps to `aborted`; the timeout stays
|
|
212
|
+
// `timeout`.
|
|
213
|
+
async function sendBatch(evid, events, signal) {
|
|
177
214
|
const body = envelopeBody(evid, events);
|
|
215
|
+
if (signal && signal.aborted) return 'aborted';
|
|
216
|
+
const controller = new AbortController();
|
|
217
|
+
let timedOut = false;
|
|
218
|
+
const timer = setTimeout(() => { timedOut = true; controller.abort(); }, PUSH_TIMEOUT_MS);
|
|
219
|
+
const onAbort = () => controller.abort();
|
|
220
|
+
if (signal) signal.addEventListener('abort', onAbort, { once: true });
|
|
178
221
|
try {
|
|
179
222
|
const res = await fetch(endpoint(), {
|
|
180
223
|
method: 'POST',
|
|
181
224
|
headers: { 'content-type': 'application/json' },
|
|
182
225
|
body,
|
|
183
|
-
signal:
|
|
226
|
+
signal: controller.signal,
|
|
184
227
|
});
|
|
185
228
|
if (!res.ok) return `http_${res.status}`;
|
|
186
229
|
return null;
|
|
187
|
-
} catch
|
|
188
|
-
|
|
230
|
+
} catch {
|
|
231
|
+
if (signal && signal.aborted) return 'aborted';
|
|
232
|
+
return timedOut ? 'timeout' : 'network_error';
|
|
233
|
+
} finally {
|
|
234
|
+
clearTimeout(timer);
|
|
235
|
+
if (signal) signal.removeEventListener('abort', onAbort);
|
|
189
236
|
}
|
|
190
237
|
}
|
|
191
238
|
|
|
192
239
|
// Push rows (from the builders above) as the given operator. Never throws:
|
|
193
|
-
// returns { sent, failures: [{evid, rows, detail}], truncated } and
|
|
194
|
-
// journals the failures — telemetry must never block a migration.
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
240
|
+
// returns { sent, failures: [{evid, rows, detail}], truncated, skipped } and
|
|
241
|
+
// the caller journals the failures — telemetry must never block a migration.
|
|
242
|
+
// A disabled sink reports the rows it swallowed in `skipped` instead of
|
|
243
|
+
// masquerading as a successful push — the caller journals those too, so a
|
|
244
|
+
// kill-switch leaking into a production session is visible, never silent.
|
|
245
|
+
//
|
|
246
|
+
// `signal` (optional): once it aborts, nothing more is sent and every row not yet sent is
|
|
247
|
+
// reported as ONE failure `{ detail: 'aborted' }` — the caller journals a single marker and the
|
|
248
|
+
// rows stay backlog for the next heal. Without a signal, behavior is unchanged.
|
|
249
|
+
async function pushRows(rows, loggedUserId, { signal } = {}) {
|
|
250
|
+
const out = { sent: 0, failures: [], truncated: 0, skipped: 0 };
|
|
251
|
+
if (rows.length === 0) return out;
|
|
252
|
+
if (disabled()) {
|
|
253
|
+
out.skipped = rows.length;
|
|
254
|
+
return out;
|
|
255
|
+
}
|
|
198
256
|
if (!isGuid(loggedUserId)) {
|
|
199
257
|
out.failures.push({ evid: null, rows: rows.length, detail: 'no_operator_identity' });
|
|
200
258
|
return out;
|
|
@@ -204,9 +262,15 @@ async function pushRows(rows, loggedUserId) {
|
|
|
204
262
|
if (!byEvid.has(row.evid)) byEvid.set(row.evid, []);
|
|
205
263
|
byEvid.get(row.evid).push({ dt: 0, f: { ...row.fields, logged_user_id: loggedUserId } });
|
|
206
264
|
}
|
|
265
|
+
let accounted = 0;
|
|
266
|
+
const abortRest = () => {
|
|
267
|
+
out.failures.push({ evid: null, rows: rows.length - accounted, detail: 'aborted' });
|
|
268
|
+
return out;
|
|
269
|
+
};
|
|
207
270
|
for (const [evid, events] of byEvid) {
|
|
208
271
|
const queue = [events];
|
|
209
272
|
while (queue.length > 0) {
|
|
273
|
+
if (signal && signal.aborted) return abortRest();
|
|
210
274
|
let chunk = queue.shift();
|
|
211
275
|
if (chunk.length > MAX_EVENTS_PER_REQUEST) {
|
|
212
276
|
const mid = Math.ceil(chunk.length / 2);
|
|
@@ -222,14 +286,17 @@ async function pushRows(rows, loggedUserId) {
|
|
|
222
286
|
const slimmed = shedOversize(chunk[0]);
|
|
223
287
|
if (!slimmed || Buffer.byteLength(envelopeBody(evid, [slimmed])) > MAX_BODY_BYTES) {
|
|
224
288
|
out.failures.push({ evid, rows: 1, detail: 'oversized_event' });
|
|
289
|
+
accounted += 1;
|
|
225
290
|
continue;
|
|
226
291
|
}
|
|
227
292
|
out.truncated += 1;
|
|
228
293
|
chunk = [slimmed];
|
|
229
294
|
}
|
|
230
|
-
const failureDetail = await sendBatch(evid, chunk);
|
|
295
|
+
const failureDetail = await sendBatch(evid, chunk, signal);
|
|
296
|
+
if (failureDetail === 'aborted') return abortRest();
|
|
231
297
|
if (failureDetail) out.failures.push({ evid, rows: chunk.length, detail: failureDetail });
|
|
232
298
|
else out.sent += chunk.length;
|
|
299
|
+
accounted += chunk.length;
|
|
233
300
|
}
|
|
234
301
|
}
|
|
235
302
|
return out;
|
|
@@ -241,6 +308,7 @@ module.exports = {
|
|
|
241
308
|
EVID_RUN_EVENT,
|
|
242
309
|
MAX_EVENTS_PER_REQUEST,
|
|
243
310
|
MAX_BODY_BYTES,
|
|
311
|
+
PUSH_TIMEOUT_MS,
|
|
244
312
|
isGuid,
|
|
245
313
|
disabled,
|
|
246
314
|
startedRunRow,
|