@wix/agent-skills 1.36.0 → 1.36.1
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/package.json +8 -3
- package/skills/wix-headless-kit/install/pins.json +1 -1
- package/skills/wix-manage/SKILL.md +3 -3
- package/skills/wix-manage/references/cms/cms-data-items-crud.md +78 -1
- package/skills/wix-manage/references/google-ads/create-performance-max-campaign.md +11 -11
- package/skills/wix-manage/references/marketing/create-and-publish-social-post.md +20 -51
- package/skills/wix-manage/references/marketing/generate-and-publish-marketing-plan.md +4 -4
- package/skills/wix-base44-connector/SKILL.md +0 -437
- package/skills/wix-base44-connector/references/CAPABILITY_MAP.md +0 -78
- package/skills/wix-base44-connector/scripts/utils.cjs +0 -466
- package/skills/wix-export/SKILL.md +0 -83
- package/skills/wix-harmony-editor/.publish-manifest.json +0 -8
- package/skills/wix-harmony-editor/COPY-SITE.md +0 -494
- package/skills/wix-harmony-editor/SKILL.md +0 -317
- package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +0 -249
- package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +0 -225
- package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +0 -89
- package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +0 -76
- package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +0 -212
- package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +0 -44
- package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +0 -45
- package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +0 -53
- package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +0 -76
- package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +0 -16
- package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +0 -150
- package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +0 -27
- package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +0 -56
- package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +0 -211
- package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +0 -29
- package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +0 -92
- package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +0 -56
- package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +0 -73
- package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +0 -67
- package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +0 -102
- package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +0 -40
- package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +0 -191
- package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +0 -61
- package/skills/wix-harmony-editor/scripts/launch.sh +0 -359
- package/skills/wix-headless/SKILL.md +0 -151
- package/skills/wix-headless/references/AI_FEATURES.md +0 -178
- package/skills/wix-headless/references/CAPABILITIES.md +0 -117
- package/skills/wix-headless/references/CONTENT.md +0 -36
- package/skills/wix-headless/references/DESIGN.md +0 -55
- package/skills/wix-headless/references/DISCOVERY.md +0 -80
- package/skills/wix-headless/references/DOC_DISCOVERY.md +0 -43
- package/skills/wix-headless/references/FEEDBACK.md +0 -129
- package/skills/wix-headless/references/IMAGE_GENERATION.md +0 -80
- package/skills/wix-headless/references/SDK_HANDOFF.md +0 -108
- package/skills/wix-headless/references/SEED.md +0 -74
- package/skills/wix-headless/references/SETUP.md +0 -60
- package/skills/wix-headless/references/astro.md +0 -98
- package/skills/wix-headless/references/inline-recipes/experience-donations.md +0 -102
- package/skills/wix-headless/references/inline-recipes/experience-store.md +0 -49
- package/skills/wix-headless/references/inline-recipes/how-to-code-a-blog.md +0 -196
- package/skills/wix-headless/references/inline-recipes/how-to-code-a-store.md +0 -590
- package/skills/wix-headless/references/inline-recipes/how-to-code-bookings.md +0 -279
- package/skills/wix-headless/references/inline-recipes/how-to-code-cms.md +0 -163
- package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +0 -146
- package/skills/wix-headless/references/inline-recipes/how-to-code-events.md +0 -203
- package/skills/wix-headless/references/inline-recipes/how-to-code-forms.md +0 -696
- package/skills/wix-headless/references/inline-recipes/how-to-code-members-astro.md +0 -124
- package/skills/wix-headless/references/inline-recipes/how-to-code-members-custom-login.md +0 -160
- package/skills/wix-headless/references/inline-recipes/how-to-code-members-non-astro.md +0 -118
- package/skills/wix-headless/references/inline-recipes/how-to-code-portfolio.md +0 -132
- package/skills/wix-headless/references/inline-recipes/how-to-code-pricing-plans.md +0 -126
- package/skills/wix-headless/references/inline-recipes/how-to-code-rentals.md +0 -254
- package/skills/wix-headless/references/inline-recipes/how-to-code-restaurant-orders.md +0 -191
- package/skills/wix-headless/references/inline-recipes/how-to-code-restaurant-reservations.md +0 -213
- package/skills/wix-headless/references/inline-recipes/how-to-code-restaurants.md +0 -161
- package/skills/wix-headless/references/inline-recipes/setup-blog.md +0 -175
- package/skills/wix-headless/references/inline-recipes/setup-bookings.md +0 -232
- package/skills/wix-headless/references/inline-recipes/setup-cms.md +0 -200
- package/skills/wix-headless/references/inline-recipes/setup-donations.md +0 -15
- package/skills/wix-headless/references/inline-recipes/setup-events.md +0 -196
- package/skills/wix-headless/references/inline-recipes/setup-forms.md +0 -288
- package/skills/wix-headless/references/inline-recipes/setup-online-store.md +0 -214
- package/skills/wix-headless/references/inline-recipes/setup-portfolio.md +0 -155
- package/skills/wix-headless/references/inline-recipes/setup-pricing-plans.md +0 -229
- package/skills/wix-headless/references/inline-recipes/setup-rentals.md +0 -254
- package/skills/wix-headless/references/inline-recipes/setup-restaurant-experiences.md +0 -73
- package/skills/wix-headless/references/inline-recipes/setup-restaurant-orders.md +0 -197
- package/skills/wix-headless/references/inline-recipes/setup-restaurant-reservations.md +0 -136
- package/skills/wix-headless/references/inline-recipes/setup-restaurants.md +0 -152
- package/skills/wix-headless/references/managed/AUTHENTICATION.md +0 -71
- package/skills/wix-headless/references/managed/CONNECT.md +0 -74
- package/skills/wix-headless/references/managed/CREATE.md +0 -149
- package/skills/wix-headless/references/managed/DEPLOYMENT.md +0 -104
- package/skills/wix-headless/references/non-astro.md +0 -59
- package/skills/wix-headless/references/self-managed/AUTHENTICATION.md +0 -22
- package/skills/wix-headless/references/self-managed/DEPLOYMENT.md +0 -15
- package/skills/wix-headless/references/stripe/AUTHENTICATION.md +0 -55
- package/skills/wix-headless/references/stripe/DEPLOYMENT.md +0 -71
- package/skills/wix-headless/scripts/bootstrap.mjs +0 -156
- package/skills/wix-headless-replatform/.publish-manifest.json +0 -8
- package/skills/wix-headless-replatform/SKILL.md +0 -116
- package/skills/wix-headless-replatform/agents/openai.yaml +0 -6
- package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +0 -43
- package/skills/wix-headless-replatform/references/extraction-schema.md +0 -187
- package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +0 -137
- package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +0 -41
- package/skills/wix-headless-replatform/references/output-contract.md +0 -93
- package/skills/wix-headless-replatform/references/post-build-gap-contract.md +0 -125
- package/skills/wix-headless-replatform/references/qa-checklist.md +0 -83
- package/skills/wix-headless-replatform/references/safety.md +0 -19
- package/skills/wix-headless-replatform/references/ui-normalization-contract.md +0 -70
- package/skills/wix-headless-replatform/references/workflow.md +0 -157
- package/skills/wix-headless-replatform/registry/README.md +0 -20
- package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +0 -28
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +0 -54
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +0 -60
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +0 -48
- package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +0 -21
- package/skills/wix-headless-replatform/registry/registry.json +0 -36
- package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +0 -32
- package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +0 -62
- package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +0 -64
- package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +0 -42
- package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +0 -73
- package/skills/wix-headless-replatform/schemas/build-plan.schema.json +0 -10
- package/skills/wix-headless-replatform/schemas/candidate.schema.json +0 -19
- package/skills/wix-headless-replatform/schemas/common.schema.json +0 -33
- package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +0 -10
- package/skills/wix-headless-replatform/schemas/decision-request.schema.json +0 -10
- package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +0 -28
- package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +0 -34
- package/skills/wix-headless-replatform/schemas/final-report.schema.json +0 -10
- package/skills/wix-headless-replatform/schemas/foundation.schema.json +0 -11
- package/skills/wix-headless-replatform/schemas/metadata.schema.json +0 -11
- package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +0 -17
- package/skills/wix-headless-replatform/schemas/page-capture.schema.json +0 -11
- package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +0 -33
- package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +0 -11
- package/skills/wix-headless-replatform/schemas/unit.schema.json +0 -40
- package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +0 -844
- package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +0 -163
- package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +0 -42
- package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +0 -228
- package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +0 -87
- package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +0 -505
- package/skills/wix-headless-replatform/scripts/discover-urls.mjs +0 -142
- package/skills/wix-headless-replatform/scripts/extract-assets.mjs +0 -140
- package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +0 -637
- package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +0 -1903
- package/skills/wix-headless-replatform/scripts/extract-page.mjs +0 -2461
- package/skills/wix-headless-replatform/scripts/extract-seo.mjs +0 -25
- package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +0 -63
- package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +0 -126
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +0 -180
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +0 -98
- package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +0 -103
- package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +0 -176
- package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +0 -261
- package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +0 -25
- package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +0 -342
- package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +0 -140
- package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +0 -22
- package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +0 -143
- package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +0 -288
- package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +0 -266
- package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +0 -111
- package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +0 -570
- package/skills/wix-headless-replatform/scripts/lib/common.mjs +0 -329
- package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +0 -121
- package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +0 -282
- package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +0 -61
- package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +0 -374
- package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +0 -243
- package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +0 -1139
- package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +0 -326
- package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +0 -184
- package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +0 -396
- package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +0 -168
- package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +0 -10
- package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +0 -194
- package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +0 -348
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +0 -141
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +0 -43
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +0 -18
- package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +0 -64
- package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +0 -31
- package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +0 -358
- package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +0 -25
- package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +0 -39
- package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +0 -107
- package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +0 -96
- package/skills/wix-headless-replatform/scripts/site-clone.mjs +0 -658
- package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +0 -29
- package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +0 -669
- package/skills/wix-headless-replatform/scripts/visual-qa.mjs +0 -370
- package/skills/wix-import/SKILL.md +0 -90
- package/skills/wix-replatform/.publish-manifest.json +0 -8
- package/skills/wix-replatform/CLI.md +0 -162
- package/skills/wix-replatform/README.md +0 -52
- package/skills/wix-replatform/SKILL.md +0 -238
- package/skills/wix-replatform/console/account.css +0 -1
- package/skills/wix-replatform/console/app.css +0 -1
- package/skills/wix-replatform/console/app.js +0 -117
- package/skills/wix-replatform/console/index.html +0 -4
- package/skills/wix-replatform/console/json.css +0 -11
- package/skills/wix-replatform/lib/agent-adapters/index.js +0 -71
- package/skills/wix-replatform/lib/app-page-routing.js +0 -75
- package/skills/wix-replatform/lib/artifact-freshness.js +0 -225
- package/skills/wix-replatform/lib/blocked-data-requests.js +0 -427
- package/skills/wix-replatform/lib/census-reconciliation.js +0 -426
- package/skills/wix-replatform/lib/completion-report.js +0 -1580
- package/skills/wix-replatform/lib/config-env.js +0 -133
- package/skills/wix-replatform/lib/confirmed-pictures.js +0 -212
- package/skills/wix-replatform/lib/dependency-readiness.js +0 -423
- package/skills/wix-replatform/lib/dependency-recovery.js +0 -21
- package/skills/wix-replatform/lib/destination-choice.js +0 -163
- package/skills/wix-replatform/lib/destination-handoff.js +0 -62
- package/skills/wix-replatform/lib/destination-http.js +0 -81
- package/skills/wix-replatform/lib/destination-route.js +0 -98
- package/skills/wix-replatform/lib/destination.js +0 -919
- package/skills/wix-replatform/lib/discovered-census.js +0 -231
- package/skills/wix-replatform/lib/discovered-set-status.js +0 -255
- package/skills/wix-replatform/lib/document-url-guard.js +0 -203
- package/skills/wix-replatform/lib/entity-qa-attestation.js +0 -339
- package/skills/wix-replatform/lib/entity-verification.js +0 -18
- package/skills/wix-replatform/lib/execution-capability.js +0 -120
- package/skills/wix-replatform/lib/execution-log.js +0 -170
- package/skills/wix-replatform/lib/execution-manifest.js +0 -203
- package/skills/wix-replatform/lib/execution-state.js +0 -195
- package/skills/wix-replatform/lib/expectations-ledger.js +0 -96
- package/skills/wix-replatform/lib/generated-plugin-handoff.js +0 -140
- package/skills/wix-replatform/lib/import-readiness-contract.js +0 -23
- package/skills/wix-replatform/lib/import-recovery.js +0 -1107
- package/skills/wix-replatform/lib/imported-redirect-targets.js +0 -608
- package/skills/wix-replatform/lib/internal-link-reconciliation.js +0 -166
- package/skills/wix-replatform/lib/link-audit.js +0 -173
- package/skills/wix-replatform/lib/link-census.js +0 -194
- package/skills/wix-replatform/lib/link-plan.js +0 -148
- package/skills/wix-replatform/lib/link-verification.js +0 -274
- package/skills/wix-replatform/lib/link-write-journal.js +0 -42
- package/skills/wix-replatform/lib/local-state.js +0 -1481
- package/skills/wix-replatform/lib/member-completion.js +0 -658
- package/skills/wix-replatform/lib/member-crosswalk.js +0 -69
- package/skills/wix-replatform/lib/member-outcome-registry.js +0 -265
- package/skills/wix-replatform/lib/migration-completion.js +0 -311
- package/skills/wix-replatform/lib/operator-identity.js +0 -47
- package/skills/wix-replatform/lib/orchestration-decisions.js +0 -248
- package/skills/wix-replatform/lib/orchestration-preflight.js +0 -525
- package/skills/wix-replatform/lib/orchestration-router.js +0 -698
- package/skills/wix-replatform/lib/orchestration-state.js +0 -631
- package/skills/wix-replatform/lib/order-reference-readiness.js +0 -30
- package/skills/wix-replatform/lib/payments-outcome-registry.js +0 -200
- package/skills/wix-replatform/lib/plugin-cms-fallback.js +0 -618
- package/skills/wix-replatform/lib/preservation-approval-stamp.js +0 -54
- package/skills/wix-replatform/lib/product-media-deferral.js +0 -96
- package/skills/wix-replatform/lib/progress-log.js +0 -240
- package/skills/wix-replatform/lib/progress-log.sh +0 -140
- package/skills/wix-replatform/lib/read-back-approval.js +0 -184
- package/skills/wix-replatform/lib/read-back-comparison.js +0 -136
- package/skills/wix-replatform/lib/read-back-contract.js +0 -243
- package/skills/wix-replatform/lib/read-back-extract.js +0 -118
- package/skills/wix-replatform/lib/read-back-gate.js +0 -734
- package/skills/wix-replatform/lib/read-back-reads.js +0 -94
- package/skills/wix-replatform/lib/read-back-state.js +0 -107
- package/skills/wix-replatform/lib/read-back-summary.js +0 -81
- package/skills/wix-replatform/lib/rerun-conflicts.js +0 -334
- package/skills/wix-replatform/lib/run-controller.js +0 -401
- package/skills/wix-replatform/lib/seo-outcome-registry.js +0 -45
- package/skills/wix-replatform/lib/setup-verification.js +0 -148
- package/skills/wix-replatform/lib/source-access.js +0 -231
- package/skills/wix-replatform/lib/source-coverage.js +0 -1130
- package/skills/wix-replatform/lib/source-secrets.js +0 -277
- package/skills/wix-replatform/lib/structured-link-patch.js +0 -59
- package/skills/wix-replatform/lib/task-state.js +0 -110
- package/skills/wix-replatform/lib/url-preservation-report.js +0 -319
- package/skills/wix-replatform/lib/url-preservation-state.js +0 -739
- package/skills/wix-replatform/lib/url-redirect-plan.js +0 -728
- package/skills/wix-replatform/lib/url-verification.js +0 -315
- package/skills/wix-replatform/lib/user-action-effects.js +0 -42
- package/skills/wix-replatform/lib/user-actions.js +0 -264
- package/skills/wix-replatform/lib/website-handoff.js +0 -1220
- package/skills/wix-replatform/lib/wix-client-callers.js +0 -54
- package/skills/wix-replatform/lib/wix-dashboard-url.js +0 -35
- package/skills/wix-replatform/lib/write-verification-state.js +0 -92
- package/skills/wix-replatform/lib/write-verification.js +0 -274
- package/skills/wix-replatform/resources/rp-destination/SKILL.md +0 -137
- package/skills/wix-replatform/resources/rp-discovery/SKILL.md +0 -357
- package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +0 -47
- package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +0 -1369
- package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +0 -70
- package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +0 -482
- package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +0 -442
- package/skills/wix-replatform/resources/rp-execute-setup/scripts/mint-token.sh +0 -64
- package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +0 -112
- package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +0 -143
- package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +0 -244
- package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +0 -3158
- package/skills/wix-replatform/resources/rp-mapper/SKILL.md +0 -947
- package/skills/wix-replatform/resources/rp-mapper/lib/mapping-resolve.js +0 -217
- package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +0 -303
- package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +0 -88
- package/skills/wix-replatform/resources/rp-mapper/scripts/resolve-mapping.js +0 -148
- package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +0 -378
- package/skills/wix-replatform/resources/rp-preflight/SKILL.md +0 -40
- package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +0 -55
- package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +0 -60
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +0 -89
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +0 -36
- package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +0 -123
- package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +0 -124
- package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +0 -522
- package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +0 -56
- package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +0 -91
- package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +0 -255
- package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +0 -253
- package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +0 -44
- package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +0 -481
- package/skills/wix-replatform/resources/rp-source-csv/lib/canonical-record.js +0 -136
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fingerprint.js +0 -310
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-layout.js +0 -1081
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-parse.js +0 -618
- package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +0 -969
- package/skills/wix-replatform/resources/rp-source-csv/source-schema.example.json +0 -196
- package/skills/wix-replatform/resources/rp-source-csv/vendors/bigcommerce.json +0 -66
- package/skills/wix-replatform/resources/rp-source-csv/vendors/magento.json +0 -60
- package/skills/wix-replatform/resources/rp-source-csv/vendors/shopify.json +0 -95
- package/skills/wix-replatform/resources/rp-source-csv/vendors/woocommerce.json +0 -82
- package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +0 -66
- package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +0 -153
- package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +0 -394
- package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +0 -200
- package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +0 -34
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +0 -44
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +0 -1470
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +0 -446
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +0 -474
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +0 -879
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +0 -426
- package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +0 -24
- package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +0 -18
- package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +0 -40
- package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +0 -76
- package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +0 -51
- package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +0 -35
- package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +0 -20
- package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +0 -18
- package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +0 -31
- package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +0 -21
- package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +0 -21
- package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +0 -30
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +0 -150
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +0 -36
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +0 -48
- package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +0 -20
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +0 -8
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +0 -6
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +0 -8
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +0 -8
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +0 -12
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +0 -6
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +0 -13
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +0 -13
- package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +0 -73
- package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +0 -13
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +0 -693
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +0 -283
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +0 -191
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +0 -115
- package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +0 -201
- package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +0 -146
- package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +0 -970
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +0 -73
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +0 -115
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +0 -91
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +0 -440
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +0 -125
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +0 -252
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +0 -183
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +0 -333
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +0 -426
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +0 -400
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +0 -633
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +0 -1127
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +0 -194
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +0 -100
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +0 -157
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +0 -234
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +0 -101
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +0 -755
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +0 -1074
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +0 -149
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +0 -25
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +0 -444
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +0 -186
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +0 -1422
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +0 -343
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +0 -680
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +0 -272
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +0 -373
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +0 -101
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +0 -81
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +0 -128
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +0 -18
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +0 -104
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +0 -44
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +0 -49
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +0 -94
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +0 -863
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +0 -52
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +0 -161
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +0 -180
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +0 -286
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +0 -79
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +0 -120
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +0 -128
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +0 -88
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +0 -80
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +0 -46
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +0 -55
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +0 -99
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +0 -55
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +0 -160
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +0 -81
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +0 -60
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +0 -74
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +0 -75
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +0 -60
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +0 -44
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +0 -57
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +0 -141
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +0 -54
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +0 -158
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +0 -97
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +0 -86
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +0 -90
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +0 -51
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +0 -103
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +0 -2409
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +0 -273
- package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +0 -11
- package/skills/wix-replatform/resources/rp-source-wordpress/source-schema.example.json +0 -71
- package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +0 -13
- package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +0 -1046
- package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +0 -36
- package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +0 -57
- package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +0 -322
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +0 -70
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +0 -29
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +0 -71
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +0 -83
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +0 -95
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +0 -66
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +0 -332
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +0 -75
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +0 -181
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +0 -130
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +0 -180
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +0 -161
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +0 -25
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +0 -67
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +0 -75
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +0 -41
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +0 -204
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +0 -27
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +0 -275
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +0 -105
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +0 -77
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +0 -297
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +0 -44
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +0 -171
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +0 -182
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +0 -129
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +0 -192
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +0 -123
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +0 -85
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +0 -112
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +0 -191
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +0 -164
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +0 -462
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +0 -122
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +0 -98
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +0 -86
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +0 -128
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +0 -38
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +0 -73
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +0 -107
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +0 -89
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +0 -118
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +0 -93
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +0 -86
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +0 -56
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +0 -121
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +0 -134
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +0 -41
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +0 -50
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +0 -87
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +0 -130
- package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +0 -1418
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +0 -41
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +0 -24
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +0 -75
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +0 -71
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +0 -119
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +0 -23
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +0 -71
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +0 -82
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +0 -77
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +0 -205
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +0 -41
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +0 -46
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +0 -137
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +0 -133
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +0 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +0 -36
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +0 -71
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +0 -67
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +0 -72
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +0 -74
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +0 -69
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +0 -61
- package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +0 -111
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +0 -109
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +0 -73
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +0 -148
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +0 -91
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +0 -79
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +0 -32
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +0 -49
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +0 -103
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +0 -203
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +0 -42
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +0 -119
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +0 -111
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +0 -81
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +0 -241
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +0 -118
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +0 -111
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +0 -79
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +0 -221
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +0 -84
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +0 -178
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +0 -87
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +0 -106
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +0 -64
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +0 -119
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +0 -94
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +0 -113
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +0 -65
- package/skills/wix-replatform/resources/rp-target-wix/lib/audit-summary.js +0 -64
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +0 -165
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +0 -60
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +0 -201
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +0 -306
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +0 -229
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +0 -55
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +0 -715
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +0 -567
- package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +0 -73
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +0 -194
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +0 -133
- package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +0 -150
- package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +0 -491
- package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +0 -104
- package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +0 -673
- package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +0 -835
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +0 -119
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +0 -566
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +0 -249
- package/skills/wix-replatform/resources/rp-target-wix/lib/ndjson.js +0 -260
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +0 -63
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +0 -187
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +0 -64
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +0 -1027
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +0 -90
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +0 -420
- package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +0 -177
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +0 -151
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +0 -723
- package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +0 -353
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +0 -1437
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +0 -354
- package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +0 -134
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +0 -221
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +0 -248
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +0 -321
- package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +0 -231
- package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +0 -28
- package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +0 -14
- package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +0 -34
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +0 -388
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +0 -255
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +0 -6041
- package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +0 -3
- package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +0 -150
- package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +0 -69
- package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge.js +0 -100
- package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +0 -112
- package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +0 -484
- package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +0 -318
- package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +0 -2831
- package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +0 -318
- package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +0 -83
- package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +0 -243
- package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +0 -94
- package/skills/wix-replatform/scripts/artifact-freshness.js +0 -76
- package/skills/wix-replatform/scripts/census-reconciliation.js +0 -25
- package/skills/wix-replatform/scripts/cms-fallback.js +0 -89
- package/skills/wix-replatform/scripts/discovered-census.js +0 -26
- package/skills/wix-replatform/scripts/discovered-set-status.js +0 -33
- package/skills/wix-replatform/scripts/entity-qa-attestation.js +0 -130
- package/skills/wix-replatform/scripts/execution-health-check.js +0 -415
- package/skills/wix-replatform/scripts/execution-manifest-validate.js +0 -43
- package/skills/wix-replatform/scripts/execution-state-prepare.js +0 -128
- package/skills/wix-replatform/scripts/expectations-ledger.js +0 -44
- package/skills/wix-replatform/scripts/import-contract-verify.js +0 -183
- package/skills/wix-replatform/scripts/internal-link-audit.js +0 -90
- package/skills/wix-replatform/scripts/item-seo-tags-verify.js +0 -205
- package/skills/wix-replatform/scripts/migration-completion.js +0 -76
- package/skills/wix-replatform/scripts/orchestration-preflight.js +0 -67
- package/skills/wix-replatform/scripts/orchestration-route.js +0 -77
- package/skills/wix-replatform/scripts/orchestration-state.js +0 -381
- package/skills/wix-replatform/scripts/read-back-gate.js +0 -175
- package/skills/wix-replatform/scripts/replatform-console.js +0 -146
- package/skills/wix-replatform/scripts/replatform.js +0 -436
- package/skills/wix-replatform/scripts/source-secrets.js +0 -77
- package/skills/wix-replatform/scripts/url-redirects.js +0 -286
- package/skills/wix-replatform/scripts/user-action.js +0 -58
- package/skills/wix-replatform/scripts/website-handoff-generate.js +0 -64
- package/skills/wix-replatform/scripts/wix-dashboard-url.js +0 -54
- package/skills/wix-replatform/scripts/wix-destination.js +0 -143
- package/skills/wix-replatform/scripts/wix-headless-scaffold.js +0 -762
- package/skills/wix-vibe-headless/SKILL.md +0 -183
- package/skills/wix-vibe-headless/install/deploy.cjs +0 -221
- package/skills/wix-vibe-headless/install/pin-agents-md.cjs +0 -35
- package/skills/wix-vibe-headless/platforms/README.md +0 -26
- package/skills/wix-vibe-headless/platforms/base44-ecom-light-seed-with-install.md +0 -127
- package/skills/wix-vibe-headless/platforms/base44-ecom-light-seed.md +0 -121
- package/skills/wix-vibe-headless/platforms/base44-ecom-light.md +0 -87
- package/skills/wix-vibe-headless/platforms/base44.md +0 -148
- package/skills/wix-vibe-headless/platforms/generic.md +0 -132
- package/skills/wix-vibe-headless/references/_shared/nav/nav.tanstack.js +0 -30
- package/skills/wix-vibe-headless/references/_shared/routing.md +0 -86
- package/skills/wix-vibe-headless/references/blog/INSTRUCTIONS.md +0 -270
- package/skills/wix-vibe-headless/references/blog/app/components/PostCard.jsx +0 -43
- package/skills/wix-vibe-headless/references/blog/app/components/PostChips.jsx +0 -25
- package/skills/wix-vibe-headless/references/blog/app/components/PostGrid.jsx +0 -15
- package/skills/wix-vibe-headless/references/blog/app/context/TaxonomyContext.jsx +0 -35
- package/skills/wix-vibe-headless/references/blog/app/hooks/usePostDetail.js +0 -38
- package/skills/wix-vibe-headless/references/blog/app/pages/Blog.jsx +0 -40
- package/skills/wix-vibe-headless/references/blog/app/pages/CategoryPage.jsx +0 -54
- package/skills/wix-vibe-headless/references/blog/app/pages/PostDetail.jsx +0 -65
- package/skills/wix-vibe-headless/references/blog/app/pages/TagPage.jsx +0 -50
- package/skills/wix-vibe-headless/references/blog/app/rest/wix-blog.js +0 -217
- package/skills/wix-vibe-headless/references/blog/seed/SEED.md +0 -99
- package/skills/wix-vibe-headless/references/blog/seed/seed-blog.cjs +0 -269
- package/skills/wix-vibe-headless/references/bookings/INSTRUCTIONS.md +0 -342
- package/skills/wix-vibe-headless/references/bookings/app/components/BookingForm.jsx +0 -65
- package/skills/wix-vibe-headless/references/bookings/app/components/RentalDurationPicker.jsx +0 -67
- package/skills/wix-vibe-headless/references/bookings/app/components/ServiceCard.jsx +0 -47
- package/skills/wix-vibe-headless/references/bookings/app/components/ServiceGrid.jsx +0 -13
- package/skills/wix-vibe-headless/references/bookings/app/components/SlotPicker.jsx +0 -126
- package/skills/wix-vibe-headless/references/bookings/app/hooks/useRentalDuration.js +0 -128
- package/skills/wix-vibe-headless/references/bookings/app/hooks/useServiceDetail.js +0 -110
- package/skills/wix-vibe-headless/references/bookings/app/hooks/useServices.js +0 -58
- package/skills/wix-vibe-headless/references/bookings/app/lib/serviceFacts.js +0 -95
- package/skills/wix-vibe-headless/references/bookings/app/pages/ServiceDetail.jsx +0 -94
- package/skills/wix-vibe-headless/references/bookings/app/pages/Services.jsx +0 -89
- package/skills/wix-vibe-headless/references/bookings/app/rest/wix-bookings-checkout.js +0 -148
- package/skills/wix-vibe-headless/references/bookings/app/rest/wix-bookings-rentals.js +0 -250
- package/skills/wix-vibe-headless/references/bookings/app/rest/wix-bookings-services.js +0 -300
- package/skills/wix-vibe-headless/references/bookings/seed/SEED.md +0 -154
- package/skills/wix-vibe-headless/references/bookings/seed/seed-bookings.cjs +0 -333
- package/skills/wix-vibe-headless/references/bookings/seed/seed-rentals.cjs +0 -267
- package/skills/wix-vibe-headless/references/cms/INSTRUCTIONS.md +0 -178
- package/skills/wix-vibe-headless/references/cms/app/collection.config.js +0 -31
- package/skills/wix-vibe-headless/references/cms/app/lib/wixImage.js +0 -18
- package/skills/wix-vibe-headless/references/cms/app/rest/wix-cms.js +0 -231
- package/skills/wix-vibe-headless/references/cms/seed/SEED.md +0 -145
- package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +0 -88
- package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +0 -112
- package/skills/wix-vibe-headless/references/donations/seed/SEED.md +0 -11
- package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +0 -258
- package/skills/wix-vibe-headless/references/events/INSTRUCTIONS.md +0 -267
- package/skills/wix-vibe-headless/references/events/app/components/CategoryFilter.jsx +0 -23
- package/skills/wix-vibe-headless/references/events/app/components/EventCard.jsx +0 -43
- package/skills/wix-vibe-headless/references/events/app/components/EventGrid.jsx +0 -13
- package/skills/wix-vibe-headless/references/events/app/components/EventRegistration.jsx +0 -29
- package/skills/wix-vibe-headless/references/events/app/components/RsvpForm.jsx +0 -57
- package/skills/wix-vibe-headless/references/events/app/components/TicketPicker.jsx +0 -78
- package/skills/wix-vibe-headless/references/events/app/hooks/useEventDetail.js +0 -27
- package/skills/wix-vibe-headless/references/events/app/hooks/useEventsList.js +0 -54
- package/skills/wix-vibe-headless/references/events/app/hooks/useRsvpForm.js +0 -40
- package/skills/wix-vibe-headless/references/events/app/hooks/useTicketing.js +0 -81
- package/skills/wix-vibe-headless/references/events/app/pages/EventDetail.jsx +0 -48
- package/skills/wix-vibe-headless/references/events/app/pages/Events.jsx +0 -36
- package/skills/wix-vibe-headless/references/events/app/rest/wix-events-browse.js +0 -136
- package/skills/wix-vibe-headless/references/events/app/rest/wix-events-registration.js +0 -187
- package/skills/wix-vibe-headless/references/events/seed/SEED.md +0 -103
- package/skills/wix-vibe-headless/references/events/seed/seed-events.cjs +0 -251
- package/skills/wix-vibe-headless/references/forms/INSTRUCTIONS.md +0 -487
- package/skills/wix-vibe-headless/references/forms/app/hooks/useWixForm.js +0 -425
- package/skills/wix-vibe-headless/references/forms/app/lib/wix-form-schema-utils.js +0 -187
- package/skills/wix-vibe-headless/references/forms/app/rest/wix-forms-submissions.js +0 -238
- package/skills/wix-vibe-headless/references/forms/app/rest/wix-forms.js +0 -108
- package/skills/wix-vibe-headless/references/forms/seed/SEED.md +0 -1836
- package/skills/wix-vibe-headless/references/members/INSTRUCTIONS.md +0 -328
- package/skills/wix-vibe-headless/references/members/app/components/LoginForm.jsx +0 -101
- package/skills/wix-vibe-headless/references/members/app/components/MemberMenu.jsx +0 -33
- package/skills/wix-vibe-headless/references/members/app/components/RequireAuth.jsx +0 -21
- package/skills/wix-vibe-headless/references/members/app/components/SocialButtons.jsx +0 -29
- package/skills/wix-vibe-headless/references/members/app/context/MemberContext.jsx +0 -54
- package/skills/wix-vibe-headless/references/members/app/hooks/useLoginForm.js +0 -77
- package/skills/wix-vibe-headless/references/members/app/pages/Account.jsx +0 -36
- package/skills/wix-vibe-headless/references/members/app/pages/Callback.jsx +0 -32
- package/skills/wix-vibe-headless/references/members/app/pages/Login.jsx +0 -35
- package/skills/wix-vibe-headless/references/members/app/rest/wix-members-auth.js +0 -390
- package/skills/wix-vibe-headless/references/members/install/Register.jsx +0 -22
- package/skills/wix-vibe-headless/references/members/seed/SEED.md +0 -21
- package/skills/wix-vibe-headless/references/portfolio/INSTRUCTIONS.md +0 -270
- package/skills/wix-vibe-headless/references/portfolio/app/components/CollectionCard.jsx +0 -31
- package/skills/wix-vibe-headless/references/portfolio/app/components/CollectionGrid.jsx +0 -15
- package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectCard.jsx +0 -39
- package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectGrid.jsx +0 -15
- package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectMedia.jsx +0 -29
- package/skills/wix-vibe-headless/references/portfolio/app/hooks/useCollectionProjects.js +0 -35
- package/skills/wix-vibe-headless/references/portfolio/app/hooks/usePortfolioGallery.js +0 -27
- package/skills/wix-vibe-headless/references/portfolio/app/hooks/useProjectDetail.js +0 -25
- package/skills/wix-vibe-headless/references/portfolio/app/pages/CollectionPage.jsx +0 -39
- package/skills/wix-vibe-headless/references/portfolio/app/pages/Portfolio.jsx +0 -27
- package/skills/wix-vibe-headless/references/portfolio/app/pages/ProjectDetail.jsx +0 -60
- package/skills/wix-vibe-headless/references/portfolio/app/rest/wix-portfolio.js +0 -223
- package/skills/wix-vibe-headless/references/portfolio/seed/SEED.md +0 -90
- package/skills/wix-vibe-headless/references/portfolio/seed/seed-portfolio.cjs +0 -236
- package/skills/wix-vibe-headless/references/pricing-plans/INSTRUCTIONS.md +0 -280
- package/skills/wix-vibe-headless/references/pricing-plans/app/components/OrderCard.jsx +0 -35
- package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanCard.jsx +0 -48
- package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanGrid.jsx +0 -16
- package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanPrice.jsx +0 -35
- package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/useMyPlans.js +0 -25
- package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/usePlanDetail.js +0 -28
- package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/usePlans.js +0 -30
- package/skills/wix-vibe-headless/references/pricing-plans/app/pages/MyPlans.jsx +0 -30
- package/skills/wix-vibe-headless/references/pricing-plans/app/pages/PlanDetail.jsx +0 -53
- package/skills/wix-vibe-headless/references/pricing-plans/app/pages/Plans.jsx +0 -28
- package/skills/wix-vibe-headless/references/pricing-plans/app/rest/wix-pricing-plans.js +0 -157
- package/skills/wix-vibe-headless/references/pricing-plans/seed/SEED.md +0 -82
- package/skills/wix-vibe-headless/references/pricing-plans/seed/seed-pricing-plans.cjs +0 -251
- package/skills/wix-vibe-headless/references/rentals/INSTRUCTIONS.md +0 -13
- package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +0 -290
- package/skills/wix-vibe-headless/references/restaurants/app/components/ItemDialog.jsx +0 -81
- package/skills/wix-vibe-headless/references/restaurants/app/components/MenuItemCard.jsx +0 -71
- package/skills/wix-vibe-headless/references/restaurants/app/components/MenuList.jsx +0 -43
- package/skills/wix-vibe-headless/references/restaurants/app/components/OrderCartButton.jsx +0 -21
- package/skills/wix-vibe-headless/references/restaurants/app/components/OrderCartDrawer.jsx +0 -72
- package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +0 -66
- package/skills/wix-vibe-headless/references/restaurants/app/hooks/useItemOrder.js +0 -32
- package/skills/wix-vibe-headless/references/restaurants/app/hooks/useReservation.js +0 -73
- package/skills/wix-vibe-headless/references/restaurants/app/pages/Menu.jsx +0 -28
- package/skills/wix-vibe-headless/references/restaurants/app/pages/Reservations.jsx +0 -102
- package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-menu.js +0 -224
- package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +0 -218
- package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-reservations.js +0 -107
- package/skills/wix-vibe-headless/references/restaurants/seed/SEED.md +0 -176
- package/skills/wix-vibe-headless/references/restaurants/seed/seed-restaurants.cjs +0 -452
- package/skills/wix-vibe-headless/references/shared/app/components/WixManageBanner.jsx +0 -56
- package/skills/wix-vibe-headless/references/shared/app/lib/nav.js +0 -9
- package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +0 -185
- package/skills/wix-vibe-headless/references/shared/app/rest/wix-config.js +0 -8
- package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +0 -471
- package/skills/wix-vibe-headless/references/storefront/app/components/CartButton.jsx +0 -20
- package/skills/wix-vibe-headless/references/storefront/app/components/CartDrawer.jsx +0 -167
- package/skills/wix-vibe-headless/references/storefront/app/context/CartContext.jsx +0 -83
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductCard.js +0 -104
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductDetail.js +0 -163
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useShop.js +0 -83
- package/skills/wix-vibe-headless/references/storefront/app/hooks/useVariantOptions.js +0 -76
- package/skills/wix-vibe-headless/references/storefront/app/lib/storeImage.js +0 -64
- package/skills/wix-vibe-headless/references/storefront/app/rest/wix-store-cart.js +0 -176
- package/skills/wix-vibe-headless/references/storefront/app/rest/wix-store-catalog.js +0 -218
- package/skills/wix-vibe-headless/references/storefront/seed/SEED.md +0 -174
- package/skills/wix-vibe-headless/references/storefront/seed/seed-store.cjs +0 -546
|
@@ -1,970 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: rp-source-wordpress
|
|
3
|
-
description: >-
|
|
4
|
-
WordPress and WooCommerce source adapter: REST capture, auth, pagination, and read
|
|
5
|
-
contract for codegen. Use when the source platform is WordPress or WooCommerce.
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# rp-source-wordpress
|
|
9
|
-
|
|
10
|
-
WordPress / WooCommerce **source adapter**. Owns every WordPress-specific detail the
|
|
11
|
-
platform-agnostic skills must not hardcode: how to capture the schema, how to read the
|
|
12
|
-
data, auth models, pagination, and REST quirks.
|
|
13
|
-
|
|
14
|
-
## When this skill is used
|
|
15
|
-
|
|
16
|
-
This is not a stage in the migration flow — it is a reference consulted by two stages:
|
|
17
|
-
|
|
18
|
-
- **`rp-discovery`** consults the *Capture* section to sample the source and produce the
|
|
19
|
-
canonical `source-profile.md` + `source-schema.json`.
|
|
20
|
-
- **`rp-import-codegen`** consults the *Read contract* section to generate a reader that
|
|
21
|
-
bulk-extracts WordPress data correctly (auth, pagination, `wc/v3` vs `wp/v2`) into
|
|
22
|
-
durable project-local files for the later import step.
|
|
23
|
-
|
|
24
|
-
`rp-execute-import` never consults this skill — by the time execution runs, the
|
|
25
|
-
WordPress-specific knowledge is already baked into the generated reader code. Keeping the
|
|
26
|
-
WordPress knowledge here is what lets the rest of the workflow stay platform-agnostic.
|
|
27
|
-
|
|
28
|
-
For app routing and internal-link reconciliation, the generated reader also enumerates the captured source roots, declared
|
|
29
|
-
source hosts, source permalink/alias evidence, and each record's containing source page.
|
|
30
|
-
It passes those facts to the shared `internal-link-audit.js plan` input after backend
|
|
31
|
-
import. Do not infer the containing page from a file basename or assume a default
|
|
32
|
-
WooCommerce path. The deterministic census records every captured file as scanned,
|
|
33
|
-
unreadable or unsupported; unsupported documents, dynamic URLs and missing captures
|
|
34
|
-
remain coverage items. Never scan `config/*.env` or execute captured source code.
|
|
35
|
-
|
|
36
|
-
## Platform identity
|
|
37
|
-
|
|
38
|
-
- Source platform: WordPress (core REST `wp/v2`), optionally WooCommerce (`wc/v3`).
|
|
39
|
-
- Detect by hitting `<base-url>/wp-json/` — the REST index lists advertised namespaces.
|
|
40
|
-
- Set `"platform": "wordpress"` (and note WooCommerce presence in `sourceMeta`) in the
|
|
41
|
-
emitted `source-schema.json`. This describes the discovery artifact, not the orchestration
|
|
42
|
-
decision.
|
|
43
|
-
- Once discovery confirms WooCommerce, record `sourcePlatform.value=woocommerce` in
|
|
44
|
-
`orchestration/decisions.json` and use `config/source.woocommerce.env`. Otherwise record
|
|
45
|
-
`sourcePlatform.value=wordpress` there and use `config/source.wordpress.env`. Generated
|
|
46
|
-
importers read that exact nested value — never the decision wrapper object and never the
|
|
47
|
-
nullable `orchestration/run.json` `sourcePlatform` field. The adapter remains
|
|
48
|
-
`rp-source-wordpress` in both cases.
|
|
49
|
-
|
|
50
|
-
## Capture (discovery-time)
|
|
51
|
-
|
|
52
|
-
Sampling the source to learn its shape — **not** a bulk export.
|
|
53
|
-
|
|
54
|
-
The Wix domain knowledge base may be used as a classifier supplement during synthesis,
|
|
55
|
-
but not as a sampling mandate. When a discovered WordPress/WooCommerce route matches a
|
|
56
|
-
known alias, annotate the emitted entity with `sourceMeta.candidateTargetRefs[]`; do not
|
|
57
|
-
turn that hint into a target decision here. Keep frontend, theme, runtime, admin, and
|
|
58
|
-
transient routes skipped by default even if a knowledge entry exists for a related
|
|
59
|
-
setup/config target.
|
|
60
|
-
|
|
61
|
-
After identifying the platform, verify `migrations/<project>/config/source.<platform>.env`.
|
|
62
|
-
For a confirmed WooCommerce source, this is `source.woocommerce.env`; for WordPress without
|
|
63
|
-
WooCommerce evidence, it is `source.wordpress.env`. Create the selected file if missing with
|
|
64
|
-
empty values:
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
WP_BASE_URL=
|
|
68
|
-
WP_USERNAME=
|
|
69
|
-
WP_APPLICATION_PASSWORD=
|
|
70
|
-
WMH2_MIGRATION_KEY=
|
|
71
|
-
WP_MEDIA_URL_REWRITE_FROM=
|
|
72
|
-
WP_MEDIA_URL_REWRITE_TO=
|
|
73
|
-
WC_CONSUMER_KEY=
|
|
74
|
-
WC_CONSUMER_SECRET=
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
Before requesting any WordPress / WooCommerce credentials for a URL-based migration, ask
|
|
78
|
-
the user which data scope they want:
|
|
79
|
-
|
|
80
|
-
- `public content only`
|
|
81
|
-
- `also include private/authenticated data`
|
|
82
|
-
|
|
83
|
-
This choice is mandatory and must be explicit. Do not ask for `WP_USERNAME`,
|
|
84
|
-
`WP_APPLICATION_PASSWORD`, or WooCommerce keys until the user chooses `also include
|
|
85
|
-
private/authenticated data`. Request `WMH2_MIGRATION_KEY` only when bridge-backed entities
|
|
86
|
-
are actually in scope and the detected source has no WooCommerce. Collect every sensitive
|
|
87
|
-
value through the secure Secrets Manager flow; do not ask the user to paste it into chat.
|
|
88
|
-
|
|
89
|
-
There are two independent scopes, and a complete run may need both credentials:
|
|
90
|
-
|
|
91
|
-
- **Private WordPress/WooCommerce REST** (`wp/v2`, `wc/v3`) requires a WordPress
|
|
92
|
-
Application Password (`WP_USERNAME` + `WP_APPLICATION_PASSWORD`).
|
|
93
|
-
- **`wix-wp-plugin-v2` bridge reads** use the Application Password path only when
|
|
94
|
-
WooCommerce is present, because that route requires `manage_woocommerce`. When the
|
|
95
|
-
source has no WooCommerce, collect `WMH2_MIGRATION_KEY` for bridge reads instead. The
|
|
96
|
-
key is generated and shown once on the plugin's wp-admin page at activation or rotation.
|
|
97
|
-
It never authenticates ordinary `wp/v2` or `wc/v3` reads.
|
|
98
|
-
|
|
99
|
-
Key sensitivity is predefined and does not change at runtime. Requiredness is separate
|
|
100
|
-
and may depend on the selected acquisition mode or source behavior.
|
|
101
|
-
|
|
102
|
-
| Key | Sensitivity | Requiredness |
|
|
103
|
-
|---|---|---|
|
|
104
|
-
| `WP_BASE_URL` | non-sensitive | Required for URL-based capture |
|
|
105
|
-
| `WP_USERNAME` | sensitive | Required for private/authenticated WordPress capture via Application Password |
|
|
106
|
-
| `WP_APPLICATION_PASSWORD` | sensitive | Required for private/authenticated WordPress capture via Application Password |
|
|
107
|
-
| `WMH2_MIGRATION_KEY` | sensitive | Required for `wix-wp-plugin-v2` bridge reads when the source has no WooCommerce; optional otherwise |
|
|
108
|
-
| `WP_MEDIA_URL_REWRITE_FROM` | non-sensitive | Optional |
|
|
109
|
-
| `WP_MEDIA_URL_REWRITE_TO` | non-sensitive | Optional |
|
|
110
|
-
| `WC_CONSUMER_KEY` | sensitive | Optional unless WooCommerce rejects the WordPress Application Password for `wc/v3` reads |
|
|
111
|
-
| `WC_CONSUMER_SECRET` | sensitive | Optional unless WooCommerce rejects the WordPress Application Password for `wc/v3` reads |
|
|
112
|
-
|
|
113
|
-
Required for a complete WordPress/WooCommerce capture:
|
|
114
|
-
|
|
115
|
-
- `WP_BASE_URL`
|
|
116
|
-
- `WP_USERNAME` + `WP_APPLICATION_PASSWORD` when private REST-visible data is in scope
|
|
117
|
-
- `WMH2_MIGRATION_KEY` additionally when bridge-backed entities are in scope and the
|
|
118
|
-
source has no WooCommerce
|
|
119
|
-
|
|
120
|
-
⚠️ **`WMH2_MIGRATION_KEY` only unblocks the plugin's own `/structure` and `/query` routes**
|
|
121
|
-
(`wix-wp-plugin-v2`'s `structure-bridge-plugin` entities — custom plugin tables with no REST
|
|
122
|
-
route) — `wp-discovery.js`/`wix-wp-plugin-v2-client.js` sign requests with it
|
|
123
|
-
automatically when the signed bridge path is selected. It does **not** authenticate
|
|
124
|
-
standard WordPress/WooCommerce REST (`wp/v2`, `wc/v3`) at all — reading posts, pages,
|
|
125
|
-
products, orders, customers, and every other REST-visible entity still requires the
|
|
126
|
-
Application Password. On a source site with no WooCommerce, the Application Password routes
|
|
127
|
-
are `manage_woocommerce`-gated and unusable by any user regardless, so the migration key is
|
|
128
|
-
the only credential that reaches the bridge. If no separate WordPress REST credential is
|
|
129
|
-
available, ordinary private content still cannot be captured through this adapter and needs
|
|
130
|
-
another source API or export.
|
|
131
|
-
|
|
132
|
-
`WC_CONSUMER_KEY` and `WC_CONSUMER_SECRET` are optional when WooCommerce accepts the
|
|
133
|
-
WordPress Application Password for `wc/v3` reads; ask for them only if WooCommerce routes
|
|
134
|
-
return 401/403 with the WordPress Application Password.
|
|
135
|
-
|
|
136
|
-
`WP_MEDIA_URL_REWRITE_FROM` and `WP_MEDIA_URL_REWRITE_TO` are optional. Use them when the
|
|
137
|
-
WordPress API is reached through a public tunnel but media/file URLs inside records still
|
|
138
|
-
point at `localhost` or another private origin. If they are blank, generated readers may
|
|
139
|
-
rewrite localhost/private origins to `WP_BASE_URL` when `WP_BASE_URL` is public.
|
|
140
|
-
|
|
141
|
-
`config/source.<platform>.env` is a secret-bearing file once it may contain real values.
|
|
142
|
-
Do not read it with whole-file commands that print its contents into tool output. Check
|
|
143
|
-
only whether the file exists and whether each required key is present/blank/missing; when
|
|
144
|
-
describing status, name keys only and never echo values.
|
|
145
|
-
|
|
146
|
-
1. Run the deterministic capture script **from this skill's directory** (the folder
|
|
147
|
-
containing this `SKILL.md`; see `CONVENTIONS.md`):
|
|
148
|
-
|
|
149
|
-
```
|
|
150
|
-
node scripts/wp-discovery.js --env-file <migrations-root>/<project>/config/source.<platform>.env --out-dir <migrations-root>/<project>/data/wp-discovery
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
It walks the REST index, runs one `OPTIONS` + a small `GET` sample per entity, and
|
|
154
|
-
writes per-entity markdown (routes, schemas, sample records, record counts,
|
|
155
|
-
relationships). `--env-file` is the preferred launch path for project-local
|
|
156
|
-
credential-bearing config because it avoids shell sourcing of secret-bearing files.
|
|
157
|
-
Pass direct auth options only when there is no project-local config yet.
|
|
158
|
-
For long runs, pass `--progress-log <path>` and poll it per
|
|
159
|
-
`CONVENTIONS.md#progress-log-polling`.
|
|
160
|
-
|
|
161
|
-
2. If the user chose `public content only`, run unauthenticated and keep the scope framed
|
|
162
|
-
as public-only. Do not pivot into asking for credentials unless the user changes scope.
|
|
163
|
-
|
|
164
|
-
3. **Credentials are required for a complete capture.** Without auth, only published
|
|
165
|
-
public content is reachable; drafts, WooCommerce (`wc/v3`), user PII, and private
|
|
166
|
-
fields return 401/403, making their `recordCount`/`inUse` unreliable. The script flags
|
|
167
|
-
this in its README under "Incomplete Capture (Authentication)" — do not treat an
|
|
168
|
-
unauthenticated run as authoritative.
|
|
169
|
-
|
|
170
|
-
**Author identity is a specific casualty of public-only capture.** Public
|
|
171
|
-
`/wp/v2/users` lists only users who authored public posts and exposes **no `roles`
|
|
172
|
-
and no emails** — admin vs editor vs contributor vs subscriber is indistinguishable.
|
|
173
|
-
Roles/capabilities require `context=edit` (App Password with `list_users`) or a DB
|
|
174
|
-
dump (`wp_usermeta` → `wp_capabilities`); WXR exports carry author login/email/display
|
|
175
|
-
name but no roles either. Vanilla WP has no guest-byline concept (every byline is a
|
|
176
|
-
user); plugin guest authors (Co-Authors Plus `guest-author` entities) are separate
|
|
177
|
-
non-user records. Record author capture mode in the source profile — it determines the
|
|
178
|
-
blog `authorAttributionMode` downstream (public-only → fallback/owner attribution;
|
|
179
|
-
authenticated → per-author mapping: administrators → owner user-member,
|
|
180
|
-
content roles → per-author members; subscribers/customers → **Wix contacts by
|
|
181
|
-
default** — a contact is the no-login CRM person entity and Contacts V5 upserts in
|
|
182
|
-
bulk — promote to full site members (1/sec serial, re-registration) only when
|
|
183
|
-
member-gated features are in scope. Every Wix member auto-creates its contact, so
|
|
184
|
-
member-first ordering: never pre-create a contact for someone who will become a
|
|
185
|
-
member. Note contacts cannot author blog posts or comments — bylines need members).
|
|
186
|
-
|
|
187
|
-
4. Distinguish **supported** entities (advertised by the REST index) from **used**
|
|
188
|
-
entities (those with `recordCount > 0`). Entities advertised but empty should be
|
|
189
|
-
flagged, not mapped as if they hold data.
|
|
190
|
-
|
|
191
|
-
5. **Backend data scope.** The capture script classifies REST routes before per-route
|
|
192
|
-
`OPTIONS` or sample `GET` requests. By default it samples backend data routes and skips
|
|
193
|
-
frontend, theme/editor, runtime session, admin dashboard, diagnostics, marketplace
|
|
194
|
-
setup, and integration/helper APIs. It writes the skipped-route audit trail to
|
|
195
|
-
`skipped-routes.json`.
|
|
196
|
-
|
|
197
|
-
It also always writes `source-coverage.json` (`rows: []` when clean): one row per entity
|
|
198
|
-
whose data request returned 401/403 (`auth-gated`) or failed with no records (an
|
|
199
|
-
OPTIONS-probe failure alone is not one), per backend data route skipped by rule, per
|
|
200
|
-
credential-bearing route never read (`not-recoverable`), and per unsupported route
|
|
201
|
-
namespace. Frontend, theme, admin and transient skips get no row. `rp-discovery` promotes it; never edit it by hand.
|
|
202
|
-
|
|
203
|
-
For WooCommerce, prefer canonical durable data APIs such as `wc/v3` over duplicated
|
|
204
|
-
`wc/v2`/`wc/v1` routes for authenticated/private commerce reads. For `public content only`
|
|
205
|
-
discovery, probe public Store API catalog routes before declaring commerce deferred:
|
|
206
|
-
`wc/store/v1/products` and `wc/store/v1/products/categories` are in-scope public
|
|
207
|
-
commerce data when present. Cart and checkout Store API routes remain out of scope as
|
|
208
|
-
runtime session state.
|
|
209
|
-
|
|
210
|
-
**Images: never read a field, always resolve.** An image reference in a WordPress-family
|
|
211
|
-
payload is a *set* of candidate URLs for one picture — the merchant's original upload plus
|
|
212
|
-
the crops WordPress generated from it. Which field holds the original varies by route, and
|
|
213
|
-
the two WooCommerce APIs disagree on the **same site**: on `wc/store/v1` `images[].src` is
|
|
214
|
-
the original, while on `wc/v3` it is resolved through WordPress's registered image sizes
|
|
215
|
-
and can be the *smallest* crop, because any theme or image-optimizer plugin may redefine
|
|
216
|
-
those sizes. Pass the whole reference to `resolveImageUrl` / `resolveImageUrls` in
|
|
217
|
-
`lib/wp-image-url.js` and use what it returns. It handles `src`, `thumbnail`,
|
|
218
|
-
`source_url`, `srcset`, `thumbnail_srcset`, and `media_details.sizes.*`, prefers the
|
|
219
|
-
original, falls back to the widest crop, percent-encodes the result, and retains the
|
|
220
|
-
attachment id as `sourceId` for the media-record check below.
|
|
221
|
-
|
|
222
|
-
**Product pictures require source-record confirmation in generated imports.** For the
|
|
223
|
-
exact orchestration identities `woocommerce` and `wordpress`, resolving the product
|
|
224
|
-
reference is only the first step. Vendor/use the shared root `lib/confirmed-pictures.js`:
|
|
225
|
-
collect the selected products' distinct positive `sourceId` values, call
|
|
226
|
-
`readSourceMediaRecords({ ids, source: { baseUrl, request: authenticatedWpRequest } })`,
|
|
227
|
-
where that wrapper delegates to `fetchJson` with the run's existing auth headers, then pass each
|
|
228
|
-
whole resolved gallery to `confirmPictures`. The read requests authenticated
|
|
229
|
-
`GET /wp/v2/media?include=<ids>&per_page=100` chunks in sorted groups of at most 100; each
|
|
230
|
-
chunk has one total 60-second transport deadline. The media record's `source_url` is the
|
|
231
|
-
evidence. Never infer an original from the filename and never construct a lookalike read or
|
|
232
|
-
confirmed list: provenance is private to the shared module.
|
|
233
|
-
|
|
234
|
-
A picture with no positive attachment id, no returned media record, or a media record in an
|
|
235
|
-
unreadable chunk is unconfirmed (`no-source-id`, `no-source-record`, or
|
|
236
|
-
`source-unreadable`). One unconfirmed picture defers the entire product gallery; continue
|
|
237
|
-
with non-media product fields and follow `rp-import-codegen`'s ledger/recovery contract.
|
|
238
|
-
Quick mode is unchanged and does not use this boundary.
|
|
239
|
-
|
|
240
|
-
⚠️ This is not optional on the public path just because `src` happens to be right there
|
|
241
|
-
today. Same call, everywhere — a contract test pins the Store API no-op, so a change in
|
|
242
|
-
that behaviour surfaces as a test failure rather than as a merchant's blurry storefront.
|
|
243
|
-
|
|
244
|
-
⚠️ The destination gives one attempt. Wix copies the single URL you send and generates
|
|
245
|
-
every derivative from it, with no way to raise quality afterwards, so a crop shipped here
|
|
246
|
-
is that product's permanent ceiling. When `resolvedIsCrop()` is true the source genuinely
|
|
247
|
-
had nothing better — report those images in the run's own record rather than shipping them
|
|
248
|
-
silently.
|
|
249
|
-
|
|
250
|
-
6. **Plugin coverage runs automatically.** Plugin handling is a deterministic pre-pass plus
|
|
251
|
-
declarative profiles, not prose guesswork — see "Plugin coverage" below. The capture
|
|
252
|
-
script writes `plugin-inventory.json` and `plugin-coverage.json` alongside the per-entity
|
|
253
|
-
files. Never hand-map a plugin from memory; consult the profiles through
|
|
254
|
-
`scripts/plugin-knowledge.js`.
|
|
255
|
-
|
|
256
|
-
7. **Localhost sources and media URLs.** A source at `localhost`, `127.0.0.1`, or another
|
|
257
|
-
private-only host is valid for discovery and source reads from the user's machine.
|
|
258
|
-
However, Wix Media import fetches files from the URL using Wix servers, so media URLs
|
|
259
|
-
like `http://localhost:8090/wp-content/uploads/...` are not reachable by Wix during a
|
|
260
|
-
live import. This is optional setup and, as far as we know today, only affects media
|
|
261
|
-
import:
|
|
262
|
-
- Prefer exposing the local source through a temporary public HTTPS tunnel such as
|
|
263
|
-
ngrok before live media import.
|
|
264
|
-
- Or explicitly skip/defer media import and continue with non-media entities.
|
|
265
|
-
- If using ngrok on macOS:
|
|
266
|
-
1. Install: `brew install ngrok`
|
|
267
|
-
2. Add an authtoken from the ngrok dashboard:
|
|
268
|
-
`ngrok config add-authtoken "<YOUR_AUTHTOKEN>"`
|
|
269
|
-
3. Expose the local source port, for example: `ngrok http 8090`
|
|
270
|
-
4. Set the source base URL to the HTTPS forwarding URL:
|
|
271
|
-
`export WP_BASE_URL=https://<id>.ngrok-free.app`
|
|
272
|
-
Record this in `source-profile.md` when the captured source URL is localhost, and note
|
|
273
|
-
whether media will use the tunnel or be skipped/deferred.
|
|
274
|
-
|
|
275
|
-
The raw capture is evidence, not a hand-off artifact. `rp-discovery` synthesizes it into
|
|
276
|
-
the canonical artifacts and records traceability pointers (`rawDiscovery`, per-entity
|
|
277
|
-
`rawFile`).
|
|
278
|
-
|
|
279
|
-
## Payment gateways: read the summary, never the route
|
|
280
|
-
|
|
281
|
-
`GET /wc/v3/payment_gateways` and `/wc/v3/payment_gateways/{id}` return each gateway's **entire
|
|
282
|
-
settings object**. On a site with a real gateway connected that includes the live API key and
|
|
283
|
-
secret. Anything a tool returns is in the model's context, the transcript and potentially a
|
|
284
|
-
durable run artifact, so there is no careful-handling mitigation available after the fact — the
|
|
285
|
-
value must never be requested.
|
|
286
|
-
|
|
287
|
-
**`fetchGatewaySummary()` in `lib/wp-http.js` is the only way to read gateway configuration.**
|
|
288
|
-
It returns, per gateway, `id` / `title` / `enabled` / `order` and `fields: [{ name, state }]`,
|
|
289
|
-
where `state` is `present`, `blank` or `absent` — plus a `value` for the short allowlist of
|
|
290
|
-
display and behaviour fields, each of which passes the shared secret-value guard first. That is
|
|
291
|
-
everything discovery legitimately needs: which gateways are registered, which are enabled, and
|
|
292
|
-
whether a credential is configured. Request-level outcomes (`ok`, `unauthorized`, `unreachable`,
|
|
293
|
-
`malformed`) are a separate axis, and a failed request returns **zero** field entries rather
|
|
294
|
-
than a page of `absent`, so "this gateway has no API key" can never be confused with "we could
|
|
295
|
-
not ask".
|
|
296
|
-
|
|
297
|
-
Everything else about the route is closed, on purpose:
|
|
298
|
-
|
|
299
|
-
- `fetchJson()` **refuses** either gateway route before issuing the request, below discovery's
|
|
300
|
-
`--include-route` override. There is no flag, option, capability token or environment variable
|
|
301
|
-
that lifts it; adding one is the exposure with extra steps.
|
|
302
|
-
- The route classifier categorizes both shapes as `excluded_credential_bearing`, and neither
|
|
303
|
-
`--include-route` nor `--include-excluded-category` can promote them to `sample`.
|
|
304
|
-
- A plugin profile may not declare a gateway route as a readable entity route, under any flag.
|
|
305
|
-
- Never write a gateway field value into `source-profile.md`, `source-schema.json`, a sample
|
|
306
|
-
record, a progress log, a completion report, a CMS field, telemetry, or `.local.env`. Never a
|
|
307
|
-
prefix, a length or a hash of one either — each of those is a usable clue on its own.
|
|
308
|
-
|
|
309
|
-
Report what was read. A run that states "N gateways, M enabled, K credential fields present, 0
|
|
310
|
-
values retained" is auditable; one that silently read the settings blob is not.
|
|
311
|
-
`describeGatewaySummary()` produces that line for the approval gate.
|
|
312
|
-
|
|
313
|
-
⚠️ The value guard is a pattern list, not a guarantee — a credential in an unrecognized format
|
|
314
|
-
passes it. It is the backstop for credentials nobody can name in advance; the controls above are
|
|
315
|
-
the actual protection.
|
|
316
|
-
|
|
317
|
-
## Reading payment, refund and invoice history
|
|
318
|
-
|
|
319
|
-
Three deterministic registries carry this knowledge. Use them; do not re-derive which source keys
|
|
320
|
-
mean what, and do not hand-author the reads.
|
|
321
|
-
|
|
322
|
-
| What you need | Use |
|
|
323
|
-
| --- | --- |
|
|
324
|
-
| Which source keys the payments import may read at all | `paymentReadKeys()` in `lib/gateway-source-keys.js` |
|
|
325
|
-
| Which value may become a payment's provider transaction reference | `resolveTransactionReference()` in the same module |
|
|
326
|
-
| Whether a method is online or offline | `resolveOfflinePayment()` — omits the flag when unknown |
|
|
327
|
-
| Whether a refund actually happened | `qualifyRefund()` in `lib/refund-corroboration.js` |
|
|
328
|
-
| Whether the store has invoices, and where their bytes live | `lib/invoice-discovery.js` |
|
|
329
|
-
|
|
330
|
-
**The read manifest is closed.** `paymentReadKeys()` returns the complete set of keys this import
|
|
331
|
-
touches — the amount, both paid-date fields, the method, the currency, the canonical reference,
|
|
332
|
-
and each registry family's candidate fields. Nothing else is read. In particular a raw provider
|
|
333
|
-
response blob is declared **unreadable**, not "to be pattern-matched later": on a live store its
|
|
334
|
-
sibling fields carried customer name, phone and email, and a contract that requires parsing
|
|
335
|
-
unstructured personal data is not one that can be honoured safely.
|
|
336
|
-
`assertNoNeverReadKeys()` refuses a read plan naming it *before* the plan executes — filtering
|
|
337
|
-
after the response arrives is too late, the blob is already in the run's working data.
|
|
338
|
-
|
|
339
|
-
**Two surfaces, and neither alone covers payments.** Row-shaped tables come through the plugin
|
|
340
|
-
`/query` surface; meta-backed fields come through WooCommerce REST. Run the generated
|
|
341
|
-
`…--<table>.eav-read-plan.json` verbatim and reconcile it afterwards — a hand-authored scoped read
|
|
342
|
-
cannot be reconciled against anything, and a plan edited after discovery wrote it is caught by its
|
|
343
|
-
own hash.
|
|
344
|
-
|
|
345
|
-
**A gateway-shaped key is not attribution.** The payment-method slug names the checkout plugin,
|
|
346
|
-
not necessarily the processor: orders whose method is one gateway can carry
|
|
347
|
-
another gateway's reference key, while every order whose method *was* that second gateway carried
|
|
348
|
-
none. So a candidate is written only when its semantics are verified AND the registry recognizes
|
|
349
|
-
the order's method — directly, or through a separately verified layered integration. Everything
|
|
350
|
-
else is reported with a reason and never guessed at by precedence. Report candidate coverage and
|
|
351
|
-
defensible coverage as separate numbers; collapsing them overstates fidelity.
|
|
352
|
-
|
|
353
|
-
**A refund needs a refund record.** A canonical WooCommerce refund entity with a stable id and a
|
|
354
|
-
positive amount is authoritative on its own. An order-level refunded status corroborates but
|
|
355
|
-
cannot supply a missing amount. Gateway flags, statuses and refundable-balance fields never create
|
|
356
|
-
a refund, however many agree — fields written by one callback are one signal. When only such flags and
|
|
357
|
-
statuses exist, this yields zero importable refunds, which is the correct output.
|
|
358
|
-
|
|
359
|
-
**Invoices are resolved per run.** Discovery matches key *families*, not authored names, and
|
|
360
|
-
patterns found in a sample are then applied across the full order population. A discovered
|
|
361
|
-
document URL is untrusted input that something is about to fetch: classify it before touching it,
|
|
362
|
-
and never log or store it — the query string can be a bearer token and the filename can carry the
|
|
363
|
-
customer's name. Nothing found means nothing is created, and the report says "no invoices found",
|
|
364
|
-
never "not supported".
|
|
365
|
-
|
|
366
|
-
Redaction counts are findings, not plumbing: a non-zero `redactedValueCount` means a credential
|
|
367
|
-
was sitting somewhere unexpected in the source, and it belongs in the run report. Telemetry
|
|
368
|
-
carries counts only — never a discovered key name and never a value.
|
|
369
|
-
|
|
370
|
-
## Plugin coverage
|
|
371
|
-
|
|
372
|
-
A real WooCommerce site is mostly plugins. Handling them is deterministic and has its own
|
|
373
|
-
knowledge base: `plugins/` (profiles + `no-migration-needed.json` + `README.md`), read through
|
|
374
|
-
`scripts/plugin-knowledge.js`, detected by `scripts/wp-plugin-inventory.js`.
|
|
375
|
-
|
|
376
|
-
**Every installed plugin lands in exactly one of the four statuses, and every status
|
|
377
|
-
produces a row the user sees. Nothing is silently ignored.**
|
|
378
|
-
|
|
379
|
-
| Population | Evidence | Result |
|
|
380
|
-
| --- | --- | --- |
|
|
381
|
-
| recognized | a profile matched | named entities, declared read channels, Wix target refs; mapping `confirmed` |
|
|
382
|
-
| derived | no profile, data is REST-visible | derived from `wp/v2/types` + `wp/v2/taxonomies`, mapping `proposed` (CMS, or native on a domain-KB match) |
|
|
383
|
-
| named only | detected, no read channel | *Pending* with its reason, resolved by the no-migration-needed list or at the review gate |
|
|
384
|
-
|
|
385
|
-
A plugin therefore does not need a profile to migrate — it needs one to migrate *natively*.
|
|
386
|
-
|
|
387
|
-
### Detection
|
|
388
|
-
|
|
389
|
-
Runs before route classification so profile-declared routes are already in scope. Signals,
|
|
390
|
-
strongest first:
|
|
391
|
-
|
|
392
|
-
1. `GET /wp/v2/plugins` — the authoritative installed list (`plugin`, `status`, `name`,
|
|
393
|
-
`version`). **Administrator credential required.** On 401/403 the run continues and
|
|
394
|
-
records `pluginListAvailable: false`; say so plainly rather than implying full coverage.
|
|
395
|
-
Without it, installed-but-unprofiled plugins cannot be enumerated at all — this is the
|
|
396
|
-
concrete argument for the authenticated acquisition mode.
|
|
397
|
-
2. Declared routes present in the REST index.
|
|
398
|
-
3. `GET /wp/v2/types` / `GET /wp/v2/taxonomies` entries matching a profile's `restBases`.
|
|
399
|
-
4. **Record payload keys from the samples** — a second pass after sampling. This is not
|
|
400
|
-
optional polish: several major WooCommerce extensions (Product Bundles, Composite
|
|
401
|
-
Products, Product Add-Ons, ACF, Yoast) add **no REST route at all** and only widen
|
|
402
|
-
`wc/v3/products` / `wc/v3/orders` payloads. Route-based discovery cannot see them.
|
|
403
|
-
5. REST namespaces and public `/wp-content/plugins/<slug>/` asset paths (low confidence,
|
|
404
|
-
but they work with no credentials).
|
|
405
|
-
|
|
406
|
-
A plugin version below a profile's `detect.minVersion` is reported as
|
|
407
|
-
`api-below-min-version`, not read as if the documented API were present.
|
|
408
|
-
|
|
409
|
-
### Project-local plugin entity plans
|
|
410
|
-
|
|
411
|
-
For an unfamiliar plugin, prefer a complete supported REST reader. If it is unavailable,
|
|
412
|
-
investigate verified storage and use [PLUGIN-READ-PLANS.md](PLUGIN-READ-PLANS.md)'s shared
|
|
413
|
-
validator/writer, including stable entity references, scoped related records and a bounded
|
|
414
|
-
sample. A permanent profile or new transport handler is not required. Preserve the plan
|
|
415
|
-
binding in canonical source metadata; only reconciled full extraction certifies readiness.
|
|
416
|
-
Never return an ineffective “rerun discovery” task when a producer cannot emit its input.
|
|
417
|
-
|
|
418
|
-
## Read channels
|
|
419
|
-
|
|
420
|
-
`plugin-rest`, `core-cpt`, `core-embedded`, `core-meta`, `plugin-rest-child`, `export-file`,
|
|
421
|
-
`db-only` — see `plugins/README.md`. Two consequences worth stating to the user:
|
|
422
|
-
|
|
423
|
-
- **Unregistered post meta is invisible to the REST API.** WordPress exposes meta only when
|
|
424
|
-
the plugin registered it with `show_in_rest` (and, for a CPT, declared `custom-fields`
|
|
425
|
-
support). A plugin can keep its entire per-record state in `postmeta` and expose none of
|
|
426
|
-
it. Three ways to reach it, in preference order: the **structure bridge** (see "Reading
|
|
427
|
-
key/value tables through the bridge" below — this is the one that needs no profile and no
|
|
428
|
-
user action), a WXR export the user produces, or a database dump.
|
|
429
|
-
- **WXR cannot be fetched.** Application Passwords authenticate the REST API and XML-RPC
|
|
430
|
-
only, never `wp-admin`, so an export file is something the **user produces and supplies**.
|
|
431
|
-
Treat `export-file` as a request to the user, never as a download.
|
|
432
|
-
### Source redirect maps
|
|
433
|
-
|
|
434
|
-
Old addresses kept alive only by redirect rules must be inventoried; an empty REST answer or
|
|
435
|
-
the route classifier's `/redirection/*` exclusion is never evidence that no rules exist.
|
|
436
|
-
`lib/wp-redirect-sources.js` normalizes them from the plugins' own storage:
|
|
437
|
-
|
|
438
|
-
- **Redirection** — `redirection_items` + `redirection_groups` tables; **Rank Math** —
|
|
439
|
-
`rank_math_redirections` (PHP-serialized `sources`, one rule per pattern). Read them through
|
|
440
|
-
the structure bridge by **bare** table name; `resolveTable` matches the site's real prefix
|
|
441
|
-
from the bridge's table listing and reports several matches (multisite) as ambiguous.
|
|
442
|
-
- **Yoast Premium** keeps redirects in `options`, which stays denied: coverage is
|
|
443
|
-
`unsupported` until the operator supplies the plugin's CSV export.
|
|
444
|
-
- Server/CDN rules (`.htaccess`, nginx, edge) live outside WordPress: record them as
|
|
445
|
-
`unsupported` and ask the host for an export.
|
|
446
|
-
- Logs, 404 records and hit counts are not rules. Disabled rules and rules of an inactive
|
|
447
|
-
plugin are kept as `enabled: false` exclusions, never reactivated.
|
|
448
|
-
- A failed, partial or channel-less read is `unreadable`, never `confirmed_empty`.
|
|
449
|
-
|
|
450
|
-
Feed the reads to `node skills/wix-replatform/scripts/url-redirects.js sources --project
|
|
451
|
-
<dir> --input <file.json>`; it appends `state/url-preservation/source-redirects.ndjson` and
|
|
452
|
-
writes `source-redirect-coverage.json`. When declared source domains are present, it also
|
|
453
|
-
plans the captured destinations into the redirect audit and URL rewrite report. If domains
|
|
454
|
-
are declared later, run `url-redirects.js import-targets --project <dir>` after that
|
|
455
|
-
declaration. Capability evidence for a specific rule can be supplied in the source input's
|
|
456
|
-
`targetCapabilities[ruleKey]` with `productSupported`, optional `automationSupported`, and
|
|
457
|
-
an evidence reference; absent evidence remains unverified where product support is not
|
|
458
|
-
established for that rule shape. A complete capture records a disabled tombstone for a
|
|
459
|
-
previously captured rule that disappeared, so the cutover report keeps its old address
|
|
460
|
-
open for explicit redirect reconciliation. Partial or unreadable captures never retire
|
|
461
|
-
missing rules.
|
|
462
|
-
|
|
463
|
-
### Reading key/value tables through the bridge
|
|
464
|
-
|
|
465
|
-
When `wix-wp-plugin-v2` is installed on the source site, `postmeta` and every other
|
|
466
|
-
key/value-shaped table is readable — key-scoped. This is the channel to reach for when a
|
|
467
|
-
capability would otherwise be a `user-file` blocker, and it is the ONLY one that works for a
|
|
468
|
-
plugin nobody has profiled.
|
|
469
|
-
|
|
470
|
-
**Always run key discovery, even for a profiled plugin.** It is tempting to treat a profile's
|
|
471
|
-
`detect.recordProperties` as the key list and skip the round-trip — `subscriptions-for-woocommerce.json`
|
|
472
|
-
names `_wps_sfw_product` there — but those are *detection markers*, one or two keys that prove
|
|
473
|
-
the plugin wrote the record. They are not the record's field list. Reading only them produces a
|
|
474
|
-
short extraction that looks complete, the same failure as a truncated key list.
|
|
475
|
-
|
|
476
|
-
Profiles earn their place elsewhere: they say which table to read, which entity it maps to, and
|
|
477
|
-
what the pitfalls are. The key list comes from the site. A single order on a gateway-backed store
|
|
478
|
-
can carry dozens of gateway-specific meta keys under a prefix no profile anywhere has seen, which
|
|
479
|
-
is why discovery is the mechanism and not the fallback.
|
|
480
|
-
|
|
481
|
-
**The rule: if you have not named the keys you want, the value column does not exist.** Not
|
|
482
|
-
in `select`, not in `where`, not in `orderBy`, not in `groupBy`. Violating it returns
|
|
483
|
-
`wmh2_invalid_structure_request` (400) — the same error as naming a nonexistent column, so
|
|
484
|
-
the refusal will not tell you which column is the value column. Two steps:
|
|
485
|
-
|
|
486
|
-
1. **`GET /structure?table=postmeta`** → the column list plus `eavPair: {keyColumn,
|
|
487
|
-
valueColumn}`. This tells you the table is key-scoped *before* you write a query. No rows,
|
|
488
|
-
no key names.
|
|
489
|
-
2. **Discovery** — `select` the key column plus a count, `groupBy` the key column. Returns the
|
|
490
|
-
real key list with row counts, `eavAccess.tier: "key-discovery"`.
|
|
491
|
-
3. **Scoped read** — `where` the key column `in` the keys you want (**max 50 per request**),
|
|
492
|
-
then `select` the value column freely. `eavAccess.tier: "key-scoped"`.
|
|
493
|
-
|
|
494
|
-
```jsonc
|
|
495
|
-
// 2. discovery // 3. scoped read
|
|
496
|
-
{"structureRequest": { {"structureRequest": {
|
|
497
|
-
"table": "postmeta", "table": "postmeta",
|
|
498
|
-
"select": [{"column": "meta_key"}, "select": [{"column": "post_id"},
|
|
499
|
-
{"column": "meta_key", {"column": "meta_key"},
|
|
500
|
-
"aggregate": "count", "as": "n"}], {"column": "meta_value"}],
|
|
501
|
-
"groupBy": ["meta_key"], "where": [{"column": "meta_key", "op": "in",
|
|
502
|
-
"orderBy": [{"column": "meta_key", "value": ["<key from step 2>",
|
|
503
|
-
"direction": "asc"}] "<key from step 2>"]}],
|
|
504
|
-
}} "orderBy": [{"column": "post_id", "direction": "asc"}]
|
|
505
|
-
}}
|
|
506
|
-
```
|
|
507
|
-
|
|
508
|
-
⚠️ **Count the KEY column, not some other column.** `{"column": "<keyColumn>", "aggregate":
|
|
509
|
-
"count"}` works on any key/value table; counting `meta_id` only works where that column happens
|
|
510
|
-
to exist, and a `name`/`value` table has no `meta_id` at all. The generic client counts the
|
|
511
|
-
discovered key column for exactly this reason.
|
|
512
|
-
|
|
513
|
-
Things that will bite:
|
|
514
|
-
|
|
515
|
-
- **Page discovery to exhaustion.** `limit` maxes at 200 and a large `postmeta` has more
|
|
516
|
-
distinct keys than one page. Follow `pagingMetadata.cursors.next` until it is null before
|
|
517
|
-
concluding a key is absent — a truncated key list reads as "these are all the keys" and
|
|
518
|
-
will send the mapping down a wrong path. Budget `ceil(N/200)` discovery pages plus at least
|
|
519
|
-
`ceil(N/50)` scoped **batches** — and a batch is not a request: each pages at 200 rows, so a
|
|
520
|
-
batch whose 50 keys hold 4,000 rows costs 20 requests. Because discovery returns each key's
|
|
521
|
-
row count, the read plan states the real figure (`expectedPages` per batch,
|
|
522
|
-
`expectedScopedRequests` overall) — read it there rather than estimating.
|
|
523
|
-
- **`options` and `usermeta` are still refused outright**, and pinning `option_name` does not
|
|
524
|
-
unlock `options`. Gateway configuration held in `options` is a different mechanism
|
|
525
|
-
entirely — do not try to route around this.
|
|
526
|
-
- **Check `redactionMetadata.redactedValueCount` on every response.** Non-zero means a value
|
|
527
|
-
matched a credential shape and came back as `[REDACTED:secret-shaped]`. That is not a bug
|
|
528
|
-
to work around: it means the source site keeps a credential somewhere unexpected, and it
|
|
529
|
-
belongs in the run's notes.
|
|
530
|
-
- **A table named `*meta` whose pair is not one of the six recognized ones is refused (403),
|
|
531
|
-
not readable.** There is no key column to pin, so there is nothing to scope. Reach for a WXR
|
|
532
|
-
export or a database dump for that table, and say so rather than reporting it as empty.
|
|
533
|
-
- **A table can carry MORE than one pair**, and each is guarded separately: pinning `meta_key`
|
|
534
|
-
does not make a second pair's `value` column readable. `eavPair.additionalPairs` and
|
|
535
|
-
`eavAccess.additionalPairs` list them; `guardedValueColumns()` in the client returns all of
|
|
536
|
-
them at once, which is what you want when building a select list.
|
|
537
|
-
- **Every value comes back as a STRING — including flags, ids and counts.** A column the
|
|
538
|
-
plugin stores as an integer flag arrives as `"0"` or `"1"`, and `Boolean("0")` is **true**
|
|
539
|
-
in JavaScript, so the natural-looking `if (row.is_spam)` classifies *every* row as spam.
|
|
540
|
-
A form-submission import that reads a plugin's `is_spam` column straight into a truthiness
|
|
541
|
-
test mismarks the entire set, and nothing errors: the run simply reports every row as spam. Compare
|
|
542
|
-
explicitly (`row.is_spam === '1'`, or `Number(row.is_spam) === 1`) on every flag, id and
|
|
543
|
-
numeric column you branch on, and never feed a bridge value to a bare truthiness test. The
|
|
544
|
-
same holds for text-valued status columns: `"active"` is a string the plugin chose, not a
|
|
545
|
-
normalized enum — and note that a source's own spam/status flags being uniformly clean is
|
|
546
|
-
not evidence the data is clean, only that the source never flagged it.
|
|
547
|
-
- **A submissions table shared by every form needs the source form id on BOTH sides.** Form
|
|
548
|
-
plugins that keep one entries table (Forminator's is the shape seen live; it has no profile
|
|
549
|
-
in `plugins/` yet) key each row by the source form id, while the target form ids are minted
|
|
550
|
-
per form by the forms import. That is two lookups, not one: filter the source rows to the
|
|
551
|
-
form being imported, **and** resolve that same form's crosswalked target id. Getting either
|
|
552
|
-
side wrong writes real submissions onto the wrong target form and the create still succeeds
|
|
553
|
-
— there is no error to notice. Assert the source-form-id →
|
|
554
|
-
target-form-id pairing from the crosswalk before the first write, and read one created
|
|
555
|
-
submission back on the form you expected it to land on.
|
|
556
|
-
|
|
557
|
-
#### Yoast product SEO evidence
|
|
558
|
-
|
|
559
|
-
WooCommerce product `yoast_head_json` is **rendered** output, never proof of an override (a store
|
|
560
|
-
can render a title on every product while holding no raw title override). Decide each product's SEO title,
|
|
561
|
-
description and focus keyphrase per field with `lib/yoast-product-seo-evidence.js`:
|
|
562
|
-
|
|
563
|
-
1. **REST `meta`** on the product post (`/wp/v2/product/{id}?context=edit`): a key counts only
|
|
564
|
-
when `meta` contains it (`restEvidence`). Missing key means unresolved, not "no override".
|
|
565
|
-
2. **Bridge key-scoped `postmeta` read** for keys still unresolved (`readBridgeEvidence`, with
|
|
566
|
-
`queryPage` bound to `queryStructure`). It pins exactly `_yoast_wpseo_title`,
|
|
567
|
-
`_yoast_wpseo_metadesc`, `_yoast_wpseo_focuskw` plus a batch of product ids, and pages to
|
|
568
|
-
`hasNext: false`. This is the one deliberate exception to "always run key discovery": the key
|
|
569
|
-
set is a fixed allow-list, never widened, and a complete scoped read with **no row** is itself
|
|
570
|
-
the evidence (inherit). A failed, truncated or non-key-scoped batch makes only that batch's
|
|
571
|
-
unresolved fields `unknown`.
|
|
572
|
-
3. Otherwise `unknown`. A user-supplied export can later provide evidence through the
|
|
573
|
-
blocked-data request flow.
|
|
574
|
-
|
|
575
|
-
`buildProductSeoReceipts` returns the audit receipt per product (stored with the extraction,
|
|
576
|
-
never hashed whole); `seoEvidenceFromReceipt` gives the canonical `product.seoEvidence`. Never map
|
|
577
|
-
`yoast_head_json.title/description`, `og_*` or the excerpt into `seoTitle`/`seoDescription`.
|
|
578
|
-
Non-Yoast SEO plugins have no evidence contract: their product SEO is `unknown`.
|
|
579
|
-
|
|
580
|
-
- **Parent-scoped sub-resources (`plugin-rest-child`, fixed 2026-08-11).** WooCommerce order
|
|
581
|
-
*notes* (`/wc/v3/orders/{id}/notes`) and similar per-parent sub-collections cannot be listed
|
|
582
|
-
on their own — the base classifier only samples flat collection routes (`page`/`per_page`
|
|
583
|
-
shape). This is why a plugin that writes real data via `$order->add_order_note(...)` (e.g.
|
|
584
|
-
Custom Payment Gateway for WooCommerce's payment-note field) used to report as
|
|
585
|
-
`pending · cannot-tell` even though the data is real and REST-reachable in principle.
|
|
586
|
-
`plugin-rest-child` fixes this: an entity declares `route` as a `{parentId}`-templated path
|
|
587
|
-
(`/wc/v3/orders/{parentId}/notes`) plus `parentRoute` (the already-sampled collection that
|
|
588
|
-
supplies real parent ids, e.g. `/wc/v3/orders`). Availability is a two-part **presence**
|
|
589
|
-
check against the site's REST index — `parentRoute` is in scope, and the index advertises a
|
|
590
|
-
route shaped like the template (WordPress's `(?P<id>[\d]+)`-style regex segments are
|
|
591
|
-
normalized to `{parentId}` for the comparison, so the parameter's name never has to match).
|
|
592
|
-
Presence alone does not confirm real data exists there: `wp-discovery.js`'s
|
|
593
|
-
`sampleChildEntities` runs a **live, representative check** afterward — it substitutes up to
|
|
594
|
-
3 already-sampled parent ids into the template and fetches each, purely to say "N of 3
|
|
595
|
-
sampled parents actually returned something," not to claim a full count. That result surfaces
|
|
596
|
-
as a plain-language run note, never as a channel-status change: a small sample coming back
|
|
597
|
-
empty does not mean the capability is absent, only that this sample did not confirm it.
|
|
598
|
-
The infrastructure is
|
|
599
|
-
built and tested (`plugin-knowledge.js`, `wp-route-classifier.js`'s `childRouteAdvertised`,
|
|
600
|
-
`wp-plugin-detect.js`'s `describeProfiledEntity`, `wp-discovery.js`'s `sampleChildEntities`),
|
|
601
|
-
and `plugins/woocommerce-other-payment-gateway.json` is authored and live-verified
|
|
602
|
-
— do not guess a plugin's installed-directory id when authoring a similar
|
|
603
|
-
profile; confirm `detect.pluginFileIds` against a live `GET /wp/v2/plugins` response first, it
|
|
604
|
-
is exactly the kind of fact a stale or invented guess silently gets wrong.
|
|
605
|
-
- **Non-standard response envelope (`responseEnvelope`, fixed 2026-08-11).** Sampling and
|
|
606
|
-
counting assume a flat array (`X-WP-Total`/`X-WP-TotalPages` headers, or the array's own
|
|
607
|
-
length) or a single object. MailPoet's REST API (`/mailpoet/v1/subscribers`,
|
|
608
|
-
`/segments`, `/newsletters`, ...) broke that assumption: it is a real, paginated, GET-only
|
|
609
|
-
REST route (VERIFIED LIVE 2026-08-11: readable with the
|
|
610
|
-
standard Application Password), but the payload is wrapped as
|
|
611
|
-
`{ data: { items: [...], meta: { count, pages } } }` with no `X-WP-Total` header — the count
|
|
612
|
-
lives inside the body instead. Before this fix the whole envelope would have sampled as one
|
|
613
|
-
opaque record. A profile entity (route-bearing channels only) now declares
|
|
614
|
-
`responseEnvelope: { itemsPath, countPath }` — a dot-path to the array of records, and an
|
|
615
|
-
optional dot-path to the true total when there's no header. `wp-discovery.js`'s
|
|
616
|
-
`inspectEntity` unwraps to that path and otherwise treats it exactly like a flat array; a
|
|
617
|
-
path that stops resolving (stale profile, plugin version drift) falls back to the raw payload
|
|
618
|
-
shape and records a discovery note rather than failing the run.
|
|
619
|
-
`plugins/mailpoet.json` is authored and live-verified: `crm.email-subscription`
|
|
620
|
-
now resolves to migration-planned via the existing `crm/email-subscription` target, with
|
|
621
|
-
`recordCount` read via the declared `countPath`. A namespace-wide `unprofiledRoutes`
|
|
622
|
-
entry is still a sign a route this shape (or any other) has never been profiled — check there
|
|
623
|
-
before concluding a plugin has "no REST surface."
|
|
624
|
-
- **Route default query (`ROUTE_DEFAULT_QUERY_RULES`, fixed 2026-08-16).** Sampling sends
|
|
625
|
-
`per_page` and nothing else, so any collection route that applies a **default filter to an
|
|
626
|
-
unparameterized request** is read as its filtered subset and the plan under-counts — the
|
|
627
|
-
hidden records are invisible to the mapper, not merely misreported. Observed on
|
|
628
|
-
`/wc/v3/products/reviews`, which defaults to `status=approved`: a store holding both approved and on-hold
|
|
629
|
-
reviews had only the approved ones counted. This is a class of bug, so the fix is a
|
|
630
|
-
table rather than a special case: `wp-route-classifier.js` carries
|
|
631
|
-
`ROUTE_DEFAULT_QUERY_RULES` — `[pattern, params, reason]`, `*`-suffix matching, longest
|
|
632
|
-
pattern wins — and `defaultQueryFor(routePath)` / `defaultQueryReasonFor(routePath)` resolve
|
|
633
|
-
it. `wp-discovery.js` merges the result under its paging parameters and records a discovery
|
|
634
|
-
note naming the parameters and the reason, so generated readers know to send them too.
|
|
635
|
-
Adding a route is one row in the table plus a fixture; a route with no row is unchanged.
|
|
636
|
-
|
|
637
|
-
### Coverage statuses
|
|
638
|
-
|
|
639
|
-
The four statuses, and only the four: `migration-planned` (via `api` or `cms`,
|
|
640
|
-
confidence `confirmed` or `proposed`), `no-need-to-migrate`, `pending`,
|
|
641
|
-
`requires-development`. A failed or unavailable read is never a status — it attaches to the
|
|
642
|
-
row as `blocked[]` (`user-file` / `surface-changed`, with a `declined` flag).
|
|
643
|
-
|
|
644
|
-
The split is deliberate: `pending` (we do not know how to migrate this yet — our open item)
|
|
645
|
-
and `requires-development` (a human established Wix has no surface) call for different
|
|
646
|
-
conversations. Only the second is a closed door, and only a human may open it — the
|
|
647
|
-
human-signed register `plugins/requires-development.json` is its single source.
|
|
648
|
-
|
|
649
|
-
### Interaction rules
|
|
650
|
-
|
|
651
|
-
- **The admin Application Password is the source REST credential; `wix-wp-plugin-v2`'s
|
|
652
|
-
migration key is scoped to that bridge.** A plugin REST namespace that honours
|
|
653
|
-
WordPress authentication works with the Application Password, and that is the normal
|
|
654
|
-
case — plugins with their own key systems offer them as an *alternative* for external
|
|
655
|
-
callers, not a requirement (verified for Gravity Forms, which accepts Application
|
|
656
|
-
Passwords and runs requests under the caller's plugin capabilities). Do **not** treat
|
|
657
|
-
"this plugin has API keys" as "we need another credential"; that reasoning has been
|
|
658
|
-
wrong every time it was applied. If a plugin genuinely rejects the platform credential,
|
|
659
|
-
that is a config-gate requirement like the WooCommerce consumer keys — not a
|
|
660
|
-
per-capability runtime state. For the structure bridge specifically, select the
|
|
661
|
-
Application Password path only when WooCommerce is present; otherwise use
|
|
662
|
-
`WMH2_MIGRATION_KEY`. Never describe that bridge-only key as private REST authentication.
|
|
663
|
-
- `blocked[]` entries are collected and asked **once**, batched, each individually
|
|
664
|
-
skippable. A `user-file` blocker means no *WordPress API* can reach it: unregistered post
|
|
665
|
-
meta and plugin tables are invisible to REST, and Application Passwords cannot reach
|
|
666
|
-
`wp-admin`, so absent anything else a WXR or CSV export must be produced by the user.
|
|
667
|
-
**Check the structure bridge first** — if `wix-wp-plugin-v2` is installed on the source
|
|
668
|
-
site, both of those are readable through it (see "Reading key/value tables through the
|
|
669
|
-
bridge" below), and asking the user for an export they did not need to produce is a real
|
|
670
|
-
cost to avoid. Record each
|
|
671
|
-
answer in `orchestration/decisions.json` under `pluginBlocker:<capability>:<kind>`
|
|
672
|
-
(`provided` / `declined`); `wp-discovery.js` reads it back (`--decisions`, defaulting to
|
|
673
|
-
`<out-dir>/../../orchestration/decisions.json`) so a declined ask renders as declined.
|
|
674
|
-
- `pluginCmsFallback:<capability>` sits beside it in the same file: the merchant's
|
|
675
|
-
approve/decline answer to archiving a recognized capability's records in CMS, bound to the
|
|
676
|
-
exact proposal shown. `wp-discovery.js` reads it with the eligibility register
|
|
677
|
-
(`plugins/cms-fallback-eligible.json`) and classifies the row (`pending` with a
|
|
678
|
-
`cms-fallback-*` reason, or `migration-planned · via cms · basis decision` with
|
|
679
|
-
`cmsFallback.functionalityRestored: false`). It is written only at the mapping review by
|
|
680
|
-
`orchestration-state.js decide-cms-fallback`. A malformed entry is never honored and never
|
|
681
|
-
fails the run; with no row to carry it, it appears in `plugin-coverage.json`
|
|
682
|
-
`cmsFallbackDecisionIssues[]`.
|
|
683
|
-
- `plugin-coverage.json` also carries `entityStats` (per-route record counts and sample
|
|
684
|
-
evidence) and `inputs.cmsFallbackDigest`; `--reclassify-coverage` rebuilds coverage from
|
|
685
|
-
them without any source request (see `rp-discovery`).
|
|
686
|
-
- `migration-planned · proposed` rows never block; the proposed capability and target are
|
|
687
|
-
reviewed at the normal mapping-review checkpoint.
|
|
688
|
-
- `requires-development` and `pending` rows **must** reach the user. A detected but
|
|
689
|
-
undeliverable capability the user was never told about is the failure this machinery
|
|
690
|
-
exists to prevent. Every `pending` row is decided at the mapping review — the only exit.
|
|
691
|
-
|
|
692
|
-
**A recognized plugin always ends in Migration planned** (J2 property 1). If a profile
|
|
693
|
-
matched we know what the plugin holds, so:
|
|
694
|
-
- no readable channel (plugin tables only) → still classified by its target, with a
|
|
695
|
-
`user-file` blocker on the row — **not** pending, and never a "cannot" verdict. A database
|
|
696
|
-
export or a source-side bridge would reach it, and automation may not foreclose that any
|
|
697
|
-
more than it may declare Wix incapable.
|
|
698
|
-
- `pending · cannot-tell` is reserved for an **unrecognized** plugin where we genuinely
|
|
699
|
-
found nothing; the no-migration-needed list or the agent's own reading can
|
|
700
|
-
still resolve it to *No need to migrate* with a recorded rationale.
|
|
701
|
-
- The one deliberate exception is a **CMS fallback**: when nothing native fits, a
|
|
702
|
-
recognized capability with a signed `cms-fallback-eligible.json` entry stays *Pending*
|
|
703
|
-
(`cms-fallback-*` reason) until this migration's merchant approves archiving its records in
|
|
704
|
-
CMS. A profile never names a `cms/*` target itself.
|
|
705
|
-
|
|
706
|
-
**A CMS destination is not turnkey.** "Kept as data" means the records land in a Wix CMS
|
|
707
|
-
collection with their original IDs — genuinely migrated, not documented. But Wix Data must be
|
|
708
|
-
installed first (item writes fail with `WDE0110` otherwise) and collection creation has no
|
|
709
|
-
verified writer yet, so it is a setup step. Say both on the row; a customer reading "Kept as
|
|
710
|
-
data" should not discover the setup work later.
|
|
711
|
-
|
|
712
|
-
### Guardrails
|
|
713
|
-
|
|
714
|
-
- **Never a silent native mapping.** A derived entity may target a native Wix entity
|
|
715
|
-
only when the Wix domain knowledge confirms its proposed capability; otherwise it goes to
|
|
716
|
-
CMS. Either way the row is `confidence: proposed` and is confirmed at the mapping review.
|
|
717
|
-
- **Never a scope reopening.** The generic path operates only on routes the route classifier
|
|
718
|
-
already accepted. It does not resurrect frontend, editor, admin, runtime, or integration
|
|
719
|
-
families because a plugin registered them.
|
|
720
|
-
- Profile data routes outrank exclusion families (that is the per-capability opt-in), but a
|
|
721
|
-
wildcard pattern must keep two concrete leading segments, so `/yoast/*` can never be
|
|
722
|
-
opted in wholesale.
|
|
723
|
-
|
|
724
|
-
### Commands
|
|
725
|
-
|
|
726
|
-
```bash
|
|
727
|
-
node scripts/plugin-knowledge.js list-plugins
|
|
728
|
-
node scripts/plugin-knowledge.js read-plugin --slug the-events-calendar
|
|
729
|
-
node scripts/plugin-knowledge.js resolve-route --route /tribe/events/v1/events
|
|
730
|
-
node scripts/plugin-knowledge.js resolve-property --property bundled_items
|
|
731
|
-
node scripts/plugin-knowledge.js list-capabilities
|
|
732
|
-
node scripts/wp-plugin-inventory.js --base-url <url> --out-dir <dir> [auth options]
|
|
733
|
-
node scripts/plugin-knowledge-validate.js --write-index
|
|
734
|
-
```
|
|
735
|
-
|
|
736
|
-
To add or correct a plugin, edit `plugins/<slug>.json` and add a fixture — no skill logic
|
|
737
|
-
changes. See `plugins/README.md`.
|
|
738
|
-
|
|
739
|
-
## Product and variation stock
|
|
740
|
-
|
|
741
|
-
Extract `stock_status`, `manage_stock`, `stock_quantity`, `backorders`,
|
|
742
|
-
`backorders_allowed`, and `backordered` from products and every variation. Use
|
|
743
|
-
`lib/woo-inventory.js` → `mapWooInventory(record, {parent})` during canonical mapping.
|
|
744
|
-
Persist its `fields` on the canonical variant and its disposition beside the source ID.
|
|
745
|
-
An untracked product can still be explicitly in stock; `manage_stock:false` is not missing
|
|
746
|
-
inventory. Use variation records for variable products; never replicate a parent's shared
|
|
747
|
-
tracked quantity onto each child. Preserve `decision-needed` outcomes for missing signals,
|
|
748
|
-
backorders, invalid quantities, and shared stock; do not turn them into an empty success.
|
|
749
|
-
|
|
750
|
-
## Read contract (codegen-time)
|
|
751
|
-
|
|
752
|
-
What a generated WordPress reader must get right. Capture the operational facts below into
|
|
753
|
-
`source-profile.md` during discovery so codegen has them without re-deriving.
|
|
754
|
-
|
|
755
|
-
The generated reader is an **extractor**, not an in-memory bulk loader. It should fetch
|
|
756
|
-
WordPress/WooCommerce records page by page and write them to project-local files (for
|
|
757
|
-
example per-entity paged JSON files plus a manifest) so the import step can read from
|
|
758
|
-
disk later without re-fetching the source.
|
|
759
|
-
|
|
760
|
-
**Reuse the shared transport — do not regenerate it.** The auth, URL building, rate-limit
|
|
761
|
-
throttling, and `Retry-After`-aware 429/503 backoff a reader needs already exist as a
|
|
762
|
-
dependency-free module at `lib/wp-http.js` in **this skill directory** (the same module
|
|
763
|
-
the capture script imports). It
|
|
764
|
-
exports `fetchJson`, `buildHeaders`, `configureRateLimit`, and `parseTotalHeader`. It does
|
|
765
|
-
**not** export an undenied transport — `fetchJson` refuses payment-gateway routes, and a
|
|
766
|
-
generated reader must not reintroduce a raw one. Any
|
|
767
|
-
generated WordPress reader **must reuse this module rather than reimplementing transport**,
|
|
768
|
-
so the reader contains only per-project orchestration: which entities to pull, the
|
|
769
|
-
pagination loop, `_embed`/`_links` resolution, and transform glue. One tested transport
|
|
770
|
-
core is what makes the sampler and the reader behave identically. *How* the module is
|
|
771
|
-
carried into a runnable migration project is `rp-import-codegen`'s concern (its File
|
|
772
|
-
targets), not this adapter's. The notes below describe what the reader does *on top of*
|
|
773
|
-
that shared core:
|
|
774
|
-
|
|
775
|
-
- **Bounded media reads:** `fetchJson` accepts optional `deadlineMs`. One absolute deadline
|
|
776
|
-
includes the rate-limit wait, every fetch attempt, each attempt timeout, response handling,
|
|
777
|
-
and every retry delay. A wait that would finish after the deadline is not started. Omit
|
|
778
|
-
`deadlineMs` for all existing calls; their behavior stays unchanged.
|
|
779
|
-
|
|
780
|
-
- **Namespaces & auth differ per namespace:**
|
|
781
|
-
- `wp/v2` (core): HTTP Basic auth with a WordPress **Application Password**
|
|
782
|
-
(`--username` + `--application-password`).
|
|
783
|
-
- `wc/v3` (WooCommerce): **consumer key / secret**, sent as Basic auth over HTTPS (or
|
|
784
|
-
as query params on some hosts). This is a different credential from the Application
|
|
785
|
-
Password — both may be needed for a full migration.
|
|
786
|
-
- **Pagination:** `?page=N&per_page=M` (max `per_page` is typically 100). Total pages are
|
|
787
|
-
in the `X-WP-TotalPages` response header and total records in `X-WP-Total` — read
|
|
788
|
-
those rather than guessing when to stop. Some public WooCommerce Store API collection
|
|
789
|
-
routes paginate without `X-WP-TotalPages`; when that header is absent, generated readers
|
|
790
|
-
must stop on the first page whose item count is smaller than `per_page`.
|
|
791
|
-
- **Embedded relations:** request `?_embed` to inline related resources, or follow the
|
|
792
|
-
`_links` block (`author`, `wp:featuredmedia`, `wp:term`) to resolve relations. The
|
|
793
|
-
`evidence` pointers in `source-schema.json` relations come from this `_links` block.
|
|
794
|
-
- **Hierarchical taxonomies:** WordPress categories (and custom hierarchical taxonomies)
|
|
795
|
-
carry a `parent` field on each term (`0` = top-level). When **any** term has a non-zero
|
|
796
|
-
`parent`, the source taxonomy is nested. Discovery must elevate this into structured
|
|
797
|
-
schema — set `"hierarchical": true` on that entity in `source-schema.json` (see
|
|
798
|
-
`source-schema.example.json` → `category`) rather than leaving `parent` buried in the raw
|
|
799
|
-
dump. The Wix Blog category target is flat (no parent/child), so this flag is what triggers the
|
|
800
|
-
mapper's mandatory lossiness entry; without it, the flatten happens silently.
|
|
801
|
-
- **Rate limits / retries:** not advertised; the capture script throttles
|
|
802
|
-
(`--rate-limit-rpm`, default 120) and backs off on 429/503 honoring `Retry-After`.
|
|
803
|
-
Generated readers should inherit the same discipline.
|
|
804
|
-
- **Rich content:** `content.rendered` / `title.rendered` are HTML; `*.raw` requires
|
|
805
|
-
`context=edit` (authenticated). Note which the reader should pull.
|
|
806
|
-
- **HTML entities in "plain text" fields (trap, hit live 2026-07-19):** WordPress returns
|
|
807
|
-
HTML-encoded entities (`–`, `&`, `’`, …) not only in rendered HTML but
|
|
808
|
-
also in fields consumed as plain text — product/category/tag `name`, `title.rendered`
|
|
809
|
-
after tag-stripping, excerpts, even SKUs. Values sent to plain-text Wix fields (product
|
|
810
|
-
name, blog title, tag label, CMS text columns) must be entity-decoded by the generated
|
|
811
|
-
transforms or the encoded form appears verbatim in the Wix dashboard. HTML passed to
|
|
812
|
-
rich-content conversion does NOT need pre-decoding — the converter handles entities.
|
|
813
|
-
- **`slug` / `post_name` is percent-encoded for non-Latin values, and REST returns it
|
|
814
|
-
undecoded (trap, confirmed live on a non-Latin source 2026-09-27):** WordPress stores a
|
|
815
|
-
post/product slug whose original text contains non-Latin characters (e.g. Hebrew) as raw
|
|
816
|
-
UTF-8 percent-encoded escapes (`%d7%90%d7%99...`), and both `wp/v2` and `wc/v3` return this
|
|
817
|
-
field exactly as stored — no decoding happens server-side. The target's slug coercion
|
|
818
|
-
(`rp-target-wix`'s `toWixSlug`) turns the literal `%` characters into dashes rather than
|
|
819
|
-
erroring, so passing this value straight through silently produces a garbled
|
|
820
|
-
hex-with-dashes URL instead of the real slug. Generated transforms must decode `slug` /
|
|
821
|
-
`post_name` with `decodeURIComponent` before using it as a Wix slug or any other field —
|
|
822
|
-
guarded in a try/catch, since a slug that was never percent-encoded (or one containing a
|
|
823
|
-
literal `%` that isn't part of a valid escape) must pass through unchanged rather than throw
|
|
824
|
-
or get mangled. The decoded Unicode slug is then kept as-is (the coercion preserves letters
|
|
825
|
-
and digits in any script), so do not transliterate it. See the codegen-side rule in
|
|
826
|
-
`rp-import-codegen/SKILL.md`'s "Never hand-write slug sanitizing" section and the domain-knowledge pitfalls on `rp-target-wix`'s
|
|
827
|
-
`stores/entities/product.json` and `blog/entities/post.json`.
|
|
828
|
-
- **Custom fields:** ACF / meta often appear in sample records but are absent from the
|
|
829
|
-
`OPTIONS` schema — surface them as `unknowns` in discovery so the mapper can decide.
|
|
830
|
-
- **WooCommerce variation attribute values are URL-encoded slugs, not display names (trap, hit live 2026-07-21):**
|
|
831
|
-
`variations[].attributes[].value` from `wc/v3/products/{id}/variations` is a URL-encoded
|
|
832
|
-
taxonomy-term slug (e.g. `caf%c3%a9` for `café`), not the human-readable display
|
|
833
|
-
name that the product's `attributes[].options[]` array contains. Generated readers must
|
|
834
|
-
build a per-option slug→displayName map from the parent product's `attributes[].options[]`
|
|
835
|
-
(which does carry display names) and resolve slug values to display names before writing to
|
|
836
|
-
Wix. Passing slugs directly causes `MISSING_VARIANT_OPTION_CHOICE` because Wix compares
|
|
837
|
-
variant choice names against option choice names and finds no match.
|
|
838
|
-
- **WooCommerce "Any"-style variations omit the attribute entirely, and fail silently (trap,
|
|
839
|
-
hit live 2026-07-21):**
|
|
840
|
-
`wc/v3` returns the per-variation field as `attributes[].option`, not `.value`. When a
|
|
841
|
-
WooCommerce variation is set to "Any" for an option (the variation applies to any value of
|
|
842
|
-
that option), that attribute is typically omitted from the variation's `attributes` array
|
|
843
|
-
entirely rather than present with a null/empty `option` — but treat a present-and-empty
|
|
844
|
-
`option` the same way if seen. Generated transforms that require every declared parent
|
|
845
|
-
attribute to appear on the variation will resolve an empty option set for it. **This does
|
|
846
|
-
not fail loudly** — Wix accepts the write — it surfaces only as a product that goes live
|
|
847
|
-
with zero purchasable options, found by a human browsing the storefront, not by any
|
|
848
|
-
automated check. Do not "fix" this by auto-expanding into a cartesian combination of all
|
|
849
|
-
option choices: live-refuted (the combination count explodes for some products,
|
|
850
|
-
because the attribute slots are ordinal pick-N-from-a-shared-list pickers,
|
|
851
|
-
not independent size/color axes). The correct handling is to record the loss for human
|
|
852
|
-
review rather than emit a default variant silently.
|
|
853
|
-
- **The store's own configuration must be read DIRECTLY, and with the WordPress credential
|
|
854
|
-
(trap, hit live 2026-09-01):** `/wc/v3/settings/general` holds the business address
|
|
855
|
-
(`woocommerce_store_address`, `_address_2`, `_city`, `_postcode`, `woocommerce_default_country`),
|
|
856
|
-
the currency, which countries the shop sells to, and whether tax is calculated. Two reasons it
|
|
857
|
-
was never captured on any run:
|
|
858
|
-
1. **The REST index advertises only the parameterized form** `/wc/v3/settings/(?P<group>...)`,
|
|
859
|
-
never the literal group route, so nothing in the generic sweep ever fetches it. Read
|
|
860
|
-
`/wc/v3/settings/general` directly, the same way a shipping zone's `/locations` and
|
|
861
|
-
`/methods` sub-resources are — a parent-scoped sub-resource the caller resolves itself.
|
|
862
|
-
2. **The WooCommerce consumer key gets `401 woocommerce_rest_cannot_view` here; the WordPress
|
|
863
|
-
application password gets `200`.** Both are already in every run's source config. A reader
|
|
864
|
-
that only tries the store key gets a plausible "no permission" and moves on — which is
|
|
865
|
-
exactly how this stayed invisible while migrated sites published with an empty business
|
|
866
|
-
address.
|
|
867
|
-
|
|
868
|
-
`woocommerce_default_country` is `COUNTRY` **or** `COUNTRY:STATE` (e.g. `US:CA`) — the same
|
|
869
|
-
packing a zone's `state`-type location uses. `rp-target-wix/lib/store-config-build.js` maps the
|
|
870
|
-
whole group; do not hand-roll it.
|
|
871
|
-
- **Route paths passed to `fetchJson` / `buildApiUrl` must NOT include `/wp-json` (trap, hit live 2026-07-21):**
|
|
872
|
-
`buildApiUrl` in `lib/wp-http.js` already prepends `/wp-json` to the `routePath` argument.
|
|
873
|
-
Generated route paths must start with the namespace directly (e.g. `/wc/store/v1/products`,
|
|
874
|
-
`/wp/v2/posts`) — never with `/wp-json/...`. Prefixing with `/wp-json` doubles the prefix
|
|
875
|
-
and produces 404s.
|
|
876
|
-
- **WooCommerce consumer key/secret can 401 on some `wc/v3` routes even when it reads others
|
|
877
|
-
fine (trap, hit live 2026-08-12):** `WC_CONSUMER_KEY`/`WC_CONSUMER_SECRET` are scoped at
|
|
878
|
-
key-creation time (Read / Write / Read-Write) and can be narrower than the WordPress
|
|
879
|
-
Application Password's access. The consumer key/secret can 401
|
|
880
|
-
`woocommerce_rest_cannot_view` on `wc/v3/taxes`, `wc/v3/taxes/classes`, and
|
|
881
|
-
`wc/v3/settings/tax` while the very same reads succeeded immediately with the
|
|
882
|
-
`WP_USERNAME`/`WP_APPLICATION_PASSWORD` Basic auth pair. Generated readers must not treat a
|
|
883
|
-
401/403 on one `wc/v3` route as proof the whole consumer key is broken (which would wrongly
|
|
884
|
-
block products/orders/coupons too) — retry that specific route with the Application Password
|
|
885
|
-
credential before failing, and prefer the Application Password outright for admin-ish
|
|
886
|
-
`wc/v3` routes (taxes, settings) that a narrowly-scoped key is more likely to be denied on.
|
|
887
|
-
- **Core WooCommerce settings/tax routes are core, not plugin data:** `wc/v3/taxes`,
|
|
888
|
-
`wc/v3/taxes/classes`, and `wc/v3/settings/tax` are ordinary WooCommerce core collections
|
|
889
|
-
(same auth/pagination rules as `wc/v3/products` etc.) — they are not profiled as a "plugin"
|
|
890
|
-
because tax is core WooCommerce, not an extension. Per-product `tax_status`/`tax_class`
|
|
891
|
-
fields ride along on the ordinary `wc/v3/products` read; no separate per-product route is
|
|
892
|
-
needed to get them. See `rp-target-wix` domains/tax/ for the corresponding Wix target
|
|
893
|
-
entities (Tax Group / Tax Region / Manual Tax Mapping / Tax Settings) and mapping-plan.json's
|
|
894
|
-
`product` and `tax-class` entities.
|
|
895
|
-
|
|
896
|
-
## Schema shape
|
|
897
|
-
|
|
898
|
-
`source-schema.example.json` (in this skill folder) is the template `rp-discovery` follows
|
|
899
|
-
when emitting `migrations/<project>/source-schema.json`. It is a shape to follow, not a
|
|
900
|
-
strict schema to validate against. Keep the platform-agnostic core stable; push WordPress
|
|
901
|
-
quirks (`restNamespace`, statuses, etc.) into each entity's open `sourceMeta` blob.
|
|
902
|
-
|
|
903
|
-
For a profiled plugin entity, `sourceMeta` MUST also carry `requestMethod`, `requestBody`,
|
|
904
|
-
and `responseFragmentGroupSize` verbatim whenever the plugin profile declares them — copy them from the profile entity (surfaced structurally in plugin detection's
|
|
905
|
-
per-entity output, `wp-plugin-detect.js`'s `describeProfiledEntity`) rather than re-deriving
|
|
906
|
-
them from discovery's prose notes. `rp-import-codegen`'s read contract depends on finding
|
|
907
|
-
these under exactly those `sourceMeta` keys; omitting them silently degrades a declared
|
|
908
|
-
non-GET/fragmented read into an unreadable one downstream.
|
|
909
|
-
|
|
910
|
-
## Coupons, coupon usage and the currency gate
|
|
911
|
-
|
|
912
|
-
Three source-side decisions, each in a library so a generated importer supplies facts rather than
|
|
913
|
-
rules. Read `lib/coupon-discovery.js` and `lib/currency-gate.js`; both are pure.
|
|
914
|
-
|
|
915
|
-
- **Coupons are counted from one surface and imported from the same one.** `wc/v3/coupons`
|
|
916
|
-
(published) is the discovered set and the denominator; sweep it to exhaustion with
|
|
917
|
-
`sweepCoupons(fetchPage)`, which refuses a total that disagrees with `X-WP-Total`. The `posts`
|
|
918
|
-
count by `post_status` is a reconciliation check only — `summarizeCoupons({ restCoupons,
|
|
919
|
-
postsByStatus })` reports the non-published rows as deliberately excluded, never as a shortfall
|
|
920
|
-
(the difference being drafts and auto-drafts).
|
|
921
|
-
- **Redeemability, not expiry, classifies a coupon.** `classifyCoupon` — redeemable iff not expired
|
|
922
|
-
and not usage-exhausted; **`usage_limit` 0 or empty means UNLIMITED**. A `usage_limit` or
|
|
923
|
-
`usage_count` that is not an integer (`"1.5"`, `"abc"`) is `unresolved`: neither redeemable nor
|
|
924
|
-
exhausted, not written (`coupon-usage-limit-unresolved`), its own partition line. Import all
|
|
925
|
-
published coupons; the report carries the breakdown, never "imported N coupons".
|
|
926
|
-
- **Mapping reports rather than approximates.** `mapCouponToWix(coupon, { resolveProduct,
|
|
927
|
-
resolveCategory })` returns a Wix specification or a named refusal: `fgf_free_gift` and any
|
|
928
|
-
unknown `discount_type` are `coupon-type-unmappable`, and so is an **unrestricted
|
|
929
|
-
`fixed_product`** (a per-unit amount on every product; Wix's money-off takes it off the order
|
|
930
|
-
once — a product-scoped one maps); a scope Wix cannot hold in one group is
|
|
931
|
-
`coupon-scope-unmappable`. An exhausted single-use code is imported `active: false`, because
|
|
932
|
-
Wix's usage count starts at zero. An eligibility constraint Wix cannot hold — excluded products
|
|
933
|
-
or categories, a sale-item exclusion, a maximum discount amount, an email restriction, or a
|
|
934
|
-
minimum spend on a product/collection-scoped coupon — is a **refusal** (`coupon-scope-unmappable`,
|
|
935
|
-
reason `scope: constraints`): dropped, each would make the coupon more generous than the
|
|
936
|
-
merchant published. Only a dropped amount on a free-shipping coupon stays a per-coupon finding.
|
|
937
|
-
- **Coupon usage rides on the order.** On legacy post storage the surface is the order's REST
|
|
938
|
-
`coupon_lines[]` (each carrying
|
|
939
|
-
`discount` per code); HPOS stores have `wc_order_coupon_lookup`. Name whichever was found as
|
|
940
|
-
`coupon-usage-surface`. The target side (`rp-target-wix/lib/order-applied-discount-build.js`)
|
|
941
|
-
turns the lines into `appliedDiscounts` through the coupon crosswalk; an unresolved code writes
|
|
942
|
-
nothing and is reported.
|
|
943
|
-
- **Currency halts before any order write.** `currency-gate.js` `evaluateCurrencyGate({
|
|
944
|
-
settingsCurrency, orderCurrencies, targetSiteCurrency })` — settings from
|
|
945
|
-
`wc/v3/settings/general` through `store-currency.js`, order currencies through
|
|
946
|
-
`resolveOrderCurrency` (which decodes `₪` and refuses a contradicting symbol). One
|
|
947
|
-
currency matching the site proceeds with `currency-validated`; a mismatch or a history spanning
|
|
948
|
-
two currencies is a **halt**, and unresolved orders halt too. Two configured currencies with a
|
|
949
|
-
single-currency history proceeds, with the configuration reported.
|
|
950
|
-
- **Plan-shaped sources are gated by row counts** (`B1` subscription products, `B2` membership
|
|
951
|
-
CPT, `B3` recurring-plan meta), never by plugin detection. Zero rows on all three reports "no pricing plans found". The gate and the plan body live target-side
|
|
952
|
-
in `rp-target-wix/lib/pricing-plan-definition.js`.
|
|
953
|
-
|
|
954
|
-
## Currency is a store setting, not an order field
|
|
955
|
-
|
|
956
|
-
`order.currency` is documented as an ISO 4217 code. Do not trust it. A store can return
|
|
957
|
-
`currency: "₪"` (an HTML-encoded currency SYMBOL) on every order, because a plugin or
|
|
958
|
-
theme filter has overridden the field. Passed through, the payment
|
|
959
|
-
existence gate refuses every payment as a currency mismatch; passed through without a gate it
|
|
960
|
-
labels amounts with a symbol.
|
|
961
|
-
|
|
962
|
-
`lib/store-currency.js` resolves it: `readStoreCurrency()` reads `woocommerce_currency` from
|
|
963
|
-
`/wc/v3/settings/general` (one request per run, and the store's own authoritative setting), and
|
|
964
|
-
`resolveOrderCurrency(order, storeCurrency)` trusts the order's own value when it is a plausible
|
|
965
|
-
ISO code — a multi-currency store legitimately holds several — and falls back to the store setting
|
|
966
|
-
when it is not. It reports `order-currency-not-iso` when it falls back, because a store that
|
|
967
|
-
mangles this field is a store whose other currency-bearing fields are suspect too.
|
|
968
|
-
|
|
969
|
-
It never infers a code from a symbol. `$` is at least a dozen different currencies, and guessing
|
|
970
|
-
one silently mislabels money.
|