@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
package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js
DELETED
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// Per-field Yoast override evidence for WooCommerce products.
|
|
4
|
-
//
|
|
5
|
-
// `yoast_head_json` is Yoast's RENDERED output: it can carry a title for every product while the
|
|
6
|
-
// raw override meta holds none. Importing the rendered text turns an inherited template into
|
|
7
|
-
// hundreds of hard per-product overrides. So this module
|
|
8
|
-
// decides, per product and per field, whether the SOURCE proves an override, and records how it
|
|
9
|
-
// knows. Rendered output alone is never proof; it only supplies the decoded value once the raw
|
|
10
|
-
// meta has proven the field was overridden.
|
|
11
|
-
//
|
|
12
|
-
// Deterministic by design. The only I/O is the caller-supplied `queryPage` (a bound
|
|
13
|
-
// wix-wp-plugin-v2 `queryStructure`), so every branch is unit-testable offline.
|
|
14
|
-
|
|
15
|
-
const FIELD_KEYS = Object.freeze({
|
|
16
|
-
title: '_yoast_wpseo_title',
|
|
17
|
-
description: '_yoast_wpseo_metadesc',
|
|
18
|
-
focusKeyword: '_yoast_wpseo_focuskw',
|
|
19
|
-
});
|
|
20
|
-
// Exact allow-list; never widened by key discovery.
|
|
21
|
-
const ALLOWED_KEYS = Object.freeze(Object.values(FIELD_KEYS));
|
|
22
|
-
const SEO_FIELDS = Object.freeze(Object.keys(FIELD_KEYS));
|
|
23
|
-
const HEAD_FIELD = Object.freeze({ title: 'title', description: 'description' });
|
|
24
|
-
const STATES = Object.freeze(['override', 'inherit', 'unknown']);
|
|
25
|
-
|
|
26
|
-
// A post_id list is sent inline in the `where` clause, so keep one batch well inside a request.
|
|
27
|
-
const DEFAULT_BRIDGE_BATCH = 50;
|
|
28
|
-
const MAX_BRIDGE_BATCH = 200;
|
|
29
|
-
const MAX_BRIDGE_PAGES = 1000;
|
|
30
|
-
|
|
31
|
-
function isBlank(value) {
|
|
32
|
-
return value == null || String(value).trim() === '';
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const NAMED_ENTITIES = Object.freeze({
|
|
36
|
-
amp: '&', lt: '<', gt: '>', quot: '"', apos: "'", nbsp: ' ', ndash: '–', mdash: '—',
|
|
37
|
-
hellip: '…', lsquo: '‘', rsquo: '’', ldquo: '“', rdquo: '”', laquo: '«',
|
|
38
|
-
raquo: '»', copy: '©', reg: '®', trade: '™', middot: '·', bull: '•',
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
// Exactly ONE decoding pass. `&amp;` becomes `&`, never `&`: decoding repeatedly would
|
|
42
|
-
// corrupt a title that legitimately contains an entity-looking string.
|
|
43
|
-
function decodeEntitiesOnce(value) {
|
|
44
|
-
return String(value).replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);/gi, (match, body) => {
|
|
45
|
-
if (body[0] === '#') {
|
|
46
|
-
const code = body[1] === 'x' || body[1] === 'X' ? parseInt(body.slice(2), 16) : parseInt(body.slice(1), 10);
|
|
47
|
-
return Number.isInteger(code) && code > 0 && code <= 0x10ffff ? String.fromCodePoint(code) : match;
|
|
48
|
-
}
|
|
49
|
-
const named = NAMED_ENTITIES[body.toLowerCase()];
|
|
50
|
-
return named === undefined ? match : named;
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
function sanitizeRendered(value) {
|
|
55
|
-
if (typeof value !== 'string') return null;
|
|
56
|
-
const decoded = decodeEntitiesOnce(value).trim();
|
|
57
|
-
return decoded === '' ? null : decoded;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
// Channel 1: the product post's REST `meta` object. A key counts only when `meta` contains it;
|
|
61
|
-
// a response without the key (not registered for the product type, or unauthenticated) leaves
|
|
62
|
-
// that key unresolved -- never "no override" -- so it can fall through to the bridge.
|
|
63
|
-
function restEvidence({ response, path = null } = {}) {
|
|
64
|
-
const meta = response && typeof response.meta === 'object' && !Array.isArray(response.meta) ? response.meta : null;
|
|
65
|
-
const out = {};
|
|
66
|
-
for (const key of ALLOWED_KEYS) {
|
|
67
|
-
if (meta && Object.prototype.hasOwnProperty.call(meta, key)) {
|
|
68
|
-
out[key] = { resolved: true, raw: meta[key], evidenceRef: { path, keyPresentInMeta: true } };
|
|
69
|
-
} else {
|
|
70
|
-
out[key] = { resolved: false, reason: meta ? 'key-absent-from-rest-meta' : 'rest-meta-unavailable', evidenceRef: { path } };
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
return out;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
function pinnedKeysOf(eavAccess, keyColumn) {
|
|
77
|
-
if (!eavAccess) return null;
|
|
78
|
-
const pairs = [eavAccess, ...(eavAccess.additionalPairs || [])];
|
|
79
|
-
const pair = pairs.find((p) => p && p.keyColumn === keyColumn);
|
|
80
|
-
if (!pair || pair.tier !== 'key-scoped' || !Array.isArray(pair.pinnedKeys)) return null;
|
|
81
|
-
return pair.pinnedKeys;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// Channel 2: wix-wp-plugin-v2 key-scoped postmeta read, paginated to exhaustion.
|
|
85
|
-
// `queryPage({ structureRequest, cursor })` resolves to queryStructure's `{ rows, pagingMetadata,
|
|
86
|
-
// eavAccess }`. A batch is COMPLETE only when every page succeeded, the response proved a
|
|
87
|
-
// key-scoped read of every queried key, and the last page reported no next cursor. Anything else
|
|
88
|
-
// leaves the batch incomplete -- and only that batch.
|
|
89
|
-
async function readBridgeEvidence({ queryPage, table, productIds, keys = ALLOWED_KEYS, batchSize = DEFAULT_BRIDGE_BATCH, keyColumn = 'meta_key', valueColumn = 'meta_value', idColumn = 'post_id', orderColumn = 'meta_id' } = {}) {
|
|
90
|
-
if (typeof queryPage !== 'function') throw new Error('readBridgeEvidence: queryPage is required');
|
|
91
|
-
if (!table || typeof table !== 'string') throw new Error('readBridgeEvidence: table (the prefixed postmeta table) is required');
|
|
92
|
-
if (!Array.isArray(productIds)) throw new Error('readBridgeEvidence: productIds must be an array');
|
|
93
|
-
if (!Number.isInteger(batchSize) || batchSize < 1 || batchSize > MAX_BRIDGE_BATCH) {
|
|
94
|
-
throw new Error(`readBridgeEvidence: batchSize must be 1..${MAX_BRIDGE_BATCH}`);
|
|
95
|
-
}
|
|
96
|
-
const wanted = [...new Set(keys)];
|
|
97
|
-
if (!wanted.length || wanted.some((key) => !ALLOWED_KEYS.includes(key))) {
|
|
98
|
-
throw new Error(`readBridgeEvidence: keys must be a non-empty subset of ${ALLOWED_KEYS.join(', ')}`);
|
|
99
|
-
}
|
|
100
|
-
const ids = [...new Set(productIds.map(String))];
|
|
101
|
-
const batches = [];
|
|
102
|
-
for (let start = 0, index = 0; start < ids.length; start += batchSize, index += 1) {
|
|
103
|
-
const batchIds = ids.slice(start, start + batchSize);
|
|
104
|
-
const structureRequest = {
|
|
105
|
-
table,
|
|
106
|
-
select: [{ column: orderColumn }, { column: idColumn }, { column: keyColumn }, { column: valueColumn }],
|
|
107
|
-
where: [
|
|
108
|
-
{ column: keyColumn, op: 'in', value: wanted },
|
|
109
|
-
{ column: idColumn, op: 'in', value: batchIds.map((id) => (/^\d+$/.test(id) ? Number(id) : id)) },
|
|
110
|
-
],
|
|
111
|
-
orderBy: [{ column: orderColumn, direction: 'asc' }],
|
|
112
|
-
};
|
|
113
|
-
const batch = { batchId: `yoast-bridge-${index}`, productIds: batchIds, keys: wanted, pageCount: 0, complete: false, finalHasNext: null, reason: null, failedPage: null, rows: [] };
|
|
114
|
-
let cursor;
|
|
115
|
-
for (;;) {
|
|
116
|
-
if (batch.pageCount >= MAX_BRIDGE_PAGES) { batch.reason = 'page-limit-exceeded'; break; }
|
|
117
|
-
let page;
|
|
118
|
-
try {
|
|
119
|
-
page = await queryPage({ structureRequest, cursor });
|
|
120
|
-
} catch (error) {
|
|
121
|
-
batch.failedPage = batch.pageCount + 1;
|
|
122
|
-
batch.reason = `page ${batch.failedPage} failed: ${error && error.message ? error.message : String(error)}`;
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
batch.pageCount += 1;
|
|
126
|
-
const pinned = pinnedKeysOf(page && page.eavAccess, keyColumn);
|
|
127
|
-
if (!pinned || wanted.some((key) => !pinned.includes(key))) {
|
|
128
|
-
batch.failedPage = batch.pageCount;
|
|
129
|
-
batch.reason = `page ${batch.pageCount} did not prove a key-scoped read of every queried key`;
|
|
130
|
-
break;
|
|
131
|
-
}
|
|
132
|
-
if (!page || !Array.isArray(page.rows) || !page.pagingMetadata || typeof page.pagingMetadata.hasNext !== 'boolean') {
|
|
133
|
-
batch.failedPage = batch.pageCount;
|
|
134
|
-
batch.reason = `page ${batch.pageCount} had no rows/pagingMetadata`;
|
|
135
|
-
break;
|
|
136
|
-
}
|
|
137
|
-
for (const row of page.rows) {
|
|
138
|
-
batch.rows.push({ productId: String(row[idColumn]), key: row[keyColumn], value: row[valueColumn] });
|
|
139
|
-
}
|
|
140
|
-
batch.finalHasNext = page.pagingMetadata.hasNext;
|
|
141
|
-
if (!page.pagingMetadata.hasNext) { batch.complete = true; break; }
|
|
142
|
-
const next = page.pagingMetadata.cursors && page.pagingMetadata.cursors.next;
|
|
143
|
-
if (!next) { batch.reason = `page ${batch.pageCount} reported hasNext without a cursor (truncated)`; break; }
|
|
144
|
-
cursor = next;
|
|
145
|
-
}
|
|
146
|
-
batches.push(batch);
|
|
147
|
-
}
|
|
148
|
-
return batches;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
function resolveOverrideValue(field, raw, yoastHeadJson) {
|
|
152
|
-
if (field === 'focusKeyword') return { value: String(raw).trim() };
|
|
153
|
-
const rendered = sanitizeRendered(yoastHeadJson && yoastHeadJson[HEAD_FIELD[field]]);
|
|
154
|
-
if (rendered !== null) return { value: rendered };
|
|
155
|
-
const trimmed = String(raw).trim();
|
|
156
|
-
if (!trimmed.includes('%%')) return { value: trimmed };
|
|
157
|
-
return { unknown: 'override-has-yoast-variables-and-no-resolved-value' };
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// The per-product audit receipt. It is stored with the extraction and is NOT hashed as a
|
|
161
|
-
// whole; only `seoHashProjection` (rp-target-wix/lib/product-seo.js) feeds the source hash.
|
|
162
|
-
function buildProductSeoReceipt({ productId, capturedAt, rest = null, bridgeBatch = null, yoastHeadJson = null } = {}) {
|
|
163
|
-
if (productId == null || String(productId) === '') throw new Error('buildProductSeoReceipt: productId is required');
|
|
164
|
-
if (!capturedAt) throw new Error('buildProductSeoReceipt: capturedAt is required');
|
|
165
|
-
const id = String(productId);
|
|
166
|
-
const fields = {};
|
|
167
|
-
for (const field of SEO_FIELDS) {
|
|
168
|
-
const key = FIELD_KEYS[field];
|
|
169
|
-
const failures = [];
|
|
170
|
-
let raw;
|
|
171
|
-
let provenance = null;
|
|
172
|
-
const restKey = rest && rest[key];
|
|
173
|
-
if (restKey && restKey.resolved) {
|
|
174
|
-
raw = restKey.raw;
|
|
175
|
-
provenance = { channel: 'rest', readComplete: true, evidenceRef: { path: restKey.evidenceRef.path, keyPresentInMeta: true } };
|
|
176
|
-
} else {
|
|
177
|
-
failures.push(restKey ? `rest: ${restKey.reason}` : 'rest: not read');
|
|
178
|
-
if (bridgeBatch && bridgeBatch.complete && bridgeBatch.productIds.includes(id) && bridgeBatch.keys.includes(key)) {
|
|
179
|
-
const row = bridgeBatch.rows.find((r) => r.productId === id && r.key === key);
|
|
180
|
-
raw = row ? row.value : undefined;
|
|
181
|
-
provenance = {
|
|
182
|
-
channel: 'bridge',
|
|
183
|
-
readComplete: true,
|
|
184
|
-
evidenceRef: { batchId: bridgeBatch.batchId, productIds: bridgeBatch.productIds, pageCount: bridgeBatch.pageCount, finalHasNext: false, rowPresent: Boolean(row) },
|
|
185
|
-
};
|
|
186
|
-
} else {
|
|
187
|
-
failures.push(!bridgeBatch ? 'bridge: unavailable' : `bridge: ${bridgeBatch.reason || 'key not read for this product'}`);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
if (!provenance) {
|
|
191
|
-
fields[field] = { state: 'unknown', rawPresent: false, provenance: { channel: 'none', readComplete: false, evidenceRef: { failures } } };
|
|
192
|
-
continue;
|
|
193
|
-
}
|
|
194
|
-
const rawPresent = raw !== undefined && raw !== null;
|
|
195
|
-
if (!rawPresent || isBlank(raw)) {
|
|
196
|
-
fields[field] = { state: 'inherit', rawPresent, provenance };
|
|
197
|
-
continue;
|
|
198
|
-
}
|
|
199
|
-
const resolved = resolveOverrideValue(field, raw, yoastHeadJson);
|
|
200
|
-
if (resolved.unknown) {
|
|
201
|
-
fields[field] = { state: 'unknown', rawPresent, provenance: { ...provenance, evidenceRef: { ...provenance.evidenceRef, failures: [resolved.unknown] } } };
|
|
202
|
-
} else {
|
|
203
|
-
fields[field] = { state: 'override', rawPresent, value: resolved.value, provenance };
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
return { productId: id, capturedAt, fields };
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
// Receipts for a whole extraction. `products` rows: { id, yoast_head_json?, restResponse?,
|
|
210
|
-
// restPath? }. `bridgeBatches` is readBridgeEvidence's output (or [] when the bridge is absent).
|
|
211
|
-
function buildProductSeoReceipts({ products, bridgeBatches = [], capturedAt } = {}) {
|
|
212
|
-
if (!Array.isArray(products)) throw new Error('buildProductSeoReceipts: products must be an array');
|
|
213
|
-
const batchFor = new Map();
|
|
214
|
-
for (const batch of bridgeBatches || []) for (const id of batch.productIds) batchFor.set(String(id), batch);
|
|
215
|
-
return products.map((product) => buildProductSeoReceipt({
|
|
216
|
-
productId: product.id,
|
|
217
|
-
capturedAt,
|
|
218
|
-
rest: product.restResponse ? restEvidence({ response: product.restResponse, path: product.restPath || null }) : null,
|
|
219
|
-
bridgeBatch: batchFor.get(String(product.id)) || null,
|
|
220
|
-
yoastHeadJson: product.yoast_head_json || null,
|
|
221
|
-
}));
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// Canonical-record projection of a receipt (`product.seoEvidence`). `rendered` carries the
|
|
225
|
-
// sanitized rendered title/description ONLY so an owner's `materialize` choice has a value to
|
|
226
|
-
// write; it is never proof and never written without that choice.
|
|
227
|
-
function seoEvidenceFromReceipt(receipt, { yoastHeadJson = null, permalink = null } = {}) {
|
|
228
|
-
const out = {};
|
|
229
|
-
for (const field of SEO_FIELDS) {
|
|
230
|
-
const f = receipt.fields[field];
|
|
231
|
-
out[field] = f.state === 'override' ? { state: 'override', value: f.value } : { state: f.state };
|
|
232
|
-
}
|
|
233
|
-
out.rendered = {
|
|
234
|
-
title: sanitizeRendered(yoastHeadJson && yoastHeadJson.title),
|
|
235
|
-
description: sanitizeRendered(yoastHeadJson && yoastHeadJson.description),
|
|
236
|
-
};
|
|
237
|
-
out.canonical = classifyProductCanonical(yoastHeadJson, permalink);
|
|
238
|
-
return out;
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
// A computed self-canonical (the product's own source permalink) is never written: Wix
|
|
242
|
-
// generates its own. A canonical pointing anywhere else may be intentional, but REST cannot prove
|
|
243
|
-
// it and no policy for foreign canonicals is approved, so it is flagged, never written.
|
|
244
|
-
function normalizeUrl(value) {
|
|
245
|
-
try {
|
|
246
|
-
const url = new URL(String(value));
|
|
247
|
-
return `${url.host.toLowerCase()}${decodeURI(url.pathname).replace(/\/+$/, '')}`;
|
|
248
|
-
} catch (e) {
|
|
249
|
-
return null;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
function classifyProductCanonical(yoastHeadJson, permalink) {
|
|
253
|
-
const canonical = yoastHeadJson && yoastHeadJson.canonical;
|
|
254
|
-
if (isBlank(canonical)) return 'none';
|
|
255
|
-
if (permalink && normalizeUrl(canonical) && normalizeUrl(canonical) === normalizeUrl(permalink)) return 'self';
|
|
256
|
-
return 'pending_policy';
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
module.exports = {
|
|
260
|
-
FIELD_KEYS,
|
|
261
|
-
ALLOWED_KEYS,
|
|
262
|
-
SEO_FIELDS,
|
|
263
|
-
STATES,
|
|
264
|
-
DEFAULT_BRIDGE_BATCH,
|
|
265
|
-
decodeEntitiesOnce,
|
|
266
|
-
restEvidence,
|
|
267
|
-
readBridgeEvidence,
|
|
268
|
-
buildProductSeoReceipt,
|
|
269
|
-
buildProductSeoReceipts,
|
|
270
|
-
seoEvidenceFromReceipt,
|
|
271
|
-
classifyProductCanonical,
|
|
272
|
-
};
|
|
@@ -1,373 +0,0 @@
|
|
|
1
|
-
# WordPress Plugin Profiles
|
|
2
|
-
|
|
3
|
-
Declarative, machine-readable profiles describing how to **detect** one WordPress /
|
|
4
|
-
WooCommerce plugin and **how to read** its durable business data.
|
|
5
|
-
|
|
6
|
-
Profile files are the source of truth. `index.json` is generated from them and checked in so
|
|
7
|
-
runtime lookups stay token-cheap. `lib/plugin-knowledge.js` is the authority on a profile's
|
|
8
|
-
shape; the field reference below documents it.
|
|
9
|
-
|
|
10
|
-
## What a profile is, and is not
|
|
11
|
-
|
|
12
|
-
- **It is** detection signals, per-entity read channels, route scope, and pointers to Wix
|
|
13
|
-
target refs.
|
|
14
|
-
- **It is not** authoritative about what a route returns. The live `OPTIONS` + sample `GET`
|
|
15
|
-
in `scripts/wp-discovery.js` always is. A profile is *advisory*: a stale one can only make
|
|
16
|
-
detection less complete — it can never cause a wrong read.
|
|
17
|
-
- **It does not** hold Wix target behavior. That lives in
|
|
18
|
-
`replatform/resources/rp-target-wix/domains/`. A profile only points at target refs
|
|
19
|
-
(`candidateTargetRefs`) and declares its `capabilities`.
|
|
20
|
-
|
|
21
|
-
## Recognized or not
|
|
22
|
-
|
|
23
|
-
A plugin does not need a profile to migrate; it needs one to migrate *natively*.
|
|
24
|
-
|
|
25
|
-
| Population | What it means |
|
|
26
|
-
| --- | --- |
|
|
27
|
-
| recognized | a profile matched — named entities, channels, and target refs are known; the mapping is `confirmed` |
|
|
28
|
-
| derived | no profile, but the data is REST-visible; the mapping is `proposed` (CMS, or native when the domain KB confirms the proposed capability) |
|
|
29
|
-
| named only | detected with no readable channel — lands in *Pending* or on the no-migration-needed list, reported, never silent |
|
|
30
|
-
|
|
31
|
-
The invariant: **every installed plugin lands in exactly one of the four statuses**
|
|
32
|
-
(migration-planned · no-need-to-migrate · pending · requires-development). Authoring a
|
|
33
|
-
profile is always an upgrade from a working baseline, never the difference between working
|
|
34
|
-
and broken.
|
|
35
|
-
|
|
36
|
-
### Two states automation may assign, and one only a human may
|
|
37
|
-
|
|
38
|
-
**By default every plugin is either profiled or pending.** A capability with no resolved Wix
|
|
39
|
-
target is *pending*, not impossible.
|
|
40
|
-
|
|
41
|
-
| State | Means | Assigned by |
|
|
42
|
-
| --- | --- | --- |
|
|
43
|
-
| migration planned / no need to migrate | resolved to a Wix target — native or CMS — or nothing to move | automation |
|
|
44
|
-
| **pending** | we do not know how to migrate this yet | automation — **the default** |
|
|
45
|
-
| **requires development** | Wix genuinely has no surface for this | **a named human, only** |
|
|
46
|
-
|
|
47
|
-
**Why the restriction.** An agent concluded twice that Wix had no target — gift cards and
|
|
48
|
-
events — and was wrong both times, because Wix splits capabilities across doc trees and a
|
|
49
|
-
service plugin reads like an absent write API. A wrong impossibility is the most expensive
|
|
50
|
-
error in this system: it tells a customer to abandon data that could have moved. So automation
|
|
51
|
-
is capped at *pending*, and the impossibility verdict needs a name against it.
|
|
52
|
-
|
|
53
|
-
**Recording pending** — `capabilities-pending-decision.json`, optional but useful: `reason`,
|
|
54
|
-
the `searched` evidence, and `suspected` (`target-exists` with a `plannedTarget` to author, or
|
|
55
|
-
`no-target` if we think Wix cannot). `suspected` carries **no authority** — a `no-target`
|
|
56
|
-
suspicion is still pending until signed.
|
|
57
|
-
|
|
58
|
-
**Recording a verdict** — `requires-development.json` requires `decidedBy` and
|
|
59
|
-
`decidedOn` alongside the search. Validation rejects an entry without them, and rejects any
|
|
60
|
-
entry once a target entity claims that capability, so a verdict cannot outlive its truth.
|
|
61
|
-
|
|
62
|
-
**Recording "nothing to move" for a capability of a profiled plugin** — the `capabilities[]`
|
|
63
|
-
register in `no-migration-needed.json`: `capability`, `reason` (`platform-does-it` /
|
|
64
|
-
`not-needed` / `reconfigure-in-wix`), `replacedBy`, `rationale`, `decidedBy`, `decidedOn`. The
|
|
65
|
-
slug list below cannot carry this (a slug with a profile is rejected there) and
|
|
66
|
-
*requires-development* is the wrong verdict when Wix covers the outcome natively — so this is
|
|
67
|
-
the third register, and the only way a profiled capability reaches *No need to migrate*
|
|
68
|
-
(`basis: decision`). It is not an impossibility verdict, so no recorded search is required,
|
|
69
|
-
but it is still signed: unsigned entries fail validation and are ignored at runtime. Mutually
|
|
70
|
-
exclusive with the other two registers, and rejected once a target entity claims the
|
|
71
|
-
capability.
|
|
72
|
-
|
|
73
|
-
**Recording "CMS may keep the records" — `cms-fallback-eligible.json`.** A profile **never**
|
|
74
|
-
names a `cms/*` ref in `candidateTargetRefs` (validation rejects it, and the classifier drops
|
|
75
|
-
one from a stale profile): a profile-declared CMS ref used to ship as a *confirmed* CMS plan
|
|
76
|
-
with no merchant decision. CMS keeps a plugin's records; it does not bring back what the plugin
|
|
77
|
-
*did*. So a recognized capability reaches CMS only through two gates:
|
|
78
|
-
|
|
79
|
-
1. **Eligibility (here, signed).** One `capabilities[]` entry per capability: `capability`,
|
|
80
|
-
`targetRefsByEntity` (`"<plugin-slug>/<entity>": ["cms/collection", ...]`, keys covering
|
|
81
|
-
exactly the capability's profile entities), `reason` (why nothing native fits),
|
|
82
|
-
`nativeAlternativesChecked`, `featureLoss` (one merchant-readable sentence of what does not
|
|
83
|
-
work after archival — shown verbatim at the ask and in reports), `decidedBy`, `decidedOn`,
|
|
84
|
-
optional `note`. Only a capability whose every declaring profile declares exactly one
|
|
85
|
-
capability may appear (a multi-capability profile's entity set is ambiguous). Every ref
|
|
86
|
-
starts with `cms/` and resolves. Mutually exclusive with `requires-development.json` and
|
|
87
|
-
the no-need `capabilities[]` register, and rejected once a target entity claims the
|
|
88
|
-
capability. Unsigned entries fail validation and are ignored at runtime.
|
|
89
|
-
2. **Approval (per migration, the merchant).** Eligibility alone plans nothing: the row stays
|
|
90
|
-
*Pending* (`cms-fallback-awaiting-approval`) until the merchant approves or declines at the
|
|
91
|
-
mapping review, recorded as `pluginCmsFallback:<capability>` in that project's
|
|
92
|
-
`orchestration/decisions.json` by `orchestration-state.js decide-cms-fallback`. Nothing is
|
|
93
|
-
written back to this register.
|
|
94
|
-
|
|
95
|
-
Unresolved capabilities are deliberately **not** a validation error. Blocking there would push
|
|
96
|
-
authors to invent a verdict just to make the build pass — which is the failure this rule exists
|
|
97
|
-
to prevent. The coverage report surfaces pending rows and asks a human instead.
|
|
98
|
-
|
|
99
|
-
### Promotion paths into the recognized population
|
|
100
|
-
|
|
101
|
-
Two triggers, three possible destinations. Adding a plugin is a data change: no classifier,
|
|
102
|
-
discovery, mapper or codegen edit.
|
|
103
|
-
|
|
104
|
-
| Trigger | Destination | Cost |
|
|
105
|
-
| --- | --- | --- |
|
|
106
|
-
| **Research phase** — we investigate a plugin we expect to matter | full profile | research doc → profile → target entity → area entry |
|
|
107
|
-
| **After a run** — telemetry flags it unresolved, a human reviews it | full profile | same four |
|
|
108
|
-
| Either, and it turns out to need **no** data migration | one `no-migration-needed.json` line | one line |
|
|
109
|
-
|
|
110
|
-
**Order matters: author the target entity before the profile that points at it**, or record the
|
|
111
|
-
capability as awaiting a target. Validation enforces this rather than leaving it to memory.
|
|
112
|
-
|
|
113
|
-
## Read channels
|
|
114
|
-
|
|
115
|
-
| `channel` | Reads from | Needs |
|
|
116
|
-
| --- | --- | --- |
|
|
117
|
-
| `plugin-rest` | the plugin's own namespace | sometimes plugin-specific credentials |
|
|
118
|
-
| `core-cpt` | `/wp/v2/<rest_base>` | nothing extra |
|
|
119
|
-
| `core-embedded` | properties injected into core/Woo records | sometimes `context=edit` |
|
|
120
|
-
| `core-meta` | registered meta (`show_in_rest`) | auth for edit-context meta |
|
|
121
|
-
| `plugin-rest-child` | a `{parentId}`-templated sub-resource on an already-sampled parent (`route` + `parentRoute`) | nothing extra, but only a representative sample — see SKILL.md |
|
|
122
|
-
| `export-file` | a user-supplied WXR / CSV / JSON export | the file |
|
|
123
|
-
| `db-only` | plugin custom tables | see "Resolving a db-only capability" below |
|
|
124
|
-
| `admin-page-only` | a wp-admin settings page with no REST route at all (config, not records) | human transcription — see below |
|
|
125
|
-
|
|
126
|
-
**Resolving a `db-only` capability -- try this order, do not default straight to a user file:**
|
|
127
|
-
|
|
128
|
-
1. **Check whether the plugin exposes a REST route at all.** Confirm live against
|
|
129
|
-
`GET /wp/v2/plugins` and the REST index -- do not assume from the plugin's name or
|
|
130
|
-
marketing copy.
|
|
131
|
-
2. **If there is no REST route, check the plugin's own admin UI for a built-in export
|
|
132
|
-
first.** Two `db-only` guesses on this project turned out to have one (Discount Rules'
|
|
133
|
-
CSV export, MailPoet's own REST API) and needed no bridge at all -- an existing native
|
|
134
|
-
export is simpler than authoring a new fulfillment.
|
|
135
|
-
3. **Research the plugin's actual storage mechanism** before assuming a bridge can reach
|
|
136
|
-
it: check the plugin's public docs/WordPress.org page, or clone its public GitHub
|
|
137
|
-
source (many WordPress.org plugins are mirrored) and grep for `CREATE TABLE` /
|
|
138
|
-
`dbDelta` (a real custom table) versus `get_option`/`update_option` (`wp_options`) or
|
|
139
|
-
`add_post_meta`/`add_user_meta` (postmeta/usermeta). This determines which of the next
|
|
140
|
-
two steps applies -- guessing wrong wastes a whole fulfillment-authoring attempt.
|
|
141
|
-
4. **A genuine custom database table is reachable, with zero user effort, via
|
|
142
|
-
wix-wp-plugin-v2's `structure-bridge-plugin` fulfillment kind -- try
|
|
143
|
-
this BEFORE falling back to a user-supplied export.** wix-wp-plugin-v2 is this skill
|
|
144
|
-
bundle's own bridge plugin (unlike the retired Wix Migration Helper below, it ships
|
|
145
|
-
with this skill and is meant to be installed on every source site this adapter
|
|
146
|
-
targets). Its `/structure` route describes any live table's real columns; its `/query`
|
|
147
|
-
route reads it with a safe, validated query. A permanent profile is optional: for an
|
|
148
|
-
unfamiliar plugin prepare an evidence-backed project-local entity plan through
|
|
149
|
-
[the shared producer](../PLUGIN-READ-PLANS.md). Do not edit this bundle during a migration.
|
|
150
|
-
Reuse a complete supported REST reader first. When maintaining a reusable profile,
|
|
151
|
-
author its entity's `blocked[]` as
|
|
152
|
-
`{"kind": "structure-bridge-plugin", "resolution": "<what/why, cite live evidence>",
|
|
153
|
-
"declined": false, "fulfillment": {"kind": "structure-bridge-plugin", "handlerId":
|
|
154
|
-
"wix-wp-plugin-v2", "table": "<bare_table_name>"}}` -- `handlerId`/`table` (and the
|
|
155
|
-
optional `sampleStructureRequest` below) live nested under `fulfillment`, not flattened
|
|
156
|
-
onto the `blocked[]` entry itself; `resolution` and `declined` are required on every
|
|
157
|
-
`blocked[]` entry regardless of kind (see the field reference below). Add
|
|
158
|
-
`sampleStructureRequest` when a raw "every column" read would expose something that needs
|
|
159
|
-
filtering or aggregating -- see `pw-woocommerce-gift-cards.json`'s gift-card-balance
|
|
160
|
-
aggregate for a full worked example of the complete shape.
|
|
161
|
-
See `lib/wix-wp-plugin-v2-client.js`, `scripts/wp-discovery.js`'s
|
|
162
|
-
`sampleStructureBridgeEntities` for the full contract.
|
|
163
|
-
|
|
164
|
-
**Credential split, decided by whether the source site has WooCommerce.** The bridge's
|
|
165
|
-
routes register two ways: an Application Password path gated on
|
|
166
|
-
`current_user_can('manage_woocommerce')`, and a signed migration-key JWT path gated only
|
|
167
|
-
on the signature/request-binding. `manage_woocommerce` does not exist on a WordPress
|
|
168
|
-
site with no WooCommerce installed, not even for an administrator -- on such a site the
|
|
169
|
-
Application Password bridge routes are structurally unusable for every user, so do not
|
|
170
|
-
offer an Application Password as the bridge credential on a content-only/blog/marketing
|
|
171
|
-
WordPress site; collect the migration key (`WMH2_MIGRATION_KEY`) instead. An Application
|
|
172
|
-
Password may still be required separately for private `wp/v2` reads. When a migration
|
|
173
|
-
key is configured, `wp-discovery.js` prefers the signed bridge route; otherwise it uses
|
|
174
|
-
the Application Password route when WooCommerce supplies the required capability.
|
|
175
|
-
Standard private `wp/v2`/`wc/v3` reads still require their own WordPress REST credential;
|
|
176
|
-
the migration key is never a substitute for that scope.
|
|
177
|
-
5. **Know which tables the bridge can and cannot reach.**
|
|
178
|
-
|
|
179
|
-
| Table | Reachable? |
|
|
180
|
-
| --- | --- |
|
|
181
|
-
| `wp_options`, `wp_usermeta`, `wp_links`, multisite globals | **No, never.** No unlock path; pinning `option_name` does not help |
|
|
182
|
-
| `wp_postmeta`, `wp_commentmeta`, `wp_termmeta`, `wc_orders_meta`, any `*meta` table, or any table whose live schema carries a recognized key/value column pair | **Yes -- key-scoped.** Key names and counts are freely listable; a value is readable by naming its key (max 50 per request) |
|
|
183
|
-
| A table NAMED like a meta table whose key/value columns are *not* one of the six recognized pairs | **No.** No key column to pin means nothing to scope |
|
|
184
|
-
| Everything else | Yes, in full, minus the named credential columns in `COLUMN_DENYLIST` |
|
|
185
|
-
|
|
186
|
-
Row 2 is the one that changed. `wp_postmeta` **is** reachable now, via a two-step read
|
|
187
|
-
(discover key names, then read the keys you want) -- see `rp-source-wordpress/SKILL.md`'s
|
|
188
|
-
"Reading key/value tables through the bridge" for the request shapes. So Flamingo's message
|
|
189
|
-
data, which this list previously called permanently unreachable, is reachable: it is
|
|
190
|
-
`wp_postmeta` on a `flamingo_inbound` CPT. Checkout Field Editor's is not: it is a single
|
|
191
|
-
`wp_options` row (`thwcfe_sections`), and row 1 is unchanged.
|
|
192
|
-
|
|
193
|
-
**Do not declare a `user-file` blocker or accept a gap for a `wp_postmeta`-shaped entity
|
|
194
|
-
without checking this first.** Asking a site owner to hand-export data the bridge can read
|
|
195
|
-
is a real cost, and a profile that hard-codes "unreachable" outlives the reason it was
|
|
196
|
-
written. When research in step 3 lands on rows 1 or 3, then yes -- stop, and the remaining
|
|
197
|
-
options are `user-file` or accepting the gap.
|
|
198
|
-
|
|
199
|
-
The retired Wix Migration Helper plugin used the same idea -- a
|
|
200
|
-
site-installed bridge exposing specifically-named read-only REST routes for `db-only`
|
|
201
|
-
data -- but was a bespoke, per-capability plugin the site owner had to install
|
|
202
|
-
separately. wix-wp-plugin-v2 replaces it with one generic bridge covering any table,
|
|
203
|
-
subject only to the reachability table in step 5; do not author a new profile against the retired
|
|
204
|
-
`bridge-plugin` fulfillment kind.
|
|
205
|
-
|
|
206
|
-
**`admin-page-only` is not the same limitation as `db-only`.** `admin-page-only` means the
|
|
207
|
-
*configuration itself* renders only inside an authenticated wp-admin page (e.g.
|
|
208
|
-
`wp-admin/admin.php?page=<slug>`), and **WordPress Application Passwords do not
|
|
209
|
-
authenticate wp-admin page loads at all** — only REST API requests. VERIFIED against a
|
|
210
|
-
live WordPress installation (Discount Rules for WooCommerce's `woo_discount_rules`
|
|
211
|
-
settings page): a Basic-Auth request with a valid Application Password 302-redirects to
|
|
212
|
-
`wp-login.php?reauth=1`, the standard unauthenticated-session response, identical to what
|
|
213
|
-
an anonymous request gets. There is no scrapeable path here — WordPress core does not
|
|
214
|
-
extend Application Password auth to admin page rendering, by design.
|
|
215
|
-
|
|
216
|
-
### Blocked source data and fulfillment
|
|
217
|
-
|
|
218
|
-
An entity may declare `blocked[]` only for a concrete, evidenced access gap. Every entry needs a
|
|
219
|
-
`kind` (`user-file` or `structure-bridge-plugin`), a `resolution` (what/why, citing live
|
|
220
|
-
evidence), and a `declined` boolean (whether the user has already declined this ask at
|
|
221
|
-
run time -- always `false` at authoring time). `user-file` means the owner must supply or
|
|
222
|
-
transcribe data; it does not imply a machine-readable import path. `structure-bridge-plugin`
|
|
223
|
-
means wix-wp-plugin-v2 (this skill bundle's own generic bridge -- see "Resolving a `db-only`
|
|
224
|
-
capability" above) can read the table directly; its optional `fulfillment` names the
|
|
225
|
-
registered `handlerId` and the bare `table` to read (plus an optional `sampleStructureRequest`
|
|
226
|
-
-- see the field reference below). A future file handoff uses `fulfillment.kind:
|
|
227
|
-
"csv-upload"` with a registered `handlerId` and `expectedInputPath`.
|
|
228
|
-
|
|
229
|
-
wix-wp-plugin-v2 has no manifest or case registry of its own to check a fulfillment's
|
|
230
|
-
readiness against -- unlike the retired, per-capability Wix Migration Helper bridge, which did (`manifestCaseId`, `expectedNamespace`, `extractionRoute`,
|
|
231
|
-
`productionReady: true` -- do not author against that retired shape). Authorization for
|
|
232
|
-
`structure-bridge-plugin` is a live core-table denylist plus a live `DESCRIBE` check at
|
|
233
|
-
request time, not a build-time readiness flag. Markdown documents are never runtime readiness
|
|
234
|
-
authorities.
|
|
235
|
-
|
|
236
|
-
Do not ask the user for their real WordPress account password to work around this — that is a
|
|
237
|
-
materially more sensitive credential than an Application Password and outside this pipeline's
|
|
238
|
-
secrets model. The correct escalation is the same one already established for other
|
|
239
|
-
structurally-invisible config (Checkout Field Editor's custom fields, PW Gift Cards' DB-only
|
|
240
|
-
balances): surface it as a `blocked: [{kind: "user-file"}]`-style row at the mapping review
|
|
241
|
-
gate and ask the site owner to transcribe or screenshot the specific admin page, since they can
|
|
242
|
-
view it directly with their own login.
|
|
243
|
-
|
|
244
|
-
`core-embedded` matters more than it looks: several major WooCommerce extensions add **no
|
|
245
|
-
REST route at all** and only widen `wc/v3/products` / `wc/v3/orders` payloads. Those plugins
|
|
246
|
-
are detectable solely from sampled record keys, which is why detection runs a second pass
|
|
247
|
-
after sampling.
|
|
248
|
-
|
|
249
|
-
`plugin-rest-child` is for a sub-resource that needs a known parent id first (e.g.
|
|
250
|
-
`/wc/v3/orders/{parentId}/notes`) and so can never be listed as its own flat collection.
|
|
251
|
-
`route` carries the literal `{parentId}` placeholder; `parentRoute` names the collection route
|
|
252
|
-
(already in scope and sampled) that supplies real ids. See SKILL.md's "Read channels" section
|
|
253
|
-
for how presence is checked and why a live per-parent sample is a representative check, not a
|
|
254
|
-
completeness claim.
|
|
255
|
-
|
|
256
|
-
## Adding a plugin
|
|
257
|
-
|
|
258
|
-
1. Read the vendor's REST documentation and record its URL in `sourceOfTruth`.
|
|
259
|
-
2. Create `plugins/<slug>.json` following the field reference below. The filename slug must
|
|
260
|
-
equal `plugin`.
|
|
261
|
-
3. Declare detection signals. Prefer `pluginFileIds` and `routes` (high confidence) over
|
|
262
|
-
`restNamespaces` and `assetPathSlugs` (low confidence — `wc/v3` is shared by dozens of
|
|
263
|
-
plugins).
|
|
264
|
-
4. Declare one entity per durable record type, each with a `channel` and
|
|
265
|
-
`candidateTargetRefs`. An entity with no target refs must carry a `pitfall` explaining the
|
|
266
|
-
gap. Never list a `cms/*` ref: if nothing native fits and CMS should keep the records, a
|
|
267
|
-
named human adds a signed `cms-fallback-eligible.json` entry instead.
|
|
268
|
-
5. Put helper, runtime, and configuration routes in `excludeRoutes` so the plugin's data
|
|
269
|
-
routes can be opted in without widening scope.
|
|
270
|
-
6. Add a fixture: extend `test-fixtures/rest-index-plugins.json` and, if relevant,
|
|
271
|
-
`test-fixtures/wp-plugin-signals.json`, then assert detection in
|
|
272
|
-
`scripts/wp-plugin-contract-test.js`.
|
|
273
|
-
7. Regenerate and validate:
|
|
274
|
-
|
|
275
|
-
```bash
|
|
276
|
-
node scripts/plugin-knowledge-validate.js --write-index
|
|
277
|
-
node scripts/wp-plugin-contract-test.js
|
|
278
|
-
node scripts/wp-discovery-classifier-test.js
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
## Profile field reference
|
|
282
|
-
|
|
283
|
-
`lib/plugin-knowledge.js` is the **authority** on this shape — there is no `schema.json`, on
|
|
284
|
-
purpose: a second non-enforcing definition of the same contract only drifts out of sync.
|
|
285
|
-
|
|
286
|
-
**Required:** `schemaVersion` (1) · `plugin` (must equal the filename slug) · `displayName` ·
|
|
287
|
-
`profileVersion` (bump when the plugin's API changes) · `sourceOfTruth` (vendor docs URL) ·
|
|
288
|
-
`capabilities[]` · `detect` · `entities[]`.
|
|
289
|
-
|
|
290
|
-
**`detect`** — at least one signal required:
|
|
291
|
-
|
|
292
|
-
| Field | Confidence | Notes |
|
|
293
|
-
| --- | --- | --- |
|
|
294
|
-
| `pluginFileIds[]` | high | `plugin` values from `GET /wp/v2/plugins`. Matched on the directory too, because the main-file basename often differs (`wordpress-seo/wp-seo`). |
|
|
295
|
-
| `routes[]` | high | routes whose presence in the REST index identifies this plugin |
|
|
296
|
-
| `restBases[]` | medium | `rest_base` from `/wp/v2/types` or `/wp/v2/taxonomies` |
|
|
297
|
-
| `recordProperties[]` | medium | keys this plugin injects into core/Woo payloads; the only way to see route-less extensions |
|
|
298
|
-
| `restNamespaces[]` | low | **shared platform namespaces are rejected** — `wc/v3` identifies WooCommerce, not your plugin |
|
|
299
|
-
| `assetPathSlugs[]` | low | `/wp-content/plugins/<slug>/`, works with no credentials |
|
|
300
|
-
| `minVersion` | — | below it, detection reports `api-below-min-version` rather than assuming the API |
|
|
301
|
-
|
|
302
|
-
**`entities[]`** — each requires `entity`, `channel`, `candidateTargetRefs[]`. `capability` is
|
|
303
|
-
optional for backward compatibility, but required on every entity once any entity in that profile
|
|
304
|
-
uses it; it must name one of the profile's `capabilities[]`. This attribution prevents a
|
|
305
|
-
multi-capability profile's entities and target refs from leaking into each other's coverage rows.
|
|
306
|
-
Then:
|
|
307
|
-
**The FIRST `blocker`-severity pitfall across a capability's entities is what the merchant
|
|
308
|
-
reads.** `classifyCoverage` uses it verbatim as the coverage row's `userImpact`, and
|
|
309
|
-
`buildDispositionRows` joins those into the plugin's `consequence` line. So lead that one with
|
|
310
|
-
the consequence in plain words and put the internal instruction after it — an authoring note or
|
|
311
|
-
a cross-reference in first position becomes the customer-facing sentence.
|
|
312
|
-
|
|
313
|
-
`route` (route-bearing channels; a `{parentId}`-templated path for `plugin-rest-child`) ·
|
|
314
|
-
`parentRoute` (`plugin-rest-child` only — the already-sampled collection route parent ids come
|
|
315
|
-
from) · `responseEnvelope` (route-bearing channels only — `{itemsPath, countPath}` for a
|
|
316
|
-
non-standard wrapped response; see below) · `embeddedIn[]` + `propertyPath` (`core-embedded`) ·
|
|
317
|
-
`context` (`view`/`edit`/`both`, when the two differ) · `requiresParent` (sub-collection
|
|
318
|
-
ordering) · `hierarchical` · `recordKeyField` · `relations[]` · `pitfalls[]`
|
|
319
|
-
(`code`/`severity`/`summary`) · `blocked[]` (an evidenced access gap; `kind`, `resolution`,
|
|
320
|
-
`declined`, and optional executable `fulfillment`) · `overridesCoreRule`.
|
|
321
|
-
|
|
322
|
-
**`responseEnvelope`** — for a plugin whose REST route does not return a flat array (or a
|
|
323
|
-
single object), and does not advertise `X-WP-Total`/`X-WP-TotalPages` headers. `itemsPath` is
|
|
324
|
-
the dot-path to the array of records inside the response body (e.g. MailPoet's
|
|
325
|
-
`"data.items"`); `countPath` is the optional dot-path to the true total count when the header
|
|
326
|
-
is absent (e.g. `"data.meta.count"` — without it, `recordCount` reflects only the sampled
|
|
327
|
-
page, same as a headerless flat array). Sampling and counting otherwise behave exactly as they
|
|
328
|
-
would for a flat array once unwrapped — this only changes *where in the response* the sampler
|
|
329
|
-
looks.
|
|
330
|
-
|
|
331
|
-
**Optional top level:** `distribution` · `credentials[]` (plugin-specific keys) ·
|
|
332
|
-
`dataRoutePatterns[]` (wholly data-bearing namespaces) · `excludeRoutes[]` ·
|
|
333
|
-
`quirks[]`. (`dispositionHint` is retired — a plugin either has a profile or a `no-migration-needed.json` entry, never both.)
|
|
334
|
-
|
|
335
|
-
## Rules the validator enforces
|
|
336
|
-
|
|
337
|
-
- `plugin` matches the filename; `schemaVersion` is 1; `profileVersion` and `sourceOfTruth`
|
|
338
|
-
are present (drift provenance).
|
|
339
|
-
- Every `candidateTargetRefs` entry resolves in `rp-target-wix/domains/index.json`, and none
|
|
340
|
-
is a `cms/*` ref (CMS goes through `cms-fallback-eligible.json` plus the merchant's approval).
|
|
341
|
-
- `cms-fallback-eligible.json` entries are signed, complete, CMS-only, cover exactly the
|
|
342
|
-
capability's profile entities, belong to single-capability profiles, and are exclusive with
|
|
343
|
-
the other two signed registers.
|
|
344
|
-
- Every `capability` is claimed by a Wix target entity's `capability` field **or** listed in
|
|
345
|
-
`requires-development.json` with a reason.
|
|
346
|
-
- Route-bearing channels declare `route`; `core-embedded` declares `embeddedIn` +
|
|
347
|
-
`propertyPath`.
|
|
348
|
-
- A wildcard route pattern keeps at least **two concrete leading segments**: `/ssp/v1/*` is
|
|
349
|
-
allowed, `/yoast/*` is not. This is what stops a profile from silently reopening an
|
|
350
|
-
excluded route family.
|
|
351
|
-
- No two profiles claim the same route, and no profile shadows a classifier core rule
|
|
352
|
-
without `"overridesCoreRule": true`.
|
|
353
|
-
|
|
354
|
-
## Route precedence
|
|
355
|
-
|
|
356
|
-
Highest to lowest:
|
|
357
|
-
|
|
358
|
-
1. operator `--exclude-route`
|
|
359
|
-
2. profile `excludeRoutes`
|
|
360
|
-
3. profile entity routes and `dataRoutePatterns`
|
|
361
|
-
4. the classifier's own category rules
|
|
362
|
-
5. generic collection-shape acceptance
|
|
363
|
-
6. unsupported by default
|
|
364
|
-
|
|
365
|
-
Profile data routes outrank exclusion families because an explicitly listed route *is* the
|
|
366
|
-
per-capability opt-in — bounded by the wildcard rule above.
|
|
367
|
-
|
|
368
|
-
## Maintenance
|
|
369
|
-
|
|
370
|
-
- Keep long analysis separate from the profile; profiles carry compact facts and a `sourceOfTruth` link.
|
|
371
|
-
- Bump `profileVersion` when a plugin's API changes.
|
|
372
|
-
- A capability that keeps resolving as `proposed` across real runs is the signal to
|
|
373
|
-
write a profile for it.
|