@wix/agent-skills 1.33.1 → 1.35.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (619) hide show
  1. package/README.md +3 -0
  2. package/package.json +1 -1
  3. package/skills/wix-export/SKILL.md +83 -0
  4. package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
  5. package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
  6. package/skills/wix-harmony-editor/SKILL.md +317 -0
  7. package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
  8. package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
  9. package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
  10. package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
  11. package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
  12. package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
  13. package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
  14. package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
  15. package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
  16. package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
  17. package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
  18. package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
  19. package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
  20. package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
  21. package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
  22. package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
  23. package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
  24. package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
  25. package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
  26. package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
  27. package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
  28. package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
  29. package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
  30. package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
  31. package/skills/wix-headless/SKILL.md +7 -2
  32. package/skills/wix-headless/references/CAPABILITIES.md +6 -1
  33. package/skills/wix-headless/references/DISCOVERY.md +2 -1
  34. package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
  35. package/skills/wix-headless/references/SEED.md +3 -2
  36. package/skills/wix-headless/references/SETUP.md +1 -0
  37. package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
  38. package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
  39. package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
  40. package/skills/wix-headless/references/managed/CREATE.md +1 -1
  41. package/skills/wix-headless-kit/SKILL.md +110 -21
  42. package/skills/wix-headless-kit/guides/api-run.md +15 -13
  43. package/skills/wix-headless-kit/guides/existing-site.md +31 -0
  44. package/skills/wix-headless-kit/guides/migration.md +49 -17
  45. package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
  46. package/skills/wix-headless-kit/install/context.mjs +61 -6
  47. package/skills/wix-headless-kit/install/pins.json +1 -1
  48. package/skills/wix-headless-kit/install/setup.mjs +107 -12
  49. package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
  50. package/skills/wix-headless-replatform/SKILL.md +116 -0
  51. package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
  52. package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
  53. package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
  54. package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
  55. package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
  56. package/skills/wix-headless-replatform/references/output-contract.md +93 -0
  57. package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
  58. package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
  59. package/skills/wix-headless-replatform/references/safety.md +19 -0
  60. package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
  61. package/skills/wix-headless-replatform/references/workflow.md +157 -0
  62. package/skills/wix-headless-replatform/registry/README.md +20 -0
  63. package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
  64. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
  65. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
  66. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
  67. package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
  68. package/skills/wix-headless-replatform/registry/registry.json +36 -0
  69. package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
  70. package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
  71. package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
  72. package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
  73. package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
  74. package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
  75. package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
  76. package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
  77. package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
  78. package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
  79. package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
  80. package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
  81. package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
  82. package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
  83. package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
  84. package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
  85. package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
  86. package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
  87. package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
  88. package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
  89. package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
  90. package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
  91. package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
  92. package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
  93. package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
  94. package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
  95. package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
  96. package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
  97. package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
  98. package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
  99. package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
  100. package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
  101. package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
  102. package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
  103. package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
  104. package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
  105. package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
  106. package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
  107. package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
  108. package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
  109. package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
  110. package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
  111. package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
  112. package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
  113. package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
  114. package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
  115. package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
  116. package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
  117. package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
  118. package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
  119. package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
  120. package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
  121. package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
  122. package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
  123. package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
  124. package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
  125. package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
  126. package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
  127. package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
  128. package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
  129. package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
  130. package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
  131. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
  132. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
  133. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
  134. package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
  135. package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
  136. package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
  137. package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
  138. package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
  139. package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
  140. package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
  141. package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
  142. package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
  143. package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
  144. package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
  145. package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
  146. package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
  147. package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
  148. package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
  149. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
  150. package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
  151. package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
  152. package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
  153. package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
  154. package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
  155. package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
  156. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
  157. package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
  158. package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
  159. package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
  160. package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
  161. package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
  162. package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
  163. package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
  164. package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
  165. package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
  166. package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
  167. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
  168. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
  169. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
  170. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
  171. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
  172. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
  173. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
  174. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
  175. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
  176. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
  177. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
  178. package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
  179. package/skills/wix-import/SKILL.md +90 -0
  180. package/skills/wix-manage/SKILL.md +14 -4
  181. package/skills/wix-manage/references/blog/how-to-create-blog-posts.md +2 -0
  182. package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
  183. package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
  184. package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
  185. package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
  186. package/skills/wix-manage/references/seo/manage-content-plan.md +207 -222
  187. package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
  188. package/skills/wix-manage/references/sites/upload-static-site.md +128 -8
  189. package/skills/wix-readme/SKILL.md +166 -0
  190. package/skills/wix-replatform/.publish-manifest.json +5 -5
  191. package/skills/wix-replatform/CLI.md +162 -0
  192. package/skills/wix-replatform/README.md +52 -0
  193. package/skills/wix-replatform/SKILL.md +229 -684
  194. package/skills/wix-replatform/console/account.css +1 -0
  195. package/skills/wix-replatform/console/app.css +1 -0
  196. package/skills/wix-replatform/console/app.js +117 -0
  197. package/skills/wix-replatform/console/index.html +4 -0
  198. package/skills/wix-replatform/console/json.css +11 -0
  199. package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
  200. package/skills/wix-replatform/lib/app-page-routing.js +75 -0
  201. package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
  202. package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
  203. package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
  204. package/skills/wix-replatform/lib/completion-report.js +1393 -13
  205. package/skills/wix-replatform/lib/config-env.js +85 -11
  206. package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
  207. package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
  208. package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
  209. package/skills/wix-replatform/lib/destination-choice.js +163 -0
  210. package/skills/wix-replatform/lib/destination-handoff.js +62 -0
  211. package/skills/wix-replatform/lib/destination-http.js +81 -0
  212. package/skills/wix-replatform/lib/destination-route.js +98 -0
  213. package/skills/wix-replatform/lib/destination.js +919 -0
  214. package/skills/wix-replatform/lib/discovered-census.js +231 -0
  215. package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
  216. package/skills/wix-replatform/lib/document-url-guard.js +203 -0
  217. package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
  218. package/skills/wix-replatform/lib/entity-verification.js +18 -0
  219. package/skills/wix-replatform/lib/execution-capability.js +120 -0
  220. package/skills/wix-replatform/lib/execution-log.js +170 -0
  221. package/skills/wix-replatform/lib/execution-manifest.js +20 -2
  222. package/skills/wix-replatform/lib/execution-state.js +22 -0
  223. package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
  224. package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
  225. package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
  226. package/skills/wix-replatform/lib/import-recovery.js +800 -6
  227. package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
  228. package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
  229. package/skills/wix-replatform/lib/link-audit.js +173 -0
  230. package/skills/wix-replatform/lib/link-census.js +194 -0
  231. package/skills/wix-replatform/lib/link-plan.js +148 -0
  232. package/skills/wix-replatform/lib/link-verification.js +274 -0
  233. package/skills/wix-replatform/lib/link-write-journal.js +42 -0
  234. package/skills/wix-replatform/lib/local-state.js +869 -30
  235. package/skills/wix-replatform/lib/member-completion.js +658 -0
  236. package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
  237. package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
  238. package/skills/wix-replatform/lib/migration-completion.js +311 -0
  239. package/skills/wix-replatform/lib/operator-identity.js +47 -0
  240. package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
  241. package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
  242. package/skills/wix-replatform/lib/orchestration-router.js +608 -32
  243. package/skills/wix-replatform/lib/orchestration-state.js +188 -12
  244. package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
  245. package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
  246. package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
  247. package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
  248. package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
  249. package/skills/wix-replatform/lib/progress-log.js +19 -3
  250. package/skills/wix-replatform/lib/read-back-approval.js +184 -0
  251. package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
  252. package/skills/wix-replatform/lib/read-back-contract.js +243 -0
  253. package/skills/wix-replatform/lib/read-back-extract.js +118 -0
  254. package/skills/wix-replatform/lib/read-back-gate.js +734 -0
  255. package/skills/wix-replatform/lib/read-back-reads.js +94 -0
  256. package/skills/wix-replatform/lib/read-back-state.js +107 -0
  257. package/skills/wix-replatform/lib/read-back-summary.js +81 -0
  258. package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
  259. package/skills/wix-replatform/lib/run-controller.js +401 -0
  260. package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
  261. package/skills/wix-replatform/lib/setup-verification.js +148 -0
  262. package/skills/wix-replatform/lib/source-access.js +231 -0
  263. package/skills/wix-replatform/lib/source-coverage.js +1130 -0
  264. package/skills/wix-replatform/lib/source-secrets.js +277 -0
  265. package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
  266. package/skills/wix-replatform/lib/task-state.js +110 -0
  267. package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
  268. package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
  269. package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
  270. package/skills/wix-replatform/lib/url-verification.js +315 -0
  271. package/skills/wix-replatform/lib/user-action-effects.js +42 -0
  272. package/skills/wix-replatform/lib/user-actions.js +264 -0
  273. package/skills/wix-replatform/lib/website-handoff.js +1220 -0
  274. package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
  275. package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
  276. package/skills/wix-replatform/lib/write-verification-state.js +92 -0
  277. package/skills/wix-replatform/lib/write-verification.js +274 -0
  278. package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
  279. package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
  280. package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
  281. package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
  282. package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
  283. package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
  284. package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
  285. package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
  286. package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
  287. package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
  288. package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
  289. package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
  290. package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
  291. package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
  292. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
  293. package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
  294. package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
  295. package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
  296. package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
  297. package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
  298. package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
  299. package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
  300. package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
  301. package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
  302. package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
  303. package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
  304. package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
  305. package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
  306. package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
  307. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
  308. package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
  309. package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
  310. package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
  311. package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
  312. package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
  313. package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
  314. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
  315. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
  316. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
  317. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
  318. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
  319. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
  320. package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
  321. package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
  322. package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
  323. package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
  324. package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
  325. package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
  326. package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
  327. package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
  328. package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
  329. package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
  330. package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
  331. package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
  332. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
  333. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
  334. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
  335. package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
  336. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
  337. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
  338. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
  339. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
  340. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
  341. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
  342. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
  343. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
  344. package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
  345. package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
  346. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
  347. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
  348. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
  349. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
  350. package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
  351. package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
  352. package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
  353. package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
  354. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
  355. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
  356. package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
  357. package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
  358. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
  359. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
  360. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
  361. package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
  362. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
  363. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
  364. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
  365. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
  366. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
  367. package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
  368. package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
  369. package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
  370. package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
  371. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
  372. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
  373. package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
  374. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
  375. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
  376. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
  377. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
  378. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
  379. package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
  380. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
  381. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
  382. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
  383. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
  384. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
  385. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
  386. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
  387. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
  388. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
  389. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
  390. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
  391. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
  392. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
  393. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
  394. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
  395. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
  396. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
  397. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
  398. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
  399. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
  400. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
  401. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
  402. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
  403. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
  404. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
  405. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
  406. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
  407. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
  408. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
  409. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
  410. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
  411. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
  412. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
  413. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
  414. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
  415. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
  416. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
  417. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
  418. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
  419. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
  420. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
  421. package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
  422. package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
  423. package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
  424. package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
  425. package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
  426. package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
  427. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
  428. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
  429. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
  430. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
  431. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
  432. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
  433. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
  434. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
  435. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
  436. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
  437. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
  438. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
  439. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
  440. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
  441. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
  442. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
  443. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
  444. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
  445. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
  446. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
  447. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
  448. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
  449. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
  450. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
  451. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
  452. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
  453. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
  454. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
  455. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
  456. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
  457. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
  458. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
  459. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
  460. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
  461. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
  462. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
  463. package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
  464. package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
  465. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
  466. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
  467. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
  468. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
  469. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
  470. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
  471. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
  472. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
  473. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
  474. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
  475. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
  476. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
  477. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
  478. package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
  479. package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
  480. package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
  481. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
  482. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
  483. package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
  484. package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
  485. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
  486. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
  487. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
  488. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
  489. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
  490. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
  491. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
  492. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
  493. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
  494. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
  495. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
  496. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
  497. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
  498. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
  499. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
  500. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
  501. package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
  502. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
  503. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
  504. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
  505. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
  506. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
  507. package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
  508. package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
  509. package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
  510. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
  511. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
  512. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
  513. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
  514. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
  515. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
  516. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
  517. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
  518. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
  519. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
  520. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
  521. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
  522. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
  523. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
  524. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
  525. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
  526. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
  527. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
  528. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
  529. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
  530. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
  531. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
  532. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
  533. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
  534. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
  535. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
  536. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
  537. package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
  538. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
  539. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
  540. package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
  541. package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
  542. package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
  543. package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
  544. package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
  545. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
  546. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
  547. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
  548. package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
  549. package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
  550. package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
  551. package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
  552. package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
  553. package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
  554. package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
  555. package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
  556. package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
  557. package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
  558. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
  559. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
  560. package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
  561. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
  562. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
  563. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
  564. package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
  565. package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
  566. package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
  567. package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
  568. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
  569. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
  570. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
  571. package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
  572. package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
  573. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
  574. package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
  575. package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
  576. package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
  577. package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
  578. package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
  579. package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
  580. package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
  581. package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
  582. package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
  583. package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
  584. package/skills/wix-replatform/scripts/discovered-census.js +26 -0
  585. package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
  586. package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
  587. package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
  588. package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
  589. package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
  590. package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
  591. package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
  592. package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
  593. package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
  594. package/skills/wix-replatform/scripts/migration-completion.js +76 -0
  595. package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
  596. package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
  597. package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
  598. package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
  599. package/skills/wix-replatform/scripts/replatform-console.js +146 -0
  600. package/skills/wix-replatform/scripts/replatform.js +436 -0
  601. package/skills/wix-replatform/scripts/source-secrets.js +77 -0
  602. package/skills/wix-replatform/scripts/url-redirects.js +286 -0
  603. package/skills/wix-replatform/scripts/user-action.js +58 -0
  604. package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
  605. package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
  606. package/skills/wix-replatform/scripts/wix-destination.js +143 -0
  607. package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
  608. package/skills/wix-vibe-headless/SKILL.md +7 -3
  609. package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
  610. package/skills/wix-vibe-headless/platforms/base44.md +1 -0
  611. package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
  612. package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
  613. package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
  614. package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
  615. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
  616. package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
  617. package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
  618. package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
  619. package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
@@ -0,0 +1 @@
1
+ .account-check{display:flex;justify-content:space-between;gap:16px;align-items:flex-start;border:1px solid #cbdbe7;background:#f4f8fb;border-radius:9px;padding:14px;margin:16px 0}.account-heading{font-weight:700;margin:0 0 7px!important}.account-check code{display:block;max-width:500px;overflow-wrap:anywhere;color:#173f5f;font:600 13px ui-monospace,SFMono-Regular,Menlo,monospace;margin:3px 0 7px}.account-check .muted code{display:inline;font:inherit}.account-check .error{display:block;margin:5px 0 0}.account-check button{flex:none}@media(max-width:520px){.account-check{flex-direction:column}.account-check button{width:100%}}
@@ -0,0 +1 @@
1
+ :root{font-family:ui-sans-serif,system-ui,sans-serif;color:#18212b;background:#f6f8fa}*{box-sizing:border-box}body{margin:0}header{height:58px;background:#fff;border-bottom:1px solid #dce3e9;display:flex;align-items:center;justify-content:space-between;padding:0 22px}.brand{font-weight:750;color:#152f48;text-decoration:none}.brand span{font-weight:400;color:#647487;margin-left:8px}#connection{font-size:12px;color:#647487}main{display:grid;grid-template-columns:230px minmax(0,1fr);height:calc(100vh - 58px)}aside{background:#fff;border-right:1px solid #dce3e9;padding:16px}aside button,#new-project{width:100%}h1{margin:0 0 6px;font-size:26px}h2{font-size:12px;letter-spacing:.06em;text-transform:uppercase;color:#647487;margin:24px 0 8px}.project{width:100%;text-align:left;background:transparent;color:#263442;padding:10px;border:0;border-radius:8px;margin:2px 0}.project:hover,.project.active{background:#edf3f8}.project small{display:block;color:#647487;margin-top:3px}#content{padding:30px;max-width:1050px;width:100%;min-height:0;overflow:hidden}.empty{max-width:480px;margin:15vh auto}.status{display:flex;gap:12px;align-items:center;margin-bottom:22px;color:#5d6d7e}.pill{font-size:12px;border-radius:999px;padding:5px 9px;background:#e8eef4;color:#314a62;font-weight:700}.attention{background:#fff8e7;border:1px solid #ecd99e;border-radius:10px;padding:16px;margin:20px 0;display:flex;gap:16px;align-items:center}.attention p{margin:4px 0 0;color:#5e5131}.attention button{margin-left:auto}.grid{display:grid;grid-template-columns:1fr 280px;gap:24px}.card{background:#fff;border:1px solid #dce3e9;border-radius:11px;padding:18px}.card h3{font-size:14px;margin:0 0 12px}.work-card{margin:0 0 24px}.work-heading{display:flex;justify-content:space-between;gap:18px;align-items:flex-start}.work-heading h3{margin-bottom:3px}.work-heading p{margin:0}.work-summary{font-size:13px;color:#314a62;font-weight:650}.task-list,.agent-list{list-style:none;padding:0;margin:14px 0 0}.task-row{border-top:1px solid #edf0f3;padding:12px 0}.task-main,.agent-row{display:flex;align-items:center;gap:9px}.task-main{align-items:flex-start}.task-title{font-weight:700}.task-completed{text-decoration:line-through;color:#68798b}.task-check{color:#257349;font-size:17px;font-weight:800;line-height:18px}.task-state-icon{color:#7d8b98;font-size:18px;line-height:17px}.spinner{width:16px;height:16px;border:2px solid #bdd0df;border-top-color:#23669e;border-radius:50%;display:inline-block;flex:0 0 auto;animation:spin .8s linear infinite}.spinner.small{width:12px;height:12px;border-width:2px}.agent-list{margin:9px 0 0 25px}.agent-row{font-size:13px;padding:4px 0}.agent-row.agent-child{margin-left:16px}.agent-row .muted{margin-left:auto}.agent-empty{margin:8px 0 0 25px}@keyframes spin{to{transform:rotate(360deg)}}.activity-card{height:calc(100vh - 340px);min-height:260px;display:flex;flex-direction:column;min-height:0}.activity-feed{overflow-y:auto;min-height:0;padding-right:4px}.event{padding:12px 0;border-bottom:1px solid #edf0f3;font-size:14px}.event summary{cursor:pointer}.event summary::marker{color:#647487}.event small{display:block;color:#68798b;margin-top:3px}.event pre{white-space:pre-wrap;overflow-wrap:anywhere;background:#f4f7f9;border-radius:7px;padding:10px;font-size:12px;line-height:1.4;color:#334759}.event.heartbeat{color:#788796}button{font:inherit;border:0;border-radius:8px;padding:9px 12px;font-weight:650;background:#e8eef4;color:#20384d;cursor:pointer}button.primary{background:#23669e;color:#fff}button.danger{color:#9b3030;background:#fff;border:1px solid #d99d9d}.actions{display:flex;gap:8px;flex-wrap:wrap}.muted{color:#68798b;font-size:13px}dialog{border:0;border-radius:12px;padding:0;max-width:720px;width:calc(100% - 32px);max-height:calc(100vh - 32px);overflow:hidden;box-shadow:0 20px 60px #0004}dialog::backdrop{background:#14233388}.dialog-body{padding:26px}.dialog-body h1{font-size:22px}.dialog-body p{line-height:1.5}.artifact{display:flex;justify-content:space-between;align-items:center;border:1px solid #dce3e9;padding:12px;border-radius:9px;margin:15px 0}.choice{display:block;border:1px solid #d4dee7;border-radius:9px;padding:12px;margin:9px 0}.choice small{display:block;margin:4px 0 0 24px;color:#68798b}.choice input{margin-right:8px}textarea,input,select{font:inherit;width:100%;padding:9px;border:1px solid #bdcbd7;border-radius:7px;margin:5px 0 12px}label{font-size:13px;font-weight:650;display:block}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}.form-grid label{min-width:0}.file-preview{max-height:min(58vh,560px);overflow:auto;white-space:pre;overflow-wrap:normal;background:#f4f7f9;border:1px solid #dce3e9;border-radius:7px;padding:12px;font:12px/1.5 ui-monospace,SFMono-Regular,Menlo,monospace;color:#334759}.footer{display:flex;justify-content:space-between;gap:10px;margin-top:22px}.error{color:#9c3030;margin-top:12px}@media(max-width:720px){main{grid-template-columns:1fr;height:auto;min-height:calc(100vh - 58px)}aside{border-right:0;border-bottom:1px solid #dce3e9}.grid{grid-template-columns:1fr}#content{padding:20px;overflow:visible}.activity-card{height:60vh}.file-preview{max-height:48vh}.form-grid{grid-template-columns:1fr}.attention{align-items:flex-start;flex-direction:column}.attention button{margin-left:0}.work-heading{flex-direction:column;gap:4px}}
@@ -0,0 +1,117 @@
1
+ const token = new URLSearchParams(location.search).get('token');
2
+ const q = (s) => document.querySelector(s); let selected = null; let events = []; let stream;
3
+ const api = async (path, options = {}) => { const join = path.includes('?') ? '&' : '?'; const res = await fetch(`${path}${join}token=${encodeURIComponent(token)}`, { ...options, headers: { 'content-type': 'application/json', ...(options.headers || {}) } }); const data = await res.json(); if (!res.ok) throw new Error(data.error || 'Request failed'); return data; };
4
+ const esc = (value) => String(value ?? '').replace(/[&<>"]/g, (c) => ({ '&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;' }[c]));
5
+ function routeState() { const params = new URLSearchParams(location.search); return { project: params.get('project'), request: params.get('request'), artifact: params.get('artifact'), cursor: params.get('cursor') }; }
6
+ function updateRoute(values) { const url = new URL(location.href); for (const [key, value] of Object.entries(values)) { if (value === null || value === undefined || value === '') url.searchParams.delete(key); else url.searchParams.set(key, value); } history.replaceState(null, '', `${url.pathname}?${url.searchParams.toString()}${url.hash}`); }
7
+ function statusName(s) { if (/_running$/.test(s || '')) return 'Ready to continue'; return ({ running:'Running', waiting_for_user:'Waiting for you', awaiting_user_action:'Waiting for you', blocked:'Blocked', canceled:'Canceled', interrupted:'Interrupted', timed_out:'Timed out', completed:'Completed', failed:'Failed' })[s] || 'Ready to start'; }
8
+ function readable(value) { return String(value || '').replaceAll('_', ' ').replace(/\b\w/g, (c) => c.toUpperCase()); }
9
+ function structuredArtifact(file) {
10
+ const structured = /(?:application\/(?:json|x-ndjson)|(?:json|jsonl|ndjson))/.test(`${file.mediaType} ${file.path}`.toLowerCase());
11
+ if (!structured) return null;
12
+ try {
13
+ const isLines = /(?:jsonl|ndjson)/.test(`${file.mediaType} ${file.path}`.toLowerCase());
14
+ return isLines ? file.content.split('\n').filter(Boolean).map((line) => JSON.parse(line)) : JSON.parse(file.content);
15
+ } catch { return null; }
16
+ }
17
+ function jsonMarkup(value) {
18
+ const raw = JSON.stringify(value, null, 2);
19
+ return raw.replace(/("(?:\\.|[^"\\])*")(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/g, (match, string, colon, literal) => {
20
+ const kind = string ? (colon ? 'json-key' : 'json-string') : literal ? 'json-literal' : 'json-number';
21
+ return `<span class="${kind}">${esc(string || literal || match)}</span>${colon || ''}`;
22
+ });
23
+ }
24
+ function fileLanguage(file) {
25
+ const source = `${file.mediaType || ''} ${file.path || ''}`.toLowerCase();
26
+ if (/(?:application\/(?:json|x-ndjson)|(?:json|jsonl|ndjson))/.test(source)) return 'json';
27
+ if (/(?:javascript|ecmascript|\.m?js\b|\.cjs\b)/.test(source)) return 'javascript';
28
+ if (/(?:typescript|\.tsx?\b)/.test(source)) return 'typescript';
29
+ if (/(?:text\/css|\.css\b)/.test(source)) return 'css';
30
+ if (/(?:text\/html|\.html?\b)/.test(source)) return 'html';
31
+ if (/(?:text\/markdown|\.md\b)/.test(source)) return 'markdown';
32
+ return 'text';
33
+ }
34
+ function codeMarkup(content, language) {
35
+ const escaped = esc(content);
36
+ if (language === 'json') return escaped;
37
+ if (language === 'html') return escaped.replace(/(&lt;\/?)([A-Za-z][\w-]*)([^&]*?)(\/??&gt;)/g, '$1<span class="syntax-tag">$2</span>$3$4');
38
+ if (language === 'markdown') return escaped.replace(/^(#{1,6}\s.*)$/gm, '<span class="syntax-heading">$1</span>').replace(/(`[^`]+`)/g, '<span class="syntax-code">$1</span>');
39
+ if (language === 'javascript' || language === 'typescript') return escaped.replace(/(\/\/[^\n]*|\/\*[\s\S]*?\*\/)/g, '<span class="syntax-comment">$1</span>').replace(/\b(const|let|var|function|async|await|return|if|else|for|while|class|new|import|from|export|throw|try|catch)\b/g, '<span class="syntax-keyword">$1</span>');
40
+ if (language === 'css') return escaped.replace(/(\/\*[\s\S]*?\*\/)/g, '<span class="syntax-comment">$1</span>').replace(/(^|\n)([^{}\n]+)(?=\s*\{)/g, '$1<span class="syntax-selector">$2</span>');
41
+ return escaped;
42
+ }
43
+ async function projects() { try { const data = await api('/api/projects'); q('#projects').innerHTML = data.projects.map((p) => `<button class="project ${p.project === selected ? 'active':''}" data-project="${esc(p.project)}">${esc(p.project)}<small>${esc(statusName(p.router?.state || p.activeRun?.status || p.orchestration?.status))}</small></button>`).join('') || '<p class="muted">No migration projects yet.</p>'; document.querySelectorAll('[data-project]').forEach((b) => b.onclick = () => openProject(b.dataset.project)); } catch (e) { q('#projects').textContent = e.message; } }
44
+ function eventMarkup(event) { return `<details class="event ${event.type === 'heartbeat' ? 'heartbeat':''}" data-event-id="${esc(event.eventId || '')}"><summary><strong>${esc(readable(event.type))}</strong><small>${esc(event.message || '')} · ${esc(event.timestamp ? new Date(event.timestamp).toLocaleString() : 'just now')}</small></summary><pre>${esc(JSON.stringify(event, null, 2))}</pre></details>`; }
45
+ function appendActivity(event) { const feed = q('.activity-feed'); if (!feed) return; feed.querySelector('.empty-activity')?.remove(); feed.insertAdjacentHTML('afterbegin', eventMarkup(event)); }
46
+ function taskIcon(state) { return state === 'running' ? '<span class="spinner" aria-hidden="true"></span>' : state === 'completed' ? '<span class="task-check" aria-hidden="true">✓</span>' : '<span class="task-state-icon" aria-hidden="true">•</span>'; }
47
+ function workMarkup(data) {
48
+ const tasks = data?.tasks || []; const agents = data?.agents || []; const runningTasks = tasks.filter((task) => task.state === 'running').length; const runningAgents = agents.filter((agent) => agent.state === 'running').length;
49
+ if (!tasks.length) return `<div class="work-heading"><div><h3>Work</h3><p class="muted">Persisted work state</p></div><p class="muted">No tasks recorded</p></div><p class="muted">Work details will appear after the supervisor records a route. Observed activity below is not treated as task state.</p>`;
50
+ const rows = tasks.map((task) => {
51
+ const assigned = agents.filter((agent) => agent.taskId === task.taskId); const active = assigned.filter((agent) => agent.state === 'running');
52
+ const agentRows = assigned.length ? `<ul class="agent-list">${assigned.map((agent) => `<li class="agent-row agent-${esc(agent.state)} ${agent.parentAgentId ? 'agent-child':''}">${agent.state === 'running' ? '<span class="spinner small" aria-hidden="true"></span>' : agent.state === 'completed' ? '<span class="task-check" aria-hidden="true">✓</span>' : '<span class="task-state-icon" aria-hidden="true">•</span>'}<span>${esc(agent.label)}</span><span class="muted">${esc(readable(agent.state))}</span></li>`).join('')}</ul>` : '<p class="agent-empty muted">No agent has been recorded for this task.</p>';
53
+ const topology = active.length && !active.some((agent) => agent.parentAgentId) ? '<p class="agent-empty muted">No additional agent detail reported.</p>' : '';
54
+ return `<li class="task-row task-${esc(task.state)}" data-task-id="${esc(task.taskId)}"><div class="task-main">${taskIcon(task.state)}<div><div class="task-title ${task.state === 'completed' ? 'task-completed':''}">${esc(task.title)}</div><div class="muted">${esc(readable(task.state))}${task.route?.reason ? ` · ${esc(readable(task.route.reason))}` : ''}</div></div></div>${agentRows}${topology}</li>`;
55
+ }).join('');
56
+ return `<div class="work-heading"><div><h3>Work</h3><p class="muted">Persisted work state</p></div><p class="work-summary">${runningTasks ? `${runningTasks} running task${runningTasks === 1 ? '' : 's'}` : 'No running tasks'} · ${runningAgents} active agent${runningAgents === 1 ? '' : 's'}</p></div><ul class="task-list">${rows}</ul>`;
57
+ }
58
+ function renderWork(tasks) { const panel = q('#work-panel'); if (panel) panel.innerHTML = workMarkup(tasks); }
59
+ function panelMarkup(status, requests) {
60
+ const state = status.activeRun?.status || status.latestResult?.outcome || status.orchestration?.status || 'ready'; const pending = requests.find((r) => r.status === 'pending');
61
+ const attention = pending ? `<div class="attention"><div><strong>${esc(pending.title)}</strong><p>${esc(pending.prompt)}</p></div><button class="primary" id="open-request">Review decision</button></div>` : '';
62
+ const rawState = status.router?.reason || status.latestResult?.nextAction || 'ready';
63
+ return { state, pending, attention, current: `<div class="card"><h3>Current state</h3><p>${esc(readable(rawState))}</p><p class="muted">Technical state: ${esc(rawState)}</p><div class="actions">${!status.activeRun && state !== 'completed' ? '<button class="primary" id="resume">Resume</button>' : ''}${status.activeRun ? '<button class="danger" id="cancel">Stop migration</button>' : ''}</div></div>`, requests: `<div class="card" style="margin-top:16px"><h3>Requests</h3><p class="muted">${requests.length} total · ${requests.filter((r)=>r.status==='pending').length} pending</p></div>` };
64
+ }
65
+ function bindPanels(pending) {
66
+ if (pending) q('#open-request').onclick = () => requestView(pending); if (q('#resume')) q('#resume').onclick = () => start(true); if (q('#cancel')) q('#cancel').onclick = cancelRun;
67
+ }
68
+ function renderDurablePanels(status, requests) {
69
+ const panel = panelMarkup(status, requests); const statusLine = q('#status-line'); if (!statusLine) return;
70
+ statusLine.innerHTML = `<span class="pill">${esc(statusName(panel.state))}</span><span>${status.eventStream?.lastEventAt ? `Last observed ${esc(new Date(status.eventStream.lastEventAt).toLocaleString())}` : 'No recent observation'}</span>`;
71
+ q('#attention-area').innerHTML = panel.attention; q('#current-state-card').innerHTML = panel.current; q('#requests-card').innerHTML = panel.requests; bindPanels(panel.pending);
72
+ }
73
+ function render(status, requests, tasks) {
74
+ const rows = events.slice(-200).reverse().map(eventMarkup).join('') || '<p class="muted empty-activity">No observed activity yet.</p>';
75
+ q('#content').innerHTML = `<h1>${esc(selected)}</h1><div class="status" id="status-line"></div><div id="attention-area"></div><section class="card work-card" id="work-panel">${workMarkup(tasks)}</section><div class="grid"><div class="card activity-card"><h3>Observed activity</h3><div class="activity-feed" aria-label="Observed migration activity">${rows}</div></div><div><div id="current-state-card"></div><div id="requests-card"></div></div></div>`;
76
+ renderDurablePanels(status, requests);
77
+ }
78
+ async function refreshTasks() { if (!selected) return null; const tasks = await api(`/api/tasks?project=${encodeURIComponent(selected)}`); renderWork(tasks); return tasks; }
79
+ async function refresh() { if (!selected) return null; const [status, requests, tasks] = await Promise.all([api(`/api/status?project=${encodeURIComponent(selected)}`), api(`/api/requests?project=${encodeURIComponent(selected)}`), api(`/api/tasks?project=${encodeURIComponent(selected)}`)]); render(status, requests, tasks); return { status, requests, tasks }; }
80
+ let durableRefreshTimer;
81
+ function scheduleDurableRefresh() { if (durableRefreshTimer || !selected) return; durableRefreshTimer = setTimeout(async () => { durableRefreshTimer = null; try { const [status, requests, tasks] = await Promise.all([api(`/api/status?project=${encodeURIComponent(selected)}`), api(`/api/requests?project=${encodeURIComponent(selected)}`), api(`/api/tasks?project=${encodeURIComponent(selected)}`)]); renderDurablePanels(status, requests); renderWork(tasks); projects().catch(() => {}); } catch {} }, 100); }
82
+ function connect() { stream?.close(); if (!selected) return; stream = new EventSource(`/api/events?project=${encodeURIComponent(selected)}&token=${encodeURIComponent(token)}`); stream.onopen = () => { q('#connection').textContent = 'Live'; scheduleDurableRefresh(); }; stream.onerror = () => q('#connection').textContent = 'Reconnecting…'; stream.addEventListener('migration', (message) => { const event = JSON.parse(message.data); if (events.some((x) => x.eventId && x.eventId === event.eventId)) return; events.push(event); appendActivity(event); scheduleDurableRefresh(); }); }
83
+ async function openProject(project, { updateUrl = true } = {}) { if (updateUrl) updateRoute({ project, request: null, artifact: null, cursor: null }); selected = project; events = []; await projects(); const state = await refresh(); connect(); return state; }
84
+ function cancelRun() { const d = modal(`<form class="dialog-body" id="cancel-form"><h1>Stop migration?</h1><p>This asks the supervisor to stop gracefully. Recovery artifacts are preserved, and you can resume later.</p><label>Reason<input id="cancel-reason" value="canceled by operator"></label><p class="error" id="cancel-error"></p><div class="footer"><button type="button" data-close>Keep running</button><button class="danger" type="submit">Stop migration</button></div></form>`); q('#cancel-form').onsubmit = async (event) => { event.preventDefault(); try { await api('/api/cancel', { method:'POST', body:JSON.stringify({ project:selected, reason:q('#cancel-reason').value }) }); d.close(); await refresh(); } catch (e) { q('#cancel-error').textContent = e.message; } }; }
85
+ function modal(html, { onClose = null } = {}) { const d = q('#dialog'); d.innerHTML = html; if (!d.open) d.showModal(); d.querySelector('[data-close]')?.addEventListener('click', () => d.close()); d.onclose = onClose; return d; }
86
+ async function showArtifact(item, cursor = 0, opener = null, { updateUrl = true } = {}) { const d = q('#file-dialog'); if (opener) d.returnFocus = opener; if (updateUrl) updateRoute({ artifact: item, cursor: String(cursor) }); try { const file = await api(`/api/show?project=${encodeURIComponent(selected)}&item=${encodeURIComponent(item)}&cursor=${cursor}`); const language = fileLanguage(file); const parsed = structuredArtifact(file); const content = parsed === null ? codeMarkup(file.content, language) : jsonMarkup(parsed); d.innerHTML = `<div class="dialog-body"><h1>${esc(file.path)}</h1><p class="muted">${esc(file.mediaType)} · showing ${file.emittedBytes} of ${file.totalBytes} bytes</p><pre class="file-preview language-${language}${parsed === null ? '' : ' structured-json'}" aria-label="${esc(file.path)} preview">${content}</pre><div class="footer">${file.nextCursor !== null ? '<button id="more">Show more</button>' : '<span></span>'}<button data-close>Close</button></div></div>`; if (!d.open) d.showModal(); d.querySelector('[data-close]').onclick = () => d.close(); d.onclose = () => { updateRoute({ artifact: null, cursor: null }); d.returnFocus?.focus(); d.returnFocus = null; }; if (file.nextCursor !== null) d.querySelector('#more').onclick = () => showArtifact(item, file.nextCursor); } catch (e) { alert(e.message); } }
87
+ async function loadWixAccount() {
88
+ const result = q('#wix-account-result'); const acknowledgement = q('#ack');
89
+ if (!result) return;
90
+ result.textContent = 'Checking the local Wix CLI account…';
91
+ try {
92
+ const account = await api('/api/account');
93
+ if (account.authState === 'authenticated' && account.identity) {
94
+ result.innerHTML = `<strong>Authenticated Wix CLI identity</strong><code>${esc(account.identity)}</code><span class="muted">Reported directly by <code>wix whoami</code>. Confirm that this account is authorized before continuing.</span>`;
95
+ acknowledgement?.removeAttribute('disabled');
96
+ } else result.innerHTML = `<strong>Wix CLI identity could not be confirmed</strong><span class="error">${esc(account.reason || 'Run wix login, then refresh this check.')}</span>`;
97
+ } catch (error) { result.innerHTML = `<strong>Wix CLI identity could not be confirmed</strong><span class="error">${esc(error.message)}</span>`; }
98
+ }
99
+ async function requestView(row, { updateUrl = true } = {}) {
100
+ const request = await api(`/api/show?project=${encodeURIComponent(selected)}&item=${encodeURIComponent(row.requestId)}`);
101
+ if (updateUrl) updateRoute({ project: selected, request: request.requestId, artifact: null, cursor: null });
102
+ const artifacts = request.artifactRefs.map((a) => `<div class="artifact"><span><strong>${esc(a.path)}</strong><br><span class="muted">${esc(a.mediaType)}</span></span><button data-artifact="${esc(a.path)}">Open</button></div>`).join('');
103
+ const operatorInstructions = request.operatorInstructions ? `<section class="operator-instructions"><p><strong>Open Terminal and run this:</strong></p><pre class="file-preview" aria-label="Terminal command">${esc(request.operatorInstructions.command)}</pre><button type="button" id="copy-terminal-command">Copy command</button><p class="muted">${esc(request.operatorInstructions.confirmation)}</p></section>` : '';
104
+ const destinationAccountCheck = request.kind === 'manual_action' && request.stage === 'destination'; let response = '';
105
+ if (request.response.mode === 'choice') response = `<fieldset><legend>Your decision</legend>${request.choices.map((c) => `<label class="choice"><input required type="radio" name="answer" value="${esc(c.id)}">${esc(c.label)}${c.description ? `<small>${esc(c.description)}</small>`:''}</label>`).join('')}</fieldset><label>Review note <span class="muted">(optional)</span><textarea id="answer-note" maxlength="10000" placeholder="Add context for this decision"></textarea></label>`;
106
+ else if (request.response.mode === 'text') response = '<label>Response<textarea id="answer" maxlength="10000" required></textarea></label>';
107
+ else response = destinationAccountCheck ? '<label>Confirmation<textarea id="ack-note" maxlength="10000" required placeholder="I confirm the CLI identity is authorized to create this destination."></textarea></label><p class="muted">Your confirmation will be recorded with the required acknowledgement.</p>' : '<label class="choice"><input type="checkbox" id="ack" required>I completed the required manual step.</label>';
108
+ const accountCheck = destinationAccountCheck ? '<section class="account-check" aria-live="polite"><div><p class="account-heading">Current Wix CLI account</p><div id="wix-account-result">Checking the local Wix CLI account…</div></div><button type="button" id="refresh-wix-account">Refresh</button></section>' : '';
109
+ const d = modal(`<form class="dialog-body" id="answer-form"><div class="pill">${esc(request.kind)}</div><h1>${esc(request.title)}</h1><p>${esc(request.prompt)}</p>${operatorInstructions}${accountCheck}${artifacts}${response}<p class="error" id="form-error"></p><div class="footer"><button type="button" data-close>Cancel</button><span><button type="submit" name="mode" value="save">Save answer only</button> <button class="primary" type="submit" name="mode" value="continue">Submit and resume</button></span></div></form>`, { onClose: () => updateRoute({ request: null, artifact: null, cursor: null }) });
110
+ d.querySelectorAll('[data-artifact]').forEach((b) => b.onclick = (event) => showArtifact(b.dataset.artifact, 0, event.currentTarget));
111
+ d.querySelector('#copy-terminal-command')?.addEventListener('click', async () => { try { await navigator.clipboard.writeText(request.operatorInstructions.command); d.querySelector('#copy-terminal-command').textContent = 'Copied'; } catch { d.querySelector('#copy-terminal-command').textContent = 'Copy unavailable'; } });
112
+ if (destinationAccountCheck) { q('#refresh-wix-account').onclick = loadWixAccount; loadWixAccount(); }
113
+ q('#answer-form').onsubmit = async (event) => { event.preventDefault(); const submit = event.submitter.value; const payload = { project:selected, requestId:request.requestId, continue:submit === 'continue' }; if (request.response.mode === 'choice') { payload.choice = new FormData(event.currentTarget).get('answer'); const note = q('#answer-note').value.trim(); if (note) payload.note = note; } else if (request.response.mode === 'text') payload.text = q('#answer').value; else if (destinationAccountCheck) { payload.acknowledged = true; payload.note = q('#ack-note').value.trim(); } else payload.acknowledged = q('#ack').checked; try { await api('/api/answer', { method:'POST', body:JSON.stringify(payload) }); d.close(); await refresh(); } catch (e) { q('#form-error').textContent = e.message; } };
114
+ }
115
+ function start(resume = false) { if (resume) return api('/api/run', {method:'POST',body:JSON.stringify({project:selected,resume:true})}).then(refresh).catch((e)=>alert(e.message)); const d = modal(`<form class="dialog-body" id="new-form"><h1>New migration</h1><div class="form-grid"><label>Project name<input name="project" required pattern="[A-Za-z0-9][A-Za-z0-9_-]{0,99}"></label><label>Source URL<input name="sourceUrl" type="url"></label><label>Source mode<select name="sourceMode"><option value="public_content">Public content</option><option value="authenticated_api">Authenticated API</option><option value="private_data">Private data</option><option value="files_only">Files only</option></select></label><label>Delivery mode<select name="deliveryMode"><option value="management">Management</option><option value="website">Website</option><option value="management_and_website">Management + website</option></select></label><label>Destination<input name="destination" placeholder="new or existing:site-id" value="new"></label><label>Agent<select name="agent"><option value="auto">Automatic</option><option value="codex">Codex</option><option value="claude">Claude</option></select></label><label>Import mode<select name="managementImportMode"><option value="standard">Standard</option><option value="quick">Quick</option></select></label></div><label>Files (optional)<input id="files" type="file" multiple></label><p class="error" id="new-error"></p><div class="footer"><button type="button" data-close>Cancel</button><button class="primary">Check and start migration</button></div></form>`); q('#new-form').onsubmit = async (e) => { e.preventDefault(); const data = Object.fromEntries(new FormData(e.currentTarget)); try { const doctor = await api(`/api/doctor?agent=${encodeURIComponent(data.agent)}`); if (!doctor.adapters.some((adapter) => adapter.ok)) throw new Error('No selected agent is ready. Complete the local authentication/prerequisite shown by replatform doctor, then retry.'); const files=[]; for (const file of q('#files').files) { const base64 = await new Promise((resolve,reject)=>{const r=new FileReader();r.onload=()=>resolve(String(r.result).split(',')[1]);r.onerror=reject;r.readAsDataURL(file);}); const result=await api('/api/upload',{method:'POST',body:JSON.stringify({project:data.project,name:file.name,contentBase64:base64})});files.push(result.name); } await api('/api/run',{method:'POST',body:JSON.stringify({project:data.project,options:{...data,files}})}); d.close(); await openProject(data.project); } catch (err) { q('#new-error').textContent=err.message; } }; }
116
+ async function restoreRoute() { const route = routeState(); if (!route.project) return; const state = await openProject(route.project, { updateUrl: false }); if (!route.request) return; const row = state?.requests.find((item) => item.requestId === route.request && item.status === 'pending'); if (!row) { updateRoute({ request: null, artifact: null, cursor: null }); return; } await requestView(row, { updateUrl: false }); if (route.artifact) await showArtifact(route.artifact, Number(route.cursor) || 0, null, { updateUrl: false }); }
117
+ q('#new-project').onclick = () => start(false); projects().then(restoreRoute).catch((error) => { q('#content').textContent = error.message; });
@@ -0,0 +1,4 @@
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>RePlatform console</title><link rel="stylesheet" href="/app.css"><link rel="stylesheet" href="/json.css"><link rel="stylesheet" href="/account.css"></head>
3
+ <body><header><a href="/" class="brand">RePlatform <span>Migration console</span></a><div id="connection">Choose a migration</div></header>
4
+ <main><aside><button id="new-project">New migration</button><h2>Migrations</h2><div id="projects" aria-live="polite"></div></aside><section id="content" aria-live="polite"><div class="empty"><h1>Choose a migration</h1><p>Open an existing project or start a new migration.</p></div></section></main><dialog id="dialog"></dialog><dialog id="file-dialog"></dialog><script src="/app.js"></script></body></html>
@@ -0,0 +1,11 @@
1
+ .structured-json { color: #263947; }
2
+ .structured-json .json-key { color: #175f9f; }
3
+ .structured-json .json-string { color: #8b3d20; }
4
+ .structured-json .json-number { color: #7650a8; }
5
+ .structured-json .json-literal { color: #267052; font-weight: 650; }
6
+ .file-preview .syntax-comment { color: #647487; font-style: italic; }
7
+ .file-preview .syntax-keyword { color: #7650a8; font-weight: 650; }
8
+ .file-preview .syntax-tag { color: #175f9f; font-weight: 650; }
9
+ .file-preview .syntax-heading { color: #175f9f; font-weight: 700; }
10
+ .file-preview .syntax-code { color: #8b3d20; }
11
+ .file-preview .syntax-selector { color: #175f9f; font-weight: 650; }
@@ -0,0 +1,71 @@
1
+ 'use strict';
2
+
3
+ const { spawn, spawnSync } = require('node:child_process');
4
+
5
+ const ADAPTERS = {
6
+ codex: {
7
+ executable: 'codex',
8
+ args(prompt) { return ['exec', '--json', prompt]; },
9
+ },
10
+ claude: {
11
+ executable: 'claude',
12
+ args(prompt) { return ['-p', '--output-format', 'stream-json', '--verbose', prompt]; },
13
+ },
14
+ };
15
+
16
+ function probe(id, { executablePath } = {}) {
17
+ const adapter = ADAPTERS[id];
18
+ if (!adapter) return { ok: false, id, reason: 'unknown_adapter' };
19
+ const executable = executablePath || adapter.executable;
20
+ const result = spawnSync(executable, ['--version'], { encoding: 'utf8', timeout: 5000 });
21
+ if (result.error) return { ok: false, id, executable, reason: result.error.code === 'ENOENT' ? 'not_installed' : 'probe_failed' };
22
+ if (result.status !== 0) return { ok: false, id, executable, reason: 'version_failed' };
23
+ return { ok: true, id, executable, version: `${result.stdout || result.stderr}`.trim(), capabilities: ['headless', 'events', 'session', 'cwd', 'cancel'] };
24
+ }
25
+
26
+ function chooseAdapter(id = 'auto', options = {}) {
27
+ const ids = id === 'auto' ? ['codex', 'claude'] : [id];
28
+ const probes = ids.map((candidate) => probe(candidate, { executablePath: options.agentPath }));
29
+ const selected = probes.find((result) => result.ok);
30
+ return selected ? { ...selected, probes } : { ok: false, reason: id === 'auto' ? 'no_compatible_agent' : 'agent_unavailable', probes };
31
+ }
32
+
33
+ function launch(id, { cwd, prompt, executablePath, onEvent, onWorker }) {
34
+ const adapter = ADAPTERS[id];
35
+ if (!adapter) throw new Error(`unknown adapter: ${id}`);
36
+ const child = spawn(executablePath || adapter.executable, adapter.args(prompt), {
37
+ cwd,
38
+ stdio: ['ignore', 'pipe', 'pipe'],
39
+ detached: process.platform !== 'win32',
40
+ });
41
+ let buffered = '';
42
+ child.stdout.on('data', (chunk) => {
43
+ buffered += chunk;
44
+ let newline;
45
+ while ((newline = buffered.indexOf('\n')) >= 0) {
46
+ const line = buffered.slice(0, newline);
47
+ buffered = buffered.slice(newline + 1);
48
+ if (!line.trim()) continue;
49
+ let raw;
50
+ try { raw = JSON.parse(line); } catch { raw = { text: line }; }
51
+ onEvent?.({ type: 'vendor_event', raw });
52
+ // Worker reporting is an explicit adapter capability. Do not infer workers from a
53
+ // vendor event unless a future adapter supplies this parser and its own schema.
54
+ if (typeof adapter.workerReport === 'function') {
55
+ const worker = adapter.workerReport(raw);
56
+ if (worker) onWorker?.(worker);
57
+ }
58
+ }
59
+ });
60
+ child.stderr.on('data', (chunk) => onEvent?.({ type: 'vendor_stderr', message: String(chunk).trim() }));
61
+ return child;
62
+ }
63
+
64
+ function requestCancel(child) {
65
+ if (!child || child.exitCode !== null) return false;
66
+ if (process.platform !== 'win32' && child.pid) process.kill(-child.pid, 'SIGTERM');
67
+ else child.kill('SIGTERM');
68
+ return true;
69
+ }
70
+
71
+ module.exports = { ADAPTERS, probe, chooseAdapter, launch, requestCancel };
@@ -0,0 +1,75 @@
1
+ 'use strict';
2
+
3
+ // A capability is enabled by payload and read-back evidence for this exact page family.
4
+ // Served support is a separate post-frontend result, never inferred from a successful write.
5
+ function validateCapability(row) {
6
+ if (!row || typeof row !== 'object' || !row.family || !row.frontendType) throw new Error('route capability needs family and frontendType');
7
+ if (row.supported) {
8
+ for (const key of ['key', 'pageIdentifier', 'pageIdentifierType', 'variable', 'readMethod', 'writeMethod', 'evidence']) {
9
+ if (typeof row[key] !== 'string' || !row[key]) throw new Error(`supported route capability ${row.family} missing ${key}`);
10
+ }
11
+ if (!['tpaPageId', 'pageId'].includes(row.pageIdentifierType)) throw new Error('unsupported pageIdentifierType');
12
+ if (!row.request || row.request.urlMapping?.pageIdentifier !== row.pageIdentifier || row.request.urlMapping?.pageIdentifierType !== row.pageIdentifierType || !row.readBackFixture || row.readBackFixture.pageIdentifier !== row.pageIdentifier || row.readBackFixture.mapping !== row.request.urlMapping.mapping) {
13
+ throw new Error(`supported route capability ${row.family} needs matching request and read-back fixture`);
14
+ }
15
+ }
16
+ return row;
17
+ }
18
+
19
+ function inspectRoute(source, capability, existing) {
20
+ validateCapability(capability);
21
+ if (!source || source.family !== capability.family || !source.pattern) throw new Error('route source needs matching family and pattern');
22
+ if (!capability.supported) return { ...source, status: 'unverified', reason: capability.reason || 'missing-adapter-evidence' };
23
+ if (!source.pattern.includes(`{{${capability.variable}}}`) || /[?#]/.test(source.pattern)) {
24
+ return { ...source, status: 'unverified', reason: 'unsupported-source-pattern' };
25
+ }
26
+ if (existing && existing.owner && existing.owner !== capability.key) {
27
+ return { ...source, status: 'conflict', reason: 'occupied-address', existing };
28
+ }
29
+ if (existing && existing.mapping === source.pattern && existing.pageIdentifier === capability.pageIdentifier) {
30
+ return { ...source, status: 'reused', readBack: existing, served: false };
31
+ }
32
+ if (existing && existing.mapping && existing.mapping !== source.pattern) {
33
+ return { ...source, status: 'conflict', reason: 'different-existing-mapping', existing };
34
+ }
35
+ return { ...source, status: 'write-required', existing: existing || null, served: false };
36
+ }
37
+
38
+ async function configureRoute(plan, capability, transport) {
39
+ if (plan.status !== 'write-required') return plan;
40
+ validateCapability(capability);
41
+ if (!capability.supported) throw new Error('unsupported capability cannot write');
42
+ if (!transport || typeof transport.write !== 'function' || typeof transport.read !== 'function') throw new Error('route transport needs write and read');
43
+ const payload = {
44
+ key: capability.key,
45
+ urlMapping: {
46
+ key: capability.key,
47
+ pageIdentifier: capability.pageIdentifier,
48
+ pageIdentifierType: capability.pageIdentifierType,
49
+ mapping: plan.pattern,
50
+ },
51
+ };
52
+ await transport.write(payload, capability, { mode: plan.existing ? 'update' : 'create' });
53
+ const readBack = await transport.read(capability.key, capability);
54
+ if (!readBack || readBack.mapping !== plan.pattern || readBack.pageIdentifier !== capability.pageIdentifier) {
55
+ return { ...plan, status: 'readback-failed', payload, readBack: readBack || null, served: false };
56
+ }
57
+ return { ...plan, status: 'configured', payload, readBack, served: false };
58
+ }
59
+
60
+ function expectedPath(pattern, slug) {
61
+ if (!pattern || typeof slug !== 'string' || !slug || !pattern.includes('{{slug}}')) throw new Error('read-back pattern and slug required');
62
+ const path = `/${pattern.replace(/^\/+/, '').replace('{{slug}}', encodeURIComponent(slug))}`;
63
+ if (path.includes('{{')) throw new Error('unresolved route variable');
64
+ return path;
65
+ }
66
+
67
+ function verifyServedRoute(result, check) {
68
+ if (!['configured', 'reused'].includes(result.status)) return result;
69
+ if (!check || !check.deploymentId || !check.targetRecordId || !check.path || !check.identityMatched || !check.generatedUrlMatched) {
70
+ return { ...result, served: false, servedReason: check && check.reason || 'route-identity-unverified' };
71
+ }
72
+ return { ...result, served: true, servedEvidence: check };
73
+ }
74
+
75
+ module.exports = { validateCapability, inspectRoute, configureRoute, expectedPath, verifyServedRoute };
@@ -74,10 +74,20 @@ function createFreshnessMetadata({
74
74
  createdAt = new Date().toISOString(),
75
75
  } = {}) {
76
76
  if (!projectDir) throw new Error('projectDir is required');
77
+ const additional = {};
78
+ const schemaFile = path.join(projectDir, 'source-schema.json');
79
+ const schema = fs.existsSync(schemaFile) ? JSON.parse(fs.readFileSync(schemaFile, 'utf8')) : {};
80
+ const entities = Array.isArray(schema.entities) ? schema.entities : Object.values(schema.entities || {});
81
+ if (entities.some((entity) => entity.sourceMeta?.extractionPlan)) {
82
+ const { planFreshnessReferences } = require('../resources/rp-source-wordpress/lib/plugin-entity-read-plan.js');
83
+ for (const reference of planFreshnessReferences({ projectDir, entities })) additional[`pluginInput:${reference.path}`] = { path: reference.path, sha256: hashArtifact(projectDir, reference.path) };
84
+ for (const input of ['src/extract', 'src/lib', 'src/project', 'src/import/plugin-handoff.js']) additional[`pluginCode:${input}`] = { path: input, sha256: hashArtifact(projectDir, input) };
85
+ }
77
86
  return {
78
87
  schemaVersion: SCHEMA_VERSION,
79
88
  createdAt,
80
89
  artifacts: {
90
+ ...additional,
81
91
  sourceSchema: {
82
92
  path: artifactPaths.sourceSchema || DEFAULT_ARTIFACTS.sourceSchema,
83
93
  sha256: hashArtifact(projectDir, artifactPaths.sourceSchema || DEFAULT_ARTIFACTS.sourceSchema),
@@ -111,7 +121,7 @@ function compareFreshnessMetadata(current, recorded) {
111
121
  if (recorded.schemaVersion !== SCHEMA_VERSION) {
112
122
  changes.push({ field: 'schemaVersion', expected: SCHEMA_VERSION, actual: recorded.schemaVersion });
113
123
  }
114
- for (const name of Object.keys(current.artifacts || {})) {
124
+ for (const name of new Set([...Object.keys(current.artifacts || {}), ...Object.keys(recorded.artifacts || {})])) {
115
125
  const currentEntry = current.artifacts[name] || {};
116
126
  const recordedEntry = (recorded.artifacts && recorded.artifacts[name]) || {};
117
127
  if (currentEntry.sha256 !== recordedEntry.sha256) {