@wix/agent-skills 1.33.0 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (635) hide show
  1. package/README.md +23 -0
  2. package/package.json +2 -2
  3. package/skills/wix-app/references/DASHBOARD_PAGE.md +1 -1
  4. package/skills/wix-export/SKILL.md +83 -0
  5. package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
  6. package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
  7. package/skills/wix-harmony-editor/SKILL.md +317 -0
  8. package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
  9. package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
  10. package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
  11. package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
  12. package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
  13. package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
  14. package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
  15. package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
  16. package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
  17. package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
  18. package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
  19. package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
  20. package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
  21. package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
  22. package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
  23. package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
  24. package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
  25. package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
  26. package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
  27. package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
  28. package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
  29. package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
  30. package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
  31. package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
  32. package/skills/wix-headless/SKILL.md +7 -2
  33. package/skills/wix-headless/references/CAPABILITIES.md +6 -1
  34. package/skills/wix-headless/references/DISCOVERY.md +2 -1
  35. package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
  36. package/skills/wix-headless/references/SEED.md +3 -2
  37. package/skills/wix-headless/references/SETUP.md +1 -0
  38. package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
  39. package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
  40. package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
  41. package/skills/wix-headless/references/managed/CREATE.md +1 -1
  42. package/skills/wix-headless-kit/SKILL.md +110 -21
  43. package/skills/wix-headless-kit/guides/api-run.md +15 -13
  44. package/skills/wix-headless-kit/guides/existing-site.md +31 -0
  45. package/skills/wix-headless-kit/guides/migration.md +49 -17
  46. package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
  47. package/skills/wix-headless-kit/install/context.mjs +61 -6
  48. package/skills/wix-headless-kit/install/pins.json +1 -1
  49. package/skills/wix-headless-kit/install/setup.mjs +107 -12
  50. package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
  51. package/skills/wix-headless-replatform/SKILL.md +116 -0
  52. package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
  53. package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
  54. package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
  55. package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
  56. package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
  57. package/skills/wix-headless-replatform/references/output-contract.md +93 -0
  58. package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
  59. package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
  60. package/skills/wix-headless-replatform/references/safety.md +19 -0
  61. package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
  62. package/skills/wix-headless-replatform/references/workflow.md +157 -0
  63. package/skills/wix-headless-replatform/registry/README.md +20 -0
  64. package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
  65. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
  66. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
  67. package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
  68. package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
  69. package/skills/wix-headless-replatform/registry/registry.json +36 -0
  70. package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
  71. package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
  72. package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
  73. package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
  74. package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
  75. package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
  76. package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
  77. package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
  78. package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
  79. package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
  80. package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
  81. package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
  82. package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
  83. package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
  84. package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
  85. package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
  86. package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
  87. package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
  88. package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
  89. package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
  90. package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
  91. package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
  92. package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
  93. package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
  94. package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
  95. package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
  96. package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
  97. package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
  98. package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
  99. package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
  100. package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
  101. package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
  102. package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
  103. package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
  104. package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
  105. package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
  106. package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
  107. package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
  108. package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
  109. package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
  110. package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
  111. package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
  112. package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
  113. package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
  114. package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
  115. package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
  116. package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
  117. package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
  118. package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
  119. package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
  120. package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
  121. package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
  122. package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
  123. package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
  124. package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
  125. package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
  126. package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
  127. package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
  128. package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
  129. package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
  130. package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
  131. package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
  132. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
  133. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
  134. package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
  135. package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
  136. package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
  137. package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
  138. package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
  139. package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
  140. package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
  141. package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
  142. package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
  143. package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
  144. package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
  145. package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
  146. package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
  147. package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
  148. package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
  149. package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
  150. package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
  151. package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
  152. package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
  153. package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
  154. package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
  155. package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
  156. package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
  157. package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
  158. package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
  159. package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
  160. package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
  161. package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
  162. package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
  163. package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
  164. package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
  165. package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
  166. package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
  167. package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
  168. package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
  169. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
  170. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
  171. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
  172. package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
  173. package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
  174. package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
  175. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
  176. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
  177. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
  178. package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
  179. package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
  180. package/skills/wix-import/SKILL.md +90 -0
  181. package/skills/wix-manage/SKILL.md +38 -10
  182. package/skills/wix-manage/references/automations/actions.md +11 -11
  183. package/skills/wix-manage/references/automations/activation-status.md +6 -9
  184. package/skills/wix-manage/references/automations/api-catalog.md +48 -32
  185. package/skills/wix-manage/references/automations/automation-model.md +97 -22
  186. package/skills/wix-manage/references/automations/bracket-expressions.md +7 -7
  187. package/skills/wix-manage/references/automations/build-and-manage-automations.md +140 -309
  188. package/skills/wix-manage/references/automations/conditions.md +187 -0
  189. package/skills/wix-manage/references/automations/schemas-and-scheduling.md +191 -0
  190. package/skills/wix-manage/references/automations/special-actions.md +210 -0
  191. package/skills/wix-manage/references/automations/triggers.md +47 -10
  192. package/skills/wix-manage/references/automations/validation-and-verification.md +320 -0
  193. package/skills/wix-manage/references/custom-apps/use-app-tools.md +124 -0
  194. package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
  195. package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
  196. package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
  197. package/skills/wix-manage/references/events/create-wix-event.md +136 -73
  198. package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
  199. package/skills/wix-manage/references/events/manage-event-guests.md +366 -0
  200. package/skills/wix-manage/references/events/manage-event-tickets.md +293 -0
  201. package/skills/wix-manage/references/events/manage-wix-events.md +313 -55
  202. package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
  203. package/skills/wix-manage/references/sites/upload-static-site.md +127 -8
  204. package/skills/wix-manage/references/stores/update-product-with-options.md +58 -2
  205. package/skills/wix-replatform/.publish-manifest.json +5 -5
  206. package/skills/wix-replatform/CLI.md +162 -0
  207. package/skills/wix-replatform/README.md +52 -0
  208. package/skills/wix-replatform/SKILL.md +229 -684
  209. package/skills/wix-replatform/console/account.css +1 -0
  210. package/skills/wix-replatform/console/app.css +1 -0
  211. package/skills/wix-replatform/console/app.js +117 -0
  212. package/skills/wix-replatform/console/index.html +4 -0
  213. package/skills/wix-replatform/console/json.css +11 -0
  214. package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
  215. package/skills/wix-replatform/lib/app-page-routing.js +75 -0
  216. package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
  217. package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
  218. package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
  219. package/skills/wix-replatform/lib/completion-report.js +1393 -13
  220. package/skills/wix-replatform/lib/config-env.js +85 -11
  221. package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
  222. package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
  223. package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
  224. package/skills/wix-replatform/lib/destination-choice.js +163 -0
  225. package/skills/wix-replatform/lib/destination-handoff.js +62 -0
  226. package/skills/wix-replatform/lib/destination-http.js +81 -0
  227. package/skills/wix-replatform/lib/destination-route.js +98 -0
  228. package/skills/wix-replatform/lib/destination.js +919 -0
  229. package/skills/wix-replatform/lib/discovered-census.js +231 -0
  230. package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
  231. package/skills/wix-replatform/lib/document-url-guard.js +203 -0
  232. package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
  233. package/skills/wix-replatform/lib/entity-verification.js +18 -0
  234. package/skills/wix-replatform/lib/execution-capability.js +120 -0
  235. package/skills/wix-replatform/lib/execution-log.js +170 -0
  236. package/skills/wix-replatform/lib/execution-manifest.js +20 -2
  237. package/skills/wix-replatform/lib/execution-state.js +22 -0
  238. package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
  239. package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
  240. package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
  241. package/skills/wix-replatform/lib/import-recovery.js +800 -6
  242. package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
  243. package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
  244. package/skills/wix-replatform/lib/link-audit.js +173 -0
  245. package/skills/wix-replatform/lib/link-census.js +194 -0
  246. package/skills/wix-replatform/lib/link-plan.js +148 -0
  247. package/skills/wix-replatform/lib/link-verification.js +274 -0
  248. package/skills/wix-replatform/lib/link-write-journal.js +42 -0
  249. package/skills/wix-replatform/lib/local-state.js +869 -30
  250. package/skills/wix-replatform/lib/member-completion.js +658 -0
  251. package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
  252. package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
  253. package/skills/wix-replatform/lib/migration-completion.js +311 -0
  254. package/skills/wix-replatform/lib/operator-identity.js +47 -0
  255. package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
  256. package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
  257. package/skills/wix-replatform/lib/orchestration-router.js +608 -32
  258. package/skills/wix-replatform/lib/orchestration-state.js +188 -12
  259. package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
  260. package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
  261. package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
  262. package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
  263. package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
  264. package/skills/wix-replatform/lib/progress-log.js +19 -3
  265. package/skills/wix-replatform/lib/read-back-approval.js +184 -0
  266. package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
  267. package/skills/wix-replatform/lib/read-back-contract.js +243 -0
  268. package/skills/wix-replatform/lib/read-back-extract.js +118 -0
  269. package/skills/wix-replatform/lib/read-back-gate.js +734 -0
  270. package/skills/wix-replatform/lib/read-back-reads.js +94 -0
  271. package/skills/wix-replatform/lib/read-back-state.js +107 -0
  272. package/skills/wix-replatform/lib/read-back-summary.js +81 -0
  273. package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
  274. package/skills/wix-replatform/lib/run-controller.js +401 -0
  275. package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
  276. package/skills/wix-replatform/lib/setup-verification.js +148 -0
  277. package/skills/wix-replatform/lib/source-access.js +231 -0
  278. package/skills/wix-replatform/lib/source-coverage.js +1130 -0
  279. package/skills/wix-replatform/lib/source-secrets.js +277 -0
  280. package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
  281. package/skills/wix-replatform/lib/task-state.js +110 -0
  282. package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
  283. package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
  284. package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
  285. package/skills/wix-replatform/lib/url-verification.js +315 -0
  286. package/skills/wix-replatform/lib/user-action-effects.js +42 -0
  287. package/skills/wix-replatform/lib/user-actions.js +264 -0
  288. package/skills/wix-replatform/lib/website-handoff.js +1220 -0
  289. package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
  290. package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
  291. package/skills/wix-replatform/lib/write-verification-state.js +92 -0
  292. package/skills/wix-replatform/lib/write-verification.js +274 -0
  293. package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
  294. package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
  295. package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
  296. package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
  297. package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
  298. package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
  299. package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
  300. package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
  301. package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
  302. package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
  303. package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
  304. package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
  305. package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
  306. package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
  307. package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
  308. package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
  309. package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
  310. package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
  311. package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
  312. package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
  313. package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
  314. package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
  315. package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
  316. package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
  317. package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
  318. package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
  319. package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
  320. package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
  321. package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
  322. package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
  323. package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
  324. package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
  325. package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
  326. package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
  327. package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
  328. package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
  329. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
  330. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
  331. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
  332. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
  333. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
  334. package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
  335. package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
  336. package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
  337. package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
  338. package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
  339. package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
  340. package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
  341. package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
  342. package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
  343. package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
  344. package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
  345. package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
  346. package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
  347. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
  348. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
  349. package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
  350. package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
  351. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
  352. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
  353. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
  354. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
  355. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
  356. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
  357. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
  358. package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
  359. package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
  360. package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
  361. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
  362. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
  363. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
  364. package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
  365. package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
  366. package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
  367. package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
  368. package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
  369. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
  370. package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
  371. package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
  372. package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
  373. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
  374. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
  375. package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
  376. package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
  377. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
  378. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
  379. package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
  380. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
  381. package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
  382. package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
  383. package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
  384. package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
  385. package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
  386. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
  387. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
  388. package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
  389. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
  390. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
  391. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
  392. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
  393. package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
  394. package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
  395. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
  396. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
  397. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
  398. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
  399. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
  400. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
  401. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
  402. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
  403. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
  404. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
  405. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
  406. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
  407. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
  408. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
  409. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
  410. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
  411. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
  412. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
  413. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
  414. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
  415. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
  416. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
  417. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
  418. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
  419. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
  420. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
  421. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
  422. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
  423. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
  424. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
  425. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
  426. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
  427. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
  428. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
  429. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
  430. package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
  431. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
  432. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
  433. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
  434. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
  435. package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
  436. package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
  437. package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
  438. package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
  439. package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
  440. package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
  441. package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
  442. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
  443. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
  444. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
  445. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
  446. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
  447. package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
  448. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
  449. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
  450. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
  451. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
  452. package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
  453. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
  454. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
  455. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
  456. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
  457. package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
  458. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
  459. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
  460. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
  461. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
  462. package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
  463. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
  464. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
  465. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
  466. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
  467. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
  468. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
  469. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
  470. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
  471. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
  472. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
  473. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
  474. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
  475. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
  476. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
  477. package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
  478. package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
  479. package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
  480. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
  481. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
  482. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
  483. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
  484. package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
  485. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
  486. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
  487. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
  488. package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
  489. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
  490. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
  491. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
  492. package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
  493. package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
  494. package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
  495. package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
  496. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
  497. package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
  498. package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
  499. package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
  500. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
  501. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
  502. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
  503. package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
  504. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
  505. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
  506. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
  507. package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
  508. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
  509. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
  510. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
  511. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
  512. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
  513. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
  514. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
  515. package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
  516. package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
  517. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
  518. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
  519. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
  520. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
  521. package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
  522. package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
  523. package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
  524. package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
  525. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
  526. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
  527. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
  528. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
  529. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
  530. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
  531. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
  532. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
  533. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
  534. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
  535. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
  536. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
  537. package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
  538. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
  539. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
  540. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
  541. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
  542. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
  543. package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
  544. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
  545. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
  546. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
  547. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
  548. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
  549. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
  550. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
  551. package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
  552. package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
  553. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
  554. package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
  555. package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
  556. package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
  557. package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
  558. package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
  559. package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
  560. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
  561. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
  562. package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
  563. package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
  564. package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
  565. package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
  566. package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
  567. package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
  568. package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
  569. package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
  570. package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
  571. package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
  572. package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
  573. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
  574. package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
  575. package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
  576. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
  577. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
  578. package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
  579. package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
  580. package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
  581. package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
  582. package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
  583. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
  584. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
  585. package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
  586. package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
  587. package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
  588. package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
  589. package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
  590. package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
  591. package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
  592. package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
  593. package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
  594. package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
  595. package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
  596. package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
  597. package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
  598. package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
  599. package/skills/wix-replatform/scripts/discovered-census.js +26 -0
  600. package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
  601. package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
  602. package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
  603. package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
  604. package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
  605. package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
  606. package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
  607. package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
  608. package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
  609. package/skills/wix-replatform/scripts/migration-completion.js +76 -0
  610. package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
  611. package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
  612. package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
  613. package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
  614. package/skills/wix-replatform/scripts/replatform-console.js +146 -0
  615. package/skills/wix-replatform/scripts/replatform.js +436 -0
  616. package/skills/wix-replatform/scripts/source-secrets.js +77 -0
  617. package/skills/wix-replatform/scripts/url-redirects.js +286 -0
  618. package/skills/wix-replatform/scripts/user-action.js +58 -0
  619. package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
  620. package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
  621. package/skills/wix-replatform/scripts/wix-destination.js +143 -0
  622. package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
  623. package/skills/wix-vibe-headless/SKILL.md +7 -3
  624. package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
  625. package/skills/wix-vibe-headless/platforms/base44.md +1 -0
  626. package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
  627. package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
  628. package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
  629. package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
  630. package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
  631. package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
  632. package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
  633. package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
  634. package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +0 -208
  635. package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
@@ -0,0 +1,166 @@
1
+ 'use strict';
2
+
3
+ const { createHash } = require('node:crypto');
4
+ const { isDeepStrictEqual } = require('node:util');
5
+
6
+ function exactHosts(hosts) {
7
+ return new Set((hosts || []).map((host) => new URL(`https://${host}`).host.toLowerCase()));
8
+ }
9
+
10
+ function classifyNavigation(value, containingUrl, { sourceHosts = [], destinationHosts = [] } = {}) {
11
+ if (typeof value !== 'string' || !value) return { kind: 'invalid' };
12
+ if (/^(?:javascript|data|mailto|tel):/i.test(value)) return { kind: 'action', value };
13
+ let url;
14
+ try { url = new URL(value, containingUrl); } catch { return { kind: 'invalid', value }; }
15
+ if (!['http:', 'https:'].includes(url.protocol)) return { kind: 'external', value };
16
+ const hosts = exactHosts([...sourceHosts, ...destinationHosts]);
17
+ if (!hosts.has(url.host.toLowerCase())) return { kind: 'external', value };
18
+ const path = `${url.pathname}${url.search}${url.hash}`;
19
+ const stateful = /^\/(?:wp-admin|wp-login|account\/login|checkout\/order-pay)(?:\/|$)/i.test(url.pathname)
20
+ || [...url.searchParams.keys()].some((key) => /^(?:nonce|_wpnonce|token|auth|session|add-to-cart|remove_item|order-pay)$/i.test(key));
21
+ if (stateful) return { kind: 'stateful', original: value, path, host: url.host.toLowerCase() };
22
+ return { kind: 'internal', original: value, path, lookupPath: `${url.pathname}${url.search}`, host: url.host.toLowerCase(), fragmentOnly: value.startsWith('#') };
23
+ }
24
+
25
+ function occurrenceId({ sourceFile, sourceRecordId = '', field, location, original }) {
26
+ return createHash('sha256').update([sourceFile, sourceRecordId, field, location, original].join('\0')).digest('hex').slice(0, 24);
27
+ }
28
+
29
+ function verifiedDestination(row) {
30
+ if (!row || !row.targetRecordId || !row.path || !row.pageFamily || !row.deploymentId || !row.routeRevision || !row.checkedAt || row.identityMatched !== true || row.rendered !== true) {
31
+ throw new Error('verified destination requires target identity, served path and current deployment evidence');
32
+ }
33
+ if (!row.path.startsWith('/') || row.path.startsWith('//')) throw new Error('verified path must be root-relative');
34
+ return row;
35
+ }
36
+
37
+ function writerGuard(field, activeWriters, recordType) {
38
+ if (recordType === 'blog-post') return { ok: false, reason: 'blog-writer-integration-pending' };
39
+ if (!activeWriters || activeWriters.complete !== true || !Array.isArray(activeWriters.writers) || activeWriters.writers.some((row) => !row || !Array.isArray(row.fields))) {
40
+ return { ok: false, reason: 'unknown-writer-contract' };
41
+ }
42
+ const touching = activeWriters.writers.filter((row) => row.fields.includes(field));
43
+ if (touching.length !== 1 || touching[0].writer !== 'internal-link-reconciler' || touching[0].compatible !== true || touching[0].runsAfter !== 'post-frontend-verification') {
44
+ return { ok: false, reason: 'incompatible-writer-contract' };
45
+ }
46
+ return { ok: true };
47
+ }
48
+
49
+ // Mutation is per logical record. A guarded field may proceed while another field is held.
50
+ // The adapter owns native field serialization; this function never edits blog post fields.
51
+ async function reconcileRecord({ recordId, recordType, fields, destinations, activeWriters, destinationState, adapter, journal, intentKey = null, priorIntentKeys = [] }) {
52
+ if (!adapter || typeof adapter.patchField !== 'function' || !journal || !recordId) throw new Error('record, structured patch adapter and journal required');
53
+ if (destinationState !== 'migration-not-live') throw new Error('content writes require a confirmed non-live migration destination');
54
+ const blocked = [];
55
+ const eligible = [];
56
+ for (const field of fields) {
57
+ const guard = writerGuard(`${recordType}:${field.name}`, activeWriters, recordType);
58
+ if (!guard.ok) { blocked.push({ field: field.name, occurrenceIds: field.occurrenceIds, reason: guard.reason }); continue; }
59
+ const destination = field.patches ? null : destinations[field.destinationId];
60
+ if (field.patches) {
61
+ if (!field.patches.length || field.patches.some((patch) => {
62
+ try { verifiedDestination(destinations[patch.destinationId]); return false; } catch { return true; }
63
+ })) {
64
+ blocked.push({ field: field.name, occurrenceIds: field.occurrenceIds, reason: 'destination-unverified' }); continue;
65
+ }
66
+ eligible.push({ field, destination: null });
67
+ continue;
68
+ }
69
+ if (field.unresolvedNormalization === true) {
70
+ if (!destination || !destination.path || !destination.path.startsWith('/') || destination.path.startsWith('//')) {
71
+ blocked.push({ field: field.name, occurrenceIds: field.occurrenceIds, reason: 'unresolved-original-path-invalid' }); continue;
72
+ }
73
+ } else {
74
+ try { verifiedDestination(destination); } catch {
75
+ blocked.push({ field: field.name, occurrenceIds: field.occurrenceIds, reason: 'destination-unverified' }); continue;
76
+ }
77
+ }
78
+ eligible.push({ field, destination });
79
+ }
80
+ if (!eligible.length) return { recordId, blocked, written: [] };
81
+ const current = await adapter.read(recordId);
82
+ if (!current || !current.revision) throw new Error('content read needs revision');
83
+ if (intentKey && typeof journal.findCompleted === 'function') {
84
+ const completed = await journal.findCompleted(recordId, intentKey);
85
+ if (completed) {
86
+ if (!completed.changes.every((change) => isDeepStrictEqual(current.fields[change.name], change.after))) throw new Error('completed link repair conflicts with changed content');
87
+ return { recordId, blocked, written: completed.changes.map((change) => change.name), resumed: true, contentRevision: current.revision };
88
+ }
89
+ }
90
+ if (intentKey && typeof journal.findOpen === 'function') {
91
+ const open = await journal.findOpen(recordId, intentKey);
92
+ if (open) {
93
+ if (open.changes.every((change) => isDeepStrictEqual(current.fields[change.name], change.after))) {
94
+ await journal.complete(open);
95
+ return { recordId, blocked, written: open.changes.map((change) => change.name), resumed: true, contentRevision: current.revision };
96
+ }
97
+ if (current.revision !== open.baseRevision) throw new Error('uncertain write conflicts with changed content');
98
+ await adapter.write(recordId, Object.fromEntries(open.changes.map((change) => [change.name, change.after])), current.revision);
99
+ const readBack = await adapter.read(recordId);
100
+ if (!open.changes.every((change) => isDeepStrictEqual(readBack.fields[change.name], change.after))) throw new Error('content write read-back mismatch');
101
+ await journal.complete(open);
102
+ return { recordId, blocked, written: open.changes.map((change) => change.name), resumed: true, contentRevision: readBack.revision };
103
+ }
104
+ }
105
+ // A frontend redeploy invalidates served-link evidence, not a completed content write.
106
+ // Reuse the exact journaled after-image only when it still matches the current record.
107
+ if (typeof journal.findCompleted === 'function') {
108
+ for (const priorKey of priorIntentKeys) {
109
+ const completed = await journal.findCompleted(recordId, priorKey);
110
+ if (!completed || !eligible.every(({ field }) => completed.changes.some((change) =>
111
+ change.name === field.name && field.occurrenceIds.every((id) => change.occurrenceIds.includes(id)))) ||
112
+ !completed.changes.every((change) => isDeepStrictEqual(current.fields[change.name], change.after))) continue;
113
+ return { recordId, blocked, written: eligible.map(({ field }) => field.name), resumed: true, contentRevision: current.revision, priorIntentKey: priorKey };
114
+ }
115
+ }
116
+ for (const { field } of eligible) {
117
+ if (field.expectedRevision && field.expectedRevision !== current.revision) {
118
+ blocked.push({ field: field.name, occurrenceIds: field.occurrenceIds, reason: 'concurrent-edit' });
119
+ }
120
+ }
121
+ if (blocked.some((row) => row.reason === 'concurrent-edit')) return { recordId, blocked, written: [] };
122
+ const intended = eligible.map(({ field, destination }) => {
123
+ const baseValue = field.baseValue === undefined ? current.fields[field.name] : field.baseValue;
124
+ let patch;
125
+ if (field.patches) {
126
+ const ordered = [...field.patches].sort((a, b) => {
127
+ const offset = (row) => Number(/char:(\d+)/.exec(row.occurrence.location || '')?.[1] || 0);
128
+ return offset(b) - offset(a);
129
+ });
130
+ patch = { value: baseValue, preservedUnrelated: true, changedLocations: [] };
131
+ for (const row of ordered) {
132
+ const next = adapter.patchField(patch.value, row.occurrence, row.path);
133
+ if (!next || next.preservedUnrelated !== true || !next.changedLocations?.length) throw new Error(`field ${field.name} lacks a verified structured link patch`);
134
+ patch = { value: next.value, preservedUnrelated: true, changedLocations: [...patch.changedLocations, ...next.changedLocations] };
135
+ }
136
+ } else patch = adapter.patchField(baseValue, field, destination.path);
137
+ if (!patch || patch.preservedUnrelated !== true || !Array.isArray(patch.changedLocations) || !patch.changedLocations.length) {
138
+ throw new Error(`field ${field.name} lacks a verified structured link patch`);
139
+ }
140
+ return { name: field.name, before: baseValue, after: patch.value, occurrenceIds: field.occurrenceIds, changedLocations: patch.changedLocations };
141
+ });
142
+ const attempt = intentKey ? null : await journal.find(recordId, intended);
143
+ if (attempt && intended.every((change) => isDeepStrictEqual(current.fields[change.name], change.after))) {
144
+ await journal.complete(attempt);
145
+ return { recordId, blocked, written: intended.map((change) => change.name), resumed: true };
146
+ }
147
+ if (attempt && current.revision !== attempt.baseRevision) throw new Error('uncertain write conflicts with changed content');
148
+ const changes = [];
149
+ for (const { field, destination } of eligible) {
150
+ if (!isDeepStrictEqual(current.fields[field.name], field.baseValue === undefined ? current.fields[field.name] : field.baseValue)) {
151
+ blocked.push({ field: field.name, occurrenceIds: field.occurrenceIds, reason: 'concurrent-edit' });
152
+ } else {
153
+ const intendedChange = intended.find((row) => row.name === field.name);
154
+ if (!isDeepStrictEqual(current.fields[field.name], intendedChange.after)) changes.push(intendedChange);
155
+ }
156
+ }
157
+ if (!changes.length) return { recordId, blocked, written: [] };
158
+ const started = attempt || await journal.start(recordId, current.revision, changes, intentKey);
159
+ await adapter.write(recordId, Object.fromEntries(changes.map((change) => [change.name, change.after])), current.revision);
160
+ const readBack = await adapter.read(recordId);
161
+ if (!changes.every((change) => isDeepStrictEqual(readBack.fields[change.name], change.after))) throw new Error('content write read-back mismatch');
162
+ await journal.complete(started);
163
+ return { recordId, blocked, written: changes.map((change) => change.name), contentRevision: readBack.revision };
164
+ }
165
+
166
+ module.exports = { classifyNavigation, occurrenceId, verifiedDestination, writerGuard, reconcileRecord };
@@ -0,0 +1,173 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs/promises');
4
+ const path = require('node:path');
5
+
6
+ const RELATIVE_PATH = 'state/url-preservation/link-audit.json';
7
+ const UNRESOLVED_REASONS = new Set([
8
+ 'target-not-imported', 'source-broken', 'collision', 'ambiguous-target', 'unsupported-family',
9
+ ]);
10
+ const INTEGRATION_PROMPT = 'Resume internal-link writer integration for the listed audit records: establish exclusive ownership of each content field, keep source-origin URL rewriting limited to non-content configuration, and connect the dedicated blog-post link writer to verified destinations and a checkpointed post-frontend update, publish and read-back phase. Run the scoped compatibility and end-to-end checks, resume only compatible writers, and return the refreshed link audit, report and handoff. If a required writer or lifecycle is unavailable, keep the affected repairs pending and report the missing contract.';
11
+ const ROUTE_PROMPT = "Resume app page routing for the listed page families and original paths: inspect the destination's current route configuration, apply the supported source-matching configuration, record any unsupported family with its actual Wix destination and redirect requirement, and return the refreshed capability matrix, configuration read-back and report.";
12
+ const UNRESOLVED_PROMPT = 'Resume app routing and internal-link reconciliation for the listed audit occurrence IDs; obtain missing capture/adapter access, resolve intended targets, apply approved repairs, and return the refreshed link audit and report.';
13
+ const PENDING_PROMPT = 'Run the post-frontend routing and link verification step for this migration: confirm the frontend deployment origin and mount path, read back generated entity URLs, run the read-only calibration and budget estimate, and only within the approved budget check the per-family samples and verify and repair the stored destinations, and return the refreshed link audit and report.';
14
+ const UNAVAILABLE_PROMPT = 'Rerun internal-link verification for the listed audit occurrence and destination IDs against the current Wix deployment: confirm deployment origin, mount path, permissions and safe session fixtures, re-check route identity, rendered links, fragments and actions, and return the refreshed link audit and report.';
15
+ const BUDGET_PROMPT = 'Present the recorded link counts, estimate and budget to the migration owner and request a decision to continue, reduce scope or stop. Then resume verification and repair for the listed audit within the approved limit and return the refreshed link audit and report.';
16
+
17
+ function auditPath(projectDir) {
18
+ return path.join(projectDir, RELATIVE_PATH);
19
+ }
20
+
21
+ function nonempty(value, label) {
22
+ if (typeof value !== 'string' || !value) throw new Error(`${label} must be a non-empty string`);
23
+ return value;
24
+ }
25
+
26
+ function unique(values, label) {
27
+ if (!Array.isArray(values) || values.some((value) => typeof value !== 'string' || !value)) {
28
+ throw new Error(`${label} must be an array of non-empty strings`);
29
+ }
30
+ if (new Set(values).size !== values.length) throw new Error(`${label} contains duplicates`);
31
+ }
32
+
33
+ // The queues partition navigation occurrences. A missing or duplicated occurrence must never
34
+ // disappear from cutover just because a backend import succeeded.
35
+ function validateLinkAudit(audit) {
36
+ if (!audit || audit.schemaVersion !== 1) throw new Error('link audit schemaVersion must be 1');
37
+ if (audit.postDnsStatus === 'verified' && (!audit.postDnsEvidence || !audit.postDnsEvidence.host || !audit.postDnsEvidence.checkedAt || audit.postDnsEvidence.wixIdentityMatched !== true)) {
38
+ throw new Error('verified post-DNS status requires public-host Wix identity evidence');
39
+ }
40
+ const occurrences = audit.occurrences || [];
41
+ const pending = audit.pendingDestinations || [];
42
+ const unresolved = audit.unresolved || [];
43
+ const outcomes = audit.outcomes || [];
44
+ const ids = new Set();
45
+ for (const row of occurrences) {
46
+ nonempty(row.id, 'occurrence.id');
47
+ if (ids.has(row.id)) throw new Error(`duplicate occurrence ${row.id}`);
48
+ ids.add(row.id);
49
+ }
50
+ const assigned = new Map();
51
+ const assign = (id, location) => {
52
+ if (!ids.has(id)) throw new Error(`${location} references missing occurrence ${id}`);
53
+ if (assigned.has(id)) throw new Error(`occurrence ${id} appears in both ${assigned.get(id)} and ${location}`);
54
+ assigned.set(id, location);
55
+ };
56
+ for (const row of pending) {
57
+ nonempty(row.id, 'pending.id');
58
+ nonempty(row.targetRecordId, 'pending.targetRecordId');
59
+ nonempty(row.expectedPath, 'pending.expectedPath');
60
+ if (!row.expectedPath.startsWith('/') || row.expectedPath.startsWith('//')) throw new Error('pending.expectedPath must be root-relative');
61
+ nonempty(row.pageFamily, 'pending.pageFamily');
62
+ unique(row.occurrenceIds, 'pending.occurrenceIds');
63
+ row.occurrenceIds.forEach((id) => assign(id, `pending ${row.id}`));
64
+ }
65
+ for (const row of unresolved) {
66
+ nonempty(row.id, 'unresolved.id');
67
+ if ('expectedPath' in row) throw new Error('unresolved entries cannot carry expectedPath');
68
+ if (!UNRESOLVED_REASONS.has(row.reason)) throw new Error(`invalid unresolved reason ${row.reason}`);
69
+ unique(row.occurrenceIds, 'unresolved.occurrenceIds');
70
+ row.occurrenceIds.forEach((id) => assign(id, `unresolved ${row.id}`));
71
+ }
72
+ for (const row of outcomes) {
73
+ nonempty(row.occurrenceId, 'outcome.occurrenceId');
74
+ nonempty(row.status, 'outcome.status');
75
+ assign(row.occurrenceId, 'outcome');
76
+ }
77
+ for (const id of ids) if (!assigned.has(id)) throw new Error(`unaccounted navigation occurrence ${id}`);
78
+ for (const row of audit.writerIntegrations || []) {
79
+ nonempty(row.field, 'writerIntegration.field');
80
+ nonempty(row.status, 'writerIntegration.status');
81
+ unique(row.occurrenceIds || [], 'writerIntegration.occurrenceIds');
82
+ for (const id of row.occurrenceIds || []) if (!ids.has(id)) throw new Error(`writer integration references missing occurrence ${id}`);
83
+ }
84
+ return audit;
85
+ }
86
+
87
+ async function readLinkAudit(projectDir) {
88
+ try {
89
+ return validateLinkAudit(JSON.parse(await fs.readFile(auditPath(projectDir), 'utf8')));
90
+ } catch (error) {
91
+ if (error.code === 'ENOENT') return null;
92
+ throw error;
93
+ }
94
+ }
95
+
96
+ async function writeLinkAudit(projectDir, audit) {
97
+ validateLinkAudit(audit);
98
+ const target = auditPath(projectDir);
99
+ await fs.mkdir(path.dirname(target), { recursive: true });
100
+ const temporary = `${target}.${process.pid}.${Date.now()}.tmp`;
101
+ try {
102
+ await fs.writeFile(temporary, `${JSON.stringify(audit, null, 2)}\n`);
103
+ await fs.rename(temporary, target);
104
+ } finally {
105
+ await fs.rm(temporary, { force: true });
106
+ }
107
+ return target;
108
+ }
109
+
110
+ function linkOperatorActions(audit) {
111
+ if (!audit) return [];
112
+ validateLinkAudit(audit);
113
+ const actions = [];
114
+ const pendingWriter = (audit.writerIntegrations || []).filter((row) => row.status === 'pending');
115
+ if (pendingWriter.length) {
116
+ actions.push({
117
+ code: 'link_writer_integration', severity: 'high',
118
+ action: `Requires Import Operator. ${INTEGRATION_PROMPT} Affected fields: ${pendingWriter.map((row) => row.field).join(', ')}. Evidence: ${RELATIVE_PATH}.`,
119
+ deadlineReason: 'After compatible writers and lifecycle are available, before DNS; destination checks alone do not complete content repair.',
120
+ entity: 'internal-links', affectedCount: new Set(pendingWriter.flatMap((row) => row.occurrenceIds)).size,
121
+ });
122
+ }
123
+ const ownershipGaps = audit.unresolved.filter((row) => row.detail !== 'fragment-anchor-unverified');
124
+ if (ownershipGaps.length) actions.push({
125
+ code: 'unresolved_internal_links', severity: 'high',
126
+ action: `Requires Import Operator. ${UNRESOLVED_PROMPT} Evidence: ${RELATIVE_PATH}; ambiguous ownership needs a human decision.`,
127
+ deadlineReason: 'Before website handoff; unresolved navigation can open missing or wrong pages.',
128
+ entity: 'internal-links', affectedCount: ownershipGaps.reduce((count, row) => count + row.occurrenceIds.length, 0),
129
+ });
130
+ const routeIssues = (audit.routes || []).filter((row) => !['configured', 'reused'].includes(row.status));
131
+ if (routeIssues.length) actions.push({
132
+ code: 'app_route_configuration', severity: 'high',
133
+ action: `Requires Import Operator. ${ROUTE_PROMPT} Evidence: ${RELATIVE_PATH}. Conflicting ownership needs a human decision.`,
134
+ deadlineReason: 'After apps are installed and before DNS; a planned or unsupported route is not a served page.',
135
+ entity: 'app-routes', affectedCount: routeIssues.length,
136
+ });
137
+ const scanGaps = (audit.manifest || []).filter((row) => ['unsupported', 'unsupported-construct', 'unreadable', 'missing'].includes(row.disposition));
138
+ if (scanGaps.length) actions.push({
139
+ code: 'internal_link_scan_gaps', severity: 'high',
140
+ action: `Requires Import Operator. ${UNRESOLVED_PROMPT} Evidence: ${RELATIVE_PATH}.`,
141
+ deadlineReason: 'Before website handoff; unsupported or unreadable files cannot count as verified link coverage.',
142
+ entity: 'internal-links', affectedCount: scanGaps.length,
143
+ });
144
+ if (audit.stage !== 'verified' || audit.pendingDestinations.length) actions.push({
145
+ code: 'pending_link_verification', severity: 'high',
146
+ action: `Requires Import Operator. ${PENDING_PROMPT} Evidence: ${RELATIVE_PATH}.`,
147
+ deadlineReason: 'After frontend creation and before DNS; planned paths have not been shown to serve intended pages.',
148
+ entity: 'internal-links', affectedCount: audit.pendingDestinations.reduce((count, row) => count + row.occurrenceIds.length, 0),
149
+ });
150
+ const unavailable = (audit.pendingDestinations || []).filter((row) => row.reason && row.reason !== 'writer-or-link-verification-pending');
151
+ const fragmentGaps = (audit.unresolved || []).filter((row) => row.detail === 'fragment-anchor-unverified');
152
+ if (unavailable.length || fragmentGaps.length) actions.push({
153
+ code: 'link_verification_unavailable', severity: 'high',
154
+ action: `Requires Import Operator. ${UNAVAILABLE_PROMPT} Evidence: ${RELATIVE_PATH}.`,
155
+ deadlineReason: 'Before DNS; a served-page response alone does not prove link behavior, fragments or current content.',
156
+ entity: 'internal-links', affectedCount: unavailable.reduce((sum, row) => sum + row.occurrenceIds.length, 0) + fragmentGaps.reduce((sum, row) => sum + row.occurrenceIds.length, 0),
157
+ });
158
+ if (audit.stage === 'budget-hold') actions.push({
159
+ code: 'link_verification_budget', severity: 'high',
160
+ action: `Requires Import Operator. ${BUDGET_PROMPT} Evidence: ${RELATIVE_PATH}.`,
161
+ deadlineReason: 'The approved 30-minute live-work or 100,000 exception-review-token ceiling would be exceeded; resume only after an explicit decision.',
162
+ entity: 'internal-links', affectedCount: audit.pendingDestinations.reduce((count, row) => count + row.occurrenceIds.length, 0),
163
+ });
164
+ if (audit.postDnsStatus !== 'verified') actions.push({
165
+ code: 'post_dns_route_check', severity: 'medium',
166
+ action: `Cutover Operator: after DNS and HTTPS readiness, check the public host against the routes listed in ${RELATIVE_PATH}; return any local repair to the Import Operator.`,
167
+ deadlineReason: 'After DNS; preview-host checks do not prove the final public route.',
168
+ entity: 'app-routes', affectedCount: (audit.routes || []).length,
169
+ });
170
+ return actions;
171
+ }
172
+
173
+ module.exports = { RELATIVE_PATH, auditPath, validateLinkAudit, readLinkAudit, writeLinkAudit, linkOperatorActions };
@@ -0,0 +1,194 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs/promises');
4
+ const path = require('node:path');
5
+ const { createHash } = require('node:crypto');
6
+ const { classifyNavigation, occurrenceId } = require('./internal-link-reconciliation.js');
7
+
8
+ const NAV_KEYS = new Set(['href', 'url', 'link', 'destination', 'targetUrl']);
9
+ const RESOURCE_KEYS = new Set(['src', 'srcset', 'image', 'media', 'download', 'backgroundImage']);
10
+ const IGNORED_SEGMENTS = new Set(['config', '.git', 'node_modules', 'secrets']);
11
+
12
+ function hash(value) { return createHash('sha256').update(value).digest('hex'); }
13
+
14
+ function decodeHtmlEntities(value) {
15
+ return value.replace(/&(#(?:x[0-9a-f]+|[0-9]+)|amp|quot|apos|lt|gt);/gi, (_whole, entity) => {
16
+ if (entity[0] === '#') {
17
+ const number = entity[1].toLowerCase() === 'x' ? parseInt(entity.slice(2), 16) : parseInt(entity.slice(1), 10);
18
+ return number > 0 && number <= 0x10ffff ? String.fromCodePoint(number) : _whole;
19
+ }
20
+ return { amp: '&', quot: '"', apos: "'", lt: '<', gt: '>' }[entity.toLowerCase()];
21
+ });
22
+ }
23
+
24
+ // Tokenizes tags and quoted attributes. It does not treat arbitrary angle-bracket text as a
25
+ // successful parse: malformed markup produces an explicit unsupported disposition.
26
+ function htmlAttributes(html) {
27
+ const found = [];
28
+ let index = 0;
29
+ while (index < html.length) {
30
+ const open = html.indexOf('<', index);
31
+ if (open < 0) break;
32
+ if (html.startsWith('<!--', open)) {
33
+ const close = html.indexOf('-->', open + 4);
34
+ if (close < 0) throw new Error('unterminated HTML comment');
35
+ const comment = html.slice(open + 4, close).trim();
36
+ if (comment.startsWith('wp:')) {
37
+ const jsonStart = comment.indexOf('{');
38
+ const jsonEnd = comment.lastIndexOf('}');
39
+ if (jsonStart >= 0 && jsonEnd > jsonStart) {
40
+ try {
41
+ for (const link of extractJson(JSON.parse(comment.slice(jsonStart, jsonEnd + 1)))) found.push({ ...link, location: `block:${open}:${link.location}` });
42
+ } catch { throw new Error('unsupported WordPress block attributes'); }
43
+ }
44
+ }
45
+ index = close + 3; continue;
46
+ }
47
+ let cursor = open + 1;
48
+ if (!/[A-Za-z/!?]/.test(html[cursor] || '')) { index = cursor; continue; }
49
+ let quote = null;
50
+ for (; cursor < html.length; cursor += 1) {
51
+ const char = html[cursor];
52
+ if (quote) { if (char === quote) quote = null; }
53
+ else if (char === '"' || char === "'") quote = char;
54
+ else if (char === '>') break;
55
+ }
56
+ if (cursor >= html.length) throw new Error('unterminated HTML tag');
57
+ const tag = html.slice(open + 1, cursor);
58
+ const attr = /(?:^|\s)(href|action|src|srcset)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^\s>]+))/gi;
59
+ let match;
60
+ while ((match = attr.exec(tag))) found.push({ key: match[1].toLowerCase(), value: decodeHtmlEntities(match[2] ?? match[3] ?? match[4]), location: `char:${open + 1 + match.index + match[0].indexOf(match[1])}` });
61
+ index = cursor + 1;
62
+ }
63
+ return found;
64
+ }
65
+
66
+ function countMetadataHrefs(value) {
67
+ if (Array.isArray(value)) return value.reduce((count, item) => count + countMetadataHrefs(item), 0);
68
+ if (!value || typeof value !== 'object') return 0;
69
+ return Object.entries(value).reduce((count, [key, child]) => count + (key === 'href' && typeof child === 'string' ? 1 : countMetadataHrefs(child)), 0);
70
+ }
71
+
72
+ function extractJson(value, location = '$', output = [], contentField = null, stats = null) {
73
+ if (Array.isArray(value)) { value.forEach((item, index) => extractJson(item, `${location}[${index}]`, output, contentField, stats)); return output; }
74
+ if (!value || typeof value !== 'object') return output;
75
+ for (const [key, child] of Object.entries(value)) {
76
+ if (key === '_links' || key === '_embedded') {
77
+ if (stats) stats.metadataHrefsSkipped = (stats.metadataHrefsSkipped || 0) + countMetadataHrefs(child);
78
+ continue;
79
+ }
80
+ if (key === 'yoast_head' || key === 'yoast_head_json') {
81
+ if (stats && key === 'yoast_head' && typeof child === 'string') {
82
+ stats.metadataHrefsSkipped = (stats.metadataHrefsSkipped || 0) + (child.match(/(?:^|\s)href\s*=/gi) || []).length;
83
+ }
84
+ continue;
85
+ }
86
+ const next = `${location}.${key}`;
87
+ const owningField = contentField || (['records', 'items', 'data', 'entities'].includes(key) ? null : key);
88
+ if (typeof child === 'string') {
89
+ const resourceContext = /(?:^|\.)(?:image|media|attachment|thumbnail|download|logo|icon|background)(?:\.|\[|$)/i.test(location);
90
+ const navigationContext = /(?:^|\.)(?:content|body|description|button|menu|recommendation|link|anchor|action|richContent)(?:\.|\[|$)/i.test(location);
91
+ if (RESOURCE_KEYS.has(key) || resourceContext && key === 'url') output.push({ key, value: child, location: next, contentField: owningField, resource: true });
92
+ else if (NAV_KEYS.has(key) && (key === 'href' || key === 'targetUrl' || key === 'destination' || navigationContext)) output.push({ key, value: child, location: next, contentField: owningField });
93
+ else if (/<[a-z][^>]*>/i.test(child)) for (const attr of htmlAttributes(child)) output.push({ ...attr, contentField: owningField, location: `${next}:${attr.location}` });
94
+ } else extractJson(child, next, output, owningField, stats);
95
+ }
96
+ return output;
97
+ }
98
+
99
+ function extractFile(file, raw, stats = null) {
100
+ const ext = path.extname(file).toLowerCase();
101
+ if (ext === '.json') return extractJson(JSON.parse(raw), '$', [], null, stats);
102
+ if (ext === '.html' || ext === '.htm') return htmlAttributes(raw);
103
+ // CSS URLs are resources, not automatically navigational links.
104
+ if (ext === '.css') return [];
105
+ throw new Error('unsupported-format');
106
+ }
107
+
108
+ function containingRecord(file, location, containingPages) {
109
+ const config = containingPages[file];
110
+ if (typeof config === 'string') return { url: config, recordId: null };
111
+ if (!config || typeof config !== 'object') return null;
112
+ const prefix = Object.keys(config).filter((key) => location.startsWith(key)).sort((a, b) => b.length - a.length)[0];
113
+ if (!prefix) return null;
114
+ const row = config[prefix];
115
+ return typeof row === 'string' ? { url: row, recordId: null } : row;
116
+ }
117
+
118
+ async function walk(root, relative = '') {
119
+ const entries = await fs.readdir(path.join(root, relative), { withFileTypes: true });
120
+ const files = [];
121
+ for (const entry of entries) {
122
+ if (IGNORED_SEGMENTS.has(entry.name) || entry.name.startsWith('.')) continue;
123
+ const next = path.join(relative, entry.name);
124
+ if (entry.isDirectory()) files.push(...await walk(root, next));
125
+ else if (entry.isFile()) files.push(next);
126
+ }
127
+ return files;
128
+ }
129
+
130
+ async function census({ capturedRoots, expectedFiles = [], sourceHosts, destinationHosts, containingPages = {}, previous = null }) {
131
+ if (!Array.isArray(capturedRoots) || !capturedRoots.length) throw new Error('capturedRoots required');
132
+ const started = Date.now();
133
+ const manifest = [];
134
+ const occurrences = [];
135
+ for (const root of capturedRoots) {
136
+ const files = await walk(root);
137
+ for (const relative of files) {
138
+ const file = path.join(root, relative);
139
+ let raw;
140
+ try { raw = await fs.readFile(file); }
141
+ catch (error) { manifest.push({ file, disposition: 'unreadable', reason: error.code || 'read-error' }); continue; }
142
+ const digest = hash(raw);
143
+ const base = { file, bytes: raw.length, sha256: digest };
144
+ const old = previous && previous.censusVersion === 4 && previous.manifest && previous.manifest.find((row) => row.file === file && row.sha256 === digest);
145
+ if (old && previous.occurrences) {
146
+ manifest.push({ ...base, disposition: old.disposition, reason: old.reason || null, metadataHrefsSkipped: old.metadataHrefsSkipped || 0 });
147
+ occurrences.push(...previous.occurrences.filter((row) => row.sourceFile === file));
148
+ continue;
149
+ }
150
+ let links;
151
+ const scanStats = {};
152
+ try { links = extractFile(file, raw.toString('utf8'), scanStats); }
153
+ catch (error) { manifest.push({ ...base, disposition: 'unsupported', reason: error.message }); continue; }
154
+ const possibleUnparsedLink = !links.length && /https?:\/\/|href\s*=|location\.href/i.test(raw.toString('utf8')) && !scanStats.metadataHrefsSkipped;
155
+ manifest.push({ ...base, disposition: links.length ? 'scanned-links' : possibleUnparsedLink ? 'unsupported-construct' : 'scanned-no-links', metadataHrefsSkipped: scanStats.metadataHrefsSkipped || 0 });
156
+ for (const link of links) {
157
+ if (link.resource || RESOURCE_KEYS.has(link.key)) continue;
158
+ const containing = containingRecord(file, link.location, containingPages);
159
+ const containingUrl = containing && containing.url;
160
+ if (!containingUrl) {
161
+ // An absolute off-site URL needs no containing page to classify it.
162
+ if (/^https?:\/\//i.test(link.value) || /^\/\//.test(link.value)) {
163
+ const absolute = classifyNavigation(link.value, 'https://link-audit.invalid/', { sourceHosts, destinationHosts });
164
+ if (absolute.kind === 'external') continue;
165
+ }
166
+ occurrences.push({ id: occurrenceId({ sourceFile: file, field: link.key, location: link.location, original: link.value }), sourceFile: file, field: link.key, location: link.location, original: link.value, classification: 'missing-containing-page' });
167
+ continue;
168
+ }
169
+ const classification = classifyNavigation(link.value, containingUrl, { sourceHosts, destinationHosts });
170
+ if (classification.kind !== 'internal' && classification.kind !== 'stateful') continue;
171
+ occurrences.push({
172
+ id: occurrenceId({ sourceFile: file, field: link.key, location: link.location, original: link.value }),
173
+ sourceFile: file, sourceRecordId: containing.recordId || null, targetRecordId: containing.targetRecordId || null,
174
+ recordType: containing.recordType || null, targetContentRevision: containing.targetContentRevision || null,
175
+ field: containing.contentField || link.contentField || link.key, location: link.location, containingUrl,
176
+ original: link.value, classification: classification.kind === 'stateful' ? 'stateful-navigation' : 'internal-navigation',
177
+ originalPath: classification.path, ...(classification.fragmentOnly ? { fragmentOnly: true } : {}),
178
+ });
179
+ }
180
+ }
181
+ }
182
+ const scannedFiles = new Set(manifest.map((row) => row.file));
183
+ for (const file of expectedFiles) if (!scannedFiles.has(file)) manifest.push({ file, disposition: 'missing', reason: 'capture-file-absent' });
184
+ return { manifest, occurrences, counts: {
185
+ files: manifest.length, bytes: manifest.reduce((sum, row) => sum + (row.bytes || 0), 0),
186
+ internalOccurrences: occurrences.filter((row) => ['internal-navigation', 'stateful-navigation'].includes(row.classification)).length,
187
+ distinctInternalDestinations: new Set(occurrences.filter((row) => row.originalPath).map((row) => row.originalPath)).size,
188
+ unsupportedFiles: manifest.filter((row) => ['unsupported', 'unsupported-construct', 'unreadable', 'missing'].includes(row.disposition)).length,
189
+ metadataHrefsSkipped: manifest.reduce((sum, row) => sum + (row.metadataHrefsSkipped || 0), 0),
190
+ scanMs: Date.now() - started,
191
+ } };
192
+ }
193
+
194
+ module.exports = { decodeHtmlEntities, htmlAttributes, extractJson, extractFile, census };