@wix/agent-skills 1.33.1 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (616) hide show
  1. package/README.md +2 -0
  2. package/package.json +1 -1
  3. package/skills/wix-export/SKILL.md +83 -0
  4. package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
  5. package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
  6. package/skills/wix-harmony-editor/SKILL.md +317 -0
  7. package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
  8. package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
  9. package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
  10. package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
  11. package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
  12. package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
  13. package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
  14. package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
  15. package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
  16. package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
  17. package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
  18. package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
  19. package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
  20. package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
  21. package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
  22. package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
  23. package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
  24. package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
  25. package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
  26. package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
  27. package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
  28. package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
  29. package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
  30. package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
  31. package/skills/wix-headless/SKILL.md +7 -2
  32. package/skills/wix-headless/references/CAPABILITIES.md +6 -1
  33. package/skills/wix-headless/references/DISCOVERY.md +2 -1
  34. package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
  35. package/skills/wix-headless/references/SEED.md +3 -2
  36. package/skills/wix-headless/references/SETUP.md +1 -0
  37. package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
  38. package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
  39. package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
  40. package/skills/wix-headless/references/managed/CREATE.md +1 -1
  41. package/skills/wix-headless-kit/SKILL.md +110 -21
  42. package/skills/wix-headless-kit/guides/api-run.md +15 -13
  43. package/skills/wix-headless-kit/guides/existing-site.md +31 -0
  44. package/skills/wix-headless-kit/guides/migration.md +49 -17
  45. package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
  46. package/skills/wix-headless-kit/install/context.mjs +61 -6
  47. package/skills/wix-headless-kit/install/pins.json +1 -1
  48. package/skills/wix-headless-kit/install/setup.mjs +107 -12
  49. package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
  50. package/skills/wix-headless-replatform/SKILL.md +116 -0
  51. package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
  52. package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
  53. package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
  54. package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
  55. package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
  56. package/skills/wix-headless-replatform/references/output-contract.md +93 -0
  57. package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
  58. package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
  59. package/skills/wix-headless-replatform/references/safety.md +19 -0
  60. package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
  61. package/skills/wix-headless-replatform/references/workflow.md +157 -0
  62. package/skills/wix-headless-replatform/registry/README.md +20 -0
  63. package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
  64. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
  65. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
  66. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
  67. package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
  68. package/skills/wix-headless-replatform/registry/registry.json +36 -0
  69. package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
  70. package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
  71. package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
  72. package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
  73. package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
  74. package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
  75. package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
  76. package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
  77. package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
  78. package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
  79. package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
  80. package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
  81. package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
  82. package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
  83. package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
  84. package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
  85. package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
  86. package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
  87. package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
  88. package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
  89. package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
  90. package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
  91. package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
  92. package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
  93. package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
  94. package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
  95. package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
  96. package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
  97. package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
  98. package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
  99. package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
  100. package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
  101. package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
  102. package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
  103. package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
  104. package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
  105. package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
  106. package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
  107. package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
  108. package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
  109. package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
  110. package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
  111. package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
  112. package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
  113. package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
  114. package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
  115. package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
  116. package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
  117. package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
  118. package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
  119. package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
  120. package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
  121. package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
  122. package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
  123. package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
  124. package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
  125. package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
  126. package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
  127. package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
  128. package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
  129. package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
  130. package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
  131. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
  132. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
  133. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
  134. package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
  135. package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
  136. package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
  137. package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
  138. package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
  139. package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
  140. package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
  141. package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
  142. package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
  143. package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
  144. package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
  145. package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
  146. package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
  147. package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
  148. package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
  149. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
  150. package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
  151. package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
  152. package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
  153. package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
  154. package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
  155. package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
  156. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
  157. package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
  158. package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
  159. package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
  160. package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
  161. package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
  162. package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
  163. package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
  164. package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
  165. package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
  166. package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
  167. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
  168. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
  169. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
  170. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
  171. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
  172. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
  173. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
  174. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
  175. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
  176. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
  177. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
  178. package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
  179. package/skills/wix-import/SKILL.md +90 -0
  180. package/skills/wix-manage/SKILL.md +13 -3
  181. package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
  182. package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
  183. package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
  184. package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
  185. package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
  186. package/skills/wix-manage/references/sites/upload-static-site.md +127 -8
  187. package/skills/wix-replatform/.publish-manifest.json +5 -5
  188. package/skills/wix-replatform/CLI.md +162 -0
  189. package/skills/wix-replatform/README.md +52 -0
  190. package/skills/wix-replatform/SKILL.md +229 -684
  191. package/skills/wix-replatform/console/account.css +1 -0
  192. package/skills/wix-replatform/console/app.css +1 -0
  193. package/skills/wix-replatform/console/app.js +117 -0
  194. package/skills/wix-replatform/console/index.html +4 -0
  195. package/skills/wix-replatform/console/json.css +11 -0
  196. package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
  197. package/skills/wix-replatform/lib/app-page-routing.js +75 -0
  198. package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
  199. package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
  200. package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
  201. package/skills/wix-replatform/lib/completion-report.js +1393 -13
  202. package/skills/wix-replatform/lib/config-env.js +85 -11
  203. package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
  204. package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
  205. package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
  206. package/skills/wix-replatform/lib/destination-choice.js +163 -0
  207. package/skills/wix-replatform/lib/destination-handoff.js +62 -0
  208. package/skills/wix-replatform/lib/destination-http.js +81 -0
  209. package/skills/wix-replatform/lib/destination-route.js +98 -0
  210. package/skills/wix-replatform/lib/destination.js +919 -0
  211. package/skills/wix-replatform/lib/discovered-census.js +231 -0
  212. package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
  213. package/skills/wix-replatform/lib/document-url-guard.js +203 -0
  214. package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
  215. package/skills/wix-replatform/lib/entity-verification.js +18 -0
  216. package/skills/wix-replatform/lib/execution-capability.js +120 -0
  217. package/skills/wix-replatform/lib/execution-log.js +170 -0
  218. package/skills/wix-replatform/lib/execution-manifest.js +20 -2
  219. package/skills/wix-replatform/lib/execution-state.js +22 -0
  220. package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
  221. package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
  222. package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
  223. package/skills/wix-replatform/lib/import-recovery.js +800 -6
  224. package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
  225. package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
  226. package/skills/wix-replatform/lib/link-audit.js +173 -0
  227. package/skills/wix-replatform/lib/link-census.js +194 -0
  228. package/skills/wix-replatform/lib/link-plan.js +148 -0
  229. package/skills/wix-replatform/lib/link-verification.js +274 -0
  230. package/skills/wix-replatform/lib/link-write-journal.js +42 -0
  231. package/skills/wix-replatform/lib/local-state.js +869 -30
  232. package/skills/wix-replatform/lib/member-completion.js +658 -0
  233. package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
  234. package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
  235. package/skills/wix-replatform/lib/migration-completion.js +311 -0
  236. package/skills/wix-replatform/lib/operator-identity.js +47 -0
  237. package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
  238. package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
  239. package/skills/wix-replatform/lib/orchestration-router.js +608 -32
  240. package/skills/wix-replatform/lib/orchestration-state.js +188 -12
  241. package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
  242. package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
  243. package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
  244. package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
  245. package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
  246. package/skills/wix-replatform/lib/progress-log.js +19 -3
  247. package/skills/wix-replatform/lib/read-back-approval.js +184 -0
  248. package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
  249. package/skills/wix-replatform/lib/read-back-contract.js +243 -0
  250. package/skills/wix-replatform/lib/read-back-extract.js +118 -0
  251. package/skills/wix-replatform/lib/read-back-gate.js +734 -0
  252. package/skills/wix-replatform/lib/read-back-reads.js +94 -0
  253. package/skills/wix-replatform/lib/read-back-state.js +107 -0
  254. package/skills/wix-replatform/lib/read-back-summary.js +81 -0
  255. package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
  256. package/skills/wix-replatform/lib/run-controller.js +401 -0
  257. package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
  258. package/skills/wix-replatform/lib/setup-verification.js +148 -0
  259. package/skills/wix-replatform/lib/source-access.js +231 -0
  260. package/skills/wix-replatform/lib/source-coverage.js +1130 -0
  261. package/skills/wix-replatform/lib/source-secrets.js +277 -0
  262. package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
  263. package/skills/wix-replatform/lib/task-state.js +110 -0
  264. package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
  265. package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
  266. package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
  267. package/skills/wix-replatform/lib/url-verification.js +315 -0
  268. package/skills/wix-replatform/lib/user-action-effects.js +42 -0
  269. package/skills/wix-replatform/lib/user-actions.js +264 -0
  270. package/skills/wix-replatform/lib/website-handoff.js +1220 -0
  271. package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
  272. package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
  273. package/skills/wix-replatform/lib/write-verification-state.js +92 -0
  274. package/skills/wix-replatform/lib/write-verification.js +274 -0
  275. package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
  276. package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
  277. package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
  278. package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
  279. package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
  280. package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
  281. package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
  282. package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
  283. package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
  284. package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
  285. package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
  286. package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
  287. package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
  288. package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
  289. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
  290. package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
  291. package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
  292. package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
  293. package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
  294. package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
  295. package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
  296. package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
  297. package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
  298. package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
  299. package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
  300. package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
  301. package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
  302. package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
  303. package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
  304. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
  305. package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
  306. package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
  307. package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
  308. package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
  309. package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
  310. package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
  311. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
  312. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
  313. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
  314. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
  315. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
  316. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
  317. package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
  318. package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
  319. package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
  320. package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
  321. package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
  322. package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
  323. package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
  324. package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
  325. package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
  326. package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
  327. package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
  328. package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
  329. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
  330. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
  331. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
  332. package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
  333. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
  334. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
  335. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
  336. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
  337. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
  338. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
  339. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
  340. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
  341. package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
  342. package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
  343. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
  344. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
  345. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
  346. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
  347. package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
  348. package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
  349. package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
  350. package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
  351. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
  352. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
  353. package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
  354. package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
  355. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
  356. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
  357. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
  358. package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
  359. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
  360. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
  361. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
  362. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
  363. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
  364. package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
  365. package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
  366. package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
  367. package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
  368. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
  369. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
  370. package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
  371. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
  372. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
  373. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
  374. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
  375. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
  376. package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
  377. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
  378. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
  379. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
  380. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
  381. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
  382. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
  383. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
  384. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
  385. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
  386. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
  387. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
  388. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
  389. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
  390. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
  391. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
  392. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
  393. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
  394. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
  395. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
  396. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
  397. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
  398. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
  399. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
  400. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
  401. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
  402. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
  403. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
  404. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
  405. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
  406. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
  407. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
  408. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
  409. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
  410. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
  411. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
  412. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
  413. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
  414. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
  415. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
  416. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
  417. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
  418. package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
  419. package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
  420. package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
  421. package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
  422. package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
  423. package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
  424. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
  425. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
  426. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
  427. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
  428. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
  429. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
  430. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
  431. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
  432. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
  433. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
  434. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
  435. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
  436. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
  437. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
  438. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
  439. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
  440. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
  441. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
  442. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
  443. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
  444. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
  445. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
  446. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
  447. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
  448. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
  449. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
  450. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
  451. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
  452. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
  453. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
  454. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
  455. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
  456. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
  457. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
  458. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
  459. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
  460. package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
  461. package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
  462. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
  463. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
  464. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
  465. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
  466. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
  467. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
  468. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
  469. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
  470. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
  471. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
  472. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
  473. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
  474. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
  475. package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
  476. package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
  477. package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
  478. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
  479. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
  480. package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
  481. package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
  482. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
  483. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
  484. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
  485. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
  486. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
  487. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
  488. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
  489. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
  490. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
  491. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
  492. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
  493. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
  494. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
  495. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
  496. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
  497. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
  498. package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
  499. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
  500. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
  501. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
  502. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
  503. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
  504. package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
  505. package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
  506. package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
  507. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
  508. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
  509. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
  510. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
  511. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
  512. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
  513. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
  514. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
  515. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
  516. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
  517. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
  518. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
  519. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
  520. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
  521. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
  522. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
  523. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
  524. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
  525. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
  526. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
  527. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
  528. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
  529. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
  530. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
  531. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
  532. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
  533. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
  534. package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
  535. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
  536. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
  537. package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
  538. package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
  539. package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
  540. package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
  541. package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
  542. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
  543. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
  544. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
  545. package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
  546. package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
  547. package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
  548. package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
  549. package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
  550. package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
  551. package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
  552. package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
  553. package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
  554. package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
  555. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
  556. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
  557. package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
  558. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
  559. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
  560. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
  561. package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
  562. package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
  563. package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
  564. package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
  565. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
  566. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
  567. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
  568. package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
  569. package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
  570. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
  571. package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
  572. package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
  573. package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
  574. package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
  575. package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
  576. package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
  577. package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
  578. package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
  579. package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
  580. package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
  581. package/skills/wix-replatform/scripts/discovered-census.js +26 -0
  582. package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
  583. package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
  584. package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
  585. package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
  586. package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
  587. package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
  588. package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
  589. package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
  590. package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
  591. package/skills/wix-replatform/scripts/migration-completion.js +76 -0
  592. package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
  593. package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
  594. package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
  595. package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
  596. package/skills/wix-replatform/scripts/replatform-console.js +146 -0
  597. package/skills/wix-replatform/scripts/replatform.js +436 -0
  598. package/skills/wix-replatform/scripts/source-secrets.js +77 -0
  599. package/skills/wix-replatform/scripts/url-redirects.js +286 -0
  600. package/skills/wix-replatform/scripts/user-action.js +58 -0
  601. package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
  602. package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
  603. package/skills/wix-replatform/scripts/wix-destination.js +143 -0
  604. package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
  605. package/skills/wix-vibe-headless/SKILL.md +7 -3
  606. package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
  607. package/skills/wix-vibe-headless/platforms/base44.md +1 -0
  608. package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
  609. package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
  610. package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
  611. package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
  612. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
  613. package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
  614. package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
  615. package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
  616. package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
@@ -0,0 +1,283 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ // The Shopify extract step: reads the full store through Shopify's bulk export, one
5
+ // dataset at a time, and writes the extract files the import step consumes.
6
+ //
7
+ // node scripts/shopify-extract.js --project <migrations-root>/<project> [--store <shop>.myshopify.com]
8
+ // [--retry-failed] [--catch-up] [--progress-log <path>]
9
+ //
10
+ // The store defaults to SHOPIFY_SHOP_DOMAIN in config/source.shopify.env. Run the Shopify session
11
+ // check first: the extract refuses to start without a passing one.
12
+ //
13
+ // (no flag) start the extract, or resume it from data/source-extract/extract-manifest.json.
14
+ // A manifest that says `complete` with its final files present skips the read.
15
+ // --retry-failed Import Operator recovery: send every stopping dataset (each `failed` entry, each
16
+ // unattributed `denied` entry, and the datasets whose exact count check stopped
17
+ // the extract) back to `pending` and read it again. Nothing else is reset.
18
+ // --catch-up a source catch-up rerun: archive the `complete` manifest as
19
+ // extract-manifest.<T_prev>.json and read the whole store again with a new
20
+ // snapshot time. A manifest that is not complete is resumed instead.
21
+ //
22
+ // Output: data/source-extract/<entity>.ndjson, data/source-extract/extract-manifest.json.
23
+ // Exit codes: 0 complete; 3 waiting on a question (shopify_bulk_overdue: answer it, run again);
24
+ // 2 stopped (the printed code says why; finished datasets are kept); 1 usage error.
25
+
26
+ const fs = require('node:fs/promises');
27
+ const path = require('node:path');
28
+ const { createProgressLogger, parseProgressArgs } = require('../../../lib/progress-log.js');
29
+ const { readEnvFile } = require('../../../lib/config-env.js');
30
+ const { SHOPIFY_SOURCE_ENV } = require('../../../lib/source-access.js');
31
+ const { createStoreExecutor, ShopifyCliError } = require('../lib/shopify-cli.js');
32
+ const session = require('../lib/shopify-session.js');
33
+ const bulk = require('../lib/shopify-bulk.js');
34
+ const protectedFields = require('../lib/shopify-protected-fields.js');
35
+ const giftCards = require('../lib/shopify-gift-cards.js');
36
+
37
+ const USAGE = 'Usage: shopify-extract.js --project <migrations-root>/<project> [--store <shop>.myshopify.com] [--retry-failed] [--catch-up] [--progress-log <path>]\n';
38
+
39
+ function parseArgs(argv) {
40
+ const args = { project: null, store: null, retryFailed: false, catchUp: false, help: false };
41
+ for (let i = 0; i < argv.length; i += 1) {
42
+ const arg = argv[i];
43
+ if (arg === '--help' || arg === '-h') args.help = true;
44
+ else if (arg === '--project') { args.project = argv[i + 1]; i += 1; }
45
+ else if (arg === '--store') { args.store = argv[i + 1]; i += 1; }
46
+ else if (arg === '--retry-failed') args.retryFailed = true;
47
+ else if (arg === '--catch-up') args.catchUp = true;
48
+ else throw new Error(`unknown argument ${arg}`);
49
+ }
50
+ return args;
51
+ }
52
+
53
+ async function configuredDomain(projectDir) {
54
+ let values;
55
+ try {
56
+ values = await readEnvFile(path.join(projectDir, SHOPIFY_SOURCE_ENV));
57
+ } catch (error) {
58
+ if (error.code === 'ENOENT') throw new session.ShopifySessionStop('shopify_shop_domain_missing', `${SHOPIFY_SOURCE_ENV} is missing; record SHOPIFY_SHOP_DOMAIN=<shop>.myshopify.com there or pass --store.`);
59
+ throw error;
60
+ }
61
+ if (!values.SHOPIFY_SHOP_DOMAIN) throw new session.ShopifySessionStop('shopify_shop_domain_missing', `SHOPIFY_SHOP_DOMAIN is missing from ${SHOPIFY_SOURCE_ENV}.`);
62
+ return values.SHOPIFY_SHOP_DOMAIN;
63
+ }
64
+
65
+ async function readJson(file) {
66
+ try {
67
+ return JSON.parse(await fs.readFile(file, 'utf8'));
68
+ } catch (error) {
69
+ if (error.code === 'ENOENT') return null;
70
+ throw error;
71
+ }
72
+ }
73
+
74
+ // The previous complete manifest is kept as extract-manifest.<T_prev>.json (':' replaced by
75
+ // '-' so the name is valid on every platform), and the catch-up starts a fresh manifest.
76
+ async function archiveCompleteManifest(manifestPath, knownPrevious = null) {
77
+ const previous = knownPrevious || await readJson(manifestPath);
78
+ if (!previous || previous.status !== 'complete') return null;
79
+ const stamp = String(previous.snapshotTime || 'unknown').replace(/:/g, '-');
80
+ const archived = path.join(path.dirname(manifestPath), `extract-manifest.${stamp}.json`);
81
+ try {
82
+ await fs.access(archived);
83
+ throw new session.ShopifySessionStop('shopify_extract_archive_exists', `${path.basename(archived)} already exists; the previous extract was already archived. Nothing was changed.`);
84
+ } catch (error) {
85
+ if (error.code !== 'ENOENT') throw error;
86
+ }
87
+ await fs.rename(manifestPath, archived);
88
+ return archived;
89
+ }
90
+
91
+ // A crash can land after the complete manifest was renamed but before the new catch-up manifest
92
+ // was created. Recover its sidecar ownership from the newest archive so the replacement run still
93
+ // removes outputs that no longer exist; no archived record is ever modified.
94
+ async function latestArchivedManifest(manifestPath) {
95
+ const dir = path.dirname(manifestPath);
96
+ const prefix = `${path.basename(manifestPath, '.json')}.`;
97
+ let names;
98
+ try {
99
+ names = await fs.readdir(dir);
100
+ } catch (error) {
101
+ if (error.code === 'ENOENT') return null;
102
+ throw error;
103
+ }
104
+ const candidates = [];
105
+ for (const name of names.filter((candidate) => candidate.startsWith(prefix) && candidate.endsWith('.json'))) {
106
+ const file = path.join(dir, name);
107
+ const manifest = await readJson(file);
108
+ if (!manifest || manifest.status !== 'complete') continue;
109
+ const time = Date.parse(manifest.snapshotTime || manifest.completedAt || '');
110
+ candidates.push({ file, manifest, time: Number.isFinite(time) ? time : -Infinity });
111
+ }
112
+ candidates.sort((a, b) => b.time - a.time || b.file.localeCompare(a.file));
113
+ return candidates[0] || null;
114
+ }
115
+
116
+ // The denial path's session check: passes only when the connection is live and holds
117
+ // every required scope. A failure is data to the runner, not an exception.
118
+ function defaultSessionCheck({ projectDir, store }) {
119
+ return async () => {
120
+ try {
121
+ await session.runSessionCheck({ projectDir, store, askFirstConnection: false });
122
+ return { ok: true };
123
+ } catch (error) {
124
+ if (error instanceof session.ShopifySessionStop || error instanceof ShopifyCliError) return { ok: false, error: { code: error.code, message: error.message } };
125
+ throw error;
126
+ }
127
+ };
128
+ }
129
+
130
+ async function runExtract({
131
+ projectDir,
132
+ store,
133
+ execute,
134
+ retryFailed = false,
135
+ catchUp = false,
136
+ now = () => Date.now(),
137
+ sessionCheck = defaultSessionCheck({ projectDir, store }),
138
+ ...runnerOptions
139
+ } = {}) {
140
+ if (!projectDir) throw new Error('projectDir is required');
141
+ if (typeof execute !== 'function') throw new Error('execute is required');
142
+ const normalizedStore = session.normalizeDomain(store);
143
+ const outputDir = path.join(projectDir, bulk.RAW_EXTRACT_DIR);
144
+ const manifestPath = path.join(outputDir, bulk.EXTRACT_MANIFEST_FILE);
145
+ const stagingDir = path.join(outputDir, 'staging');
146
+ let existing = await readJson(manifestPath);
147
+ let archived = null;
148
+ let previousSidecars = [];
149
+ let sameStore = !existing;
150
+ if (existing && existing.store) {
151
+ try {
152
+ sameStore = session.normalizeDomain(existing.store) === normalizedStore;
153
+ } catch {
154
+ sameStore = false;
155
+ }
156
+ }
157
+ // Store binding is checked before the only destructive catch-up action. A mismatch stays in
158
+ // place for the runner to report, so neither the manifest nor any final file is changed.
159
+ if (catchUp && sameStore && existing && existing.status === 'complete') {
160
+ previousSidecars = Array.isArray(existing.sidecars) ? existing.sidecars : [];
161
+ archived = await archiveCompleteManifest(manifestPath, existing);
162
+ existing = null;
163
+ } else if (catchUp && !existing) {
164
+ const recovered = await latestArchivedManifest(manifestPath);
165
+ if (recovered) {
166
+ let recoveredStore = null;
167
+ try {
168
+ recoveredStore = session.normalizeDomain(recovered.manifest.store);
169
+ } catch {
170
+ recoveredStore = null;
171
+ }
172
+ if (recoveredStore !== normalizedStore) {
173
+ return {
174
+ status: 'stopped',
175
+ code: 'shopify_extract_store_mismatch',
176
+ message: `${path.basename(recovered.file)} was read from ${recovered.manifest.store || 'an unrecorded store'}, not ${normalizedStore}. Nothing was read or changed.`,
177
+ details: { recorded: recovered.manifest.store || null, store: normalizedStore },
178
+ };
179
+ }
180
+ archived = recovered.file;
181
+ previousSidecars = Array.isArray(recovered.manifest.sidecars) ? recovered.manifest.sidecars : [];
182
+ }
183
+ }
184
+ giftCards.registerGiftCardHandlers(bulk);
185
+ const snapshotTime = existing && existing.snapshotTime ? existing.snapshotTime : new Date(now()).toISOString();
186
+ const probeState = await protectedFields.readProbeState(projectDir);
187
+ const protectedOptions = protectedFields.createBulkOptions({ projectDir, sessionCheck, probeState });
188
+ const project = protectedOptions.project;
189
+ // Texts are only used for a new manifest; a resumed one keeps what each query was last sent.
190
+ const queries = existing ? null : bulk.QUERY_NAMES.map((name) => ({ name, entity: bulk.entityOf(name), text: bulk.generateQueryText(name, { snapshotTime, project }) }));
191
+ const suppliedHandlers = runnerOptions.handlers || {};
192
+ const handlers = {
193
+ ...protectedOptions.handlers,
194
+ ...suppliedHandlers,
195
+ failed: { ...(protectedOptions.handlers.failed || {}), ...(suppliedHandlers.failed || {}), byQuery: { ...((protectedOptions.handlers.failed || {}).byQuery || {}), ...((suppliedHandlers.failed || {}).byQuery || {}) } },
196
+ reassemble: { ...(protectedOptions.handlers.reassemble || {}), ...(suppliedHandlers.reassemble || {}) },
197
+ };
198
+ const { handlers: _ignoredHandlers, deniedReset: suppliedDeniedReset, ...remainingRunnerOptions } = runnerOptions;
199
+ const runner = bulk.createBulkRunner({
200
+ projectDir,
201
+ store: normalizedStore,
202
+ caller: 'extract',
203
+ manifestPath,
204
+ stagingDir,
205
+ outputDir,
206
+ queries,
207
+ snapshotTime,
208
+ execute,
209
+ retryFailed,
210
+ previousSidecars,
211
+ sessionCheck,
212
+ handlers,
213
+ deniedReset: suppliedDeniedReset || protectedOptions.deniedReset,
214
+ now,
215
+ ...remainingRunnerOptions,
216
+ });
217
+ const result = await runner.run();
218
+ return { ...result, ...(archived ? { archived: path.relative(projectDir, archived) } : {}) };
219
+ }
220
+
221
+ function print(value) {
222
+ process.stdout.write(`${JSON.stringify(value)}\n`);
223
+ }
224
+
225
+ async function main(argv = process.argv.slice(2)) {
226
+ const parsed = parseProgressArgs(argv);
227
+ const logger = createProgressLogger({ script: 'skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js', ...parsed.progress });
228
+ let args;
229
+ try {
230
+ args = parseArgs(parsed.args);
231
+ } catch (error) {
232
+ process.stderr.write(`${error.message}\n${USAGE}`);
233
+ return 1;
234
+ }
235
+ if (args.help) { process.stdout.write(USAGE); return 0; }
236
+ if (!args.project) { process.stderr.write(USAGE); return 1; }
237
+ const projectDir = path.resolve(args.project);
238
+ logger.start('Shopify extract started', { phase: 'execution' });
239
+ try {
240
+ const store = session.normalizeDomain(args.store || await configuredDomain(projectDir));
241
+ // The extract starts only after a passing session check for this store, approved from a
242
+ // confirmed dedicated migration staff account.
243
+ await session.assertConnectionReady(projectDir, store);
244
+ const execute = createStoreExecutor({ store });
245
+ const result = await runExtract({
246
+ projectDir,
247
+ store,
248
+ execute,
249
+ retryFailed: args.retryFailed,
250
+ catchUp: args.catchUp,
251
+ progress: (message, fields) => logger.progress(message, { phase: 'execution', ...fields }),
252
+ });
253
+ const ok = result.status === 'complete';
254
+ print({
255
+ ok,
256
+ status: result.status,
257
+ ...(result.code ? { code: result.code, message: result.message } : {}),
258
+ ...(result.details && result.details.requestIds ? { requestIds: result.details.requestIds } : {}),
259
+ ...(result.archived ? { archived: result.archived } : {}),
260
+ ...(result.skipped ? { skipped: true } : {}),
261
+ manifest: `${bulk.RAW_EXTRACT_DIR}/${bulk.EXTRACT_MANIFEST_FILE}`,
262
+ });
263
+ logger.complete(`Shopify extract ${result.status}`, { phase: 'execution' });
264
+ if (ok) return 0;
265
+ return result.status === 'awaiting_user_action' ? 3 : 2;
266
+ } catch (error) {
267
+ if (error instanceof session.ShopifySessionStop || error instanceof ShopifyCliError) {
268
+ print({ ok: false, status: 'stopped', code: error.code, message: error.message });
269
+ logger.error(error.message, { phase: 'execution' });
270
+ return 2;
271
+ }
272
+ throw error;
273
+ }
274
+ }
275
+
276
+ if (require.main === module) {
277
+ main().then((code) => { process.exitCode = code; }).catch((error) => {
278
+ process.stderr.write(`${error.stack || error.message}\n`);
279
+ process.exitCode = 1;
280
+ });
281
+ }
282
+
283
+ module.exports = { main, parseArgs, runExtract, archiveCompleteManifest, defaultSessionCheck };
@@ -0,0 +1,191 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ // Record merchant-provided gift-card remedies and export the current owed-card list.
5
+ // This script never creates a Wix card and never contacts a holder.
6
+
7
+ const fs = require('node:fs/promises');
8
+ const path = require('node:path');
9
+ const { readEnvFile } = require('../../../lib/config-env.js');
10
+ const { SHOPIFY_SOURCE_ENV } = require('../../../lib/source-access.js');
11
+ const { writeJsonAtomic } = require('../../../lib/source-coverage.js');
12
+ const { createStoreExecutor } = require('../lib/shopify-cli.js');
13
+ const session = require('../lib/shopify-session.js');
14
+ const gift = require('../lib/shopify-gift-cards.js');
15
+
16
+ const COLUMNS = Object.freeze(['id', 'wixGiftCardId', 'replacementAmount', 'currency', 'holderNotifiedOn', 'notificationConfirmedBy']);
17
+ const USAGE = 'Usage: shopify-gift-card-remedy.js <export|activity-stopped|record-replacements|keep-redeeming> --project <project> [--at <ISO> | --evidence <file.csv> | --until <YYYY-MM-DD>] [--by <name>]\n';
18
+
19
+ function parseArgs(argv) {
20
+ const out = { command: argv[0] || null, project: null, at: null, evidence: null, until: null, by: null, help: false };
21
+ for (let i = 1; i < argv.length; i += 1) {
22
+ const arg = argv[i];
23
+ if (arg === '--help' || arg === '-h') out.help = true;
24
+ else if (['--project', '--at', '--evidence', '--until', '--by'].includes(arg)) { out[arg.slice(2)] = argv[i + 1]; i += 1; }
25
+ else throw new Error(`unknown argument ${arg}`);
26
+ }
27
+ return out;
28
+ }
29
+
30
+ function parseCsv(text) {
31
+ const rows = [];
32
+ let row = [];
33
+ let field = '';
34
+ let quoted = false;
35
+ for (let i = 0; i < text.length; i += 1) {
36
+ const ch = text[i];
37
+ if (quoted) {
38
+ if (ch === '"' && text[i + 1] === '"') { field += '"'; i += 1; }
39
+ else if (ch === '"') quoted = false;
40
+ else field += ch;
41
+ } else if (ch === '"') quoted = true;
42
+ else if (ch === ',') { row.push(field); field = ''; }
43
+ else if (ch === '\n') { row.push(field.replace(/\r$/, '')); rows.push(row); row = []; field = ''; }
44
+ else field += ch;
45
+ }
46
+ if (quoted) throw new Error('CSV has an unterminated quoted field');
47
+ if (field.length || row.length) { row.push(field.replace(/\r$/, '')); rows.push(row); }
48
+ return rows.filter((entry) => entry.some((value) => value !== ''));
49
+ }
50
+
51
+ function validDate(value) {
52
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(String(value || ''))) return false;
53
+ const date = new Date(`${value}T00:00:00.000Z`);
54
+ return Number.isFinite(date.getTime()) && date.toISOString().slice(0, 10) === value;
55
+ }
56
+
57
+ function csvCell(value) {
58
+ const text = value === null || value === undefined ? '' : String(value);
59
+ return /[",\r\n]/.test(text) ? `"${text.replace(/"/g, '""')}"` : text;
60
+ }
61
+
62
+ async function readRemedy(projectDir) {
63
+ return gift.readJson(path.join(projectDir, gift.REMEDY_FILE), { replacements: [] });
64
+ }
65
+
66
+ async function writeRemedy(projectDir, value) {
67
+ await writeJsonAtomic(path.join(projectDir, gift.REMEDY_FILE), value);
68
+ }
69
+
70
+ async function recordActivityStopped(projectDir, { at, by, now = () => new Date().toISOString() } = {}) {
71
+ if (!Number.isFinite(Date.parse(at))) throw new Error('--at must be an ISO timestamp');
72
+ if (!by) throw new Error('--by is required');
73
+ const record = { activityStoppedAt: new Date(at).toISOString(), recordedBy: by, recordedAt: now() };
74
+ await writeJsonAtomic(path.join(projectDir, gift.ACTIVITY_FILE), record);
75
+ return record;
76
+ }
77
+
78
+ async function shopTimezone(execute) {
79
+ const result = await execute('query RpGiftCardShopTimezone { shop { ianaTimezone } }');
80
+ if (result.errors && result.errors.length) throw new Error(`Shopify shop timezone could not be read: ${result.errors.map((error) => error.message).join('; ')}`);
81
+ const timezone = result.data && result.data.shop && result.data.shop.ianaTimezone;
82
+ if (typeof timezone !== 'string' || !timezone) throw new Error('Shopify shop timezone was missing');
83
+ // Make Intl validate the IANA identifier now, before changing any file.
84
+ gift.dateInTimezone(new Date(), timezone);
85
+ return timezone;
86
+ }
87
+
88
+ async function recordReplacements(projectDir, { evidence, by, execute, now = () => new Date().toISOString() } = {}) {
89
+ if (!evidence) throw new Error('--evidence is required');
90
+ if (!by) throw new Error('--by is required');
91
+ if (typeof execute !== 'function') throw new Error('a Shopify executor is required');
92
+ const timezone = await shopTimezone(execute);
93
+ const today = gift.dateInTimezone(new Date(now()), timezone);
94
+ const rows = parseCsv(await fs.readFile(evidence, 'utf8'));
95
+ if (!rows.length || rows[0].length !== COLUMNS.length || !rows[0].every((value, index) => value === COLUMNS[index])) {
96
+ throw new Error(`CSV columns must be exactly ${COLUMNS.join(',')}`);
97
+ }
98
+ const { latest } = await gift.giftCardReads(projectDir);
99
+ if (!latest) throw new Error('no successful gift-card read exists');
100
+ const cards = new Map(gift.summarizeCards(latest.cards).owed.map((card) => [card.id, card]));
101
+ const seen = new Set();
102
+ const replacements = [];
103
+ for (let index = 1; index < rows.length; index += 1) {
104
+ if (rows[index].length !== COLUMNS.length) throw new Error(`CSV row ${index + 1} has ${rows[index].length} columns, expected ${COLUMNS.length}`);
105
+ const candidate = Object.fromEntries(COLUMNS.map((column, at) => [column, rows[index][at]]));
106
+ const card = cards.get(candidate.id);
107
+ if (!card) throw new Error(`CSV row ${index + 1}: id is not an owed card in the latest read`);
108
+ if (seen.has(candidate.id)) throw new Error(`CSV row ${index + 1}: duplicate id ${candidate.id}`);
109
+ seen.add(candidate.id);
110
+ if (!candidate.wixGiftCardId || !candidate.holderNotifiedOn || !candidate.notificationConfirmedBy) throw new Error(`CSV row ${index + 1}: Wix card id and holder-notification evidence are required`);
111
+ if (!validDate(candidate.holderNotifiedOn) || candidate.holderNotifiedOn > today) throw new Error(`CSV row ${index + 1}: holderNotifiedOn must be a valid date no later than today in ${timezone}`);
112
+ const amount = gift.decimal(candidate.replacementAmount);
113
+ if (amount.units <= 0n) throw new Error(`CSV row ${index + 1}: replacementAmount must be above zero`);
114
+ if (candidate.currency !== card.balance.currencyCode) throw new Error(`CSV row ${index + 1}: currency must be ${card.balance.currencyCode}`);
115
+ replacements.push({ ...candidate, recordedBy: by, recordedAt: now() });
116
+ }
117
+ if (!replacements.length) throw new Error('CSV must contain at least one owed-card replacement');
118
+ const remedy = await readRemedy(projectDir);
119
+ const merged = new Map(((remedy && remedy.replacements) || []).map((row) => [row.id, row]));
120
+ replacements.forEach((row) => merged.set(row.id, row));
121
+ const next = { ...remedy, ianaTimezone: timezone, replacements: [...merged.values()].sort((a, b) => a.id.localeCompare(b.id)) };
122
+ await writeRemedy(projectDir, next);
123
+ return next;
124
+ }
125
+
126
+ async function keepRedeeming(projectDir, { until, by, execute, now = () => new Date().toISOString() } = {}) {
127
+ if (!validDate(until)) throw new Error('--until must be a YYYY-MM-DD calendar date');
128
+ if (!by) throw new Error('--by is required');
129
+ if (typeof execute !== 'function') throw new Error('a Shopify executor is required');
130
+ const timezone = await shopTimezone(execute);
131
+ const remedy = await readRemedy(projectDir);
132
+ const next = { ...remedy, replacements: Array.isArray(remedy.replacements) ? remedy.replacements : [], keepRedeemingUntil: until, keepRedeemingRecordedBy: by, keepRedeemingRecordedAt: now(), ianaTimezone: timezone };
133
+ await writeRemedy(projectDir, next);
134
+ return next;
135
+ }
136
+
137
+ async function exportOwed(projectDir) {
138
+ const { latest } = await gift.giftCardReads(projectDir);
139
+ if (!latest) throw new Error('no successful gift-card read exists');
140
+ const summary = gift.summarizeCards(latest.cards);
141
+ const state = await gift.evaluateGiftCardCutover(projectDir);
142
+ const uncleared = new Set((state.uncleared || summary.owed).map((card) => card.id));
143
+ const lines = [['id', 'lastCharacters', 'balance', 'currency', 'enabled', 'expiresOn', 'replaced']];
144
+ for (const card of summary.owed) {
145
+ const replaced = state.finalRead && !uncleared.has(card.id) ? 'yes' : 'no';
146
+ lines.push([card.id, card.lastCharacters || '', card.balance.amount, card.balance.currencyCode, card.enabled ? 'true' : 'false', card.expiresOn || '', replaced]);
147
+ }
148
+ const text = `${lines.map((row) => row.map(csvCell).join(',')).join('\n')}\n`;
149
+ const file = path.join(projectDir, gift.OWED_CSV_FILE);
150
+ await fs.mkdir(path.dirname(file), { recursive: true });
151
+ const temp = `${file}.${process.pid}.${Date.now()}.tmp`;
152
+ await fs.writeFile(temp, text, 'utf8');
153
+ await fs.rename(temp, file);
154
+ return { file: gift.OWED_CSV_FILE, rows: summary.owed.length };
155
+ }
156
+
157
+ async function configuredStore(projectDir) {
158
+ const values = await readEnvFile(path.join(projectDir, SHOPIFY_SOURCE_ENV));
159
+ if (!values.SHOPIFY_SHOP_DOMAIN) throw new Error(`SHOPIFY_SHOP_DOMAIN is missing from ${SHOPIFY_SOURCE_ENV}`);
160
+ return session.normalizeDomain(values.SHOPIFY_SHOP_DOMAIN);
161
+ }
162
+
163
+ async function main(argv = process.argv.slice(2)) {
164
+ let args;
165
+ try { args = parseArgs(argv); } catch (error) { process.stderr.write(`${error.message}\n${USAGE}`); return 1; }
166
+ if (args.help) { process.stdout.write(USAGE); return 0; }
167
+ if (!args.project || !['export', 'activity-stopped', 'record-replacements', 'keep-redeeming'].includes(args.command)) { process.stderr.write(USAGE); return 1; }
168
+ const projectDir = path.resolve(args.project);
169
+ try {
170
+ let result;
171
+ if (args.command === 'export') result = await exportOwed(projectDir);
172
+ else if (args.command === 'activity-stopped') result = await recordActivityStopped(projectDir, args);
173
+ else {
174
+ const store = await configuredStore(projectDir);
175
+ await session.assertConnectionReady(projectDir, store);
176
+ const execute = createStoreExecutor({ store });
177
+ result = args.command === 'record-replacements'
178
+ ? await recordReplacements(projectDir, { ...args, execute })
179
+ : await keepRedeeming(projectDir, { ...args, execute });
180
+ }
181
+ process.stdout.write(`${JSON.stringify({ ok: true, command: args.command, ...result })}\n`);
182
+ return 0;
183
+ } catch (error) {
184
+ process.stdout.write(`${JSON.stringify({ ok: false, command: args.command, code: error.code || 'shopify_gift_card_remedy_invalid', message: error.message })}\n`);
185
+ return 2;
186
+ }
187
+ }
188
+
189
+ if (require.main === module) main().then((code) => { process.exitCode = code; }).catch((error) => { process.stderr.write(`${error.stack || error.message}\n`); process.exitCode = 1; });
190
+
191
+ module.exports = { COLUMNS, parseArgs, parseCsv, validDate, csvCell, recordActivityStopped, shopTimezone, recordReplacements, keepRedeeming, exportOwed, main };
@@ -0,0 +1,115 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ // The Shopify session check. Run from rp-source-shopify:
5
+ //
6
+ // node scripts/shopify-session-check.js --project <migrations-root>/<project> [--install] [--connect]
7
+ // node scripts/shopify-session-check.js --project <dir> --confirm-staff-removal owner-removed-account
8
+ // node scripts/shopify-session-check.js --project <dir> --repair-staff-access
9
+ //
10
+ // The store is SHOPIFY_SHOP_DOMAIN in config/source.shopify.env.
11
+ //
12
+ // (no flag) Node.js >= 22.12, the adapter's CLI 4.8.3, the connection, the scope readback and
13
+ // the API-version canary; writes data/shopify-discovery/session-receipt.json.
14
+ // --install the operator consents to installing (or reinstalling) the adapter's own CLI 4.8.3
15
+ // into ~/.replatform/tools; nothing is installed without it.
16
+ // --connect starts the browser approval (`store auth` with the derived scope list) through the
17
+ // adapter's CLI with self-update off, then runs the check. Never type a bare
18
+ // `shopify store auth`: that process would run without CI and could upgrade a
19
+ // machine-wide Shopify CLI.
20
+ //
21
+ // Exit codes: 0 the check passed and the connection is confirmed as a dedicated migration staff
22
+ // account; 3 the first-connection question is pending (answer it, then run again); 2 stopped (the
23
+ // printed code says why; also every refused confirmation or repair); 1 usage error.
24
+
25
+ const path = require('node:path');
26
+ const { readEnvFile } = require('../../../lib/config-env.js');
27
+ const { SHOPIFY_SOURCE_ENV } = require('../../../lib/source-access.js');
28
+ const { ShopifyCliError } = require('../lib/shopify-cli.js');
29
+ const session = require('../lib/shopify-session.js');
30
+
31
+ const USAGE = 'Usage: shopify-session-check.js --project <migrations-root>/<project> [--install] [--connect] | --confirm-staff-removal owner-removed-account | --repair-staff-access\n';
32
+
33
+ function parseArgs(argv) {
34
+ const args = { project: null, install: false, connect: false, confirm: null, repair: false, help: false };
35
+ for (let i = 0; i < argv.length; i += 1) {
36
+ const arg = argv[i];
37
+ if (arg === '--help' || arg === '-h') args.help = true;
38
+ else if (arg === '--project') { args.project = argv[i + 1]; i += 1; }
39
+ else if (arg === '--install') args.install = true;
40
+ else if (arg === '--connect') args.connect = true;
41
+ else if (arg === '--confirm-staff-removal') { args.confirm = argv[i + 1] || ''; i += 1; }
42
+ else if (arg === '--repair-staff-access') args.repair = true;
43
+ else throw new Error(`unknown argument ${arg}`);
44
+ }
45
+ if ((args.confirm !== null) + args.repair > 1) throw new Error('--confirm-staff-removal and --repair-staff-access are separate commands');
46
+ return args;
47
+ }
48
+
49
+ async function configuredDomain(projectDir) {
50
+ let values;
51
+ try {
52
+ values = await readEnvFile(path.join(projectDir, SHOPIFY_SOURCE_ENV));
53
+ } catch (error) {
54
+ if (error.code === 'ENOENT') throw new session.ShopifySessionStop('shopify_shop_domain_missing', `${SHOPIFY_SOURCE_ENV} is missing; record SHOPIFY_SHOP_DOMAIN=<shop>.myshopify.com there.`);
55
+ throw error;
56
+ }
57
+ if (!values.SHOPIFY_SHOP_DOMAIN) throw new session.ShopifySessionStop('shopify_shop_domain_missing', `SHOPIFY_SHOP_DOMAIN is missing from ${SHOPIFY_SOURCE_ENV}.`);
58
+ return session.normalizeDomain(values.SHOPIFY_SHOP_DOMAIN);
59
+ }
60
+
61
+ function print(value) {
62
+ process.stdout.write(`${JSON.stringify(value)}\n`);
63
+ }
64
+
65
+ async function main(argv = process.argv.slice(2), options = {}) {
66
+ let args;
67
+ try {
68
+ args = parseArgs(argv);
69
+ } catch (error) {
70
+ process.stderr.write(`${error.message}\n${USAGE}`);
71
+ return 1;
72
+ }
73
+ if (args.help) { process.stdout.write(USAGE); return 0; }
74
+ if (!args.project) { process.stderr.write(USAGE); return 1; }
75
+ const projectDir = path.resolve(args.project);
76
+ try {
77
+ const domain = await configuredDomain(projectDir);
78
+ if (args.confirm !== null) {
79
+ const entry = session.confirmStaffRemoval(projectDir, domain, args.confirm);
80
+ print({ ok: true, status: 'staff_removal_confirmed', shopDomain: entry.shopDomain, confirmedAt: entry.confirmedAt });
81
+ return 0;
82
+ }
83
+ if (args.repair) {
84
+ const result = await session.repairStaffAccess(projectDir, domain);
85
+ print({ ok: true, status: result.changed ? 'staff_record_rebuilt' : 'staff_record_unchanged', ...(result.setAside ? { setAside: path.relative(projectDir, result.setAside) } : {}) });
86
+ return 0;
87
+ }
88
+ const result = await session.runSessionCheck({ projectDir, store: domain, install: args.install, connect: args.connect, ...options });
89
+ const confirmed = result.firstConnection.answer === 'dedicated-account';
90
+ print({
91
+ ok: true,
92
+ status: confirmed ? 'passed' : 'awaiting_user_action',
93
+ receipt: 'data/shopify-discovery/session-receipt.json',
94
+ shopDomain: result.receipt.shopDomain,
95
+ grantedScopes: result.receipt.grantedScopes,
96
+ ...(confirmed ? {} : { requestId: result.firstConnection.requestId, message: 'Discovery does not start until the first-connection question is answered dedicated-account.' }),
97
+ });
98
+ return confirmed ? 0 : 3;
99
+ } catch (error) {
100
+ if (error instanceof session.ShopifySessionStop || error instanceof ShopifyCliError) {
101
+ print({ ok: false, status: 'stopped', code: error.code, message: error.message, ...(error.details && error.details.missingScopes ? { missingScopes: error.details.missingScopes } : {}) });
102
+ return 2;
103
+ }
104
+ throw error;
105
+ }
106
+ }
107
+
108
+ if (require.main === module) {
109
+ main().then((code) => { process.exitCode = code; }).catch((error) => {
110
+ process.stderr.write(`${error.stack || error.message}\n`);
111
+ process.exitCode = 1;
112
+ });
113
+ }
114
+
115
+ module.exports = { main, parseArgs };