@wix/agent-skills 1.33.1 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (619) hide show
  1. package/README.md +3 -0
  2. package/package.json +1 -1
  3. package/skills/wix-export/SKILL.md +83 -0
  4. package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
  5. package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
  6. package/skills/wix-harmony-editor/SKILL.md +317 -0
  7. package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
  8. package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
  9. package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
  10. package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
  11. package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
  12. package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
  13. package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
  14. package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
  15. package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
  16. package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
  17. package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
  18. package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
  19. package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
  20. package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
  21. package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
  22. package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
  23. package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
  24. package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
  25. package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
  26. package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
  27. package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
  28. package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
  29. package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
  30. package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
  31. package/skills/wix-headless/SKILL.md +7 -2
  32. package/skills/wix-headless/references/CAPABILITIES.md +6 -1
  33. package/skills/wix-headless/references/DISCOVERY.md +2 -1
  34. package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
  35. package/skills/wix-headless/references/SEED.md +3 -2
  36. package/skills/wix-headless/references/SETUP.md +1 -0
  37. package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
  38. package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
  39. package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
  40. package/skills/wix-headless/references/managed/CREATE.md +1 -1
  41. package/skills/wix-headless-kit/SKILL.md +110 -21
  42. package/skills/wix-headless-kit/guides/api-run.md +15 -13
  43. package/skills/wix-headless-kit/guides/existing-site.md +31 -0
  44. package/skills/wix-headless-kit/guides/migration.md +49 -17
  45. package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
  46. package/skills/wix-headless-kit/install/context.mjs +61 -6
  47. package/skills/wix-headless-kit/install/pins.json +1 -1
  48. package/skills/wix-headless-kit/install/setup.mjs +107 -12
  49. package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
  50. package/skills/wix-headless-replatform/SKILL.md +116 -0
  51. package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
  52. package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
  53. package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
  54. package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
  55. package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
  56. package/skills/wix-headless-replatform/references/output-contract.md +93 -0
  57. package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
  58. package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
  59. package/skills/wix-headless-replatform/references/safety.md +19 -0
  60. package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
  61. package/skills/wix-headless-replatform/references/workflow.md +157 -0
  62. package/skills/wix-headless-replatform/registry/README.md +20 -0
  63. package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
  64. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
  65. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
  66. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
  67. package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
  68. package/skills/wix-headless-replatform/registry/registry.json +36 -0
  69. package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
  70. package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
  71. package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
  72. package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
  73. package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
  74. package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
  75. package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
  76. package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
  77. package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
  78. package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
  79. package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
  80. package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
  81. package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
  82. package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
  83. package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
  84. package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
  85. package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
  86. package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
  87. package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
  88. package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
  89. package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
  90. package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
  91. package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
  92. package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
  93. package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
  94. package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
  95. package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
  96. package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
  97. package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
  98. package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
  99. package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
  100. package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
  101. package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
  102. package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
  103. package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
  104. package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
  105. package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
  106. package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
  107. package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
  108. package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
  109. package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
  110. package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
  111. package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
  112. package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
  113. package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
  114. package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
  115. package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
  116. package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
  117. package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
  118. package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
  119. package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
  120. package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
  121. package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
  122. package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
  123. package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
  124. package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
  125. package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
  126. package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
  127. package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
  128. package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
  129. package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
  130. package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
  131. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
  132. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
  133. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
  134. package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
  135. package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
  136. package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
  137. package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
  138. package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
  139. package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
  140. package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
  141. package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
  142. package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
  143. package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
  144. package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
  145. package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
  146. package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
  147. package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
  148. package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
  149. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
  150. package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
  151. package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
  152. package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
  153. package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
  154. package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
  155. package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
  156. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
  157. package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
  158. package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
  159. package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
  160. package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
  161. package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
  162. package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
  163. package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
  164. package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
  165. package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
  166. package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
  167. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
  168. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
  169. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
  170. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
  171. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
  172. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
  173. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
  174. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
  175. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
  176. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
  177. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
  178. package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
  179. package/skills/wix-import/SKILL.md +90 -0
  180. package/skills/wix-manage/SKILL.md +14 -4
  181. package/skills/wix-manage/references/blog/how-to-create-blog-posts.md +2 -0
  182. package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
  183. package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
  184. package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
  185. package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
  186. package/skills/wix-manage/references/seo/manage-content-plan.md +207 -222
  187. package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
  188. package/skills/wix-manage/references/sites/upload-static-site.md +128 -8
  189. package/skills/wix-readme/SKILL.md +166 -0
  190. package/skills/wix-replatform/.publish-manifest.json +5 -5
  191. package/skills/wix-replatform/CLI.md +162 -0
  192. package/skills/wix-replatform/README.md +52 -0
  193. package/skills/wix-replatform/SKILL.md +229 -684
  194. package/skills/wix-replatform/console/account.css +1 -0
  195. package/skills/wix-replatform/console/app.css +1 -0
  196. package/skills/wix-replatform/console/app.js +117 -0
  197. package/skills/wix-replatform/console/index.html +4 -0
  198. package/skills/wix-replatform/console/json.css +11 -0
  199. package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
  200. package/skills/wix-replatform/lib/app-page-routing.js +75 -0
  201. package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
  202. package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
  203. package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
  204. package/skills/wix-replatform/lib/completion-report.js +1393 -13
  205. package/skills/wix-replatform/lib/config-env.js +85 -11
  206. package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
  207. package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
  208. package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
  209. package/skills/wix-replatform/lib/destination-choice.js +163 -0
  210. package/skills/wix-replatform/lib/destination-handoff.js +62 -0
  211. package/skills/wix-replatform/lib/destination-http.js +81 -0
  212. package/skills/wix-replatform/lib/destination-route.js +98 -0
  213. package/skills/wix-replatform/lib/destination.js +919 -0
  214. package/skills/wix-replatform/lib/discovered-census.js +231 -0
  215. package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
  216. package/skills/wix-replatform/lib/document-url-guard.js +203 -0
  217. package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
  218. package/skills/wix-replatform/lib/entity-verification.js +18 -0
  219. package/skills/wix-replatform/lib/execution-capability.js +120 -0
  220. package/skills/wix-replatform/lib/execution-log.js +170 -0
  221. package/skills/wix-replatform/lib/execution-manifest.js +20 -2
  222. package/skills/wix-replatform/lib/execution-state.js +22 -0
  223. package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
  224. package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
  225. package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
  226. package/skills/wix-replatform/lib/import-recovery.js +800 -6
  227. package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
  228. package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
  229. package/skills/wix-replatform/lib/link-audit.js +173 -0
  230. package/skills/wix-replatform/lib/link-census.js +194 -0
  231. package/skills/wix-replatform/lib/link-plan.js +148 -0
  232. package/skills/wix-replatform/lib/link-verification.js +274 -0
  233. package/skills/wix-replatform/lib/link-write-journal.js +42 -0
  234. package/skills/wix-replatform/lib/local-state.js +869 -30
  235. package/skills/wix-replatform/lib/member-completion.js +658 -0
  236. package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
  237. package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
  238. package/skills/wix-replatform/lib/migration-completion.js +311 -0
  239. package/skills/wix-replatform/lib/operator-identity.js +47 -0
  240. package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
  241. package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
  242. package/skills/wix-replatform/lib/orchestration-router.js +608 -32
  243. package/skills/wix-replatform/lib/orchestration-state.js +188 -12
  244. package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
  245. package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
  246. package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
  247. package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
  248. package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
  249. package/skills/wix-replatform/lib/progress-log.js +19 -3
  250. package/skills/wix-replatform/lib/read-back-approval.js +184 -0
  251. package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
  252. package/skills/wix-replatform/lib/read-back-contract.js +243 -0
  253. package/skills/wix-replatform/lib/read-back-extract.js +118 -0
  254. package/skills/wix-replatform/lib/read-back-gate.js +734 -0
  255. package/skills/wix-replatform/lib/read-back-reads.js +94 -0
  256. package/skills/wix-replatform/lib/read-back-state.js +107 -0
  257. package/skills/wix-replatform/lib/read-back-summary.js +81 -0
  258. package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
  259. package/skills/wix-replatform/lib/run-controller.js +401 -0
  260. package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
  261. package/skills/wix-replatform/lib/setup-verification.js +148 -0
  262. package/skills/wix-replatform/lib/source-access.js +231 -0
  263. package/skills/wix-replatform/lib/source-coverage.js +1130 -0
  264. package/skills/wix-replatform/lib/source-secrets.js +277 -0
  265. package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
  266. package/skills/wix-replatform/lib/task-state.js +110 -0
  267. package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
  268. package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
  269. package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
  270. package/skills/wix-replatform/lib/url-verification.js +315 -0
  271. package/skills/wix-replatform/lib/user-action-effects.js +42 -0
  272. package/skills/wix-replatform/lib/user-actions.js +264 -0
  273. package/skills/wix-replatform/lib/website-handoff.js +1220 -0
  274. package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
  275. package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
  276. package/skills/wix-replatform/lib/write-verification-state.js +92 -0
  277. package/skills/wix-replatform/lib/write-verification.js +274 -0
  278. package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
  279. package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
  280. package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
  281. package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
  282. package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
  283. package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
  284. package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
  285. package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
  286. package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
  287. package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
  288. package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
  289. package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
  290. package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
  291. package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
  292. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
  293. package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
  294. package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
  295. package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
  296. package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
  297. package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
  298. package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
  299. package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
  300. package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
  301. package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
  302. package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
  303. package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
  304. package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
  305. package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
  306. package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
  307. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
  308. package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
  309. package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
  310. package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
  311. package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
  312. package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
  313. package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
  314. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
  315. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
  316. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
  317. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
  318. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
  319. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
  320. package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
  321. package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
  322. package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
  323. package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
  324. package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
  325. package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
  326. package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
  327. package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
  328. package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
  329. package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
  330. package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
  331. package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
  332. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
  333. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
  334. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
  335. package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
  336. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
  337. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
  338. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
  339. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
  340. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
  341. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
  342. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
  343. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
  344. package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
  345. package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
  346. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
  347. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
  348. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
  349. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
  350. package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
  351. package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
  352. package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
  353. package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
  354. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
  355. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
  356. package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
  357. package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
  358. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
  359. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
  360. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
  361. package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
  362. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
  363. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
  364. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
  365. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
  366. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
  367. package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
  368. package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
  369. package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
  370. package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
  371. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
  372. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
  373. package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
  374. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
  375. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
  376. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
  377. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
  378. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
  379. package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
  380. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
  381. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
  382. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
  383. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
  384. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
  385. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
  386. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
  387. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
  388. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
  389. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
  390. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
  391. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
  392. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
  393. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
  394. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
  395. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
  396. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
  397. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
  398. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
  399. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
  400. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
  401. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
  402. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
  403. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
  404. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
  405. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
  406. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
  407. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
  408. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
  409. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
  410. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
  411. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
  412. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
  413. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
  414. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
  415. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
  416. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
  417. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
  418. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
  419. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
  420. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
  421. package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
  422. package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
  423. package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
  424. package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
  425. package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
  426. package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
  427. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
  428. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
  429. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
  430. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
  431. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
  432. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
  433. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
  434. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
  435. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
  436. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
  437. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
  438. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
  439. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
  440. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
  441. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
  442. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
  443. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
  444. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
  445. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
  446. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
  447. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
  448. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
  449. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
  450. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
  451. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
  452. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
  453. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
  454. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
  455. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
  456. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
  457. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
  458. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
  459. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
  460. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
  461. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
  462. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
  463. package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
  464. package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
  465. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
  466. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
  467. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
  468. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
  469. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
  470. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
  471. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
  472. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
  473. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
  474. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
  475. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
  476. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
  477. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
  478. package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
  479. package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
  480. package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
  481. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
  482. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
  483. package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
  484. package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
  485. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
  486. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
  487. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
  488. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
  489. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
  490. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
  491. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
  492. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
  493. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
  494. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
  495. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
  496. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
  497. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
  498. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
  499. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
  500. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
  501. package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
  502. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
  503. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
  504. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
  505. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
  506. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
  507. package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
  508. package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
  509. package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
  510. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
  511. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
  512. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
  513. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
  514. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
  515. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
  516. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
  517. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
  518. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
  519. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
  520. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
  521. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
  522. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
  523. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
  524. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
  525. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
  526. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
  527. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
  528. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
  529. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
  530. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
  531. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
  532. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
  533. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
  534. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
  535. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
  536. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
  537. package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
  538. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
  539. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
  540. package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
  541. package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
  542. package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
  543. package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
  544. package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
  545. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
  546. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
  547. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
  548. package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
  549. package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
  550. package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
  551. package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
  552. package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
  553. package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
  554. package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
  555. package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
  556. package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
  557. package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
  558. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
  559. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
  560. package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
  561. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
  562. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
  563. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
  564. package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
  565. package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
  566. package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
  567. package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
  568. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
  569. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
  570. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
  571. package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
  572. package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
  573. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
  574. package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
  575. package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
  576. package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
  577. package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
  578. package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
  579. package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
  580. package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
  581. package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
  582. package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
  583. package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
  584. package/skills/wix-replatform/scripts/discovered-census.js +26 -0
  585. package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
  586. package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
  587. package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
  588. package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
  589. package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
  590. package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
  591. package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
  592. package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
  593. package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
  594. package/skills/wix-replatform/scripts/migration-completion.js +76 -0
  595. package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
  596. package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
  597. package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
  598. package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
  599. package/skills/wix-replatform/scripts/replatform-console.js +146 -0
  600. package/skills/wix-replatform/scripts/replatform.js +436 -0
  601. package/skills/wix-replatform/scripts/source-secrets.js +77 -0
  602. package/skills/wix-replatform/scripts/url-redirects.js +286 -0
  603. package/skills/wix-replatform/scripts/user-action.js +58 -0
  604. package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
  605. package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
  606. package/skills/wix-replatform/scripts/wix-destination.js +143 -0
  607. package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
  608. package/skills/wix-vibe-headless/SKILL.md +7 -3
  609. package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
  610. package/skills/wix-vibe-headless/platforms/base44.md +1 -0
  611. package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
  612. package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
  613. package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
  614. package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
  615. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
  616. package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
  617. package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
  618. package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
  619. package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
@@ -1,7 +1,7 @@
1
1
  // The hosted checkout's thank-you island — wire as-is on /donate/thank-you (mount client:only: it
2
2
  // reads the browser URL). It owns the honesty rules: landing here with `?orderId=` is Wix's
3
3
  // success redirect, so it thanks the donor; the order's facts (name, amount, order number, paid or
4
- // pending) appear only when the order could be read; a direct visit with no order id gets a neutral
4
+ // unconfirmed) appear only when the order could be read; a direct visit with no order id gets a neutral
5
5
  // thank-you and a link back — never an invented receipt, never "paid" unless the order says PAID.
6
6
  import { useDonationReceipt } from "../../hooks/donations/useDonationReceipt";
7
7
 
@@ -17,7 +17,8 @@ export default function DonationReceipt({ campaignsHref = "/donate", className =
17
17
  if (!orderId) {
18
18
  return (
19
19
  <div className={className}>
20
- <h1 className="text-2xl font-semibold tracking-tight">Thank you for your support</h1>
20
+ <h1 className="text-2xl font-semibold tracking-tight">Your support matters</h1>
21
+ <p className="mt-3 text-sm text-muted-foreground">This page alone is not a payment confirmation. Explore a campaign to give, or check your checkout confirmation if you just returned.</p>
21
22
  <a href={campaignsHref} className="mt-6 inline-block text-sm text-foreground underline">
22
23
  See the campaigns
23
24
  </a>
@@ -29,15 +30,15 @@ export default function DonationReceipt({ campaignsHref = "/donate", className =
29
30
  <div className={className} aria-busy={loading}>
30
31
  {receipt?.orderNumber && <p className="eyebrow">Order {receipt.orderNumber}</p>}
31
32
  <h1 className="mt-2 text-2xl font-semibold tracking-tight">
32
- {receipt?.donorFirstName ? `Thank you, ${receipt.donorFirstName}` : "Thank you for your donation"}
33
+ {receipt?.donorFirstName ? `Thank you, ${receipt.donorFirstName}` : receipt ? "Thank you for your support" : loading ? "Checking your donation" : "Your support matters"}
33
34
  </h1>
34
35
  {receipt && (
35
36
  <p className="mt-3 text-sm text-muted-foreground">
36
37
  {receipt.amount ? `Your donation of ${receipt.amount} ` : "Your donation "}
37
- {receipt.paid ? "has been received." : "is being processed — payment is pending."}
38
+ {receipt.paid ? "has been received." : "is not confirmed as paid. Please check your checkout confirmation."}
38
39
  </p>
39
40
  )}
40
- {!receipt && !loading && <p className="mt-3 text-sm text-muted-foreground">Your donation has been submitted.</p>}
41
+ {!receipt && !loading && <p className="mt-3 text-sm text-muted-foreground">Donation details could not be verified here. If you completed checkout, check its confirmation before trying again.</p>}
41
42
  <a href={campaignsHref} className="mt-6 inline-block text-sm text-muted-foreground underline">
42
43
  Back to campaigns
43
44
  </a>
@@ -33,14 +33,14 @@ export default function GoalProgress({ goal, className = "", compact = false }:
33
33
  {goal.target}
34
34
  </span>
35
35
  </p>
36
- <p className="text-sm font-semibold text-foreground">{goal.percent}%</p>
36
+ {goal.raised && <p className="text-sm font-semibold text-foreground">{goal.percent}%</p>}
37
37
  </div>
38
- <div className="mt-2 h-2 w-full overflow-hidden rounded-control bg-secondary" role="progressbar" aria-valuemin={0} aria-valuemax={100} aria-valuenow={width} aria-label="Progress toward the goal">
38
+ {goal.raised && <div className="mt-2 h-2 w-full overflow-hidden rounded-control bg-secondary" role="progressbar" aria-valuemin={0} aria-valuemax={100} aria-valuenow={width} aria-label="Progress toward the goal">
39
39
  <div className="h-full rounded-control bg-primary transition-[width]" style={{ width: `${width}%` }} />
40
- </div>
41
- {(!compact || timeLeft) && (
40
+ </div>}
41
+ {((!compact && goal.raised) || timeLeft) && (
42
42
  <p className="mt-2 flex justify-between text-xs text-muted-foreground">
43
- {!compact && <span>{goal.donationCount === 1 ? "1 donation" : `${goal.donationCount} donations`}</span>}
43
+ {!compact && goal.raised && <span>{goal.donationCount === 1 ? "1 donation" : `${goal.donationCount} donations`}</span>}
44
44
  {timeLeft && <span>{timeLeft}</span>}
45
45
  </p>
46
46
  )}
@@ -33,16 +33,16 @@ function siteCurrency(): Promise<string> {
33
33
  }
34
34
 
35
35
  /** The campaign's currency: the metrics' when a donation exists, else the site's. */
36
- async function currencyFor(metrics: Raw[]): Promise<string> {
36
+ async function currencyFor(metrics: Raw[] | null): Promise<string> {
37
37
  return currencyOf(metrics) || (await siteCurrency());
38
38
  }
39
39
 
40
- async function metricsOf(campaignId: string): Promise<Raw[]> {
40
+ async function metricsOf(campaignId: string): Promise<Raw[] | null> {
41
41
  try {
42
42
  const res: Raw = await campaignsApi.getDonationCampaignMetrics(campaignId);
43
43
  return (res?.currencyMetricsList ?? []) as Raw[];
44
44
  } catch {
45
- return []; // metrics are a nicety — the campaign stays correct without them
45
+ return null; // unavailable is not a successfully-read zero total
46
46
  }
47
47
  }
48
48
 
@@ -72,7 +72,7 @@ export async function fetchCampaign(campaignId: string): Promise<CampaignDetail
72
72
  throw e;
73
73
  }
74
74
  if (!raw || isArchived(raw)) return null; // an archived campaign is reachable by id but never shows a form
75
- const metrics = await metricsOf(campaignId);
75
+ const metrics = raw.campaignGoal ? await metricsOf(campaignId) : [];
76
76
  return toDetail(raw, metrics, await currencyFor(metrics), imgSrc);
77
77
  }
78
78
 
@@ -47,10 +47,14 @@ export async function donationCheckoutUrl(campaignId: string, input: DonationInp
47
47
  const cart: Raw = await cartV2Api.createCart(cartBody(campaignId, input) as any);
48
48
  cartId = cartIdOf(cart);
49
49
  } catch (e) {
50
- throw checkoutError(e);
50
+ throw checkoutError(e, "cart");
51
+ }
52
+ try {
53
+ const session: Raw = await redirects.createRedirectSession(redirectBody(cartId, campaignId, site, paths) as any);
54
+ return redirectUrl(session);
55
+ } catch (e) {
56
+ throw checkoutError(e, "redirect", cartId);
51
57
  }
52
- const session: Raw = await redirects.createRedirectSession(redirectBody(cartId, campaignId, site, paths) as any);
53
- return redirectUrl(session);
54
58
  }
55
59
 
56
60
  /**
@@ -154,9 +154,9 @@ export function createDonationStore(campaign: CampaignDetail, { origin, paths }:
154
154
  // stays "submitting" — the browser is leaving for the hosted checkout
155
155
  } catch (e) {
156
156
  submitting = false;
157
- error = e instanceof Error ? e.message : String(e);
157
+ error = "We couldn't open checkout. Please try again.";
158
158
  emit();
159
- throw e;
159
+ throw e; // the caller retains the original API status/body; never replace the cause
160
160
  }
161
161
  },
162
162
  };
@@ -163,7 +163,7 @@ export function toGoal(campaignGoal: Raw | null | undefined, metrics: Raw[] | nu
163
163
  const ended = hasEnd && end!.getTime() < now.getTime();
164
164
  const left = hasEnd && !ended ? end!.getTime() - now.getTime() : 0;
165
165
  return {
166
- raised: m.totalAmount ? formatMoney(m.totalAmount, currency) : formatAmount(0, currency),
166
+ raised: metrics == null ? "" : m.totalAmount ? formatMoney(m.totalAmount, currency) : formatAmount(0, currency),
167
167
  target: formatMoney(campaignGoal.targetAmount, currency),
168
168
  raisedAmount,
169
169
  targetAmount,
@@ -360,12 +360,16 @@ export function toInput(options: DonationOptions, sel: DonationSelection): Donat
360
360
  */
361
361
  export function donationLineItem(campaignId: string, input: DonationInput): Raw {
362
362
  if (!campaignId) throw new Error("A campaign id is required to donate.");
363
+ if ((typeof input.amount !== "number" && typeof input.amount !== "string") || String(input.amount).trim() === "") throw new Error("Enter a positive donation amount.");
364
+ const amount = Number(input.amount);
365
+ if (!Number.isFinite(amount) || amount <= 0) throw new Error("Enter a positive donation amount.");
366
+ if (!FREQUENCIES.includes(input.frequency)) throw new Error("Choose a supported donation frequency.");
363
367
  return {
364
368
  quantity: 1,
365
369
  catalogReference: {
366
370
  appId: DONATIONS_APP_ID,
367
371
  catalogItemId: campaignId,
368
- options: { amount: input.amount, frequency: input.frequency, ...(input.coverFee ? { donorCoveringFees: true } : {}) },
372
+ options: { amount, ...(input.frequency !== "ONE_TIME" ? { frequency: input.frequency } : {}), ...(input.coverFee ? { donorCoveringFees: true } : {}) },
369
373
  },
370
374
  };
371
375
  }
@@ -424,13 +428,12 @@ export function redirectUrl(session: Raw | null | undefined): string {
424
428
  return url;
425
429
  }
426
430
 
427
- /** A checkout failure as the visitor should read it; the raw message is kept when no rule applies. */
428
- export function checkoutError(e: unknown): Error {
429
- const msg = e instanceof Error ? e.message : String(e);
430
- if (/premium|payment method|payments? (is|are) not (set up|enabled)|PAYMENT_METHOD/i.test(msg)) {
431
- return new Error("Donations aren't switched on yet — the site owner needs a premium plan and a connected payment method.");
432
- }
433
- return e instanceof Error ? e : new Error(msg || "Checkout couldn't start — please try again.");
431
+ /** Preserve diagnostic status/body/cause; payment setup must not be guessed from a generic failure. */
432
+ export function checkoutError(e: unknown, stage?: "cart" | "redirect", cartId?: string): Error & { stage?: string; cartId?: string } {
433
+ const error: Error & { stage?: string; cartId?: string } = e instanceof Error ? e : new Error(String(e) || "Checkout couldn't start — please try again.", { cause: e });
434
+ if (stage) error.stage = stage;
435
+ if (cartId) error.cartId = cartId;
436
+ return error;
434
437
  }
435
438
 
436
439
  // ---- the receipt ----------------------------------------------------------------------------------
@@ -8,7 +8,7 @@
8
8
  // donations (goal reached / expired) it renders `children` — your closing message — or nothing.
9
9
  // The redirect itself is useDonation → donationCheckoutUrl; nothing here builds a URL or marks
10
10
  // anything paid.
11
- import type { ReactNode } from "react";
11
+ import { useId, type ReactNode } from "react";
12
12
  import { useDonation, type UseDonationOptions } from "../../hooks/donations/useDonation";
13
13
  import type { CampaignDetail } from "../../wix/donations/types";
14
14
 
@@ -23,7 +23,7 @@ export interface DonateFormProps {
23
23
  }
24
24
 
25
25
  const choice = (selected: boolean) =>
26
- `cursor-pointer rounded-md border px-4 py-3 text-sm transition-colors ${
26
+ `relative block cursor-pointer rounded-md border px-4 py-3 text-sm transition-colors focus-within:outline-2 focus-within:outline-offset-2 focus-within:outline-primary ${
27
27
  selected ? "border-primary bg-primary text-primary-foreground" : "border-border bg-background text-foreground hover:bg-secondary"
28
28
  }`;
29
29
 
@@ -36,10 +36,10 @@ export default function DonateForm({
36
36
  }: DonateFormProps) {
37
37
  const d = useDonation(campaign, options);
38
38
  const o = campaign.options;
39
+ const fid = `donate-${campaign.id}-${useId()}`;
39
40
  if (!d.available) return children ? <>{children}</> : null;
40
41
 
41
42
  const show = (field: keyof typeof d.messages) => (d.showErrors && d.messages[field] ? d.messages[field] : null);
42
- const fid = `donate-${campaign.id}`;
43
43
 
44
44
  return (
45
45
  <form
@@ -47,43 +47,65 @@ export default function DonateForm({
47
47
  noValidate
48
48
  onSubmit={(e) => {
49
49
  e.preventDefault();
50
- void d.donate().catch(() => {});
50
+ const form = e.currentTarget;
51
+ void d.donate().then(() => {
52
+ if (!d.valid) {
53
+ // Wait for the store's validation state to render; do not steal focus while typing.
54
+ requestAnimationFrame(() => form.querySelector<HTMLElement>('[aria-invalid="true"]')?.focus());
55
+ }
56
+ }).catch((error) => {
57
+ // The store shows a recoverable message; keep safe diagnostics, not donor data or tokens.
58
+ console.error("Donation checkout failed", {
59
+ stage: error?.stage ?? "checkout",
60
+ status: error?.status,
61
+ code: error?.body?.details?.applicationError?.code ?? error?.details?.applicationError?.code ?? error?.body?.code,
62
+ });
63
+ });
51
64
  }}
52
65
  >
53
66
  {o.frequencies.length > 1 && (
54
- <fieldset>
67
+ <fieldset disabled={d.submitting}>
55
68
  <legend className="eyebrow mb-2">How often</legend>
56
- <div className="grid grid-cols-2 gap-2 sm:grid-cols-4" role="radiogroup">
69
+ <div className="grid grid-cols-2 gap-2 sm:grid-cols-4">
57
70
  {o.frequencies.map((f) => (
58
- <button key={f.value} type="button" role="radio" aria-checked={d.frequency === f.value} className={choice(d.frequency === f.value)} onClick={() => d.setFrequency(f.value)}>
71
+ <label key={f.value} className={choice(d.frequency === f.value)}>
72
+ <input type="radio" name={`${fid}-frequency`} value={f.value} checked={d.frequency === f.value}
73
+ onChange={() => d.setFrequency(f.value)} className="sr-only"
74
+ aria-invalid={!!show("frequency")} aria-describedby={show("frequency") ? `${fid}-frequency-error` : undefined} />
59
75
  {f.label}
60
- </button>
76
+ </label>
61
77
  ))}
62
78
  </div>
63
- {show("frequency") && <p className="mt-2 text-sm text-destructive" role="alert">{show("frequency")}</p>}
79
+ {show("frequency") && <p id={`${fid}-frequency-error`} className="mt-2 text-sm text-destructive" role="alert">{show("frequency")}</p>}
64
80
  </fieldset>
65
81
  )}
66
82
 
67
83
  {(o.presets.length > 0 || o.customAmount.enabled) && (
68
- <fieldset>
84
+ <fieldset disabled={d.submitting}>
69
85
  <legend className="eyebrow mb-2">Amount</legend>
70
- <div className="grid grid-cols-2 gap-2 sm:grid-cols-3" role="radiogroup">
86
+ <div className="grid grid-cols-2 gap-2 sm:grid-cols-3">
71
87
  {o.presets.map((p) => {
72
88
  const selected = !d.customMode && d.presetAmount === p.amount;
73
89
  return (
74
- <button key={p.amount} type="button" role="radio" aria-checked={selected} className={`${choice(selected)} text-left`} onClick={() => d.selectPreset(p.amount)}>
90
+ <label key={p.amount} className={`${choice(selected)} text-left`}>
91
+ <input type="radio" name={`${fid}-amount-choice`} value={p.amount} checked={selected}
92
+ onChange={() => d.selectPreset(p.amount)} className="sr-only"
93
+ aria-invalid={!!show("amount")} aria-describedby={show("amount") ? `${fid}-amount-error` : undefined} />
75
94
  <span className="block text-base font-semibold">{p.label}</span>
76
95
  {p.impact && <span className={`mt-0.5 block text-xs ${selected ? "opacity-80" : "text-muted-foreground"}`}>{p.impact}</span>}
77
- </button>
96
+ </label>
78
97
  );
79
98
  })}
80
99
  {o.customAmount.enabled && o.presets.length > 0 && (
81
- <button type="button" role="radio" aria-checked={d.customMode} className={choice(d.customMode)} onClick={() => d.selectCustom()}>
100
+ <label className={choice(d.customMode)}>
101
+ <input type="radio" name={`${fid}-amount-choice`} value="custom" checked={d.customMode}
102
+ onChange={() => d.selectCustom()} className="sr-only"
103
+ aria-invalid={!!show("amount")} aria-describedby={show("amount") ? `${fid}-amount-error` : undefined} />
82
104
  Other amount
83
- </button>
105
+ </label>
84
106
  )}
85
107
  </div>
86
- {show("amount") && <p className="mt-2 text-sm text-destructive" role="alert">{show("amount")}</p>}
108
+ {show("amount") && <p id={`${fid}-amount-error`} className="mt-2 text-sm text-destructive" role="alert">{show("amount")}</p>}
87
109
  {d.customMode && (
88
110
  <div className="mt-3">
89
111
  <label htmlFor={`${fid}-amount`} className="sr-only">
@@ -95,19 +117,20 @@ export default function DonateForm({
95
117
  id={`${fid}-amount`}
96
118
  inputMode="decimal"
97
119
  autoComplete="off"
98
- className="w-full bg-transparent py-3 text-base text-foreground outline-none"
120
+ className="min-w-0 flex-1 bg-transparent py-3 text-base text-foreground outline-none focus-visible:ring-2 focus-visible:ring-primary"
99
121
  placeholder={o.customAmount.minLabel ? `${o.customAmount.minLabel} or more` : "Enter an amount"}
100
122
  value={d.customAmount}
101
123
  onChange={(e) => d.setCustomAmount(e.target.value)}
102
124
  aria-invalid={!!show("customAmount")}
125
+ aria-describedby={show("customAmount") || o.customAmount.minLabel || o.customAmount.maxLabel ? `${fid}-custom-help` : undefined}
103
126
  />
104
127
  </div>
105
128
  {(o.customAmount.minLabel || o.customAmount.maxLabel) && !show("customAmount") && (
106
- <p className="mt-1 text-xs text-muted-foreground">
129
+ <p id={`${fid}-custom-help`} className="mt-1 text-xs text-muted-foreground">
107
130
  {[o.customAmount.minLabel && `Minimum ${o.customAmount.minLabel}`, o.customAmount.maxLabel && `Maximum ${o.customAmount.maxLabel}`].filter(Boolean).join(" · ")}
108
131
  </p>
109
132
  )}
110
- {show("customAmount") && <p className="mt-1 text-sm text-destructive" role="alert">{show("customAmount")}</p>}
133
+ {show("customAmount") && <p id={`${fid}-custom-help`} className="mt-1 text-sm text-destructive" role="alert">{show("customAmount")}</p>}
111
134
  </div>
112
135
  )}
113
136
  </fieldset>
@@ -115,7 +138,7 @@ export default function DonateForm({
115
138
 
116
139
  {o.askCoverFee && (
117
140
  <label className="flex items-start gap-3 text-sm text-foreground">
118
- <input type="checkbox" className="mt-0.5" checked={d.coverFee} onChange={(e) => d.setCoverFee(e.target.checked)} />
141
+ <input type="checkbox" className="mt-0.5" checked={d.coverFee} disabled={d.submitting} onChange={(e) => d.setCoverFee(e.target.checked)} />
119
142
  <span>
120
143
  {d.feeLabel ? `Add ${d.feeLabel} to cover the processing fees` : "Cover the processing fees (2.9%)"}
121
144
  {d.frequency && d.frequency !== "ONE_TIME" && <span className="text-muted-foreground"> — on every payment</span>}
@@ -132,14 +155,17 @@ export default function DonateForm({
132
155
  id={`${fid}-note`}
133
156
  rows={3}
134
157
  maxLength={o.commentMaxLength}
135
- className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground outline-none"
158
+ className="w-full rounded-md border border-border bg-background px-3 py-2 text-sm text-foreground outline-none focus-visible:ring-2 focus-visible:ring-primary"
136
159
  value={d.note}
137
160
  onChange={(e) => d.setNote(e.target.value)}
161
+ disabled={d.submitting}
162
+ aria-invalid={!!show("note")}
163
+ aria-describedby={`${fid}-note-hint${show("note") ? ` ${fid}-note-error` : ""}`}
138
164
  />
139
- <p className="mt-1 text-right text-xs text-muted-foreground">
165
+ <p id={`${fid}-note-hint`} className="mt-1 text-right text-xs text-muted-foreground">
140
166
  {d.note.length}/{o.commentMaxLength}
141
167
  </p>
142
- {show("note") && <p className="text-sm text-destructive" role="alert">{show("note")}</p>}
168
+ {show("note") && <p id={`${fid}-note-error`} className="text-sm text-destructive" role="alert">{show("note")}</p>}
143
169
  </div>
144
170
  )}
145
171
 
@@ -1,7 +1,7 @@
1
1
  // The hosted checkout's thank-you island — wire as-is on /donate/thank-you (mount client:only: it
2
2
  // reads the browser URL). It owns the honesty rules: landing here with `?orderId=` is Wix's
3
3
  // success redirect, so it thanks the donor; the order's facts (name, amount, order number, paid or
4
- // pending) appear only when the order could be read; a direct visit with no order id gets a neutral
4
+ // unconfirmed) appear only when the order could be read; a direct visit with no order id gets a neutral
5
5
  // thank-you and a link back — never an invented receipt, never "paid" unless the order says PAID.
6
6
  import { useDonationReceipt } from "../../hooks/donations/useDonationReceipt";
7
7
 
@@ -17,7 +17,8 @@ export default function DonationReceipt({ campaignsHref = "/donate", className =
17
17
  if (!orderId) {
18
18
  return (
19
19
  <div className={className}>
20
- <h1 className="text-2xl font-semibold tracking-tight">Thank you for your support</h1>
20
+ <h1 className="text-2xl font-semibold tracking-tight">Your support matters</h1>
21
+ <p className="mt-3 text-sm text-muted-foreground">This page alone is not a payment confirmation. Explore a campaign to give, or check your checkout confirmation if you just returned.</p>
21
22
  <a href={campaignsHref} className="mt-6 inline-block text-sm text-foreground underline">
22
23
  See the campaigns
23
24
  </a>
@@ -29,15 +30,15 @@ export default function DonationReceipt({ campaignsHref = "/donate", className =
29
30
  <div className={className} aria-busy={loading}>
30
31
  {receipt?.orderNumber && <p className="eyebrow">Order {receipt.orderNumber}</p>}
31
32
  <h1 className="mt-2 text-2xl font-semibold tracking-tight">
32
- {receipt?.donorFirstName ? `Thank you, ${receipt.donorFirstName}` : "Thank you for your donation"}
33
+ {receipt?.donorFirstName ? `Thank you, ${receipt.donorFirstName}` : receipt ? "Thank you for your support" : loading ? "Checking your donation" : "Your support matters"}
33
34
  </h1>
34
35
  {receipt && (
35
36
  <p className="mt-3 text-sm text-muted-foreground">
36
37
  {receipt.amount ? `Your donation of ${receipt.amount} ` : "Your donation "}
37
- {receipt.paid ? "has been received." : "is being processed — payment is pending."}
38
+ {receipt.paid ? "has been received." : "is not confirmed as paid. Please check your checkout confirmation."}
38
39
  </p>
39
40
  )}
40
- {!receipt && !loading && <p className="mt-3 text-sm text-muted-foreground">Your donation has been submitted.</p>}
41
+ {!receipt && !loading && <p className="mt-3 text-sm text-muted-foreground">Donation details could not be verified here. If you completed checkout, check its confirmation before trying again.</p>}
41
42
  <a href={campaignsHref} className="mt-6 inline-block text-sm text-muted-foreground underline">
42
43
  Back to campaigns
43
44
  </a>
@@ -33,14 +33,14 @@ export default function GoalProgress({ goal, className = "", compact = false }:
33
33
  {goal.target}
34
34
  </span>
35
35
  </p>
36
- <p className="text-sm font-semibold text-foreground">{goal.percent}%</p>
36
+ {goal.raised && <p className="text-sm font-semibold text-foreground">{goal.percent}%</p>}
37
37
  </div>
38
- <div className="mt-2 h-2 w-full overflow-hidden rounded-control bg-secondary" role="progressbar" aria-valuemin={0} aria-valuemax={100} aria-valuenow={width} aria-label="Progress toward the goal">
38
+ {goal.raised && <div className="mt-2 h-2 w-full overflow-hidden rounded-control bg-secondary" role="progressbar" aria-valuemin={0} aria-valuemax={100} aria-valuenow={width} aria-label="Progress toward the goal">
39
39
  <div className="h-full rounded-control bg-primary transition-[width]" style={{ width: `${width}%` }} />
40
- </div>
41
- {(!compact || timeLeft) && (
40
+ </div>}
41
+ {((!compact && goal.raised) || timeLeft) && (
42
42
  <p className="mt-2 flex justify-between text-xs text-muted-foreground">
43
- {!compact && <span>{goal.donationCount === 1 ? "1 donation" : `${goal.donationCount} donations`}</span>}
43
+ {!compact && goal.raised && <span>{goal.donationCount === 1 ? "1 donation" : `${goal.donationCount} donations`}</span>}
44
44
  {timeLeft && <span>{timeLeft}</span>}
45
45
  </p>
46
46
  )}
@@ -33,16 +33,16 @@ function siteCurrency(): Promise<string> {
33
33
  }
34
34
 
35
35
  /** The campaign's currency: the metrics' when a donation exists, else the site's. */
36
- async function currencyFor(metrics: Raw[]): Promise<string> {
36
+ async function currencyFor(metrics: Raw[] | null): Promise<string> {
37
37
  return currencyOf(metrics) || (await siteCurrency());
38
38
  }
39
39
 
40
- async function metricsOf(campaignId: string): Promise<Raw[]> {
40
+ async function metricsOf(campaignId: string): Promise<Raw[] | null> {
41
41
  try {
42
42
  const res: Raw = await campaignsApi.getDonationCampaignMetrics(campaignId);
43
43
  return (res?.currencyMetricsList ?? []) as Raw[];
44
44
  } catch {
45
- return []; // metrics are a nicety — the campaign stays correct without them
45
+ return null; // unavailable is not a successfully-read zero total
46
46
  }
47
47
  }
48
48
 
@@ -72,7 +72,7 @@ export async function fetchCampaign(campaignId: string): Promise<CampaignDetail
72
72
  throw e;
73
73
  }
74
74
  if (!raw || isArchived(raw)) return null; // an archived campaign is reachable by id but never shows a form
75
- const metrics = await metricsOf(campaignId);
75
+ const metrics = raw.campaignGoal ? await metricsOf(campaignId) : [];
76
76
  return toDetail(raw, metrics, await currencyFor(metrics), imgSrc);
77
77
  }
78
78
 
@@ -47,10 +47,14 @@ export async function donationCheckoutUrl(campaignId: string, input: DonationInp
47
47
  const cart: Raw = await cartV2Api.createCart(cartBody(campaignId, input) as any);
48
48
  cartId = cartIdOf(cart);
49
49
  } catch (e) {
50
- throw checkoutError(e);
50
+ throw checkoutError(e, "cart");
51
+ }
52
+ try {
53
+ const session: Raw = await redirects.createRedirectSession(redirectBody(cartId, campaignId, site, paths) as any);
54
+ return redirectUrl(session);
55
+ } catch (e) {
56
+ throw checkoutError(e, "redirect", cartId);
51
57
  }
52
- const session: Raw = await redirects.createRedirectSession(redirectBody(cartId, campaignId, site, paths) as any);
53
- return redirectUrl(session);
54
58
  }
55
59
 
56
60
  /**
@@ -154,9 +154,9 @@ export function createDonationStore(campaign: CampaignDetail, { origin, paths }:
154
154
  // stays "submitting" — the browser is leaving for the hosted checkout
155
155
  } catch (e) {
156
156
  submitting = false;
157
- error = e instanceof Error ? e.message : String(e);
157
+ error = "We couldn't open checkout. Please try again.";
158
158
  emit();
159
- throw e;
159
+ throw e; // the caller retains the original API status/body; never replace the cause
160
160
  }
161
161
  },
162
162
  };
@@ -163,7 +163,7 @@ export function toGoal(campaignGoal: Raw | null | undefined, metrics: Raw[] | nu
163
163
  const ended = hasEnd && end!.getTime() < now.getTime();
164
164
  const left = hasEnd && !ended ? end!.getTime() - now.getTime() : 0;
165
165
  return {
166
- raised: m.totalAmount ? formatMoney(m.totalAmount, currency) : formatAmount(0, currency),
166
+ raised: metrics == null ? "" : m.totalAmount ? formatMoney(m.totalAmount, currency) : formatAmount(0, currency),
167
167
  target: formatMoney(campaignGoal.targetAmount, currency),
168
168
  raisedAmount,
169
169
  targetAmount,
@@ -360,12 +360,16 @@ export function toInput(options: DonationOptions, sel: DonationSelection): Donat
360
360
  */
361
361
  export function donationLineItem(campaignId: string, input: DonationInput): Raw {
362
362
  if (!campaignId) throw new Error("A campaign id is required to donate.");
363
+ if ((typeof input.amount !== "number" && typeof input.amount !== "string") || String(input.amount).trim() === "") throw new Error("Enter a positive donation amount.");
364
+ const amount = Number(input.amount);
365
+ if (!Number.isFinite(amount) || amount <= 0) throw new Error("Enter a positive donation amount.");
366
+ if (!FREQUENCIES.includes(input.frequency)) throw new Error("Choose a supported donation frequency.");
363
367
  return {
364
368
  quantity: 1,
365
369
  catalogReference: {
366
370
  appId: DONATIONS_APP_ID,
367
371
  catalogItemId: campaignId,
368
- options: { amount: input.amount, frequency: input.frequency, ...(input.coverFee ? { donorCoveringFees: true } : {}) },
372
+ options: { amount, ...(input.frequency !== "ONE_TIME" ? { frequency: input.frequency } : {}), ...(input.coverFee ? { donorCoveringFees: true } : {}) },
369
373
  },
370
374
  };
371
375
  }
@@ -424,13 +428,12 @@ export function redirectUrl(session: Raw | null | undefined): string {
424
428
  return url;
425
429
  }
426
430
 
427
- /** A checkout failure as the visitor should read it; the raw message is kept when no rule applies. */
428
- export function checkoutError(e: unknown): Error {
429
- const msg = e instanceof Error ? e.message : String(e);
430
- if (/premium|payment method|payments? (is|are) not (set up|enabled)|PAYMENT_METHOD/i.test(msg)) {
431
- return new Error("Donations aren't switched on yet — the site owner needs a premium plan and a connected payment method.");
432
- }
433
- return e instanceof Error ? e : new Error(msg || "Checkout couldn't start — please try again.");
431
+ /** Preserve diagnostic status/body/cause; payment setup must not be guessed from a generic failure. */
432
+ export function checkoutError(e: unknown, stage?: "cart" | "redirect", cartId?: string): Error & { stage?: string; cartId?: string } {
433
+ const error: Error & { stage?: string; cartId?: string } = e instanceof Error ? e : new Error(String(e) || "Checkout couldn't start — please try again.", { cause: e });
434
+ if (stage) error.stage = stage;
435
+ if (cartId) error.cartId = cartId;
436
+ return error;
434
437
  }
435
438
 
436
439
  // ---- the receipt ----------------------------------------------------------------------------------
@@ -26,17 +26,17 @@ function siteCurrency(): Promise<string> {
26
26
  }
27
27
 
28
28
  /** The campaign's currency: the metrics' when a donation exists, else the site's. */
29
- async function currencyFor(metrics: Raw[]): Promise<string> {
29
+ async function currencyFor(metrics: Raw[] | null): Promise<string> {
30
30
  return currencyOf(metrics) || (await siteCurrency());
31
31
  }
32
32
 
33
33
  // GET /donation-campaigns/v2/donation-campaigns/{id}/metrics → { currencyMetricsList: [{ currencyCode, donationCount, totalAmount }] }
34
- async function metricsOf(campaignId: string): Promise<Raw[]> {
34
+ async function metricsOf(campaignId: string): Promise<Raw[] | null> {
35
35
  try {
36
36
  const res = await wixRequest<Raw>(`${BASE}/${campaignId}/metrics`, { method: "GET" });
37
37
  return (res?.currencyMetricsList ?? []) as Raw[];
38
38
  } catch {
39
- return []; // metrics are a nicety — the campaign stays correct without them
39
+ return null; // unavailable is not a successfully-read zero total
40
40
  }
41
41
  }
42
42
 
@@ -65,7 +65,7 @@ export async function fetchCampaign(campaignId: string): Promise<CampaignDetail
65
65
  throw e;
66
66
  }
67
67
  if (!raw || isArchived(raw)) return null; // an archived campaign is reachable by id but never shows a form
68
- const metrics = await metricsOf(campaignId);
68
+ const metrics = raw.campaignGoal ? await metricsOf(campaignId) : [];
69
69
  return toDetail(raw, metrics, await currencyFor(metrics), imgSrc);
70
70
  }
71
71
 
@@ -42,10 +42,14 @@ export async function donationCheckoutUrl(campaignId: string, input: DonationInp
42
42
  const res = await wixRequest<Raw>("/ecom/v2/carts", { body: cartBody(campaignId, input) });
43
43
  cartId = cartIdOf(res);
44
44
  } catch (e) {
45
- throw checkoutError(e);
45
+ throw checkoutError(e, "cart");
46
+ }
47
+ try {
48
+ const session = await wixRequest<Raw>("/headless/v1/redirect-session", { body: redirectBody(cartId, campaignId, site, paths) });
49
+ return redirectUrl(session);
50
+ } catch (e) {
51
+ throw checkoutError(e, "redirect", cartId);
46
52
  }
47
- const session = await wixRequest<Raw>("/headless/v1/redirect-session", { body: redirectBody(cartId, campaignId, site, paths) });
48
- return redirectUrl(session);
49
53
  }
50
54
 
51
55
  /**
@@ -10,10 +10,14 @@ if needed, creates the campaigns, verifies each reads back, then attaches cover
10
10
  node <SKILL_ROOT>/templates/donations/seed/seed-donations.mjs plan.json
11
11
  ```
12
12
 
13
- `plan.json` is plain data — write it from the brief. **Default to one campaign** that exercises every
14
- form branch: 3 preset amounts with impact text, one-time + monthly, a goal with an end date, a custom
15
- amount with a minimum, the note and the cover-fee prompt on. A second campaign (say, without a goal)
16
- only when the brief lists several causes. Every campaign gets a cover image — the default is an
13
+ `plan.json` is plain data — write it from the brief. Read existing campaigns and confirm the target
14
+ site and proposed changes before seeding. For a new setup, default to one approved cause; add more
15
+ only when the brief names them. Suggest a small set of amounts and custom-giving rules for approval;
16
+ do not invent impact claims, a goal or a deadline just to exercise form branches. Configure recurring
17
+ giving, notes and fee coverage as intended by the owner. A frontend-only request never reseeds.
18
+ The example below illustrates fields, not organization facts or mandatory settings.
19
+ For ongoing campaign edits, use the [management recipe](../../../wix-manage/references/donations/create-and-update-donation-campaigns.md).
20
+ Every campaign gets a cover image — the default is an
17
21
  `imagePrompt` (AI-generated, ~1 Wix AI credit per image, account-billed): brand-contextual — subject,
18
22
  mood, palette, lighting — always ending "no text, no watermarks"; a real subject of the cause, not
19
23
  abstract decoration. For an asset the user supplied use `imageMediaId` (a file already in the site's Media Manager, such as one the user uploaded there: used as it is, no copy; a `static.wixstatic.com/media/<file id>` URL of a site file counts as one), `imagePath` (a file on this machine) or
@@ -72,9 +76,10 @@ images only (`imagePath` / `imageUrl`) — never an `imagePrompt` beside supplie
72
76
 
73
77
  ## What the seed cannot do — tell the owner
74
78
 
75
- - **Completing a donation needs a premium plan and a connected payment method** (dashboard → Accept
76
- Payments). The seed creates campaigns on any site; the hosted checkout refuses the payment until
77
- then. Recurring frequencies additionally need a payment provider that supports recurring payments.
79
+ - **Accepting real payments needs a payments-capable plan and a connected eligible provider**
80
+ (dashboard → Accept Payments). Creating a campaign, cart or redirect session is not proof that a
81
+ charge can succeed. Do not blame malformed cart options on premium. Recurring frequencies also
82
+ need a provider that supports recurring payments.
78
83
  - The result JSON's `installed` field says whether each app install succeeded; a Donations install that
79
84
  is refused through the installer API is added from the dashboard's App Market instead.
80
85
  - Cover images: the update's Image shape and field-mask requirement were inferred from the SDK, not