@wix/agent-skills 1.33.0 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (635) hide show
  1. package/README.md +23 -0
  2. package/package.json +2 -2
  3. package/skills/wix-app/references/DASHBOARD_PAGE.md +1 -1
  4. package/skills/wix-export/SKILL.md +83 -0
  5. package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
  6. package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
  7. package/skills/wix-harmony-editor/SKILL.md +317 -0
  8. package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
  9. package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
  10. package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
  11. package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
  12. package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
  13. package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
  14. package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
  15. package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
  16. package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
  17. package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
  18. package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
  19. package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
  20. package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
  21. package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
  22. package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
  23. package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
  24. package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
  25. package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
  26. package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
  27. package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
  28. package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
  29. package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
  30. package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
  31. package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
  32. package/skills/wix-headless/SKILL.md +7 -2
  33. package/skills/wix-headless/references/CAPABILITIES.md +6 -1
  34. package/skills/wix-headless/references/DISCOVERY.md +2 -1
  35. package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
  36. package/skills/wix-headless/references/SEED.md +3 -2
  37. package/skills/wix-headless/references/SETUP.md +1 -0
  38. package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
  39. package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
  40. package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
  41. package/skills/wix-headless/references/managed/CREATE.md +1 -1
  42. package/skills/wix-headless-kit/SKILL.md +110 -21
  43. package/skills/wix-headless-kit/guides/api-run.md +15 -13
  44. package/skills/wix-headless-kit/guides/existing-site.md +31 -0
  45. package/skills/wix-headless-kit/guides/migration.md +49 -17
  46. package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
  47. package/skills/wix-headless-kit/install/context.mjs +61 -6
  48. package/skills/wix-headless-kit/install/pins.json +1 -1
  49. package/skills/wix-headless-kit/install/setup.mjs +107 -12
  50. package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
  51. package/skills/wix-headless-replatform/SKILL.md +116 -0
  52. package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
  53. package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
  54. package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
  55. package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
  56. package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
  57. package/skills/wix-headless-replatform/references/output-contract.md +93 -0
  58. package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
  59. package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
  60. package/skills/wix-headless-replatform/references/safety.md +19 -0
  61. package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
  62. package/skills/wix-headless-replatform/references/workflow.md +157 -0
  63. package/skills/wix-headless-replatform/registry/README.md +20 -0
  64. package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
  65. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
  66. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
  67. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
  68. package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
  69. package/skills/wix-headless-replatform/registry/registry.json +36 -0
  70. package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
  71. package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
  72. package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
  73. package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
  74. package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
  75. package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
  76. package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
  77. package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
  78. package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
  79. package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
  80. package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
  81. package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
  82. package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
  83. package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
  84. package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
  85. package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
  86. package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
  87. package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
  88. package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
  89. package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
  90. package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
  91. package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
  92. package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
  93. package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
  94. package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
  95. package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
  96. package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
  97. package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
  98. package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
  99. package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
  100. package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
  101. package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
  102. package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
  103. package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
  104. package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
  105. package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
  106. package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
  107. package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
  108. package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
  109. package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
  110. package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
  111. package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
  112. package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
  113. package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
  114. package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
  115. package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
  116. package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
  117. package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
  118. package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
  119. package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
  120. package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
  121. package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
  122. package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
  123. package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
  124. package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
  125. package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
  126. package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
  127. package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
  128. package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
  129. package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
  130. package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
  131. package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
  132. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
  133. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
  134. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
  135. package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
  136. package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
  137. package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
  138. package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
  139. package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
  140. package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
  141. package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
  142. package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
  143. package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
  144. package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
  145. package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
  146. package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
  147. package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
  148. package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
  149. package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
  150. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
  151. package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
  152. package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
  153. package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
  154. package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
  155. package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
  156. package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
  157. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
  158. package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
  159. package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
  160. package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
  161. package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
  162. package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
  163. package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
  164. package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
  165. package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
  166. package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
  167. package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
  168. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
  169. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
  170. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
  171. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
  172. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
  173. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
  174. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
  175. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
  176. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
  177. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
  178. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
  179. package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
  180. package/skills/wix-import/SKILL.md +90 -0
  181. package/skills/wix-manage/SKILL.md +38 -10
  182. package/skills/wix-manage/references/automations/actions.md +11 -11
  183. package/skills/wix-manage/references/automations/activation-status.md +6 -9
  184. package/skills/wix-manage/references/automations/api-catalog.md +48 -32
  185. package/skills/wix-manage/references/automations/automation-model.md +97 -22
  186. package/skills/wix-manage/references/automations/bracket-expressions.md +7 -7
  187. package/skills/wix-manage/references/automations/build-and-manage-automations.md +140 -309
  188. package/skills/wix-manage/references/automations/conditions.md +187 -0
  189. package/skills/wix-manage/references/automations/schemas-and-scheduling.md +191 -0
  190. package/skills/wix-manage/references/automations/special-actions.md +210 -0
  191. package/skills/wix-manage/references/automations/triggers.md +47 -10
  192. package/skills/wix-manage/references/automations/validation-and-verification.md +320 -0
  193. package/skills/wix-manage/references/custom-apps/use-app-tools.md +124 -0
  194. package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
  195. package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
  196. package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
  197. package/skills/wix-manage/references/events/create-wix-event.md +136 -73
  198. package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
  199. package/skills/wix-manage/references/events/manage-event-guests.md +366 -0
  200. package/skills/wix-manage/references/events/manage-event-tickets.md +293 -0
  201. package/skills/wix-manage/references/events/manage-wix-events.md +313 -55
  202. package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
  203. package/skills/wix-manage/references/sites/upload-static-site.md +127 -8
  204. package/skills/wix-manage/references/stores/update-product-with-options.md +58 -2
  205. package/skills/wix-replatform/.publish-manifest.json +5 -5
  206. package/skills/wix-replatform/CLI.md +162 -0
  207. package/skills/wix-replatform/README.md +52 -0
  208. package/skills/wix-replatform/SKILL.md +229 -684
  209. package/skills/wix-replatform/console/account.css +1 -0
  210. package/skills/wix-replatform/console/app.css +1 -0
  211. package/skills/wix-replatform/console/app.js +117 -0
  212. package/skills/wix-replatform/console/index.html +4 -0
  213. package/skills/wix-replatform/console/json.css +11 -0
  214. package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
  215. package/skills/wix-replatform/lib/app-page-routing.js +75 -0
  216. package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
  217. package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
  218. package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
  219. package/skills/wix-replatform/lib/completion-report.js +1393 -13
  220. package/skills/wix-replatform/lib/config-env.js +85 -11
  221. package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
  222. package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
  223. package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
  224. package/skills/wix-replatform/lib/destination-choice.js +163 -0
  225. package/skills/wix-replatform/lib/destination-handoff.js +62 -0
  226. package/skills/wix-replatform/lib/destination-http.js +81 -0
  227. package/skills/wix-replatform/lib/destination-route.js +98 -0
  228. package/skills/wix-replatform/lib/destination.js +919 -0
  229. package/skills/wix-replatform/lib/discovered-census.js +231 -0
  230. package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
  231. package/skills/wix-replatform/lib/document-url-guard.js +203 -0
  232. package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
  233. package/skills/wix-replatform/lib/entity-verification.js +18 -0
  234. package/skills/wix-replatform/lib/execution-capability.js +120 -0
  235. package/skills/wix-replatform/lib/execution-log.js +170 -0
  236. package/skills/wix-replatform/lib/execution-manifest.js +20 -2
  237. package/skills/wix-replatform/lib/execution-state.js +22 -0
  238. package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
  239. package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
  240. package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
  241. package/skills/wix-replatform/lib/import-recovery.js +800 -6
  242. package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
  243. package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
  244. package/skills/wix-replatform/lib/link-audit.js +173 -0
  245. package/skills/wix-replatform/lib/link-census.js +194 -0
  246. package/skills/wix-replatform/lib/link-plan.js +148 -0
  247. package/skills/wix-replatform/lib/link-verification.js +274 -0
  248. package/skills/wix-replatform/lib/link-write-journal.js +42 -0
  249. package/skills/wix-replatform/lib/local-state.js +869 -30
  250. package/skills/wix-replatform/lib/member-completion.js +658 -0
  251. package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
  252. package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
  253. package/skills/wix-replatform/lib/migration-completion.js +311 -0
  254. package/skills/wix-replatform/lib/operator-identity.js +47 -0
  255. package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
  256. package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
  257. package/skills/wix-replatform/lib/orchestration-router.js +608 -32
  258. package/skills/wix-replatform/lib/orchestration-state.js +188 -12
  259. package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
  260. package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
  261. package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
  262. package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
  263. package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
  264. package/skills/wix-replatform/lib/progress-log.js +19 -3
  265. package/skills/wix-replatform/lib/read-back-approval.js +184 -0
  266. package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
  267. package/skills/wix-replatform/lib/read-back-contract.js +243 -0
  268. package/skills/wix-replatform/lib/read-back-extract.js +118 -0
  269. package/skills/wix-replatform/lib/read-back-gate.js +734 -0
  270. package/skills/wix-replatform/lib/read-back-reads.js +94 -0
  271. package/skills/wix-replatform/lib/read-back-state.js +107 -0
  272. package/skills/wix-replatform/lib/read-back-summary.js +81 -0
  273. package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
  274. package/skills/wix-replatform/lib/run-controller.js +401 -0
  275. package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
  276. package/skills/wix-replatform/lib/setup-verification.js +148 -0
  277. package/skills/wix-replatform/lib/source-access.js +231 -0
  278. package/skills/wix-replatform/lib/source-coverage.js +1130 -0
  279. package/skills/wix-replatform/lib/source-secrets.js +277 -0
  280. package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
  281. package/skills/wix-replatform/lib/task-state.js +110 -0
  282. package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
  283. package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
  284. package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
  285. package/skills/wix-replatform/lib/url-verification.js +315 -0
  286. package/skills/wix-replatform/lib/user-action-effects.js +42 -0
  287. package/skills/wix-replatform/lib/user-actions.js +264 -0
  288. package/skills/wix-replatform/lib/website-handoff.js +1220 -0
  289. package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
  290. package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
  291. package/skills/wix-replatform/lib/write-verification-state.js +92 -0
  292. package/skills/wix-replatform/lib/write-verification.js +274 -0
  293. package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
  294. package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
  295. package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
  296. package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
  297. package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
  298. package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
  299. package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
  300. package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
  301. package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
  302. package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
  303. package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
  304. package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
  305. package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
  306. package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
  307. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
  308. package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
  309. package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
  310. package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
  311. package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
  312. package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
  313. package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
  314. package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
  315. package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
  316. package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
  317. package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
  318. package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
  319. package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
  320. package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
  321. package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
  322. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
  323. package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
  324. package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
  325. package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
  326. package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
  327. package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
  328. package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
  329. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
  330. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
  331. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
  332. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
  333. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
  334. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
  335. package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
  336. package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
  337. package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
  338. package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
  339. package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
  340. package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
  341. package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
  342. package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
  343. package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
  344. package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
  345. package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
  346. package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
  347. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
  348. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
  349. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
  350. package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
  351. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
  352. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
  353. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
  354. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
  355. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
  356. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
  357. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
  358. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
  359. package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
  360. package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
  361. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
  362. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
  363. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
  364. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
  365. package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
  366. package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
  367. package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
  368. package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
  369. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
  370. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
  371. package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
  372. package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
  373. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
  374. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
  375. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
  376. package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
  377. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
  378. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
  379. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
  380. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
  381. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
  382. package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
  383. package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
  384. package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
  385. package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
  386. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
  387. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
  388. package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
  389. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
  390. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
  391. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
  392. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
  393. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
  394. package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
  395. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
  396. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
  397. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
  398. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
  399. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
  400. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
  401. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
  402. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
  403. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
  404. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
  405. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
  406. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
  407. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
  408. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
  409. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
  410. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
  411. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
  412. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
  413. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
  414. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
  415. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
  416. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
  417. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
  418. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
  419. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
  420. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
  421. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
  422. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
  423. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
  424. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
  425. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
  426. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
  427. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
  428. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
  429. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
  430. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
  431. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
  432. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
  433. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
  434. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
  435. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
  436. package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
  437. package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
  438. package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
  439. package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
  440. package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
  441. package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
  442. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
  443. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
  444. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
  445. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
  446. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
  447. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
  448. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
  449. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
  450. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
  451. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
  452. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
  453. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
  454. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
  455. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
  456. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
  457. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
  458. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
  459. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
  460. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
  461. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
  462. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
  463. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
  464. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
  465. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
  466. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
  467. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
  468. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
  469. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
  470. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
  471. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
  472. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
  473. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
  474. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
  475. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
  476. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
  477. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
  478. package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
  479. package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
  480. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
  481. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
  482. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
  483. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
  484. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
  485. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
  486. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
  487. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
  488. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
  489. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
  490. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
  491. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
  492. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
  493. package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
  494. package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
  495. package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
  496. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
  497. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
  498. package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
  499. package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
  500. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
  501. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
  502. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
  503. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
  504. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
  505. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
  506. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
  507. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
  508. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
  509. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
  510. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
  511. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
  512. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
  513. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
  514. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
  515. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
  516. package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
  517. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
  518. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
  519. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
  520. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
  521. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
  522. package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
  523. package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
  524. package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
  525. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
  526. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
  527. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
  528. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
  529. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
  530. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
  531. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
  532. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
  533. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
  534. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
  535. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
  536. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
  537. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
  538. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
  539. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
  540. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
  541. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
  542. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
  543. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
  544. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
  545. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
  546. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
  547. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
  548. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
  549. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
  550. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
  551. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
  552. package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
  553. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
  554. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
  555. package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
  556. package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
  557. package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
  558. package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
  559. package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
  560. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
  561. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
  562. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
  563. package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
  564. package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
  565. package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
  566. package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
  567. package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
  568. package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
  569. package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
  570. package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
  571. package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
  572. package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
  573. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
  574. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
  575. package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
  576. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
  577. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
  578. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
  579. package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
  580. package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
  581. package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
  582. package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
  583. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
  584. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
  585. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
  586. package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
  587. package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
  588. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
  589. package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
  590. package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
  591. package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
  592. package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
  593. package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
  594. package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
  595. package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
  596. package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
  597. package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
  598. package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
  599. package/skills/wix-replatform/scripts/discovered-census.js +26 -0
  600. package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
  601. package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
  602. package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
  603. package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
  604. package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
  605. package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
  606. package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
  607. package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
  608. package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
  609. package/skills/wix-replatform/scripts/migration-completion.js +76 -0
  610. package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
  611. package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
  612. package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
  613. package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
  614. package/skills/wix-replatform/scripts/replatform-console.js +146 -0
  615. package/skills/wix-replatform/scripts/replatform.js +436 -0
  616. package/skills/wix-replatform/scripts/source-secrets.js +77 -0
  617. package/skills/wix-replatform/scripts/url-redirects.js +286 -0
  618. package/skills/wix-replatform/scripts/user-action.js +58 -0
  619. package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
  620. package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
  621. package/skills/wix-replatform/scripts/wix-destination.js +143 -0
  622. package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
  623. package/skills/wix-vibe-headless/SKILL.md +7 -3
  624. package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
  625. package/skills/wix-vibe-headless/platforms/base44.md +1 -0
  626. package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
  627. package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
  628. package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
  629. package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
  630. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
  631. package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
  632. package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
  633. package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
  634. package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +0 -208
  635. package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
@@ -0,0 +1,182 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "domain": "ecom",
4
+ "entity": "discount-rule",
5
+ "displayName": "eCommerce Discount Rule (\"Automatic Discounts\" in the dashboard)",
6
+ "capability": "commerce.discount-rules",
7
+ "target": {
8
+ "classification": "native",
9
+ "nativeEntity": "DiscountRule",
10
+ "verifiedFqdn": "wix.ecom.discounts.v1.discount_rule",
11
+ "idPolicy": "server-assigned",
12
+ "crosswalkRequired": true
13
+ },
14
+ "dependsOn": [
15
+ "stores/product",
16
+ "stores/category"
17
+ ],
18
+ "blockedSourceDependencies": [
19
+ {
20
+ "sourceEntityRef": "plugin.woo-discount-rules.discount-rule-definition",
21
+ "degradedField": "rule-definition",
22
+ "pitfallCode": "rule-definitions-via-bridge-plugin-not-rest",
23
+ "degradation": "warning"
24
+ }
25
+ ],
26
+ "sourceAliases": [
27
+ {
28
+ "sourceSystem": "woocommerce",
29
+ "sourceEntity": "discount-rule-definition",
30
+ "sourcePlugin": "woo-discount-rules",
31
+ "routes": [],
32
+ "confidence": "medium",
33
+ "note": "No REST route to the wp-admin settings page itself, but the underlying wdr_rules table is directly readable via wix-wp-plugin-v2's discover-structure/query-structure -- VERIFIED LIVE 2026-08-28 against an anonymized live source. See the plugin profile's db-only entity and its blocked[].fulfillment."
34
+ }
35
+ ],
36
+ "preferredWrite": {
37
+ "surface": "Discount Rules",
38
+ "endpoint": "POST /ecom/v1/discount-rules",
39
+ "writerId": "createDiscountRule",
40
+ "verification": "verified-live",
41
+ "importSafe": true,
42
+ "bulk": false
43
+ },
44
+ "fallbacks": [
45
+ {
46
+ "classification": "cms",
47
+ "when": "The source rule's trigger/effect combination cannot be expressed by DiscountRule's trigger/discount model (e.g. a shape Wix genuinely has no primitive for) — record as a mapping gap with the specific unsupported combination, do not approximate silently."
48
+ }
49
+ ],
50
+ "reliability": {
51
+ "status": "partially-reliable",
52
+ "flags": []
53
+ },
54
+ "pitfalls": [
55
+ {
56
+ "code": "scope-id-must-follow-wix-own-prefix-convention-or-the-rule-is-dashboard-uneditable",
57
+ "severity": "blocker",
58
+ "summary": "`scopes[].id` accepts ANY non-empty string server-side (create succeeds with an arbitrary value like `\"stores-catalog\"`), but the merchant dashboard's own Automatic Discounts editor only recognizes the id patterns Wix's own tooling generates: `all_<catalogAppId>` (storewide), `specific_<catalogAppId>` (named products, id + catalogItemIds), `collections_<catalogAppId>` (CUSTOM_FILTER, a collection). VERIFIED LIVE 2026-08-29 in anonymized live verification: a rule created with `scopes[].id: \"stores-catalog\"` shows in the dashboard as created by a third-party integration with NO edit option at all -- confirmed by direct comparison via Get Discount Rule against a dashboard-created rule in the same anonymized verification environment, whose only structural difference was this id (`all_215238eb-22a5-4c36-9e7b-e7c08025e04e`) plus a populated `settings` object (see the settings-object pitfall below). This defeats any placeholder-rule strategy that relies on the merchant reconfiguring the rule afterward in the dashboard -- always use the real `all_`/`specific_`/`collections_` prefix, never an arbitrary caller-assigned id, even though the API accepts one.",
59
+ "unverified": false
60
+ },
61
+ {
62
+ "code": "settings-and-activeTimeInfo-should-be-populated-on-create",
63
+ "severity": "blocker",
64
+ "summary": "`settings.indexOptIn` and `activeTimeInfo.start` are both omittable server-side (create succeeds with neither), but every dashboard-created rule observed live carries `settings.indexOptIn: true` and a populated `activeTimeInfo.start` even when the caller never asked for a start date -- confirmed by the Wix skills doc's own \"Settings\" section (`{appliesTo: \"ALL_ITEMS\", indexOptIn: true}` verbatim) and its \"Date handling\" table (`startDate` empty -> default to current time, never omit). Missed in the first TWO live-fix passes in anonymized live verification (2026-08-29) -- both times the dashboard-editability bug looked fully explained by the scope-id/quantity-range findings alone, but this was a third, independently real gap sitting underneath them. Always set `settings: {appliesTo: \"ALL_ITEMS\", indexOptIn: true}` AND `activeTimeInfo: {start: <now, ISO 8601>}` on create -- never omit either just because the API accepts the omission.",
65
+ "unverified": false
66
+ },
67
+ {
68
+ "code": "automatic-discounts-is-a-dashboard-label-for-discount-rules",
69
+ "severity": "info",
70
+ "summary": "The Wix dashboard calls this feature 'Automatic Discounts'; the API/data model name is DiscountRule (`ecom/v1/discount-rules`). Distinct from the Coupons API (stores/coupon.json) — coupons need a customer-entered code, discount rules apply automatically when their trigger is met. Do not conflate the two when a source plugin (e.g. WooCommerce Discount Rules) models automatic, no-code discounting."
71
+ },
72
+ {
73
+ "code": "only-one-discount-per-rule",
74
+ "severity": "warning",
75
+ "summary": "Per dev.wix.com: 'Currently, only 1 discount can be defined per discount rule.' A source rule with multiple stacked effects needs one Wix DiscountRule per effect, not one rule with a list."
76
+ },
77
+ {
78
+ "code": "cumulative-tiered-discount-needs-one-rule-per-tier-no-clean-solution",
79
+ "severity": "blocker",
80
+ "summary": "SUPERSEDED IN PART 2026-08-31 -- see bounded-quantity-bands-need-a-custom-trigger-spi below for a clean solution via the Custom Discount Triggers service plugin (bands become mutually exclusive, nothing stacks). The trade-off described here still applies whenever you are restricted to NATIVE triggers only.\n\nA source cumulative/tiered quantity discount (e.g. WooCommerce Discount Rules' bulk_adjustments: 1-5 units -> 5% off, 6-10 -> 10%, 11-15 -> 15%, ...) has no single-rule Wix equivalent (only-one-discount-per-rule, above), AND every multi-rule approach has a real downside -- there is no clean fix, only a tradeoff a human must choose:\n(a) BOUNDED (`itemQuantityRange: {from, to}`, both inclusive -- VERIFIED LIVE the field accepts both, not from-only as the truncated docs example suggested): ranges are non-overlapping by construction (correct math, no stacking), but VERIFIED LIVE 2026-08-29 the merchant dashboard's Automatic Discounts editor cannot render a bounded range at all -- it shows EVERY such rule as created by a third-party integration with no edit option, the same failure as the scope-id pitfall, not a coincidence.\n(b) OPEN-ENDED (`itemQuantityRange: {from}` only, one rule per tier's minimum): fully dashboard-editable (VERIFIED LIVE), but the tiers are not mutually exclusive once activated -- past the highest threshold every lower tier's trigger is also true and Wix stacks them (e.g. at 21+ items: 5+10+15+20+25 = 75% off, not 25%), a real compounding-discount bug once live, not just an approximation.\nDEFAULT SUPERSEDED 2026-08-31. The old default was (b) open-ended, on the reasoning that every tier imports `active: false` so a merchant would consolidate before activating, and that a Custom Discount Trigger was 'out of scope for a data migration'. BOTH HALVES WERE WRONG. Relying on the import being inactive is not a control — it only defers the bug to whoever flips the switch, and 5+10+15+20+25 = 75% off is then live. And the service plugin is in scope: it is the sanctioned rung 3 of the escalation ladder, built with the Wix CLI as an app extension, implemented and verified end to end against live carts. CURRENT DEFAULT: express bounded bands through a Custom Discount Trigger service plugin, which answers yes/no per cart so exactly one tier can match. See bounded-quantity-bands-need-a-custom-trigger-spi below and domains/SERVICE-PLUGINS.md. Options (a) and (b) above remain accurate descriptions of the NATIVE-ONLY trade-off and are kept for the case where a service plugin is genuinely unavailable — but neither is the default any more, and choosing (b) means accepting a live compounding-discount bug."
81
+ },
82
+ {
83
+ "code": "trigger-type-and-discount-type-are-each-a-closed-enum",
84
+ "severity": "warning",
85
+ "summary": "trigger.triggerType: AND | SUBTOTAL_RANGE | ITEM_QUANTITY_RANGE | CUSTOM | OR | CUSTOMER_ELIGIBILITY. discounts.values[].discountType: PERCENTAGE | FIXED_AMOUNT | FIXED_PRICE | QUANTITY_BASED. Both enums read live off the server's own UnrecognizedEnumValidator error by POSTing a bogus value -- do that instead of trusting a doc page. CORRECTION 2026-08-31: an earlier version of this pitfall said a true 'buy X get Y' where X and Y differ has no equivalent. THAT IS WRONG -- see buy-x-get-y-is-supported-but-undocumented below. QUANTITY_BASED is only for '3 for $10'; BOGO lives on targetType, not discountType, which is why it looked absent.",
86
+ "unverified": false
87
+ },
88
+ {
89
+ "code": "scope-targets-a-real-catalog-item-id-not-a-source-id",
90
+ "severity": "blocker",
91
+ "summary": "`scopes[].catalogItemFilter.catalogItemIds` takes Wix catalog item GUIDs (e.g. the migrated product's Wix product id from the product crosswalk), not the source WooCommerce product id. Resolve via the product crosswalk before building the scope, the same as category/tag assignment elsewhere in this pipeline. Omitting scopes (or passing none) applies the rule storewide."
92
+ },
93
+ {
94
+ "code": "rule-definitions-via-bridge-plugin-not-rest",
95
+ "severity": "warning",
96
+ "summary": "The source rule configuration has no REST route at all (wp-admin/admin.php?page=woo_discount_rules renders it, with no API) -- it is read via wix-wp-plugin-v2's discover-structure/query-structure against the plugin's own wdr_rules table instead, VERIFIED LIVE 2026-08-28 against an anonymized live source. This requires the site owner to have installed wix-wp-plugin-v2 (see plugins/wix-wp-plugin-v2/README.md) -- a source with only a standard WooCommerce REST credential and no bridge plugin installed cannot migrate this entity's data at all, only reconfigure it manually in Wix."
97
+ },
98
+ {
99
+ "code": "buy-x-get-y-is-supported-but-undocumented",
100
+ "severity": "blocker",
101
+ "summary": "Wix DOES support buy-X-get-a-DIFFERENT-Y. Two earlier passes of this file and an earlier research pass concluded it does not, and both were WRONG. VERIFIED LIVE 2026-08-31: discounts.values[].targetType accepts [UNDEFINED, SPECIFIC_ITEMS, BUY_X_GET_Y]. Payload is buyXGetYInfo: {customerBuys: {scopes[], minimumQuantity | minimumSpend}, customerGets: {scopes[], quantity}, limit?}. WHY IT LOOKS UNSUPPORTED, so the next reader does not repeat the mistake: (a) buyXGetYInfo appears NOWHERE in the published Create Discount Rule method schema; (b) the docs' one 'Create Buy X Get Y Discount Rule' example is a body that returns a bare HTTP 500, because it shows only targetType/discountType/fixedPrice and omits buyXGetYInfo entirely; (c) the server's error text says 'buyXGetYInfo.customerBuy.condition' -- SINGULAR, which is the protobuf type name, while the actual field is customerBuys (PLURAL). The shape is only visible via SearchWixAPISpec's component schemas: getResourceSchemaByUrl(docsUrl).components.schemas['com.wix.ecom.discounts.BuyXGetYInfo']. RULE: when a Wix method 500s on its own documented example, inspect the component schemas before concluding a capability is absent."
102
+ },
103
+ {
104
+ "code": "offer-string-is-the-machine-readable-dashboard-editability-test",
105
+ "severity": "blocker",
106
+ "summary": "The server computes a human-readable `offer` summary on every discount rule and returns it on create/get/query. An EMPTY STRING means the merchant dashboard cannot render the rule and shows it as created by a third-party integration with no edit option. THE TEST IS ONE-WAY: a populated `offer` does NOT prove the rule is editable — see the scope note below. VERIFIED LIVE 2026-08-31 by creating throwaway rules and deleting them, and corroborated by a merchant independently reporting exactly the rule whose offer was empty.\n\nSCOPE OF THE TEST -- READ THIS BEFORE TRUSTING IT. `offer` reflects the DISCOUNT and its SCOPE only. It is TRIGGER-BLIND: verified live 2026-08-31 that a rule with no trigger at all, one with a bounded itemQuantityRange {from:6,to:10}, and one with subtotalRange {from:500} ALL return the byte-identical offer '10% off\\nAll products'. So an empty offer proves a rendering problem, but a POPULATED offer does NOT prove the trigger renders. Use this test for scope/target shapes (where it is proven). Do NOT use it to clear the cumulative-tiered-discount pitfall's bounded-range claim -- that one is about the trigger, and only a human opening the dashboard can currently settle it."
107
+ },
108
+ {
109
+ "code": "buyxgety-renders-only-with-exactly-one-catalog-item-scope",
110
+ "severity": "blocker",
111
+ "summary": "Inside buyXGetYInfo.customerBuys.scopes, only a SINGLE CATALOG_ITEM scope renders in the dashboard. VERIFIED LIVE 2026-08-31 on one site, each case created then deleted, judged by the `offer` string: 1 x CATALOG_ITEM with <=50 explicit catalogItemIds -> offer rendered, EDITABLE. 1 x CATALOG_ITEM storewide (all_<appId>, empty catalogItemIds) -> rendered, EDITABLE. 2 x CATALOG_ITEM scopes -> offer '', NOT editable. 1 x CUSTOM_FILTER (a Stores category) -> offer '', NOT editable. 3 x CUSTOM_FILTER -> offer '', NOT editable. So more than one scope, or ANY category/collection scope, breaks rendering regardless of count. CONSEQUENCE, and it is a real trade-off with no clean answer: catalogItemIds caps at 50 per scope, so a source rule whose trigger covers MORE than 50 products cannot be both faithful and dashboard-editable. Choose explicitly and record which: (a) keep the category/CUSTOM_FILTER scope -- faithful, uneditable; (b) enumerate <=50 product ids -- editable, silently drops the rest; (c) go storewide -- editable, triggers far wider than the source. Never pick one silently."
112
+ },
113
+ {
114
+ "code": "specificiteminfo-belongs-on-the-discount-value-not-the-rule",
115
+ "severity": "blocker",
116
+ "summary": "specificItemsInfo goes on discounts.values[0], NOT on the discountRule object. Putting it on the rule passes request validation and then returns a bare HTTP 500 with an empty body and no field violation -- there is nothing in the response to point at the mistake. VERIFIED LIVE 2026-08-30 (cost several probe rounds). Same class of failure as omitting settings.appliesTo: the 500 is the ONLY signal, so when a discount-rule create 500s, suspect misplaced or missing sub-objects before anything else."
117
+ },
118
+ {
119
+ "code": "carry-the-source-rule-name-and-active-flag-verbatim",
120
+ "severity": "warning",
121
+ "summary": "Import the source rule's own name, with no migration prefix or tag -- a merchant comparing the two systems side by side must see the same string in both. `name` is capped at 50 characters, so truncate only when the source title genuinely exceeds it (Hebrew and other non-Latin titles hit this sooner than they look). Where one source rule legitimately becomes several Wix rules (see cumulative-tiered-discount...), suffix the source name with the distinguishing bound rather than renaming it. Likewise mirror the source rule's enabled/disabled flag into `active` instead of importing everything inactive by default: a promotion running at source should run at the destination. TWO CASES WHERE MIRRORING IS UNSAFE and the importer must import inactive and say so loudly: (1) the source rule is gated on something Wix cannot express -- a cart coupon code is the common one -- so an 'active' import applies unconditionally and gives the discount to everyone; (2) one source rule expanded into several open-ended tiers, which stack once active."
122
+ },
123
+ {
124
+ "code": "bounded-quantity-bands-need-a-custom-trigger-spi",
125
+ "severity": "blocker",
126
+ "summary": "RESOLVES the cumulative-tiered-discount pitfall's 'no clean solution'. A source bulk/tiered discount (1-5 -> 5%, 6-10 -> 10%, 11-15 -> 15%, ...) has a clean Wix mapping after all, but not through a native trigger: implement the Custom Discount Triggers SERVICE PLUGIN and give each tier its own bounded band. Each tier becomes one DiscountRule with trigger {triggerType:'CUSTOM', customTrigger:{id:'<band id>', appId:'<your app>'}}, and the plugin answers a plain yes/no per cart -- so bands are mutually exclusive, nothing stacks, and no bounded itemQuantityRange is needed. IMPLEMENTED, DEPLOYED AND VERIFIED END TO END AGAINST LIVE CARTS 2026-08-31 (with only the 6-10 band active: 3 units -> no discount, 7 units -> exactly 10% off, 11 units -> NO discount. The 11-unit case is the proof, because the old open-ended shape would have discounted it too — design the verification around the input where old and new behaviour DISAGREE, or a passing test proves nothing). A complete, copy-pasteable implementation is in domains/SERVICE-PLUGINS.md.\n\nDESIGN THAT MADE IT CHEAP: encode the band in the trigger id ('bulk-qty-6-10', 'bulk-qty-21-plus') and parse it in getEligibleTriggers, so re-cutting a tier is a discount-rule edit with NO plugin redeploy; listTriggers only feeds the dashboard dropdown. Count UNITS not lines (sum lineItems[].quantity) to match WooCommerce's product_cumulative operator. Treat an unparseable id as NOT eligible -- a permissive default silently discounts every cart.\n\nCOST, so this is not chosen lightly: it needs a Wix CLI app project (`wix generate` -> Service Plugin -> Ecom Discount Triggers), and `wix release` to deploy -- which ALSO PUBLISHES THE SITE. The plugin becomes permanent production infrastructure: uninstall the app and every tier rule pointing at its triggers stops resolving. Worth it for a real tiered promotion, not for a disabled sample rule.\n\nSEE ALSO rp-target-wix/domains/SERVICE-PLUGINS.md — the escalation rule, the honest cost list (an app, hosting, a 3-second budget, permanent production infrastructure, and the fact that `wix release` also PUBLISHES THE SITE), a full worked example including the SDK's inbound-only id -> _id rename, and the catalog of all 25 Wix service plugins with a per-plugin judgment on whether it could close a migration gap."
127
+ },
128
+ {
129
+ "code": "sdk-renames-rest-id-to-underscore-id-in-service-plugins",
130
+ "severity": "warning",
131
+ "summary": "When implementing an SPI through @wix/ecom/service-plugins, the SDK types rename the REST `id` field to `_id` -- and only on the inbound side. For Custom Discount Triggers, VERIFIED 2026-08-31 against the shipped .d.ts: request is triggers[].customTrigger._id, listTriggers returns customTriggers[]._id, but getEligibleTriggers returns eligibleTriggers[].customTriggerId (NOT renamed) and LineItem.quantity is unchanged. A correct handler therefore looks internally inconsistent. Writing `id` on the list side compiles clean in plain JS and silently returns a trigger list Wix cannot match to any rule -- the discount never applies and nothing errors. Read node_modules/@wix/auto_sdk_ecom_custom-triggers/build/cjs/interfaces-*.d.ts rather than the REST docs, and typecheck (astro check / tsc) before releasing."
132
+ }
133
+ ],
134
+ "mappingGuidance": [
135
+ "ESCALATION LADDER for a source discount shape that does not obviously fit. Work it in order and do not skip a rung. (1) NATIVE PRIMITIVE FIRST, ALWAYS — and confirm what native actually offers by reading the live enum off the server rather than a doc page: POST a bogus value and let UnrecognizedEnumValidator list the real members. targetType accepts BUY_X_GET_Y, which two earlier passes of this file declared impossible because it is absent from the published method schema and the docs' own example for it 500s (see buy-x-get-y-is-supported-but-undocumented). (2) NATIVE BUT MERELY AWKWARD STILL BEATS INFRASTRUCTURE — an extra rule per tier, more configuration, a field the merchant re-enters. AWKWARD IS NOT THE SAME AS INEXACT, AND THE LINE IS WHAT A CUSTOMER PAYS: ask whether the shape changes WHO QUALIFIES or WHAT THEY ARE CHARGED. A widened scope (e.g. variation ids resolving up to their parent product, so every variant now qualifies) and a lossy field both FAIL that test — they are approximations, not awkwardness, and they belong at (4) with the gap, not here. An earlier version of this guidance listed a widened scope as a preferred native fallback; that was wrong and it contradicted (4). (3) ONLY IF WIX HAS NO PRIMITIVE for a condition the source depends on, build a CUSTOM DISCOUNT TRIGGER service plugin: Wix calls your endpoint on every cart change and you answer yes/no per trigger, so any condition you can compute from the cart becomes expressible. Docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/extensions/discounts/custom-discount-triggers-integration-service-plugin/introduction Add it with the CLI: https://dev.wix.com/docs/build-apps/develop-your-app/develop-an-app-with-the-cli/supported-extensions/backend/service-plugins/add-service-plugin-extensions-with-the-wix-cli Full cost, caveats, a complete worked example and the catalog of all 25 Wix service plugins: rp-target-wix/domains/SERVICE-PLUGINS.md. (4) IF NEITHER WORKS IT IS A REAL GAP — and so is anything you had to approximate to make 'native' fit. Record it with the rule's exact values and say what changed. An approximated discount silently changes what customers are charged, which is worse than an absent one because an absent one is visible.",
136
+ "A trigger-less rule (`trigger` omitted) always applies — use this for a source rule with no minimum-spend/quantity condition.",
137
+ "SUBTOTAL_RANGE trigger maps a WooCommerce 'X% off orders over $Y' rule: trigger.subtotalRange.from = Y, no `to` needed for an open-ended minimum.",
138
+ "ITEM_QUANTITY_RANGE maps a simple buy-N-get-discount rule when the discount applies to the same items counted by the trigger. It supports a `to` bound (inclusive) as well as `from`, but VERIFIED LIVE `to` makes the dashboard treat the rule as third-party-created/uneditable -- see the cumulative-tiered-discount pitfall for the real tradeoff before choosing bounded vs. open-ended for a multi-tier discount.",
139
+ "Storewide (no product/category restriction) does NOT omit `scopes` -- VERIFIED LIVE 2026-08-29: a real dashboard-created storewide rule still carries `specificItemsInfo.scopes: [{id: \"all_<catalogAppId>\", type: \"CATALOG_ITEM\", catalogItemFilter: {catalogAppId}}]`. Always build the scope with the real `all_`/`specific_`/`collections_` id-prefix convention (see the scope-id pitfall above) even for storewide; never omit `scopes` or invent an arbitrary `id`."
140
+ ],
141
+ "setupRequirements": [],
142
+ "objectPageException": "The Discount Rules API menu (dev.wix.com/docs/api-reference/business-solutions/e-commerce/extensions/discounts/discount-rules/introduction, checked 2026-08-12) lists only Create/Update/Delete/Get/Query — no dedicated '…-object' reference page exists for DiscountRule. The full field shape is sourced from Create Discount Rule's request/response schema instead.",
143
+ "evidence": [
144
+ {
145
+ "type": "wix-docs",
146
+ "url": "https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/extensions/discounts/discount-rules/introduction"
147
+ },
148
+ {
149
+ "type": "wix-docs",
150
+ "url": "https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/extensions/discounts/discount-rules/create-discount-rule"
151
+ },
152
+ {
153
+ "type": "wix-docs",
154
+ "url": "https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/skills/pricing-create-discount-rule"
155
+ },
156
+ {
157
+ "type": "live-run",
158
+ "path": "anonymized-live-verification",
159
+ "note": "Live create and readback verification established that arbitrary scope IDs produce rules the dashboard treats as third-party-created and uneditable. Comparing against a dashboard-created rule isolated the supported scope-ID prefixes; see the scope-id-prefix pitfall."
160
+ },
161
+ {
162
+ "type": "live-run",
163
+ "path": "anonymized-live-verification",
164
+ "note": "Live create and readback verification compared bounded and open-ended cumulative quantity tiers. Bounded ranges were uneditable in the dashboard; open-ended tiers remained editable but overlap and can stack. See the cumulative-tiered-discount pitfall for the required migration decision."
165
+ },
166
+ {
167
+ "type": "live-run",
168
+ "path": "anonymized-live-verification",
169
+ "note": "Field-by-field live verification against dashboard-created rules established the complete create contract for dashboard editability: use the supported `all_`/`specific_`/`collections_` scope-ID prefix, `settings: {appliesTo, indexOptIn: true}`, and `activeTimeInfo.start`. Recreated rules carrying the complete field set were confirmed editable."
170
+ },
171
+ {
172
+ "type": "live-run",
173
+ "path": "anonymized-live-verification",
174
+ "note": "2026-08-31: BUY_X_GET_Y confirmed supported and buyXGetYInfo's shape recovered from the API spec's component schemas; the `offer` empty-string rendering test discovered; and the one-CATALOG_ITEM-scope limit established across five scope shapes."
175
+ },
176
+ {
177
+ "type": "wix-docs",
178
+ "url": "https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/extensions/discounts/custom-discount-triggers-integration-service-plugin/introduction",
179
+ "note": "Custom Discount Triggers service plugin — the sanctioned fallback when no native trigger expresses the source condition. Implemented live 2026-08-31; see domains/SERVICE-PLUGINS.md."
180
+ }
181
+ ]
182
+ }
@@ -0,0 +1,129 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "domain": "ecom",
4
+ "entity": "order-applied-discount",
5
+ "displayName": "eCommerce Order Applied Discount",
6
+ "capability": "commerce.applied-discounts",
7
+ "target": {
8
+ "classification": "native",
9
+ "nativeEntity": "eCommerce Order Applied Discount",
10
+ "verifiedFqdn": null,
11
+ "idPolicy": "server-assigned",
12
+ "crosswalkRequired": true
13
+ },
14
+ "dependsOn": [
15
+ "stores/coupon"
16
+ ],
17
+ "sourceAliases": [
18
+ {
19
+ "sourceSystem": "woocommerce",
20
+ "sourceEntity": "applied_discount",
21
+ "routes": [
22
+ "/wc/v3/orders"
23
+ ],
24
+ "confidence": "high"
25
+ },
26
+ {
27
+ "sourceSystem": "wix",
28
+ "sourceEntity": "ecomOrderAppliedDiscount",
29
+ "routes": [
30
+ "eCommerce Orders API"
31
+ ],
32
+ "confidence": "high"
33
+ }
34
+ ],
35
+ "preferredWrite": {
36
+ "surface": "eCom Orders",
37
+ "endpoint": "POST /ecom/v1/orders/import",
38
+ "writerId": "importOrder",
39
+ "verification": "verified-live",
40
+ "importSafe": true,
41
+ "bulk": false
42
+ },
43
+ "reliability": {
44
+ "status": "reliable",
45
+ "flags": []
46
+ },
47
+ "pitfalls": [
48
+ {
49
+ "code": "historical-fact-not-live-rule",
50
+ "severity": "warning",
51
+ "summary": "Applied discounts import as historical fact via the merchantDiscount variant — Wix never re-evaluates them as live discount rules, and Import Order stores all money values as-is without recalculating priceSummary. The mapper must therefore keep the source order's totals internally consistent itself; nothing on the Wix side reconciles appliedDiscounts against priceSummary.discount. VERIFIED LIVE 2026-08-16: an order carrying appliedDiscounts totalling 8.00 with priceSummary.total 22.00 on a 30.00 subtotal was stored exactly as sent — and a control order with the same appliedDiscounts but NO priceSummary.discount kept total == subtotal, proving Wix applies nothing."
52
+ },
53
+ {
54
+ "code": "merchant-discount-amount-must-be-object",
55
+ "severity": "blocker",
56
+ "summary": "merchantDiscount.amount is a Price OBJECT ({ amount: \"5.00\" }), not a bare decimal string. VERIFIED LIVE 2026-08-16: sending merchantDiscount.amount as the string \"5.00\" 400s with 'Expected an object'. Same for lineItemDiscounts[].totalDiscount."
57
+ },
58
+ {
59
+ "code": "applied-discounts-order-not-preserved",
60
+ "severity": "warning",
61
+ "summary": "The appliedDiscounts array comes back REORDERED — VERIFIED LIVE 2026-08-16: [GLOBAL, SPECIFIC_ITEMS, SHIPPING] was sent and [SPECIFIC_ITEMS, GLOBAL, SHIPPING] read back. Any verification or crosswalk pass must correlate entries by content (discountType + amount + description), never by array index. Server-assigned appliedDiscounts[].id is available for post-create correlation."
62
+ },
63
+ {
64
+ "code": "line-item-ids-are-client-settable",
65
+ "severity": "info",
66
+ "summary": "VERIFIED LIVE 2026-08-16: lineItems[].id accepts a client-supplied GUID and Import Order preserves it verbatim (create response and later GET both return the sent GUID). This is what makes the lineItemDiscounts[].id linkage resolvable inside a single payload — mint the line item GUIDs locally during the transform and reference them from appliedDiscounts[].lineItemDiscounts[]."
67
+ },
68
+ {
69
+ "code": "order-number-must-be-numeric",
70
+ "severity": "blocker",
71
+ "summary": "Order.number must be a NUMERIC string. VERIFIED LIVE 2026-08-16: a non-numeric number (e.g. an order-prefix plugin's 'ZZZ-PROBE-1') fails the whole Import Order call with a bare 400 { message: 'Not a numeric value' } and no field path — the least diagnosable error on this surface. Sources with prefixed/suffixed order numbers (WooCommerce Sequential Order Numbers and friends) must strip to digits and carry the original display number elsewhere."
72
+ },
73
+ {
74
+ "code": "rule-definitions-reconfigure-in-wix",
75
+ "severity": "warning",
76
+ "summary": "Only the applied-discount RECORDS on historical orders migrate. The discount rule DEFINITIONS (percentage/BOGO/tiered configuration) are plugin-owned config with no migration path — reconfigure them in Wix (native discount rules / coupons) and report them as reconfigure-in-wix, never as imported data."
77
+ },
78
+ {
79
+ "code": "line-item-discount-id-linkage",
80
+ "severity": "warning",
81
+ "summary": "appliedDiscounts[].lineItemDiscounts[].id must be the GUID of a line item in the SAME Import Order payload (docs: 'Line item GUID', maxItems 300). Source per-line-item discount rows (e.g. _wdr_discounts on order-item meta) must be joined to their line items before the write; a dangling id silently misattributes the discount."
82
+ },
83
+ {
84
+ "code": "merchant-discount-description-cap",
85
+ "severity": "warning",
86
+ "summary": "merchantDiscount is a one-of: either a predefined discountReason enum (UNSPECIFIED / EXCHANGED_ITEMS / BILLING_ADJUSTMENT — none fits a source plugin rule) or a free-text description capped at 200 chars. Source rule names/labels longer than 200 chars truncate; keep the full label in the migration ledger if it matters."
87
+ },
88
+ {
89
+ "code": "coupon-variant-verified-on-import-order",
90
+ "severity": "info",
91
+ "summary": "VERIFIED LIVE 2026-09-05 (fresh site): Import Order accepts `appliedDiscounts: [{ discountType: 'GLOBAL', coupon: { id, code, name, amount: { amount } } }]` naming a coupon created seconds earlier on the same site, and GET reads the entry back with the same id, code and amount; `priceSummary.discount` is stored as sent. Built by rp-target-wix/lib/order-applied-discount-build.js from the source order's coupon lines through the coupon crosswalk; a code the crosswalk cannot resolve produces no entry and an unresolved report line."
92
+ }
93
+ ],
94
+ "mappingGuidance": [
95
+ "source-plugin applied-discount records map to Order.appliedDiscounts[] with the merchantDiscount variant, written at import time on the eCom Import Order (or Create Order for live flows) payload.",
96
+ "Use the merchantDiscount one-of variant for discounts a source plugin computed and applied on the source site: description = source rule label (free text, max 200 chars), amount = the applied discount Price. Do NOT use the discountRule variant — its id is a Wix discount-rule GUID that does not exist for source-computed discounts — and do not use coupon unless the source discount genuinely was a coupon redemption (then it belongs to the coupon crosswalk instead).",
97
+ "These records are carried as historical fact only: Wix never re-evaluates them as live discount rules, and rule DEFINITIONS are reconfigure-in-wix, not migratable data.",
98
+ "Set discountType per record: GLOBAL for order-level discounts, SPECIFIC_ITEMS when the source recorded per-line-item amounts, SHIPPING for free/discounted shipping. For SPECIFIC_ITEMS, fill lineItemDiscounts[] with { id: <line item GUID in the same payload>, totalDiscount: <Price> } per affected line.",
99
+ "appliedDiscounts caps: maxItems 320 per order; lineItemDiscounts maxItems 300 per discount entry. Overflow is implausible for real orders but must fail loudly, not silently drop.",
100
+ "Written through the parent order payload (ecom/order) — never a standalone write; sequencing and crosswalk requirements are the parent order's (contacts first, catalog crosswalks resolved).",
101
+ "dependsOn stores/coupon is conditional, not universal: only use the coupon one-of variant (and need that crosswalk) when the source discount genuinely was a coupon-code redemption. The far more common merchantDiscount variant (a plugin-computed, source-specific discount) needs no crosswalk at all — do not require stores/coupon for every order, only the ones that actually redeemed a real coupon."
102
+ ],
103
+ "setupRequirements": [
104
+ "Side-effect verification before historical order execution (inherited from ecom/order)."
105
+ ],
106
+ "evidence": [
107
+ {
108
+ "type": "wix-docs",
109
+ "url": "https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/orders/import-order",
110
+ "note": "Import Order request schema, markdown fetched 2026-08-16: appliedDiscounts (array<AppliedDiscount>, maxItems 320) is writable on the request; each entry is a one-of coupon | merchantDiscount | discountRule; merchantDiscount = one-of discountReason enum (UNSPECIFIED/EXCHANGED_ITEMS/BILLING_ADJUSTMENT) or description (maxLength 200) plus amount (Price); discountType enum GLOBAL/SPECIFIC_ITEMS/SHIPPING; lineItemDiscounts[] (maxItems 300) carries { id: line item GUID, totalDiscount: Price }. Values stored as-is, no recalculation, no side effects."
111
+ },
112
+ {
113
+ "type": "wix-docs",
114
+ "url": "https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/orders/orders/order-object",
115
+ "note": "Order object page (read 2026-08-16): appliedDiscounts field confirmed on the Order object (Array<AppliedDiscount>)."
116
+ },
117
+ {
118
+ "type": "repo-research",
119
+ "path": "skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json",
120
+ "note": "commerce.applied-discounts pending-register entry (researched 2026-08-11, source-side _wdr_discounts shape verified against woo-discount-rules plugin source); resolved by this entity 2026-08-16."
121
+ },
122
+ {
123
+ "type": "live-run",
124
+ "path": "anonymized-live-verification",
125
+ "note": "Verified live: Import Order create and GET readback exercised all discountType variants. Sent values persisted, the server assigned appliedDiscounts[].id, and SPECIFIC_ITEMS linkage remained in lineItemDiscounts while lineItemIds[] and itemCombinations[] read back empty. merchantDiscount.amount must be an object, appliedDiscounts may be reordered on readback, and order.number must be numeric. Probe records were deleted after verification."
126
+ }
127
+ ],
128
+ "notes": "Authored 2026-08-16. Promoted to verified-live 2026-08-16 by a create/readback/delete probe on an anonymized verification environment (see the live-run evidence entry); the merchantDiscount object-amount trap, the readback reordering, the client-settable line item GUID, and the numeric-order-number trap were all discovered by that probe, not by docs."
129
+ }
@@ -0,0 +1,192 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "domain": "ecom",
4
+ "entity": "order-invoice-document",
5
+ "displayName": "eCommerce Order Invoice Document (preserved reference)",
6
+ "capability": "commerce.order-invoice-documents",
7
+ "target": {
8
+ "classification": "native",
9
+ "nativeEntity": "eCommerce Order extended fields + Media Manager private file",
10
+ "verifiedFqdn": null,
11
+ "idPolicy": "server-assigned",
12
+ "crosswalkRequired": true
13
+ },
14
+ "objectPageException": "This is not a Wix object. It is a REFERENCE contract: the source invoice document is preserved as a private Media file and pointed at from two user-defined fields on the order. Wix exposes no historical-invoice entity to model, and the invoicing service is deliberately not called, so there is no object page to cite. The shapes come from the Import File, Generate File Download Url and Update Order method schemas in evidence[].",
15
+ "dependsOn": [
16
+ "ecom/order"
17
+ ],
18
+ "sourceAliases": [
19
+ {
20
+ "sourceSystem": "woocommerce",
21
+ "sourceEntity": "order_invoice_document",
22
+ "routes": [
23
+ "/wc/v3/orders"
24
+ ],
25
+ "confidence": "medium"
26
+ }
27
+ ],
28
+ "preferredWrite": {
29
+ "surface": "Media Manager (private) + eCom Orders extended fields",
30
+ "endpoint": "POST /site-media/v1/files/generate-upload-url (private), PUT the bytes to the signed uploadUrl, then PATCH /ecom/v1/orders/{order.id}",
31
+ "writerId": "preserveOrderInvoiceDocument",
32
+ "verification": "docs",
33
+ "importSafe": true,
34
+ "bulk": false
35
+ },
36
+ "fallbacks": [
37
+ {
38
+ "classification": "native",
39
+ "when": "Where the source holds an invoice NUMBER but no document, store the number alone as a reference and create nothing."
40
+ }
41
+ ],
42
+ "reliability": {
43
+ "status": "reliable",
44
+ "flags": []
45
+ },
46
+ "pitfalls": [
47
+ {
48
+ "code": "never-re-issue-a-historical-tax-document",
49
+ "severity": "blocker",
50
+ "summary": "Do NOT create, publish or re-issue a Wix invoice for a historical sale. Re-issuing mints a SECOND legal document for the same sale under a different number, and the original -- issued and numbered by whoever issued it -- remains the authoritative body. Separately, whether publishing an invoice emails the customer is undocumented in either direction, and on a multi-year store a wrong assumption emails thousands of customers an invoice for a sale they made years ago. The contract is NON-USE, provable by a route-level test rather than by a runtime probe: tests/target-wix/no-invoices-api-contract-test.js."
51
+ },
52
+ {
53
+ "code": "discovered-url-is-untrusted-input",
54
+ "severity": "blocker",
55
+ "summary": "A document URL read from source-site metadata is untrusted input that something is about to fetch. Classify before touching it: HTTPS only, no embedded credentials, port 443 only, no loopback/private/link-local address in either dotted or IPv4-mapped-IPv6 notation (`[::ffff:127.0.0.1]` classified SAFE until 2026-09-05 because Node canonicalizes it). LIMITS OF THIS CHECK, stated because the earlier wording promised more than the code does: it is LEXICAL. It does not resolve DNS and it does not follow or re-classify redirects, so a public hostname resolving to a private address, or redirecting to one, passes. Wix Media fetches the document server-side, so the request that would need bounding is not ours to bound. This rejects what is obviously internal; it is not SSRF protection, and a request-plan object that nothing executed used to sit here creating the opposite impression."
56
+ },
57
+ {
58
+ "code": "never-store-or-log-the-source-url",
59
+ "severity": "blocker",
60
+ "summary": "A hosted invoice URL is an unauthenticated bearer link whose query string can carry a token and whose filename can carry the customer's name and the invoice number. It is never written to a site-readable field, never logged, and never carried out of the import: the Import File RESPONSE echoes `sourceUrl`, so only the returned file `id` is kept. Media `displayName` is derived from the invoice number, never from the source filename."
61
+ },
62
+ {
63
+ "code": "patch-replaces-extended-fields",
64
+ "severity": "blocker",
65
+ "summary": "SCHEMA-CONFIRMED 2026-09-03: `extendedFields` IS updatable via PATCH Update Order, and the call needs ECOM.ORDER_WRITE_ALL_EXTENDED_FIELDS / Manage Orders. MERGE SEMANTICS, re-established 2026-09-05 with a corrected oracle: a partial patch MERGES -- keys the patch omits survive. Three consecutive runs agree. The FIRST version of this probe could not have known: it patched, read once, and judged what survived, so a stale read returning the pre-patch order looked identical to a merge. It now polls until its own included marker is observable before inspecting the omitted keys, and answers UNKNOWN if the patch never becomes visible. What three runs buy and do not buy: they rule out the stale-read artefact and a one-off fluke on this site. They do not establish the behaviour across namespaces, across other extendable objects, or against a future change -- so the MERGE in our writer stays. It costs nothing if the behaviour holds and is the only protection if it ever changes."
66
+ },
67
+ {
68
+ "code": "download-url-default-expiry-is-ten-hours",
69
+ "severity": "warning",
70
+ "summary": "SCHEMA-CONFIRMED: Generate File Download Url defaults `expirationInMinutes` to 600. Relying on the default hands out a ten-hour link to a tax document, so the expiry is always passed explicitly and kept small. The member-facing endpoint accepts an ORDER id only and resolves the file id server-side -- accepting a client-supplied file id would let any member fetch another member's invoice."
71
+ },
72
+ {
73
+ "code": "media-import-is-async-and-quota-bounded",
74
+ "severity": "warning",
75
+ "summary": "Import File returns `operationStatus: PENDING`; the file is not immediately usable. Poll the descriptor before promising a download, and treat FAILED as a per-document reported outcome. The API also defines a `SITE_QUOTA_EXCEEDED` error, so a large invoice archive can exhaust the site's media quota part-way through -- report per document rather than failing the run."
76
+ },
77
+ {
78
+ "code": "visibility-in-business-manager-is-resolved",
79
+ "severity": "info",
80
+ "summary": "RESOLVED 2026-09-05 -- see `business-manager-shows-the-field-but-not-the-document`. This row previously said merchant visibility was unverified and promised neither automatic nor manual visibility. That was never tested and is wrong: the merchant sees these fields on the ORDER DETAIL view, and can toggle them on as COLUMNS in the order list. Kept as a marker so that anyone who met the earlier claim knows it was corrected. What is genuinely absent is the invoice LIST, which is a different surface and does not read order extended fields."
81
+ },
82
+ {
83
+ "code": "string-fields-require-maxlength",
84
+ "severity": "blocker",
85
+ "summary": "LIVE-VERIFIED 2026-09-04 on a disposable site: Create Data Extension Schema REJECTS a string field that declares no `maxLength` -- `400 MANDATORY_FIELD_MISSING: <key>.maxLength`. It is a required part of the field definition, not an optional constraint. Both invoice fields therefore declare one (file id 256, invoice number 256); the earlier removal of a length contract went one step too far -- what was unverified was the SPECIFIC 64-character value, not whether a cap is needed at all."
86
+ },
87
+ {
88
+ "code": "order-patch-validates-against-the-schema",
89
+ "severity": "info",
90
+ "summary": "LIVE-VERIFIED 2026-09-04: patching a value into an unprovisioned field fails closed with `400 INVALID_PATCH -- verify namespace '_user_fields' exists and the schema contains the specified fields`. So the API independently enforces what the setup-verification guard enforces locally: a value cannot reach a field that was never provisioned. Good news for safety, and it means a provisioning failure surfaces immediately rather than silently dropping data."
91
+ },
92
+ {
93
+ "code": "live-writes-are-intermittently-flaky",
94
+ "severity": "warning",
95
+ "summary": "OBSERVED 2026-09-04 across repeated sentinel runs on one disposable site: most runs completed every step, one failed several unrelated steps at once (a schema field not preserved, the Media import not landing, the order values absent) and then succeeded again on the next run with no code change. So these writes are not reliably deterministic, and a single run -- passing OR failing -- is weak evidence. Run a verification more than once before believing it, and never let a downstream conclusion depend on an upstream step having succeeded without checking that it did."
96
+ },
97
+ {
98
+ "code": "business-manager-shows-the-field-but-not-the-document",
99
+ "severity": "warning",
100
+ "summary": "OBSERVED 2026-09-05 in Business Manager, on TWO surfaces: (a) the ORDER DETAIL view shows user-defined extended fields when an order is opened; (b) the order LIST offers them in its 'Manage fields' dialog, tagged `User`, to be toggled on as columns. Neither is on by default in the list. So the earlier assumption that nothing renders them is WRONG -- merchant visibility is achievable, manually. What the merchant then sees is the raw value, which for the file id is an opaque Media identifier like `630ce4_....pdf`: visible but not usable, since there is no way to open it from the order list. The number field is genuinely useful there; the file id is not. Closing that gap needs a Wix-side change: a native order-invoice association that renders as something clickable. Still open: whether the column toggle is API-settable, or whether the merchant must enable it by hand."
101
+ },
102
+ {
103
+ "code": "column-labels-use-title-not-x-wix-display",
104
+ "severity": "warning",
105
+ "summary": "LIVE-VERIFIED 2026-09-05: a friendly column heading comes from plain JSON Schema `title` (and `description` for the hint). The `x-wix-display` object the Data Extension Schema vocabulary documents -- with `label`, `hint` and `placeholder` -- is REJECTED by the schema service: `400 UNKNOWN_KEYWORD_AT_THIS_LEVEL: <field>.x-wix-display.label`. The docs define a keyword the API does not accept on a user-defined schema, so do not reinstate it from the documentation. Also confirmed in the same probe: `x-wix-permissions` is MANDATORY per field, alongside the already-recorded mandatory `maxLength`."
106
+ },
107
+ {
108
+ "code": "three-fields-three-lifespans",
109
+ "severity": "info",
110
+ "summary": "The order carries three invoice fields and they are NOT interchangeable. `Invoice number` is the legal identifier and is permanent. `Invoice file (preserved)` is the document copied into the site's own private Media -- permanent, but opaque: the private file's own URL returns 403 (verified live), so reaching it needs an authorized request. `Invoice link (original)` is where the document has always lived: clickable today, and it rots -- a source-hosted link dies with the source site, a provider-hosted one dies when the merchant leaves that provider. Storing the link was ADDED deliberately on 2026-09-05 after the earlier blanket ban: the merchant already has it on their own store, and these fields are readable by apps and users but not by site visitors, so it widens nothing. It sits beside the preserved copy, never instead of it, and the labels say which is which."
111
+ },
112
+ {
113
+ "code": "the-entity-is-the-producer-not-the-js-constant",
114
+ "severity": "blocker",
115
+ "summary": "Setup discovery reads `setupRequirements` from THIS FILE, through domain-knowledge.js. A declaration in JavaScript is not the producer, however canonical it looks. If the JS constant and this file disagree, the requirement the shipped path actually emits is the one declared here, and a seam test that builds its input from the JS helper rather than from here will miss the mismatch. Any change to these fields must land in this file; the JS constant is derived from it, never the other way round."
116
+ },
117
+ {
118
+ "code": "invoice-media-destination",
119
+ "severity": "medium",
120
+ "summary": "LIVE-VERIFIED 2026-09-05 on a disposable site: the file id written to the order is an opaque string with nothing to click, so it is not an access path. The path that works is the MEDIA MANAGER -- the import sets `displayName` to `Source invoice <number>`, and the merchant finds and opens the document by searching that name. That makes the import's DESTINATION load-bearing rather than cosmetic: the default `media-root` drops one PDF per order into the same library the merchant keeps their own photos in -- potentially thousands of them. Import File accepts `filePath`, and it CREATES the folder when absent (probe: filePath '/Imported invoices' returned a parentFolderId that was a real folder of that name under media-root, NOT media-root itself). Preserved documents therefore all land in one folder. This does not close that gap: opening an invoice still means leaving the order and searching Media Manager by hand."
121
+ }
122
+ ],
123
+ "mappingGuidance": [
124
+ "Resolve invoices per run rather than assuming them. Nothing found means nothing is created, and the report says \"no invoices found\", never \"not supported\".",
125
+ "A number without a document is retained as a reference. Do not render a replacement document.",
126
+ "Documents on the source filesystem are re-hosted privately without asking, because those bytes die with the source site. Documents on a provider or accounting host are referenced by default and copied only after an explicit merchant opt-in at the approval gate.",
127
+ "Sampling may discover which key families a store uses, but the selected patterns are then applied across the full in-scope order population, and every discovered document is classified -- not only the sampled ones.",
128
+ "Read the order before importing: an existing file id suppresses the import, which is what makes a re-run idempotent without depending on the migration crosswalk.",
129
+ "Set up and verify the two extended fields before any invoice write. A value write is blocked until setup verification passed for that exact field.",
130
+ "A crosswalk row for the preserved file is an accelerator, not the correctness boundary: re-run safety comes from reading the order's own extended fields first, so a lost crosswalk never causes a second copy of a tax document to be imported."
131
+ ],
132
+ "setupRequirements": [
133
+ {
134
+ "kind": "extendedFieldSchema",
135
+ "schemaKind": "data-extension-schema",
136
+ "targetRef": "ecom/order",
137
+ "fqdn": "wix.ecom.*.order",
138
+ "namespace": "_user_fields",
139
+ "fields": [
140
+ {
141
+ "key": "replatformSourceInvoiceNumber",
142
+ "fieldType": "string",
143
+ "maxLength": 256,
144
+ "displayName": "Invoice number",
145
+ "hint": "Invoice number as issued by the original store. This is the legal identifier and does not change.",
146
+ "permissionsPreset": "migration-internal",
147
+ "writePath": "extendedFields.namespaces._user_fields.replatformSourceInvoiceNumber"
148
+ },
149
+ {
150
+ "key": "replatformSourceInvoiceFileId",
151
+ "fieldType": "string",
152
+ "maxLength": 256,
153
+ "displayName": "Invoice file (preserved)",
154
+ "hint": "The original document, copied into this site's private Media so it survives the old store being switched off. Opening it needs an authorized request; the id alone is not a link.",
155
+ "permissionsPreset": "migration-internal",
156
+ "writePath": "extendedFields.namespaces._user_fields.replatformSourceInvoiceFileId"
157
+ },
158
+ {
159
+ "key": "replatformSourceInvoiceUrl",
160
+ "fieldType": "string",
161
+ "maxLength": 2048,
162
+ "displayName": "Invoice link (original)",
163
+ "hint": "Where the document lives on the original system. Clickable today, but it stops working when the old store is switched off or the payment provider changes — the preserved copy is the durable one.",
164
+ "permissionsPreset": "migration-internal",
165
+ "writePath": "extendedFields.namespaces._user_fields.replatformSourceInvoiceUrl"
166
+ }
167
+ ]
168
+ }
169
+ ],
170
+ "evidence": [
171
+ {
172
+ "type": "wix-docs",
173
+ "url": "https://dev.wix.com/docs/rest/assets/media/media-manager/files/import-file",
174
+ "note": "Re-checked 2026-09-03. Establishes the `private` boolean, DOCUMENT media type, async PENDING status, the SITE_QUOTA_EXCEEDED error, and that the response echoes `sourceUrl`."
175
+ },
176
+ {
177
+ "type": "wix-docs",
178
+ "url": "https://dev.wix.com/docs/api-reference/assets/media/media-manager/files/upload-api",
179
+ "note": "Re-checked 2026-10-22. The document is fetched by the writer (resolved address pinned, redirects re-validated, size capped) and uploaded through Generate File Upload URL (`private`, `filePath`, `fileName`, `mimeType`, `sizeInBytes`) plus a PUT of the bytes with `Content-Type`; the response carries the file descriptor. `files/import` is NOT used because it makes Wix fetch an untrusted source-site URL server-side."
180
+ },
181
+ {
182
+ "type": "wix-docs",
183
+ "url": "https://dev.wix.com/docs/rest/assets/media/media-manager/files/generate-file-download-url",
184
+ "note": "Re-checked 2026-09-03. Establishes `expirationInMinutes` defaulting to 600, the ATTACHMENT/INLINE content disposition, and that this is the way to grant access to a private file."
185
+ },
186
+ {
187
+ "type": "wix-docs",
188
+ "url": "https://dev.wix.com/docs/rest/business-solutions/e-commerce/orders/orders/update-order",
189
+ "note": "Re-checked 2026-09-03. `extendedFields` is in the updatable-fields list; permissions are ECOM.MODIFY_ORDERS + ECOM.ORDER_WRITE_ALL_EXTENDED_FIELDS; \"to remove a field's value, pass null\", which is why a partial extendedFields drops other namespaces."
190
+ }
191
+ ]
192
+ }