@wix/agent-skills 1.33.1 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (619) hide show
  1. package/README.md +3 -0
  2. package/package.json +1 -1
  3. package/skills/wix-export/SKILL.md +83 -0
  4. package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
  5. package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
  6. package/skills/wix-harmony-editor/SKILL.md +317 -0
  7. package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
  8. package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
  9. package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
  10. package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
  11. package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
  12. package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
  13. package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
  14. package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
  15. package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
  16. package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
  17. package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
  18. package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
  19. package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
  20. package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
  21. package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
  22. package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
  23. package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
  24. package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
  25. package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
  26. package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
  27. package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
  28. package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
  29. package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
  30. package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
  31. package/skills/wix-headless/SKILL.md +7 -2
  32. package/skills/wix-headless/references/CAPABILITIES.md +6 -1
  33. package/skills/wix-headless/references/DISCOVERY.md +2 -1
  34. package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
  35. package/skills/wix-headless/references/SEED.md +3 -2
  36. package/skills/wix-headless/references/SETUP.md +1 -0
  37. package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
  38. package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
  39. package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
  40. package/skills/wix-headless/references/managed/CREATE.md +1 -1
  41. package/skills/wix-headless-kit/SKILL.md +110 -21
  42. package/skills/wix-headless-kit/guides/api-run.md +15 -13
  43. package/skills/wix-headless-kit/guides/existing-site.md +31 -0
  44. package/skills/wix-headless-kit/guides/migration.md +49 -17
  45. package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
  46. package/skills/wix-headless-kit/install/context.mjs +61 -6
  47. package/skills/wix-headless-kit/install/pins.json +1 -1
  48. package/skills/wix-headless-kit/install/setup.mjs +107 -12
  49. package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
  50. package/skills/wix-headless-replatform/SKILL.md +116 -0
  51. package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
  52. package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
  53. package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
  54. package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
  55. package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
  56. package/skills/wix-headless-replatform/references/output-contract.md +93 -0
  57. package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
  58. package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
  59. package/skills/wix-headless-replatform/references/safety.md +19 -0
  60. package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
  61. package/skills/wix-headless-replatform/references/workflow.md +157 -0
  62. package/skills/wix-headless-replatform/registry/README.md +20 -0
  63. package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
  64. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
  65. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
  66. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
  67. package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
  68. package/skills/wix-headless-replatform/registry/registry.json +36 -0
  69. package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
  70. package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
  71. package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
  72. package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
  73. package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
  74. package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
  75. package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
  76. package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
  77. package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
  78. package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
  79. package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
  80. package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
  81. package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
  82. package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
  83. package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
  84. package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
  85. package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
  86. package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
  87. package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
  88. package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
  89. package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
  90. package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
  91. package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
  92. package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
  93. package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
  94. package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
  95. package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
  96. package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
  97. package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
  98. package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
  99. package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
  100. package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
  101. package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
  102. package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
  103. package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
  104. package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
  105. package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
  106. package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
  107. package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
  108. package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
  109. package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
  110. package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
  111. package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
  112. package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
  113. package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
  114. package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
  115. package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
  116. package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
  117. package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
  118. package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
  119. package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
  120. package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
  121. package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
  122. package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
  123. package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
  124. package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
  125. package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
  126. package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
  127. package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
  128. package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
  129. package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
  130. package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
  131. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
  132. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
  133. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
  134. package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
  135. package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
  136. package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
  137. package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
  138. package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
  139. package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
  140. package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
  141. package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
  142. package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
  143. package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
  144. package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
  145. package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
  146. package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
  147. package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
  148. package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
  149. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
  150. package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
  151. package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
  152. package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
  153. package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
  154. package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
  155. package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
  156. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
  157. package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
  158. package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
  159. package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
  160. package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
  161. package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
  162. package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
  163. package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
  164. package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
  165. package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
  166. package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
  167. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
  168. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
  169. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
  170. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
  171. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
  172. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
  173. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
  174. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
  175. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
  176. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
  177. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
  178. package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
  179. package/skills/wix-import/SKILL.md +90 -0
  180. package/skills/wix-manage/SKILL.md +14 -4
  181. package/skills/wix-manage/references/blog/how-to-create-blog-posts.md +2 -0
  182. package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
  183. package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
  184. package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
  185. package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
  186. package/skills/wix-manage/references/seo/manage-content-plan.md +207 -222
  187. package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
  188. package/skills/wix-manage/references/sites/upload-static-site.md +128 -8
  189. package/skills/wix-readme/SKILL.md +166 -0
  190. package/skills/wix-replatform/.publish-manifest.json +5 -5
  191. package/skills/wix-replatform/CLI.md +162 -0
  192. package/skills/wix-replatform/README.md +52 -0
  193. package/skills/wix-replatform/SKILL.md +229 -684
  194. package/skills/wix-replatform/console/account.css +1 -0
  195. package/skills/wix-replatform/console/app.css +1 -0
  196. package/skills/wix-replatform/console/app.js +117 -0
  197. package/skills/wix-replatform/console/index.html +4 -0
  198. package/skills/wix-replatform/console/json.css +11 -0
  199. package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
  200. package/skills/wix-replatform/lib/app-page-routing.js +75 -0
  201. package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
  202. package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
  203. package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
  204. package/skills/wix-replatform/lib/completion-report.js +1393 -13
  205. package/skills/wix-replatform/lib/config-env.js +85 -11
  206. package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
  207. package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
  208. package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
  209. package/skills/wix-replatform/lib/destination-choice.js +163 -0
  210. package/skills/wix-replatform/lib/destination-handoff.js +62 -0
  211. package/skills/wix-replatform/lib/destination-http.js +81 -0
  212. package/skills/wix-replatform/lib/destination-route.js +98 -0
  213. package/skills/wix-replatform/lib/destination.js +919 -0
  214. package/skills/wix-replatform/lib/discovered-census.js +231 -0
  215. package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
  216. package/skills/wix-replatform/lib/document-url-guard.js +203 -0
  217. package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
  218. package/skills/wix-replatform/lib/entity-verification.js +18 -0
  219. package/skills/wix-replatform/lib/execution-capability.js +120 -0
  220. package/skills/wix-replatform/lib/execution-log.js +170 -0
  221. package/skills/wix-replatform/lib/execution-manifest.js +20 -2
  222. package/skills/wix-replatform/lib/execution-state.js +22 -0
  223. package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
  224. package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
  225. package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
  226. package/skills/wix-replatform/lib/import-recovery.js +800 -6
  227. package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
  228. package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
  229. package/skills/wix-replatform/lib/link-audit.js +173 -0
  230. package/skills/wix-replatform/lib/link-census.js +194 -0
  231. package/skills/wix-replatform/lib/link-plan.js +148 -0
  232. package/skills/wix-replatform/lib/link-verification.js +274 -0
  233. package/skills/wix-replatform/lib/link-write-journal.js +42 -0
  234. package/skills/wix-replatform/lib/local-state.js +869 -30
  235. package/skills/wix-replatform/lib/member-completion.js +658 -0
  236. package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
  237. package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
  238. package/skills/wix-replatform/lib/migration-completion.js +311 -0
  239. package/skills/wix-replatform/lib/operator-identity.js +47 -0
  240. package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
  241. package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
  242. package/skills/wix-replatform/lib/orchestration-router.js +608 -32
  243. package/skills/wix-replatform/lib/orchestration-state.js +188 -12
  244. package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
  245. package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
  246. package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
  247. package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
  248. package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
  249. package/skills/wix-replatform/lib/progress-log.js +19 -3
  250. package/skills/wix-replatform/lib/read-back-approval.js +184 -0
  251. package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
  252. package/skills/wix-replatform/lib/read-back-contract.js +243 -0
  253. package/skills/wix-replatform/lib/read-back-extract.js +118 -0
  254. package/skills/wix-replatform/lib/read-back-gate.js +734 -0
  255. package/skills/wix-replatform/lib/read-back-reads.js +94 -0
  256. package/skills/wix-replatform/lib/read-back-state.js +107 -0
  257. package/skills/wix-replatform/lib/read-back-summary.js +81 -0
  258. package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
  259. package/skills/wix-replatform/lib/run-controller.js +401 -0
  260. package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
  261. package/skills/wix-replatform/lib/setup-verification.js +148 -0
  262. package/skills/wix-replatform/lib/source-access.js +231 -0
  263. package/skills/wix-replatform/lib/source-coverage.js +1130 -0
  264. package/skills/wix-replatform/lib/source-secrets.js +277 -0
  265. package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
  266. package/skills/wix-replatform/lib/task-state.js +110 -0
  267. package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
  268. package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
  269. package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
  270. package/skills/wix-replatform/lib/url-verification.js +315 -0
  271. package/skills/wix-replatform/lib/user-action-effects.js +42 -0
  272. package/skills/wix-replatform/lib/user-actions.js +264 -0
  273. package/skills/wix-replatform/lib/website-handoff.js +1220 -0
  274. package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
  275. package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
  276. package/skills/wix-replatform/lib/write-verification-state.js +92 -0
  277. package/skills/wix-replatform/lib/write-verification.js +274 -0
  278. package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
  279. package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
  280. package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
  281. package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
  282. package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
  283. package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
  284. package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
  285. package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
  286. package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
  287. package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
  288. package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
  289. package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
  290. package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
  291. package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
  292. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
  293. package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
  294. package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
  295. package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
  296. package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
  297. package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
  298. package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
  299. package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
  300. package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
  301. package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
  302. package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
  303. package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
  304. package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
  305. package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
  306. package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
  307. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
  308. package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
  309. package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
  310. package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
  311. package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
  312. package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
  313. package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
  314. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
  315. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
  316. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
  317. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
  318. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
  319. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
  320. package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
  321. package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
  322. package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
  323. package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
  324. package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
  325. package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
  326. package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
  327. package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
  328. package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
  329. package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
  330. package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
  331. package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
  332. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
  333. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
  334. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
  335. package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
  336. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
  337. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
  338. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
  339. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
  340. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
  341. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
  342. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
  343. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
  344. package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
  345. package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
  346. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
  347. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
  348. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
  349. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
  350. package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
  351. package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
  352. package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
  353. package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
  354. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
  355. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
  356. package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
  357. package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
  358. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
  359. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
  360. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
  361. package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
  362. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
  363. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
  364. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
  365. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
  366. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
  367. package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
  368. package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
  369. package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
  370. package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
  371. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
  372. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
  373. package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
  374. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
  375. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
  376. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
  377. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
  378. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
  379. package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
  380. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
  381. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
  382. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
  383. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
  384. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
  385. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
  386. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
  387. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
  388. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
  389. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
  390. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
  391. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
  392. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
  393. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
  394. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
  395. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
  396. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
  397. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
  398. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
  399. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
  400. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
  401. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
  402. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
  403. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
  404. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
  405. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
  406. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
  407. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
  408. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
  409. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
  410. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
  411. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
  412. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
  413. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
  414. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
  415. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
  416. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
  417. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
  418. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
  419. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
  420. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
  421. package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
  422. package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
  423. package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
  424. package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
  425. package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
  426. package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
  427. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
  428. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
  429. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
  430. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
  431. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
  432. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
  433. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
  434. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
  435. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
  436. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
  437. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
  438. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
  439. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
  440. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
  441. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
  442. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
  443. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
  444. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
  445. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
  446. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
  447. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
  448. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
  449. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
  450. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
  451. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
  452. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
  453. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
  454. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
  455. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
  456. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
  457. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
  458. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
  459. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
  460. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
  461. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
  462. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
  463. package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
  464. package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
  465. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
  466. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
  467. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
  468. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
  469. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
  470. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
  471. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
  472. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
  473. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
  474. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
  475. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
  476. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
  477. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
  478. package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
  479. package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
  480. package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
  481. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
  482. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
  483. package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
  484. package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
  485. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
  486. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
  487. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
  488. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
  489. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
  490. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
  491. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
  492. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
  493. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
  494. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
  495. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
  496. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
  497. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
  498. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
  499. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
  500. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
  501. package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
  502. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
  503. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
  504. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
  505. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
  506. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
  507. package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
  508. package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
  509. package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
  510. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
  511. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
  512. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
  513. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
  514. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
  515. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
  516. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
  517. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
  518. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
  519. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
  520. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
  521. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
  522. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
  523. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
  524. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
  525. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
  526. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
  527. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
  528. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
  529. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
  530. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
  531. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
  532. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
  533. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
  534. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
  535. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
  536. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
  537. package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
  538. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
  539. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
  540. package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
  541. package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
  542. package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
  543. package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
  544. package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
  545. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
  546. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
  547. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
  548. package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
  549. package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
  550. package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
  551. package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
  552. package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
  553. package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
  554. package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
  555. package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
  556. package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
  557. package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
  558. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
  559. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
  560. package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
  561. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
  562. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
  563. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
  564. package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
  565. package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
  566. package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
  567. package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
  568. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
  569. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
  570. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
  571. package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
  572. package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
  573. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
  574. package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
  575. package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
  576. package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
  577. package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
  578. package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
  579. package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
  580. package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
  581. package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
  582. package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
  583. package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
  584. package/skills/wix-replatform/scripts/discovered-census.js +26 -0
  585. package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
  586. package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
  587. package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
  588. package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
  589. package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
  590. package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
  591. package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
  592. package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
  593. package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
  594. package/skills/wix-replatform/scripts/migration-completion.js +76 -0
  595. package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
  596. package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
  597. package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
  598. package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
  599. package/skills/wix-replatform/scripts/replatform-console.js +146 -0
  600. package/skills/wix-replatform/scripts/replatform.js +436 -0
  601. package/skills/wix-replatform/scripts/source-secrets.js +77 -0
  602. package/skills/wix-replatform/scripts/url-redirects.js +286 -0
  603. package/skills/wix-replatform/scripts/user-action.js +58 -0
  604. package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
  605. package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
  606. package/skills/wix-replatform/scripts/wix-destination.js +143 -0
  607. package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
  608. package/skills/wix-vibe-headless/SKILL.md +7 -3
  609. package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
  610. package/skills/wix-vibe-headless/platforms/base44.md +1 -0
  611. package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
  612. package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
  613. package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
  614. package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
  615. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
  616. package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
  617. package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
  618. package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
  619. package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
@@ -0,0 +1,231 @@
1
+ 'use strict';
2
+
3
+ const { isBlank } = require('./value-utils.js');
4
+
5
+ // rp-target-wix — the DETERMINISTIC WooCommerce tax-rate -> Wix Tax payload builder.
6
+ //
7
+ // Mirrors wix-build.js's role for Stores products: everything here implements, as plain code,
8
+ // the mapping rules already recorded as prose in domains/tax/{domain.json,entities/*.json}. Do
9
+ // not re-derive these rules by LLM judgement per project — read them here, and if a rule changes,
10
+ // change it here and in the domain JSON's mappingGuidance together, since they must stay the same
11
+ // fact stated twice (once for humans, once as code).
12
+ //
13
+ // Scope: Tax Groups / Tax Regions / Manual Tax Mappings only. Tax Settings is a single
14
+ // site-level upsert (see domains/tax/entities/tax-settings.json) with no payload-shaping
15
+ // logic worth a builder — just a boolean passthrough.
16
+
17
+ // ISO 3166-1 alpha-2 countries Wix accepts a `subdivision` for (dev.wix.com Tax Region object,
18
+ // verified live 2026-08-12). Any other country must omit subdivision (or pass '*').
19
+ const SUBDIVISION_ELIGIBLE_COUNTRIES = new Set([
20
+ 'AU', 'BR', 'CA', 'FR', 'DE', 'IN', 'IT', 'MX', 'NL', 'PT', 'ES', 'AE', 'GB', 'US',
21
+ ]);
22
+
23
+ // Countries Tax Region create rejects outright (dev.wix.com, "embargoed-countries-rejected").
24
+ const EMBARGOED_COUNTRIES = new Set(['CU', 'IR', 'KP', 'SY']);
25
+
26
+ // WooCommerce's `state` column format varies by version/site — sometimes bare ("NY"), sometimes
27
+ // country-prefixed ("US-NY"). Wix stores ISO 3166-2 WITHOUT the country prefix. Never invent a
28
+ // subdivision for a country outside the eligible set — pass none (country-level region) instead.
29
+ function normalizeSubdivision(country, rawState) {
30
+ const countryCode = String(country || '').trim().toUpperCase();
31
+ if (isBlank(rawState)) return undefined;
32
+ if (!SUBDIVISION_ELIGIBLE_COUNTRIES.has(countryCode)) return undefined;
33
+ const raw = String(rawState).trim().toUpperCase();
34
+ const prefix = `${countryCode}-`;
35
+ return raw.startsWith(prefix) ? raw.slice(prefix.length) : raw;
36
+ }
37
+
38
+ // WooCommerce `rate` is a PERCENTAGE (e.g. "7.5000"). Wix `taxRate` is a decimal-string FRACTION
39
+ // with at most 6 decimal places (e.g. "0.075"). A number, integer, or percent-string all 400.
40
+ function toWixTaxRateFraction(percentage) {
41
+ const n = Number(percentage);
42
+ if (!Number.isFinite(n)) {
43
+ throw new Error(`toWixTaxRateFraction: "${percentage}" is not a finite number`);
44
+ }
45
+ let fixed = (n / 100).toFixed(6);
46
+ if (fixed.includes('.')) {
47
+ fixed = fixed.replace(/0+$/, '');
48
+ if (fixed.endsWith('.')) fixed += '0';
49
+ }
50
+ return fixed;
51
+ }
52
+
53
+ // One Wix Tax Region per distinct (country, subdivision) pair — a source can have several rate
54
+ // rows (standard/reduced/zero) sharing one region, which fan out to separate Manual Tax Mappings
55
+ // against that ONE region rather than one region each.
56
+ function groupTaxRatesByRegion(taxRates) {
57
+ const regions = new Map();
58
+ for (const rate of taxRates || []) {
59
+ const country = String(rate.country || '').trim().toUpperCase();
60
+ if (!country) continue;
61
+ const subdivision = normalizeSubdivision(country, rate.state);
62
+ const key = taxRegionDedupeKey({ country, subdivision });
63
+ if (!regions.has(key)) {
64
+ regions.set(key, { country, subdivision, rates: [] });
65
+ }
66
+ regions.get(key).rates.push(rate);
67
+ }
68
+ return [...regions.values()];
69
+ }
70
+
71
+ function taxRegionDedupeKey({ country, subdivision }) {
72
+ return `${String(country || '').trim().toUpperCase()}|${subdivision || ''}`;
73
+ }
74
+
75
+ function isEmbargoedCountry(country) {
76
+ return EMBARGOED_COUNTRIES.has(String(country || '').trim().toUpperCase());
77
+ }
78
+
79
+ // `appId` must be resolved live per site via listTaxCalculators/resolveManualTaxCalculatorAppId
80
+ // in wix-writers.js — never hardcoded here, since it's installation-scoped and differs per site.
81
+ function buildTaxRegionInput({ country, subdivision }, { appId, taxIncludedInPrice = false }) {
82
+ if (!appId) throw new Error('buildTaxRegionInput: appId is required (resolve live, never hardcode)');
83
+ const taxRegion = { country: String(country).trim().toUpperCase(), appId, taxIncludedInPrice };
84
+ if (subdivision) taxRegion.subdivision = subdivision;
85
+ return taxRegion;
86
+ }
87
+
88
+ function buildTaxGroupInput({ name }) {
89
+ if (isBlank(name)) throw new Error('buildTaxGroupInput: name is required');
90
+ return { name: String(name).trim() };
91
+ }
92
+
93
+ // `taxGroupId`/`taxRegionId` must already exist — resolve both from their own crosswalks before
94
+ // calling. `taxName` is cosmetic (shown at checkout) and never affects the calculated amount.
95
+ function buildManualTaxMappingInput(rate, { taxGroupId, taxRegionId }) {
96
+ if (!taxGroupId) throw new Error('buildManualTaxMappingInput: taxGroupId is required');
97
+ if (!taxRegionId) throw new Error('buildManualTaxMappingInput: taxRegionId is required');
98
+ const mapping = {
99
+ taxGroupId,
100
+ taxRegionId,
101
+ taxRate: toWixTaxRateFraction(rate.rate),
102
+ };
103
+ if (!isBlank(rate.name)) mapping.taxName = String(rate.name).trim();
104
+ return mapping;
105
+ }
106
+
107
+ // Create Manual Tax Mapping 409s on a duplicate (taxRegionId, taxGroupId, taxName, taxType,
108
+ // jurisdiction, jurisdictionType) — dedupe on that composite key before creating, since
109
+ // WooCommerce rows differing only in `priority` (no Wix equivalent) would otherwise re-collide.
110
+ //
111
+ // LIVE-VERIFIED 2026-08-15: Query Manual Tax Mapping returns the STRING "UNDEFINED" for an unset
112
+ // `jurisdictionType` (not "" and not the field's absence), while a freshly-built mappingInput that
113
+ // never sets the field is plain JS `undefined` — so comparing a fetched mapping against a
114
+ // newly-built one for the same (region, group) 409'd instead of correctly deduping. Normalize both
115
+ // "" and "UNDEFINED" to the same bucket so a fetched existing mapping and a freshly-built one that
116
+ // both mean "no jurisdictionType" produce the same key.
117
+ function normalizeDedupeField(value) {
118
+ const s = String(value || '').trim();
119
+ return s === 'UNDEFINED' ? '' : s;
120
+ }
121
+ function manualTaxMappingDedupeKey({ taxRegionId, taxGroupId, taxName, taxType, jurisdiction, jurisdictionType }) {
122
+ return [
123
+ taxRegionId,
124
+ taxGroupId,
125
+ normalizeDedupeField(taxName),
126
+ normalizeDedupeField(taxType),
127
+ normalizeDedupeField(jurisdiction),
128
+ normalizeDedupeField(jurisdictionType),
129
+ ].join('|');
130
+ }
131
+
132
+ // The four Wix "default" tax groups every site has (VERIFIED live 2026-08-12 via
133
+ // List Default Tax Groups: "Shipping and delivery", "Products", "Services", "Cancellation
134
+ // fees" — see tax-group.json's query-tax-groups-excludes-defaults pitfall). WooCommerce has no
135
+ // equivalent split: a `class: "standard"` rate (or a blank class) is the store's ONE general
136
+ // rate, not a products-only rate — WooCommerce's own `shipping` boolean on a tax rate row
137
+ // exists specifically because the rate is meant to reach beyond products. Wix's
138
+ // Products/Shipping and delivery/Services/Cancellation fees groups are BILLING categories, not
139
+ // TAX-RATE categories, so mapping a standard rate to "Products" only silently zero-rates every
140
+ // other category in that region — a group with no manual tax mapping calculates to EXACTLY
141
+ // ZERO tax (VERIFIED live 2026-08-12, see manual-tax-mapping.json's
142
+ // unmapped-tax-group-calculates-to-exactly-zero-tax finding). That is undercharging, not a
143
+ // faithful migration, so a standard-class rate must get one mapping per default group.
144
+ const DEFAULT_GROUP_NAMES = ['Products', 'Shipping and delivery', 'Services', 'Cancellation fees'];
145
+
146
+ // Which already-created Wix tax groups a WooCommerce rate's Manual Tax Mapping(s) should
147
+ // target. `defaultGroups` is List Default Tax Groups' result; `customGroups` is this project's
148
+ // own created-group tracking, each carrying the `sourceTaxClass` it was created for (from
149
+ // planCustomTaxGroups's plan — a plain Query Tax Groups result has no such field, since Wix
150
+ // itself doesn't know why a custom group exists).
151
+ //
152
+ // A `standard` (or blank) class rate targets every DEFAULT group — never a class-specific
153
+ // custom group (a reduced-rate/zero-rate group exists so a product TAGGED with that class gets
154
+ // a different rate than the store's general one, not the same rate broadened everywhere), and
155
+ // never the Tax Exempt group (no mapping is how exempt is represented at all — this falls out
156
+ // naturally here since Tax Exempt's `sourceTaxClass` is null and no rate's class is ever null).
157
+ // A non-standard class rate targets ONLY its own matching custom group.
158
+ //
159
+ // List Default Tax Groups' own schema (dev.wix.com, checked 2026-08-15) has no locale-invariant
160
+ // key for "which billing category is this" — a TaxGroup is only {id, name, revision, dates}, and
161
+ // the docs' own worked example returns a completely different default set ("Standard Tax") than
162
+ // a live site returns, confirming `name` genuinely varies per site/locale and isn't a fixed
163
+ // constant. `name` is matched here anyway because it's the ONLY field the API offers for this —
164
+ // but matching zero (or some but not all four) of DEFAULT_GROUP_NAMES on a translated or
165
+ // differently-configured site must never fall through to a silent partial fan-out: that would
166
+ // reproduce the exact silent-undercharging bug this function exists to fix, just triggered by
167
+ // site language/config instead of an incomplete implementation. Fail loudly instead, so a human
168
+ // resolves the real name mismatch before any mapping is created.
169
+ function groupsForRate(rate, { defaultGroups = [], customGroups = [] } = {}) {
170
+ const taxClass = String(rate?.class || 'standard').trim() || 'standard';
171
+ if (taxClass === 'standard') {
172
+ const matched = defaultGroups.filter((group) => DEFAULT_GROUP_NAMES.includes(String(group?.name || '').trim()));
173
+ if (matched.length !== DEFAULT_GROUP_NAMES.length) {
174
+ const foundNames = matched.map((group) => group.name);
175
+ const missing = DEFAULT_GROUP_NAMES.filter((name) => !foundNames.includes(name));
176
+ throw new Error(
177
+ `groupsForRate: expected all ${DEFAULT_GROUP_NAMES.length} default tax groups (${DEFAULT_GROUP_NAMES.join(', ')}), `
178
+ + `found only ${matched.length} (missing: ${missing.join(', ')}). This site's default tax group names may be `
179
+ + 'translated or otherwise non-standard -- resolve the real names via List Default Tax Groups before mapping, '
180
+ + 'do not silently map to a partial set.',
181
+ );
182
+ }
183
+ return matched;
184
+ }
185
+ return customGroups.filter((group) => group?.sourceTaxClass === taxClass);
186
+ }
187
+
188
+ // Only create a custom tax group when a real per-product signal exists — never speculatively,
189
+ // just because wc/v3/taxes/classes lists WooCommerce's unused defaults (reduced-rate/zero-rate).
190
+ // `products` here is the discovered wc/v3/products record shape (`tax_class`, `tax_status`).
191
+ function planCustomTaxGroups(products) {
192
+ const plans = [];
193
+ const classesInUse = new Set();
194
+ let hasExempt = false;
195
+ for (const product of products || []) {
196
+ const taxClass = String(product.tax_class || 'standard').trim() || 'standard';
197
+ if (taxClass !== 'standard') classesInUse.add(taxClass);
198
+ if (String(product.tax_status || 'taxable').trim() === 'none') hasExempt = true;
199
+ }
200
+ for (const taxClass of classesInUse) {
201
+ plans.push({ name: taxClass, sourceTaxClass: taxClass, reason: 'non-default WooCommerce tax_class actually assigned to at least one product' });
202
+ }
203
+ if (hasExempt) {
204
+ plans.push({ name: 'Tax Exempt', sourceTaxClass: null, exempt: true, reason: 'at least one product has tax_status=none — dedicated group, deliberately no manual tax mapping in any region' });
205
+ }
206
+ return plans;
207
+ }
208
+
209
+ // "No source has any tax-rate rows" is the majority case — the
210
+ // correct action is to create nothing speculative, not to pre-create empty regions/mappings.
211
+ function shouldSkipTaxDomain(taxRates) {
212
+ return !Array.isArray(taxRates) || taxRates.length === 0;
213
+ }
214
+
215
+ module.exports = {
216
+ SUBDIVISION_ELIGIBLE_COUNTRIES,
217
+ EMBARGOED_COUNTRIES,
218
+ normalizeSubdivision,
219
+ toWixTaxRateFraction,
220
+ groupTaxRatesByRegion,
221
+ taxRegionDedupeKey,
222
+ isEmbargoedCountry,
223
+ buildTaxRegionInput,
224
+ buildTaxGroupInput,
225
+ buildManualTaxMappingInput,
226
+ manualTaxMappingDedupeKey,
227
+ DEFAULT_GROUP_NAMES,
228
+ groupsForRate,
229
+ planCustomTaxGroups,
230
+ shouldSkipTaxDomain,
231
+ };
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+
3
+ const WRITER_ROOT = '/_api/url-mapper/writer/v1/url-mapping';
4
+
5
+ function createUrlMapperTransport({ send, inspectDestination }) {
6
+ if (typeof send !== 'function' || typeof inspectDestination !== 'function') throw new Error('authenticated sender and destination inspection required');
7
+ return {
8
+ inspectDestination,
9
+ async read(key) {
10
+ const result = await send({ method: 'GET', path: `${WRITER_ROOT}/${encodeURIComponent(key)}` });
11
+ if (result && (result.code === 'URL_MAPPER_NOT_FOUND' || result.status === 404)) return null;
12
+ const mapping = result && (result.urlMapping || result.mappingRecord || result);
13
+ if (!mapping || typeof mapping.mapping !== 'string' || typeof mapping.pageIdentifier !== 'string') {
14
+ throw new Error(`URL Mapper read-back for ${key} lacks saved mapping or page identifier`);
15
+ }
16
+ return mapping;
17
+ },
18
+ async write(payload, capability, { mode }) {
19
+ if (!capability || payload.key !== capability.key || payload.urlMapping?.pageIdentifier !== capability.pageIdentifier) {
20
+ throw new Error('URL Mapper payload differs from capability knowledge');
21
+ }
22
+ if (!['create', 'update'].includes(mode)) throw new Error('URL Mapper write mode required');
23
+ return send({ method: mode === 'create' ? 'POST' : 'PUT', path: `${WRITER_ROOT}/${encodeURIComponent(payload.key)}`, body: payload });
24
+ },
25
+ };
26
+ }
27
+
28
+ module.exports = { WRITER_ROOT, createUrlMapperTransport };
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ // Shared scalar-value helpers used across the rp-target-wix builders (tax-build.js,
4
+ // shipping-build.js, gift-card-build.js, ...). Kept tiny and dependency-free on purpose — this is
5
+ // not a general utils dumping ground, just the one helper that was independently duplicated
6
+ // byte-for-byte in three builder files.
7
+
8
+ function isBlank(value) {
9
+ return value == null || String(value).trim() === '';
10
+ }
11
+
12
+ module.exports = {
13
+ isBlank,
14
+ };
@@ -0,0 +1,34 @@
1
+ 'use strict';
2
+
3
+ // Shared deterministic one-to-one comparison; response order is never an identity.
4
+ function resolveInventoryRows(canonical, target) {
5
+ if (!target || !target.id || !Array.isArray(target.variantsInfo?.variants)) throw new Error('Target product omitted variant identities');
6
+ // Stores V3 may re-case option and choice names on write ("ALTERNATIV" reads back
7
+ // "Alternativ", "10m" reads back "10M"; LIVE-VERIFIED 2026-10-15), so names match
8
+ // case-insensitively. A case-only collision still fails below as an ambiguous match.
9
+ const key = (choices) => JSON.stringify(choices.map(c => [String(c.optionName).toLowerCase(), String(c.choiceName).toLowerCase()]).sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b))));
10
+ const targetByChoices = new Map();
11
+ for (const variant of target.variantsInfo.variants) {
12
+ if (!variant.id) throw new Error('Target variant omitted identity');
13
+ const choices = (variant.choices || []).map(c => {
14
+ if (c.optionChoiceNames) return c.optionChoiceNames;
15
+ const options = (target.options || []).filter(o => o.id === c.optionChoiceIds?.optionId);
16
+ if (options.length !== 1) throw new Error('Target option identity is missing or ambiguous');
17
+ const values = (options[0].choicesSettings?.choices || []).filter(v => v.choiceId === c.optionChoiceIds.choiceId);
18
+ if (values.length !== 1) throw new Error('Target choice identity is missing or ambiguous');
19
+ return { optionName: options[0].name, choiceName: values[0].name };
20
+ });
21
+ const identity = key(choices);
22
+ if (targetByChoices.has(identity)) throw new Error('Ambiguous target variant choices');
23
+ targetByChoices.set(identity, variant.id);
24
+ }
25
+ const matched = new Set();
26
+ return canonical.variants.map(variant => {
27
+ const variantId = targetByChoices.get(key(variant.choices));
28
+ if (!variantId || matched.has(variantId)) throw new Error('Source variant has no unique target match');
29
+ matched.add(variantId);
30
+ return { productId: target.id, variantId, inventory: { inStock: variant.inStock } };
31
+ });
32
+ }
33
+
34
+ module.exports = { resolveInventoryRows };
@@ -13,6 +13,7 @@
13
13
  // worse artifact than the twenty lines it replaces. The spec still owns WHICH canonical fields
14
14
  // route through them, so coverage reporting stays complete.
15
15
 
16
+ const { inventoryForVariant } = require('./stores-inventory.js');
16
17
  const { STORES_V3_TARGET, CATEGORY_TARGET, CANONICAL_FIELDS } = require('./wix-target-spec.js');
17
18
 
18
19
  // --- coercion --------------------------------------------------------------
@@ -27,13 +28,51 @@ function money(amount) {
27
28
  // Wix rejects a slug containing ^!“”$%&'*+,.:;<>=?@\/()[]{}_|` ~#. Vendors mint illegal ones
28
29
  // routinely — Shopify turns a decimal size into an underscore (ph-5_5), which 400s the whole
29
30
  // bulk batch, so this runs on EVERY slug rather than being a vendor quirk.
31
+ //
32
+ // CORRECTED 2026-09-27: this used to collapse to `[^a-z0-9-]+` — an ASCII allowlist that also
33
+ // stripped every non-Latin letter (Hebrew, Chinese, Cyrillic, ...), silently sanitizing an
34
+ // all-non-Latin slug down to near-empty. Confirmed live: non-Latin (e.g. Hebrew)
35
+ // product slugs written via direct PATCH read back byte-identical (see
36
+ // domains/stores/entities/product.json's wordpress-percent-encoded-slug pitfall, which only
37
+ // documents Wix stripping literal '%', never a non-Latin-letter rejection). Stripping non-Latin
38
+ // letters here would otherwise silently defeat decodeWpSlug's percent-decode for every non-Latin
39
+ // source site: decode restores the real non-Latin text, then this function threw it away again.
40
+ //
41
+ // REWRITTEN 2026-09-29: a hand
42
+ // enumerated punctuation BLOCKLIST is what the comment above still describes Wix's actual rule as
43
+ // -- but successive checks each found a DIFFERENT class of character neither this
44
+ // blocklist nor its two follow-on patches (C0/C1 control bytes, then Cf zero-width/format chars)
45
+ // happened to cover, most recently other Unicode symbols/punctuation entirely outside all three
46
+ // enumerations (™, §, •, an em dash, ½, ...). A blocklist enumeration is structurally incomplete
47
+ // by construction -- there is always a next uncovered class -- so this is now the other shape of
48
+ // the same rule, an ALLOWLIST of what to KEEP: Unicode letters (\p{L}, live-verified safe: the non-Latin
49
+ // slugs above), combining marks (\p{M}, so a decomposed accented letter written as base +
50
+ // combining accent, e.g. "e" + U+0301, survives as one unit instead of splitting into a hyphen),
51
+ // and decimal digits (\p{Nd} specifically, not the broader \p{N} -- Unicode "Other Number" also
52
+ // covers vulgar fractions and Roman numerals like "½"/"Ⅷ", which are exactly the kind of
53
+ // symbol-shaped character this rewrite exists to stop assuming is a safe slug character just
54
+ // because it happens to be a "number"). Everything outside that set -- known punctuation, control
55
+ // bytes, format chars, or a class nobody has hit yet -- becomes a hyphen. An allowlist by category
56
+ // is exhaustive; a blocklist enumeration cannot be, which is the whole reason this needed a 4th
57
+ // patch after three were already shipped.
58
+ const WIX_SLUG_ILLEGAL_CHARS = /[^\p{L}\p{M}\p{Nd}-]/gu;
30
59
  function toWixSlug(raw) {
31
60
  const slug = String(raw == null ? '' : raw)
32
61
  .toLowerCase()
33
- .replace(/[^a-z0-9-]+/g, '-')
62
+ .replace(/[\s_]+/g, '-')
63
+ .replace(WIX_SLUG_ILLEGAL_CHARS, '-')
34
64
  .replace(/-{2,}/g, '-')
35
65
  .replace(/^-+|-+$/g, '');
36
- if (!slug) throw new Error(`toWixSlug: "${raw}" sanitizes to an empty slug`);
66
+ // Non-empty is not enough: \p{M} combining marks (kept above for a decomposed accented
67
+ // letter, base + combining accent) also cover invisible marks like emoji variation selectors
68
+ // (U+FE0F etc), so an emoji/symbol-only title -- "heavy black heart" + VS-16, say -- can
69
+ // sanitize to a slug made of nothing but an invisible character. Require the survivor to carry
70
+ // at least one actual letter or digit; anything else is the same "no usable slug" case as
71
+ // sanitizing to empty, and gets the same deterministic-source-id-fallback treatment from the
72
+ // caller.
73
+ if (!slug || !/[\p{L}\p{Nd}]/u.test(slug)) {
74
+ throw new Error(`toWixSlug: "${raw}" sanitizes to an empty slug`);
75
+ }
37
76
  return slug;
38
77
  }
39
78
 
@@ -52,6 +91,34 @@ function isBlank(value) {
52
91
  return value == null || value === '' || (Array.isArray(value) && value.length === 0);
53
92
  }
54
93
 
94
+ // Classification is deliberately based on visible text, while the value returned to Wix retains
95
+ // its source HTML. WooCommerce descriptions regularly contain empty wrappers, &nbsp;, or the
96
+ // stock "Lorem ipsum" filler; importing any of those is equivalent to importing no copy.
97
+ function normalizedDescriptionText(value) {
98
+ return String(value == null ? '' : value)
99
+ .replace(/<!--[\s\S]*?-->/g, ' ')
100
+ .replace(/<[^>]*>/g, ' ')
101
+ .replace(/&(nbsp|#0*160|#x0*a0);/gi, ' ')
102
+ .replace(/&(amp|quot|#0*39|#x0*27);/gi, ' ')
103
+ .normalize('NFKC')
104
+ .replace(/\s+/g, ' ')
105
+ .trim();
106
+ }
107
+
108
+ function isPlaceholderDescription(value) {
109
+ return normalizedDescriptionText(value).toLowerCase().startsWith('lorem ipsum');
110
+ }
111
+
112
+ // Wix Stores has one product description, whereas WooCommerce supplies a short, above-the-fold
113
+ // body and a long body. Preserve each non-placeholder source body in source reading order. The
114
+ // horizontal rule is intentional content structure, not a visual approximation with blank lines.
115
+ function composeProductDescription({ description, shortDescription } = {}) {
116
+ const long = normalizedDescriptionText(description) && !isPlaceholderDescription(description) ? description : undefined;
117
+ const short = normalizedDescriptionText(shortDescription) && !isPlaceholderDescription(shortDescription) ? shortDescription : undefined;
118
+ if (short && long) return `${short}\n<hr />\n${long}`;
119
+ return short || long;
120
+ }
121
+
55
122
  // --- structural builders ---------------------------------------------------
56
123
  // Option definitions are derived from the variants' own choices, so a value that never occurs
57
124
  // cannot produce a phantom choice. Order is first-seen, which preserves the source's ordering.
@@ -73,7 +140,7 @@ function buildOptions(product) {
73
140
  // A variant references its option choices BY NAME; the API returns server-assigned choice ids.
74
141
  // An empty `choices: []` is the correct encoding of "this product has no real options" — it must
75
142
  // produce a single default variant, never a synthetic one-choice option.
76
- function buildVariants(product, { inStock = true } = {}) {
143
+ function buildVariants(product, { inStock } = {}) {
77
144
  return (product.variants || []).map((variant) => {
78
145
  const out = {
79
146
  visible: coerceBoolean(variant.visible, true),
@@ -85,8 +152,9 @@ function buildVariants(product, { inStock = true } = {}) {
85
152
  },
86
153
  })),
87
154
  price: buildVariantPrice(variant),
88
- inventoryItem: { inStock },
89
155
  };
156
+ const inventory = inventoryForVariant(variant, { inStock });
157
+ if (inventory) out.inventoryItem = inventory;
90
158
  if (!isBlank(variant.sku)) out.sku = String(variant.sku);
91
159
  // Weight is expected already converted to the site's unit by the adapter; the canonical field
92
160
  // carries a number, not a unit-bearing string.
@@ -127,16 +195,57 @@ function buildVariantPrice(variant) {
127
195
  // product's main media, so caller-side ordering matters.
128
196
  // TRAP: reading these back needs `?fields=MEDIA_ITEMS_INFO`; a plain GET returns only media.main
129
197
  // and looks empty even on a successful ingest.
198
+ //
199
+ // The url this emits is a REQUEST TO FETCH, not a stored file. Wix returns 200 before it has
200
+ // fetched anything, and a failed background fetch drops the item and leaves the product with an
201
+ // EMPTY gallery — silently, and after the old image was already replaced. A caller
202
+ // that writes this media and trusts the 200 has not finished; use
203
+ // `patchStoresProductMediaVerified` or run an equivalent read-back sweep.
204
+ //
205
+ // `image.url` MUST arrive already resolved to the source's original, maximum-resolution file and
206
+ // already percent-encoded. Wix copies exactly the one file this URL points at and
207
+ // generates every derivative from it, with no way to raise the quality afterwards — so a crop
208
+ // passed here is that product's permanent ceiling. Do not "helpfully" reach back to a raw source
209
+ // field such as `src` here; the source adapter owns that choice and knows which of the several
210
+ // URLs the source offered is the biggest.
130
211
  function buildMedia(product) {
131
212
  const items = (product.images || [])
132
213
  .filter((image) => image && image.fetchable !== false && !isBlank(image.url))
133
- .map((image) => ({ url: image.url, ...(isBlank(image.altText) ? {} : { altText: image.altText }) }));
214
+ .map((image) => ({
215
+ url: image.url,
216
+ ...(isBlank(image.altText) ? {} : { altText: image.altText }),
217
+ ...(isBlank(image.displayName) ? {} : { displayName: image.displayName }),
218
+ }));
134
219
  return items.length ? { itemsInfo: { items } } : null;
135
220
  }
136
221
 
137
- // Emit a title tag only when it differs from the product name — a duplicate tag says nothing and
138
- // is pure noise in the payload.
139
- function buildSeoData(product) {
222
+ // A product that carries `seoEvidence` (an evidence-contract source such as Yoast on
223
+ // WooCommerce) emits a tag ONLY for a proven per-field override, or for the owner's explicit
224
+ // `materialize` choice via `seoPlan` (rp-target-wix/lib/product-seo.js planProductSeo). Its
225
+ // `seoTitle`/`seoDescription` are ignored: on such sources those are rendered template output,
226
+ // and writing them turns an inherited pattern into a hard per-product override. A proven override
227
+ // is written even when it equals the product name.
228
+ //
229
+ // A product WITHOUT `seoEvidence` is the legacy CSV path (Shopify/Magento/BigCommerce SEO
230
+ // columns are authored per-product values): unchanged, including the duplicate-of-name skip.
231
+ function buildSeoData(product, { seoPlan } = {}) {
232
+ if (product.seoEvidence !== undefined && product.seoEvidence !== null) {
233
+ let tags;
234
+ if (seoPlan) {
235
+ if (seoPlan.productId !== undefined && product.sourceId != null && String(seoPlan.productId) !== String(product.sourceId)) {
236
+ throw new Error(`buildSeoData: seoPlan for ${seoPlan.productId} passed for product ${product.sourceId}`);
237
+ }
238
+ tags = seoPlan.tags;
239
+ } else {
240
+ tags = [];
241
+ const ev = product.seoEvidence;
242
+ if (ev.title && ev.title.state === 'override' && !isBlank(ev.title.value)) tags.push({ type: 'title', children: String(ev.title.value) });
243
+ if (ev.description && ev.description.state === 'override' && !isBlank(ev.description.value)) {
244
+ tags.push({ type: 'meta', props: { name: 'description', content: String(ev.description.value) } });
245
+ }
246
+ }
247
+ return tags.length ? { tags: tags.map((tag) => JSON.parse(JSON.stringify(tag))) } : null;
248
+ }
140
249
  const tags = [];
141
250
  if (!isBlank(product.seoTitle) && String(product.seoTitle).trim() !== String(product.name || '').trim()) {
142
251
  tags.push({ type: 'title', children: String(product.seoTitle) });
@@ -158,19 +267,56 @@ function setPath(target, path, value) {
158
267
  cursor[parts[parts.length - 1]] = value;
159
268
  }
160
269
 
270
+ // `sourceDeclaredOptionNames` says which options the SOURCE declared, independent of
271
+ // whether any variant choices could be resolved from them. `choices: []` must keep meaning "no
272
+ // real options", so a product that declared options yet built none is a LOST-options product,
273
+ // and it throws unless the caller passes the user's own recorded decision for THIS product. The
274
+ // decision is bound twice (key and value both name `product.sourceId`), so product A's entry can
275
+ // never be replayed for B, even by rebuilding the key from B's id.
276
+ function isValidOptionLossDecision(product, decision) {
277
+ if (!decision || typeof decision !== 'object') return false;
278
+ const { key, entry } = decision;
279
+ const sourceId = product.sourceId == null ? '' : String(product.sourceId);
280
+ if (!sourceId.trim() || key !== `optionLoss:${sourceId}`) return false;
281
+ if (!entry || typeof entry !== 'object' || entry.source !== 'user') return false;
282
+ const value = entry.value;
283
+ if (!value || typeof value !== 'object') return false;
284
+ if (value.accept !== 'default-variant' || value.sourceProductId !== sourceId) return false;
285
+ const declared = product.sourceDeclaredOptionNames;
286
+ const accepted = value.declaredOptionNames;
287
+ return (
288
+ Array.isArray(accepted) &&
289
+ accepted.length === declared.length &&
290
+ accepted.every((name, index) => name === declared[index])
291
+ );
292
+ }
293
+
294
+ function assertDeclaredOptionsResolved(product, options, optionLossDecision) {
295
+ const declared = product.sourceDeclaredOptionNames;
296
+ if (declared === undefined || declared === null) return;
297
+ if (!Array.isArray(declared)) {
298
+ throw new Error(`buildProduct: "${product.name}" sourceDeclaredOptionNames must be an array of option names`);
299
+ }
300
+ if (!declared.length || options.length) return;
301
+ if (isValidOptionLossDecision(product, optionLossDecision)) return;
302
+ throw new Error(
303
+ `buildProduct: "${product.name}" (${product.sourceId}) declared options [${declared.join(', ')}] but resolved to zero; record the loss in mapping-gaps.json (no valid human optionLoss decision for this product).`,
304
+ );
305
+ }
306
+
161
307
  // Builds the Stores V3 create body from a canonical product record.
162
- // `options.inStock` exists because availability is frequently the ONLY importable inventory signal
163
- // (most vendor exports carry no quantity column); sending quantity 0 would mark a whole catalog
164
- // out of stock, so the caller states the intent explicitly.
165
- function buildProduct(product, { inStock = true, target = STORES_V3_TARGET } = {}) {
308
+ // Explicit variant stock wins. A caller may supply an approved fallback for missing stock;
309
+ // there is no implicit availability default. Codegen reports variants without stock evidence.
310
+ function buildProduct(product, { inStock, target = STORES_V3_TARGET, optionLossDecision, seoPlan } = {}) {
166
311
  if (isBlank(product.name)) throw new Error('buildProduct: product.name is required');
167
312
  const body = { ...target.constants };
313
+ const composedDescription = composeProductDescription(product);
168
314
 
169
315
  // Spec-driven scalars.
170
316
  for (const [canonicalPath, fieldSpec] of Object.entries(target.fields)) {
171
317
  if (!fieldSpec.payloadPath) continue; // structural: handled below
172
318
  const key = canonicalPath.replace(/^product\./, '');
173
- let value = product[key];
319
+ let value = canonicalPath === 'product.description' ? composedDescription : product[key];
174
320
  const def = CANONICAL_FIELDS[canonicalPath] || {};
175
321
  if (isBlank(value) && def.default !== undefined) value = def.default;
176
322
  if (isBlank(value) && typeof value !== 'boolean') continue;
@@ -189,10 +335,11 @@ function buildProduct(product, { inStock = true, target = STORES_V3_TARGET } = {
189
335
 
190
336
  // Structural builders, declared in the spec via `via`.
191
337
  const options = buildOptions(product);
338
+ assertDeclaredOptionsResolved(product, options, optionLossDecision);
192
339
  if (options.length) body.options = options;
193
340
  const media = buildMedia(product);
194
341
  if (media) body.media = media;
195
- const seoData = buildSeoData(product);
342
+ const seoData = buildSeoData(product, { seoPlan });
196
343
  if (seoData) body.seoData = seoData;
197
344
  body.variantsInfo = { variants: buildVariants(product, { inStock }) };
198
345
  if (!body.variantsInfo.variants.length) {
@@ -204,7 +351,7 @@ function buildProduct(product, { inStock = true, target = STORES_V3_TARGET } = {
204
351
  // --- category --------------------------------------------------------------
205
352
  // Categories are created depth-ascending so a parent id is always resolvable. Dedupe against a
206
353
  // live site must key on name + PARENT, never name alone: a real tree repeats a name at different
207
- // depths (e.g. "Shampoo & Conditioner" under two different parents).
354
+ // depths (e.g. "Accessories" under two different parents).
208
355
  function buildCategory(category, { categoryIdByPath = new Map(), target = CATEGORY_TARGET } = {}) {
209
356
  if (isBlank(category.name)) throw new Error('buildCategory: category.name is required');
210
357
  const body = { ...target.constants };
@@ -226,7 +373,11 @@ function buildCategory(category, { categoryIdByPath = new Map(), target = CATEGO
226
373
  module.exports = {
227
374
  money,
228
375
  toWixSlug,
376
+ WIX_SLUG_ILLEGAL_CHARS,
229
377
  coerceBoolean,
378
+ normalizedDescriptionText,
379
+ isPlaceholderDescription,
380
+ composeProductDescription,
230
381
  buildOptions,
231
382
  buildVariants,
232
383
  buildVariantPrice,