@wix/agent-skills 1.33.1 → 1.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/package.json +1 -1
- package/skills/wix-export/SKILL.md +83 -0
- package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
- package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
- package/skills/wix-harmony-editor/SKILL.md +317 -0
- package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
- package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
- package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
- package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
- package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
- package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
- package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
- package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
- package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
- package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
- package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
- package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
- package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
- package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
- package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
- package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
- package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
- package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
- package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
- package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
- package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
- package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
- package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
- package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
- package/skills/wix-headless/SKILL.md +7 -2
- package/skills/wix-headless/references/CAPABILITIES.md +6 -1
- package/skills/wix-headless/references/DISCOVERY.md +2 -1
- package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
- package/skills/wix-headless/references/SEED.md +3 -2
- package/skills/wix-headless/references/SETUP.md +1 -0
- package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
- package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
- package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
- package/skills/wix-headless/references/managed/CREATE.md +1 -1
- package/skills/wix-headless-kit/SKILL.md +110 -21
- package/skills/wix-headless-kit/guides/api-run.md +15 -13
- package/skills/wix-headless-kit/guides/existing-site.md +31 -0
- package/skills/wix-headless-kit/guides/migration.md +49 -17
- package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
- package/skills/wix-headless-kit/install/context.mjs +61 -6
- package/skills/wix-headless-kit/install/pins.json +1 -1
- package/skills/wix-headless-kit/install/setup.mjs +107 -12
- package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
- package/skills/wix-headless-replatform/SKILL.md +116 -0
- package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
- package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
- package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
- package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
- package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
- package/skills/wix-headless-replatform/references/output-contract.md +93 -0
- package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
- package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
- package/skills/wix-headless-replatform/references/safety.md +19 -0
- package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
- package/skills/wix-headless-replatform/references/workflow.md +157 -0
- package/skills/wix-headless-replatform/registry/README.md +20 -0
- package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
- package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
- package/skills/wix-headless-replatform/registry/registry.json +36 -0
- package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
- package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
- package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
- package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
- package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
- package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
- package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
- package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
- package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
- package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
- package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
- package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
- package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
- package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
- package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
- package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
- package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
- package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
- package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
- package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
- package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
- package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
- package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
- package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
- package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
- package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
- package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
- package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
- package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
- package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
- package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
- package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
- package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
- package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
- package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
- package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
- package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
- package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
- package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
- package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
- package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
- package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
- package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
- package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
- package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
- package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
- package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
- package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
- package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
- package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
- package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
- package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
- package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
- package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
- package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
- package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
- package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
- package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
- package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
- package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
- package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
- package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
- package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
- package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
- package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
- package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
- package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
- package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
- package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
- package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
- package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
- package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
- package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
- package/skills/wix-import/SKILL.md +90 -0
- package/skills/wix-manage/SKILL.md +13 -3
- package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
- package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
- package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
- package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
- package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
- package/skills/wix-manage/references/sites/upload-static-site.md +127 -8
- package/skills/wix-replatform/.publish-manifest.json +5 -5
- package/skills/wix-replatform/CLI.md +162 -0
- package/skills/wix-replatform/README.md +52 -0
- package/skills/wix-replatform/SKILL.md +229 -684
- package/skills/wix-replatform/console/account.css +1 -0
- package/skills/wix-replatform/console/app.css +1 -0
- package/skills/wix-replatform/console/app.js +117 -0
- package/skills/wix-replatform/console/index.html +4 -0
- package/skills/wix-replatform/console/json.css +11 -0
- package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
- package/skills/wix-replatform/lib/app-page-routing.js +75 -0
- package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
- package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
- package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
- package/skills/wix-replatform/lib/completion-report.js +1393 -13
- package/skills/wix-replatform/lib/config-env.js +85 -11
- package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
- package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
- package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
- package/skills/wix-replatform/lib/destination-choice.js +163 -0
- package/skills/wix-replatform/lib/destination-handoff.js +62 -0
- package/skills/wix-replatform/lib/destination-http.js +81 -0
- package/skills/wix-replatform/lib/destination-route.js +98 -0
- package/skills/wix-replatform/lib/destination.js +919 -0
- package/skills/wix-replatform/lib/discovered-census.js +231 -0
- package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
- package/skills/wix-replatform/lib/document-url-guard.js +203 -0
- package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
- package/skills/wix-replatform/lib/entity-verification.js +18 -0
- package/skills/wix-replatform/lib/execution-capability.js +120 -0
- package/skills/wix-replatform/lib/execution-log.js +170 -0
- package/skills/wix-replatform/lib/execution-manifest.js +20 -2
- package/skills/wix-replatform/lib/execution-state.js +22 -0
- package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
- package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
- package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
- package/skills/wix-replatform/lib/import-recovery.js +800 -6
- package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
- package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
- package/skills/wix-replatform/lib/link-audit.js +173 -0
- package/skills/wix-replatform/lib/link-census.js +194 -0
- package/skills/wix-replatform/lib/link-plan.js +148 -0
- package/skills/wix-replatform/lib/link-verification.js +274 -0
- package/skills/wix-replatform/lib/link-write-journal.js +42 -0
- package/skills/wix-replatform/lib/local-state.js +869 -30
- package/skills/wix-replatform/lib/member-completion.js +658 -0
- package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
- package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
- package/skills/wix-replatform/lib/migration-completion.js +311 -0
- package/skills/wix-replatform/lib/operator-identity.js +47 -0
- package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
- package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
- package/skills/wix-replatform/lib/orchestration-router.js +608 -32
- package/skills/wix-replatform/lib/orchestration-state.js +188 -12
- package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
- package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
- package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
- package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
- package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
- package/skills/wix-replatform/lib/progress-log.js +19 -3
- package/skills/wix-replatform/lib/read-back-approval.js +184 -0
- package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
- package/skills/wix-replatform/lib/read-back-contract.js +243 -0
- package/skills/wix-replatform/lib/read-back-extract.js +118 -0
- package/skills/wix-replatform/lib/read-back-gate.js +734 -0
- package/skills/wix-replatform/lib/read-back-reads.js +94 -0
- package/skills/wix-replatform/lib/read-back-state.js +107 -0
- package/skills/wix-replatform/lib/read-back-summary.js +81 -0
- package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
- package/skills/wix-replatform/lib/run-controller.js +401 -0
- package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
- package/skills/wix-replatform/lib/setup-verification.js +148 -0
- package/skills/wix-replatform/lib/source-access.js +231 -0
- package/skills/wix-replatform/lib/source-coverage.js +1130 -0
- package/skills/wix-replatform/lib/source-secrets.js +277 -0
- package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
- package/skills/wix-replatform/lib/task-state.js +110 -0
- package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
- package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
- package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
- package/skills/wix-replatform/lib/url-verification.js +315 -0
- package/skills/wix-replatform/lib/user-action-effects.js +42 -0
- package/skills/wix-replatform/lib/user-actions.js +264 -0
- package/skills/wix-replatform/lib/website-handoff.js +1220 -0
- package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
- package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
- package/skills/wix-replatform/lib/write-verification-state.js +92 -0
- package/skills/wix-replatform/lib/write-verification.js +274 -0
- package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
- package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
- package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
- package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
- package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
- package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
- package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
- package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
- package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
- package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
- package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
- package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
- package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
- package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
- package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
- package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
- package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
- package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
- package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
- package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
- package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
- package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
- package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
- package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
- package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
- package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
- package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
- package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
- package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
- package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
- package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
- package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
- package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
- package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
- package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
- package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
- package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
- package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
- package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
- package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
- package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
- package/skills/wix-replatform/scripts/discovered-census.js +26 -0
- package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
- package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
- package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
- package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
- package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
- package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
- package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
- package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
- package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
- package/skills/wix-replatform/scripts/migration-completion.js +76 -0
- package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
- package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
- package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
- package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
- package/skills/wix-replatform/scripts/replatform-console.js +146 -0
- package/skills/wix-replatform/scripts/replatform.js +436 -0
- package/skills/wix-replatform/scripts/source-secrets.js +77 -0
- package/skills/wix-replatform/scripts/url-redirects.js +286 -0
- package/skills/wix-replatform/scripts/user-action.js +58 -0
- package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
- package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
- package/skills/wix-replatform/scripts/wix-destination.js +143 -0
- package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
- package/skills/wix-vibe-headless/SKILL.md +7 -3
- package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
- package/skills/wix-vibe-headless/platforms/base44.md +1 -0
- package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
- package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
- package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
- package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
- package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
- package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
- package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
- package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
- package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Render the source page's decorative layer ("plate") with all text and chosen images
|
|
3
|
+
// hidden, then cut it into one PNG per Harmony band (header / sections / footer).
|
|
4
|
+
//
|
|
5
|
+
// node scripts/copy/render-plate.mjs <url> <outDir> --cuts header:0:65,main:65:1195,footer:1195:1254
|
|
6
|
+
// [--width 1920] [--keep <img-src-substring>,…] [--prefix plate] [--scale 2]
|
|
7
|
+
//
|
|
8
|
+
// --cuts name:yStart:yEnd in source page pixels (from measure-source.mjs). One PNG per cut:
|
|
9
|
+
// <outDir>/<prefix>-<name>.png, exactly (width x (yEnd-yStart)).
|
|
10
|
+
// --width render width. Use the canvas width + 640 (1920 for a 1280 canvas) when the
|
|
11
|
+
// source is a centred fixed-width layout, so full-bleed strips still cover a
|
|
12
|
+
// wide viewport. Prefer ONE full-page cut set as a 'fill' background of a single
|
|
13
|
+
// auto-height section (it then scales with the page); see COPY-SITE.md.
|
|
14
|
+
// --keep comma-separated substrings of <img src> that stay visible because they are
|
|
15
|
+
// decorative and get no component of their own (paper clips, ornaments, an
|
|
16
|
+
// image that would overlap a text box). Every other <img> is hidden, because it
|
|
17
|
+
// is rebuilt as a real Image component with its link and alt text.
|
|
18
|
+
// --scale device pixel ratio of the PNG (2 = sharp when the band scales up on wide screens;
|
|
19
|
+
// the file is then 2x the CSS size, which a 'fill' background handles).
|
|
20
|
+
// The page is scrolled once first, so scroll-revealed backgrounds paint.
|
|
21
|
+
// Text is made transparent (layout unchanged) and position:fixed elements (floating
|
|
22
|
+
// buttons, chat widgets, cookie bars), including those in shadow DOM, are removed.
|
|
23
|
+
import { chromium } from 'playwright';
|
|
24
|
+
import fs from 'fs';
|
|
25
|
+
|
|
26
|
+
const args = process.argv.slice(2);
|
|
27
|
+
const opt = (name, dflt) => { const i = args.indexOf(`--${name}`); return i >= 0 ? args[i + 1] : dflt; };
|
|
28
|
+
const [url, outDir] = args.filter((a, i) => !a.startsWith('--') && !(i > 0 && args[i - 1].startsWith('--')));
|
|
29
|
+
const cuts = (opt('cuts', '') || '').split(',').filter(Boolean).map((c) => { const [name, a, b] = c.split(':'); return { name, y0: Number(a), y1: Number(b) }; });
|
|
30
|
+
if (!url || !outDir || !cuts.length) { console.error('usage: render-plate.mjs <url> <outDir> --cuts name:y0:y1,... [--width 1920] [--keep a,b] [--prefix plate] [--scale 2]'); process.exit(2); }
|
|
31
|
+
const width = Number(opt('width', 1920));
|
|
32
|
+
const keep = (opt('keep', '') || '').split(',').filter(Boolean);
|
|
33
|
+
const prefix = opt('prefix', 'plate');
|
|
34
|
+
const scale = Number(opt('scale', 1));
|
|
35
|
+
const maxY = Math.max(...cuts.map((c) => c.y1));
|
|
36
|
+
|
|
37
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
38
|
+
const browser = await chromium.launch();
|
|
39
|
+
// A normal viewport height, then a scroll pass: a viewport as tall as the page changes vh-sized
|
|
40
|
+
// blocks, and backgrounds that are revealed on scroll (footers, bands) would never paint.
|
|
41
|
+
const page = await browser.newPage({ viewport: { width, height: 900 }, deviceScaleFactor: scale });
|
|
42
|
+
await page.goto(url, { waitUntil: 'networkidle', timeout: 90000 });
|
|
43
|
+
const fullH = await page.evaluate(() => document.documentElement.scrollHeight);
|
|
44
|
+
for (let y = 0; y <= fullH; y += 500) { await page.evaluate((y) => scrollTo(0, y), y); await page.waitForTimeout(120); }
|
|
45
|
+
await page.evaluate(() => scrollTo(0, 0));
|
|
46
|
+
await page.waitForTimeout(1500);
|
|
47
|
+
const keepCss = keep.map((k) => `img[src*="${k}"]`).join(', ');
|
|
48
|
+
await page.addStyleTag({ content: `
|
|
49
|
+
body * { color: transparent !important; -webkit-text-fill-color: transparent !important; text-shadow: none !important; caret-color: transparent !important; }
|
|
50
|
+
img { visibility: hidden !important; }
|
|
51
|
+
${keepCss ? `${keepCss} { visibility: visible !important; }` : ''}
|
|
52
|
+
` });
|
|
53
|
+
const removed = await page.evaluate(() => {
|
|
54
|
+
let n = 0;
|
|
55
|
+
const walk = (root) => { for (const e of root.querySelectorAll('*')) { if (getComputedStyle(e).position === 'fixed') { e.style.setProperty('display', 'none', 'important'); n++; } if (e.shadowRoot) walk(e.shadowRoot); } };
|
|
56
|
+
walk(document);
|
|
57
|
+
return n;
|
|
58
|
+
});
|
|
59
|
+
await page.waitForTimeout(600);
|
|
60
|
+
const written = [];
|
|
61
|
+
for (const c of cuts) {
|
|
62
|
+
const file = `${outDir}/${prefix}-${c.name}.png`;
|
|
63
|
+
await page.screenshot({ path: file, fullPage: true, clip: { x: 0, y: c.y0, width, height: c.y1 - c.y0 } });
|
|
64
|
+
written.push({ file, width: width * scale, height: (c.y1 - c.y0) * scale });
|
|
65
|
+
}
|
|
66
|
+
await browser.close();
|
|
67
|
+
console.log(JSON.stringify({ removedFixed: removed, kept: keep, written }));
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Serve a mirror made by mirror-site.mjs, offline.
|
|
3
|
+
//
|
|
4
|
+
// node scripts/copy/serve-mirror.mjs <outDir> [--port 8732] [--volatile name,name]
|
|
5
|
+
//
|
|
6
|
+
// Use a port of your own per site: 8732 may already be served by another agent's mirror, and
|
|
7
|
+
// a failed listen (EADDRINUSE) leaves that other server answering. GET /__mirror-site returns
|
|
8
|
+
// the host this server mirrors.
|
|
9
|
+
//
|
|
10
|
+
// Dynamic pages: a head shim maps hosts that page scripts build at runtime, a request that
|
|
11
|
+
// misses by exact URL falls back to path + stable query params (timestamps, visitor ids and the
|
|
12
|
+
// JSONP callback are ignored, the callback is renamed in the answer), and a rewritten local URL
|
|
13
|
+
// echoed back inside a query value is mapped back to the recorded one.
|
|
14
|
+
//
|
|
15
|
+
// The source site's own URLs map to the server root (https://site/?page_id=5 -> /?page_id=5);
|
|
16
|
+
// every other host maps to /_/<host>/... . URLs inside HTML, CSS, JS, JSON and SVG are
|
|
17
|
+
// rewritten to those local paths as they are served, so the browser never leaves the
|
|
18
|
+
// server. Third-party iframes saved as snapshots (index.embeds) are replaced by an <img> of the
|
|
19
|
+
// same size and style, marked data-embed-src (snapshots are the iframe's content box; iframes sit
|
|
20
|
+
// on the baseline, where themes often set img { vertical-align: bottom }). Requests the mirror does not hold get a 404 and are logged to <outDir>/misses.log.
|
|
21
|
+
import http from 'http';
|
|
22
|
+
import fs from 'fs';
|
|
23
|
+
|
|
24
|
+
const args = process.argv.slice(2);
|
|
25
|
+
const opt = (n, d) => { const i = args.indexOf(`--${n}`); return i >= 0 ? args[i + 1] : d; };
|
|
26
|
+
const outDir = args[0];
|
|
27
|
+
const port = Number(opt('port', 8732));
|
|
28
|
+
const index = JSON.parse(fs.readFileSync(`${outDir}/index.json`, 'utf8'));
|
|
29
|
+
const site = index.site;
|
|
30
|
+
const hosts = [...new Set(Object.keys(index.resources).map((u) => new URL(u).host))].sort((a, b) => b.length - a.length);
|
|
31
|
+
const esc = (s) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
32
|
+
// https://host, http://host, //host, and the JSON-escaped https:\/\/host forms
|
|
33
|
+
const hostRe = new RegExp(`(?:https?:)?(\\\\?/)\\1(${hosts.map(esc).join('|')})(?![\\w.-])`, 'g');
|
|
34
|
+
const embeds = index.embeds || {};
|
|
35
|
+
const unescape = (s) => s.replace(/&/g, '&').replace(/&/g, '&');
|
|
36
|
+
const swapEmbeds = (html) => html.replace(/<iframe\b([^>]*)\bsrc="([^"]+)"([^>]*)>\s*<\/iframe>/gi, (all, a, src, b) => {
|
|
37
|
+
const e = embeds[unescape(src)];
|
|
38
|
+
if (!e) return all;
|
|
39
|
+
let attrs = `${a} ${b}`.replace(/\b(frameborder|scrolling|marginheight|marginwidth|allowfullscreen|allow|loading)(="[^"]*")?/gi, '');
|
|
40
|
+
const style = (attrs.match(/\bstyle="([^"]*)"/i) || [, ''])[1];
|
|
41
|
+
attrs = attrs.replace(/\bstyle="[^"]*"/i, '');
|
|
42
|
+
return `<img${attrs} src="/__embed/${e.body}" data-embed-src="${src}" alt="embedded content (snapshot)" style="${style};vertical-align:baseline">`;
|
|
43
|
+
});
|
|
44
|
+
const textual = (t) => /text\/|javascript|json|xml|svg/.test(t);
|
|
45
|
+
|
|
46
|
+
// Volatile query params (timestamps, visitor ids, JSONP callback names) never repeat between
|
|
47
|
+
// loads, so an exact URL match cannot hit on replay. Fall back to path + stable params.
|
|
48
|
+
// Only names that are per-load by convention; generic ones (t, url, title, vid) can be real keys,
|
|
49
|
+
// so a site that varies by one of them adds it with --volatile name,name.
|
|
50
|
+
const VOLATILE = new RegExp('^(_|json|currentLocation|currentUrl|referrer|cb|cookieId|userId|emailId|callback|dwac|visitorId|rnd' + opt('volatile', '').split(',').filter(Boolean).map((n) => '|' + n.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')).join('') + ')$', 'i');
|
|
51
|
+
const normKey = (u) => { try { const x = new URL(u); const q = [...x.searchParams].filter(([k]) => !VOLATILE.test(k)).map(([k, v]) => k + '=' + v).sort().join('&'); return x.origin + x.pathname + '?' + q; } catch { return u; } };
|
|
52
|
+
const fuzzy = new Map();
|
|
53
|
+
for (const [u, r] of Object.entries(index.resources)) if (r.body && u.includes('?') && !fuzzy.has(normKey(u))) fuzzy.set(normKey(u), [u, r]);
|
|
54
|
+
function lookup(original) {
|
|
55
|
+
for (let hop = 0; hop < 5; hop++) {
|
|
56
|
+
const r = index.resources[original] || index.resources[original.replace(/^https:/, 'http:')] || index.resources[original.replace(/^http:/, 'https:')];
|
|
57
|
+
if (!r) { const f = fuzzy.get(normKey(original)); return f ? { ...f[1], recordedUrl: f[0] } : null; }
|
|
58
|
+
if (r.location !== undefined && r.status >= 300) { original = new URL(r.location, original).href; continue; }
|
|
59
|
+
return r;
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Page scripts assemble URLs at runtime (script.src = host + path), which the static rewrite
|
|
65
|
+
// below never sees. This shim, injected first in <head>, maps any mirrored host to /_/<host>/.
|
|
66
|
+
const injectShim = (html, origin) => {
|
|
67
|
+
const shim = '<script>(function(){var O=location.origin,S=' + JSON.stringify(site) + ',H=' + JSON.stringify(hosts) + ';function m(u){try{var x=new URL(u,location.href);if(x.origin===O)return u;if(x.host===S)return O+x.pathname+x.search+x.hash;if(H.indexOf(x.host)>-1)return O+"/_/"+x.host+x.pathname+x.search+x.hash}catch(e){}return u}' +
|
|
68
|
+
'var d=Object.getOwnPropertyDescriptor(HTMLScriptElement.prototype,"src");Object.defineProperty(HTMLScriptElement.prototype,"src",{get:d.get,set:function(v){d.set.call(this,m(v))},configurable:true});' +
|
|
69
|
+
'var sa=Element.prototype.setAttribute;Element.prototype.setAttribute=function(n,v){if(n==="src"&&/^(SCRIPT|IMG|IFRAME|LINK)$/.test(this.tagName))v=m(v);return sa.call(this,n,v)};' +
|
|
70
|
+
'var f=window.fetch;window.fetch=function(u,o){return f.call(this,typeof u==="string"?m(u):u,o)};var xo=XMLHttpRequest.prototype.open;XMLHttpRequest.prototype.open=function(a,u){arguments[1]=m(u);return xo.apply(this,arguments)}})()</script>';
|
|
71
|
+
return /<head[^>]*>/i.test(html) ? html.replace(/<head[^>]*>/i, (h) => h + shim) : shim + html;
|
|
72
|
+
};
|
|
73
|
+
http.createServer((req, res) => {
|
|
74
|
+
// identity probe: check-mirror asks which site a port serves, so a stale server for another site is caught
|
|
75
|
+
if (req.url === '/__mirror-site') { res.writeHead(200, { 'content-type': 'text/plain' }); return res.end(site); }
|
|
76
|
+
const em = req.url.match(/^\/__embed\/([0-9a-f]{40})$/);
|
|
77
|
+
if (em) { res.writeHead(200, { 'content-type': 'image/png' }); return res.end(fs.readFileSync(`${outDir}/bodies/${em[1]}`)); }
|
|
78
|
+
const m = req.url.match(/^\/_\/([^/]+)(\/.*)?$/);
|
|
79
|
+
const original = m ? `https://${m[1]}${m[2] || '/'}` : `https://${site}${req.url}`;
|
|
80
|
+
// a page that echoes a rewritten URL back (inside a query value) must still match what was recorded
|
|
81
|
+
const unlocal = (u) => { const o = `http://${req.headers.host}`; const e = encodeURIComponent(o); const swap = (from, to) => u = u.split(from).join(to);
|
|
82
|
+
for (const h of hosts) { swap(`${o}/_/${h}`, `https://${h}`); swap(`${e}%2F_%2F${encodeURIComponent(h)}`, encodeURIComponent(`https://${h}`)); }
|
|
83
|
+
swap(o, `https://${site}`); swap(e, encodeURIComponent(`https://${site}`)); return u; };
|
|
84
|
+
const r = lookup(original) || lookup(unlocal(original));
|
|
85
|
+
if (!r || !r.body) { fs.appendFileSync(`${outDir}/misses.log`, `${original}\n`); res.writeHead(404); return res.end(); }
|
|
86
|
+
let body = fs.readFileSync(`${outDir}/bodies/${r.body}`);
|
|
87
|
+
if (textual(r.type)) {
|
|
88
|
+
const origin = `http://${req.headers.host}`;
|
|
89
|
+
body = body.toString('utf8');
|
|
90
|
+
if (r.recordedUrl) { // JSONP: answer with the callback name this load asked for
|
|
91
|
+
const was = new URL(r.recordedUrl).searchParams.get('callback'), want = new URL(original).searchParams.get('callback');
|
|
92
|
+
if (was && want && was !== want) body = body.split(was).join(want);
|
|
93
|
+
}
|
|
94
|
+
if (/html/.test(r.type)) body = injectShim(swapEmbeds(body), origin); // swapEmbeds runs before the URL rewrite, so the src still matches; the shim is added last of the HTML edits
|
|
95
|
+
body = body.replace(hostRe, (all, slash, host) => {
|
|
96
|
+
const base = host === site ? origin : `${origin}/_/${host}`;
|
|
97
|
+
return slash === '\\/' ? base.replace(/\//g, '\\/') : base;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
res.writeHead(r.status || 200, { 'content-type': r.type || 'application/octet-stream', 'access-control-allow-origin': '*', 'cache-control': 'no-store' });
|
|
101
|
+
res.end(body);
|
|
102
|
+
}).listen(port, '127.0.0.1', () => console.log(`mirror of ${site} at http://127.0.0.1:${port}/ (${Object.keys(index.resources).length} resources)`));
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Snapshot what the live editor accepts, for check-description.mjs (compliance guard 1): the addable component types and, for each type a copy uses, every writable
|
|
3
|
+
// style key per element, the whole API surface (`api`: namespace -> methods, for lint-api.mjs), the content fields (with enum options) and the accepted link types.
|
|
4
|
+
//
|
|
5
|
+
// node scripts/copy/snapshot-capabilities.mjs <scratchSectionId> <out.json> [--types a,b,c]
|
|
6
|
+
//
|
|
7
|
+
// It adds one temporary component of each type to <scratchSectionId> (a section on an
|
|
8
|
+
// unpublished draft page), reads the schemas, and removes them again. If the snapshot differs
|
|
9
|
+
// from a previous one (types, addable components or API methods), the editor changed: re-check descriptions before deploying.
|
|
10
|
+
import { chromium } from 'playwright';
|
|
11
|
+
import { hideScrollbars } from './hide-scrollbars.mjs';
|
|
12
|
+
import fs from 'fs';
|
|
13
|
+
|
|
14
|
+
const args = process.argv.slice(2);
|
|
15
|
+
const opt = (n, d) => { const i = args.indexOf(`--${n}`); return i >= 0 ? args[i + 1] : d; };
|
|
16
|
+
const [sectionId, out] = args.filter((a, i) => !a.startsWith('--') && !(i > 0 && args[i - 1].startsWith('--')));
|
|
17
|
+
if (!sectionId || !out) { console.error('usage: snapshot-capabilities.mjs <scratchSectionId> <out.json> [--types …]'); process.exit(2); }
|
|
18
|
+
const types = opt('types', 'wixEditorElements.WRichText,wixEditorElements.Image,wixEditorElements.Button').split(',');
|
|
19
|
+
const b = await chromium.connectOverCDP(`http://127.0.0.1:${process.env.PW_PORT || 9333}`);
|
|
20
|
+
const p = b.contexts().flatMap((c) => c.pages()).find((x) => x.url().includes('editor.wix.com/edit/'));
|
|
21
|
+
if (!p) { console.error('No Harmony editor page is open.'); process.exit(3); }
|
|
22
|
+
await hideScrollbars(p); // canvas widths must not depend on the OS scrollbar setting
|
|
23
|
+
const raw = await p.evaluate(async (code) => { const a = await repluggableAppDebug.host.getAPI({ name: 'RunEditorLLMCodeToolAPI', public: true, layer: 'DATA_SERVICE' }); return a.execute({ code }, { biParams: {} }); }, `
|
|
24
|
+
const A = editorLLMApis; const out = {}; const temp = [];
|
|
25
|
+
await A.pages.navigate({ pageId: (await A.sections.get({ sectionId: ${JSON.stringify(sectionId)} })).pageId }); await A.breakpoints.toggle({ device: 'desktop' });
|
|
26
|
+
for (const type of ${JSON.stringify(types)}) {
|
|
27
|
+
const c = { id: (await A.components.add({ containerId: ${JSON.stringify(sectionId)}, components: [{ componentType: type }], select: false })).added[0].componentId }; temp.push(c.id);
|
|
28
|
+
const ss = await A.appearance.getStyleSchema({ componentId: c.id }); const cs = await A.content.getSchema({ componentId: c.id });
|
|
29
|
+
let links = null; try { links = (await A.links.getAllowedTypes({ componentId: c.id })).allowedTypes; } catch (e) {}
|
|
30
|
+
out[type] = { styles: Object.fromEntries(ss.elements.filter((e) => e.writableProperties).map((e) => [e.elementPath.join('/') || 'root', Object.keys(e.writableProperties)])), content: cs.fields.map((f) => ({ key: f.key, dataType: f.dataType, options: f.options ? f.options.map((o) => o.value) : undefined })), links };
|
|
31
|
+
}
|
|
32
|
+
await A.components.remove({ componentIds: temp });
|
|
33
|
+
return { readAt: new Date().toISOString(), api: Object.fromEntries(Object.keys(A).map((ns) => [ns, Object.keys(A[ns])])), addable: (await A.components.listAddable()).components.map((c) => c.componentType), types: out, breakpoints: await A.breakpoints.list() };`);
|
|
34
|
+
const c = JSON.parse(raw.items[0].content);
|
|
35
|
+
if (!c.success) { console.error(c.summary); process.exit(1); }
|
|
36
|
+
let changed = null;
|
|
37
|
+
if (fs.existsSync(out)) { const prev = JSON.parse(fs.readFileSync(out, 'utf8')); changed = JSON.stringify(prev.types) !== JSON.stringify(c.result.types) || JSON.stringify(prev.addable) !== JSON.stringify(c.result.addable) || JSON.stringify(prev.api) !== JSON.stringify(c.result.api); }
|
|
38
|
+
fs.writeFileSync(out, JSON.stringify({ ...c.result, addableCount: c.result.addable.length }, null, 1));
|
|
39
|
+
console.log(JSON.stringify({ out, types: Object.keys(c.result.types), addable: c.result.addable.length, changedSinceLastSnapshot: changed }));
|
|
40
|
+
await b.close();
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Split a deployed one-section page into one Harmony section per source section, keeping every
|
|
3
|
+
// component (ids, styles, links) and giving each section its own background (colour, plate or
|
|
4
|
+
// video) and its own desktop and mobile layout. Videos become Video Player components or a
|
|
5
|
+
// section background video.
|
|
6
|
+
//
|
|
7
|
+
// node scripts/copy/split-sections.mjs <spec.json> --page <pageId> --section <oldSectionId> [--keep-old]
|
|
8
|
+
//
|
|
9
|
+
// spec.json:
|
|
10
|
+
// { "sections": [ { "name": "Hero", "y0": 165, "y1": 832, "delta": 1,
|
|
11
|
+
// "background": { "color": "#ffffff", "plate": { "uri", "name", "width", "height" }, "video": <video> },
|
|
12
|
+
// "videos": [ { "video": <video>, "box": { "x", "y", "width", "height" } } ], // Video Player at that box (section coordinates)
|
|
13
|
+
// "cards": true, // mobile: stack tile by tile (an image with the captions under it), not all images then all captions
|
|
14
|
+
// "include": ["<label>"], // components that belong here whatever their position (a gallery taller than its source band)
|
|
15
|
+
// "place": { "<label>": { "x", "y" } }, // move a component (section coordinates)
|
|
16
|
+
// "height": 600 } ], // override y1 - y0
|
|
17
|
+
// "drop": [ "<label prefix>" ] } // components removed (static copies of a gallery, spacers)
|
|
18
|
+
// y0/y1: source page pixels. delta: how far this band's components sit below the source
|
|
19
|
+
// (Harmony y = source y + delta); components belong to the section holding their centre.
|
|
20
|
+
// <video>: { "fileId": "5f062c_…" (Media Manager uri of the uploaded mp4), "name", "width", "height" }.
|
|
21
|
+
//
|
|
22
|
+
// Calls (one editor run each): inventory (desktop and mobile boxes), then per section: add the
|
|
23
|
+
// section, background, videos, reparent, desktop composition, mobile composition; then remove
|
|
24
|
+
// the old section and save. Mobile: components keep their old order and spacing within the
|
|
25
|
+
// section, restarted at the section top (a video goes first, full width, 16:9).
|
|
26
|
+
// A video value must carry adaptiveSources (even []): without it the saved document cannot be loaded again
|
|
27
|
+
// (document services fail on `.map` of undefined and the editor never opens).
|
|
28
|
+
// Hide-on-mobile and mobile background opacity have no API: run mobile-stage.mjs after.
|
|
29
|
+
import { chromium } from 'playwright';
|
|
30
|
+
import { hideScrollbars } from './hide-scrollbars.mjs';
|
|
31
|
+
import fs from 'fs';
|
|
32
|
+
|
|
33
|
+
const args = process.argv.slice(2);
|
|
34
|
+
const opt = (n, d) => { const i = args.indexOf(`--${n}`); return i >= 0 ? args[i + 1] : d; };
|
|
35
|
+
const specFile = args.find((a, i) => !a.startsWith('--') && !(i > 0 && args[i - 1].startsWith('--')));
|
|
36
|
+
const pageId = opt('page'), oldId = opt('section');
|
|
37
|
+
if (!specFile || !pageId || !oldId) { console.error('usage: split-sections.mjs <spec.json> --page <pageId> --section <oldSectionId> [--keep-old]'); process.exit(2); }
|
|
38
|
+
const spec = JSON.parse(fs.readFileSync(specFile, 'utf8'));
|
|
39
|
+
const stateFile = specFile.replace(/\.json$/, '') + '.split-state.json';
|
|
40
|
+
const state = fs.existsSync(stateFile) ? JSON.parse(fs.readFileSync(stateFile, 'utf8')) : { sections: {} };
|
|
41
|
+
const save = () => fs.writeFileSync(stateFile, JSON.stringify(state, null, 1));
|
|
42
|
+
const J = JSON.stringify;
|
|
43
|
+
|
|
44
|
+
// HZ_EDITOR_RUNNER=<module>: a module whose default export is async (code) => result, used instead of the live
|
|
45
|
+
// editor. The tests drive the real script against a fake editor this way; nothing else uses it.
|
|
46
|
+
let browser = null;
|
|
47
|
+
let run;
|
|
48
|
+
if (process.env.HZ_EDITOR_RUNNER) {
|
|
49
|
+
const runner = (await import(process.env.HZ_EDITOR_RUNNER)).default;
|
|
50
|
+
run = (name, code) => runner(code, name);
|
|
51
|
+
} else {
|
|
52
|
+
browser = await chromium.connectOverCDP(`http://127.0.0.1:${process.env.PW_PORT || 9333}`);
|
|
53
|
+
const page = browser.contexts().flatMap((c) => c.pages()).find((p) => p.url().includes('editor.wix.com/edit/'));
|
|
54
|
+
if (!page) { console.error('No Harmony editor page is open.'); process.exit(3); }
|
|
55
|
+
await hideScrollbars(page);
|
|
56
|
+
run = async (name, code) => {
|
|
57
|
+
const raw = await page.evaluate(async (code) => { const api = await repluggableAppDebug.host.getAPI({ name: 'RunEditorLLMCodeToolAPI', public: true, layer: 'DATA_SERVICE' }); try { return await api.execute({ code }, { biParams: {} }); } catch (e) { return { thrown: String(e?.message || e) }; } }, code);
|
|
58
|
+
if (raw.thrown) throw new Error(`${name}: ${raw.thrown}`);
|
|
59
|
+
const c = JSON.parse(raw.items[0].content);
|
|
60
|
+
if (!c.success) { const e = new Error(`${name}: ${c.summary}`); e.detail = c; throw e; }
|
|
61
|
+
return c.result;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
const videoValue = (v) => ({ uri: `video/${v.fileId}/720p/mp4/file.mp4`, name: v.name, hasAudio: false, duration: v.duration || 10, adaptiveSources: [], sources: [{ quality: '720p', width: 1280, height: 720, types: [{ format: 'mp4', uri: `video/${v.fileId}/720p/mp4/file.mp4` }] }, { quality: '480p', width: 854, height: 480, types: [{ format: 'mp4', uri: `video/${v.fileId}/480p/mp4/file.mp4` }] }], poster: { uri: `${v.fileId}f002.jpg`, name: `${v.name}.jpg`, width: 1280, height: 720 } });
|
|
65
|
+
|
|
66
|
+
// 1 inventory ---------------------------------------------------------------------------
|
|
67
|
+
if (!state.inventory) {
|
|
68
|
+
state.inventory = await run('inventory', `const A = editorLLMApis;
|
|
69
|
+
await A.pages.navigate({ pageId: ${J(pageId)} }); await A.breakpoints.toggle({ device: 'desktop' });
|
|
70
|
+
const d = await A.layout.getComposition({ componentId: ${J(oldId)} });
|
|
71
|
+
await A.breakpoints.toggle({ device: 'mobile' }); const m = await A.layout.getComposition({ componentId: ${J(oldId)} }); await A.breakpoints.toggle({ device: 'desktop' });
|
|
72
|
+
const mb = Object.fromEntries(m.children.map((k) => [k.componentId, k.box]));
|
|
73
|
+
return { desktopBox: d.box, mobileBox: m.box, children: d.children.map((k) => ({ id: k.componentId, label: k.label, type: k.type, box: k.box, mobile: mb[k.componentId] || null })) };`);
|
|
74
|
+
save();
|
|
75
|
+
}
|
|
76
|
+
const isDropped = (label) => (spec.drop || []).some((p) => label.startsWith(p));
|
|
77
|
+
const all = state.inventory.children;
|
|
78
|
+
const dropIds = all.filter((c) => isDropped(c.label)).map((c) => c.id);
|
|
79
|
+
const live = all.filter((c) => !isDropped(c.label));
|
|
80
|
+
const band = (s) => [s.y0 + s.delta, s.y1 + s.delta];
|
|
81
|
+
const sectionOf = (c) => { const forced = spec.sections.findIndex((s) => (s.include || []).includes(c.label)); if (forced >= 0) return forced; const mid = c.box.y + c.box.height / 2; return spec.sections.findIndex((s) => { const [a, b] = band(s); return mid >= a && mid < b; }); };
|
|
82
|
+
const assigned = spec.sections.map(() => []);
|
|
83
|
+
const lost = [];
|
|
84
|
+
for (const c of live) { const i = sectionOf(c); if (i < 0) lost.push(c.label); else assigned[i].push(c); }
|
|
85
|
+
if (lost.length) { console.error('components outside every section:', lost.join(', ')); process.exit(4); }
|
|
86
|
+
|
|
87
|
+
// 2 per section ---------------------------------------------------------------------------
|
|
88
|
+
const kindOf = (t) => (/RichText/.test(t) ? 'text' : /Image$|\.Image/.test(t) ? 'image' : /Slider|Gallery|Cart/.test(t) ? 'native' : /Video/.test(t) ? 'video' : 'other');
|
|
89
|
+
const sized = (c, b, dev) => { const k = kindOf(c.type); return k === 'text' || k === 'native' || (dev === 'mobile' && k === 'image') ? { x: b.x, y: b.y, width: b.width } : { x: b.x, y: b.y, width: b.width, height: b.height }; };
|
|
90
|
+
let prev = oldId;
|
|
91
|
+
let mutated = false, saved = false;
|
|
92
|
+
for (let i = 0; i < spec.sections.length; i++) {
|
|
93
|
+
const s = spec.sections[i];
|
|
94
|
+
const done = state.sections[s.name];
|
|
95
|
+
if (done && done.finished && opt('redo-mobile', null) !== s.name) { prev = done.id; continue; } // --redo-mobile "<section name>" re-sends one section's layout
|
|
96
|
+
const [a] = band(s);
|
|
97
|
+
const height = s.height || (s.y1 - s.y0);
|
|
98
|
+
const place = s.place || {};
|
|
99
|
+
const items = assigned[i].map((c) => ({ c, box: { ...c.box, y: place[c.label]?.y ?? Math.round(c.box.y - a), x: place[c.label]?.x ?? c.box.x } }));
|
|
100
|
+
// mobile layout: old order and spacing, restarted at the section top; a video goes first
|
|
101
|
+
const vids = s.videos || [];
|
|
102
|
+
const vidH = Math.round(390 * 9 / 16), top = vids.length ? vids.length * (vidH + 12) : 0;
|
|
103
|
+
const mob = items.filter((it) => it.c.mobile).sort((x, y) => x.c.mobile.y - y.c.mobile.y);
|
|
104
|
+
let mobBoxes, mobHeight;
|
|
105
|
+
if (s.cards) {
|
|
106
|
+
// cards: an image with the texts under it in its column stay together (a grid of tiles stacks tile by tile,
|
|
107
|
+
// right to left for RTL), instead of all images first and all captions after
|
|
108
|
+
const imgs = mob.filter((it) => kindOf(it.c.type) === 'image' && it.box.width >= 100);
|
|
109
|
+
const cardOf = new Map(); const rest = [];
|
|
110
|
+
for (const it of mob) { if (imgs.includes(it)) { cardOf.set(it, { img: it, below: [] }); continue; }
|
|
111
|
+
const host = imgs.filter((im) => it.box.y >= im.box.y + im.box.height - 5 && Math.min(it.box.x + it.box.width, im.box.x + im.box.width) - Math.max(it.box.x, im.box.x) >= 0.5 * Math.min(it.box.width, im.box.width)).sort((m, n) => n.box.y - m.box.y)[0];
|
|
112
|
+
if (host) cardOf.get(host).below.push(it); else rest.push(it); }
|
|
113
|
+
const units = [...cardOf.values()].map((cd) => ({ key: [Math.round(cd.img.box.y / 20), -cd.img.box.x], list: [cd.img, ...cd.below.sort((m, n) => m.box.y - n.box.y)] }))
|
|
114
|
+
.concat(rest.map((it) => ({ key: [Math.round(it.box.y / 20), -it.box.x], list: [it] })));
|
|
115
|
+
units.sort((m, n) => m.key[0] - n.key[0] || m.key[1] - n.key[1]);
|
|
116
|
+
let y = 16 + top; mobBoxes = [];
|
|
117
|
+
for (const u of units) { for (const it of u.list) { mobBoxes.push({ id: it.c.id, label: it.c.label, type: it.c.type, box: { x: it.c.mobile.x, y: Math.round(y), width: it.c.mobile.width, height: it.c.mobile.height } }); y += it.c.mobile.height + 6; } y += 14; }
|
|
118
|
+
mobHeight = Math.round(y + 10);
|
|
119
|
+
} else {
|
|
120
|
+
const minY = mob.length ? Math.min(...mob.map((it) => it.c.mobile.y)) : 0;
|
|
121
|
+
mobBoxes = mob.map((it) => ({ id: it.c.id, label: it.c.label, type: it.c.type, box: { x: it.c.mobile.x, y: Math.round(it.c.mobile.y - minY + 16 + top), width: it.c.mobile.width, height: it.c.mobile.height } }));
|
|
122
|
+
mobHeight = Math.max(top, ...mobBoxes.map((m) => m.box.y + m.box.height + 16), 120);
|
|
123
|
+
}
|
|
124
|
+
const code = `const A = editorLLMApis;
|
|
125
|
+
await A.pages.navigate({ pageId: ${J(pageId)} }); await A.breakpoints.toggle({ device: 'desktop' });
|
|
126
|
+
const existing = ${J(done ? done.id : null)};
|
|
127
|
+
let sec; if (existing) sec = { sectionId: existing }; else sec = await A.sections.add({ name: ${J(s.name)}, afterSectionId: ${J(prev)} });
|
|
128
|
+
const SID = sec.sectionId;
|
|
129
|
+
try { await A.view.scrollTo({ componentId: SID }); } catch (e) {} // an off-screen section is not rendered, so it has no size to compose
|
|
130
|
+
await new Promise((r) => setTimeout(r, 800));
|
|
131
|
+
const bg = { backgroundColor: ${J(s.background.color || '#FFFFFF')}${s.background.plate ? `, image: ${J({ uri: s.background.plate.uri, name: s.background.plate.name, alt: '', width: s.background.plate.width, height: s.background.plate.height })}, fittingType: 'fill'` : ''}${s.background.video ? `, videoMedia: ${J(videoValue(s.background.video))}, loop: true, autoplay: true, showControls: false, muted: true` : ''} };
|
|
132
|
+
await A.appearance.setContainerBackground({ componentId: SID, properties: bg });
|
|
133
|
+
const newVids = [];
|
|
134
|
+
${vids.map((v, k) => `{ const have = existing ? ((await A.components.getTree({ rootId: SID, depth: 1 })).children || []).find((q) => q.label === ${J(`video-${s.name}-${k}`)}) : null; // a re-run reuses the video it already made
|
|
135
|
+
if (have) newVids.push(have.id); else { const r = await A.components.add({ containerId: SID, components: [{ componentType: 'wixEditorElements.VideoUpload' }], select: false }); const id = r.added[0].componentId; await A.components.rename({ componentId: id, label: ${J(`video-${s.name}-${k}`)} });
|
|
136
|
+
await A.content.set({ componentId: id, values: { video: ${J(videoValue(v.video))}, autoplay: true, loop: true, mute: true, enableControls: false } }); newVids.push(id); } }`).join('\n')}
|
|
137
|
+
const ids = ${J(items.map((it) => it.c.id))};
|
|
138
|
+
if (ids.length) await A.components.reparent({ componentIds: ids, targetContainerId: SID });
|
|
139
|
+
const kids = [${items.map((it) => `{ componentId: ${J(it.c.id)}, box: ${J(sized(it.c, it.box, 'desktop'))} }`).join(', ')}${vids.length && items.length ? ', ' : ''}${vids.map((v, k) => `{ componentId: newVids[${k}], box: ${J(v.box)} }`).join(', ')}];
|
|
140
|
+
const comp = async (dev, h, list) => { await A.breakpoints.toggle({ device: dev }); let r, off = [];
|
|
141
|
+
for (let pass = 0; pass < 4; pass++) { let noop = false; try { r = await A.layout.setComposition({ componentId: SID, box: { height: h }, children: list }); } catch (e) { if (!/back onto the boxes it already had/.test(String((e && e.message) || e))) throw e; noop = true; }
|
|
142
|
+
const got = Object.fromEntries((await A.layout.getComposition({ componentId: SID })).children.map((q) => [q.componentId, q.box]));
|
|
143
|
+
off = list.filter((w) => !got[w.componentId] || ['x', 'y', 'width', 'height'].some((k) => w.box[k] !== undefined && Math.abs(got[w.componentId][k] - w.box[k]) > 1)).map((w) => [w.componentId, w.box, got[w.componentId] || null]); if (!off.length) break; }
|
|
144
|
+
return { off, box: r && r.box }; };
|
|
145
|
+
const out = { id: SID };
|
|
146
|
+
out.desktop = kids.length ? await comp('desktop', ${height}, kids) : (await A.layout.setComposition({ componentId: SID, box: { height: ${height} }, children: [] }).catch((e) => String(e.message).slice(0, 200)));
|
|
147
|
+
const mkids = [${mobBoxes.map((m) => `{ componentId: ${J(m.id)}, box: ${J(sized({ type: m.type }, m.box, 'mobile'))} }`).join(', ')}${vids.length && mobBoxes.length ? ', ' : ''}${vids.map((v, k) => `{ componentId: newVids[${k}], box: { x: 0, y: ${16 + k * (vidH + 12)}, width: 390, height: ${vidH} } }`).join(', ')}];
|
|
148
|
+
out.mobile = mkids.length ? await comp('mobile', ${mobHeight}, mkids) : null;
|
|
149
|
+
// a mobile write can move desktop boxes: read the desktop view back and count what is off now
|
|
150
|
+
await A.breakpoints.toggle({ device: 'desktop' });
|
|
151
|
+
if (kids.length) { const gd = Object.fromEntries((await A.layout.getComposition({ componentId: SID })).children.map((q) => [q.componentId, q.box])); const offD = kids.filter((w) => !gd[w.componentId] || ['x', 'y', 'width', 'height'].some((k) => w.box[k] !== undefined && Math.abs(gd[w.componentId][k] - w.box[k]) > 1)); out.desktop.off = offD.map((w) => [w.componentId, w.box, gd[w.componentId] || null]); }
|
|
152
|
+
out.newVids = newVids;
|
|
153
|
+
return out;`;
|
|
154
|
+
const res = await run(`section ${s.name}`, code);
|
|
155
|
+
mutated = true; // layout was written: it must be saved even when the one-time cleanup is already done or skipped (--keep-old)
|
|
156
|
+
const dOff = res.desktop && res.desktop.off ? res.desktop.off.length : 0, mOff = res.mobile && res.mobile.off ? res.mobile.off.length : 0;
|
|
157
|
+
// a section with boxes that never landed is NOT finished: keep it resumable and keep the original section
|
|
158
|
+
state.sections[s.name] = { id: res.id, newVids: res.newVids, finished: dOff === 0 && mOff === 0, desktopOff: dOff, mobileOff: mOff };
|
|
159
|
+
save(); prev = res.id;
|
|
160
|
+
console.log(s.name, JSON.stringify({ id: res.id, items: items.length, desktopOff: dOff, mobileOff: mOff }));
|
|
161
|
+
if (dOff || mOff) { console.error(`section "${s.name}" has boxes that did not land (desktop ${dOff}, mobile ${mOff}): the original section is kept; fix the spec and re-run (finished sections are skipped)`); if (browser) await browser.close(); process.exit(1); }
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// 3 drop, remove the old section, save -------------------------------------------------------
|
|
165
|
+
// Idempotent: the old section is looked up first, and what was done is persisted, so a repeat (--redo-mobile after a
|
|
166
|
+
// finished split, a re-run after a failed save) never queries or removes a section that is already gone.
|
|
167
|
+
if (!args.includes('--keep-old') && spec.sections.every((s) => state.sections[s.name] && state.sections[s.name].finished)) {
|
|
168
|
+
if (state.cleanup && state.cleanup.done) console.log(JSON.stringify({ cleanup: 'already done' }));
|
|
169
|
+
else {
|
|
170
|
+
const fin = await run('finish', `const A = editorLLMApis;
|
|
171
|
+
const OLD = ${J(oldId)};
|
|
172
|
+
const exists = (await A.sections.list({})).some((s) => s.sectionId === OLD);
|
|
173
|
+
let dropped = 0, left = [], removed = !exists;
|
|
174
|
+
if (exists) {
|
|
175
|
+
const DROP = ${J(dropIds)};
|
|
176
|
+
const kids = (await A.components.getTree({ rootId: OLD, depth: 1 })).children || [];
|
|
177
|
+
const present = kids.filter((k) => DROP.includes(k.id)).map((k) => k.id); // only the ones still there: a repeat removes nothing twice
|
|
178
|
+
if (present.length) { await A.components.remove({ componentIds: present }); dropped = present.length; }
|
|
179
|
+
left = kids.filter((k) => !present.includes(k.id));
|
|
180
|
+
if (!left.length) { await A.sections.remove({ sectionId: OLD }); removed = true; }
|
|
181
|
+
}
|
|
182
|
+
await A.site.save();
|
|
183
|
+
return { dropped, left: left.map((k) => k.label), removed };`);
|
|
184
|
+
saved = true; // the cleanup call ends with site.save()
|
|
185
|
+
state.cleanup = { done: fin.removed, ...fin }; save();
|
|
186
|
+
console.log(JSON.stringify(fin));
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// separate from the one-time cleanup: a mobile redo, a repeat after a failed save, or --keep-old still has unsaved layout writes
|
|
190
|
+
if (mutated && !saved) { await run('save', 'return await editorLLMApis.site.save();'); console.log(JSON.stringify({ saved: true })); }
|
|
191
|
+
if (browser) await browser.close();
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Upload LOCAL files (rendered plates, cropped assets) into the site's Media Manager through
|
|
3
|
+
// the editor's own Media Manager dialog, then close it without changing the page.
|
|
4
|
+
//
|
|
5
|
+
// node scripts/copy/upload-media-manager.mjs <sectionId> <file> [<file> ...]
|
|
6
|
+
//
|
|
7
|
+
// Why: media.uploadFiles only accepts temporary wixmp chat URLs, and the REST
|
|
8
|
+
// generate-upload-url call can be refused for the CLI site token. Files that are already
|
|
9
|
+
// public on the web are simpler: POST /site-media/v1/files/import with the site token.
|
|
10
|
+
// How: adds a temporary Image to <sectionId>, runs its changeMedia edit action to open
|
|
11
|
+
// Media Manager, clicks "Upload Media", feeds input[data-hook="files-input"], waits for
|
|
12
|
+
// "Upload(s) Completed", closes the dialog and removes the temporary Image.
|
|
13
|
+
// Afterwards find the files with editorLLMApis.media.searchSiteFiles({ query: <name> }).
|
|
14
|
+
import { chromium } from 'playwright';
|
|
15
|
+
|
|
16
|
+
const [sectionId, ...files] = process.argv.slice(2);
|
|
17
|
+
if (!sectionId || !files.length) { console.error('usage: upload-media-manager.mjs <sectionId> <file> [...]'); process.exit(2); }
|
|
18
|
+
|
|
19
|
+
const browser = await chromium.connectOverCDP(`http://127.0.0.1:${process.env.PW_PORT || 9333}`);
|
|
20
|
+
const page = browser.contexts().flatMap((c) => c.pages()).find((p) => p.url().includes('editor.wix.com/edit/'));
|
|
21
|
+
if (!page) { console.error('No Harmony editor page is open.'); process.exit(3); }
|
|
22
|
+
const api = async (code) => {
|
|
23
|
+
const raw = await page.evaluate(async (code) => { const a = await repluggableAppDebug.host.getAPI({ name: 'RunEditorLLMCodeToolAPI', public: true, layer: 'DATA_SERVICE' }); return a.execute({ code }, { biParams: {} }); }, code);
|
|
24
|
+
const c = JSON.parse(raw.items[0].content);
|
|
25
|
+
if (!c.success) throw new Error(c.summary);
|
|
26
|
+
return c.result;
|
|
27
|
+
};
|
|
28
|
+
const mmFrame = () => page.frames().find((f) => f.url().includes('/media-manager/'));
|
|
29
|
+
// The Media Manager iframe stays in the DOM after closing: test VISIBILITY, not presence.
|
|
30
|
+
const isOpen = async () => { const f = mmFrame(); return f ? f.locator('text=Upload Media').first().isVisible().catch(() => false) : false; };
|
|
31
|
+
|
|
32
|
+
let tmp = null;
|
|
33
|
+
if (!(await isOpen())) {
|
|
34
|
+
tmp = await api(`const i = (await editorLLMApis.components.add({ containerId: ${JSON.stringify(sectionId)}, components: [{ componentType: 'wixEditorElements.Image' }], select: false })).added[0]; return i.componentId;`);
|
|
35
|
+
// changeMedia resolves only when the dialog closes, so do not await it here
|
|
36
|
+
api(`return await editorLLMApis.editActions.run({ componentId: ${JSON.stringify(tmp)}, action: 'changeMedia' });`).catch(() => {});
|
|
37
|
+
for (let i = 0; i < 40 && !(await isOpen()); i++) await page.waitForTimeout(1000);
|
|
38
|
+
}
|
|
39
|
+
if (!(await isOpen())) throw new Error('Media Manager did not open');
|
|
40
|
+
const f = mmFrame();
|
|
41
|
+
await page.waitForTimeout(800);
|
|
42
|
+
await f.locator('text=Upload Media').first().click();
|
|
43
|
+
let input = null;
|
|
44
|
+
for (let i = 0; i < 20 && !input; i++) { await page.waitForTimeout(500); input = await f.$('input[type=file][data-hook="files-input"]'); }
|
|
45
|
+
if (!input) throw new Error('Media Manager file input not found');
|
|
46
|
+
await input.setInputFiles(files);
|
|
47
|
+
const names = files.map((x) => x.split('/').pop());
|
|
48
|
+
let done = false;
|
|
49
|
+
for (let i = 0; i < 90 && !done; i++) {
|
|
50
|
+
const t = await f.evaluate(() => document.body.innerText).catch(() => '');
|
|
51
|
+
done = /Uploads? Completed/i.test(t) && names.every((n) => t.includes(n));
|
|
52
|
+
if (!done) await page.waitForTimeout(1000);
|
|
53
|
+
}
|
|
54
|
+
await page.waitForTimeout(1200);
|
|
55
|
+
await page.keyboard.press('Escape');
|
|
56
|
+
await page.waitForTimeout(1500);
|
|
57
|
+
if (await isOpen()) { const c = await f.$('[data-hook*="close"], button[aria-label*="lose"]'); if (c) await c.click().catch(() => {}); await page.waitForTimeout(1500); }
|
|
58
|
+
if (tmp) await api(`await editorLLMApis.components.remove({ componentIds: [${JSON.stringify(tmp)}] }); return true;`);
|
|
59
|
+
console.log(JSON.stringify({ uploaded: names, completed: done, dialogOpen: await isOpen() }));
|
|
60
|
+
await browser.close();
|
|
61
|
+
if (!done) { console.error('Upload completion was not observed within 90 s: check the Media Manager before using these files.'); process.exit(1); }
|