@wix/agent-skills 1.33.1 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (616) hide show
  1. package/README.md +2 -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 +13 -3
  181. package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
  182. package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
  183. package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
  184. package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
  185. package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
  186. package/skills/wix-manage/references/sites/upload-static-site.md +127 -8
  187. package/skills/wix-replatform/.publish-manifest.json +5 -5
  188. package/skills/wix-replatform/CLI.md +162 -0
  189. package/skills/wix-replatform/README.md +52 -0
  190. package/skills/wix-replatform/SKILL.md +229 -684
  191. package/skills/wix-replatform/console/account.css +1 -0
  192. package/skills/wix-replatform/console/app.css +1 -0
  193. package/skills/wix-replatform/console/app.js +117 -0
  194. package/skills/wix-replatform/console/index.html +4 -0
  195. package/skills/wix-replatform/console/json.css +11 -0
  196. package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
  197. package/skills/wix-replatform/lib/app-page-routing.js +75 -0
  198. package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
  199. package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
  200. package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
  201. package/skills/wix-replatform/lib/completion-report.js +1393 -13
  202. package/skills/wix-replatform/lib/config-env.js +85 -11
  203. package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
  204. package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
  205. package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
  206. package/skills/wix-replatform/lib/destination-choice.js +163 -0
  207. package/skills/wix-replatform/lib/destination-handoff.js +62 -0
  208. package/skills/wix-replatform/lib/destination-http.js +81 -0
  209. package/skills/wix-replatform/lib/destination-route.js +98 -0
  210. package/skills/wix-replatform/lib/destination.js +919 -0
  211. package/skills/wix-replatform/lib/discovered-census.js +231 -0
  212. package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
  213. package/skills/wix-replatform/lib/document-url-guard.js +203 -0
  214. package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
  215. package/skills/wix-replatform/lib/entity-verification.js +18 -0
  216. package/skills/wix-replatform/lib/execution-capability.js +120 -0
  217. package/skills/wix-replatform/lib/execution-log.js +170 -0
  218. package/skills/wix-replatform/lib/execution-manifest.js +20 -2
  219. package/skills/wix-replatform/lib/execution-state.js +22 -0
  220. package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
  221. package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
  222. package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
  223. package/skills/wix-replatform/lib/import-recovery.js +800 -6
  224. package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
  225. package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
  226. package/skills/wix-replatform/lib/link-audit.js +173 -0
  227. package/skills/wix-replatform/lib/link-census.js +194 -0
  228. package/skills/wix-replatform/lib/link-plan.js +148 -0
  229. package/skills/wix-replatform/lib/link-verification.js +274 -0
  230. package/skills/wix-replatform/lib/link-write-journal.js +42 -0
  231. package/skills/wix-replatform/lib/local-state.js +869 -30
  232. package/skills/wix-replatform/lib/member-completion.js +658 -0
  233. package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
  234. package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
  235. package/skills/wix-replatform/lib/migration-completion.js +311 -0
  236. package/skills/wix-replatform/lib/operator-identity.js +47 -0
  237. package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
  238. package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
  239. package/skills/wix-replatform/lib/orchestration-router.js +608 -32
  240. package/skills/wix-replatform/lib/orchestration-state.js +188 -12
  241. package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
  242. package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
  243. package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
  244. package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
  245. package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
  246. package/skills/wix-replatform/lib/progress-log.js +19 -3
  247. package/skills/wix-replatform/lib/read-back-approval.js +184 -0
  248. package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
  249. package/skills/wix-replatform/lib/read-back-contract.js +243 -0
  250. package/skills/wix-replatform/lib/read-back-extract.js +118 -0
  251. package/skills/wix-replatform/lib/read-back-gate.js +734 -0
  252. package/skills/wix-replatform/lib/read-back-reads.js +94 -0
  253. package/skills/wix-replatform/lib/read-back-state.js +107 -0
  254. package/skills/wix-replatform/lib/read-back-summary.js +81 -0
  255. package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
  256. package/skills/wix-replatform/lib/run-controller.js +401 -0
  257. package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
  258. package/skills/wix-replatform/lib/setup-verification.js +148 -0
  259. package/skills/wix-replatform/lib/source-access.js +231 -0
  260. package/skills/wix-replatform/lib/source-coverage.js +1130 -0
  261. package/skills/wix-replatform/lib/source-secrets.js +277 -0
  262. package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
  263. package/skills/wix-replatform/lib/task-state.js +110 -0
  264. package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
  265. package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
  266. package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
  267. package/skills/wix-replatform/lib/url-verification.js +315 -0
  268. package/skills/wix-replatform/lib/user-action-effects.js +42 -0
  269. package/skills/wix-replatform/lib/user-actions.js +264 -0
  270. package/skills/wix-replatform/lib/website-handoff.js +1220 -0
  271. package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
  272. package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
  273. package/skills/wix-replatform/lib/write-verification-state.js +92 -0
  274. package/skills/wix-replatform/lib/write-verification.js +274 -0
  275. package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
  276. package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
  277. package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
  278. package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
  279. package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
  280. package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
  281. package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
  282. package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
  283. package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
  284. package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
  285. package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
  286. package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
  287. package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
  288. package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
  289. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
  290. package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
  291. package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
  292. package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
  293. package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
  294. package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
  295. package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
  296. package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
  297. package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
  298. package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
  299. package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
  300. package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
  301. package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
  302. package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
  303. package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
  304. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
  305. package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
  306. package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
  307. package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
  308. package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
  309. package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
  310. package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
  311. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
  312. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
  313. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
  314. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
  315. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
  316. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
  317. package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
  318. package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
  319. package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
  320. package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
  321. package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
  322. package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
  323. package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
  324. package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
  325. package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
  326. package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
  327. package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
  328. package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
  329. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
  330. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
  331. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
  332. package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
  333. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
  334. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
  335. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
  336. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
  337. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
  338. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
  339. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
  340. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
  341. package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
  342. package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
  343. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
  344. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
  345. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
  346. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
  347. package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
  348. package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
  349. package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
  350. package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
  351. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
  352. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
  353. package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
  354. package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
  355. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
  356. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
  357. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
  358. package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
  359. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
  360. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
  361. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
  362. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
  363. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
  364. package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
  365. package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
  366. package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
  367. package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
  368. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
  369. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
  370. package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
  371. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
  372. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
  373. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
  374. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
  375. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
  376. package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
  377. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
  378. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
  379. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
  380. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
  381. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
  382. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
  383. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
  384. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
  385. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
  386. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
  387. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
  388. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
  389. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
  390. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
  391. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
  392. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
  393. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
  394. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
  395. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
  396. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
  397. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
  398. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
  399. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
  400. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
  401. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
  402. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
  403. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
  404. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
  405. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
  406. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
  407. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
  408. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
  409. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
  410. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
  411. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
  412. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
  413. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
  414. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
  415. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
  416. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
  417. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
  418. package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
  419. package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
  420. package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
  421. package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
  422. package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
  423. package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
  424. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
  425. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
  426. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
  427. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
  428. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
  429. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
  430. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
  431. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
  432. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
  433. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
  434. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
  435. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
  436. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
  437. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
  438. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
  439. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
  440. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
  441. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
  442. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
  443. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
  444. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
  445. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
  446. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
  447. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
  448. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
  449. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
  450. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
  451. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
  452. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
  453. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
  454. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
  455. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
  456. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
  457. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
  458. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
  459. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
  460. package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
  461. package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
  462. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
  463. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
  464. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
  465. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
  466. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
  467. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
  468. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
  469. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
  470. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
  471. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
  472. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
  473. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
  474. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
  475. package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
  476. package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
  477. package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
  478. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
  479. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
  480. package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
  481. package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
  482. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
  483. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
  484. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
  485. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
  486. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
  487. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
  488. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
  489. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
  490. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
  491. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
  492. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
  493. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
  494. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
  495. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
  496. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
  497. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
  498. package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
  499. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
  500. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
  501. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
  502. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
  503. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
  504. package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
  505. package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
  506. package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
  507. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
  508. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
  509. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
  510. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
  511. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
  512. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
  513. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
  514. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
  515. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
  516. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
  517. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
  518. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
  519. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
  520. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
  521. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
  522. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
  523. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
  524. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
  525. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
  526. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
  527. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
  528. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
  529. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
  530. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
  531. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
  532. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
  533. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
  534. package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
  535. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
  536. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
  537. package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
  538. package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
  539. package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
  540. package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
  541. package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
  542. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
  543. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
  544. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
  545. package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
  546. package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
  547. package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
  548. package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
  549. package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
  550. package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
  551. package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
  552. package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
  553. package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
  554. package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
  555. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
  556. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
  557. package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
  558. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
  559. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
  560. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
  561. package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
  562. package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
  563. package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
  564. package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
  565. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
  566. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
  567. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
  568. package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
  569. package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
  570. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
  571. package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
  572. package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
  573. package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
  574. package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
  575. package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
  576. package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
  577. package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
  578. package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
  579. package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
  580. package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
  581. package/skills/wix-replatform/scripts/discovered-census.js +26 -0
  582. package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
  583. package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
  584. package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
  585. package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
  586. package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
  587. package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
  588. package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
  589. package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
  590. package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
  591. package/skills/wix-replatform/scripts/migration-completion.js +76 -0
  592. package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
  593. package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
  594. package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
  595. package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
  596. package/skills/wix-replatform/scripts/replatform-console.js +146 -0
  597. package/skills/wix-replatform/scripts/replatform.js +436 -0
  598. package/skills/wix-replatform/scripts/source-secrets.js +77 -0
  599. package/skills/wix-replatform/scripts/url-redirects.js +286 -0
  600. package/skills/wix-replatform/scripts/user-action.js +58 -0
  601. package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
  602. package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
  603. package/skills/wix-replatform/scripts/wix-destination.js +143 -0
  604. package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
  605. package/skills/wix-vibe-headless/SKILL.md +7 -3
  606. package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
  607. package/skills/wix-vibe-headless/platforms/base44.md +1 -0
  608. package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
  609. package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
  610. package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
  611. package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
  612. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
  613. package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
  614. package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
  615. package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
  616. package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
@@ -0,0 +1,618 @@
1
+ 'use strict';
2
+
3
+ // CMS fallback for a recognized plugin capability: two gates, both required.
4
+ //
5
+ // 1. Eligibility (repository, human-signed): plugins/cms-fallback-eligible.json says nothing
6
+ // native fits this capability, CMS may keep its records, and what the merchant loses.
7
+ // 2. Approval (per migration, merchant): orchestration/decisions.json carries
8
+ // `pluginCmsFallback:<capability>` with the merchant's answer, bound to the exact proposal
9
+ // that was shown (`proposalDigest`). No agent, automation mode or repository entry supplies it.
10
+ //
11
+ // Everything that decides whether a CMS plan is still valid goes through this one module, so
12
+ // the validator, the decision writer, the classifier, the router and the write-time guard can
13
+ // never disagree about what "approved" or "fresh" means.
14
+
15
+ const fs = require('node:fs');
16
+ const path = require('node:path');
17
+ const crypto = require('node:crypto');
18
+
19
+ const DECISION_PREFIX = 'pluginCmsFallback:';
20
+ const DECISION_VALUES = new Set(['approved', 'declined']);
21
+ const DIGEST_VERSION = 1;
22
+
23
+ const DEFAULT_PLUGINS_ROOT = path.resolve(__dirname, '..', 'resources', 'rp-source-wordpress', 'plugins');
24
+ const DEFAULT_TARGET_KNOWLEDGE_ROOT = path.resolve(__dirname, '..', 'resources', 'rp-target-wix', 'domains');
25
+
26
+ function pluginKnowledge() {
27
+ return require('../resources/rp-source-wordpress/lib/plugin-knowledge.js');
28
+ }
29
+
30
+ function isPlainObject(value) {
31
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
32
+ }
33
+
34
+ // Canonical JSON: object keys sorted at every depth, arrays kept in order (callers sort the
35
+ // arrays whose order carries no meaning before hashing).
36
+ function canonicalize(value) {
37
+ if (Array.isArray(value)) return value.map(canonicalize);
38
+ if (isPlainObject(value)) {
39
+ const out = {};
40
+ for (const key of Object.keys(value).sort()) {
41
+ if (value[key] !== undefined) out[key] = canonicalize(value[key]);
42
+ }
43
+ return out;
44
+ }
45
+ return value === undefined ? null : value;
46
+ }
47
+
48
+ function sha256(value) {
49
+ return `sha256:${crypto.createHash('sha256').update(JSON.stringify(canonicalize(value))).digest('hex')}`;
50
+ }
51
+
52
+ function decisionKey(capability) {
53
+ return `${DECISION_PREFIX}${capability}`;
54
+ }
55
+
56
+ // Exact, case-sensitive prefix. A look-alike key is not this family and keeps the generic
57
+ // fail-closed decision checks.
58
+ function isCmsFallbackDecisionKey(key) {
59
+ return typeof key === 'string' && key.startsWith(DECISION_PREFIX);
60
+ }
61
+
62
+ function capabilityOfKey(key) {
63
+ return isCmsFallbackDecisionKey(key) ? key.slice(DECISION_PREFIX.length) : null;
64
+ }
65
+
66
+ function canonicalTargetRefsByEntity(map) {
67
+ const out = {};
68
+ if (!isPlainObject(map)) return out;
69
+ for (const key of Object.keys(map).sort()) {
70
+ out[key] = Array.isArray(map[key]) ? [...map[key]].map(String).sort() : [];
71
+ }
72
+ return out;
73
+ }
74
+
75
+ // The proposal binding: what the merchant was shown. A changed ref, a ref moved between
76
+ // entities, an added/removed entity, or a changed featureLoss sentence changes the digest.
77
+ function cmsFallbackProposalDigest(entry) {
78
+ return sha256({
79
+ capability: entry && entry.capability ? String(entry.capability) : null,
80
+ targetRefsByEntity: canonicalTargetRefsByEntity(entry && entry.targetRefsByEntity),
81
+ featureLoss: entry && typeof entry.featureLoss === 'string' ? entry.featureLoss : null,
82
+ });
83
+ }
84
+
85
+ function unionTargetRefs(targetRefsByEntity) {
86
+ return Array.from(new Set(Object.values(canonicalTargetRefsByEntity(targetRefsByEntity)).flat())).sort();
87
+ }
88
+
89
+ // A register entry the runtime may use. Unsigned or structurally incomplete entries are
90
+ // ignored (the row stays pending), exactly like the other signed registers.
91
+ function isUsableEligibilityEntry(entry) {
92
+ if (!isPlainObject(entry) || !entry.capability || !entry.decidedBy || !entry.decidedOn) return false;
93
+ if (typeof entry.featureLoss !== 'string' || entry.featureLoss.length === 0) return false;
94
+ if (!isPlainObject(entry.targetRefsByEntity) || Object.keys(entry.targetRefsByEntity).length === 0) return false;
95
+ return Object.values(entry.targetRefsByEntity).every((refs) => Array.isArray(refs) && refs.length > 0
96
+ && refs.every((ref) => typeof ref === 'string' && ref.startsWith('cms/')));
97
+ }
98
+
99
+ function eligibilityByCapability(entries = []) {
100
+ const map = new Map();
101
+ for (const entry of entries || []) {
102
+ if (isUsableEligibilityEntry(entry)) map.set(entry.capability, entry);
103
+ }
104
+ return map;
105
+ }
106
+
107
+ // The audit timestamp the writer records (`Date#toISOString()`): a full ISO-8601 UTC/offset
108
+ // date-time that is also a real calendar instant. Anything else is a hand edit.
109
+ const ISO_DATE_TIME = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:\d{2})$/;
110
+ function isValidDecidedAt(decidedAt) {
111
+ if (typeof decidedAt !== 'string' || !ISO_DATE_TIME.test(decidedAt)) return false;
112
+ const time = Date.parse(decidedAt);
113
+ if (Number.isNaN(time)) return false;
114
+ // Reject calendar roll-over such as 2026-02-31 (Date.parse would accept it as March 3).
115
+ const [year, month, day] = decidedAt.slice(0, 10).split('-').map(Number);
116
+ const probe = new Date(Date.UTC(year, month - 1, day));
117
+ return probe.getUTCFullYear() === year && probe.getUTCMonth() === month - 1 && probe.getUTCDate() === day;
118
+ }
119
+
120
+ // Shape check for one `pluginCmsFallback:*` entry. Shared by validateDecisions (quarantine),
121
+ // the classifier, the writer's stale check and the write-time guard.
122
+ function cmsFallbackDecisionShape(key, value) {
123
+ if (!isPlainObject(value)) return { ok: false, problem: 'not-object' };
124
+ const capability = capabilityOfKey(key);
125
+ if (!capability) return { ok: false, problem: 'capability-missing' };
126
+ if (!DECISION_VALUES.has(value.value)) return { ok: false, problem: 'value-invalid' };
127
+ if (value.source !== 'user') return { ok: false, problem: 'source-not-user' };
128
+ if (!isValidDecidedAt(value.decidedAt)) return { ok: false, problem: 'decided-at-invalid' };
129
+ if (typeof value.approvedBy !== 'string' || value.approvedBy.trim().length === 0) {
130
+ return { ok: false, problem: 'approved-by-missing' };
131
+ }
132
+ if (!isPlainObject(value.proposal) || !isPlainObject(value.proposal.targetRefsByEntity)
133
+ || typeof value.proposal.featureLoss !== 'string') {
134
+ return { ok: false, problem: 'proposal-missing' };
135
+ }
136
+ const rehash = cmsFallbackProposalDigest({ capability, ...value.proposal });
137
+ if (typeof value.proposalDigest !== 'string' || rehash !== value.proposalDigest) {
138
+ return { ok: false, problem: 'digest-mismatch' };
139
+ }
140
+ return { ok: true, problem: null };
141
+ }
142
+
143
+ // What the stored answer means against the current register entry:
144
+ // none | approved | declined | stale (valid shape, different proposal) | invalid (quarantined)
145
+ function evaluateCmsFallbackDecision({ capability, entry = null, decisions = {} }) {
146
+ const key = decisionKey(capability);
147
+ const raw = decisions ? decisions[key] : undefined;
148
+ if (raw === undefined) return { state: 'none', key, raw: null };
149
+ const shape = cmsFallbackDecisionShape(key, raw);
150
+ if (!shape.ok) return { state: 'invalid', key, raw, problem: shape.problem };
151
+ if (!entry || raw.proposalDigest !== cmsFallbackProposalDigest(entry)) return { state: 'stale', key, raw };
152
+ return { state: raw.value, key, raw };
153
+ }
154
+
155
+ function cmsFallbackDecisionKeys(decisions = {}) {
156
+ return Object.keys(decisions || {}).filter(isCmsFallbackDecisionKey).sort();
157
+ }
158
+
159
+ // ---- resolution-input digest -----------------------------------------------------------
160
+
161
+ function entitiesForCapability(entities, capability) {
162
+ const list = entities || [];
163
+ const hasAttribution = list.some((entity) => entity && entity.capability);
164
+ return hasAttribution ? list.filter((entity) => entity.capability === capability) : list;
165
+ }
166
+
167
+ // The `<plugin>/<entity>` keys the register must cover for this capability, from the entity
168
+ // declarations the classifier will actually use.
169
+ function entityKeysForCapability(plugins, capability) {
170
+ const keys = [];
171
+ for (const plugin of plugins || []) {
172
+ for (const entity of entitiesForCapability(plugin.entities, capability)) {
173
+ keys.push(`${plugin.plugin}/${entity.entity}`);
174
+ }
175
+ }
176
+ return keys.sort();
177
+ }
178
+
179
+ function signedRegisterEntry(entries, capability, { requireSignature = true } = {}) {
180
+ const entry = (entries || []).find((candidate) => candidate && candidate.capability === capability);
181
+ if (!entry) return null;
182
+ if (requireSignature && !(entry.decidedBy && entry.decidedOn)) return null;
183
+ return entry;
184
+ }
185
+
186
+ function resolveTargetKnowledge(targetKnowledge) {
187
+ return typeof targetKnowledge === 'function' ? targetKnowledge() : targetKnowledge;
188
+ }
189
+
190
+ /**
191
+ * Build the canonical input set that decides every in-scope capability's route.
192
+ *
193
+ * In scope: declared by a detected plugin AND (has a register entry OR is named by a
194
+ * `pluginCmsFallback:*` key). Ordinary plugin rows are out of scope, so they never trigger the
195
+ * freshness check. `targetKnowledge` may be a value or a loader function; it is only loaded when
196
+ * at least one capability is in scope.
197
+ */
198
+ function cmsFallbackResolutionInputs({
199
+ detectedPlugins = [],
200
+ profiles = [],
201
+ targetKnowledge = null,
202
+ registers = {},
203
+ decisions = {},
204
+ } = {}) {
205
+ const profileBySlug = new Map((profiles || []).map((profile) => [profile.plugin, profile]));
206
+ const eligibleEntries = registers.cmsFallbackEligible || [];
207
+ const requiresDevelopment = registers.requiresDevelopment || [];
208
+ const noMigrationCapabilities = (registers.noMigrationNeeded && registers.noMigrationNeeded.capabilities)
209
+ || registers.noMigrationCapabilities || [];
210
+ const keys = cmsFallbackDecisionKeys(decisions);
211
+ const keyedCapabilities = new Set(keys.map(capabilityOfKey).filter(Boolean));
212
+ const registeredCapabilities = new Set(eligibleEntries.filter(Boolean).map((entry) => entry.capability));
213
+
214
+ const declaredBy = new Map();
215
+ for (const detected of detectedPlugins || []) {
216
+ const slug = detected && detected.plugin;
217
+ if (!slug) continue;
218
+ const profile = profileBySlug.get(slug) || null;
219
+ const capabilities = new Set([...(detected.capabilities || []), ...((profile && profile.capabilities) || [])]);
220
+ for (const capability of capabilities) {
221
+ if (!declaredBy.has(capability)) declaredBy.set(capability, []);
222
+ declaredBy.get(capability).push({ slug, profile });
223
+ }
224
+ }
225
+
226
+ const inScope = Array.from(declaredBy.keys())
227
+ .filter((capability) => registeredCapabilities.has(capability) || keyedCapabilities.has(capability))
228
+ .sort();
229
+
230
+ let knowledge = null;
231
+ if (inScope.length > 0) {
232
+ try {
233
+ knowledge = resolveTargetKnowledge(targetKnowledge);
234
+ } catch (error) {
235
+ knowledge = { knownRefs: new Set(), capabilityRefs: new Map(), manualStepsByRef: new Map(), loadError: error.message };
236
+ }
237
+ }
238
+ const knownRefs = (knowledge && knowledge.knownRefs) || new Set();
239
+ const capabilityRefs = (knowledge && knowledge.capabilityRefs) || new Map();
240
+ const manualStepsByRef = (knowledge && knowledge.manualStepsByRef) || new Map();
241
+ const loaded = Boolean(knowledge) && !knowledge.loadError;
242
+ const refFacts = (refs) => Object.fromEntries([...refs].sort().map((ref) => [ref, {
243
+ known: knownRefs.has(ref),
244
+ manualSteps: manualStepsByRef.has(ref),
245
+ }]));
246
+
247
+ const capabilities = {};
248
+ for (const capability of inScope) {
249
+ const nativeRefs = [...(capabilityRefs.get(capability) || [])].sort();
250
+ capabilities[capability] = {
251
+ targetKnowledge: { loaded, nativeRefs: refFacts(nativeRefs) },
252
+ profiles: declaredBy.get(capability)
253
+ .sort((a, b) => a.slug.localeCompare(b.slug))
254
+ .map(({ slug, profile }) => (profile ? {
255
+ plugin: slug,
256
+ status: 'present',
257
+ capabilities: [...(profile.capabilities || [])].sort(),
258
+ entities: (profile.entities || []).map((entity) => ({
259
+ entity: entity.entity || null,
260
+ route: entity.route || null,
261
+ channel: entity.channel || null,
262
+ capability: entity.capability || null,
263
+ candidateTargetRefs: [...(entity.candidateTargetRefs || [])],
264
+ refs: refFacts(entity.candidateTargetRefs || []),
265
+ })).sort((a, b) => String(a.entity).localeCompare(String(b.entity))),
266
+ } : { plugin: slug, status: 'profile-missing' })),
267
+ requiresDevelopment: signedRegisterEntry(requiresDevelopment, capability, { requireSignature: false }),
268
+ noMigrationNeeded: signedRegisterEntry(noMigrationCapabilities, capability),
269
+ eligibility: signedRegisterEntry(eligibleEntries, capability, { requireSignature: false }),
270
+ decision: decisions && decisions[decisionKey(capability)] !== undefined ? decisions[decisionKey(capability)] : null,
271
+ };
272
+ }
273
+
274
+ // Every key whose capability is not in scope is carried raw, so writing, editing or removing
275
+ // any such key changes the digest too.
276
+ const otherDecisions = {};
277
+ for (const key of keys) {
278
+ if (!capabilities[capabilityOfKey(key)]) otherDecisions[key] = decisions[key];
279
+ }
280
+
281
+ return { version: DIGEST_VERSION, capabilities, otherDecisions };
282
+ }
283
+
284
+ function cmsFallbackInputsDigest(inputs) {
285
+ return sha256(inputs);
286
+ }
287
+
288
+ // ---- project loading (router, write-time guard, reclassifier) ---------------------------
289
+
290
+ function readJsonOrNull(filePath) {
291
+ try {
292
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
293
+ } catch {
294
+ return null;
295
+ }
296
+ }
297
+
298
+ function loadTargetKnowledgeSummary(targetKnowledgeRoot = DEFAULT_TARGET_KNOWLEDGE_ROOT) {
299
+ try {
300
+ const { knowledgeSummary } = require('../resources/rp-target-wix/lib/domain-knowledge.js');
301
+ return knowledgeSummary(targetKnowledgeRoot);
302
+ } catch (error) {
303
+ return { knownRefs: new Set(), capabilityRefs: new Map(), manualStepsByRef: new Map(), loadError: error.message };
304
+ }
305
+ }
306
+
307
+ function loadCmsFallbackRegisters(pluginsRoot = DEFAULT_PLUGINS_ROOT) {
308
+ const knowledge = pluginKnowledge();
309
+ return {
310
+ cmsFallbackEligible: knowledge.loadCmsFallbackEligible(pluginsRoot).capabilities || [],
311
+ requiresDevelopment: knowledge.loadRequiresDevelopment(pluginsRoot).capabilities || [],
312
+ noMigrationNeeded: knowledge.loadNoMigrationNeeded(pluginsRoot),
313
+ };
314
+ }
315
+
316
+ // The canonical artifacts a WordPress project carries: the promoted coverage copy the mapper
317
+ // reads, and the adapter's raw capture that holds the detection snapshot.
318
+ function projectPaths(projectDir) {
319
+ return {
320
+ coverage: path.join(projectDir, 'discovery', 'plugin-coverage.json'),
321
+ rawCoverage: path.join(projectDir, 'data', 'wp-discovery', 'plugin-coverage.json'),
322
+ inventory: path.join(projectDir, 'data', 'wp-discovery', 'plugin-inventory.json'),
323
+ canonicalInventory: path.join(projectDir, 'discovery', 'plugin-inventory.json'),
324
+ mappingPlan: path.join(projectDir, 'mapping', 'mapping-plan.json'),
325
+ setupPlan: path.join(projectDir, 'setup', 'setup-plan.json'),
326
+ };
327
+ }
328
+
329
+ function detectedPluginsOf(inventory) {
330
+ return ((inventory && inventory.detected) || []).map((plugin) => ({
331
+ plugin: plugin.plugin,
332
+ capabilities: [...(plugin.capabilities || [])],
333
+ }));
334
+ }
335
+
336
+ function computeCurrentDigest({ inventory, decisions = {}, pluginsRoot = DEFAULT_PLUGINS_ROOT, targetKnowledgeRoot = DEFAULT_TARGET_KNOWLEDGE_ROOT, targetKnowledge = null }) {
337
+ const inputs = cmsFallbackResolutionInputs({
338
+ detectedPlugins: detectedPluginsOf(inventory),
339
+ profiles: pluginKnowledge().loadProfiles(pluginsRoot),
340
+ targetKnowledge: targetKnowledge || (() => loadTargetKnowledgeSummary(targetKnowledgeRoot)),
341
+ registers: loadCmsFallbackRegisters(pluginsRoot),
342
+ decisions: decisions || {},
343
+ });
344
+ return { inputs, digest: cmsFallbackInputsDigest(inputs) };
345
+ }
346
+
347
+ function digestOf(artifact) {
348
+ return artifact && artifact.inputs && typeof artifact.inputs.cmsFallbackDigest === 'string'
349
+ ? artifact.inputs.cmsFallbackDigest
350
+ : null;
351
+ }
352
+
353
+ /**
354
+ * The router's freshness chain. Returns null when the project has no plugin coverage (nothing
355
+ * to check), otherwise { digest, stale: null | 'coverage' | 'mapping' | 'setup' }.
356
+ */
357
+ function checkCmsFallbackFreshness(projectDir, { decisions = {}, pluginsRoot, targetKnowledgeRoot } = {}) {
358
+ const paths = projectPaths(projectDir);
359
+ if (!fs.existsSync(paths.coverage)) return null;
360
+ const coverage = readJsonOrNull(paths.coverage);
361
+ const inventory = readJsonOrNull(paths.inventory) || readJsonOrNull(paths.canonicalInventory);
362
+ if (!coverage || !inventory) return { digest: null, stale: 'coverage', missing: !inventory ? 'plugin-inventory' : 'plugin-coverage' };
363
+ const { digest } = computeCurrentDigest({
364
+ inventory,
365
+ decisions,
366
+ pluginsRoot: pluginsRoot || DEFAULT_PLUGINS_ROOT,
367
+ targetKnowledgeRoot: targetKnowledgeRoot || DEFAULT_TARGET_KNOWLEDGE_ROOT,
368
+ });
369
+ if (digestOf(coverage) !== digest) return { digest, stale: 'coverage' };
370
+ if (fs.existsSync(paths.mappingPlan) && digestOf(readJsonOrNull(paths.mappingPlan)) !== digest) {
371
+ return { digest, stale: 'mapping' };
372
+ }
373
+ if (fs.existsSync(paths.setupPlan) && digestOf(readJsonOrNull(paths.setupPlan)) !== digest) {
374
+ return { digest, stale: 'setup' };
375
+ }
376
+ return { digest, stale: null };
377
+ }
378
+
379
+ function readJsonStrict(filePath) {
380
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
381
+ }
382
+
383
+ function writeJsonAtomicSync(filePath, value) {
384
+ const tempPath = `${filePath}.${process.pid}.tmp`;
385
+ fs.writeFileSync(tempPath, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
386
+ fs.renameSync(tempPath, filePath);
387
+ }
388
+
389
+ // rp-mapper and rp-setup-discovery bind the plans they write to the coverage they were built
390
+ // from: mapping-plan.json copies discovery/plugin-coverage.json's digest, setup-plan.json copies
391
+ // the mapping plan's.
392
+ function stampPlanDigest(projectDir, plan) {
393
+ const paths = projectPaths(projectDir);
394
+ const [sourcePath, targetPath] = plan === 'mapping'
395
+ ? [paths.coverage, paths.mappingPlan]
396
+ : plan === 'setup'
397
+ ? [paths.mappingPlan, paths.setupPlan]
398
+ : [null, null];
399
+ if (!sourcePath) throw new Error('stamp-plan requires --plan mapping|setup');
400
+ if (!fs.existsSync(targetPath)) throw new Error(`${path.relative(projectDir, targetPath)} does not exist; write the plan first`);
401
+ if (!fs.existsSync(sourcePath)) {
402
+ // No plugin coverage in this project: nothing to bind the plan to.
403
+ return { stamped: false, reason: `${path.relative(projectDir, sourcePath)} not present` };
404
+ }
405
+ const source = readJsonStrict(sourcePath);
406
+ const digest = source && source.inputs && source.inputs.cmsFallbackDigest;
407
+ if (typeof digest !== 'string') {
408
+ throw new Error(`${path.relative(projectDir, sourcePath)} carries no inputs.cmsFallbackDigest; regenerate it before stamping`);
409
+ }
410
+ const target = readJsonStrict(targetPath);
411
+ target.inputs = { ...(target.inputs || {}), cmsFallbackDigest: digest };
412
+ writeJsonAtomicSync(targetPath, target);
413
+ return { stamped: true, plan, cmsFallbackDigest: digest };
414
+ }
415
+
416
+ // ---- coverage rows -----------------------------------------------------------------------
417
+
418
+ function totalRecords(row) {
419
+ return Object.values((row && row.recordCounts) || {}).reduce((sum, value) => sum + (Number.isFinite(value) ? value : 0), 0);
420
+ }
421
+
422
+ function isApprovedCmsFallbackRow(row) {
423
+ return Boolean(row) && row.status === 'migration-planned' && row.via === 'cms'
424
+ && Boolean(row.cmsFallback) && row.cmsFallback.functionalityRestored === false;
425
+ }
426
+
427
+ function isEligibleCmsFallbackRow(row) {
428
+ return Boolean(row) && Boolean(row.cmsFallback) && typeof row.cmsFallback.proposalDigest === 'string';
429
+ }
430
+
431
+ // The proposal exactly as the coverage row shows it (pending: proposed refs; approved: the refs
432
+ // it was approved with). The writer reads it from here so nobody retypes it.
433
+ function proposalFromRow(row) {
434
+ const fallback = (row && row.cmsFallback) || {};
435
+ return {
436
+ targetRefsByEntity: canonicalTargetRefsByEntity(fallback.proposedTargetRefsByEntity || fallback.targetRefsByEntity),
437
+ featureLoss: typeof fallback.featureLoss === 'string' ? fallback.featureLoss : null,
438
+ };
439
+ }
440
+
441
+ // ---- write-time guard -------------------------------------------------------------------
442
+
443
+ /**
444
+ * Defence in depth behind the router: may the importer write CMS records for each eligible
445
+ * capability? Allowed only when the coverage row is an approved CMS fallback whose approval
446
+ * passes the shape check and matches the current register entry, AND the current resolution
447
+ * digest equals the one carried by plugin-coverage, the mapping plan and the setup plan.
448
+ */
449
+ //
450
+ // `refusals` lists the capabilities a write was actually refused for: those in `attempted` (the
451
+ // capabilities the caller's plan writes to CMS) when given, otherwise those whose coverage row
452
+ // still claims an approved CMS plan. A pending row with nothing planned is not a refusal.
453
+ function cmsFallbackWriteGuard(projectDir, { decisions = null, pluginsRoot, targetKnowledgeRoot, attempted = null } = {}) {
454
+ const paths = projectPaths(projectDir);
455
+ const root = pluginsRoot || DEFAULT_PLUGINS_ROOT;
456
+ const coverage = readJsonOrNull(paths.coverage) || readJsonOrNull(paths.rawCoverage);
457
+ const decisionsFile = decisions || readJsonOrNull(path.join(projectDir, 'orchestration', 'decisions.json')) || {};
458
+ const rows = (coverage && coverage.capabilities) || [];
459
+ const eligible = eligibilityByCapability(loadCmsFallbackRegisters(root).cmsFallbackEligible);
460
+
461
+ const capabilities = new Set();
462
+ for (const row of rows) {
463
+ if (row && row.recognized && (eligible.has(row.capability) || isEligibleCmsFallbackRow(row))) capabilities.add(row.capability);
464
+ }
465
+ const attemptedSet = attempted ? new Set(attempted) : null;
466
+ // Derived/unrecognized CMS rows (confidence: proposed, decided at the mapping review) are not
467
+ // this gate's business; a RECOGNIZED capability written to CMS always is.
468
+ if (attemptedSet) {
469
+ for (const capability of attemptedSet) {
470
+ if (eligible.has(capability) || rows.some((row) => row && row.recognized && row.capability === capability)) capabilities.add(capability);
471
+ }
472
+ }
473
+ if (capabilities.size === 0) return { capabilities: {}, refusals: [] };
474
+
475
+ const inventory = readJsonOrNull(paths.inventory) || readJsonOrNull(paths.canonicalInventory);
476
+ const current = inventory
477
+ ? computeCurrentDigest({ inventory, decisions: decisionsFile, pluginsRoot: root, targetKnowledgeRoot: targetKnowledgeRoot || DEFAULT_TARGET_KNOWLEDGE_ROOT }).digest
478
+ : null;
479
+ const chain = {
480
+ coverage: digestOf(coverage),
481
+ mappingPlan: digestOf(readJsonOrNull(paths.mappingPlan)),
482
+ setupPlan: digestOf(readJsonOrNull(paths.setupPlan)),
483
+ };
484
+ const fresh = Boolean(current) && chain.coverage === current && chain.mappingPlan === current && chain.setupPlan === current;
485
+
486
+ const result = {};
487
+ const refusals = [];
488
+ for (const capability of Array.from(capabilities).sort()) {
489
+ const row = rows.find((candidate) => candidate.capability === capability && candidate.recognized) || null;
490
+ const entry = eligible.get(capability) || null;
491
+ const evaluation = evaluateCmsFallbackDecision({ capability, entry, decisions: decisionsFile });
492
+ const entryDigest = entry ? cmsFallbackProposalDigest(entry) : null;
493
+ let reason = null;
494
+ if (!isApprovedCmsFallbackRow(row)) reason = 'coverage-row-not-approved-cms';
495
+ else if (!entry) reason = 'eligibility-missing';
496
+ else if (evaluation.state !== 'approved') reason = `decision-${evaluation.state}`;
497
+ else if (row.cmsFallback.proposalDigest !== entryDigest) reason = 'coverage-proposal-stale';
498
+ else if (!fresh) reason = 'resolution-inputs-changed';
499
+ const allowed = reason === null;
500
+ result[capability] = { allowed, reason, targetRefs: allowed ? [...(row.targetRefs || [])] : [] };
501
+ const wasAttempted = attemptedSet ? attemptedSet.has(capability) : isApprovedCmsFallbackRow(row);
502
+ if (!allowed && wasAttempted) {
503
+ refusals.push({ capability, reason, recordCount: totalRecords(row), targetRefs: unionTargetRefs(proposalFromRow(row).targetRefsByEntity) });
504
+ }
505
+ }
506
+ return { capabilities: result, refusals, digest: { current, ...chain } };
507
+ }
508
+
509
+ // ---- completion operator actions --------------------------------------------------------
510
+
511
+ const DEADLINE = 'before DNS change';
512
+
513
+ function refsText(refs) {
514
+ return refs && refs.length ? refs.join(', ') : 'CMS collections';
515
+ }
516
+
517
+ /**
518
+ * Operator actions for every eligible capability, derived from the current coverage rows, the
519
+ * write-time guard's refusals, and the CMS writes recorded by the previous completion report.
520
+ * Never deletes or rewrites CMS data; withdrawn data is handed to the Cutover Operator.
521
+ */
522
+ function cmsFallbackOperatorActions({ coverage = null, refusals = [], previousWrites = [], writes = [] } = {}) {
523
+ const rows = ((coverage && coverage.capabilities) || []).filter((row) => row && row.recognized && isEligibleCmsFallbackRow(row));
524
+ const refused = new Map((refusals || []).map((refusal) => [refusal.capability, refusal]));
525
+ const actions = [];
526
+
527
+ for (const row of rows) {
528
+ const capability = row.capability;
529
+ const records = totalRecords(row);
530
+ const proposal = proposalFromRow(row);
531
+ if (refused.has(capability)) continue;
532
+ if (isApprovedCmsFallbackRow(row)) {
533
+ actions.push({
534
+ code: 'plugin-cms-fallback-feature-absent',
535
+ severity: 'medium',
536
+ action: `${capability}: records were archived in Wix CMS (${refsText(row.targetRefs)}) with the merchant's approval; the plugin's feature is not restored. ${proposal.featureLoss || ''} Rebuild or replace that feature in Wix; a reconciled CMS collection does not resolve this item.`.replace(/\s+/g, ' ').trim(),
537
+ deadlineReason: DEADLINE,
538
+ entity: capability,
539
+ affectedCount: records,
540
+ });
541
+ continue;
542
+ }
543
+ const declined = row.reason === 'cms-fallback-declined';
544
+ actions.push({
545
+ code: declined ? 'plugin-cms-fallback-declined' : 'plugin-cms-fallback-undecided',
546
+ severity: records > 0 ? 'high' : 'low',
547
+ action: declined
548
+ ? `${capability}: the merchant declined archiving these records in CMS, so ${records} record(s) were not migrated. Settle the capability at the mapping review (another verdict) or accept that the data stays in the source.`
549
+ : `${capability}: archiving these records in CMS is awaiting the merchant's decision (${row.reason || 'undecided'}), so ${records} record(s) were not migrated. Ask the merchant at the mapping review to approve or decline the CMS fallback.`,
550
+ deadlineReason: DEADLINE,
551
+ entity: capability,
552
+ affectedCount: records,
553
+ });
554
+ }
555
+
556
+ for (const refusal of refusals || []) {
557
+ actions.push({
558
+ code: 'plugin-cms-fallback-write-refused',
559
+ severity: 'high',
560
+ action: `Requires Import Operator: CMS writes for ${refusal.capability} were refused (${refusal.reason}); zero records were written. Rerun from the orchestration router so the coverage, mapping plan and setup plan are regenerated, then import again.`,
561
+ deadlineReason: DEADLINE,
562
+ entity: refusal.capability,
563
+ affectedCount: Number.isFinite(refusal.recordCount) ? refusal.recordCount : 0,
564
+ });
565
+ }
566
+
567
+ const currentlyApproved = new Set(rows.filter((row) => isApprovedCmsFallbackRow(row) && !refused.has(row.capability)).map((row) => row.capability));
568
+ const writtenNow = new Set((writes || []).map((write) => write.capability));
569
+ for (const write of previousWrites || []) {
570
+ if (!write || !write.capability || !(write.count > 0)) continue;
571
+ if (currentlyApproved.has(write.capability) || writtenNow.has(write.capability)) continue;
572
+ actions.push({
573
+ code: 'plugin-cms-fallback-withdrawn',
574
+ severity: 'high',
575
+ action: `${write.capability}: ${write.count} record(s) were written to CMS (${refsText(write.collections)}) under an approval that no longer applies. Nothing was deleted. Cutover Operator: keep or remove that CMS data by hand in Business Manager.`,
576
+ deadlineReason: DEADLINE,
577
+ entity: write.capability,
578
+ affectedCount: write.count,
579
+ });
580
+ }
581
+ return actions;
582
+ }
583
+
584
+ module.exports = {
585
+ DECISION_PREFIX,
586
+ DECISION_VALUES,
587
+ DEFAULT_PLUGINS_ROOT,
588
+ DEFAULT_TARGET_KNOWLEDGE_ROOT,
589
+ canonicalize,
590
+ decisionKey,
591
+ isCmsFallbackDecisionKey,
592
+ capabilityOfKey,
593
+ canonicalTargetRefsByEntity,
594
+ cmsFallbackProposalDigest,
595
+ unionTargetRefs,
596
+ isUsableEligibilityEntry,
597
+ eligibilityByCapability,
598
+ cmsFallbackDecisionShape,
599
+ evaluateCmsFallbackDecision,
600
+ cmsFallbackDecisionKeys,
601
+ entitiesForCapability,
602
+ entityKeysForCapability,
603
+ cmsFallbackResolutionInputs,
604
+ cmsFallbackInputsDigest,
605
+ loadTargetKnowledgeSummary,
606
+ loadCmsFallbackRegisters,
607
+ projectPaths,
608
+ detectedPluginsOf,
609
+ computeCurrentDigest,
610
+ checkCmsFallbackFreshness,
611
+ stampPlanDigest,
612
+ totalRecords,
613
+ isApprovedCmsFallbackRow,
614
+ isEligibleCmsFallbackRow,
615
+ proposalFromRow,
616
+ cmsFallbackWriteGuard,
617
+ cmsFallbackOperatorActions,
618
+ };
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ // A provenance stamp for invoice-preservation approvals.
4
+ //
5
+ // The writer that imports a third-party invoice document relies on `approval.merchantOptedIn`,
6
+ // and that field is a plain boolean on a plain object. Review demonstrated the obvious consequence:
7
+ // a caller could hand-build `{ documentUrl, action: 'offer-preservation', merchantOptedIn: true }`
8
+ // and import a merchant's tax documents out of their provider's archive on nobody's authority --
9
+ // the exact counterfeit-approval path the planner/writer split was supposed to close.
10
+ //
11
+ // So the planner STAMPS what it approves, and the writer believes an opt-in only when the stamp
12
+ // verifies. The stamp is a hash over the fields the decision rests on, with a module constant, so
13
+ // it survives the plan being written to disk and read back by another process. It is not a secret
14
+ // and does not pretend to be: anyone who reads this file can forge it. What it prevents is the
15
+ // realistic failure -- an approval assembled by hand, or by reaching into the plan's `refused`
16
+ // list -- rather than a determined adversary with the source in front of them.
17
+
18
+ const crypto = require('node:crypto');
19
+
20
+ const STAMP_VERSION = 'rp-preservation-approval:v2';
21
+
22
+ // JSON-encoded (no delimiter to inject) over the URL, the action, the opt-in AND the source order
23
+ // the approval was issued for. Review demonstrated an approval for order A re-bound to order B by
24
+ // editing `orderId` after stamping, with the stamp still verifying: the order is part of what the
25
+ // planner decided, so it is part of what the stamp covers.
26
+ function stampInput(approval) {
27
+ const text = (value) => (value === undefined || value === null ? '' : String(value));
28
+ return JSON.stringify([
29
+ STAMP_VERSION,
30
+ text(approval.documentUrl),
31
+ text(approval.action),
32
+ approval.merchantOptedIn === true ? 'opted-in' : 'not-opted-in',
33
+ text(approval.orderId),
34
+ ]);
35
+ }
36
+
37
+ function computeApprovalStamp(approval) {
38
+ return crypto.createHash('sha256').update(stampInput(approval)).digest('hex');
39
+ }
40
+
41
+ // Returns a COPY carrying the stamp; the planner's approvals go through this.
42
+ function stampApproval(approval) {
43
+ if (!approval || typeof approval !== 'object') throw new Error('stampApproval needs an approval object');
44
+ return { ...approval, approvalStamp: computeApprovalStamp(approval) };
45
+ }
46
+
47
+ // True only when the stamp is present and matches the fields it was computed over. Changing the
48
+ // URL, the action, the opt-in or the order after stamping invalidates it.
49
+ function verifyApprovalStamp(approval) {
50
+ if (!approval || typeof approval !== 'object' || typeof approval.approvalStamp !== 'string') return false;
51
+ return approval.approvalStamp === computeApprovalStamp(approval);
52
+ }
53
+
54
+ module.exports = { STAMP_VERSION, computeApprovalStamp, stampApproval, verifyApprovalStamp };