@wix/agent-skills 1.33.0 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (635) hide show
  1. package/README.md +23 -0
  2. package/package.json +2 -2
  3. package/skills/wix-app/references/DASHBOARD_PAGE.md +1 -1
  4. package/skills/wix-export/SKILL.md +83 -0
  5. package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
  6. package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
  7. package/skills/wix-harmony-editor/SKILL.md +317 -0
  8. package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
  9. package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
  10. package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
  11. package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
  12. package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
  13. package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
  14. package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
  15. package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
  16. package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
  17. package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
  18. package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
  19. package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
  20. package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
  21. package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
  22. package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
  23. package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
  24. package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
  25. package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
  26. package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
  27. package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
  28. package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
  29. package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
  30. package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
  31. package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
  32. package/skills/wix-headless/SKILL.md +7 -2
  33. package/skills/wix-headless/references/CAPABILITIES.md +6 -1
  34. package/skills/wix-headless/references/DISCOVERY.md +2 -1
  35. package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
  36. package/skills/wix-headless/references/SEED.md +3 -2
  37. package/skills/wix-headless/references/SETUP.md +1 -0
  38. package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
  39. package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
  40. package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
  41. package/skills/wix-headless/references/managed/CREATE.md +1 -1
  42. package/skills/wix-headless-kit/SKILL.md +110 -21
  43. package/skills/wix-headless-kit/guides/api-run.md +15 -13
  44. package/skills/wix-headless-kit/guides/existing-site.md +31 -0
  45. package/skills/wix-headless-kit/guides/migration.md +49 -17
  46. package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
  47. package/skills/wix-headless-kit/install/context.mjs +61 -6
  48. package/skills/wix-headless-kit/install/pins.json +1 -1
  49. package/skills/wix-headless-kit/install/setup.mjs +107 -12
  50. package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
  51. package/skills/wix-headless-replatform/SKILL.md +116 -0
  52. package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
  53. package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
  54. package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
  55. package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
  56. package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
  57. package/skills/wix-headless-replatform/references/output-contract.md +93 -0
  58. package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
  59. package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
  60. package/skills/wix-headless-replatform/references/safety.md +19 -0
  61. package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
  62. package/skills/wix-headless-replatform/references/workflow.md +157 -0
  63. package/skills/wix-headless-replatform/registry/README.md +20 -0
  64. package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
  65. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
  66. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
  67. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
  68. package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
  69. package/skills/wix-headless-replatform/registry/registry.json +36 -0
  70. package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
  71. package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
  72. package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
  73. package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
  74. package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
  75. package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
  76. package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
  77. package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
  78. package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
  79. package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
  80. package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
  81. package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
  82. package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
  83. package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
  84. package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
  85. package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
  86. package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
  87. package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
  88. package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
  89. package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
  90. package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
  91. package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
  92. package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
  93. package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
  94. package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
  95. package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
  96. package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
  97. package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
  98. package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
  99. package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
  100. package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
  101. package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
  102. package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
  103. package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
  104. package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
  105. package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
  106. package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
  107. package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
  108. package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
  109. package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
  110. package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
  111. package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
  112. package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
  113. package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
  114. package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
  115. package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
  116. package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
  117. package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
  118. package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
  119. package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
  120. package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
  121. package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
  122. package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
  123. package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
  124. package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
  125. package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
  126. package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
  127. package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
  128. package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
  129. package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
  130. package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
  131. package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
  132. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
  133. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
  134. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
  135. package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
  136. package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
  137. package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
  138. package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
  139. package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
  140. package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
  141. package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
  142. package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
  143. package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
  144. package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
  145. package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
  146. package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
  147. package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
  148. package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
  149. package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
  150. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
  151. package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
  152. package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
  153. package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
  154. package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
  155. package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
  156. package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
  157. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
  158. package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
  159. package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
  160. package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
  161. package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
  162. package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
  163. package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
  164. package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
  165. package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
  166. package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
  167. package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
  168. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
  169. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
  170. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
  171. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
  172. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
  173. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
  174. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
  175. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
  176. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
  177. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
  178. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
  179. package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
  180. package/skills/wix-import/SKILL.md +90 -0
  181. package/skills/wix-manage/SKILL.md +38 -10
  182. package/skills/wix-manage/references/automations/actions.md +11 -11
  183. package/skills/wix-manage/references/automations/activation-status.md +6 -9
  184. package/skills/wix-manage/references/automations/api-catalog.md +48 -32
  185. package/skills/wix-manage/references/automations/automation-model.md +97 -22
  186. package/skills/wix-manage/references/automations/bracket-expressions.md +7 -7
  187. package/skills/wix-manage/references/automations/build-and-manage-automations.md +140 -309
  188. package/skills/wix-manage/references/automations/conditions.md +187 -0
  189. package/skills/wix-manage/references/automations/schemas-and-scheduling.md +191 -0
  190. package/skills/wix-manage/references/automations/special-actions.md +210 -0
  191. package/skills/wix-manage/references/automations/triggers.md +47 -10
  192. package/skills/wix-manage/references/automations/validation-and-verification.md +320 -0
  193. package/skills/wix-manage/references/custom-apps/use-app-tools.md +124 -0
  194. package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
  195. package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
  196. package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
  197. package/skills/wix-manage/references/events/create-wix-event.md +136 -73
  198. package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
  199. package/skills/wix-manage/references/events/manage-event-guests.md +366 -0
  200. package/skills/wix-manage/references/events/manage-event-tickets.md +293 -0
  201. package/skills/wix-manage/references/events/manage-wix-events.md +313 -55
  202. package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
  203. package/skills/wix-manage/references/sites/upload-static-site.md +127 -8
  204. package/skills/wix-manage/references/stores/update-product-with-options.md +58 -2
  205. package/skills/wix-replatform/.publish-manifest.json +5 -5
  206. package/skills/wix-replatform/CLI.md +162 -0
  207. package/skills/wix-replatform/README.md +52 -0
  208. package/skills/wix-replatform/SKILL.md +229 -684
  209. package/skills/wix-replatform/console/account.css +1 -0
  210. package/skills/wix-replatform/console/app.css +1 -0
  211. package/skills/wix-replatform/console/app.js +117 -0
  212. package/skills/wix-replatform/console/index.html +4 -0
  213. package/skills/wix-replatform/console/json.css +11 -0
  214. package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
  215. package/skills/wix-replatform/lib/app-page-routing.js +75 -0
  216. package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
  217. package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
  218. package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
  219. package/skills/wix-replatform/lib/completion-report.js +1393 -13
  220. package/skills/wix-replatform/lib/config-env.js +85 -11
  221. package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
  222. package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
  223. package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
  224. package/skills/wix-replatform/lib/destination-choice.js +163 -0
  225. package/skills/wix-replatform/lib/destination-handoff.js +62 -0
  226. package/skills/wix-replatform/lib/destination-http.js +81 -0
  227. package/skills/wix-replatform/lib/destination-route.js +98 -0
  228. package/skills/wix-replatform/lib/destination.js +919 -0
  229. package/skills/wix-replatform/lib/discovered-census.js +231 -0
  230. package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
  231. package/skills/wix-replatform/lib/document-url-guard.js +203 -0
  232. package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
  233. package/skills/wix-replatform/lib/entity-verification.js +18 -0
  234. package/skills/wix-replatform/lib/execution-capability.js +120 -0
  235. package/skills/wix-replatform/lib/execution-log.js +170 -0
  236. package/skills/wix-replatform/lib/execution-manifest.js +20 -2
  237. package/skills/wix-replatform/lib/execution-state.js +22 -0
  238. package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
  239. package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
  240. package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
  241. package/skills/wix-replatform/lib/import-recovery.js +800 -6
  242. package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
  243. package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
  244. package/skills/wix-replatform/lib/link-audit.js +173 -0
  245. package/skills/wix-replatform/lib/link-census.js +194 -0
  246. package/skills/wix-replatform/lib/link-plan.js +148 -0
  247. package/skills/wix-replatform/lib/link-verification.js +274 -0
  248. package/skills/wix-replatform/lib/link-write-journal.js +42 -0
  249. package/skills/wix-replatform/lib/local-state.js +869 -30
  250. package/skills/wix-replatform/lib/member-completion.js +658 -0
  251. package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
  252. package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
  253. package/skills/wix-replatform/lib/migration-completion.js +311 -0
  254. package/skills/wix-replatform/lib/operator-identity.js +47 -0
  255. package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
  256. package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
  257. package/skills/wix-replatform/lib/orchestration-router.js +608 -32
  258. package/skills/wix-replatform/lib/orchestration-state.js +188 -12
  259. package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
  260. package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
  261. package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
  262. package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
  263. package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
  264. package/skills/wix-replatform/lib/progress-log.js +19 -3
  265. package/skills/wix-replatform/lib/read-back-approval.js +184 -0
  266. package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
  267. package/skills/wix-replatform/lib/read-back-contract.js +243 -0
  268. package/skills/wix-replatform/lib/read-back-extract.js +118 -0
  269. package/skills/wix-replatform/lib/read-back-gate.js +734 -0
  270. package/skills/wix-replatform/lib/read-back-reads.js +94 -0
  271. package/skills/wix-replatform/lib/read-back-state.js +107 -0
  272. package/skills/wix-replatform/lib/read-back-summary.js +81 -0
  273. package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
  274. package/skills/wix-replatform/lib/run-controller.js +401 -0
  275. package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
  276. package/skills/wix-replatform/lib/setup-verification.js +148 -0
  277. package/skills/wix-replatform/lib/source-access.js +231 -0
  278. package/skills/wix-replatform/lib/source-coverage.js +1130 -0
  279. package/skills/wix-replatform/lib/source-secrets.js +277 -0
  280. package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
  281. package/skills/wix-replatform/lib/task-state.js +110 -0
  282. package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
  283. package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
  284. package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
  285. package/skills/wix-replatform/lib/url-verification.js +315 -0
  286. package/skills/wix-replatform/lib/user-action-effects.js +42 -0
  287. package/skills/wix-replatform/lib/user-actions.js +264 -0
  288. package/skills/wix-replatform/lib/website-handoff.js +1220 -0
  289. package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
  290. package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
  291. package/skills/wix-replatform/lib/write-verification-state.js +92 -0
  292. package/skills/wix-replatform/lib/write-verification.js +274 -0
  293. package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
  294. package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
  295. package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
  296. package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
  297. package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
  298. package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
  299. package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
  300. package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
  301. package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
  302. package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
  303. package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
  304. package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
  305. package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
  306. package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
  307. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
  308. package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
  309. package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
  310. package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
  311. package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
  312. package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
  313. package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
  314. package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
  315. package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
  316. package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
  317. package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
  318. package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
  319. package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
  320. package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
  321. package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
  322. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
  323. package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
  324. package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
  325. package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
  326. package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
  327. package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
  328. package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
  329. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
  330. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
  331. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
  332. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
  333. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
  334. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
  335. package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
  336. package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
  337. package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
  338. package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
  339. package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
  340. package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
  341. package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
  342. package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
  343. package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
  344. package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
  345. package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
  346. package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
  347. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
  348. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
  349. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
  350. package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
  351. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
  352. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
  353. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
  354. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
  355. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
  356. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
  357. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
  358. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
  359. package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
  360. package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
  361. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
  362. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
  363. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
  364. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
  365. package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
  366. package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
  367. package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
  368. package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
  369. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
  370. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
  371. package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
  372. package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
  373. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
  374. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
  375. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
  376. package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
  377. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
  378. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
  379. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
  380. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
  381. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
  382. package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
  383. package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
  384. package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
  385. package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
  386. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
  387. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
  388. package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
  389. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
  390. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
  391. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
  392. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
  393. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
  394. package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
  395. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
  396. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
  397. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
  398. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
  399. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
  400. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
  401. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
  402. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
  403. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
  404. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
  405. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
  406. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
  407. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
  408. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
  409. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
  410. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
  411. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
  412. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
  413. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
  414. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
  415. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
  416. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
  417. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
  418. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
  419. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
  420. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
  421. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
  422. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
  423. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
  424. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
  425. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
  426. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
  427. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
  428. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
  429. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
  430. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
  431. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
  432. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
  433. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
  434. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
  435. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
  436. package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
  437. package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
  438. package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
  439. package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
  440. package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
  441. package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
  442. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
  443. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
  444. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
  445. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
  446. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
  447. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
  448. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
  449. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
  450. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
  451. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
  452. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
  453. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
  454. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
  455. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
  456. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
  457. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
  458. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
  459. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
  460. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
  461. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
  462. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
  463. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
  464. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
  465. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
  466. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
  467. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
  468. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
  469. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
  470. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
  471. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
  472. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
  473. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
  474. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
  475. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
  476. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
  477. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
  478. package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
  479. package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
  480. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
  481. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
  482. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
  483. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
  484. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
  485. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
  486. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
  487. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
  488. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
  489. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
  490. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
  491. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
  492. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
  493. package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
  494. package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
  495. package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
  496. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
  497. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
  498. package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
  499. package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
  500. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
  501. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
  502. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
  503. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
  504. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
  505. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
  506. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
  507. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
  508. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
  509. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
  510. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
  511. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
  512. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
  513. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
  514. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
  515. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
  516. package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
  517. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
  518. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
  519. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
  520. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
  521. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
  522. package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
  523. package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
  524. package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
  525. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
  526. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
  527. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
  528. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
  529. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
  530. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
  531. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
  532. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
  533. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
  534. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
  535. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
  536. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
  537. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
  538. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
  539. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
  540. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
  541. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
  542. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
  543. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
  544. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
  545. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
  546. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
  547. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
  548. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
  549. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
  550. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
  551. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
  552. package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
  553. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
  554. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
  555. package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
  556. package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
  557. package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
  558. package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
  559. package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
  560. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
  561. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
  562. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
  563. package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
  564. package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
  565. package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
  566. package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
  567. package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
  568. package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
  569. package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
  570. package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
  571. package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
  572. package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
  573. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
  574. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
  575. package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
  576. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
  577. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
  578. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
  579. package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
  580. package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
  581. package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
  582. package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
  583. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
  584. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
  585. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
  586. package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
  587. package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
  588. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
  589. package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
  590. package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
  591. package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
  592. package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
  593. package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
  594. package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
  595. package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
  596. package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
  597. package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
  598. package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
  599. package/skills/wix-replatform/scripts/discovered-census.js +26 -0
  600. package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
  601. package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
  602. package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
  603. package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
  604. package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
  605. package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
  606. package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
  607. package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
  608. package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
  609. package/skills/wix-replatform/scripts/migration-completion.js +76 -0
  610. package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
  611. package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
  612. package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
  613. package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
  614. package/skills/wix-replatform/scripts/replatform-console.js +146 -0
  615. package/skills/wix-replatform/scripts/replatform.js +436 -0
  616. package/skills/wix-replatform/scripts/source-secrets.js +77 -0
  617. package/skills/wix-replatform/scripts/url-redirects.js +286 -0
  618. package/skills/wix-replatform/scripts/user-action.js +58 -0
  619. package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
  620. package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
  621. package/skills/wix-replatform/scripts/wix-destination.js +143 -0
  622. package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
  623. package/skills/wix-vibe-headless/SKILL.md +7 -3
  624. package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
  625. package/skills/wix-vibe-headless/platforms/base44.md +1 -0
  626. package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
  627. package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
  628. package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
  629. package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
  630. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
  631. package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
  632. package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
  633. package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
  634. package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +0 -208
  635. package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
@@ -0,0 +1,120 @@
1
+ 'use strict';
2
+
3
+ // Authority is object identity, never serialized fields or request metadata.
4
+ const fs = require('node:fs');
5
+ const path = require('node:path');
6
+ const crypto = require('node:crypto');
7
+ const registry = new WeakMap();
8
+ const clients = new WeakMap();
9
+ const projects = new Map();
10
+ const finishedRuns = new WeakMap();
11
+ let processMark;
12
+ const adapters = Object.freeze({
13
+ 'quick-woocommerce': '../resources/rp-quick-woocommerce/quick-mode.json',
14
+ 'quick-shopify': '../resources/rp-quick-shopify/quick-mode.json',
15
+ });
16
+ function fail(code) { throw Object.assign(new Error(code), { code }); }
17
+ function digest(bytes) { return crypto.createHash('sha256').update(bytes).digest('hex'); }
18
+ function read(projectDir, name) { return JSON.parse(fs.readFileSync(path.join(projectDir, name), 'utf8')); }
19
+ function readIfPresent(projectDir, name) { try { return read(projectDir, name); } catch (error) { if (error.code === 'ENOENT') return null; throw error; } }
20
+ function enter(mark) {
21
+ if (processMark && processMark !== mark) fail('CAPABILITY_MARK_CONFLICT');
22
+ processMark = mark;
23
+ }
24
+ function deepFreeze(value) { if (value && typeof value === 'object' && !Object.isFrozen(value)) { for (const child of Object.values(value)) deepFreeze(child); Object.freeze(value); } return value; }
25
+ function issue(kind, context, extra = {}) {
26
+ const capability = Object.freeze({ kind, siteId: context.siteId, runId: context.runId,
27
+ projectDir: context.projectDir, dryRun: context.dryRun, ...extra });
28
+ registry.set(capability, deepFreeze({ ...context, ...extra, kind }));
29
+ if (context.projectDir) projects.set(path.resolve(context.projectDir), capability);
30
+ return capability;
31
+ }
32
+ function context(input) {
33
+ if (!input || typeof input.siteId !== 'string' || !input.siteId.trim()) fail('CAPABILITY_SITE_REQUIRED');
34
+ if (!input.projectDir) fail('CAPABILITY_PROJECT_REQUIRED');
35
+ return { projectDir: path.resolve(input.projectDir), siteId: input.siteId,
36
+ runId: input.runId || crypto.randomUUID(), dryRun: input.dryRun === true };
37
+ }
38
+ function inspect(capability) { return registry.get(capability) || null; }
39
+ function requireKind(capability, kind) {
40
+ const value = inspect(capability);
41
+ if (!value || value.kind !== kind) fail('EXECUTION_CAPABILITY_REQUIRED');
42
+ return value;
43
+ }
44
+ function startSetupRun(input) {
45
+ const ctx = context(input);
46
+ const bytes = fs.readFileSync(path.join(ctx.projectDir, 'setup/setup-plan.json'));
47
+ const plan = JSON.parse(bytes);
48
+ if (!require('./setup-verification').validatePlanShape(plan).ok) fail('SETUP_PLAN_INVALID');
49
+ const importRefs = new Set((readIfPresent(ctx.projectDir, 'execution/execution-manifest.json')?.tasks || []).filter(task => task.kind === 'import').flatMap(task => task.entityRefs || []));
50
+ const forbidden = new Set(['ecom/order', 'stores/product', 'crm/contact', 'stores/coupon', 'gift-cards/gift-card', 'gift-cards/gift-card-product']);
51
+ for (const step of plan.steps) if ((step.entityRefs || []).some(ref => forbidden.has(ref) || importRefs.has(ref))) fail('SETUP_IMPORT_ENTITY_REFUSED');
52
+ enter('setup');
53
+ return issue('setup-run', { ...ctx, plan, planDigest: digest(bytes) });
54
+ }
55
+ function bindSetupStep(run, stepId) {
56
+ const ctx = requireKind(run, 'setup-run');
57
+ if (digest(fs.readFileSync(path.join(ctx.projectDir, 'setup/setup-plan.json'))) !== ctx.planDigest) fail('SETUP_PLAN_CHANGED');
58
+ const step = ctx.plan.steps.find(item => item.id === stepId);
59
+ if (!step) fail('SETUP_STEP_UNKNOWN');
60
+ return issue('setup-step', ctx, { stepId, step });
61
+ }
62
+ function validateQuickContract(contract) {
63
+ const ids = new Set((contract.entities || []).map(entity => entity.id));
64
+ if (ids.size !== contract.entities?.length) fail('quick_contract_invalid');
65
+ for (const entity of contract.entities) {
66
+ if ((entity.dependsOn || []).some(id => !ids.has(id))) fail(`quick_contract_dependency_external:${entity.id}`);
67
+ if (entity.auxiliaryTargets && (contract.id !== 'quick-shopify' || entity.id !== 'product' ||
68
+ JSON.stringify(entity.auxiliaryTargets) !== JSON.stringify(['stores/product-tag', 'stores/inventory-item']))) fail('quick_contract_auxiliary_invalid');
69
+ }
70
+ return contract;
71
+ }
72
+ function startQuickRun(input) {
73
+ if (!input || input.contract || !Object.hasOwn(adapters, input.adapterId)) fail('QUICK_ADAPTER_UNREGISTERED');
74
+ const ctx = context(input);
75
+ const contract = validateQuickContract(JSON.parse(fs.readFileSync(path.resolve(__dirname, adapters[input.adapterId]), 'utf8')));
76
+ enter('quick');
77
+ const run = issue('quick-run', { ...ctx, adapterId: input.adapterId, contract });
78
+ finishedRuns.set(run, new Set()); return run;
79
+ }
80
+ function bindQuickEntity(run, entityId) {
81
+ const ctx = requireKind(run, 'quick-run');
82
+ const entity = ctx.contract.entities.find(row => row.id === entityId);
83
+ if (!entity) fail('CAPABILITY_ENTITY_MISMATCH');
84
+ if (entity.dependsOn.some(id => !finishedRuns.get(run).has(id))) fail('QUICK_DEPENDENCY_NOT_FINISHED');
85
+ return issue('quick-entity', ctx, { entityId, target: entity.target, auxiliaryTargets: entity.auxiliaryTargets || [] });
86
+ }
87
+ function finishQuickEntity(run, entityId) {
88
+ const ctx = requireKind(run, 'quick-run');
89
+ if (!ctx.contract.entities.some(row => row.id === entityId)) fail('CAPABILITY_ENTITY_MISMATCH');
90
+ finishedRuns.get(run).add(entityId);
91
+ }
92
+ function bindQuickSetup(run, operation) {
93
+ const ctx = requireKind(run, 'quick-run');
94
+ if (!(ctx.contract.setupOperations || []).includes(operation)) fail('CAPABILITY_ENTITY_MISMATCH');
95
+ return issue('quick-setup', ctx, { operation });
96
+ }
97
+ function startDevProbe({ siteId, confirmation, dryRun = false } = {}) {
98
+ if (confirmation !== 'i-own-this-site') fail('DEV_PROBE_CONFIRMATION_REQUIRED');
99
+ if (typeof siteId !== 'string' || !siteId.trim()) fail('CAPABILITY_SITE_REQUIRED');
100
+ enter('probe');
101
+ return issue('dev-probe', { siteId, runId: crypto.randomUUID(), dryRun: dryRun === true });
102
+ }
103
+ function startImportRun(input) {
104
+ const ctx = context(input);
105
+ const inputs = require('./dependency-readiness').validateImportInputs(ctx.projectDir);
106
+ enter('import');
107
+ return issue('import-run', { ...ctx, ...inputs });
108
+ }
109
+ function bindTask({ runCapability, taskId }) {
110
+ const ctx = requireKind(runCapability, 'import-run');
111
+ const task = ctx.manifest.tasks.find(row => row.id === taskId && row.kind === 'import');
112
+ if (!task) fail('DEPENDENCY_TASK_MISMATCH');
113
+ return issue('import-task', ctx, { taskId, task });
114
+ }
115
+ function registerClient(client, capability) { clients.set(client, inspect(capability)); }
116
+ function clientContext(client) { return clients.get(client) || null; }
117
+ function projectContext(projectDir) { return inspect(projects.get(path.resolve(projectDir))); }
118
+ module.exports = { startSetupRun, bindSetupStep, startQuickRun, bindQuickEntity, finishQuickEntity,
119
+ bindQuickSetup, startDevProbe, startImportRun, bindTask, inspect, requireKind, fail, digest,
120
+ registerClient, clientContext, projectContext, validateQuickContract };
@@ -0,0 +1,170 @@
1
+ 'use strict';
2
+
3
+ // The writer for `execution-log.md`. Three rules hold this file together, and every one of them is load-bearing:
4
+ //
5
+ // 1. APPEND-ONLY. A resumed or recovery pass adds entries; it never truncates or regenerates
6
+ // the file. A chronology that a later pass can rewrite is not a chronology.
7
+ // 2. PER-ENTRY runId. Every entry carries the run that wrote it, so a second pass's entries are
8
+ // distinguishable from the first pass's without inferring anything from timestamps.
9
+ // 3. NON-AUTHORITATIVE. `execution/completion-report.json` is the final outcome and
10
+ // `execution/review/completion-summary.md` is rendered from that report. Nothing here is a
11
+ // count anyone may read back. This module therefore exposes no aggregation helper at all --
12
+ // the cheapest way to keep a derived count out of shipped code is to ship no way to derive
13
+ // one.
14
+ //
15
+ // This is NOT a heartbeat. `lib/progress-log.js` writes liveness to a caller-supplied path, which
16
+ // in practice may be a temp file outside the project; that contract is unchanged.
17
+ // `appendExecutionLog` always writes inside the project directory.
18
+
19
+ const fs = require('node:fs/promises');
20
+ const path = require('node:path');
21
+
22
+ const EXECUTION_LOG_FILE = 'execution-log.md';
23
+
24
+ const HEADER = [
25
+ '# Execution Log',
26
+ '',
27
+ 'Chronology of this migration run: what ran, in what order, and where the run stopped or',
28
+ 'resumed. Append-only -- later passes add lines, never rewrite them.',
29
+ '',
30
+ '**Not authoritative for counts.** The final outcome is',
31
+ '`execution/completion-report.json`; the human-readable account is',
32
+ '`execution/review/completion-summary.md`, rendered from that report. Never read a final',
33
+ 'number out of this file.',
34
+ '',
35
+ ].join('\n');
36
+
37
+ const ENTRY_FIELDS = new Set(['at', 'runId', 'phase', 'event', 'detail', 'artifacts']);
38
+
39
+ // A handoff, a summary and this log all get attached to pull requests and pasted into chat. The
40
+ // same confidentiality rule applies to all three: counts, ids, reason codes and artifact paths --
41
+ // never record values. An email address is the one record value that reliably survives a careless
42
+ // template (`imported customer ${record.email}`), so it is rejected outright rather than trusted
43
+ // to reviewer discipline.
44
+ const EMAIL_SHAPED = /[\w.+-]+@[\w-]+\.[\w.-]+/;
45
+
46
+ function requireString(value, field) {
47
+ if (!value || typeof value !== 'string') {
48
+ throw new Error(`execution log entry ${field} must be a non-empty string`);
49
+ }
50
+ return value;
51
+ }
52
+
53
+ function assertNoRecordValues(value, field) {
54
+ if (EMAIL_SHAPED.test(value)) {
55
+ throw new Error(
56
+ `execution log entry ${field} looks like it carries a record value (email address); `
57
+ + 'the execution log records counts, ids, reason codes and artifact paths only',
58
+ );
59
+ }
60
+ return value;
61
+ }
62
+
63
+ function executionLogPath(projectDir) {
64
+ return path.join(projectDir, EXECUTION_LOG_FILE);
65
+ }
66
+
67
+ function normalizeExecutionLogEntry(input = {}) {
68
+ if (!input || typeof input !== 'object' || Array.isArray(input)) {
69
+ throw new Error('execution log entry must be an object');
70
+ }
71
+ for (const key of Object.keys(input)) {
72
+ if (!ENTRY_FIELDS.has(key)) {
73
+ throw new Error(`unknown execution log entry field: ${key}`);
74
+ }
75
+ }
76
+ const runId = requireString(input.runId, 'runId');
77
+ const phase = requireString(input.phase, 'phase');
78
+ const event = requireString(input.event, 'event');
79
+ const detail = assertNoRecordValues(requireString(input.detail, 'detail'), 'detail');
80
+ const at = input.at === undefined || input.at === null ? new Date().toISOString() : requireString(input.at, 'at');
81
+ const artifacts = input.artifacts === undefined || input.artifacts === null ? [] : input.artifacts;
82
+ if (!Array.isArray(artifacts)) {
83
+ throw new Error('execution log entry artifacts must be an array');
84
+ }
85
+ return {
86
+ at,
87
+ runId,
88
+ phase,
89
+ event,
90
+ detail,
91
+ artifacts: artifacts.map((artifact, index) => assertNoRecordValues(
92
+ requireString(artifact, `artifacts[${index}]`),
93
+ `artifacts[${index}]`,
94
+ )),
95
+ };
96
+ }
97
+
98
+ function renderExecutionLogEntry(entry) {
99
+ const artifacts = entry.artifacts.length ? ` | artifacts: ${entry.artifacts.join(', ')}` : '';
100
+ return `- ${entry.at} | run ${entry.runId} | ${entry.phase} | ${entry.event} | ${entry.detail}${artifacts}`;
101
+ }
102
+
103
+ async function pathExists(filePath) {
104
+ try {
105
+ await fs.stat(filePath);
106
+ return true;
107
+ } catch (error) {
108
+ if (error && error.code === 'ENOENT') return false;
109
+ throw error;
110
+ }
111
+ }
112
+
113
+ // `fs.appendFile` rather than read-modify-write: there is no code path here that can truncate the
114
+ // file, not even a crash between the read and the write.
115
+ async function appendExecutionLog(projectDir, entry) {
116
+ const normalized = normalizeExecutionLogEntry(entry);
117
+ const filePath = executionLogPath(projectDir);
118
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
119
+ const existed = await pathExists(filePath);
120
+ const line = renderExecutionLogEntry(normalized);
121
+ await fs.appendFile(filePath, existed ? `${line}\n` : `${HEADER}${line}\n`, 'utf8');
122
+ return { path: EXECUTION_LOG_FILE, entry: normalized, line, createdFile: !existed };
123
+ }
124
+
125
+ async function executionLogExists(projectDir) {
126
+ return pathExists(executionLogPath(projectDir));
127
+ }
128
+
129
+ // Reads entries back for orchestration and tests -- for "did this event happen, and in what
130
+ // order", never for a count. Deliberately returns rows, not totals.
131
+ async function readExecutionLogEntries(projectDir) {
132
+ const filePath = executionLogPath(projectDir);
133
+ let text;
134
+ try {
135
+ text = await fs.readFile(filePath, 'utf8');
136
+ } catch (error) {
137
+ if (error && error.code === 'ENOENT') return { exists: false, entries: [] };
138
+ throw error;
139
+ }
140
+ const entries = [];
141
+ for (const rawLine of text.split('\n')) {
142
+ if (!rawLine.startsWith('- ')) continue;
143
+ const parts = rawLine.slice(2).split(' | ');
144
+ if (parts.length < 5) continue;
145
+ const [at, runField, phase, event, ...rest] = parts;
146
+ if (!runField.startsWith('run ')) continue;
147
+ const artifactsPart = rest.length > 1 && rest[rest.length - 1].startsWith('artifacts: ')
148
+ ? rest.pop().slice('artifacts: '.length)
149
+ : null;
150
+ entries.push({
151
+ at,
152
+ runId: runField.slice('run '.length),
153
+ phase,
154
+ event,
155
+ detail: rest.join(' | '),
156
+ artifacts: artifactsPart ? artifactsPart.split(', ') : [],
157
+ });
158
+ }
159
+ return { exists: true, entries };
160
+ }
161
+
162
+ module.exports = {
163
+ EXECUTION_LOG_FILE,
164
+ executionLogPath,
165
+ normalizeExecutionLogEntry,
166
+ renderExecutionLogEntry,
167
+ appendExecutionLog,
168
+ executionLogExists,
169
+ readExecutionLogEntries,
170
+ };
@@ -13,9 +13,10 @@ const URL_PRESERVATION_PATHS = [
13
13
  'unresolvedPath',
14
14
  ];
15
15
 
16
- function createManifest({ projectId, planVersion, tasks = [], generatedArtifacts = [], llmHandoff = null, timestamp = new Date().toISOString() }) {
16
+ function createManifest({ projectId, planVersion, tasks = [], generatedArtifacts = [], llmHandoff = null, timestamp = new Date().toISOString(), mappingPlanDigest }) {
17
17
  return {
18
18
  schemaVersion: SCHEMA_VERSION,
19
+ ...(mappingPlanDigest ? { mappingPlanDigest } : {}),
19
20
  projectId,
20
21
  planVersion,
21
22
  generatedAt: timestamp,
@@ -25,7 +26,7 @@ function createManifest({ projectId, planVersion, tasks = [], generatedArtifacts
25
26
  };
26
27
  }
27
28
 
28
- function validateManifest(manifest) {
29
+ function validateManifest(manifest, producerInputs = null) {
29
30
  const errors = [];
30
31
  if (!manifest || typeof manifest !== 'object') {
31
32
  errors.push('manifest must be an object');
@@ -74,12 +75,28 @@ function validateManifest(manifest) {
74
75
  validateUrlPreservation(task, errors);
75
76
  if (task.kind === 'import') {
76
77
  validateImportTaskState(task, errors);
78
+ if (!Array.isArray(task.entityRefs) || !task.entityRefs.length || new Set(task.entityRefs).size !== task.entityRefs.length) errors.push(`task.entityRefs required:${task.id}`);
79
+ if (!Array.isArray(task.dependencyEdges)) errors.push(`dependency_edges_required:${task.id}`);
80
+ if (!Array.isArray(task.dependencyRefs)) errors.push(`dependency_refs_required:${task.id}`);
81
+ if (!/^[a-f0-9]{64}$/.test(manifest.mappingPlanDigest || '')) errors.push('mapping_plan_digest_required');
77
82
  }
78
83
  }
79
84
  }
85
+ if (producerInputs && Array.isArray(manifest.tasks)) { const binding = require('./dependency-readiness').bindDependencyProducers({ manifest, ...producerInputs }); errors.push(...binding.errors); }
80
86
  return { ok: errors.length === 0, errors };
81
87
  }
82
88
 
89
+ async function validateManifestForProject(projectDir) {
90
+ const fs = require('node:fs/promises'), path = require('node:path');
91
+ const readiness = require('./dependency-readiness');
92
+ const manifest = JSON.parse(await fs.readFile(path.join(projectDir, 'execution/execution-manifest.json'), 'utf8'));
93
+ const setupPlan = JSON.parse(await fs.readFile(path.join(projectDir, 'setup/setup-plan.json'), 'utf8'));
94
+ const adapter = await readiness.loadDependencyDispositions(projectDir);
95
+ const validation = validateManifest(manifest, { setupPlan, dispositions: adapter.dispositions });
96
+ try { readiness.validateImportInputs(projectDir); } catch (error) { validation.errors.push(error.message); validation.ok = false; }
97
+ return validation;
98
+ }
99
+
83
100
  function validateUrlPreservation(task, errors) {
84
101
  if (task.urlPreservation === undefined) {
85
102
  return;
@@ -181,5 +198,6 @@ module.exports = {
181
198
  SCHEMA_VERSION,
182
199
  createManifest,
183
200
  validateManifest,
201
+ validateManifestForProject,
184
202
  nextPendingTask,
185
203
  };
@@ -28,6 +28,26 @@ function hasDownloadMirror(task) {
28
28
  return mirror.mode === 'download' || mirror.mode === 'download-and-upload' || mirror.downloadBeforeRun === true;
29
29
  }
30
30
 
31
+ // The POST-execution counterpart of hasDownloadMirror, and the
32
+ // gate the generated snapshot pass is run behind. Before this existed, `upload` and the upload
33
+ // half of `download-and-upload` were accepted by validateCmsMirror and reached no code path at
34
+ // all, so a mirror the owner asked for stayed empty by construction.
35
+ //
36
+ // `none` (and an absent cmsMirror) means NOTHING: no collection reads, no writes, and no empty
37
+ // pass reported as a success. Site storage is a shared, plan-based allowance, and a migration's
38
+ // ledger can be a meaningful fraction of a smaller plan's entire quota, so the mirror is spent
39
+ // only when the approved plan actually asked for it.
40
+ //
41
+ // Note this is deliberately NOT `!hasDownloadMirror`: `download` seeds before the run and
42
+ // uploads nothing afterwards, and `downloadBeforeRun` is a download-side flag only.
43
+ function hasUploadMirror(task) {
44
+ const mirror = task && task.state && task.state.cmsMirror;
45
+ if (!mirror || mirror.mode === 'none') {
46
+ return false;
47
+ }
48
+ return mirror.mode === 'upload' || mirror.mode === 'download-and-upload';
49
+ }
50
+
31
51
  function hasLocalCrosswalk(task) {
32
52
  return Boolean(task.state && task.state.crosswalkPath);
33
53
  }
@@ -170,4 +190,6 @@ async function prepareExecutionState(projectDir, manifest, options = {}) {
170
190
 
171
191
  module.exports = {
172
192
  prepareExecutionState,
193
+ hasDownloadMirror,
194
+ hasUploadMirror,
173
195
  };
@@ -0,0 +1,96 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs/promises');
4
+ const path = require('node:path');
5
+
6
+ const LEDGER_FILE = 'EXPECTATIONS.md';
7
+
8
+ const STARTER = `# Migration expectations
9
+
10
+ Use this file to record anything you expected the migration to do differently: a
11
+ surprising question, a mapping you expected, or an outcome that did not match your
12
+ intent. Write freely anywhere in this document.
13
+
14
+ You can also tell the agent: \`add to expectations: <your note>\`. It will preserve
15
+ your note and add safe references to the current migration context. Do not put passwords,
16
+ tokens, customer data, or other secrets here.
17
+ `;
18
+
19
+ function ledgerPath(projectDir) {
20
+ return path.join(path.resolve(projectDir), LEDGER_FILE);
21
+ }
22
+
23
+ async function ensureLedger(projectDir) {
24
+ const file = ledgerPath(projectDir);
25
+ await fs.mkdir(path.dirname(file), { recursive: true });
26
+ try {
27
+ await fs.writeFile(file, STARTER, { encoding: 'utf8', flag: 'wx' });
28
+ return { file, created: true };
29
+ } catch (error) {
30
+ if (error.code === 'EEXIST') return { file, created: false };
31
+ throw error;
32
+ }
33
+ }
34
+
35
+ function redactSensitiveText(value) {
36
+ return String(value || '')
37
+ .replace(/\b(bearer)\s+[A-Za-z0-9._~+/=-]{8,}/gi, '$1 [REDACTED]')
38
+ .replace(/\b(password|passwd|secret|token|api[-_ ]?key|authorization|cookie)\b\s*([:=])\s*[^\s,;]+/gi, '$1$2[REDACTED]');
39
+ }
40
+
41
+ function safeArtifactRef(projectDir, ref) {
42
+ if (!ref) return null;
43
+ const root = path.resolve(projectDir);
44
+ const candidate = path.resolve(root, ref);
45
+ const relative = path.relative(root, candidate);
46
+ if (relative.startsWith('..') || path.isAbsolute(relative)) return null;
47
+ return relative || '.';
48
+ }
49
+
50
+ function nextId(contents) {
51
+ const ids = [...contents.matchAll(/^##\s+E-(\d+)\b/gm)].map((match) => Number(match[1]));
52
+ return `E-${String((ids.length ? Math.max(...ids) : 0) + 1).padStart(3, '0')}`;
53
+ }
54
+
55
+ function formatContext(projectDir, context = {}) {
56
+ const lines = [];
57
+ for (const [label, value] of [
58
+ ['Stage', context.phase],
59
+ ['State', context.state],
60
+ ['Active resource', context.resource],
61
+ ['Source', context.source],
62
+ ['Target', context.target],
63
+ ['Decision or approval', context.decision],
64
+ ]) {
65
+ if (value) lines.push(`- ${label}: ${redactSensitiveText(value)}`);
66
+ }
67
+ for (const ref of context.artifactRefs || []) {
68
+ const safeRef = safeArtifactRef(projectDir, ref);
69
+ if (safeRef) lines.push(`- Artifact: \`${safeRef}\``);
70
+ }
71
+ return lines.length ? lines.join('\n') : '- No reliable run context was available when this was captured.';
72
+ }
73
+
74
+ async function appendExpectation(projectDir, expectation, context = {}, now = new Date()) {
75
+ if (!String(expectation || '').trim()) throw new Error('expectation is required');
76
+ const { file } = await ensureLedger(projectDir);
77
+ const contents = await fs.readFile(file, 'utf8');
78
+ const id = nextId(contents);
79
+ const original = String(expectation).trim();
80
+ const note = redactSensitiveText(original).trim();
81
+ const heading = note === original ? 'User expectation (verbatim)' : 'User expectation (sensitive values redacted)';
82
+ const entry = `\n## ${id} — ${now.toISOString()}\n\n### ${heading}\n\n${note}\n\n### Context captured by the agent\n\n${formatContext(projectDir, context)}\n`;
83
+ await fs.appendFile(file, entry, 'utf8');
84
+ return { file, id, redacted: note !== original };
85
+ }
86
+
87
+ module.exports = {
88
+ LEDGER_FILE,
89
+ STARTER,
90
+ ledgerPath,
91
+ ensureLedger,
92
+ redactSensitiveText,
93
+ safeArtifactRef,
94
+ nextId,
95
+ appendExpectation,
96
+ };
@@ -0,0 +1,140 @@
1
+ 'use strict';
2
+
3
+ // Exact generated wiring, not a JavaScript analyzer. Configuration comes from the
4
+ // canonical source/mapping artifacts, never from generated --describe output.
5
+ const fs = require('node:fs');
6
+ const path = require('node:path');
7
+ const crypto = require('node:crypto');
8
+ const VERSION = 1;
9
+ const FILES = ['src/import/plugin-handoff.js', 'src/import/run-import.js', 'src/extract/run-extract.js'];
10
+ const HELPERS = ['plugin-entity-read-plan.js', 'structure-bridge-reader.js', 'wix-wp-plugin-v2-client.js'];
11
+ const digest = (bytes) => crypto.createHash('sha256').update(bytes).digest('hex');
12
+ function canonicalEntities(projectDir) {
13
+ const read = (name) => fs.existsSync(path.join(projectDir, name)) ? JSON.parse(fs.readFileSync(path.join(projectDir, name), 'utf8')) : {};
14
+ const schema = read('source-schema.json');
15
+ const mapping = read('mapping/mapping-plan.json');
16
+ const rows = (value) => Array.isArray(value) ? value : Object.entries(value || {}).filter(([, row]) => row && typeof row === 'object').map(([key, row]) => ({ sourceEntityRef: key, ...row }));
17
+ const sources = rows(schema.entities);
18
+ const decisions = require('./website-handoff.js').readEntityMappings(mapping);
19
+ const referenceOf = (row) => row.sourceEntityRef || row.ref || row.entity || row.sourceEntity || row.entityKey || (typeof row.source === 'string' ? row.source : null);
20
+ const planned = new Set(decisions.filter((row) => row.targetRef && !['excluded', 'declined', 'pending', 'deferred', 'manual', 'blocked', 'unsupported'].includes(row.status))
21
+ .map((row) => referenceOf(row)));
22
+ const combined = new Map(sources.map((row) => [referenceOf(row), row]));
23
+ for (const decision of decisions) {
24
+ const key = referenceOf(decision);
25
+ if (!key) throw new Error('mapping entity lacks identity');
26
+ const source = combined.get(key) || {};
27
+ combined.set(key, { ...source, ...decision, sourceMeta: { ...decision.sourceMeta, ...source.sourceMeta } });
28
+ }
29
+ return [...combined].filter(([key]) => key).map(([key, row]) => ({
30
+ sourceEntityRef: key, sourceEntity: row.sourceEntity || row.entityKey || row.entity || (typeof row.source === 'string' ? row.source : key),
31
+ sourceType: row.sourceType || null,
32
+ sourceTypes: row.sourceTypes || null,
33
+ bridgeDesignated: Boolean(row.bridgeDesignated || row.sourceMeta?.extractionPlan || row.fulfillment?.kind === 'structure-bridge-plugin'),
34
+ sourceMeta: row.sourceMeta?.extractionPlan ? { extractionPlan: row.sourceMeta.extractionPlan } : {},
35
+ sourcePrerequisites: row.sourcePrerequisites || [],
36
+ importPlanned: planned.has(key),
37
+ })).sort((a, b) => a.sourceEntityRef.localeCompare(b.sourceEntityRef));
38
+ }
39
+ function templates(entities) {
40
+ const config = JSON.stringify({ version: VERSION, entities }, null, 2);
41
+ const wiring = `'use strict';\nconst runtime = require('../lib/plugin-entity-read-plan.js');\nconst config = ${config};\nmodule.exports = { config, run: (kind, projectDir, args) => runtime.runGeneratedPluginEntrypoint({ kind, projectDir, entities: config.entities }, args) };\n`;
42
+ const entry = (kind, directory) => `'use strict';\nconst path = require('node:path');\nconst handoff = require('${directory}plugin-handoff.js');\nhandoff.run('${kind}', path.resolve(__dirname, '../..'), process.argv.slice(2)).catch((error) => { console.error(error.message); process.exitCode = 1; });\n`;
43
+ return { [FILES[0]]: wiring, [FILES[1]]: entry('import', './'), [FILES[2]]: entry('extract', '../import/') };
44
+ }
45
+ function moduleSourceDir() { return path.resolve(__dirname, '../resources/rp-source-wordpress/lib'); }
46
+ function vendorSharedDependencies(projectDir) {
47
+ const visited = new Set();
48
+ function copy(file) {
49
+ if (visited.has(file)) return;
50
+ visited.add(file);
51
+ const source = fs.readFileSync(file, 'utf8');
52
+ const destination = noSymlinks(projectDir, `src/lib/${path.basename(file)}`);
53
+ fs.mkdirSync(path.dirname(destination), { recursive: true });
54
+ fs.copyFileSync(file, destination);
55
+ for (const match of source.matchAll(/require\(['"](.\/[^'"]+)['"]\)/g)) copy(require.resolve(path.resolve(path.dirname(file), match[1])));
56
+ }
57
+ copy(path.join(__dirname, 'import-recovery.js'));
58
+ copy(path.join(__dirname, 'import-readiness-contract.js'));
59
+ }
60
+ function noSymlinks(projectDir, relativePath) {
61
+ let cursor = path.resolve(projectDir);
62
+ for (const token of relativePath.split('/')) {
63
+ cursor = path.join(cursor, token);
64
+ if (fs.existsSync(cursor) && fs.lstatSync(cursor).isSymbolicLink()) throw new Error('generated handoff symlink refused');
65
+ }
66
+ return cursor;
67
+ }
68
+ function validateDispatchMapping(projectDir) {
69
+ const file = path.join(projectDir, 'mapping/mapping-plan.json');
70
+ const mapping = fs.existsSync(file) ? JSON.parse(fs.readFileSync(file, 'utf8')) : {};
71
+ const rows = require('./website-handoff.js').readEntityMappings(mapping);
72
+ for (const row of rows) {
73
+ if (!row.targetRef && !['excluded', 'declined', 'pending', 'deferred', 'manual', 'blocked', 'unsupported'].includes(row.status)) {
74
+ throw new Error('mapping targetRef is missing; normalize the declared legacy target before emitting dispatch, never drop its scope');
75
+ }
76
+ }
77
+ }
78
+ function emitPluginHandoff(projectDir) {
79
+ const entities = canonicalEntities(projectDir);
80
+ validateDispatchMapping(projectDir);
81
+ if (!entities.some((entity) => entity.bridgeDesignated)) throw new Error('no canonical bridge entities');
82
+ const emitted = templates(entities);
83
+ // Inspect every destination before any mutation. Existing project entrypoints must be
84
+ // deliberately adapted, never silently replaced by adding one bridge entity.
85
+ for (const [name, expected] of Object.entries(emitted)) {
86
+ const file = noSymlinks(projectDir, name);
87
+ if (!fs.existsSync(file)) continue;
88
+ const existing = fs.readFileSync(file, 'utf8');
89
+ let owned = existing === expected;
90
+ if (!owned && name === FILES[0]) {
91
+ try {
92
+ const match = existing.match(/const config = ([\s\S]*?);\nmodule.exports =/);
93
+ const config = JSON.parse(match[1]);
94
+ owned = config.version === VERSION && existing === templates(config.entities)[name];
95
+ } catch { /* Unrecognized wiring belongs to the project. */ }
96
+ }
97
+ if (!owned) throw new Error(`refusing to overwrite non-template entrypoint: ${name}; preserve its ordering, self-check, heartbeat and ledger in the project adapter before deliberately replacing it`);
98
+ }
99
+ for (const [name, text] of Object.entries(emitted)) {
100
+ const file = noSymlinks(projectDir, name);
101
+ fs.mkdirSync(path.dirname(file), { recursive: true });
102
+ fs.writeFileSync(file, text);
103
+ }
104
+ for (const helper of HELPERS) {
105
+ const file = noSymlinks(projectDir, `src/lib/${helper}`);
106
+ fs.mkdirSync(path.dirname(file), { recursive: true });
107
+ fs.copyFileSync(path.join(moduleSourceDir(), helper), file);
108
+ }
109
+ vendorSharedDependencies(projectDir);
110
+ return { version: VERSION, files: FILES };
111
+ }
112
+ function verifyPluginHandoff(projectDir, selection = {}) {
113
+ const entities = canonicalEntities(projectDir);
114
+ const selected = require(path.join(moduleSourceDir(), 'plugin-entity-read-plan.js')).selectPluginEntities(entities, selection);
115
+ const byRef = new Map(entities.map((entity) => [entity.sourceEntityRef, entity]));
116
+ const closure = new Map();
117
+ const visit = (entity, stack = new Set()) => {
118
+ if (stack.has(entity.sourceEntityRef)) throw new Error('cyclic source prerequisites');
119
+ if (closure.has(entity.sourceEntityRef)) return;
120
+ closure.set(entity.sourceEntityRef, entity);
121
+ for (const ref of entity.sourcePrerequisites) {
122
+ const source = byRef.get(ref);
123
+ if (!source) throw new Error('missing canonical source prerequisite');
124
+ visit(source, new Set([...stack, entity.sourceEntityRef]));
125
+ }
126
+ };
127
+ selected.forEach((entity) => visit(entity));
128
+ if (![...closure.values()].some((entity) => entity.bridgeDesignated)) return { applicable: false, entities: [] };
129
+ validateDispatchMapping(projectDir);
130
+ for (const [name, expected] of Object.entries(templates(entities))) {
131
+ const file = noSymlinks(projectDir, name);
132
+ if (!fs.existsSync(file) || fs.readFileSync(file, 'utf8') !== expected) throw new Error(`generated plugin handoff differs from committed template: ${name}`);
133
+ }
134
+ for (const helper of HELPERS) {
135
+ const file = noSymlinks(projectDir, `src/lib/${helper}`);
136
+ if (!fs.existsSync(file) || digest(fs.readFileSync(file)) !== digest(fs.readFileSync(path.join(moduleSourceDir(), helper)))) throw new Error(`changed vendored plugin helper: ${helper}`);
137
+ }
138
+ return { applicable: true, entities: [...closure.values()] };
139
+ }
140
+ module.exports = { VERSION, FILES, HELPERS, canonicalEntities, emitPluginHandoff, verifyPluginHandoff, templates };
@@ -0,0 +1,23 @@
1
+ 'use strict';
2
+ const fs = require('node:fs');
3
+ const path = require('node:path');
4
+ function files(root) {
5
+ if (!fs.existsSync(root)) return [];
6
+ return fs.readdirSync(root, { withFileTypes: true }).flatMap(entry => entry.isDirectory() ? files(path.join(root, entry.name)) : /\.[cm]?js$/.test(entry.name) ? [path.join(root, entry.name)] : []);
7
+ }
8
+ function verifyReadinessContract(projectDir, descriptor) {
9
+ const manifest = JSON.parse(fs.readFileSync(path.join(projectDir, 'execution/execution-manifest.json'), 'utf8'));
10
+ const expected = manifest.tasks.filter(task => task.kind === 'import').map(task => ({ taskId: task.id, edges: task.dependencyEdges.map(({ ref, mode }) => ({ ref, mode })).sort((a, b) => a.ref.localeCompare(b.ref)) })).sort((a, b) => a.taskId.localeCompare(b.taskId));
11
+ const reported = descriptor.dependencyReadiness?.tasks?.map(task => ({ taskId: task.taskId, edges: task.edges.map(({ ref, mode }) => ({ ref, mode })).sort((a, b) => a.ref.localeCompare(b.ref)) })).sort((a, b) => a.taskId.localeCompare(b.taskId));
12
+ const errors = [];
13
+ if (JSON.stringify(expected) !== JSON.stringify(reported)) errors.push('dependency_readiness_descriptor_mismatch');
14
+ for (const file of files(path.join(projectDir, 'src')).filter(file => !/^(?:lib|extract)[/\\]/.test(path.relative(path.join(projectDir, 'src'), file)))) {
15
+ const text = fs.readFileSync(file, 'utf8'), relative = path.relative(projectDir, file);
16
+ if (/\b(?:startSetupRun|bindSetupStep|startQuickRun|startDevProbe|createWixSetupExecutor)\b|execution-capability(?:\.js)?/.test(text)) errors.push(`execution_capability_bypass:${relative}`);
17
+ // Vendored shared libraries live outside the generated transform directory. Generated
18
+ // transforms must obtain references through gate-owned resolvers, not read local evidence.
19
+ if (/crosswalk|loadCrosswalk|readEntityCrosswalk|local-state|data[\\/]source-extract/.test(text) && !/(?:^|\/)run-import\.[cm]?js$/.test(relative)) errors.push(`dependency_reference_bypass:${relative}`);
20
+ }
21
+ return { ok: errors.length === 0, errors };
22
+ }
23
+ module.exports = { verifyReadinessContract, files };