@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,762 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ const { spawn } = require('node:child_process');
5
+ const fs = require('node:fs/promises');
6
+ const path = require('node:path');
7
+ const { readEnvFile, upsertEnvFile, statEnvKeys } = require('../lib/config-env.js');
8
+
9
+ function usage() {
10
+ return [
11
+ 'Usage:',
12
+ ' node scripts/wix-headless-scaffold.js --business-name <name> [--folder-name frontend] [--site-template commerce] [--project-dir <dir>]',
13
+ '',
14
+ 'Runs the Wix headless scaffold non-interactively through npm create.',
15
+ 'Idempotent: safe to re-invoke against the same project — adopts an',
16
+ 'existing destination receipt instead of re-scaffolding, and never spawns a second',
17
+ 'site when config/wix.env or frontend/wix.config.json already name one.',
18
+ ].join('\n');
19
+ }
20
+
21
+ function parseArgs(argv) {
22
+ const args = {
23
+ folderName: 'frontend',
24
+ siteTemplate: 'blank',
25
+ projectDir: process.cwd(),
26
+ };
27
+ for (let i = 0; i < argv.length; i += 1) {
28
+ const token = argv[i];
29
+ switch (token) {
30
+ case '--business-name':
31
+ args.businessName = argv[i + 1];
32
+ i += 1;
33
+ break;
34
+ case '--folder-name':
35
+ args.folderName = argv[i + 1];
36
+ i += 1;
37
+ break;
38
+ case '--site-template':
39
+ args.siteTemplate = argv[i + 1];
40
+ i += 1;
41
+ break;
42
+ case '--project-dir':
43
+ args.projectDir = argv[i + 1];
44
+ i += 1;
45
+ break;
46
+ case '--help':
47
+ case '-h':
48
+ args.help = true;
49
+ break;
50
+ default:
51
+ throw new Error(`Unknown argument: ${token}`);
52
+ }
53
+ }
54
+ return args;
55
+ }
56
+
57
+ async function readWixConfig(frontendDir) {
58
+ try {
59
+ const raw = await fs.readFile(path.join(frontendDir, 'wix.config.json'), 'utf8');
60
+ const parsed = JSON.parse(raw);
61
+ if (parsed && typeof parsed.siteId === 'string' && parsed.siteId.trim() !== '') {
62
+ return parsed;
63
+ }
64
+ return null;
65
+ } catch (error) {
66
+ if (error && (error.code === 'ENOENT' || error instanceof SyntaxError)) {
67
+ return null;
68
+ }
69
+ throw error;
70
+ }
71
+ }
72
+
73
+ async function readWixEnvValues(wixEnvPath) {
74
+ try {
75
+ return await readEnvFile(wixEnvPath);
76
+ } catch (error) {
77
+ if (error && error.code === 'ENOENT') {
78
+ return {};
79
+ }
80
+ throw error;
81
+ }
82
+ }
83
+
84
+ async function isNonEmptyDir(dir) {
85
+ try {
86
+ const entries = await fs.readdir(dir);
87
+ return entries.length > 0;
88
+ } catch (error) {
89
+ if (error && error.code === 'ENOENT') {
90
+ return false;
91
+ }
92
+ throw error;
93
+ }
94
+ }
95
+
96
+ async function defaultSpawnScaffold(args) {
97
+ return new Promise((resolve, reject) => {
98
+ const child = spawn('npm', [
99
+ '--yes',
100
+ 'create',
101
+ '@wix/new@latest',
102
+ '--',
103
+ 'headless',
104
+ '--business-name',
105
+ args.businessName,
106
+ '--folder-name',
107
+ args.folderName,
108
+ '--site-template',
109
+ args.siteTemplate,
110
+ '--skip-install',
111
+ ], {
112
+ cwd: path.resolve(args.projectDir),
113
+ stdio: 'inherit',
114
+ });
115
+ child.on('error', reject);
116
+ child.on('exit', (code, signal) => {
117
+ resolve({ code: signal ? 1 : (code == null ? 1 : code) });
118
+ });
119
+ });
120
+ }
121
+
122
+ // Removes WIX_SCAFFOLD_STATUS entirely (not just blanking its value, which config-env.js's
123
+ // upsertEnvFile cannot do and which would itself read back as a present-but-unrecognized
124
+ // value) — used only when a spawn-launch failure proves nothing could have been created,
125
+ // so the next invocation sees a genuinely untouched config/wix.env, not a lingering marker.
126
+ async function clearWixScaffoldStatus(wixEnvPath) {
127
+ let raw;
128
+ try {
129
+ raw = await fs.readFile(wixEnvPath, 'utf8');
130
+ } catch (error) {
131
+ if (error && error.code === 'ENOENT') {
132
+ return;
133
+ }
134
+ throw error;
135
+ }
136
+ const hadTrailingNewline = /\r?\n$/.test(raw);
137
+ const lines = raw.split(/\r?\n/);
138
+ if (hadTrailingNewline && lines[lines.length - 1] === '') {
139
+ lines.pop();
140
+ }
141
+ const kept = lines.filter((line) => {
142
+ const trimmed = line.trim();
143
+ if (!trimmed || trimmed.startsWith('#')) {
144
+ return true;
145
+ }
146
+ const idx = line.indexOf('=');
147
+ return idx === -1 || line.slice(0, idx).trim() !== 'WIX_SCAFFOLD_STATUS';
148
+ });
149
+ const out = kept.join('\n');
150
+ await fs.writeFile(wixEnvPath, out === '' ? '' : `${out}\n`, 'utf8');
151
+ }
152
+
153
+ // Persists WIX_SITE_ID from a confirmed receipt, re-checking for a conflict immediately
154
+ // before the write (config/wix.env can change between the top-of-invocation read and now).
155
+ // Uses statEnvKeys' placeholder-aware classification for the conflict check —
156
+ // comparing the raw value directly treated a template placeholder
157
+ // (e.g. WIX_SITE_ID=REPLACE_WITH_REAL_VALUE) as a real, conflicting destination, which
158
+ // made this throw instead of persisting on the very first scaffold of a freshly
159
+ // templated project, silently discarding the receipt this function exists to confirm.
160
+ async function persistSiteId(wixEnvPath, siteId, scaffoldStatus) {
161
+ const currentStatus = (await statEnvKeys(wixEnvPath, ['WIX_SITE_ID'])).keys.WIX_SITE_ID;
162
+ if (currentStatus === 'present') {
163
+ const current = await readWixEnvValues(wixEnvPath);
164
+ if (current.WIX_SITE_ID !== siteId) {
165
+ throw new Error(
166
+ `config/wix.env's WIX_SITE_ID (${current.WIX_SITE_ID}) no longer matches the scaffold's own wix.config.json (${siteId}); refusing to overwrite a different destination.`,
167
+ );
168
+ }
169
+ }
170
+ await upsertEnvFile(wixEnvPath, { WIX_SITE_ID: siteId, WIX_SCAFFOLD_STATUS: scaffoldStatus });
171
+ }
172
+
173
+ // A locally-run `npm run dev` (or equivalent) against a scaffolded
174
+ // `website`-mode project, driven from a Wix Remote Machine by any
175
+ // LLM-based coding client (Claude Code or otherwise), hits two problems
176
+ // that are properties of the PROJECT, not of any one client or run:
177
+ //
178
+ // 1. `@wix/astro`'s auto-injected middleware validates an env schema
179
+ // (WIX_CLIENT_INSTANCE_ID etc.) that only lives in gitignored
180
+ // `.env.local` — wiped whenever the remote machine environment
181
+ // restarts, so the next `npm run dev` throws "MiddlewareCantBeLoaded"
182
+ // until `.env.local` is manually regenerated via `wix env pull`. Fixed
183
+ // durably by making the project re-pull it itself before every
184
+ // dev/build/release, rather than assuming it survives a restart.
185
+ // 2. The dev server's own Vite config needs `server.allowedHosts` (a
186
+ // LEADING-DOT suffix, e.g. ".remote-machine.wix-code.com" — never a
187
+ // literal full hostname, which changes on every fresh remote-machine
188
+ // instance and would go stale the moment it's committed) and
189
+ // `server.host: true` (bind all interfaces) — without the latter, a
190
+ // reverse proxy in front of the dev server can't reach it, surfacing as
191
+ // an unexplained 504.
192
+ //
193
+ // Both are properties of the scaffolded PROJECT (checkpointed, reused
194
+ // across every future local run), not of any one invocation — so they're
195
+ // applied once, right after a destination is confirmed (see main()), not
196
+ // re-derived by hand every time this happens.
197
+ const REMOTE_MACHINE_HOST_SUFFIX = '.remote-machine.wix-code.com';
198
+ const ENV_PULL_HOOK_SCRIPTS = {
199
+ predev: 'wix env pull',
200
+ prebuild: 'wix env pull',
201
+ prerelease: 'wix env pull',
202
+ };
203
+
204
+ // Same-length "search text" with every comment and string/template literal
205
+ // blanked out (non-newline characters replaced with spaces) — so none of
206
+ // the structural scanning below can mistake a `{`/`}` or a `vite`/`server`-
207
+ // shaped substring living inside a comment or string for real object
208
+ // structure. A REAL failure this caught before shipping: `// vite: {}`
209
+ // (a commented-out key, sitting elsewhere in the same object) was matched
210
+ // as if it were live, and injecting a multiline block right after its `{`
211
+ // terminated the `//` comment at the injected text's own leading newline,
212
+ // turning a perfectly valid file into one with a syntax error. Positions
213
+ // in the returned text line up EXACTLY with the input (only content is
214
+ // replaced, never length), so any offset found via the masked text is
215
+ // valid for slicing the ORIGINAL text — every call site below uses the
216
+ // masked text purely to decide WHERE things are, never to read what they
217
+ // actually say. The filler is a non-whitespace character (not a space):
218
+ // a value-span scan's trailing `\s*` must stop at the real edge of a
219
+ // masked string/comment rather than reading straight through it as if it
220
+ // were legitimate padding.
221
+ function maskCommentsAndStrings(text) {
222
+ let out = '';
223
+ let i = 0;
224
+ const n = text.length;
225
+ while (i < n) {
226
+ const ch = text[i];
227
+ const next = text[i + 1];
228
+ if (ch === '/' && next === '/') {
229
+ const start = i;
230
+ while (i < n && text[i] !== '\n') i += 1;
231
+ out += text.slice(start, i).replace(/[^\n]/g, 'x');
232
+ continue;
233
+ }
234
+ if (ch === '/' && next === '*') {
235
+ const start = i;
236
+ i += 2;
237
+ while (i < n && !(text[i] === '*' && text[i + 1] === '/')) i += 1;
238
+ i = Math.min(i + 2, n);
239
+ out += text.slice(start, i).replace(/[^\n]/g, 'x');
240
+ continue;
241
+ }
242
+ if (ch === "'" || ch === '"' || ch === '`') {
243
+ // Template literals are blanked out WHOLESALE, `${...}` interpolation
244
+ // included — this script has no reason to understand one, only to
245
+ // never mistake its contents for real object structure elsewhere.
246
+ // EXCEPTION: a quoted OBJECT KEY (`"vite": {...}`) must survive
247
+ // masking untouched — it's the very thing keyName lookups need to
248
+ // find — so anything immediately followed by `:` (the only shape a
249
+ // quoted key ever takes here) is left as-is instead of blanked.
250
+ const quote = ch;
251
+ const start = i;
252
+ i += 1;
253
+ while (i < n && text[i] !== quote) {
254
+ if (text[i] === '\\') i += 1; // skip an escaped character, e.g. \' or \\
255
+ i += 1;
256
+ }
257
+ i = Math.min(i + 1, n);
258
+ let j = i;
259
+ while (j < n && /\s/.test(text[j])) j += 1;
260
+ if (text[j] === ':') {
261
+ out += text.slice(start, i);
262
+ } else {
263
+ out += text.slice(start, i).replace(/[^\n]/g, 'x');
264
+ }
265
+ continue;
266
+ }
267
+ out += ch;
268
+ i += 1;
269
+ }
270
+ return out;
271
+ }
272
+
273
+ // Finds the index of the `}` that closes the `{` at openBraceIndex, by
274
+ // brace-depth counting rather than a full parse. Callers pass the MASKED
275
+ // text (see maskCommentsAndStrings) so a `{`/`}` inside a comment or
276
+ // string is never miscounted as real structure; every call site below
277
+ // only acts when it found a real, load-bearing structural brace via a
278
+ // preceding regex match, and returns -1 (skip, never guess) on anything
279
+ // unbalanced.
280
+ function findMatchingBrace(text, openBraceIndex) {
281
+ let depth = 0;
282
+ for (let i = openBraceIndex; i < text.length; i += 1) {
283
+ if (text[i] === '{') depth += 1;
284
+ else if (text[i] === '}') {
285
+ depth -= 1;
286
+ if (depth === 0) return i;
287
+ }
288
+ }
289
+ return -1;
290
+ }
291
+
292
+ // Matches keyName EXACTLY — as a bare identifier with no adjoining
293
+ // identifier/hyphen characters on either side, or as a fully quoted
294
+ // key whose entire quoted content is keyName (same quote character on
295
+ // both ends, via the backreference). A plain `["']?\bkeyName["']?` (what
296
+ // this replaced) only checks for a quote immediately around keyName, so
297
+ // it isn't anchored to the KEY'S own boundaries: "legacy-vite": {...} has
298
+ // a real word boundary right before "vite" (a hyphen is a non-word
299
+ // character) and no quote is required there since it's optional, so it
300
+ // matched as though the key were "vite". Requiring an EXACT bare match or
301
+ // an exact quoted match rules that out.
302
+ function exactKeyPattern(keyName) {
303
+ return `(?:(['"])${keyName}\\1|(?<![\\w$-])${keyName}(?![\\w$-]))`;
304
+ }
305
+
306
+ // Finds `keyName: {` (or the quoted form, `"keyName": {`/`'keyName': {'})
307
+ // as a DIRECT child of the object spanning parentOpen..parentClose
308
+ // (brace-DEPTH 1 relative to parentOpen) — never a same-named key nested
309
+ // deeper (e.g. inside a plugin call's own options object), which a plain
310
+ // "search anywhere in this span" regex would wrongly match and then
311
+ // corrupt. `text` must be the MASKED text (maskCommentsAndStrings), not
312
+ // the original source — this only ever returns POSITIONS, valid against
313
+ // either text since masking preserves length.
314
+ function findDirectChildBrace(text, parentOpen, parentClose, keyName) {
315
+ const pattern = new RegExp(`${exactKeyPattern(keyName)}\\s*:\\s*\\{`, 'g');
316
+ pattern.lastIndex = parentOpen + 1;
317
+ let match;
318
+ while ((match = pattern.exec(text)) !== null) {
319
+ if (match.index >= parentClose) return -1;
320
+ let depth = 0;
321
+ for (let i = parentOpen; i < match.index; i += 1) {
322
+ if (text[i] === '{') depth += 1;
323
+ else if (text[i] === '}') depth -= 1;
324
+ }
325
+ if (depth === 1) return match.index + match[0].length - 1;
326
+ }
327
+ return -1;
328
+ }
329
+
330
+ // Finds `keyName: <value>` (or the quoted key form) as a DIRECT child of
331
+ // the object spanning parentOpen..parentClose and returns { start, end }
332
+ // bounding <value>'s own source text, or 'ambiguous' if a value was found
333
+ // but its extent can't be safely bounded (an odd bracket run), or null if
334
+ // the key isn't a direct child at all. A bracketed value ([...]/{...}/
335
+ // (...)) is bounded by matching brackets; anything else runs to the next
336
+ // same-depth comma or the parent's own closing brace. `text` must be the
337
+ // MASKED text — this only ever returns POSITIONS; callers read the actual
338
+ // value text back out of the ORIGINAL source at those same positions.
339
+ function findDirectChildValueSpan(text, parentOpen, parentClose, keyName) {
340
+ const pattern = new RegExp(`${exactKeyPattern(keyName)}\\s*:\\s*`, 'g');
341
+ pattern.lastIndex = parentOpen + 1;
342
+ let match;
343
+ while ((match = pattern.exec(text)) !== null) {
344
+ if (match.index >= parentClose) return null;
345
+ let depth = 0;
346
+ for (let i = parentOpen; i < match.index; i += 1) {
347
+ if (text[i] === '{') depth += 1;
348
+ else if (text[i] === '}') depth -= 1;
349
+ }
350
+ if (depth !== 1) continue; // a same-named key nested deeper — keep looking
351
+ const valueStart = match.index + match[0].length;
352
+ const openChar = text[valueStart];
353
+ if (openChar === '[' || openChar === '{' || openChar === '(') {
354
+ const closeChar = openChar === '[' ? ']' : openChar === '{' ? '}' : ')';
355
+ let bracketDepth = 0;
356
+ for (let i = valueStart; i < parentClose; i += 1) {
357
+ if (text[i] === openChar) bracketDepth += 1;
358
+ else if (text[i] === closeChar) {
359
+ bracketDepth -= 1;
360
+ if (bracketDepth === 0) return { start: valueStart, end: i + 1 };
361
+ }
362
+ }
363
+ return 'ambiguous';
364
+ }
365
+ let bracketDepth = 0;
366
+ // INCLUSIVE of parentClose itself: a value with no trailing comma
367
+ // right before the parent's own closing brace (the common single-line
368
+ // case, e.g. `{ host: false }`) must have that `}` actually examined,
369
+ // not stop one character short of it.
370
+ for (let i = valueStart; i <= parentClose; i += 1) {
371
+ const ch = text[i];
372
+ if (ch === '[' || ch === '{' || ch === '(') bracketDepth += 1;
373
+ else if (ch === ']' || ch === '}' || ch === ')') {
374
+ if (bracketDepth === 0) return { start: valueStart, end: i }; // hit the parent's own close
375
+ bracketDepth -= 1;
376
+ } else if (ch === ',' && bracketDepth === 0) {
377
+ return { start: valueStart, end: i };
378
+ }
379
+ }
380
+ return 'ambiguous';
381
+ }
382
+ return null;
383
+ }
384
+
385
+ function quotedStringInner(valueText) {
386
+ const match = valueText.match(/^'([^']*)'$|^"([^"]*)"$/);
387
+ return match ? (match[1] ?? match[2]) : null;
388
+ }
389
+
390
+ // Best-effort, conservative: never touches a file it can't recognize the
391
+ // shape of. Merges into an EXISTING `vite`/`vite.server` block rather than
392
+ // skipping outright just because some unrelated vite config (e.g. plugins,
393
+ // or an unrelated nested `server:` inside a plugin's OWN options — never
394
+ // matched, since lookups here are depth-scoped to direct children only) is
395
+ // already present — a project with any of that must not be left
396
+ // permanently unpatched. Same treatment for the two settings themselves:
397
+ // presence alone isn't "already handled" — `host: false` and an
398
+ // `allowedHosts` array missing our own entry both still reproduce the
399
+ // original failure, so an already-effective VALUE is what's left alone,
400
+ // not just an already-present key. Only a value this can't safely
401
+ // interpret (some other expression — not a literal true/false/string or a
402
+ // bracketed array) is warned and left untouched rather than guessed at.
403
+ async function patchAstroConfigForRemoteMachinePreview(frontendDir) {
404
+ const configPath = path.join(frontendDir, 'astro.config.mjs');
405
+ let original;
406
+ try {
407
+ original = await fs.readFile(configPath, 'utf8');
408
+ } catch (error) {
409
+ if (error && error.code === 'ENOENT') {
410
+ console.warn(`[wix-headless-scaffold] no astro.config.mjs at ${configPath} — skipping preview-host patch.`);
411
+ return;
412
+ }
413
+ throw error;
414
+ }
415
+ // Used for ALL structural navigation below (finding keys, matching
416
+ // braces) — never for reading actual content, which always comes from
417
+ // `original` at the same positions (masking preserves length exactly).
418
+ const masked = maskCommentsAndStrings(original);
419
+
420
+ const allowedHostsComment =
421
+ `// Any remote machine's dynamic preview hostname (the hash/port prefix\n` +
422
+ ` // changes per session) — a literal full hostname here would go\n` +
423
+ ` // stale the moment a remote machine restarts.\n` +
424
+ ` `;
425
+ const hostComment =
426
+ `// Bind all interfaces — Vite defaults to 127.0.0.1 only, which the\n` +
427
+ ` // platform's reverse proxy cannot reach (surfaces as a 504).\n` +
428
+ ` `;
429
+ const allowedHostsProp = `${allowedHostsComment}allowedHosts: ['${REMOTE_MACHINE_HOST_SUFFIX}'],`;
430
+ const hostProp = `${hostComment}host: true,`;
431
+
432
+ const defineMatch = masked.match(/defineConfig\(\s*\{/);
433
+ if (!defineMatch) {
434
+ console.warn('[wix-headless-scaffold] astro.config.mjs is not a recognizable `defineConfig({...})` — leaving it alone.');
435
+ return;
436
+ }
437
+ const defineOpenBrace = defineMatch.index + defineMatch[0].length - 1;
438
+ const defineCloseBrace = findMatchingBrace(masked, defineOpenBrace);
439
+ if (defineCloseBrace === -1) {
440
+ console.warn('[wix-headless-scaffold] astro.config.mjs has an unbalanced defineConfig({...}) call — leaving it alone.');
441
+ return;
442
+ }
443
+
444
+ // Depth-scoped to defineConfig's OWN direct children — never a `vite:`
445
+ // key nested inside some other option's value at any deeper level.
446
+ const viteOpenBrace = findDirectChildBrace(masked, defineOpenBrace, defineCloseBrace, 'vite');
447
+
448
+ let patched;
449
+ if (viteOpenBrace === -1) {
450
+ const insertAt = defineOpenBrace + 1;
451
+ const injected = `\n vite: {\n server: {\n ${allowedHostsProp}\n ${hostProp}\n },\n },`;
452
+ patched = original.slice(0, insertAt) + injected + original.slice(insertAt);
453
+ } else {
454
+ const viteCloseBrace = findMatchingBrace(masked, viteOpenBrace);
455
+ if (viteCloseBrace === -1) {
456
+ console.warn('[wix-headless-scaffold] astro.config.mjs has an unbalanced vite: {...} block — leaving it alone.');
457
+ return;
458
+ }
459
+ // Depth-scoped to vite's OWN direct children — never a `server:` key
460
+ // nested inside a plugin's own options within the same vite block.
461
+ const serverOpenBrace = findDirectChildBrace(masked, viteOpenBrace, viteCloseBrace, 'server');
462
+
463
+ if (serverOpenBrace === -1) {
464
+ const insertAt = viteOpenBrace + 1;
465
+ const injected = `\n server: {\n ${allowedHostsProp}\n ${hostProp}\n },`;
466
+ patched = original.slice(0, insertAt) + injected + original.slice(insertAt);
467
+ } else {
468
+ const serverCloseBrace = findMatchingBrace(masked, serverOpenBrace);
469
+ if (serverCloseBrace === -1) {
470
+ console.warn('[wix-headless-scaffold] astro.config.mjs has an unbalanced vite.server: {...} block — leaving it alone.');
471
+ return;
472
+ }
473
+
474
+ // Collected as {start, end, replacement} spans against the ORIGINAL
475
+ // text and applied in one pass, highest offset first, so neither
476
+ // edit invalidates the other's already-computed positions.
477
+ const edits = [];
478
+ let touchedSomething = false;
479
+
480
+ const allowedHostsValue = findDirectChildValueSpan(masked, serverOpenBrace, serverCloseBrace, 'allowedHosts');
481
+ if (allowedHostsValue === null) {
482
+ edits.push({ start: serverOpenBrace + 1, end: serverOpenBrace + 1, replacement: `\n ${allowedHostsProp}` });
483
+ touchedSomething = true;
484
+ } else if (allowedHostsValue === 'ambiguous') {
485
+ console.warn('[wix-headless-scaffold] vite.server.allowedHosts is set to something this script cannot safely interpret — leaving it alone.');
486
+ } else {
487
+ const valueText = original.slice(allowedHostsValue.start, allowedHostsValue.end);
488
+ const trimmed = valueText.trim();
489
+ if (trimmed === 'true') {
490
+ // Vite treats `allowedHosts: true` as "disable the check
491
+ // entirely" — already strictly more permissive than what this
492
+ // needs, nothing to do.
493
+ } else if (trimmed.startsWith('[') && trimmed.endsWith(']')) {
494
+ if (trimmed.includes(REMOTE_MACHINE_HOST_SUFFIX)) {
495
+ // Already covers it.
496
+ } else {
497
+ const closeBracketAt = allowedHostsValue.start + trimmed.lastIndexOf(']');
498
+ const beforeClose = original.slice(allowedHostsValue.start, closeBracketAt).replace(/\s+$/, '');
499
+ const isEmpty = /\[\s*$/.test(beforeClose);
500
+ const hasTrailingComma = /,\s*$/.test(beforeClose);
501
+ const sep = isEmpty ? '' : hasTrailingComma ? ' ' : ', ';
502
+ edits.push({
503
+ start: closeBracketAt,
504
+ end: closeBracketAt,
505
+ replacement: `${sep}'${REMOTE_MACHINE_HOST_SUFFIX}'`,
506
+ });
507
+ touchedSomething = true;
508
+ }
509
+ } else {
510
+ console.warn('[wix-headless-scaffold] vite.server.allowedHosts is set to something this script cannot safely interpret — leaving it alone.');
511
+ }
512
+ }
513
+
514
+ const hostValue = findDirectChildValueSpan(masked, serverOpenBrace, serverCloseBrace, 'host');
515
+ if (hostValue === null) {
516
+ edits.push({ start: serverOpenBrace + 1, end: serverOpenBrace + 1, replacement: `\n ${hostProp}` });
517
+ touchedSomething = true;
518
+ } else if (hostValue === 'ambiguous') {
519
+ console.warn('[wix-headless-scaffold] vite.server.host is set to something this script cannot safely interpret — leaving it alone.');
520
+ } else {
521
+ const trimmed = original.slice(hostValue.start, hostValue.end).trim();
522
+ const quotedInner = quotedStringInner(trimmed);
523
+ const isIneffective = trimmed === 'false' || (quotedInner !== null && ['localhost', '127.0.0.1'].includes(quotedInner));
524
+ const isKnownEffective = trimmed === 'true' || quotedInner !== null;
525
+ if (isIneffective) {
526
+ edits.push({ start: hostValue.start, end: hostValue.end, replacement: 'true' });
527
+ touchedSomething = true;
528
+ } else if (!isKnownEffective) {
529
+ console.warn('[wix-headless-scaffold] vite.server.host is set to something this script cannot safely interpret — leaving it alone.');
530
+ }
531
+ // else: true, or a real, non-localhost bind address — already effective.
532
+ }
533
+
534
+ if (!touchedSomething) {
535
+ console.log('[wix-headless-scaffold] vite.server.allowedHosts and host are already effective — nothing to patch.');
536
+ return;
537
+ }
538
+
539
+ edits.sort((a, b) => b.start - a.start);
540
+ patched = original;
541
+ for (const edit of edits) {
542
+ patched = patched.slice(0, edit.start) + edit.replacement + patched.slice(edit.end);
543
+ }
544
+ }
545
+ }
546
+
547
+ await fs.writeFile(configPath, patched);
548
+ console.log('[wix-headless-scaffold] patched astro.config.mjs for remote-machine preview (allowedHosts + host).');
549
+ }
550
+
551
+ async function patchPackageJsonEnvPullHooks(frontendDir) {
552
+ const pkgPath = path.join(frontendDir, 'package.json');
553
+ let pkg;
554
+ try {
555
+ pkg = JSON.parse(await fs.readFile(pkgPath, 'utf8'));
556
+ } catch (error) {
557
+ if (error && error.code === 'ENOENT') {
558
+ console.warn(`[wix-headless-scaffold] no package.json at ${pkgPath} — skipping env-pull hooks.`);
559
+ return;
560
+ }
561
+ throw error;
562
+ }
563
+ pkg.scripts = pkg.scripts || {};
564
+ let changed = false;
565
+ for (const [hook, command] of Object.entries(ENV_PULL_HOOK_SCRIPTS)) {
566
+ const existing = pkg.scripts[hook];
567
+ if (existing === undefined) {
568
+ pkg.scripts[hook] = command;
569
+ changed = true;
570
+ } else if (!existing.includes(command)) {
571
+ // A template's own hook (e.g. a codegen step) does something unrelated
572
+ // to env-pulling — compose rather than skip, or it silently never runs
573
+ // at all, defeating the whole point of this patch. Idempotent: a hook
574
+ // that already contains the command is left alone, never re-composed.
575
+ pkg.scripts[hook] = `${command} && ${existing}`;
576
+ changed = true;
577
+ }
578
+ }
579
+ if (!changed) {
580
+ console.warn('[wix-headless-scaffold] package.json already defines all env-pull hooks — leaving it alone.');
581
+ return;
582
+ }
583
+ await fs.writeFile(pkgPath, `${JSON.stringify(pkg, null, 2)}\n`);
584
+ console.log('[wix-headless-scaffold] added predev/prebuild/prerelease "wix env pull" hooks to package.json.');
585
+ }
586
+
587
+ // Safe to call more than once against the same project directory, including
588
+ // after its own prior partial failure. Every branch below either confirms a destination
589
+ // receipt before returning success, or fails closed without touching config/wix.env.
590
+ async function ensureDestinationReceipt(args, { spawnScaffold = defaultSpawnScaffold } = {}) {
591
+ const projectDir = path.resolve(args.projectDir);
592
+ const frontendDir = path.join(projectDir, args.folderName);
593
+ const wixEnvPath = path.join(projectDir, 'config', 'wix.env');
594
+
595
+ const siteIdStatus = (await statEnvKeys(wixEnvPath, ['WIX_SITE_ID'])).keys.WIX_SITE_ID;
596
+ const envValues = await readWixEnvValues(wixEnvPath);
597
+ const wixConfig = await readWixConfig(frontendDir);
598
+
599
+ if (siteIdStatus === 'present') {
600
+ // Case 1: config/wix.env already names a destination — checked first, independent of
601
+ // wix.config.json, so an env-only receipt (adopted/existing destination, or a lost
602
+ // frontend folder) can never fall through to spawning a second site.
603
+ if (wixConfig && wixConfig.siteId !== envValues.WIX_SITE_ID) {
604
+ // 1b — conflicting.
605
+ throw new Error(
606
+ `config/wix.env already has WIX_SITE_ID=${envValues.WIX_SITE_ID}, but ${frontendDir}/wix.config.json names a different siteId=${wixConfig.siteId}. Refusing to create or adopt a second destination — resolve the conflict manually.`,
607
+ );
608
+ }
609
+ // 1a — consistent (wix.config.json is absent, has no siteId, or matches).
610
+ const status = envValues.WIX_SCAFFOLD_STATUS;
611
+ if (status === undefined || status === 'complete') {
612
+ return { siteId: envValues.WIX_SITE_ID };
613
+ }
614
+ if (status === 'incomplete') {
615
+ throw new Error(
616
+ `Destination ${envValues.WIX_SITE_ID} already exists, but a prior scaffold attempt did not complete (WIX_SCAFFOLD_STATUS=incomplete). Refusing to spawn again — that would risk a duplicate site. Resolve manually before retrying.`,
617
+ );
618
+ }
619
+ throw new Error(
620
+ `config/wix.env has an unrecognized WIX_SCAFFOLD_STATUS value (${JSON.stringify(status)}); expected "complete", "incomplete", or the key to be absent. Refusing to proceed.`,
621
+ );
622
+ }
623
+
624
+ // Case 2: no confirmed real WIX_SITE_ID (missing, blank, or a placeholder — all treated
625
+ // alike here, matching case 1's classification). This branch
626
+ // must also inspect WIX_SCAFFOLD_STATUS, not just wix.config.json's existence — a bare
627
+ // "wix.config.json exists" check cannot tell a genuinely legacy/host-adopted receipt
628
+ // apart from one left behind by a scaffold attempt this script itself started but never
629
+ // finished recording (the wrapper crashed, or was killed, after the CLI created the site
630
+ // but before persistSiteId ran). Silently adopting the latter as "complete" is the same
631
+ // laundering bug as case 1 exists to prevent, just reached from the opposite direction.
632
+ const status = envValues.WIX_SCAFFOLD_STATUS;
633
+ if (status === 'in_progress') {
634
+ if (wixConfig) {
635
+ // A prior invocation marked in_progress before spawning (see 2c below) and never
636
+ // got to record a final outcome. The CLI may well have finished — never infer
637
+ // "complete" from an orphaned receipt like this. Persist it as incomplete (the same
638
+ // durable, fail-closed record a known non-zero exit produces) so the *next*
639
+ // invocation adopts and blocks via case 1's existing, tested handling instead of
640
+ // this ambiguity recurring indefinitely.
641
+ await persistSiteId(wixEnvPath, wixConfig.siteId, 'incomplete');
642
+ throw new Error(
643
+ `A prior scaffold attempt was interrupted before it could record its outcome (WIX_SCAFFOLD_STATUS=in_progress), but a destination was found (WIX_SITE_ID=${wixConfig.siteId}). Persisted as incomplete — resolve manually before retrying.`,
644
+ );
645
+ }
646
+ // No local receipt either does NOT mean nothing
647
+ // was created remotely — a crash could have happened after a remote site was created
648
+ // but before wix.config.json was written locally (or even before the frontend folder
649
+ // existed at all), which isNonEmptyDir below cannot detect. Fail closed
650
+ // unconditionally rather than falling through to 2b/2c; the one case that clears this
651
+ // marker for a safe automatic retry is a genuine spawn-launch failure (see 2c) — that
652
+ // is handled before this marker is ever left behind, not by re-reading it here.
653
+ throw new Error(
654
+ 'A prior scaffold attempt was interrupted before it could record any outcome (WIX_SCAFFOLD_STATUS=in_progress) and no local destination receipt (wix.config.json) exists either. This cannot be safely distinguished from a remote site having been created before a local receipt was written. Refusing to retry automatically — confirm whether a destination already exists, then either record its WIX_SITE_ID manually or clear WIX_SCAFFOLD_STATUS from config/wix.env if nothing was actually created.',
655
+ );
656
+ }
657
+ if (status !== undefined) {
658
+ // WIX_SCAFFOLD_STATUS is set to something else (a known-ambiguous marker from this
659
+ // script, or corrupted state) while no real WIX_SITE_ID exists. Fail closed rather
660
+ // than silently proceeding as though nothing were recorded.
661
+ throw new Error(
662
+ `config/wix.env has WIX_SCAFFOLD_STATUS=${JSON.stringify(status)} but no valid WIX_SITE_ID; this cannot be automatically resolved. Refusing to proceed automatically — resolve manually.`,
663
+ );
664
+ }
665
+
666
+ if (wixConfig) {
667
+ // 2a — adopt a receipt with no status marker at all: a genuinely legacy/host-adopted
668
+ // destination, or one scaffolded before this script wrote WIX_SCAFFOLD_STATUS.
669
+ await upsertEnvFile(wixEnvPath, { WIX_SITE_ID: wixConfig.siteId, WIX_SCAFFOLD_STATUS: 'complete' });
670
+ return { siteId: wixConfig.siteId };
671
+ }
672
+
673
+ if (await isNonEmptyDir(frontendDir)) {
674
+ // 2b — genuinely ambiguous state this script cannot resolve on its own.
675
+ throw new Error(
676
+ `${frontendDir} already exists and is not empty, but no valid wix.config.json was found there and config/wix.env has no WIX_SITE_ID. Refusing to scaffold into this folder automatically — resolve manually before retrying.`,
677
+ );
678
+ }
679
+
680
+ // 2c — nothing exists yet; mark in_progress before spawning so a crash between now and
681
+ // persisting a final outcome always leaves a distinguishable trace instead of silently
682
+ // looking like "nothing was ever attempted."
683
+ await upsertEnvFile(wixEnvPath, { WIX_SCAFFOLD_STATUS: 'in_progress' });
684
+ let code;
685
+ try {
686
+ ({ code } = await spawnScaffold(args));
687
+ } catch (spawnError) {
688
+ // A rejection alone isn't proof nothing was created — spawnScaffold could fail for
689
+ // reasons other than a launch failure after the child already did real work. Check for
690
+ // a receipt regardless of why this rejected: if one exists, leave the in_progress
691
+ // marker in place so the next invocation's self-heal branch above handles it (never
692
+ // clear a marker out from under a receipt that might exist). Only when there is
693
+ // genuinely no receipt is it safe to clear — for the real spawnScaffold, which only
694
+ // rejects via child_process's 'error' event (emitted specifically when the OS-level
695
+ // process itself could never be launched, before any exit code exists), that absence
696
+ // is deterministic: nothing could have been created remotely.
697
+ const orphanedConfig = await readWixConfig(frontendDir);
698
+ if (!orphanedConfig) {
699
+ await clearWixScaffoldStatus(wixEnvPath);
700
+ }
701
+ throw spawnError;
702
+ }
703
+ const postConfig = await readWixConfig(frontendDir);
704
+ if (postConfig) {
705
+ // Persisted even on a non-zero exit: site creation and later template/release work are
706
+ // separate phases of the CLI's run, so discarding the id here is exactly how a retry
707
+ // would spawn a second site.
708
+ await persistSiteId(wixEnvPath, postConfig.siteId, code === 0 ? 'complete' : 'incomplete');
709
+ if (code === 0) {
710
+ return { siteId: postConfig.siteId };
711
+ }
712
+ throw new Error(
713
+ `Scaffold process exited with code ${code}, but a destination was created (WIX_SITE_ID=${postConfig.siteId}); persisted as incomplete. Do not retry automatically — resolve the underlying failure first.`,
714
+ );
715
+ }
716
+ // The child process definitely ran to completion (it returned an exit code), but no
717
+ // valid local receipt was found. This must NOT be left as a retryable in_progress
718
+ // marker: a remote site could still have been created before a local write failed.
719
+ // Convert it to a durable, always-blocked marker instead.
720
+ await upsertEnvFile(wixEnvPath, { WIX_SCAFFOLD_STATUS: 'ambiguous' });
721
+ if (code === 0) {
722
+ throw new Error('Scaffold process exited 0, but no wix.config.json with a siteId was found afterward — cannot confirm whether a destination was created. Marked ambiguous; resolve manually before retrying.');
723
+ }
724
+ throw new Error(`Scaffold process exited with code ${code} and no destination receipt was found — cannot confirm whether a destination was created. Marked ambiguous; resolve manually before retrying.`);
725
+ }
726
+
727
+ async function main() {
728
+ const args = parseArgs(process.argv.slice(2));
729
+ if (args.help) {
730
+ console.log(usage());
731
+ return;
732
+ }
733
+ if (!args.businessName) {
734
+ console.error(usage());
735
+ process.exit(1);
736
+ return;
737
+ }
738
+ const result = await ensureDestinationReceipt(args);
739
+ // Applied after ANY successful resolution (a fresh scaffold, or an
740
+ // idempotent adopt of an existing receipt) — both patch functions are
741
+ // themselves idempotent and cheap, so an already-patched or pre-existing
742
+ // destination is a safe, fast no-op, not just the first-scaffold path.
743
+ const frontendDir = path.join(path.resolve(args.projectDir), args.folderName);
744
+ await patchAstroConfigForRemoteMachinePreview(frontendDir);
745
+ await patchPackageJsonEnvPullHooks(frontendDir);
746
+ console.log(JSON.stringify({ ok: true, siteId: result.siteId }));
747
+ }
748
+
749
+ if (require.main === module) {
750
+ main().catch((error) => {
751
+ console.error(error && error.message ? error.message : error);
752
+ process.exit(1);
753
+ });
754
+ }
755
+
756
+ module.exports = {
757
+ ensureDestinationReceipt,
758
+ parseArgs,
759
+ usage,
760
+ patchAstroConfigForRemoteMachinePreview,
761
+ patchPackageJsonEnvPullHooks,
762
+ };