@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
@@ -11,11 +11,19 @@ const CLASSIFICATIONS = new Set([
11
11
  'setup-config',
12
12
  'skip-by-default',
13
13
  'unsupported-native-gap',
14
+ // For manual-mapping: a complete, decided mapping with no write for our code to make — the entity
15
+ // carries `manualSteps` instead of a working `preferredWrite`. Deliberately not added to
16
+ // NATIVE_CLASSIFICATIONS below: import codegen must never treat this as a write target.
17
+ 'manual-mapping',
14
18
  ]);
15
19
  const ID_POLICIES = new Set(['client-assigned', 'server-assigned', 'natural-key', 'not-applicable']);
16
20
  const VERIFICATIONS = new Set(['verified-live', 'docs', 'source-review', 'internal-only', 'unverified', 'none']);
17
21
  const RELIABILITY = new Set(['reliable', 'partially-reliable', 'unreliable', 'unknown']);
22
+ const SURVEY_VERDICTS = new Set(['claimed', 'not-importable', 'not-relevant', 'gap', 'unreviewed']);
23
+ const NATIVE_CLASSIFICATIONS = new Set(['native', 'native-plus-cms']);
18
24
  const SAFE_MODE_CONTACT_KINDS = new Set(['email', 'phone']);
25
+ const BLOCKED_DEPENDENCY_DEGRADATIONS = new Set(['warning', 'deferred']);
26
+ const MANUAL_STEP_ACTORS = new Set(['merchant', 'external', 'wix-automatable']);
19
27
  const WRITER_IDS = new Set(Object.keys(wixWriters).filter((name) => typeof wixWriters[name] === 'function'));
20
28
 
21
29
  function knowledgeRoot(rootDir = path.resolve(__dirname, '..')) {
@@ -66,6 +74,7 @@ function generateIndex(domainsDir) {
66
74
  domains: {},
67
75
  sourceAliasIndex: {},
68
76
  routeAliasIndex: {},
77
+ capabilityIndex: {},
69
78
  flags: {},
70
79
  };
71
80
 
@@ -85,6 +94,10 @@ function generateIndex(domainsDir) {
85
94
  reliabilityFlags: (entity.reliability && entity.reliability.flags) || [],
86
95
  summary: firstPitfallOrGuidance(entity),
87
96
  };
97
+ if (entity.capability) {
98
+ if (!index.capabilityIndex[entity.capability]) index.capabilityIndex[entity.capability] = [];
99
+ index.capabilityIndex[entity.capability].push(`${domain}/${entityId}`);
100
+ }
88
101
  for (const alias of entity.sourceAliases || []) {
89
102
  const key = `${alias.sourceSystem}:${alias.sourceEntity}`;
90
103
  if (!index.sourceAliasIndex[key]) index.sourceAliasIndex[key] = [];
@@ -107,7 +120,7 @@ function generateIndex(domainsDir) {
107
120
  };
108
121
  }
109
122
 
110
- for (const collection of [index.sourceAliasIndex, index.routeAliasIndex, index.flags]) {
123
+ for (const collection of [index.sourceAliasIndex, index.routeAliasIndex, index.capabilityIndex, index.flags]) {
111
124
  for (const key of Object.keys(collection)) collection[key] = Array.from(new Set(collection[key])).sort();
112
125
  }
113
126
 
@@ -147,6 +160,42 @@ function validateKnowledge(domainsDir) {
147
160
  errors.push(`${domain}/domain.json: defaultImportOrder references missing entity ${entityId}`);
148
161
  }
149
162
  }
163
+ // REACHABILITY, the other direction — and the one that actually bites. The check above
164
+ // catches an order naming an entity that does not exist, which fails loudly. The reverse
165
+ // fails SILENTLY: an entity that is authored, has a verified writer, is covered by tests,
166
+ // and is named in no import order at all. Nothing errors, every test passes, and a run
167
+ // simply never writes it. That is how three separate entities shipped unreachable
168
+ // (ecom/shipping-option, ecom/pickup-location, site/business-contact) — each found only
169
+ // when a migrated site was missing the data and a human noticed.
170
+ //
171
+ // Rule: an entity with a writerId MUST be in its domain's defaultImportOrder. An entity
172
+ // with `writerId: null` has nothing to run and is legitimately absent, so the exclusion is
173
+ // derived from the entity's own contract rather than a hand-maintained opt-out list that
174
+ // would drift the same way.
175
+ const entitiesPath = path.join(domainsDir, domain, 'entities');
176
+ if (fs.existsSync(entitiesPath)) {
177
+ const order = new Set(domainJson.defaultImportOrder || []);
178
+ for (const fileName of fs.readdirSync(entitiesPath).filter((f) => f.endsWith('.json')).sort()) {
179
+ const entityId = fileName.replace(/\.json$/, '');
180
+ if (order.has(entityId)) continue;
181
+ let entityJson = null;
182
+ try {
183
+ entityJson = JSON.parse(fs.readFileSync(path.join(entitiesPath, fileName), 'utf8'));
184
+ } catch (error) {
185
+ continue; // the entity's own parse error is reported by validateEntity
186
+ }
187
+ if (entityJson && entityJson.preferredWrite && entityJson.preferredWrite.writerId) {
188
+ errors.push(`${domain}/domain.json: entity ${entityId} has writerId ${entityJson.preferredWrite.writerId} but is not in defaultImportOrder — a writer nothing runs migrates nothing. Add it to the order, or set preferredWrite.writerId to null if it genuinely cannot be written yet.`);
189
+ }
190
+ }
191
+ }
192
+ if (fs.existsSync(entitiesPath)) {
193
+ const entities = listEntityFiles(entitiesPath).map((fileName) => ({
194
+ id: fileName.replace(/\.json$/, ''),
195
+ dependsOn: loadEntity(domainsDir, domain, fileName.replace(/\.json$/, '')).dependsOn,
196
+ }));
197
+ errors.push(...validateDependsOnPromotion(domain, domainJson.dependsOnRequired, entities));
198
+ }
150
199
  validateEvidence(domainJson.evidence || [], `${domain}/domain.json`, errors);
151
200
 
152
201
  for (const fileName of listEntityFiles(path.join(domainsDir, domain))) {
@@ -155,6 +204,8 @@ function validateKnowledge(domainsDir) {
155
204
  const label = `${domain}/entities/${fileName}`;
156
205
  validateEntity(entity, domain, entityId, label, errors);
157
206
  }
207
+
208
+ validateDocsSurvey(domainsDir, domain, domainJson, errors);
158
209
  }
159
210
 
160
211
  if (!index) {
@@ -168,9 +219,285 @@ function validateKnowledge(domainsDir) {
168
219
  validateIndexConsistency(index, domainsDir, errors);
169
220
  }
170
221
 
222
+ validateDependsOn(domainsDir, errors);
223
+
171
224
  return { ok: errors.length === 0, errors, generatedIndex: generated };
172
225
  }
173
226
 
227
+ function validateDependsOnPromotion(domain, dependsOnRequired, entities) {
228
+ const errors = [];
229
+ if (typeof dependsOnRequired !== 'boolean') {
230
+ errors.push(`${domain}/domain.json: dependsOnRequired must be a boolean`);
231
+ return errors;
232
+ }
233
+ const undeclared = entities.filter((entity) => entity.dependsOn === undefined);
234
+ if (dependsOnRequired && undeclared.length) {
235
+ for (const entity of undeclared) {
236
+ errors.push(`${domain}/domain.json: dependsOnRequired is true but ${domain}/entities/${entity.id}.json has no dependsOn; review and declare its dependencies`);
237
+ }
238
+ }
239
+ if (!dependsOnRequired && undeclared.length === 0) {
240
+ errors.push(`${domain}/domain.json: dependsOnRequired is false but every entity is declared; promote this domain by setting dependsOnRequired to true`);
241
+ }
242
+ return errors;
243
+ }
244
+
245
+ // The dependsOn graph across every entity that has it. Pure disk read, no validation —
246
+ // `validateDependsOn` (ref resolution, cycles) and `checkScope` (rp-mapper's review-gate check)
247
+ // both build on this so the graph is assembled exactly once, the same way, everywhere it's needed.
248
+ function buildDependsOnGraph(domainsDir) {
249
+ const graph = new Map(); // ref -> dependsOn refs
250
+ for (const domain of listDomainDirs(domainsDir)) {
251
+ for (const fileName of listEntityFiles(path.join(domainsDir, domain))) {
252
+ const entityId = fileName.replace(/\.json$/, '');
253
+ const entity = loadEntity(domainsDir, domain, entityId);
254
+ if (entity.dependsOn === undefined) continue;
255
+ const ref = `${domain}/${entityId}`;
256
+ graph.set(ref, Array.isArray(entity.dependsOn) ? entity.dependsOn : []);
257
+ }
258
+ }
259
+ return graph;
260
+ }
261
+
262
+ // dependsOn is optional only in a domain that has not yet been promoted. Once a
263
+ // domain's explicit dependsOnRequired flag is true, validateKnowledge rejects an undeclared
264
+ // entity; in every domain a present declaration must resolve and the graph must stay acyclic.
265
+ // Builds its own local graph rather than calling buildDependsOnGraph afterward — this function
266
+ // already reads and parses every entity file once for ref-resolution/array-type checks, so
267
+ // reusing that same read for cycle detection (instead of a second full read+parse pass) halves
268
+ // the I/O of every `domain-knowledge-validate.js` run.
269
+ function validateDependsOn(domainsDir, errors) {
270
+ const graph = new Map();
271
+ for (const domain of listDomainDirs(domainsDir)) {
272
+ for (const fileName of listEntityFiles(path.join(domainsDir, domain))) {
273
+ const entityId = fileName.replace(/\.json$/, '');
274
+ const entity = loadEntity(domainsDir, domain, entityId);
275
+ const label = `${domain}/entities/${fileName}`;
276
+ if (entity.dependsOn === undefined) continue;
277
+ if (!Array.isArray(entity.dependsOn)) {
278
+ errors.push(`${label}: dependsOn must be an array when present`);
279
+ continue;
280
+ }
281
+ graph.set(`${domain}/${entityId}`, entity.dependsOn);
282
+ for (const [ref, mode] of Object.entries(entity.dependencyModes || {})) {
283
+ if (mode !== 'per-record' || !entity.dependsOn.includes(ref) || !Array.isArray(entity.dependencyReferenceFields?.[ref]) || !entity.dependencyReferenceFields[ref].length) errors.push(`dependency_mode_invalid:${domain}/${entityId}:${ref}`);
284
+ const [producerDomain, producerEntity] = ref.split('/');
285
+ if (fs.existsSync(path.join(domainsDir, producerDomain || '', 'entities', `${producerEntity}.json`)) && loadEntity(domainsDir, producerDomain, producerEntity).target?.classification === 'setup-config') errors.push(`dependency_mode_invalid:${domain}/${entityId}:${ref}`);
286
+ }
287
+ for (const dep of entity.dependsOn) {
288
+ const segments = String(dep).split('/');
289
+ const [depDomain, depEntity] = segments;
290
+ if (segments.length !== 2 || !depDomain || !depEntity || !fs.existsSync(path.join(domainsDir, depDomain, 'entities', `${depEntity}.json`))) {
291
+ errors.push(`${label}: dependsOn entry "${dep}" does not resolve to an entity file`);
292
+ }
293
+ }
294
+ }
295
+ }
296
+
297
+ const cycle = findCycle(graph);
298
+ if (cycle) errors.push(`dependsOn graph has a cycle: ${cycle.join(' -> ')}`);
299
+ }
300
+
301
+ function findCycle(graph) {
302
+ const WHITE = 0;
303
+ const GRAY = 1;
304
+ const BLACK = 2;
305
+ const color = new Map();
306
+ const stack = [];
307
+
308
+ function visit(node) {
309
+ color.set(node, GRAY);
310
+ stack.push(node);
311
+ for (const next of graph.get(node) || []) {
312
+ const state = color.get(next) || WHITE;
313
+ if (state === GRAY) return [...stack, next];
314
+ if (state === WHITE && graph.has(next)) {
315
+ const found = visit(next);
316
+ if (found) return found;
317
+ }
318
+ }
319
+ stack.pop();
320
+ color.set(node, BLACK);
321
+ return null;
322
+ }
323
+
324
+ for (const node of graph.keys()) {
325
+ if ((color.get(node) || WHITE) === WHITE) {
326
+ const found = visit(node);
327
+ if (found) return found;
328
+ }
329
+ }
330
+ return null;
331
+ }
332
+
333
+ // Every entity ref that actually exists on disk, regardless of whether it has dependsOn authored.
334
+ // checkScope needs this to tell "unknown ref" (not in this set) apart from "known but unreviewed"
335
+ // (in this set, absent from the dependsOn graph).
336
+ function listAllEntityRefs(domainsDir) {
337
+ const refs = [];
338
+ for (const domain of listDomainDirs(domainsDir)) {
339
+ for (const fileName of listEntityFiles(path.join(domainsDir, domain))) {
340
+ refs.push(`${domain}/${fileName.replace(/\.json$/, '')}`);
341
+ }
342
+ }
343
+ return refs;
344
+ }
345
+
346
+ // The rp-mapper review-gate check, as a pure function (the caller does not compute the transitive
347
+ // closure, and unknown refs and never-reviewed entities are never passed as though they were
348
+ // "reviewed, no dependencies").
349
+ // Given every real entity ref, the dependsOn graph, and the plan's own selected scope (only —
350
+ // the caller does not pre-expand anything), this walks dependsOn edges outward itself and reports
351
+ // three distinct, non-overlapping failure categories. `checkScope` below is the disk-reading
352
+ // wrapper `rp-mapper`/an agent/the CLI actually calls.
353
+ function computeScopeCheck(allRefs, graph, selectedRefs) {
354
+ const selectedSet = new Set((selectedRefs || []).map((ref) => String(ref)));
355
+ const unknownRefs = new Set(Array.from(selectedSet).filter((ref) => !allRefs.has(ref)));
356
+ const validSelected = Array.from(selectedSet).filter((ref) => allRefs.has(ref));
357
+
358
+ const visited = new Set();
359
+ const queue = [...validSelected];
360
+ const unreviewedRefs = [];
361
+ const missingByRef = new Map();
362
+
363
+ while (queue.length) {
364
+ const ref = queue.shift();
365
+ if (visited.has(ref)) continue;
366
+ visited.add(ref);
367
+
368
+ if (!allRefs.has(ref)) {
369
+ // Reached only via a dependsOn edge (never itself in selectedRefs, or `selectedSet` would
370
+ // already have caught it above) — a dangling/typo'd ref, not merely unreviewed.
371
+ unknownRefs.add(ref);
372
+ continue;
373
+ }
374
+
375
+ if (!graph.has(ref)) {
376
+ // Reachable, resolves to a real entity, but dependsOn has never been authored at all —
377
+ // fail-closed: "not yet reviewed" is not the same fact as "reviewed, no dependencies."
378
+ unreviewedRefs.push(ref);
379
+ continue;
380
+ }
381
+
382
+ const deps = graph.get(ref);
383
+ const missing = deps.filter((dep) => !selectedSet.has(dep));
384
+ if (missing.length) missingByRef.set(ref, missing);
385
+ for (const dep of deps) {
386
+ if (!visited.has(dep)) queue.push(dep);
387
+ }
388
+ }
389
+
390
+ const missingDependencies = Array.from(missingByRef.entries())
391
+ .map(([ref, missing]) => ({ ref, missing }))
392
+ .sort((a, b) => a.ref.localeCompare(b.ref));
393
+
394
+ return {
395
+ ok: unknownRefs.size === 0 && missingDependencies.length === 0 && unreviewedRefs.length === 0,
396
+ unknownRefs: Array.from(unknownRefs).sort(),
397
+ missingDependencies,
398
+ unreviewedRefs: unreviewedRefs.sort(),
399
+ };
400
+ }
401
+
402
+ // Disk-reading wrapper — this is what `domain-knowledge-validate.js --check-scope` and rp-mapper's
403
+ // review gate should call, passing only the plan's own selected scope. See computeScopeCheck for
404
+ // the pure algorithm and why each failure category exists.
405
+ function checkScope(domainsDir, selectedRefs) {
406
+ return computeScopeCheck(new Set(listAllEntityRefs(domainsDir)), buildDependsOnGraph(domainsDir), selectedRefs);
407
+ }
408
+
409
+ // The live backlog: every entity that has never had dependsOn authored at all (field
410
+ // absent, not merely empty). Non-blocking by design — this is a report, not a validation error.
411
+ // `node domain-knowledge-validate.js --list-missing-deps` is the intended way to read it, so the
412
+ // backlog never drifts out of sync with a hand-maintained list the way a markdown table would.
413
+ function listMissingDependsOn(domainsDir) {
414
+ const missing = [];
415
+ for (const domain of listDomainDirs(domainsDir)) {
416
+ for (const fileName of listEntityFiles(path.join(domainsDir, domain))) {
417
+ const entityId = fileName.replace(/\.json$/, '');
418
+ const entity = loadEntity(domainsDir, domain, entityId);
419
+ if (entity.dependsOn === undefined) missing.push(`${domain}/${entityId}`);
420
+ }
421
+ }
422
+ return missing.sort();
423
+ }
424
+
425
+ // Every domain with entities carries a docs survey in which every
426
+ // docs-menu surface is triaged, and its native entities cite their object
427
+ // page. The backfill completed 2026-08-11, so a missing survey is an error.
428
+ function validateDocsSurvey(domainsDir, domain, domainJson, errors) {
429
+ const surveyPath = path.join(domainsDir, domain, 'docs-survey.json');
430
+ const hasEntities = listEntityFiles(path.join(domainsDir, domain)).length > 0;
431
+ if (!fs.existsSync(surveyPath)) {
432
+ if (hasEntities) errors.push(`${domain}: missing docs-survey.json; run docs-survey-sync.js ${domain} and triage`);
433
+ return;
434
+ }
435
+
436
+ const label = `${domain}/docs-survey.json`;
437
+ const survey = readJson(surveyPath);
438
+ requireFields(survey, ['schemaVersion', 'domain', 'fetchedAt', 'roots', 'surfaces'], label, errors);
439
+ if (survey.schemaVersion !== 1) errors.push(`${label}: schemaVersion must be 1`);
440
+ if (survey.domain !== domain) errors.push(`${label}: domain must match directory`);
441
+
442
+ const declaredRoots = JSON.stringify([...(domainJson.docsRoots || [])].sort());
443
+ const surveyRoots = JSON.stringify([...(survey.roots || [])].sort());
444
+ if (declaredRoots !== surveyRoots) {
445
+ errors.push(`${label}: roots must match ${domain}/domain.json docsRoots; re-run docs-survey-sync.js ${domain}`);
446
+ }
447
+
448
+ for (const surface of survey.surfaces || []) {
449
+ const surfaceLabel = `${label}: ${surface.id || '<missing id>'}`;
450
+ requireFields(surface, ['id', 'title', 'url', 'verdict'], surfaceLabel, errors);
451
+ if (surface.removed) {
452
+ errors.push(`${surfaceLabel}: surface no longer in the docs menu; delete the entry or revisit the facts that cited it`);
453
+ continue;
454
+ }
455
+ if (!SURVEY_VERDICTS.has(surface.verdict)) {
456
+ errors.push(`${surfaceLabel}: invalid verdict ${surface.verdict}`);
457
+ continue;
458
+ }
459
+ if (surface.verdict === 'unreviewed') {
460
+ errors.push(`${surfaceLabel}: unreviewed surface; triage it (claimed / not-importable / not-relevant / gap)`);
461
+ continue;
462
+ }
463
+ if (!surface.reviewedOn) errors.push(`${surfaceLabel}: triaged surface must carry reviewedOn`);
464
+ if (surface.verdict === 'claimed') {
465
+ if (!Array.isArray(surface.refs) || surface.refs.length === 0) {
466
+ errors.push(`${surfaceLabel}: claimed surface must list refs[]`);
467
+ } else {
468
+ for (const ref of surface.refs) {
469
+ const [refDomain, refEntity] = String(ref).split('/');
470
+ if (!refDomain || !refEntity || !fs.existsSync(path.join(domainsDir, refDomain, 'entities', `${refEntity}.json`))) {
471
+ errors.push(`${surfaceLabel}: claimed ref ${ref} does not resolve to an entity file`);
472
+ }
473
+ }
474
+ }
475
+ }
476
+ if ((surface.verdict === 'not-importable' || surface.verdict === 'not-relevant') && !surface.reason) {
477
+ errors.push(`${surfaceLabel}: ${surface.verdict} requires a reason`);
478
+ }
479
+ if (surface.verdict === 'gap' && (!surface.reason || !surface.tracking)) {
480
+ errors.push(`${surfaceLabel}: gap requires reason and tracking`);
481
+ }
482
+ }
483
+
484
+ for (const fileName of listEntityFiles(path.join(domainsDir, domain))) {
485
+ const entityId = fileName.replace(/\.json$/, '');
486
+ const entity = loadEntity(domainsDir, domain, entityId);
487
+ if (!NATIVE_CLASSIFICATIONS.has(entity.target && entity.target.classification)) continue;
488
+ const citesObjectPage = (entity.evidence || []).some(
489
+ (item) => typeof item.url === 'string' && /-object$/.test(item.url.replace(/\.md$/, ''))
490
+ );
491
+ // A surface with no …-object reference page (e.g. Comments, which has no
492
+ // REST reference at all) declares objectPageException with the reason —
493
+ // explicit and greppable, never silent.
494
+ const hasException = typeof entity.objectPageException === 'string' && entity.objectPageException.length > 0;
495
+ if (!citesObjectPage && !hasException) {
496
+ errors.push(`${domain}/entities/${fileName}: native target must cite its docs object page (…-object URL) in evidence[], or declare objectPageException with a reason`);
497
+ }
498
+ }
499
+ }
500
+
174
501
  function requireFields(value, fields, label, errors) {
175
502
  for (const field of fields) {
176
503
  if (value[field] === undefined) errors.push(`${label}: missing required field ${field}`);
@@ -197,10 +524,79 @@ function validateEntity(entity, domain, entityId, label, errors) {
197
524
  for (const alias of entity.sourceAliases || []) {
198
525
  if (!alias.sourceSystem || !alias.sourceEntity) errors.push(`${label}: sourceAliases entries must include sourceSystem and sourceEntity`);
199
526
  }
527
+ if (entity.target && entity.target.classification === 'manual-mapping') {
528
+ validateManualMapping(entity, label, errors);
529
+ } else if (entity.manualSteps !== undefined) {
530
+ errors.push(`${label}: manualSteps is only allowed when target.classification is manual-mapping`);
531
+ }
200
532
  validateSafeModeContactFields(entity.safeModeContactFields, label, errors);
533
+ validateBlockedSourceDependencies(entity, label, errors);
201
534
  validateEvidence(entity.evidence || [], label, errors);
202
535
  }
203
536
 
537
+ function validateBlockedSourceDependencies(entity, label, errors) {
538
+ if (entity.blockedSourceDependencies === undefined) return;
539
+ if (!Array.isArray(entity.blockedSourceDependencies)) {
540
+ errors.push(`${label}: blockedSourceDependencies must be an array when present`);
541
+ return;
542
+ }
543
+ const pitfallCodes = new Set((entity.pitfalls || []).map((pitfall) => pitfall.code));
544
+ const seen = new Set();
545
+ entity.blockedSourceDependencies.forEach((dependency, index) => {
546
+ const dependencyLabel = `${label}: blockedSourceDependencies[${index}]`;
547
+ if (!dependency || typeof dependency !== 'object' || Array.isArray(dependency)) {
548
+ errors.push(`${dependencyLabel} must be an object`);
549
+ return;
550
+ }
551
+ for (const field of ['sourceEntityRef', 'degradedField', 'pitfallCode', 'degradation']) {
552
+ if (!dependency[field] || typeof dependency[field] !== 'string') errors.push(`${dependencyLabel}.${field} must be a non-empty string`);
553
+ }
554
+ if (dependency.sourceEntityRef && !/^plugin\.[^.]+\.[^.]+$/.test(dependency.sourceEntityRef)) {
555
+ errors.push(`${dependencyLabel}.sourceEntityRef must use plugin.<slug>.<entity>`);
556
+ }
557
+ if (dependency.pitfallCode && !pitfallCodes.has(dependency.pitfallCode)) {
558
+ errors.push(`${dependencyLabel}.pitfallCode ${dependency.pitfallCode} does not resolve in this entity's pitfalls[]`);
559
+ }
560
+ if (dependency.degradation && !BLOCKED_DEPENDENCY_DEGRADATIONS.has(dependency.degradation)) {
561
+ errors.push(`${dependencyLabel}.degradation must be warning or deferred`);
562
+ }
563
+ const key = `${dependency.sourceEntityRef}:${dependency.degradedField}`;
564
+ if (seen.has(key)) errors.push(`${dependencyLabel} duplicates ${key}`);
565
+ seen.add(key);
566
+ });
567
+ }
568
+
569
+ // For manual-mapping: a manual-mapping entity performs no write, so its preferredWrite must
570
+ // be structurally inert (nothing for import codegen to accidentally call), and its manualSteps
571
+ // must actually contain a runbook — an empty or missing one would render nothing to the
572
+ // merchant, which is worse than not classifying it manual-mapping at all.
573
+ function validateManualMapping(entity, label, errors) {
574
+ const pw = entity.preferredWrite || {};
575
+ if (pw.endpoint !== null) errors.push(`${label}: manual-mapping requires preferredWrite.endpoint === null`);
576
+ if (pw.writerId !== null) errors.push(`${label}: manual-mapping requires preferredWrite.writerId === null`);
577
+ if (pw.verification !== 'none') errors.push(`${label}: manual-mapping requires preferredWrite.verification === 'none'`);
578
+ if (pw.importSafe !== false) errors.push(`${label}: manual-mapping requires preferredWrite.importSafe === false`);
579
+ if (pw.bulk !== false) errors.push(`${label}: manual-mapping requires preferredWrite.bulk === false`);
580
+
581
+ const manualSteps = entity.manualSteps;
582
+ if (!manualSteps || typeof manualSteps !== 'object') {
583
+ errors.push(`${label}: manual-mapping requires a manualSteps object`);
584
+ return;
585
+ }
586
+ if (!Array.isArray(manualSteps.steps) || manualSteps.steps.length === 0) {
587
+ errors.push(`${label}: manualSteps.steps must be a non-empty array`);
588
+ return;
589
+ }
590
+ manualSteps.steps.forEach((step, index) => {
591
+ if (!step || !MANUAL_STEP_ACTORS.has(step.actor)) {
592
+ errors.push(`${label}: manualSteps.steps[${index}].actor must be one of ${Array.from(MANUAL_STEP_ACTORS).join(', ')}`);
593
+ }
594
+ if (!step || typeof step.text !== 'string' || step.text.trim() === '') {
595
+ errors.push(`${label}: manualSteps.steps[${index}].text must be a non-empty string`);
596
+ }
597
+ });
598
+ }
599
+
204
600
  function validateSafeModeContactFields(fields, label, errors) {
205
601
  if (fields === undefined) return;
206
602
  if (!Array.isArray(fields)) {
@@ -351,6 +747,15 @@ function listFlagged(domainsDir, flag) {
351
747
  });
352
748
  }
353
749
 
750
+ // Lazily required: domain-knowledge is loaded by tooling that has no need for the schema library,
751
+ // and a hard dependency at module load is how one domain file breaks everything (learned the hard
752
+ // way when a generic library loaded an eCommerce entity at init).
753
+ function stampSetupRequirement(requirement) {
754
+ if (!requirement || requirement.kind !== 'extendedFieldSchema') return requirement;
755
+ // eslint-disable-next-line global-require
756
+ return require('./data-extension-schema.js').stampRequirement(requirement);
757
+ }
758
+
354
759
  function summarizeEntities(domainsDir, refs, { includeEvidence = false } = {}) {
355
760
  return refs.map((ref) => {
356
761
  const entity = readEntityByRef(domainsDir, ref);
@@ -362,18 +767,64 @@ function summarizeEntities(domainsDir, refs, { includeEvidence = false } = {}) {
362
767
  reliability: entity.reliability,
363
768
  pitfalls: entity.pitfalls,
364
769
  mappingGuidance: entity.mappingGuidance,
365
- setupRequirements: entity.setupRequirements || [],
770
+ // Stamped HERE, at the producer the shipped path actually uses. The stamp used to live only
771
+ // on a domain adapter that setup discovery never calls, so the real chain emitted unstamped
772
+ // requirements and every invoice write was refused by a guard that was working correctly.
773
+ setupRequirements: (entity.setupRequirements || []).map(stampSetupRequirement),
366
774
  fieldContracts: entity.fieldContracts || [],
775
+ blockedSourceDependencies: entity.blockedSourceDependencies || [],
776
+ extendedFields: entity.extendedFields || null,
367
777
  };
368
778
  if (includeEvidence) summary.evidence = entity.evidence;
369
779
  return summary;
370
780
  });
371
781
  }
372
782
 
783
+ // Compact cross-adapter view consumed by the WordPress plugin knowledge base so plugin
784
+ // profiles can be validated against real Wix target refs and capability claims without
785
+ // each adapter re-reading the other's tree.
786
+ function knowledgeSummary(domainsDir) {
787
+ const index = loadIndex(domainsDir);
788
+ const knownRefs = new Set();
789
+ const verificationByRef = new Map();
790
+ // manual-mapping entities only — lets classifyCoverage tell a manual-mapping
791
+ // target apart from a real write target using only this compact summary, with no need to
792
+ // re-read the full rp-target-wix entity tree from the WordPress side.
793
+ const manualStepsByRef = new Map();
794
+ const blockedSourceDependenciesByRef = new Map();
795
+ for (const [domain, domainEntry] of Object.entries(index.domains || {})) {
796
+ for (const entityId of Object.keys(domainEntry.entities || {})) {
797
+ const ref = `${domain}/${entityId}`;
798
+ knownRefs.add(ref);
799
+ const entity = loadEntity(domainsDir, domain, entityId);
800
+ verificationByRef.set(ref, entity.preferredWrite && entity.preferredWrite.verification);
801
+ if (entity.target && entity.target.classification === 'manual-mapping' && entity.manualSteps) {
802
+ manualStepsByRef.set(ref, entity.manualSteps);
803
+ }
804
+ if (Array.isArray(entity.blockedSourceDependencies) && entity.blockedSourceDependencies.length > 0) {
805
+ blockedSourceDependenciesByRef.set(ref, entity.blockedSourceDependencies);
806
+ }
807
+ }
808
+ }
809
+ const capabilityRefs = new Map(Object.entries(index.capabilityIndex || {}));
810
+ return { knownRefs, capabilityRefs, verificationByRef, manualStepsByRef, blockedSourceDependenciesByRef };
811
+ }
812
+
373
813
  module.exports = {
374
814
  knowledgeRoot,
375
815
  generateIndex,
816
+ knowledgeSummary,
376
817
  validateKnowledge,
818
+ validateDependsOnPromotion,
819
+ validateDependsOn,
820
+ validateEntity,
821
+ validateBlockedSourceDependencies,
822
+ buildDependsOnGraph,
823
+ findCycle,
824
+ listAllEntityRefs,
825
+ computeScopeCheck,
826
+ checkScope,
827
+ listMissingDependsOn,
377
828
  writeJson,
378
829
  listDomains,
379
830
  listEntities,
@@ -0,0 +1,119 @@
1
+ 'use strict';
2
+
3
+ const { isBlank } = require('./value-utils.js');
4
+
5
+ // rp-target-wix — balance-reconciliation REPORTING, not a write path.
6
+ //
7
+ // Wix's gift-cards API has no balance-increase/credit method (the "no-credit-API
8
+ // finding": create, send-email, query/search, disable, find-by-email, redeem, void — nothing that
9
+ // raises a balance). The only correction for a card already created wrong is disable-and-replace,
10
+ // a code change that alters the customer-facing code and needs its own human sign-off (see
11
+ // gift-cards/gift-card.json's pitfalls) — never a silent balance patch. This module therefore only
12
+ // ever REPORTS drift; it never proposes "replay the difference," which is exactly the
13
+ // double-decrement risk that is ruled out (a card must never be built by
14
+ // gift-card-build.js twice under different balance policies).
15
+ //
16
+ // BLOCKED on input: `sourceBalance` below is meant to come from
17
+ // the bridge plugin, which is code-only and not yet installed/live-tested on any real
18
+ // site. This module is ready to consume that data the moment it exists.
19
+
20
+ function normalizeMoney(value) {
21
+ if (isBlank(value)) return null;
22
+ const numeric = Number(value);
23
+ if (!Number.isFinite(numeric)) return null;
24
+ return Math.round(numeric * 100) / 100;
25
+ }
26
+
27
+ // One card's reconciliation row. `policy` records which balance policy the card was
28
+ // CREATED under — required, because the correct verdict for an identical mismatch differs by
29
+ // policy: under Policy A (face value, no replay) an overstatement is the known, accepted
30
+ // consequence of that choice; the same mismatch under Policy B (verified balance at creation) or
31
+ // Policy C (face value, then corrected by replaying real order-linked redemptions — see
32
+ // gift-card-redemption-build.js) means the card was born wrong, or its replay is incomplete/wrong,
33
+ // and needs investigation, not passive acceptance. Policy C is included here alongside B, not
34
+ // given its own "in-progress replay" leniency: a reconciliation check is the caller's to run only
35
+ // once replay is believed complete, not this module's to guess at.
36
+ function buildBalanceReconciliationRow({ sourceNumber, policy, sourceBalance, wixBalance } = {}) {
37
+ if (isBlank(sourceNumber)) {
38
+ return {
39
+ sourceNumber: sourceNumber == null ? null : sourceNumber,
40
+ ok: false,
41
+ gap: { code: 'missing-source-number', summary: 'sourceNumber is required to report a reconciliation row against.' },
42
+ };
43
+ }
44
+ if (policy !== 'A' && policy !== 'B' && policy !== 'C') {
45
+ return {
46
+ sourceNumber,
47
+ ok: false,
48
+ gap: { code: 'invalid-policy', summary: `policy must be "A", "B", or "C" — got ${JSON.stringify(policy)}.` },
49
+ };
50
+ }
51
+
52
+ const source = normalizeMoney(sourceBalance);
53
+ if (source === null) {
54
+ return {
55
+ sourceNumber,
56
+ ok: false,
57
+ gap: { code: 'unavailable-source-balance', summary: `no verified current balance available for card ${sourceNumber} from the bridge plugin — report this card as unreconciled rather than assuming it matches.` },
58
+ };
59
+ }
60
+ const wix = normalizeMoney(wixBalance);
61
+ if (wix === null) {
62
+ return {
63
+ sourceNumber,
64
+ ok: false,
65
+ gap: { code: 'unavailable-wix-balance', summary: `no Wix balance available for card ${sourceNumber} — read it back via Get Gift Card before reconciling.` },
66
+ };
67
+ }
68
+
69
+ const drift = Math.round((wix - source) * 100) / 100;
70
+ if (drift === 0) {
71
+ return { sourceNumber, ok: true, policy, sourceBalance: source, wixBalance: wix, drift: 0, verdict: 'matches', action: 'none' };
72
+ }
73
+
74
+ if (policy === 'A' && drift > 0) {
75
+ return {
76
+ sourceNumber,
77
+ ok: false,
78
+ policy,
79
+ sourceBalance: source,
80
+ wixBalance: wix,
81
+ drift,
82
+ verdict: 'expected-overstatement',
83
+ action: 'disable-and-replace-or-accept',
84
+ summary: `card ${sourceNumber} shows ${wix} in Wix but ${source} at the source — the known, accepted overstatement of Policy A (face value at creation, no replay). Correcting it requires disabling and replacing the card (no balance-credit API exists), which changes the customer-facing code and needs its own human sign-off.`,
85
+ };
86
+ }
87
+
88
+ // Any other direction/policy combination is not a shape any policy's documented behavior
89
+ // produces on its own (e.g. Policy A showing a Wix balance BELOW the source, or any mismatch at
90
+ // all under Policy B/C) — a real anomaly, not something to explain away.
91
+ return {
92
+ sourceNumber,
93
+ ok: false,
94
+ policy,
95
+ sourceBalance: source,
96
+ wixBalance: wix,
97
+ drift,
98
+ verdict: 'unexpected-drift',
99
+ action: 'investigate',
100
+ summary: `card ${sourceNumber} shows ${wix} in Wix vs ${source} at the source (drift ${drift}) under Policy ${policy} — not a shape any policy's documented behavior explains; investigate before accepting or correcting it.`,
101
+ };
102
+ }
103
+
104
+ function buildBalanceReconciliationReport(cards) {
105
+ const rows = (cards || []).map((card) => buildBalanceReconciliationRow(card));
106
+ const mismatches = rows.filter((row) => !row.ok);
107
+ return {
108
+ totalCards: rows.length,
109
+ matched: rows.length - mismatches.length,
110
+ mismatches,
111
+ rows,
112
+ };
113
+ }
114
+
115
+ module.exports = {
116
+ normalizeMoney,
117
+ buildBalanceReconciliationRow,
118
+ buildBalanceReconciliationReport,
119
+ };