@wix/agent-skills 1.15.1 → 1.16.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 (322) hide show
  1. package/README.md +3 -7
  2. package/package.json +1 -1
  3. package/skills/wix-app/SKILL.md +4 -1
  4. package/skills/wix-app/references/APP_TOOLS.md +134 -0
  5. package/skills/wix-app/references/CUSTOM_ELEMENT_WIDGET.md +1 -1
  6. package/skills/wix-app/references/DASHBOARD_PAGE.md +0 -10
  7. package/skills/wix-app/references/DATA_COLLECTION.md +1 -1
  8. package/skills/wix-app/references/EDITOR_REACT_COMPONENT.md +28 -9
  9. package/skills/wix-app/references/SERVICE_PLUGIN.md +12 -10
  10. package/skills/wix-app/references/app-tools/TOOLS.md +75 -0
  11. package/skills/wix-app/references/dashboard-page/DASHBOARD_API.md +2 -2
  12. package/skills/wix-app/references/editor-react-component/A11Y-REVIEW-REFERENCE.md +172 -0
  13. package/skills/wix-app/references/editor-react-component/A11Y-REVIEW.md +138 -0
  14. package/skills/wix-app/references/editor-react-component/ANIMATED-COMPONENTS.md +23 -2
  15. package/skills/wix-app/references/editor-react-component/BRANDED-COMPONENTS.md +29 -0
  16. package/skills/wix-app/references/editor-react-component/COMPONENT-API.md +1 -1
  17. package/skills/wix-app/references/editor-react-component/CSS-GUIDELINES.md +27 -2
  18. package/skills/wix-app/references/editor-react-component/DESIGN-STATES.md +5 -3
  19. package/skills/wix-app/references/editor-react-component/DIRECTIONALITY.md +18 -1
  20. package/skills/wix-app/references/editor-react-component/PARTS.md +15 -2
  21. package/skills/wix-app/references/editor-react-component/REACT-GUIDELINES.md +2 -3
  22. package/skills/wix-app/references/service-plugin/BOOKINGS-STAFF-SORTING.md +13 -9
  23. package/skills/wix-app/references/service-plugin/DISCOUNT-TRIGGERS.md +4 -0
  24. package/skills/wix-app/references/service-plugin/GIFT-CARDS.md +4 -0
  25. package/skills/wix-app/references/service-plugin/PAYMENT-SETTINGS.md +3 -1
  26. package/skills/wix-app/references/service-plugin/SHIPPING-RATES.md +4 -0
  27. package/skills/wix-app/references/service-plugin/TOOLS_PROVIDER.md +54 -0
  28. package/skills/wix-app/references/stores/QUERY.md +32 -0
  29. package/skills/wix-docs/SKILL.md +35 -3
  30. package/skills/wix-headless/SKILL.md +3 -1
  31. package/skills/wix-headless/references/CONTENT.md +36 -0
  32. package/skills/wix-headless/references/DESIGN.md +54 -0
  33. package/skills/wix-headless/references/DISCOVERY.md +24 -0
  34. package/skills/wix-headless/references/IMAGE_GENERATION.md +10 -0
  35. package/skills/wix-headless/references/inline-recipes/how-to-code-a-store.md +3 -2
  36. package/skills/wix-headless/references/inline-recipes/setup-online-store.md +32 -23
  37. package/skills/wix-headless/references/managed/CONNECT.md +1 -1
  38. package/skills/wix-headless/references/managed/CREATE.md +14 -0
  39. package/skills/wix-headless/references/managed/DEPLOYMENT.md +25 -0
  40. package/skills/wix-manage/SKILL.md +123 -7
  41. package/skills/wix-manage/references/analytics/analytics-dashboard-navigation.md +41 -0
  42. package/skills/wix-manage/references/app-installation/app-installation-dashboard-navigation.md +28 -0
  43. package/skills/wix-manage/references/blog/blog-dashboard-navigation.md +56 -0
  44. package/skills/wix-manage/references/blog/how-to-create-blog-posts.md +31 -6
  45. package/skills/wix-manage/references/bookings/booking-service-policy-setup.md +3 -1
  46. package/skills/wix-manage/references/bookings/bookings-dashboard-navigation.md +63 -0
  47. package/skills/wix-manage/references/bookings/diagnose-availability-issues.md +10 -1
  48. package/skills/wix-manage/references/cms/cms-dashboard-navigation.md +44 -0
  49. package/skills/wix-manage/references/cms/cms-data-items-crud.md +31 -3
  50. package/skills/wix-manage/references/cms/cms-publishing-flow.md +287 -0
  51. package/skills/wix-manage/references/cms/cms-schema-management.md +27 -1
  52. package/skills/wix-manage/references/contacts/contacts-dashboard-navigation.md +46 -0
  53. package/skills/wix-manage/references/contacts/create-a-contact.md +82 -0
  54. package/skills/wix-manage/references/contacts/update-a-contact.md +119 -0
  55. package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +82 -0
  56. package/skills/wix-manage/references/dashboard-navigation/routes.json +1733 -0
  57. package/skills/wix-manage/references/domains/domains-dashboard-navigation.md +32 -0
  58. package/skills/wix-manage/references/ecommerce/ecom-pricing.md +4 -4
  59. package/skills/wix-manage/references/ecommerce/ecom-shipping.md +1 -1
  60. package/skills/wix-manage/references/ecommerce/gift-cards/ecom-gift-cards-goal-sell-gift-cards.md +338 -0
  61. package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-create-discount-rule.md +42 -78
  62. package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-flow-bundle-and-save.md +1 -1
  63. package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-flow-stock-mover.md +1 -1
  64. package/skills/wix-manage/references/ecommerce/pricing-promotions/ecom-pricing-flow-upsell-boost.md +1 -1
  65. package/skills/wix-manage/references/ecommerce/recommend-ecommerce-strategy.md +90 -92
  66. package/skills/wix-manage/references/events/create-wix-event.md +176 -0
  67. package/skills/wix-manage/references/events/manage-wix-events.md +174 -0
  68. package/skills/wix-manage/references/forms/forms-dashboard-navigation.md +44 -0
  69. package/skills/wix-manage/references/get-paid/get-paid-dashboard-navigation.md +52 -0
  70. package/skills/wix-manage/references/google-ads/billing-and-payment.md +80 -0
  71. package/skills/wix-manage/references/google-ads/create-performance-max-campaign.md +212 -0
  72. package/skills/wix-manage/references/google-ads/get-campaign-suggestions.md +110 -0
  73. package/skills/wix-manage/references/google-ads/google-ads-dashboard-navigation.md +25 -0
  74. package/skills/wix-manage/references/google-ads/install-and-create-account.md +155 -0
  75. package/skills/wix-manage/references/google-ads/manage-campaign-lifecycle.md +63 -0
  76. package/skills/wix-manage/references/google-ads/query-campaign-analytics.md +155 -0
  77. package/skills/wix-manage/references/marketing/marketing-dashboard-navigation.md +52 -0
  78. package/skills/wix-manage/references/pricing-plans/create-and-update-pricing-plans.md +99 -1
  79. package/skills/wix-manage/references/pricing-plans/pricing-plans-dashboard-navigation.md +45 -0
  80. package/skills/wix-manage/references/restaurants/restaurants-dashboard-navigation.md +68 -0
  81. package/skills/wix-manage/references/restaurants/wix-restaurants-setup.md +94 -125
  82. package/skills/wix-manage/references/site-properties/change-payment-currency-site-properties.md +48 -9
  83. package/skills/wix-manage/references/site-properties/site-properties-dashboard-navigation.md +31 -0
  84. package/skills/wix-manage/references/sites/create-headless-site.md +52 -0
  85. package/skills/wix-manage/references/sites/create-site-from-template.md +2 -25
  86. package/skills/wix-manage/references/sites/site-import.md +163 -190
  87. package/skills/wix-manage/references/sites/sites-dashboard-navigation.md +29 -0
  88. package/skills/wix-manage/references/stores/add-store-pages-to-site.md +17 -1
  89. package/skills/wix-manage/references/stores/find-products-query-and-search-catalog-v3.md +26 -8
  90. package/skills/wix-manage/references/stores/stores-dashboard-navigation.md +65 -0
  91. package/skills/wix-manage/references/stores/update-product-with-options.md +39 -7
  92. package/skills/wix-replatform/.publish-manifest.json +8 -0
  93. package/skills/wix-replatform/SKILL.md +693 -0
  94. package/skills/wix-replatform/lib/artifact-freshness.js +215 -0
  95. package/skills/wix-replatform/lib/completion-report.js +200 -0
  96. package/skills/wix-replatform/lib/config-env.js +59 -0
  97. package/skills/wix-replatform/lib/execution-manifest.js +185 -0
  98. package/skills/wix-replatform/lib/execution-state.js +173 -0
  99. package/skills/wix-replatform/lib/import-recovery.js +313 -0
  100. package/skills/wix-replatform/lib/local-state.js +642 -0
  101. package/skills/wix-replatform/lib/orchestration-preflight.js +143 -0
  102. package/skills/wix-replatform/lib/orchestration-router.js +122 -0
  103. package/skills/wix-replatform/lib/orchestration-state.js +455 -0
  104. package/skills/wix-replatform/lib/progress-log.js +224 -0
  105. package/skills/wix-replatform/lib/progress-log.sh +140 -0
  106. package/skills/wix-replatform/lib/url-preservation-state.js +391 -0
  107. package/skills/wix-replatform/resources/rp-discovery/SKILL.md +184 -0
  108. package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +529 -0
  109. package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +316 -0
  110. package/skills/wix-replatform/resources/rp-execute-setup/scripts/mint-token.sh +64 -0
  111. package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +1114 -0
  112. package/skills/wix-replatform/resources/rp-mapper/SKILL.md +430 -0
  113. package/skills/wix-replatform/resources/rp-mapper/lib/mapping-resolve.js +217 -0
  114. package/skills/wix-replatform/resources/rp-mapper/scripts/resolve-mapping.js +148 -0
  115. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +378 -0
  116. package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +183 -0
  117. package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +478 -0
  118. package/skills/wix-replatform/resources/rp-source-csv/lib/canonical-record.js +136 -0
  119. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
  120. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fingerprint.js +310 -0
  121. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-layout.js +1081 -0
  122. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-parse.js +618 -0
  123. package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +949 -0
  124. package/skills/wix-replatform/resources/rp-source-csv/source-schema.example.json +196 -0
  125. package/skills/wix-replatform/resources/rp-source-csv/vendors/bigcommerce.json +66 -0
  126. package/skills/wix-replatform/resources/rp-source-csv/vendors/magento.json +60 -0
  127. package/skills/wix-replatform/resources/rp-source-csv/vendors/shopify.json +95 -0
  128. package/skills/wix-replatform/resources/rp-source-csv/vendors/woocommerce.json +82 -0
  129. package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +256 -0
  130. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +249 -0
  131. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +444 -0
  132. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +774 -0
  133. package/skills/wix-replatform/resources/rp-source-wordpress/source-schema.example.json +71 -0
  134. package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +632 -0
  135. package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +330 -0
  136. package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +21 -0
  137. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -0
  138. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +37 -0
  139. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +37 -0
  140. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +39 -0
  141. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +35 -0
  142. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +14 -0
  143. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +35 -0
  144. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +36 -0
  145. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +35 -0
  146. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +14 -0
  147. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +131 -0
  148. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +37 -0
  149. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +37 -0
  150. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +21 -0
  151. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +37 -0
  152. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +37 -0
  153. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +97 -0
  154. package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +528 -0
  155. package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -0
  156. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +38 -0
  157. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +37 -0
  158. package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -0
  159. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +37 -0
  160. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +53 -0
  161. package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +84 -0
  162. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +25 -0
  163. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +37 -0
  164. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +37 -0
  165. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +38 -0
  166. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +37 -0
  167. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +90 -0
  168. package/skills/wix-replatform/resources/rp-target-wix/lib/audit-summary.js +64 -0
  169. package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +141 -0
  170. package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +384 -0
  171. package/skills/wix-replatform/resources/rp-target-wix/lib/ndjson.js +260 -0
  172. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +238 -0
  173. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +237 -0
  174. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +238 -0
  175. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +2219 -0
  176. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +31 -0
  177. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge.js +100 -0
  178. package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +107 -0
  179. package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +344 -0
  180. package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +250 -0
  181. package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1927 -0
  182. package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +83 -0
  183. package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +141 -0
  184. package/skills/wix-replatform/scripts/artifact-freshness.js +76 -0
  185. package/skills/wix-replatform/scripts/execution-manifest-validate.js +43 -0
  186. package/skills/wix-replatform/scripts/execution-state-prepare.js +128 -0
  187. package/skills/wix-replatform/scripts/orchestration-preflight.js +48 -0
  188. package/skills/wix-replatform/scripts/orchestration-route.js +46 -0
  189. package/skills/wix-replatform/scripts/orchestration-state.js +245 -0
  190. package/skills/wix-vibe-headless/SKILL.md +48 -25
  191. package/skills/wix-vibe-headless/install/deploy.cjs +95 -0
  192. package/skills/wix-vibe-headless/install/pin-agents-md.cjs +34 -0
  193. package/skills/wix-vibe-headless/platforms/README.md +8 -4
  194. package/skills/wix-vibe-headless/platforms/base44.md +133 -98
  195. package/skills/wix-vibe-headless/platforms/generic.md +99 -64
  196. package/skills/wix-vibe-headless/references/blog/INSTRUCTIONS.md +230 -119
  197. package/skills/wix-vibe-headless/references/blog/app/components/PostCard.jsx +43 -0
  198. package/skills/wix-vibe-headless/references/blog/app/components/PostChips.jsx +25 -0
  199. package/skills/wix-vibe-headless/references/blog/app/components/PostGrid.jsx +15 -0
  200. package/skills/wix-vibe-headless/references/blog/app/context/TaxonomyContext.jsx +35 -0
  201. package/skills/wix-vibe-headless/references/blog/app/hooks/usePostDetail.js +38 -0
  202. package/skills/wix-vibe-headless/references/blog/app/pages/Blog.jsx +40 -0
  203. package/skills/wix-vibe-headless/references/blog/app/pages/CategoryPage.jsx +54 -0
  204. package/skills/wix-vibe-headless/references/blog/app/pages/PostDetail.jsx +65 -0
  205. package/skills/wix-vibe-headless/references/blog/app/pages/TagPage.jsx +50 -0
  206. package/skills/wix-vibe-headless/references/blog/seed/SEED.md +103 -0
  207. package/skills/wix-vibe-headless/references/blog/seed/seed-blog.js +270 -0
  208. package/skills/wix-vibe-headless/references/bookings/INSTRUCTIONS.md +260 -149
  209. package/skills/wix-vibe-headless/references/bookings/app/components/BookingForm.jsx +65 -0
  210. package/skills/wix-vibe-headless/references/bookings/app/components/ServiceCard.jsx +47 -0
  211. package/skills/wix-vibe-headless/references/bookings/app/components/ServiceGrid.jsx +13 -0
  212. package/skills/wix-vibe-headless/references/bookings/app/components/SlotPicker.jsx +126 -0
  213. package/skills/wix-vibe-headless/references/bookings/app/hooks/useServiceDetail.js +108 -0
  214. package/skills/wix-vibe-headless/references/bookings/app/hooks/useServices.js +58 -0
  215. package/skills/wix-vibe-headless/references/bookings/app/lib/serviceFacts.js +95 -0
  216. package/skills/wix-vibe-headless/references/bookings/app/pages/ServiceDetail.jsx +94 -0
  217. package/skills/wix-vibe-headless/references/bookings/app/pages/Services.jsx +89 -0
  218. package/skills/wix-vibe-headless/references/bookings/{wix-bookings-checkout.js → app/rest/wix-bookings-checkout.js} +1 -1
  219. package/skills/wix-vibe-headless/references/bookings/{wix-bookings-services.js → app/rest/wix-bookings-services.js} +87 -11
  220. package/skills/wix-vibe-headless/references/bookings/seed/SEED.md +117 -0
  221. package/skills/wix-vibe-headless/references/bookings/seed/seed-bookings.js +333 -0
  222. package/skills/wix-vibe-headless/references/cms/INSTRUCTIONS.md +169 -147
  223. package/skills/wix-vibe-headless/references/cms/app/collection.config.js +31 -0
  224. package/skills/wix-vibe-headless/references/cms/app/lib/wixImage.js +18 -0
  225. package/skills/wix-vibe-headless/references/cms/{wix-cms.js → app/rest/wix-cms.js} +47 -2
  226. package/skills/wix-vibe-headless/references/cms/seed/SEED.md +145 -0
  227. package/skills/wix-vibe-headless/references/events/INSTRUCTIONS.md +228 -131
  228. package/skills/wix-vibe-headless/references/events/app/components/CategoryFilter.jsx +23 -0
  229. package/skills/wix-vibe-headless/references/events/app/components/EventCard.jsx +43 -0
  230. package/skills/wix-vibe-headless/references/events/app/components/EventGrid.jsx +13 -0
  231. package/skills/wix-vibe-headless/references/events/app/components/EventRegistration.jsx +29 -0
  232. package/skills/wix-vibe-headless/references/events/app/components/RsvpForm.jsx +57 -0
  233. package/skills/wix-vibe-headless/references/events/app/components/TicketPicker.jsx +78 -0
  234. package/skills/wix-vibe-headless/references/events/app/hooks/useEventDetail.js +27 -0
  235. package/skills/wix-vibe-headless/references/events/app/hooks/useEventsList.js +54 -0
  236. package/skills/wix-vibe-headless/references/events/app/hooks/useRsvpForm.js +40 -0
  237. package/skills/wix-vibe-headless/references/events/app/hooks/useTicketing.js +81 -0
  238. package/skills/wix-vibe-headless/references/events/app/pages/EventDetail.jsx +48 -0
  239. package/skills/wix-vibe-headless/references/events/app/pages/Events.jsx +36 -0
  240. package/skills/wix-vibe-headless/references/events/{wix-events-browse.js → app/rest/wix-events-browse.js} +1 -1
  241. package/skills/wix-vibe-headless/references/events/seed/SEED.md +107 -0
  242. package/skills/wix-vibe-headless/references/events/seed/seed-events.js +251 -0
  243. package/skills/wix-vibe-headless/references/members/INSTRUCTIONS.md +276 -188
  244. package/skills/wix-vibe-headless/references/members/app/components/LoginForm.jsx +101 -0
  245. package/skills/wix-vibe-headless/references/members/app/components/MemberMenu.jsx +33 -0
  246. package/skills/wix-vibe-headless/references/members/app/components/RequireAuth.jsx +21 -0
  247. package/skills/wix-vibe-headless/references/members/app/components/SocialButtons.jsx +29 -0
  248. package/skills/wix-vibe-headless/references/members/app/context/MemberContext.jsx +54 -0
  249. package/skills/wix-vibe-headless/references/members/app/hooks/useLoginForm.js +77 -0
  250. package/skills/wix-vibe-headless/references/members/app/pages/Account.jsx +36 -0
  251. package/skills/wix-vibe-headless/references/members/app/pages/Callback.jsx +32 -0
  252. package/skills/wix-vibe-headless/references/members/app/pages/Login.jsx +35 -0
  253. package/skills/wix-vibe-headless/references/members/{wix-members-auth.js → app/rest/wix-members-auth.js} +6 -3
  254. package/skills/wix-vibe-headless/references/members/install/Register.jsx +22 -0
  255. package/skills/wix-vibe-headless/references/members/seed/SEED.md +22 -0
  256. package/skills/wix-vibe-headless/references/portfolio/INSTRUCTIONS.md +233 -104
  257. package/skills/wix-vibe-headless/references/portfolio/app/components/CollectionCard.jsx +31 -0
  258. package/skills/wix-vibe-headless/references/portfolio/app/components/CollectionGrid.jsx +15 -0
  259. package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectCard.jsx +39 -0
  260. package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectGrid.jsx +15 -0
  261. package/skills/wix-vibe-headless/references/portfolio/app/components/ProjectMedia.jsx +29 -0
  262. package/skills/wix-vibe-headless/references/portfolio/app/hooks/useCollectionProjects.js +35 -0
  263. package/skills/wix-vibe-headless/references/portfolio/app/hooks/usePortfolioGallery.js +27 -0
  264. package/skills/wix-vibe-headless/references/portfolio/app/hooks/useProjectDetail.js +25 -0
  265. package/skills/wix-vibe-headless/references/portfolio/app/pages/CollectionPage.jsx +39 -0
  266. package/skills/wix-vibe-headless/references/portfolio/app/pages/Portfolio.jsx +27 -0
  267. package/skills/wix-vibe-headless/references/portfolio/app/pages/ProjectDetail.jsx +60 -0
  268. package/skills/wix-vibe-headless/references/portfolio/seed/SEED.md +94 -0
  269. package/skills/wix-vibe-headless/references/portfolio/seed/seed-portfolio.js +236 -0
  270. package/skills/wix-vibe-headless/references/pricing-plans/INSTRUCTIONS.md +240 -117
  271. package/skills/wix-vibe-headless/references/pricing-plans/app/components/OrderCard.jsx +35 -0
  272. package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanCard.jsx +48 -0
  273. package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanGrid.jsx +16 -0
  274. package/skills/wix-vibe-headless/references/pricing-plans/app/components/PlanPrice.jsx +35 -0
  275. package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/useMyPlans.js +25 -0
  276. package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/usePlanDetail.js +28 -0
  277. package/skills/wix-vibe-headless/references/pricing-plans/app/hooks/usePlans.js +30 -0
  278. package/skills/wix-vibe-headless/references/pricing-plans/app/pages/MyPlans.jsx +30 -0
  279. package/skills/wix-vibe-headless/references/pricing-plans/app/pages/PlanDetail.jsx +53 -0
  280. package/skills/wix-vibe-headless/references/pricing-plans/app/pages/Plans.jsx +28 -0
  281. package/skills/wix-vibe-headless/references/pricing-plans/seed/SEED.md +86 -0
  282. package/skills/wix-vibe-headless/references/pricing-plans/seed/seed-pricing-plans.js +251 -0
  283. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +248 -124
  284. package/skills/wix-vibe-headless/references/restaurants/app/components/ItemDialog.jsx +81 -0
  285. package/skills/wix-vibe-headless/references/restaurants/app/components/MenuItemCard.jsx +71 -0
  286. package/skills/wix-vibe-headless/references/restaurants/app/components/MenuList.jsx +43 -0
  287. package/skills/wix-vibe-headless/references/restaurants/app/components/OrderCartButton.jsx +21 -0
  288. package/skills/wix-vibe-headless/references/restaurants/app/components/OrderCartDrawer.jsx +60 -0
  289. package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +63 -0
  290. package/skills/wix-vibe-headless/references/restaurants/app/hooks/useItemOrder.js +32 -0
  291. package/skills/wix-vibe-headless/references/restaurants/app/hooks/useReservation.js +73 -0
  292. package/skills/wix-vibe-headless/references/restaurants/app/pages/Menu.jsx +28 -0
  293. package/skills/wix-vibe-headless/references/restaurants/app/pages/Reservations.jsx +102 -0
  294. package/skills/wix-vibe-headless/references/restaurants/seed/SEED.md +180 -0
  295. package/skills/wix-vibe-headless/references/restaurants/seed/seed-restaurants.js +452 -0
  296. package/skills/wix-vibe-headless/references/shared/app/components/WixManageBanner.jsx +56 -0
  297. package/skills/wix-vibe-headless/references/shared/{wix-client.js → app/rest/wix-client.js} +6 -8
  298. package/skills/wix-vibe-headless/references/shared/app/rest/wix-config.js +6 -0
  299. package/skills/wix-vibe-headless/references/storefront/INSTRUCTIONS.md +263 -157
  300. package/skills/wix-vibe-headless/references/storefront/app/components/CartButton.jsx +20 -0
  301. package/skills/wix-vibe-headless/references/storefront/app/components/CartDrawer.jsx +150 -0
  302. package/skills/wix-vibe-headless/references/storefront/app/components/ProductCard.jsx +167 -0
  303. package/skills/wix-vibe-headless/references/storefront/app/components/ProductGallery.jsx +51 -0
  304. package/skills/wix-vibe-headless/references/storefront/app/components/ProductGrid.jsx +54 -0
  305. package/skills/wix-vibe-headless/references/storefront/app/components/VariantPicker.jsx +119 -0
  306. package/skills/wix-vibe-headless/references/storefront/app/context/CartContext.jsx +71 -0
  307. package/skills/wix-vibe-headless/references/storefront/app/hooks/useProductDetail.js +109 -0
  308. package/skills/wix-vibe-headless/references/storefront/app/hooks/useShop.js +98 -0
  309. package/skills/wix-vibe-headless/references/storefront/app/lib/storeImage.js +27 -0
  310. package/skills/wix-vibe-headless/references/storefront/app/pages/ProductDetail.jsx +139 -0
  311. package/skills/wix-vibe-headless/references/storefront/app/pages/Shop.jsx +75 -0
  312. package/skills/wix-vibe-headless/references/storefront/{wix-store-cart.js → app/rest/wix-store-cart.js} +1 -1
  313. package/skills/wix-vibe-headless/references/storefront/{wix-store-catalog.js → app/rest/wix-store-catalog.js} +20 -1
  314. package/skills/wix-vibe-headless/references/storefront/seed/SEED.md +111 -0
  315. package/skills/wix-vibe-headless/references/storefront/seed/seed-store.js +299 -0
  316. /package/skills/wix-vibe-headless/references/blog/{wix-blog.js → app/rest/wix-blog.js} +0 -0
  317. /package/skills/wix-vibe-headless/references/events/{wix-events-registration.js → app/rest/wix-events-registration.js} +0 -0
  318. /package/skills/wix-vibe-headless/references/portfolio/{wix-portfolio.js → app/rest/wix-portfolio.js} +0 -0
  319. /package/skills/wix-vibe-headless/references/pricing-plans/{wix-pricing-plans.js → app/rest/wix-pricing-plans.js} +0 -0
  320. /package/skills/wix-vibe-headless/references/restaurants/{wix-restaurants-menu.js → app/rest/wix-restaurants-menu.js} +0 -0
  321. /package/skills/wix-vibe-headless/references/restaurants/{wix-restaurants-ordering.js → app/rest/wix-restaurants-ordering.js} +0 -0
  322. /package/skills/wix-vibe-headless/references/restaurants/{wix-restaurants-reservations.js → app/rest/wix-restaurants-reservations.js} +0 -0
@@ -0,0 +1,632 @@
1
+ ---
2
+ name: rp-target-wix
3
+ description: >-
4
+ Wix target adapter with verified write primitives, shared execution runtimes, and contract tests.
5
+ Use when vendoring Wix writers, validating API shapes, or Wix provisioning mechanics.
6
+ ---
7
+
8
+ # rp-target-wix
9
+
10
+ Wix **target adapter**. Owns the Wix-side write surface and shared execution runtime that every migration shares —
11
+ verified once here so the platform-agnostic stages and per-project codegen never
12
+ re-derive (and re-break) it. This is the symmetric counterpart to `rp-source-wordpress`:
13
+ that adapter owns *reading* a source platform; this one owns *writing* to Wix.
14
+
15
+ ## When this skill is used
16
+
17
+ Not a stage in the flow — a reference + shared library consulted by:
18
+
19
+ - **`rp-import-codegen`** vendors `lib/wix-writers.js` into the project (like the
20
+ `wp-http` transport) plus the shared write/setup runtime modules, and generates thin
21
+ project-specific write specs/transforms that **call these primitives/runtime APIs**.
22
+ Codegen does not re-emit Wix API plumbing.
23
+ - **`rp-setup-discovery` / `rp-execute-setup`** consult the "Verified endpoints" and
24
+ "Provisioning" notes for app-install / Wix-Data / collection mechanics.
25
+
26
+ Because the Wix surface is identical across source platforms, adding a new source
27
+ (`rp-source-shopify`, …) requires **no change here**.
28
+
29
+ ## Shared runtime boundary
30
+
31
+ This adapter owns the **shared Wix layer** written once for all migrations.
32
+
33
+ It should own:
34
+
35
+ - verified request builders and endpoint primitives
36
+ - shared Wix client/auth handling
37
+ - shared retry and throttling policy
38
+ - generic write execution runtime
39
+ - generic setup execution/runtime behavior
40
+ - checkpoint helpers
41
+ - local crosswalk helpers (`state/crosswalk/crosswalk.ndjson` authority, append-only
42
+ attempt journal, optional CMS mirror seed/upload adapters)
43
+ - URL preservation helpers (`state/url-preservation/` base paths, ledger, planned
44
+ redirects, and unresolved route rows)
45
+ - NDJSON record-stream I/O (`lib/ndjson.js`): streaming read/write, batching by count and by
46
+ cost, cursoring, and append-only producers. Migration data files are record streams, so the
47
+ scan/batch/cursor primitives live here once instead of being re-derived by codegen.
48
+ - audit log emission
49
+ - compact execution report generation
50
+ - contract tests for stable request/runtime behavior
51
+
52
+ Per-migration code generation should own only:
53
+
54
+ - field maps
55
+ - transforms
56
+ - write specs
57
+ - setup-plan renderings
58
+ - entity ordering
59
+ - dependency wiring
60
+
61
+ ## Write contract (the verified Wix surface)
62
+
63
+ `lib/wix-writers.js` exposes pure request builders (`build*Request`) + executors. Shapes
64
+ marked **VERIFIED** were validated by a real call against a live site, not just read from
65
+ docs. Shapes marked **UNVERIFIED** are docs-schema/MCP-derived bootstrap primitives that
66
+ must be surfaced in execution plans until a live contract call promotes them. It also
67
+ exports `sendDirectRest` and `notifyMissingWriter` for generated native REST paths when
68
+ Wix has a native entity but this adapter does not yet ship a dedicated primitive.
69
+
70
+ This resource should also expose shared execution-runtime modules above those primitives,
71
+ so generated migrations use one common path for retries, throttling, checkpointing,
72
+ reporting, and audit logging.
73
+
74
+ **Read/return contract for `query*` executors.** Every `query*` executor
75
+ (`queryStoresProducts`, `queryStoresCategories`, `queryContacts`, `queryCoupons`,
76
+ `queryOrders`) **unwraps the response to the entity array and returns one page**, discarding
77
+ `pagingMetadata`. Two failure modes follow, both of which have shipped:
78
+
79
+ - **The return value IS the array.** Reading `.products` / `.categories` off it a second time
80
+ gives `undefined` → `[]`. A dedupe index or existing-entity safety net then comes back
81
+ empty *without erroring*, which is indistinguishable from a fresh site — so the import
82
+ duplicates what is already there, and a setup verification reports 0 categories on a site
83
+ with 25.
84
+ - **These executors cannot be cursor-paged**, because the cursor is in the metadata they
85
+ discarded. Use a `queryAll*` primitive where one exists — `queryAllStoresCategories`,
86
+ `queryAllStoresProducts`, `queryAllDataItems` — otherwise send
87
+ `wix.send(build<X>Request(body))` and read `pagingMetadata.cursors.next` off the raw
88
+ response.
89
+
90
+ Every sweep used for dedupe must **throw on a partial result rather than return it**. "Empty
91
+ net" and "empty store" look identical to the caller, and the caller assumes the second.
92
+
93
+ ## Domain entity suitability knowledge
94
+
95
+ Target entity suitability lives in `domains/`, not in a large prose table in this skill.
96
+ Use the deterministic reader as the normal access path:
97
+
98
+ ```bash
99
+ node scripts/domain-knowledge.js list-domains
100
+ node scripts/domain-knowledge.js list-entities --domain stores
101
+ node scripts/domain-knowledge.js read-entity --ref stores/product
102
+ node scripts/domain-knowledge.js resolve-source --source-system woocommerce --source-entity product
103
+ node scripts/domain-knowledge.js resolve-source --route /wc/v3/products
104
+ node scripts/domain-knowledge.js list-flagged --flag IMPORT_UNRELIABLE
105
+ node scripts/domain-knowledge.js summarize-entities --refs stores/product,ecom/order
106
+ ```
107
+
108
+ `domains/index.json` is generated from domain/entity files and checked in. After editing
109
+ domain knowledge, run:
110
+
111
+ ```bash
112
+ node scripts/domain-knowledge-validate.js --write-index
113
+ ```
114
+
115
+ `writerId` values in entity files must match exported functions from `lib/wix-writers.js`;
116
+ use `null` for direct REST plans, setup/manual work, or unsupported native gaps.
117
+
118
+ Entity files may also expose `fieldContracts[]` for verified nested write paths. These
119
+ are machine-readable contracts for codegen and dry-run validators, not replacements for
120
+ the human notes below. For Stores products, `domains/stores/entities/product.json`
121
+ records the verified Catalog V3 create contract for `product.subscriptionDetails`,
122
+ including required nested paths, allowed recurrence values, read-back behavior, and the
123
+ live-validated `subscriptions[].description <= 60` constraint. Generated transforms
124
+ should consume that metadata through the vendored `wix-writers.js` exports instead of
125
+ copying limits into project-local code.
126
+
127
+ Live verification helpers must not edit `domains/` directly. When a probe changes a
128
+ target write assumption, emit a proposal artifact and let the orchestrator promote it
129
+ deliberately:
130
+
131
+ ```bash
132
+ node skills/replatform/resources/rp-target-wix/scripts/verify-stores.js stores subscription-create \
133
+ --artifact migrations/<project>/setup/stores-subscription-verification.json \
134
+ --proposal-artifact migrations/<project>/setup/contract-ledger-proposal.json
135
+ ```
136
+
137
+ Use `lib/contract-ledger.js` to validate the handoff: a passed verification without a
138
+ proposal is incomplete, and a proposal that is neither promoted into `fieldContracts[]`
139
+ nor explicitly deferred is stale product knowledge. Codegen should consume
140
+ `fieldContracts[]` through `scripts/domain-knowledge.js summarize-entities`, which
141
+ includes promoted contracts.
142
+
143
+ | Capability | Endpoint | Notes / traps |
144
+ | --- | --- | --- |
145
+ | HTML → rich content | `POST /ricos/v1/ricos-document/convert/to-ricos` | VERIFIED. `options.plugins` enum is **UPPERCASE** — the docs example shows lowercase and 400s. |
146
+ | Import media from URL | `POST /site-media/v1/files/import` | VERIFIED. **Async**: response is `PENDING`; poll `GET /site-media/v1/files/{id}` for `READY` before referencing. |
147
+ | Blog category | `POST /blog/v3/categories` | VERIFIED. body `{ category: { label, slug, description } }`. |
148
+ | Blog tag | `POST /blog/v3/tags` | VERIFIED. Body is **top-level `{ label, language }`** — NOT `{ tag: { label, slug } }`; slug is derived. |
149
+ | Blog post | `POST /blog/v3/draft-posts` → `…/{id}/publish` | VERIFIED. `memberId` **required** (3rd-party). VERIFIED (2026-08-02): the **site owner's auto-created user-member** satisfies it — it was already present on our API-provisioned test site with zero Members-area interaction (single-site observation), so attribute-to-owner needs no member provisioning. **Resolve it via `listMembers` + `loginEmail` match — never derive it from the account/user GUID** (the observed id equality is n=1 on a solo account, undocumented). Also VERIFIED (2026-08-02): author is **re-assignable after publish** — `PATCH /blog/v3/draft-posts/{id}` `{ draftPost: { memberId } }` then republish updates the published post's author (post id == draft id; republish fires non-suppressed events — do author-upgrade passes inside the notification-mute window). Visible custom cover media requires **both** `heroImage.id` and `media: { displayed:true, custom:true, wixMedia:{ image:{ id }}}`. `heroImage.id` alone leaves the cover hidden. |
150
+ | Blog posts (bulk) | `POST /blog/v3/bulk/draft-posts/create` | UNVERIFIED bootstrap (public docs + wix/skills `wix-manage` recipe, 2026-07-21). Max **20 posts/call**; `bulkCreateDraftPosts` chunks larger inputs. Prefer over per-post creates for N ≥ 2 (single create runs ~25–30s/call per the recipe). Publish is still per-post — a bulk `publish` flag is unverified. Surface in the execution plan until the live contract call promotes it. |
151
+ | CMS item | `POST /wix-data/v2/items` | VERIFIED. `{ dataCollectionId, dataItem: { data } }`. Requires Wix Data enabled (else `WDE0110`). |
152
+ | Members | `GET`/`POST /members/v1/members` | VERIFIED. dedup by `loginEmail` (gated PII; use a fallback member when absent). VERIFIED (2026-08-02, single-site observation): the target-site member list can already contain **auto-created user-members** for the owner/contributing Wix users (`status: APPROVED`; resolve by `loginEmail`, never by deriving from the account GUID — the observed id equality is undocumented) — never dedupe or count these against source-site members; `DELETE /members/v1/members/{id}` works for cleaning up importer-created members. Throughput: **no bulk create; documented ≥1s spacing** (10k ≈ 3h serial floor — plan + resume via crosswalk). Create sends **no email** and does **not** fire the signup automations trigger (source-confirmed) — silent by default. **Activation policy (decided 2026-08-03): passwords are never imported, and passwordless members complete the standard forgot-password flow (confirmed).** Delivery = post-import **label-wave automation**: owner creates one dashboard automation (trigger `label added`, e.g. `migrated-2026` → owner-branded email: "Log in → Forgot password"); importer applies the label via API in batches for rate control/re-targeting; enable only after the import window (AUTO-02 pause). **Never mass-send** `send-set-password-email` (3h single-use link), and never fetch/store per-member reset links — they are credential-equivalent secrets and the no-link flow needs none (details: research/import-api-suitability/orders-contacts-members.md §3 addendum). |
153
+ | Stores product (BULK — the scale path) | `POST /stores/v3/bulk/products-with-inventory/create` | UNVERIFIED bootstrap. **Use this, not per-product creates, for any catalog above a handful** — 1000 products is 11 calls instead of 1000. Creates up to 100 products with inline options, inline brand/ribbon/infoSections, all variants AND per-variant inventory items in one request. **Five caps apply simultaneously and exceeding ANY ONE rejects the whole request:** products ≤100, `variantsInfo.variants` ≤1000 total, `options` ≤100 total, `modifiers` ≤100 total, `infoSections` ≤100 total. With 2 options per product the options cap binds at **50** products, not 100 — so batch with `lib/ndjson.js` → `readBatchesByLimits` using the exported `BULK_PRODUCT_LIMITS` + `storesProductBulkCost`, never on record count alone. **TRAP: bulk is NOT atomic** — a `200` can carry per-item failures in `results[].itemMetadata.success`; never infer success from the HTTP status. **TRAP: correlate results by `itemMetadata.originalIndex`**, not response position. **TRAP: `bulkActionMetadata.undetailedFailures`** counts failures whose detail the server dropped; ignoring it silently loses records. `returnEntity:false` (default) still returns `itemMetadata.id`, which is all a crosswalk needs — pass `true` only for a contract probe that must inspect the created entity. `bulkCreateStoresProductsWithInventory` handles normalization, correlation and the unaccounted-item check, returning `{ results, succeeded, failed, undetailedFailures, unaccounted }`. Normalization is purely local — HTML descriptions travel as `plainDescription` for Wix to convert server-side — so a batch is **one** HTTP call. It used to convert one description per product first, which made a 100-product batch 101 calls and reliably tripped the Ricos endpoint's 403 throttle. |
154
+ | Stores product | `POST /stores/v3/products`, `POST /stores/v3/products/query`, `PATCH /stores/v3/products/{id}`, `GET /stores/v3/products/{id}`, `GET /stores/v3/products/slug/{slug}` | VERIFIED (2026-07-05; media patch verified in migration-20260715-01). `buildCreateStoresProductRequest` runs `normalizeStoresProductV3`, which bakes in the create traps: PHYSICAL requires `physicalProperties:{}`; simple/V1-ish top-level `price`, `sku`, and physical properties are moved into a single V3 variant; option/variant choice names clamped to 50 (identical truncation both places); variant `optionChoiceNames.renderType` defaulted to `TEXT_CHOICES`; `compareAtPrice` dropped unless strictly > `actualPrice`; variant `price` must be a **money object** (`{ actualPrice: { amount: "14.95" } }`) — a bare string/number 400s "Expected an object" (verified 2026-07-19), so the normalizer coerces scalar prices. **Descriptions:** a string `description` is HTML and is moved to **`plainDescription`** by `normalizeStoresProductV3`; Wix converts that to rich content server-side, so the product path never calls the Ricos endpoint (`description` proper is a Ricos document *object* — HTML there is a type error). **TRAP: `plainDescription` is silently ignored when `description` is also set** — a 200 with an empty description — so the normalizer throws when both are present. **TRAP: hard cap of 16,000 characters** (the old Ricos path chunked at 28k and merged, so it was effectively unbounded); over-long bodies throw rather than truncate, and need an info section or an explicit `mapping-gaps.json` entry. For product media, prefer `media.itemsInfo.items[]` with external `url` values when the source URLs are publicly reachable: the Stores product API ingests them in the background, avoiding the slower, heavily-throttled Media Manager pre-import path. Use pre-imported Wix media ids only when the target flow requires them. **Upsert lookups:** `getStoresProduct(wix, id)` and `getStoresProductBySlug(wix, slug)` return the product or throw 404 — callers should catch and treat as `null` for "not found". **Catalog sweeps:** `queryStoresProducts` returns **one page** unwrapped to the array with the cursor discarded, so a crosswalk-recovery or name-match safety net must use **`queryAllStoresProducts(wix)`**, which follows the cursor and throws rather than returning a partial index. **Slugs:** sanitizing is owned by `lib/wix-build.js` (`toWixSlug`, applied automatically via the `coerce: 'slug'` rule on `product.slug`), not by this module and deliberately not by `normalizeStoresProductV3` — the writer passes the caller's slug through unchanged so URL preservation can record the original next to the derived `plannedTargetSlug`. It matters because Wix rejects anything outside `[a-z0-9-]` and slug validation precedes application, so one bad slug (Shopify mints `ph-5_5` from a "pH 5.5" title) 400s the entire bulk batch rather than just that product. **General patch:** `patchStoresProduct(wix, { productId, revision, ...fields })` applies `normalizeStoresProductV3`, so a string `description` moves to `plainDescription` here too; `revision` from the existing product is required. UNVERIFIED for get-by-id, get-by-slug, and general-field patch (endpoint VERIFIED; arbitrary-field patching and slug lookup not yet live-tested). **Variable products / variant matrices:** Wix Stores V3 requires server-assigned `optionChoiceId` GUIDs before a variant matrix can be built — those IDs do not exist until after the initial `createStoresProduct` call returns. A single-pass import therefore cannot create a full variant matrix in one call. The two-pass approach: (1) create the product with options declared (but no variants), (2) create each option choice via `POST /stores/v3/products/{id}/options/{optionId}/choices` to obtain server-assigned choice IDs, (3) create variants via `POST /stores/v3/products/{id}/variants`. When the two-pass flow is out of scope (e.g. public-data single-pass run), import as a single-variant product at the base price, record the fidelity loss in `mapping-gaps.json`, surface it in the execution-plan report, and ensure the generated product detail page renders `productOptions` when non-empty so the storefront is ready once options are added. |
155
+ | Stores category | `POST /categories/v1/categories`, `POST /categories/v1/categories/query` | VERIFIED (2026-07-05) for create. Body `{ category, treeReference }` — `treeReference` is **top-level** (sibling of `category`, `{appNamespace:"@wix/stores"}`); nesting it 400s "treeReference must not be empty". Empty optional strings such as `description: ""` are omitted. **Query:** same top-level `treeReference` trap applies. `queryStoresCategories(wix)` returns **one page (100 max)** unwrapped to the array — it does **not** return all categories, and the unwrap discards the cursor so it cannot be paged. Any dedupe/upsert index must use **`queryAllStoresCategories(wix)`**, which follows `pagingMetadata.cursors.next` and throws rather than returning a partial index. Observed 2026-07-29: a site with 119 categories read back as 100 through the single-page call, which would have duplicated the missing 19. UNVERIFIED for query (not yet live-tested). |
156
+ | Wix Tag (global) | `POST /tags/v1/tags` | UNVERIFIED bootstrap. Body `{ tag: { name, fqdn } }`. FQDN for Stores V3 products: `"wix.stores.catalog.v3.product"`. Max 100 tags per FQDN. Create tags before products; crosswalk tag IDs into product `tags.publicTags.tagIds[]` at create time. Tags are a native Wix entity — do not route product tags to CMS. |
157
+ | Stores inventory item | `POST /stores/v3/inventory-items` | UNVERIFIED bootstrap. `{ inventoryItem: { variantId, productId, inStock: true } }` marks a variant as in-stock at the default location (omit `locationId`). Inventory items are **not** auto-created on product create — call this for each variant after `createStoresProduct`. For quantity-tracked stock use `{ quantity, trackQuantity: true }` instead of `inStock`. `setProductVariantsInStock(wix, { productId, variantIds })` is a convenience wrapper that calls `createInventoryItem` for each variant. Requires permission scope `SCOPE.STORES.INVENTORY_ITEM_WRITE`. |
158
+ | Stores category membership | `POST /categories/v1/bulk/categories/add-item` | VERIFIED (2026-07-05). `{ item:{ catalogItemId, appId }, categoryIds[], treeReference }`; `appId` = Wix Stores `215238eb-…`, `catalogItemId` = Wix product id. |
159
+ | Contacts | `POST /contacts/v5/contacts`, `POST /contacts/v5/bulk/contacts/upsert`, `POST /contacts/v5/contacts/query`, `GET /contacts/v5/contacts/{id}`, `PATCH /contacts/v5/contacts/{id}` | **GA** (docs verified 2026-08-04 — was Developer Preview when selected on 2026-07-26). Do not fall back to V4 unless a migration explicitly chooses a legacy compatibility path. **The GA contact shape is FLAT** — no `info` wrapper, no `emails.items`/`phones.items` list wrappers: one main `email`/`phone` (contact matching + subscription status live on these) plus `additionalEmails`/`additionalPhones` arrays; `addresses[]` keeps postal fields **nested under `address`**; `company` is `{ name, jobTitle }`. Create and update both take `{ contact, allowDuplicates }`; update requires the current `revision` and has **no fieldMask**. Phone tags: `OTHER`/`MAIN`/`HOME`/`MOBILE`/`WORK`/`FAX` (no `UNTAGGED`). `buildCreateContactRequest`/`buildUpdateContactRequest` accept the flat GA `contact` (legacy `info` payloads convert strictly — non-mechanical keys like `extendedFields`/`labelKeys` throw). Live create/query/update verification is still pending a token with Contacts permissions (2026-07-26 probe got `403`) — keep V5 writers surfaced as UNVERIFIED in execution reports until a live contract test promotes them. **Custom fields (GA):** the V5 contact carries `extendedFields.namespaces.<ns>`; per the V5 contact-object docs, definitions go through the **Data Extension Schema API with FQDN `wix.contacts.*.contact`** (user-defined values under `_user_fields`). The V4 Contacts Extended Fields API (`POST /contacts/v4/extended-fields`, values under `info.extendedFields`) pairs with the V4 surface only — do not mix. CAVEAT: the Data Extension Schema intro's supported-objects table does not list contacts yet (docs inconsistency at GA cutover); verify the DES path live during setup before relying on it. **Labels → tags:** V5 exposes `tags.privateTags.tagIds[]` managed via the Tags API (same FQDN); V4 label APIs and the `labels_added` automation trigger are a V4-surface concept — resolve the tag/label story during setup before planning post-import label waves through V5 writers. |
160
+ | Coupons | `POST /stores/v2/coupons`, `POST /stores/v2/coupons/query` | UNVERIFIED bootstrap. Prefer native Wix coupons because Wix has a native coupon entity; do not special-case coupons into CMS merely for caution or because scoping must be mapped. Fallback is only for source semantics with no native representation. |
161
+ | eCom order | `POST /ecom/v1/orders`, `POST /ecom/v1/orders/query` | UNVERIFIED docs-schema bootstrap. Treat as blocked unless setup verification proves historical order creation is side-effect-free. |
162
+ | Site notifications mute | `POST /notification-preferences/v1/site-mute/mute`, `POST /notification-preferences/v1/site-mute/unmute`, `GET /notification-preferences/v1/site-mute` | VERIFIED (2026-08-04, full cycle live on a test target: mute → state read → idempotent re-mute → unmute → state restored, all 200). Spec 0012. Mutes **all** notifications of the site in context — all recipients, all channels; sendability denied regardless of recipient-level preferences. All three calls return `{ siteMuteState: { muted, reason?, mutedBy: { wixUserId } } }`; executors unwrap to `siteMuteState`. Mute body `{ reason?: string }` (≤500, clamped by the builder) — always pass a project-identifying reason (`RePlatform migration — <project>`) so the mute is auditable. **TRAP: re-mute overwrites `reason`** (last caller wins) — the import preflight's idempotent re-call must pass the same reason as setup. **AUTH TRAP: user tokens only** — the CLI-minted `OauthNG` site token (`WIX_AUTH_TOKEN` from `config/wix.env`) works; an account API key gets a uniform empty-body 403 on all three endpoints. Hard invariant (spec 0012): when mute is in effect (always for `WIX_SITE_STRATEGY=new`; explicit opt-in for existing sites), a failed mute halts the run before any import write — no degraded mode. `unmuteSiteNotifications` is **never called by the flow itself** — explicit owner request only; after an on-request unmute, confirm `muted: false` via `getSiteMuteState`. |
163
+ | Direct native REST | any Wix REST path derived by codegen | UNVERIFIED generated path for native Wix entities missing a dedicated adapter writer. Must log, call `notifyMissingWriter`, and be shown in the execution plan. |
164
+
165
+ ## Safe-mode contact replacement
166
+
167
+ `lib/wix-writers.js` exports the shared safe-mode runtime:
168
+
169
+ ```js
170
+ createSafeModeConfig(env)
171
+ mockEmailForEntity(entityType, entityId)
172
+ sanitizeContactFieldsForSafeMode(value, options)
173
+ sanitizeWixRequestBody(body, options)
174
+ ```
175
+
176
+ Generated imports must pass `safeModeOptions` to writer builders/executors when
177
+ `SAFE_MODE` is enabled. Request builders sanitize a copied request body before returning
178
+ it and throw `SafeModeBlockedError` before any send when suspicious non-replaced email
179
+ values remain.
180
+
181
+ Safe-mode replacement paths use deterministic request-body paths with object fields,
182
+ array wildcards, and Wix wrapper arrays, for example:
183
+
184
+ ```text
185
+ contact.email.email
186
+ contact.additionalEmails[].email
187
+ contact.phone.phone
188
+ order.billingInfo.email
189
+ dataItem.data.submissions[].email
190
+ ```
191
+
192
+ Replacement only touches primitive leaf values — a generic path that lands on an object
193
+ (such as the GA Contacts V5 `email` object) is skipped rather than clobbered, and any raw
194
+ email left inside a skipped object still trips the suspicious-value block.
195
+
196
+ Target domain entity files may define `safeModeContactFields[]` with `{ kind, targetPath,
197
+ source, notes }` entries. Mapper/codegen must merge those target hints with source-side
198
+ contact evidence and user mappings, then pass resolved request-body paths to the shared
199
+ writers.
200
+
201
+ ### Stores subscription validation
202
+
203
+ `lib/wix-writers.js` exports the Stores subscription contract and deterministic helpers:
204
+
205
+ - `STORES_SUBSCRIPTION_CONTRACT`
206
+ - `normalizeStoresProductSubscriptions`
207
+ - `validateStoresProductSubscriptionDetails`
208
+
209
+ Generated import code should call the normalizer from product transforms and the
210
+ validator during dry-run and immediately before live create. Validation failures are
211
+ record-level preflight failures/deferred outcomes; do not send known-invalid
212
+ subscription payloads to Wix to discover field errors live.
213
+
214
+ Catalog V3 subscriptions are a native Stores target, not an automatic CMS fallback or
215
+ semantic loss. Product create with `subscriptionDetails.allowOneTimePurchases` and
216
+ `subscriptions[]` entries containing `title`, `description`, `frequency`, `interval`, and
217
+ `autoRenewal` was verified live on 2026-07-26 in the nopong migration; Wix returned
218
+ server-assigned subscription option ids. Mapping/codegen should emit native recurring product
219
+ creates when the source cadence is known. General subscription patching remains unverified.
220
+
221
+ ### Stores live verification helpers
222
+
223
+ Use the shared Stores verification CLI for live target checks that would otherwise become
224
+ migration-local snippets:
225
+
226
+ ```bash
227
+ node skills/replatform/resources/rp-target-wix/scripts/verify-stores.js stores subscription-create \
228
+ --artifact migrations/<project>/setup/stores-subscription-verification.json \
229
+ --proposal-artifact migrations/<project>/setup/contract-ledger-proposal.json
230
+ node skills/replatform/resources/rp-target-wix/scripts/verify-stores.js stores product-count \
231
+ --artifact migrations/<project>/execution/stores-product-count-verification.json
232
+ node skills/replatform/resources/rp-target-wix/scripts/verify-stores.js stores product-by-source-marker \
233
+ --marker-path customFields.sourceId --marker-value <source-id> \
234
+ --artifact migrations/<project>/execution/stores-product-marker-verification.json
235
+ node skills/replatform/resources/rp-target-wix/scripts/verify-stores.js stores delete-probe \
236
+ --product-id <probe-product-id> \
237
+ --artifact migrations/<project>/setup/stores-probe-cleanup.json
238
+ ```
239
+
240
+ The CLI reads `WIX_AUTH_TOKEN` and `WIX_SITE_ID` from the environment or
241
+ `config/wix.env` under the current project root, creates the shared Wix client, and sends
242
+ requests through `wix.send(...)`. It writes machine-readable artifacts with the target
243
+ site id, endpoint, method, verified nested paths, discovered constraints, probe id,
244
+ cleanup status, warnings, recovery instructions, and timestamp. Failed probe cleanup is
245
+ not hidden: the artifact must remain with an explicit warning and a `delete-probe`
246
+ recovery command.
247
+
248
+ ## Routed URL preservation behavior
249
+
250
+ URL preservation is a mapping and execution-state concern. This adapter owns only the
251
+ Wix-side facts that generated code may rely on when deciding whether a final target URL is
252
+ known.
253
+
254
+ Current import-only phase rules:
255
+
256
+ - Do not configure Wix redirects or site routing.
257
+ - Do not guess a destination relative URL from a slug when Wix route behavior has not been
258
+ verified for that entity and delivery mode.
259
+ - When the destination base path or final URL is unknown, write URL ledger rows with
260
+ `urlStatus: "pending_target_route"` or `target_url_missing` and record unresolved rows
261
+ for the future website-builder phase.
262
+ - When a Wix create/update response or a safe declared lookup returns a final slug or
263
+ relative path, generated code may record it as `actualTargetSlug` or
264
+ `actualTargetRelativeUrl` and write a redirect plan if it differs from the source URL.
265
+
266
+ Known routed entity status:
267
+
268
+ | Entity | URL behavior contract |
269
+ | --- | --- |
270
+ | Blog posts | Create/publish is verified for content writes. Final public route exposure after publish is not verified here; generated code must treat the target route as `pending_target_route` unless a safe lookup in the generated write spec proves the final relative URL. |
271
+ | Blog categories | Category create is verified. Final public category route exposure is not verified here; default to `pending_target_route`. |
272
+ | Stores products | Product create and slug-bearing product operations are verified, but arbitrary route/base-path configuration is not part of this phase. Generated code may record actual target slugs only when returned or safely looked up; target relative URLs remain `pending_target_route` unless the route pattern is explicitly verified in the project. |
273
+ | Stores categories/collections | Category create is verified. Final collection/category route exposure is not verified here; default to `pending_target_route`. |
274
+ | CMS items with dynamic pages | CMS item writes are verified. Dynamic page route patterns are site-builder configuration, not native item import output; default to `pending_target_route` unless website-builder artifacts define the route. |
275
+
276
+ ## Shared execution runtime contract
277
+
278
+ In addition to endpoint primitives, this adapter should define the reusable runtime API
279
+ that generated migrations call.
280
+
281
+ Conceptual contracts:
282
+
283
+ ```ts
284
+ executeWriteSpec({
285
+ spec,
286
+ items,
287
+ client,
288
+ dryRun,
289
+ runContext,
290
+ }): Promise<WriteExecutionReport>
291
+
292
+ executeSetupPlan({
293
+ plan,
294
+ client,
295
+ dryRun,
296
+ runContext,
297
+ }): Promise<SetupExecutionReport>
298
+ ```
299
+
300
+ The exact filenames are implementation details, but the shared runtime should be the
301
+ single place that owns generic Wix execution mechanics.
302
+
303
+ ### `WriteSpec` contract
304
+
305
+ Generated migrations should pass a declarative `WriteSpec` into the shared runtime.
306
+
307
+ Each spec should define, as applicable:
308
+
309
+ - `entity`
310
+ - `mode`: `create | update | upsert | bulk_create | bulk_upsert`
311
+ - `create`
312
+ - `update`
313
+ - `lookup`
314
+ - `bulk`
315
+ - `batchSize`
316
+ - `concurrency`
317
+ - `retryPolicy`
318
+ - `throttlePolicy`
319
+ - `auditKeys`
320
+ - `crosswalkAuthority: "local"`
321
+ - `cmsMirror`
322
+ - `crosswalkStrategy`
323
+ - `reconciliationStrategy`
324
+ - `dependencyRefs`
325
+ - `verificationLevel`: `verified | unverified`
326
+
327
+ This resource should document how each field is interpreted by the runtime.
328
+
329
+ ### `WriteExecutionReport` contract
330
+
331
+ The shared runtime should return a compact, token-aware report suitable for the agent.
332
+
333
+ It should include:
334
+
335
+ - run ID
336
+ - entity
337
+ - counts: input, attempted, created, updated, skipped, failed, retried, throttled
338
+ - grouped error buckets
339
+ - references to fuller on-disk logs
340
+
341
+ The runtime should prefer grouped summaries over raw per-record detail.
342
+
343
+ These per-entity or per-phase reports are intermediate runtime outputs. They are inputs to
344
+ the final completion artifact, not replacements for it.
345
+
346
+ ### Completion artifact contract
347
+
348
+ The shared runtime should support deterministic emission of a final machine-readable
349
+ completion artifact for the whole run.
350
+
351
+ Preferred output:
352
+
353
+ - `execution/completion-report.json`
354
+
355
+ This artifact should be the authoritative source for:
356
+
357
+ - final run status
358
+ - final imported/updated/skipped/failed counts
359
+ - separate dry-run counts when `dryRun: true`: requests built, Wix calls skipped,
360
+ would-create/update/delete, would require live lookup, and local validation failures
361
+ - grouped skipped/deferred outcomes
362
+ - grouped failure outcomes
363
+ - dashboard/editor/preview destinations
364
+ - artifact references for audit/error/execution logs
365
+
366
+ The shared runtime should also support deterministic rendering inputs for:
367
+
368
+ - `execution/review/completion-summary.md`
369
+
370
+ The rendered summary should be derived from `completion-report.json`, not independently
371
+ invented by the agent.
372
+
373
+ ### Audit log contract
374
+
375
+ The shared runtime should emit append-only machine-readable audit events.
376
+
377
+ Preferred format: NDJSON.
378
+
379
+ Each event should capture, at minimum:
380
+
381
+ - timestamp
382
+ - run ID
383
+ - phase: `setup | import`
384
+ - entity
385
+ - operation
386
+ - source ID when applicable
387
+ - target ID when known
388
+ - endpoint or primitive used
389
+ - attempt number
390
+ - result status
391
+ - HTTP status or platform error code when applicable
392
+ - latency
393
+
394
+ The `run ID` is required because audit files are append-only across dry-runs, retries, and
395
+ recovery passes. Completion reports should be generated from runtime counters for the
396
+ current run and may use audit aggregation only when filtered by `run ID`. The shared
397
+ `lib/audit-summary.js` helper enforces this filter for fallback/verification summaries.
398
+
399
+ ### Dry-run runtime contract
400
+
401
+ The shared Wix runtime exports `createDryRunConfig`, `normalizeDryRunValue`,
402
+ `createWixClient`, and `createWixSetupExecutor`.
403
+
404
+ Dry-run is enabled by `DRY_RUN=true` or by the generated entrypoint's `--dry-run` flag.
405
+ It is disabled by default. `true`, `1`, `yes`, and `on` enable it; `false`, `0`, `no`,
406
+ and `off` disable it.
407
+
408
+ When `createWixClient({ dryRun: true })` is used:
409
+
410
+ - `authToken` and `siteId` may be blank unless the generated project requires the site ID
411
+ for a local artifact namespace;
412
+ - `send()` must not call `fetch`, SDK, MCP, or CLI transports;
413
+ - `send()` must capture the would-send request under
414
+ `state/attempts/wix-request-captures.ndjson` when `projectDir` or `requestCapturePath`
415
+ is supplied;
416
+ - captured headers must omit `Authorization` and redact secret-like header/body keys;
417
+ - captured bodies must be after `SAFE_MODE` contact-value sanitization;
418
+ - response payloads must preserve the live shape expected by writer helpers, for example
419
+ `{ contact }`, `{ product }`, `{ dataItem }`, `{ file }`, or an expected collection
420
+ field such as `{ contacts: [] }` for skipped queries.
421
+
422
+ Dry-run placeholder target IDs are not live authority. If downstream local execution
423
+ needs them, write them only to `state/crosswalk/dry-run-crosswalk.ndjson` or keep them
424
+ in memory. Never append simulated target IDs to `state/crosswalk/crosswalk.ndjson` and
425
+ never upload them to a CMS crosswalk mirror.
426
+
427
+ When `createWixSetupExecutor({ dryRun: true })` is used, each setup step must first be
428
+ reduced to a structured intent, then captured as `planned_dry_run` without invoking MCP,
429
+ CLI, SDK, or REST transports that access or mutate Wix account/site state.
430
+
431
+ ### Artifact authority at run completion
432
+
433
+ The shared runtime contract should preserve explicit artifact authority:
434
+
435
+ 1. `execution-log.md` for chronology and operator/debug context only
436
+ 2. `completion-report.json` for final outcome
437
+ 3. `completion-summary.md` for deterministic user-facing rendering
438
+
439
+ The runtime should not force downstream consumers to reconstruct final outcome by reading
440
+ raw audit logs or chronological execution logs.
441
+
442
+ ### Retry and throttling policy
443
+
444
+ This adapter should define one shared retry/throttling contract rather than letting each
445
+ migration invent its own.
446
+
447
+ It should classify, at minimum:
448
+
449
+ - retryable transport/network failures
450
+ - retryable `429` responses
451
+ - retryable `5xx` responses
452
+ - non-retryable `4xx` validation failures unless explicitly listed otherwise
453
+
454
+ When the server provides backoff hints such as `Retry-After`, the shared runtime should
455
+ honor them.
456
+
457
+ ### Bulk and fallback policy
458
+
459
+ The shared runtime should know:
460
+
461
+ - when a native bulk primitive exists and is preferred
462
+ - when to fall back from bulk to per-record writes
463
+ - when an upsert requires lookup + create/update orchestration
464
+ - when an unverified native path must be surfaced before execution rather than used
465
+ silently
466
+
467
+ ## Media policy by target
468
+
469
+ Do not treat all media the same. The target domain decides whether media must exist in Wix
470
+ first or can be ingested through the entity API itself.
471
+
472
+ - **Wix Stores products:** prefer external URLs on `media.itemsInfo.items[]` and let the
473
+ product API ingest them in the background. This is the default path when the URLs are
474
+ publicly reachable.
475
+ - **Wix Blog cover images and other surfaces that require a Wix media id at create/update
476
+ time:** import media first, then pass the Wix media id into the entity payload.
477
+ - **Generic Media Manager import** is a fallback/shared primitive, not the default for
478
+ every entity carrying media.
479
+
480
+ ## Media import source URL reachability
481
+
482
+ The media primitive imports by URL: Wix servers fetch the provided `sourceUrl`. Public
483
+ HTTPS URLs are expected; `localhost`, `127.0.0.1`, Docker-only hosts, and other
484
+ private-only URLs are not reachable by Wix during a live import. This is optional source
485
+ preparation and, as far as we know today, affects media import only.
486
+
487
+ If the source system is local, the migration should either:
488
+
489
+ - expose the source through a public HTTPS tunnel, then pass/rewire media URLs to that
490
+ public base URL; or
491
+ - skip/defer media import and clearly state which media-dependent references will be
492
+ missing until media is imported.
493
+
494
+ Ngrok quick setup for macOS:
495
+
496
+ ```bash
497
+ brew install ngrok
498
+ ngrok config add-authtoken "<YOUR_AUTHTOKEN>"
499
+ ngrok http 8090
500
+ export WP_BASE_URL=https://<id>.ngrok-free.app
501
+ ```
502
+
503
+ ## Validate by real call — do not trust doc examples
504
+
505
+ Codegen-time MCP doc checks confirm an endpoint *exists*; they do **not** confirm the
506
+ request *shape works*. The live wporg-news import proved doc examples can be wrong
507
+ (lowercase Ricos plugins → 400) or incomplete (featured image field, tag body). The
508
+ rule for this adapter:
509
+
510
+ - Treat a shape as verified **only after a real call succeeds** — encode the working
511
+ shape here with a `// VERIFIED:` (or `// VERIFIED-TRAP:`) note and a date.
512
+ - A `// UNVERIFIED:` primitive is allowed as a bootstrap point for generated code, but it
513
+ is not a silent live-write permission. The execution plan must call it out, and setup
514
+ verification must either promote it with a sandbox/live validation or route to fallback.
515
+ - Keep `tests/target-wix/contract-test.js` current: it issues one real call per primitive
516
+ against a sandbox site and is the single place schema drift surfaces. Tests live in the
517
+ repo's `tests/` tree rather than in this bundle, so the published product carries no test
518
+ harnesses. Run from the repo root:
519
+
520
+ ```bash
521
+ bash tests/run-all.sh target-wix
522
+ WIX_AUTH_TOKEN=... WIX_SITE_ID=... bash tests/run-all.sh target-wix
523
+ ```
524
+
525
+ Without credentials the shape checks still run and the live calls are skipped.
526
+ `tests/target-wix/ndjson-contract-test.js` covers `lib/ndjson.js` and never needs
527
+ credentials.
528
+
529
+ For live verification runs, pass `--progress-log <path>` and poll it per
530
+ `CONVENTIONS.md#progress-log-polling`.
531
+
532
+ Run on a cadence and after any Wix API change. A failing contract test — not a stranger's
533
+ broken import — is how we learn the surface moved.
534
+
535
+ ## Stores catalog is Catalog V3 only — Catalog V1 is not supported
536
+
537
+ **A migration only ever writes to a `V3_CATALOG` site.** Catalog V1 is not a supported
538
+ destination: there is no V1 write primitive here, no V1 fallback, and none should be added
539
+ (a former V1 fallback was removed — it only masked real V3 errors as spurious `428`s). A V1
540
+ site is a **blocker the run halts on**, not a variant the adapter, the mapper, or codegen
541
+ accommodates. The V3 create traps are handled in `lib/wix-writers.js`
542
+ (`normalizeStoresProductV3` + the top-level `treeReference` builder), so callers never
543
+ re-hit them.
544
+
545
+ **A Stores install is not automatically V3 — verify, don't assume.** This section used to
546
+ claim every Wix Stores install is Catalog V3. That is **false**, and believing it cost a
547
+ live migration its destination site (2026-07-30): a site scaffolded from the `blank`
548
+ headless template, with Stores installed afterwards through the App Installation API, came
549
+ up **`V1_CATALOG`**. Catalog version is fixed at provisioning — there is no in-place V1 → V3
550
+ switch — so every V3 write on that site failed and the site had to be abandoned.
551
+
552
+ Two consequences, both mandatory:
553
+
554
+ - **Provision V3 at creation.** Scaffold the site with `--site-template commerce`, never
555
+ `blank` (and never bare `--site-template`, which *means* `blank`) — see `replatform` →
556
+ "Headless site creation".
557
+ - **Gate before the first Stores write** on the read-only Catalog Versioning API,
558
+ `GET https://www.wixapis.com/stores/v3/provision/version` →
559
+ `catalogVersion: V3_CATALOG | V1_CATALOG | STORES_NOT_INSTALLED`. On `V1_CATALOG`, stop
560
+ and halt to needs-user; do not fall back to V1 endpoints, and do not silently create a
561
+ replacement site.
562
+
563
+ ## What stays in codegen (not here)
564
+
565
+ Per-project field maps and ordering (which source field → which `data` key, the
566
+ media/author/taxonomy ref maps, upsert-by-key) live in the generated transforms/write
567
+ specs. This adapter holds the invariant Wix request shapes, transport, and shared
568
+ execution mechanics. Collection names and schemas (`PodcastEpisodes`, …) are
569
+ project-specific and come from the mapping plan.
570
+
571
+ ## Provisioning pointers (see rp-execute-setup)
572
+
573
+ - Apps (Blog, Members) install via the App Installation API; ground `appDefId` from the
574
+ official "Apps Created by Wix" table.
575
+ - **Wix Data enablement** (`WDE0110`): install the **Wix Data app `appDefId
576
+ e593b0bd-b783-45b8-97c2-873d42aacaf4`** via the App Installation API; afterward `POST
577
+ /wix-data/v2/collections` creates NATIVE collections with no `WDE0110` (verified live).
578
+ Fallback: a custom app with a data-collections extension (declares collections at
579
+ install time, but can't express REFERENCE fields).
580
+
581
+ ## Scope & coverage
582
+
583
+ Wix has many apps/entities (Stores, Bookings, Events, Restaurants, Pricing Plans, CRM,
584
+ …). This adapter does **not** pre-build all of them. Coverage is **demand-driven** and
585
+ grows through reviewed releases. A migration may still target a native Wix entity before a
586
+ dedicated primitive exists; in that case codegen emits a native REST path using
587
+ `sendDirectRest`, logs the missing primitive, and calls `notifyMissingWriter` so the
588
+ RePlatform team can add the writer later.
589
+
590
+ **Native target ladder when no dedicated writer exists:**
591
+
592
+ 1. **Use the dedicated `rp-target-wix` primitive** when one exists.
593
+ 2. **If Wix has a native entity but no dedicated primitive, generate a native REST call**
594
+ from Wix MCP/docs-schema, mark it `UNVERIFIED`, log it, call `notifyMissingWriter`, and
595
+ surface it in the execution plan before any write. This is not a silent live write.
596
+ 3. **Use CMS only when there is no suitable native Wix entity, or when the native entity
597
+ is explicitly rejected for fidelity/side-effect reasons.** CMS is not a fallback for a
598
+ missing adapter writer.
599
+ 4. **Halt** if neither a native path nor an acceptable CMS/custom target exists.
600
+
601
+ The invariant: **anything not backed by a verified primitive is surfaced to the user for
602
+ consent before execution** — never written silently.
603
+
604
+ ## Setup runtime expectations
605
+
606
+ This adapter should also define the shared setup-side runtime used by setup execution.
607
+
608
+ It should cover reusable mechanics for:
609
+
610
+ - app installation and verification
611
+ - Wix Data enablement verification
612
+ - CMS collection and field provisioning when supported
613
+ - setup step ordering/checkpointing
614
+ - setup audit logging
615
+ - setup execution reporting
616
+
617
+ `rp-execute-setup` should consume setup artifacts through this runtime rather than
618
+ re-implementing setup mechanics in skill-local prose or one-off scripts.
619
+
620
+ ## Contract-test expectations
621
+
622
+ Contract tests should validate not only request builders, but also the most important
623
+ shared runtime invariants.
624
+
625
+ Examples:
626
+
627
+ - verified request shapes still serialize correctly
628
+ - retry policy classifies common Wix failures correctly
629
+ - throttle/backoff handling honors server hints
630
+ - compact reports preserve stable top-level fields
631
+ - completion reports preserve stable top-level fields
632
+ - audit events preserve the agreed machine-readable shape