@wix/agent-skills 1.33.0 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (635) hide show
  1. package/README.md +23 -0
  2. package/package.json +2 -2
  3. package/skills/wix-app/references/DASHBOARD_PAGE.md +1 -1
  4. package/skills/wix-export/SKILL.md +83 -0
  5. package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
  6. package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
  7. package/skills/wix-harmony-editor/SKILL.md +317 -0
  8. package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
  9. package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
  10. package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
  11. package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
  12. package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
  13. package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
  14. package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
  15. package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
  16. package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
  17. package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
  18. package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
  19. package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
  20. package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
  21. package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
  22. package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
  23. package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
  24. package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
  25. package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
  26. package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
  27. package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
  28. package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
  29. package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
  30. package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
  31. package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
  32. package/skills/wix-headless/SKILL.md +7 -2
  33. package/skills/wix-headless/references/CAPABILITIES.md +6 -1
  34. package/skills/wix-headless/references/DISCOVERY.md +2 -1
  35. package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
  36. package/skills/wix-headless/references/SEED.md +3 -2
  37. package/skills/wix-headless/references/SETUP.md +1 -0
  38. package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
  39. package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
  40. package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
  41. package/skills/wix-headless/references/managed/CREATE.md +1 -1
  42. package/skills/wix-headless-kit/SKILL.md +110 -21
  43. package/skills/wix-headless-kit/guides/api-run.md +15 -13
  44. package/skills/wix-headless-kit/guides/existing-site.md +31 -0
  45. package/skills/wix-headless-kit/guides/migration.md +49 -17
  46. package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
  47. package/skills/wix-headless-kit/install/context.mjs +61 -6
  48. package/skills/wix-headless-kit/install/pins.json +1 -1
  49. package/skills/wix-headless-kit/install/setup.mjs +107 -12
  50. package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
  51. package/skills/wix-headless-replatform/SKILL.md +116 -0
  52. package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
  53. package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
  54. package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
  55. package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
  56. package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
  57. package/skills/wix-headless-replatform/references/output-contract.md +93 -0
  58. package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
  59. package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
  60. package/skills/wix-headless-replatform/references/safety.md +19 -0
  61. package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
  62. package/skills/wix-headless-replatform/references/workflow.md +157 -0
  63. package/skills/wix-headless-replatform/registry/README.md +20 -0
  64. package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
  65. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
  66. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
  67. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
  68. package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
  69. package/skills/wix-headless-replatform/registry/registry.json +36 -0
  70. package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
  71. package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
  72. package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
  73. package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
  74. package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
  75. package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
  76. package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
  77. package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
  78. package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
  79. package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
  80. package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
  81. package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
  82. package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
  83. package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
  84. package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
  85. package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
  86. package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
  87. package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
  88. package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
  89. package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
  90. package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
  91. package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
  92. package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
  93. package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
  94. package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
  95. package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
  96. package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
  97. package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
  98. package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
  99. package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
  100. package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
  101. package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
  102. package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
  103. package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
  104. package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
  105. package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
  106. package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
  107. package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
  108. package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
  109. package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
  110. package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
  111. package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
  112. package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
  113. package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
  114. package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
  115. package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
  116. package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
  117. package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
  118. package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
  119. package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
  120. package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
  121. package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
  122. package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
  123. package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
  124. package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
  125. package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
  126. package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
  127. package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
  128. package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
  129. package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
  130. package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
  131. package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
  132. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
  133. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
  134. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
  135. package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
  136. package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
  137. package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
  138. package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
  139. package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
  140. package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
  141. package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
  142. package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
  143. package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
  144. package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
  145. package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
  146. package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
  147. package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
  148. package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
  149. package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
  150. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
  151. package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
  152. package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
  153. package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
  154. package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
  155. package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
  156. package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
  157. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
  158. package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
  159. package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
  160. package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
  161. package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
  162. package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
  163. package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
  164. package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
  165. package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
  166. package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
  167. package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
  168. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
  169. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
  170. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
  171. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
  172. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
  173. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
  174. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
  175. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
  176. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
  177. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
  178. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
  179. package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
  180. package/skills/wix-import/SKILL.md +90 -0
  181. package/skills/wix-manage/SKILL.md +38 -10
  182. package/skills/wix-manage/references/automations/actions.md +11 -11
  183. package/skills/wix-manage/references/automations/activation-status.md +6 -9
  184. package/skills/wix-manage/references/automations/api-catalog.md +48 -32
  185. package/skills/wix-manage/references/automations/automation-model.md +97 -22
  186. package/skills/wix-manage/references/automations/bracket-expressions.md +7 -7
  187. package/skills/wix-manage/references/automations/build-and-manage-automations.md +140 -309
  188. package/skills/wix-manage/references/automations/conditions.md +187 -0
  189. package/skills/wix-manage/references/automations/schemas-and-scheduling.md +191 -0
  190. package/skills/wix-manage/references/automations/special-actions.md +210 -0
  191. package/skills/wix-manage/references/automations/triggers.md +47 -10
  192. package/skills/wix-manage/references/automations/validation-and-verification.md +320 -0
  193. package/skills/wix-manage/references/custom-apps/use-app-tools.md +124 -0
  194. package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
  195. package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
  196. package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
  197. package/skills/wix-manage/references/events/create-wix-event.md +136 -73
  198. package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
  199. package/skills/wix-manage/references/events/manage-event-guests.md +366 -0
  200. package/skills/wix-manage/references/events/manage-event-tickets.md +293 -0
  201. package/skills/wix-manage/references/events/manage-wix-events.md +313 -55
  202. package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
  203. package/skills/wix-manage/references/sites/upload-static-site.md +127 -8
  204. package/skills/wix-manage/references/stores/update-product-with-options.md +58 -2
  205. package/skills/wix-replatform/.publish-manifest.json +5 -5
  206. package/skills/wix-replatform/CLI.md +162 -0
  207. package/skills/wix-replatform/README.md +52 -0
  208. package/skills/wix-replatform/SKILL.md +229 -684
  209. package/skills/wix-replatform/console/account.css +1 -0
  210. package/skills/wix-replatform/console/app.css +1 -0
  211. package/skills/wix-replatform/console/app.js +117 -0
  212. package/skills/wix-replatform/console/index.html +4 -0
  213. package/skills/wix-replatform/console/json.css +11 -0
  214. package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
  215. package/skills/wix-replatform/lib/app-page-routing.js +75 -0
  216. package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
  217. package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
  218. package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
  219. package/skills/wix-replatform/lib/completion-report.js +1393 -13
  220. package/skills/wix-replatform/lib/config-env.js +85 -11
  221. package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
  222. package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
  223. package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
  224. package/skills/wix-replatform/lib/destination-choice.js +163 -0
  225. package/skills/wix-replatform/lib/destination-handoff.js +62 -0
  226. package/skills/wix-replatform/lib/destination-http.js +81 -0
  227. package/skills/wix-replatform/lib/destination-route.js +98 -0
  228. package/skills/wix-replatform/lib/destination.js +919 -0
  229. package/skills/wix-replatform/lib/discovered-census.js +231 -0
  230. package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
  231. package/skills/wix-replatform/lib/document-url-guard.js +203 -0
  232. package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
  233. package/skills/wix-replatform/lib/entity-verification.js +18 -0
  234. package/skills/wix-replatform/lib/execution-capability.js +120 -0
  235. package/skills/wix-replatform/lib/execution-log.js +170 -0
  236. package/skills/wix-replatform/lib/execution-manifest.js +20 -2
  237. package/skills/wix-replatform/lib/execution-state.js +22 -0
  238. package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
  239. package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
  240. package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
  241. package/skills/wix-replatform/lib/import-recovery.js +800 -6
  242. package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
  243. package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
  244. package/skills/wix-replatform/lib/link-audit.js +173 -0
  245. package/skills/wix-replatform/lib/link-census.js +194 -0
  246. package/skills/wix-replatform/lib/link-plan.js +148 -0
  247. package/skills/wix-replatform/lib/link-verification.js +274 -0
  248. package/skills/wix-replatform/lib/link-write-journal.js +42 -0
  249. package/skills/wix-replatform/lib/local-state.js +869 -30
  250. package/skills/wix-replatform/lib/member-completion.js +658 -0
  251. package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
  252. package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
  253. package/skills/wix-replatform/lib/migration-completion.js +311 -0
  254. package/skills/wix-replatform/lib/operator-identity.js +47 -0
  255. package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
  256. package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
  257. package/skills/wix-replatform/lib/orchestration-router.js +608 -32
  258. package/skills/wix-replatform/lib/orchestration-state.js +188 -12
  259. package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
  260. package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
  261. package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
  262. package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
  263. package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
  264. package/skills/wix-replatform/lib/progress-log.js +19 -3
  265. package/skills/wix-replatform/lib/read-back-approval.js +184 -0
  266. package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
  267. package/skills/wix-replatform/lib/read-back-contract.js +243 -0
  268. package/skills/wix-replatform/lib/read-back-extract.js +118 -0
  269. package/skills/wix-replatform/lib/read-back-gate.js +734 -0
  270. package/skills/wix-replatform/lib/read-back-reads.js +94 -0
  271. package/skills/wix-replatform/lib/read-back-state.js +107 -0
  272. package/skills/wix-replatform/lib/read-back-summary.js +81 -0
  273. package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
  274. package/skills/wix-replatform/lib/run-controller.js +401 -0
  275. package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
  276. package/skills/wix-replatform/lib/setup-verification.js +148 -0
  277. package/skills/wix-replatform/lib/source-access.js +231 -0
  278. package/skills/wix-replatform/lib/source-coverage.js +1130 -0
  279. package/skills/wix-replatform/lib/source-secrets.js +277 -0
  280. package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
  281. package/skills/wix-replatform/lib/task-state.js +110 -0
  282. package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
  283. package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
  284. package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
  285. package/skills/wix-replatform/lib/url-verification.js +315 -0
  286. package/skills/wix-replatform/lib/user-action-effects.js +42 -0
  287. package/skills/wix-replatform/lib/user-actions.js +264 -0
  288. package/skills/wix-replatform/lib/website-handoff.js +1220 -0
  289. package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
  290. package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
  291. package/skills/wix-replatform/lib/write-verification-state.js +92 -0
  292. package/skills/wix-replatform/lib/write-verification.js +274 -0
  293. package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
  294. package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
  295. package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
  296. package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
  297. package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
  298. package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
  299. package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
  300. package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
  301. package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
  302. package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
  303. package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
  304. package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
  305. package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
  306. package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
  307. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
  308. package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
  309. package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
  310. package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
  311. package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
  312. package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
  313. package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
  314. package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
  315. package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
  316. package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
  317. package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
  318. package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
  319. package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
  320. package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
  321. package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
  322. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
  323. package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
  324. package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
  325. package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
  326. package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
  327. package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
  328. package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
  329. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
  330. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
  331. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
  332. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
  333. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
  334. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
  335. package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
  336. package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
  337. package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
  338. package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
  339. package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
  340. package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
  341. package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
  342. package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
  343. package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
  344. package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
  345. package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
  346. package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
  347. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
  348. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
  349. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
  350. package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
  351. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
  352. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
  353. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
  354. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
  355. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
  356. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
  357. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
  358. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
  359. package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
  360. package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
  361. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
  362. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
  363. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
  364. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
  365. package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
  366. package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
  367. package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
  368. package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
  369. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
  370. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
  371. package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
  372. package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
  373. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
  374. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
  375. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
  376. package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
  377. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
  378. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
  379. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
  380. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
  381. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
  382. package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
  383. package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
  384. package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
  385. package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
  386. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
  387. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
  388. package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
  389. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
  390. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
  391. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
  392. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
  393. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
  394. package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
  395. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
  396. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
  397. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
  398. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
  399. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
  400. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
  401. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
  402. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
  403. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
  404. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
  405. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
  406. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
  407. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
  408. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
  409. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
  410. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
  411. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
  412. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
  413. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
  414. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
  415. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
  416. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
  417. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
  418. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
  419. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
  420. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
  421. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
  422. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
  423. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
  424. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
  425. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
  426. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
  427. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
  428. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
  429. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
  430. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
  431. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
  432. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
  433. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
  434. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
  435. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
  436. package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
  437. package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
  438. package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
  439. package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
  440. package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
  441. package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
  442. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
  443. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
  444. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
  445. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
  446. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
  447. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
  448. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
  449. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
  450. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
  451. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
  452. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
  453. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
  454. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
  455. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
  456. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
  457. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
  458. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
  459. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
  460. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
  461. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
  462. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
  463. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
  464. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
  465. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
  466. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
  467. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
  468. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
  469. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
  470. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
  471. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
  472. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
  473. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
  474. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
  475. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
  476. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
  477. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
  478. package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
  479. package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
  480. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
  481. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
  482. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
  483. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
  484. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
  485. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
  486. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
  487. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
  488. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
  489. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
  490. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
  491. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
  492. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
  493. package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
  494. package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
  495. package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
  496. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
  497. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
  498. package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
  499. package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
  500. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
  501. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
  502. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
  503. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
  504. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
  505. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
  506. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
  507. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
  508. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
  509. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
  510. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
  511. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
  512. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
  513. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
  514. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
  515. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
  516. package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
  517. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
  518. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
  519. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
  520. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
  521. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
  522. package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
  523. package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
  524. package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
  525. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
  526. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
  527. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
  528. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
  529. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
  530. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
  531. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
  532. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
  533. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
  534. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
  535. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
  536. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
  537. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
  538. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
  539. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
  540. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
  541. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
  542. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
  543. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
  544. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
  545. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
  546. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
  547. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
  548. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
  549. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
  550. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
  551. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
  552. package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
  553. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
  554. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
  555. package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
  556. package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
  557. package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
  558. package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
  559. package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
  560. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
  561. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
  562. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
  563. package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
  564. package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
  565. package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
  566. package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
  567. package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
  568. package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
  569. package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
  570. package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
  571. package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
  572. package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
  573. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
  574. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
  575. package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
  576. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
  577. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
  578. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
  579. package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
  580. package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
  581. package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
  582. package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
  583. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
  584. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
  585. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
  586. package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
  587. package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
  588. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
  589. package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
  590. package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
  591. package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
  592. package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
  593. package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
  594. package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
  595. package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
  596. package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
  597. package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
  598. package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
  599. package/skills/wix-replatform/scripts/discovered-census.js +26 -0
  600. package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
  601. package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
  602. package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
  603. package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
  604. package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
  605. package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
  606. package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
  607. package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
  608. package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
  609. package/skills/wix-replatform/scripts/migration-completion.js +76 -0
  610. package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
  611. package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
  612. package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
  613. package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
  614. package/skills/wix-replatform/scripts/replatform-console.js +146 -0
  615. package/skills/wix-replatform/scripts/replatform.js +436 -0
  616. package/skills/wix-replatform/scripts/source-secrets.js +77 -0
  617. package/skills/wix-replatform/scripts/url-redirects.js +286 -0
  618. package/skills/wix-replatform/scripts/user-action.js +58 -0
  619. package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
  620. package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
  621. package/skills/wix-replatform/scripts/wix-destination.js +143 -0
  622. package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
  623. package/skills/wix-vibe-headless/SKILL.md +7 -3
  624. package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
  625. package/skills/wix-vibe-headless/platforms/base44.md +1 -0
  626. package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
  627. package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
  628. package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
  629. package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
  630. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
  631. package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
  632. package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
  633. package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
  634. package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +0 -208
  635. package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
@@ -0,0 +1,658 @@
1
+ 'use strict';
2
+
3
+ // The member pass's durable record: population gate and snapshot, one journal row pair per
4
+ // customer, and the projection of those rows into the completion report and telemetry.
5
+ //
6
+ // Why it exists: ensureMember already returned a precise outcome for every customer, and the
7
+ // generated member loop threw it away -- no journal row, nothing in the completion report, no
8
+ // telemetry. A customer could finish a migration without a Wix login and no output said so.
9
+ //
10
+ // What it guarantees:
11
+ // * Before the first journal row or Wix call, every supplied customer has a present, unique
12
+ // source key (and, on a subset pass, one the full pass saw). Otherwise the pass writes
13
+ // NOTHING and reports the defect -- a partial write here would corrupt journal/crosswalk
14
+ // identity and make the report's denominator unknowable.
15
+ // * The report's denominator is the full pass's key snapshot; recovery passes select within it
16
+ // and never shrink it.
17
+ // * The report reads only the journal: latest row per source key, in append order.
18
+ // * Telemetry is aggregate, derived from the same rows, and carries no record values.
19
+
20
+ const fs = require('node:fs/promises');
21
+ const path = require('node:path');
22
+ const crypto = require('node:crypto');
23
+ const localState = require('./local-state.js');
24
+ const R = require('./member-outcome-registry.js');
25
+
26
+ const MEMBER_POPULATION_FILE = 'execution/member-population.json';
27
+ const POPULATION_BASIS = 'records-supplied-to-member-pass';
28
+ const SELECTION_MODES = Object.freeze(['full', 'failed-only', 'deferred-only', 'unresolved-only', 'missing-only']);
29
+ const TELEMETRY_SKILL = 'rp-execute-import';
30
+ const TELEMETRY_STAGE = 'import';
31
+ const TELEMETRY_ENTITY = 'member';
32
+ const SNAPSHOT_MISSING = 'member-population-snapshot-missing';
33
+ const MEMBER_API_SURFACE = 'members/v1';
34
+ // Severity merge: the most severe grouped record wins.
35
+ const SEVERITY_RANK = Object.freeze({ info: 0, cosmetic: 1, degraded: 2, blocking: 3 });
36
+
37
+ // The dimensions rp-telemetry's recorder folds on (telemetry-recorder.js classKeyFor), in its
38
+ // order. Grouping by anything else lets finalize merge two emitted events order-dependently.
39
+ function recorderSignature(event) {
40
+ return [event.event_type, event.stage, event.entity_type, event.wix_api_surface,
41
+ event.source_api_surface, event.wix_app_id, event.error_code, event.subtype]
42
+ .map((p) => (p === null || p === undefined ? '' : String(p))).join('|');
43
+ }
44
+ const GUID_IN_TEXT = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/gi;
45
+
46
+ function requireString(value, field) {
47
+ if (!value || typeof value !== 'string') throw new Error(`${field} must be a non-empty string`);
48
+ return value;
49
+ }
50
+
51
+ function normalizeMode(mode) {
52
+ const value = mode === undefined || mode === null ? 'full' : mode;
53
+ if (!SELECTION_MODES.includes(value)) {
54
+ throw new Error(`member pass mode must be one of ${SELECTION_MODES.join(', ')}`);
55
+ }
56
+ return value;
57
+ }
58
+
59
+ function defaultSourceStableKey(record) {
60
+ return record ? record.sourceStableKey : undefined;
61
+ }
62
+
63
+ // --- population gate ---------------------------------------------------------------------
64
+
65
+ // Pure. Checks the WHOLE supplied list before anything is written. Never deduplicates and never
66
+ // drops a record: a defect is reported with its counts, and the caller writes nothing.
67
+ function validateMemberPopulation(records, { getSourceStableKey = defaultSourceStableKey, snapshotKeys = null } = {}) {
68
+ if (!Array.isArray(records)) throw new Error('member population must be an array of supplied records');
69
+ const keys = [];
70
+ const counts = new Map();
71
+ let missingSourceKey = 0;
72
+ for (const record of records) {
73
+ const key = getSourceStableKey(record);
74
+ if (typeof key !== 'string' || key.trim() === '') {
75
+ missingSourceKey += 1;
76
+ keys.push(null);
77
+ continue;
78
+ }
79
+ keys.push(key);
80
+ counts.set(key, (counts.get(key) || 0) + 1);
81
+ }
82
+ let duplicateSourceKey = 0;
83
+ for (const n of counts.values()) if (n > 1) duplicateSourceKey += n;
84
+ let unknownSourceKey = 0;
85
+ if (snapshotKeys) {
86
+ const known = new Set(snapshotKeys);
87
+ for (const key of keys) if (key !== null && !known.has(key)) unknownSourceKey += 1;
88
+ }
89
+ const defect = { missingSourceKey, duplicateSourceKey, unknownSourceKey };
90
+ return {
91
+ ok: missingSourceKey === 0 && duplicateSourceKey === 0 && unknownSourceKey === 0,
92
+ keys,
93
+ distinctKeys: [...counts.keys()].sort(),
94
+ extracted: records.length,
95
+ defect,
96
+ failingRecords: missingSourceKey + duplicateSourceKey + unknownSourceKey,
97
+ };
98
+ }
99
+
100
+ // --- population snapshot -----------------------------------------------------------------
101
+
102
+ function populationPath(projectDir) {
103
+ return path.join(projectDir, MEMBER_POPULATION_FILE);
104
+ }
105
+
106
+ function validateSnapshot(snapshot) {
107
+ if (!snapshot || typeof snapshot !== 'object' || Array.isArray(snapshot)) throw new Error(`${MEMBER_POPULATION_FILE} must be an object`);
108
+ if (snapshot.schemaVersion !== 1) throw new Error(`${MEMBER_POPULATION_FILE}.schemaVersion must be 1`);
109
+ if (!Array.isArray(snapshot.keys) || snapshot.keys.some((key) => typeof key !== 'string' || !key)) {
110
+ throw new Error(`${MEMBER_POPULATION_FILE}.keys must be an array of source keys`);
111
+ }
112
+ if (new Set(snapshot.keys).size !== snapshot.keys.length) throw new Error(`${MEMBER_POPULATION_FILE}.keys must be unique`);
113
+ return snapshot;
114
+ }
115
+
116
+ async function readMemberPopulation(projectDir) {
117
+ let text;
118
+ try {
119
+ text = await fs.readFile(populationPath(projectDir), 'utf8');
120
+ } catch (error) {
121
+ if (error && error.code === 'ENOENT') return null;
122
+ throw error;
123
+ }
124
+ return validateSnapshot(JSON.parse(text));
125
+ }
126
+
127
+ function buildMemberPopulation({ runId, keys, sourceFile = null, sourceChecksum = null, now = null }) {
128
+ return validateSnapshot({
129
+ schemaVersion: 1,
130
+ runId: requireString(runId, 'runId'),
131
+ createdAt: now || new Date().toISOString(),
132
+ sourceFile: sourceFile === null ? null : String(sourceFile),
133
+ sourceChecksum: sourceChecksum === null ? null : String(sourceChecksum),
134
+ // Keys only, sorted: no names, emails or other record values.
135
+ keys: [...keys].sort(),
136
+ });
137
+ }
138
+
139
+ async function writeMemberPopulation(projectDir, snapshot) {
140
+ validateSnapshot(snapshot);
141
+ const filePath = populationPath(projectDir);
142
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
143
+ const tempPath = `${filePath}.${process.pid}.${Date.now()}.tmp`;
144
+ await fs.writeFile(tempPath, `${JSON.stringify(snapshot, null, 2)}\n`, 'utf8');
145
+ await fs.rename(tempPath, filePath);
146
+ return filePath;
147
+ }
148
+
149
+ // --- journal rows ------------------------------------------------------------------------
150
+
151
+ function isMemberRow(row) {
152
+ return row && row.targetEntityType === R.MEMBER_TARGET_ENTITY_TYPE && row.operation === R.MEMBER_OPERATION;
153
+ }
154
+
155
+ // Latest member row per source key, in append order (the journal fold, restricted to member
156
+ // rows), plus the pairing check: every terminal row shares its attemptId with exactly one
157
+ // earlier `started` row for the same key. Pairs are counted per (sourceStableKey, attemptId):
158
+ // a second `started` for one pair, a terminal with no earlier start for its pair, or a second
159
+ // terminal for one pair is a projection error -- a corrupted journal never reads clean.
160
+ function foldMemberJournal(rows) {
161
+ const memberRows = (rows || []).filter(isMemberRow);
162
+ const latestByKey = localState.foldAttemptsBySourceKey(memberRows);
163
+ const startsByPair = new Map();
164
+ const terminalSeen = new Set();
165
+ const pairingErrors = [];
166
+ const pairOf = (row) => JSON.stringify([row.sourceStableKey, row.attemptId]);
167
+ for (const row of memberRows) {
168
+ const pair = pairOf(row);
169
+ const error = (code) => pairingErrors.push({ code, sourceStableKey: row.sourceStableKey, attemptId: row.attemptId });
170
+ if (row.status === 'started') {
171
+ const starts = (startsByPair.get(pair) || 0) + 1;
172
+ startsByPair.set(pair, starts);
173
+ if (starts > 1) error('duplicate-started');
174
+ continue;
175
+ }
176
+ if (!startsByPair.has(pair)) error('terminal-without-started');
177
+ else if (terminalSeen.has(pair)) error('duplicate-terminal');
178
+ terminalSeen.add(pair);
179
+ }
180
+ return { memberRows, latestByKey, pairingErrors };
181
+ }
182
+
183
+ function buildStartedRow({ sourceStableKey, runId, phase, writeSpecId, mode, now = null }) {
184
+ return {
185
+ schemaVersion: 1,
186
+ attemptId: crypto.randomUUID(),
187
+ sourceStableKey: requireString(sourceStableKey, 'sourceStableKey'),
188
+ writeSpecId: requireString(writeSpecId, 'writeSpecId'),
189
+ operation: R.MEMBER_OPERATION,
190
+ targetEntityType: R.MEMBER_TARGET_ENTITY_TYPE,
191
+ status: 'started',
192
+ runId: requireString(runId, 'runId'),
193
+ phase: requireString(phase, 'phase'),
194
+ startedAt: now || new Date().toISOString(),
195
+ ...(mode && mode !== 'full' ? { selection: { offset: null, limit: null, filters: { mode } } } : {}),
196
+ };
197
+ }
198
+
199
+ function intOrNull(value) {
200
+ if (value === null || value === undefined) return null;
201
+ const n = Number(value);
202
+ return Number.isInteger(n) ? n : null;
203
+ }
204
+
205
+ // The terminal follow-on row for a started row (markAttempt shape: same attemptId).
206
+ // Every field telemetry and the projection need is structured here; nothing downstream parses
207
+ // a message.
208
+ function buildMemberTerminalRow(started, result, { builderFindings = [], knownMemberId = null, runId = null, phase = null, now = null } = {}) {
209
+ const cls = R.classifyMemberResult(result);
210
+ const policy = R.POLICY[cls];
211
+ const findings = [...(builderFindings || []), ...((result && result.findings) || [])];
212
+ for (const finding of findings) {
213
+ if (!finding || !R.isMemberFinding(finding.code)) throw new Error(`unknown member finding: ${JSON.stringify(finding && finding.code)}`);
214
+ }
215
+ const row = {
216
+ ...started,
217
+ runId: runId || started.runId,
218
+ phase: phase || started.phase,
219
+ status: policy.journalStatus,
220
+ outcomeCode: result.outcome,
221
+ findingCodes: findings.map((finding) => finding.code),
222
+ completedAt: now || new Date().toISOString(),
223
+ };
224
+ delete row.startedAt;
225
+ if (policy.matchedBy) row.matchedBy = policy.matchedBy;
226
+ if (result.memberId) row.targetId = String(result.memberId);
227
+ if (policy.journalStatus === 'deferred') row.reason = result.outcome;
228
+ if (cls === 'ambiguous' && Number.isInteger(result.matchCount)) row.matchCount = result.matchCount;
229
+ if (policy.failureOutcome) {
230
+ const error = result.error || {};
231
+ const message = String(error.message === undefined ? '' : error.message).slice(0, 300);
232
+ row.wixApiSurface = result.wixApiSurface || 'members/v1';
233
+ row.failure = {
234
+ sourceId: started.sourceStableKey,
235
+ targetEntityId: knownMemberId ? String(knownMemberId) : null,
236
+ operation: R.MEMBER_OPERATION,
237
+ httpStatus: intOrNull(error.status),
238
+ errorCode: R.deriveMemberErrorCode(error),
239
+ scopeGroupName: null,
240
+ outcome: policy.failureOutcome,
241
+ message,
242
+ };
243
+ // An identifier in the message is extracted into a field before anything could shorten it.
244
+ const identifiers = [...new Set((message.match(GUID_IN_TEXT) || []).map((id) => id.toLowerCase()))];
245
+ if (identifiers.length) row.failure.identifiersInMessage = identifiers;
246
+ }
247
+ const retried = findings.find((finding) => finding.code === R.MEMBER_FINDING.CREATE_RETRIED);
248
+ if (retried) {
249
+ row.retry = {
250
+ count: 1,
251
+ firstErrorCode: R.deriveMemberErrorCode({
252
+ status: retried.firstErrorStatus,
253
+ applicationErrorCode: retried.firstErrorApplicationCode,
254
+ outcomeKnown: retried.firstErrorOutcomeKnown,
255
+ }),
256
+ firstErrorStatus: intOrNull(retried.firstErrorStatus),
257
+ };
258
+ }
259
+ return row;
260
+ }
261
+
262
+ // Which records a pass revisits. A subset pass selects within the snapshot by the latest row.
263
+ function selectMemberRecords(records, keys, mode, latestByKey) {
264
+ const out = [];
265
+ records.forEach((record, index) => {
266
+ const key = keys[index];
267
+ const latest = latestByKey.get(key) || null;
268
+ const status = latest ? latest.status : null;
269
+ let take;
270
+ switch (mode) {
271
+ case 'full': take = true; break;
272
+ case 'failed-only': take = Boolean(status && status.startsWith('failed')); break;
273
+ case 'deferred-only': take = status === 'deferred'; break;
274
+ case 'unresolved-only': take = status === 'started' || status === 'succeeded_unverified'; break;
275
+ case 'missing-only': take = latest === null; break;
276
+ default: take = false;
277
+ }
278
+ if (take) out.push({ record, sourceStableKey: key });
279
+ });
280
+ return out;
281
+ }
282
+
283
+ // The member pass. The caller supplies how to build and send one member (`ensure`) and how to
284
+ // persist the crosswalk; everything about order, identity and journaling lives here.
285
+ //
286
+ // ensure(record) -> { result, builderFindings?, knownMemberId? }
287
+ // persistCrosswalk(record, result) called before the terminal row whenever result.memberId
288
+ //
289
+ // Returns { ok, gate, snapshot, mode, selected }. `ok: false` means the population gate refused:
290
+ // zero journal rows and zero Wix calls were made. A subset pass with no snapshot throws before
291
+ // anything is written (error.code === 'member-population-snapshot-missing').
292
+ async function runMemberPass({
293
+ projectDir,
294
+ records,
295
+ runId,
296
+ phase = 'import',
297
+ writeSpecId = 'members',
298
+ mode = 'full',
299
+ sample = false,
300
+ getSourceStableKey = defaultSourceStableKey,
301
+ sourceFile = null,
302
+ sourceChecksum = null,
303
+ ensure,
304
+ persistCrosswalk = null,
305
+ } = {}) {
306
+ requireString(projectDir, 'projectDir');
307
+ requireString(runId, 'runId');
308
+ const selection = normalizeMode(mode);
309
+ if (typeof ensure !== 'function') throw new Error('runMemberPass needs an ensure(record) function');
310
+ if (!Array.isArray(records)) throw new Error('runMemberPass needs the supplied records array');
311
+
312
+ let snapshot = null;
313
+ if (selection !== 'full') {
314
+ snapshot = await readMemberPopulation(projectDir);
315
+ if (!snapshot) {
316
+ throw Object.assign(new Error(`${selection} member pass refused: no ${MEMBER_POPULATION_FILE} from a full pass, so the report's denominator is unknown. Run a full member pass first.`), { code: SNAPSHOT_MISSING });
317
+ }
318
+ }
319
+ const gate = validateMemberPopulation(records, { getSourceStableKey, snapshotKeys: snapshot ? snapshot.keys : null });
320
+ if (!gate.ok) return { ok: false, gate, snapshot, mode: selection, selected: 0 };
321
+
322
+ if (selection === 'full') {
323
+ snapshot = buildMemberPopulation({ runId, keys: gate.distinctKeys, sourceFile, sourceChecksum });
324
+ // A sample pass writes nothing that a real pass would read as its denominator.
325
+ if (!sample) await writeMemberPopulation(projectDir, snapshot);
326
+ }
327
+
328
+ const journalOptions = { sample: Boolean(sample) };
329
+ const journal = await localState.loadAttemptJournal(projectDir, journalOptions);
330
+ const { latestByKey } = foldMemberJournal(journal.rows);
331
+ const selected = selectMemberRecords(records, gate.keys, selection, latestByKey);
332
+
333
+ for (const { record, sourceStableKey } of selected) {
334
+ const started = buildStartedRow({ sourceStableKey, runId, phase, writeSpecId, mode: selection });
335
+ await localState.appendAttempt(projectDir, started, journalOptions);
336
+ const outcome = await ensure(record);
337
+ const result = outcome && outcome.result;
338
+ R.classifyMemberResult(result); // an unknown code stops here and leaves the start dangling (unresolved), never a guessed bucket
339
+ if (result.memberId && typeof persistCrosswalk === 'function') await persistCrosswalk(record, result);
340
+ const terminal = buildMemberTerminalRow(started, result, {
341
+ builderFindings: outcome.builderFindings || [],
342
+ knownMemberId: outcome.knownMemberId || null,
343
+ });
344
+ await localState.appendAttempt(projectDir, terminal, journalOptions);
345
+ }
346
+ return { ok: true, gate, snapshot, mode: selection, selected: selected.length };
347
+ }
348
+
349
+ // --- projection --------------------------------------------------------------------------
350
+
351
+ function classOfRow(row) {
352
+ if (!R.isMemberOutcome(row.outcomeCode)) throw new Error(`member journal row ${row.sourceStableKey}: unknown outcome code ${JSON.stringify(row.outcomeCode)}`);
353
+ let cls;
354
+ if (row.outcomeCode === R.MEMBER_OUTCOME.RECONCILED_EXISTING) {
355
+ cls = row.matchedBy === 'crosswalk' ? 'reconciled-crosswalk' : row.matchedBy === 'loginEmail' ? 'reconciled-login-email' : null;
356
+ if (!cls) throw new Error(`member journal row ${row.sourceStableKey}: reconciled row without matchedBy`);
357
+ } else if (row.outcomeCode === R.MEMBER_OUTCOME.FAILED) {
358
+ cls = row.status === 'succeeded_unverified' ? 'failed-unknown' : row.status === 'failed_terminal' ? 'failed-rejected' : null;
359
+ if (!cls) throw new Error(`member journal row ${row.sourceStableKey}: member-failed with status ${row.status}`);
360
+ } else {
361
+ cls = R.POLICY_CLASSES.find((name) => R.POLICY[name].outcome === row.outcomeCode);
362
+ }
363
+ const policy = R.POLICY[cls];
364
+ if (policy.journalStatus !== row.status) {
365
+ throw new Error(`member journal row ${row.sourceStableKey}: ${row.outcomeCode} must carry status ${policy.journalStatus}, not ${row.status}`);
366
+ }
367
+ return cls;
368
+ }
369
+
370
+ // A terminal row missing a structured field telemetry or the report needs fails the projection:
371
+ // filling it from prose is the thing this design forbids.
372
+ function assertTerminalRowFields(row, cls) {
373
+ const label = `member journal row ${row.sourceStableKey}`;
374
+ if (!Array.isArray(row.findingCodes)) throw new Error(`${label}: findingCodes must be an array`);
375
+ for (const code of row.findingCodes) {
376
+ if (!R.isMemberFinding(code)) throw new Error(`${label}: unknown finding code ${JSON.stringify(code)}`);
377
+ }
378
+ if (R.POLICY[cls].failureOutcome) {
379
+ const failure = row.failure;
380
+ if (!failure || typeof failure !== 'object') throw new Error(`${label}: failure is required`);
381
+ if (!('httpStatus' in failure)) throw new Error(`${label}: failure.httpStatus must be present`);
382
+ if (typeof failure.errorCode !== 'string' || !failure.errorCode || failure.errorCode.length > R.ERROR_CODE_MAX || /\s/.test(failure.errorCode)) {
383
+ throw new Error(`${label}: failure.errorCode must be a short machine code`);
384
+ }
385
+ }
386
+ if (row.retry !== undefined) {
387
+ if (!row.retry || !Number.isInteger(row.retry.count) || row.retry.count < 1 || typeof row.retry.firstErrorCode !== 'string' || !row.retry.firstErrorCode) {
388
+ throw new Error(`${label}: retry must carry count >= 1 and firstErrorCode`);
389
+ }
390
+ }
391
+ }
392
+
393
+ function zeros(codes) {
394
+ return Object.fromEntries(codes.map((code) => [code, 0]));
395
+ }
396
+
397
+ function emptyMemberOutcomes() {
398
+ return {
399
+ entity: R.MEMBER_ENTITY,
400
+ populationBasis: POPULATION_BASIS,
401
+ byOutcome: zeros(R.MEMBER_OUTCOMES),
402
+ byClass: Object.fromEntries(R.POLICY_CLASSES.map((cls) => [cls, {
403
+ outcome: R.POLICY[cls].outcome,
404
+ count: 0,
405
+ projection: R.POLICY[cls].projection,
406
+ nextAction: R.POLICY[cls].nextAction,
407
+ }])),
408
+ byFinding: zeros(R.MEMBER_FINDINGS),
409
+ populationDefect: { missingSourceKey: 0, duplicateSourceKey: 0, unknownSourceKey: 0 },
410
+ danglingStarted: 0,
411
+ unexpectedSkipped: 0,
412
+ projectionErrors: [],
413
+ };
414
+ }
415
+
416
+ function defectEvent(gate) {
417
+ const d = gate.defect;
418
+ return {
419
+ event_type: 'pipeline_defect',
420
+ subtype: 'state_inconsistency',
421
+ stage: TELEMETRY_STAGE,
422
+ skill: TELEMETRY_SKILL,
423
+ entity_type: TELEMETRY_ENTITY,
424
+ severity: 'blocking',
425
+ count: Math.max(1, gate.failingRecords),
426
+ what_happened: `member population gate refused the pass before any write: ${d.missingSourceKey} missing, ${d.duplicateSourceKey} duplicate, ${d.unknownSourceKey} unknown source keys`,
427
+ };
428
+ }
429
+
430
+ // Folded rows -> completion inputs + telemetry events. `gate` is the pass's gate result; a
431
+ // refused gate projects the defect without reading the journal.
432
+ function projectMemberCompletion({ rows = [], snapshot = null, runId = null, gate = null } = {}) {
433
+ const memberOutcomes = emptyMemberOutcomes();
434
+
435
+ if (gate && !gate.ok) {
436
+ memberOutcomes.populationDefect = { ...gate.defect };
437
+ const inScope = gate.distinctKeys.length;
438
+ memberOutcomes.unexpectedSkipped = inScope;
439
+ return {
440
+ completion: {
441
+ entityCompleteness: [{
442
+ entity: R.MEMBER_ENTITY, subtype: 'all', verificationKind: 'none',
443
+ extracted: gate.extracted, inScope, attempted: 0, unexpectedSkipped: inScope,
444
+ reasons: [`population gate refused the pass: ${gate.defect.missingSourceKey} missing, ${gate.defect.duplicateSourceKey} duplicate, ${gate.defect.unknownSourceKey} unknown source keys; no member was written`],
445
+ }],
446
+ unresolved: [],
447
+ droppedFields: [],
448
+ operatorActions: [],
449
+ memberOutcomes,
450
+ statuses: ['incomplete_with_mismatches'],
451
+ },
452
+ telemetryEvents: [defectEvent(gate)],
453
+ pairingErrors: [],
454
+ };
455
+ }
456
+
457
+ if (!snapshot) throw new Error('projectMemberCompletion needs the member population snapshot');
458
+ validateSnapshot(snapshot);
459
+ const { latestByKey, pairingErrors } = foldMemberJournal(rows);
460
+
461
+ const unresolvedKeys = [];
462
+ const unexpectedKeys = [];
463
+ const ambiguousKeys = [];
464
+ const droppedByFinding = {};
465
+ const aggregates = new Map();
466
+ let attempted = 0;
467
+
468
+ // One event per distinct aggregation key -- exactly the recorder's class signature
469
+ // (classKeyFor) -- with `count` = records carrying that key. retry_count, recovered and
470
+ // severity are NOT in the key: records sharing a signature merge under the severity-merge rule, so the
471
+ // recorder's finalize fold leaves every emitted event unchanged. A record contributes at most
472
+ // once to a key, even when two of its findings map to the same key. This pass emits each key
473
+ // once; a later member pass in the same telemetry run that emits the same signature is folded
474
+ // by the recorder's own documented rules, unchanged.
475
+ const addEvent = (recordKeys, event, { outcomeCode = null, findingCode = null, retryCount = 0, recovered = false } = {}) => {
476
+ const groupKey = recorderSignature(event);
477
+ if (recordKeys.has(groupKey)) return;
478
+ recordKeys.add(groupKey);
479
+ let agg = aggregates.get(groupKey);
480
+ if (!agg) {
481
+ agg = { event: { ...event, count: 0 }, outcomeCodes: new Set(), findingCodes: new Set(), allRecovered: true };
482
+ if (event.event_type === 'error') agg.event.retry_count = 0;
483
+ aggregates.set(groupKey, agg);
484
+ }
485
+ agg.event.count += 1;
486
+ if (SEVERITY_RANK[event.severity] > SEVERITY_RANK[agg.event.severity]) agg.event.severity = event.severity;
487
+ if (event.event_type === 'error') {
488
+ agg.event.retry_count += retryCount;
489
+ agg.allRecovered = agg.allRecovered && recovered;
490
+ }
491
+ if (outcomeCode) agg.outcomeCodes.add(outcomeCode);
492
+ if (findingCode) agg.findingCodes.add(findingCode);
493
+ };
494
+
495
+ for (const key of snapshot.keys) {
496
+ const row = latestByKey.get(key);
497
+ if (!row) { unexpectedKeys.push(key); continue; }
498
+ attempted += 1;
499
+ if (row.status === 'started') { unresolvedKeys.push(key); memberOutcomes.danglingStarted += 1; continue; }
500
+ const cls = classOfRow(row);
501
+ assertTerminalRowFields(row, cls);
502
+ const policy = R.POLICY[cls];
503
+ memberOutcomes.byOutcome[row.outcomeCode] += 1;
504
+ memberOutcomes.byClass[cls].count += 1;
505
+ for (const code of new Set(row.findingCodes)) memberOutcomes.byFinding[code] += 1;
506
+ if (policy.projection === R.PROJECTION.UNRESOLVED) unresolvedKeys.push(key);
507
+ if (cls === 'ambiguous') ambiguousKeys.push(key);
508
+ const droppedCodes = cls === 'written'
509
+ ? [...new Set(row.findingCodes)].filter((code) => R.FINDING_POLICY[code].droppedField)
510
+ : [];
511
+ for (const code of droppedCodes) droppedByFinding[code] = (droppedByFinding[code] || 0) + 1;
512
+
513
+ // Telemetry: only records this run concluded. A record concluded earlier is not re-emitted.
514
+ if (!runId || row.runId !== runId) continue;
515
+ const retryCount = row.retry ? row.retry.count : 0;
516
+ const recordKeys = new Set();
517
+ const base = { stage: TELEMETRY_STAGE, skill: TELEMETRY_SKILL, entity_type: TELEMETRY_ENTITY };
518
+ if (policy.telemetry) {
519
+ const t = policy.telemetry;
520
+ if (t.event_type === 'error') {
521
+ addEvent(recordKeys, {
522
+ event_type: 'error', ...base, wix_api_surface: row.wixApiSurface || MEMBER_API_SURFACE,
523
+ severity: t.severity, error_code: row.failure.errorCode,
524
+ }, { outcomeCode: row.outcomeCode, retryCount, recovered: false });
525
+ } else {
526
+ addEvent(recordKeys, { event_type: t.event_type, subtype: t.subtype, ...base, wix_api_surface: MEMBER_API_SURFACE, severity: t.severity }, { outcomeCode: row.outcomeCode });
527
+ }
528
+ }
529
+ if (cls === 'written' && retryCount > 0) {
530
+ addEvent(recordKeys, {
531
+ event_type: 'error', ...base, wix_api_surface: MEMBER_API_SURFACE, severity: 'info', error_code: row.retry.firstErrorCode,
532
+ }, { outcomeCode: row.outcomeCode, retryCount, recovered: true });
533
+ }
534
+ for (const code of droppedCodes) {
535
+ addEvent(recordKeys, {
536
+ event_type: 'fidelity_loss', subtype: 'dropped_field', ...base, wix_api_surface: MEMBER_API_SURFACE, severity: 'degraded',
537
+ observed_shapes: [{ contact: { phones: 'array' } }],
538
+ }, { findingCode: code });
539
+ }
540
+ }
541
+ memberOutcomes.unexpectedSkipped = unexpectedKeys.length;
542
+ memberOutcomes.projectionErrors = pairingErrors.map((error) => ({ code: error.code, sourceStableKey: error.sourceStableKey }));
543
+
544
+ const byProjection = { imported: 0, alreadyPresentByCrosswalk: 0, deferred: 0, failed: 0, unresolved: 0 };
545
+ for (const cls of R.POLICY_CLASSES) byProjection[R.POLICY[cls].projection] += memberOutcomes.byClass[cls].count;
546
+ byProjection.unresolved += memberOutcomes.danglingStarted;
547
+ const partitionSum = Object.values(byProjection).reduce((a, b) => a + b, 0) + unexpectedKeys.length;
548
+ const partitionMismatch = partitionSum !== snapshot.keys.length;
549
+
550
+ const reasons = [];
551
+ for (const cls of R.POLICY_CLASSES) {
552
+ const entry = memberOutcomes.byClass[cls];
553
+ if (!entry.count) continue;
554
+ const label = R.POLICY[cls].reasonLine || `${entry.outcome}${cls.startsWith('failed-') ? ` (${cls === 'failed-unknown' ? 'outcome unknown' : 'rejected'})` : ''}`;
555
+ reasons.push(`${label}: ${entry.count}${entry.nextAction ? ` -- ${entry.nextAction}` : ''}`);
556
+ }
557
+ if (memberOutcomes.danglingStarted) reasons.push(`write started and never concluded: ${memberOutcomes.danglingStarted} -- re-run with --unresolved-only: reads the member back by login email`);
558
+ if (unexpectedKeys.length) reasons.push(`no journal row at all: ${unexpectedKeys.length}`);
559
+
560
+ const events = [...aggregates.values()].map(({ event, outcomeCodes, findingCodes, allRecovered }) => {
561
+ if (event.event_type === 'error') event.recovered = allRecovered;
562
+ event.what_happened = findingCodes.size
563
+ ? `${event.count} written member record(s): contact.phones dropped (${[...findingCodes].sort().join(', ')})`
564
+ : `${event.count} member record(s) ended ${[...outcomeCodes].sort().join(', ')}${event.error_code ? ` with error ${event.error_code}` : ''}`;
565
+ return event;
566
+ });
567
+
568
+ return {
569
+ completion: {
570
+ entityCompleteness: [{
571
+ entity: R.MEMBER_ENTITY, subtype: 'all', verificationKind: 'none',
572
+ extracted: snapshot.keys.length, inScope: snapshot.keys.length, attempted,
573
+ ...byProjection,
574
+ unexpectedSkipped: unexpectedKeys.length,
575
+ reasons,
576
+ }],
577
+ unresolved: unresolvedKeys.length ? [{ entity: R.MEMBER_ENTITY, kind: 'unmapped_source', count: unresolvedKeys.length, sourceIds: unresolvedKeys }] : [],
578
+ droppedFields: Object.entries(droppedByFinding).map(([code, n]) => ({
579
+ entity: R.MEMBER_ENTITY, field: R.FINDING_POLICY[code].droppedField, recordCount: n, reasonCode: code,
580
+ })),
581
+ operatorActions: ambiguousKeys.length ? [{ ...R.OPERATOR_ACTION_AMBIGUOUS, entity: R.MEMBER_ENTITY, affectedCount: ambiguousKeys.length }] : [],
582
+ memberOutcomes,
583
+ statuses: pairingErrors.length || partitionMismatch ? ['incomplete_with_mismatches'] : [],
584
+ },
585
+ telemetryEvents: events,
586
+ pairingErrors,
587
+ };
588
+ }
589
+
590
+ // Read the journal (and the snapshot, when the pass did not hand one over) and project.
591
+ //
592
+ // An optional `journalRows` lets a caller that already loaded the journal once
593
+ // (to also call `attachAttemptReasons` for the non-member rows) hand those rows over directly,
594
+ // so `loadAttemptJournal` is called once per report, not once per entity. When omitted,
595
+ // `projectMemberPass` loads the journal itself exactly as it always has, so every existing
596
+ // caller is unaffected.
597
+ async function projectMemberPass(projectDir, { runId, pass = null, sample = false, journalRows = null } = {}) {
598
+ requireString(projectDir, 'projectDir');
599
+ if (pass && pass.ok === false) return projectMemberCompletion({ gate: pass.gate, runId });
600
+ const snapshot = (pass && pass.snapshot) || await readMemberPopulation(projectDir);
601
+ if (!snapshot) throw Object.assign(new Error(`no ${MEMBER_POPULATION_FILE}: run a full member pass before projecting members`), { code: SNAPSHOT_MISSING });
602
+ const rows = journalRows !== null
603
+ ? journalRows
604
+ : (await localState.loadAttemptJournal(projectDir, { sample: Boolean(sample) })).rows;
605
+ return projectMemberCompletion({ rows, snapshot, runId, gate: pass ? pass.gate : null });
606
+ }
607
+
608
+ // Merge the member fragment into the run's completion input, replacing any earlier members row.
609
+ function mergeMemberCompletion(completionInput = {}, fragment) {
610
+ const withoutMembers = (list) => (list || []).filter((row) => row.entity !== R.MEMBER_ENTITY);
611
+ return {
612
+ ...completionInput,
613
+ entityCompleteness: [...withoutMembers(completionInput.entityCompleteness), ...fragment.entityCompleteness],
614
+ unresolved: [...withoutMembers(completionInput.unresolved), ...fragment.unresolved],
615
+ droppedFields: [...withoutMembers(completionInput.droppedFields), ...fragment.droppedFields],
616
+ operatorActions: [...withoutMembers(completionInput.operatorActions), ...fragment.operatorActions],
617
+ statuses: [...(completionInput.statuses || []), ...fragment.statuses],
618
+ memberOutcomes: fragment.memberOutcomes,
619
+ };
620
+ }
621
+
622
+ // Emit once per aggregated event. Telemetry must never abort a migration, so failures are
623
+ // counted and returned, not thrown.
624
+ async function emitMemberTelemetry(events, record) {
625
+ let emitted = 0;
626
+ const failed = [];
627
+ for (const event of events || []) {
628
+ try {
629
+ await record(event);
630
+ emitted += 1;
631
+ } catch (error) {
632
+ failed.push({ event_type: event.event_type, error: String(error && error.message).slice(0, 200) });
633
+ }
634
+ }
635
+ return { emitted, failed };
636
+ }
637
+
638
+ module.exports = {
639
+ MEMBER_POPULATION_FILE,
640
+ POPULATION_BASIS,
641
+ SELECTION_MODES,
642
+ SNAPSHOT_MISSING,
643
+ TELEMETRY_SKILL,
644
+ TELEMETRY_STAGE,
645
+ validateMemberPopulation,
646
+ readMemberPopulation,
647
+ buildMemberPopulation,
648
+ writeMemberPopulation,
649
+ foldMemberJournal,
650
+ buildStartedRow,
651
+ buildMemberTerminalRow,
652
+ selectMemberRecords,
653
+ runMemberPass,
654
+ projectMemberCompletion,
655
+ projectMemberPass,
656
+ mergeMemberCompletion,
657
+ emitMemberTelemetry,
658
+ };