@open-mercato/cli 0.6.7 → 0.6.8-canary.319.1.5b4be4bc52

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 (287) hide show
  1. package/.turbo/turbo-build.log +77 -4
  2. package/build.mjs +68 -11
  3. package/dist/agentic/claude-code/hooks/entity-migration-check.ts +32 -88
  4. package/dist/agentic/codex/enforcement-rules.md +2 -16
  5. package/dist/agentic/cursor/hooks/entity-migration-check.mjs +19 -50
  6. package/dist/agentic/cursor/rules/entity-guard.mdc +9 -21
  7. package/dist/agentic/cursor/rules/generated-guard.mdc +3 -5
  8. package/dist/agentic/cursor/rules/open-mercato.mdc +3 -29
  9. package/dist/agentic/guides/ai-workflows.md +76 -0
  10. package/dist/agentic/guides/architecture.md +107 -0
  11. package/dist/agentic/guides/backend-ui.md +84 -0
  12. package/dist/agentic/guides/contracts.md +92 -0
  13. package/dist/agentic/guides/extensions.md +121 -0
  14. package/dist/agentic/guides/framework-extension-points.md +36 -0
  15. package/dist/agentic/guides/integrations.md +81 -0
  16. package/dist/agentic/guides/module-facts.json +116757 -3951
  17. package/dist/agentic/guides/module-system.md +12 -127
  18. package/dist/agentic/guides/modules/ai_assistant.md +227 -28
  19. package/dist/agentic/guides/modules/api_docs.md +58 -2
  20. package/dist/agentic/guides/modules/api_keys.md +92 -7
  21. package/dist/agentic/guides/modules/attachments.md +119 -14
  22. package/dist/agentic/guides/modules/audit_logs.md +131 -10
  23. package/dist/agentic/guides/modules/auth.md +276 -33
  24. package/dist/agentic/guides/modules/business_rules.md +149 -14
  25. package/dist/agentic/guides/modules/catalog.md +482 -43
  26. package/dist/agentic/guides/modules/channel_gmail.md +82 -3
  27. package/dist/agentic/guides/modules/channel_imap.md +82 -3
  28. package/dist/agentic/guides/modules/checkout.md +305 -27
  29. package/dist/agentic/guides/modules/communication_channels.md +315 -33
  30. package/dist/agentic/guides/modules/configs.md +104 -8
  31. package/dist/agentic/guides/modules/content.md +57 -2
  32. package/dist/agentic/guides/modules/currencies.md +152 -17
  33. package/dist/agentic/guides/modules/customer_accounts.md +387 -45
  34. package/dist/agentic/guides/modules/customers.md +746 -85
  35. package/dist/agentic/guides/modules/dashboards.md +155 -10
  36. package/dist/agentic/guides/modules/data_sync.md +149 -16
  37. package/dist/agentic/guides/modules/design_system.md +102 -0
  38. package/dist/agentic/guides/modules/dictionaries.md +107 -12
  39. package/dist/agentic/guides/modules/directory.md +148 -15
  40. package/dist/agentic/guides/modules/entities.md +145 -13
  41. package/dist/agentic/guides/modules/events.md +59 -2
  42. package/dist/agentic/guides/modules/feature_toggles.md +119 -9
  43. package/dist/agentic/guides/modules/gateway_stripe.md +92 -4
  44. package/dist/agentic/guides/modules/generators.md +45 -2
  45. package/dist/agentic/guides/modules/inbox_ops.md +207 -27
  46. package/dist/agentic/guides/modules/integrations.md +149 -16
  47. package/dist/agentic/guides/modules/messages.md +223 -24
  48. package/dist/agentic/guides/modules/notifications.md +96 -8
  49. package/dist/agentic/guides/modules/onboarding.md +77 -6
  50. package/dist/agentic/guides/modules/payment_gateways.md +168 -21
  51. package/dist/agentic/guides/modules/perspectives.md +77 -7
  52. package/dist/agentic/guides/modules/planner.md +136 -18
  53. package/dist/agentic/guides/modules/portal.md +93 -2
  54. package/dist/agentic/guides/modules/progress.md +104 -14
  55. package/dist/agentic/guides/modules/query_index.md +154 -15
  56. package/dist/agentic/guides/modules/record_locks.md +206 -21
  57. package/dist/agentic/guides/modules/resources.md +197 -30
  58. package/dist/agentic/guides/modules/sales.md +687 -84
  59. package/dist/agentic/guides/modules/scheduler.md +133 -14
  60. package/dist/agentic/guides/modules/search.md +170 -6
  61. package/dist/agentic/guides/modules/security.md +294 -35
  62. package/dist/agentic/guides/modules/shipping_carriers.md +134 -18
  63. package/dist/agentic/guides/modules/sso.md +151 -26
  64. package/dist/agentic/guides/modules/staff.md +372 -57
  65. package/dist/agentic/guides/modules/storage_s3.md +95 -5
  66. package/dist/agentic/guides/modules/sync_akeneo.md +85 -3
  67. package/dist/agentic/guides/modules/sync_excel.md +75 -6
  68. package/dist/agentic/guides/modules/system_status_overlays.md +60 -2
  69. package/dist/agentic/guides/modules/translations.md +104 -10
  70. package/dist/agentic/guides/modules/webhooks.md +203 -24
  71. package/dist/agentic/guides/modules/wms.md +469 -47
  72. package/dist/agentic/guides/modules/workflows.md +302 -43
  73. package/dist/agentic/guides/reference-module-facts.json +6370 -0
  74. package/dist/agentic/guides/reference-modules/example.md +451 -0
  75. package/dist/agentic/guides/spec-delivery.md +42 -0
  76. package/dist/agentic/guides/testing-debugging.md +80 -0
  77. package/dist/agentic/guides/upstream/AGENTS.md +299 -0
  78. package/dist/agentic/guides/upstream/BACKWARD_COMPATIBILITY.md +316 -0
  79. package/dist/agentic/guides/upstream/manifest.json +8 -0
  80. package/dist/agentic/shared/AGENTS.md.template +120 -311
  81. package/dist/agentic/shared/ai/agentic.config.json +2 -0
  82. package/dist/agentic/shared/ai/harness/README.md +50 -0
  83. package/dist/agentic/shared/ai/harness/RELEASE.md +57 -0
  84. package/dist/agentic/shared/ai/harness/cases.json +15050 -0
  85. package/dist/agentic/shared/ai/harness/cases.schema.json +188 -0
  86. package/dist/agentic/shared/ai/harness/fixtures/index.json +51 -0
  87. package/dist/agentic/shared/ai/harness/fixtures/seeds.json +166 -0
  88. package/dist/agentic/shared/ai/harness/generated-code-review-policy.md +21 -0
  89. package/dist/agentic/shared/ai/harness/generated-code-review-response.schema.json +96 -0
  90. package/dist/agentic/shared/ai/harness/generated-code-review-result.schema.json +172 -0
  91. package/dist/agentic/shared/ai/harness/knowledge-change.schema.json +228 -0
  92. package/dist/agentic/shared/ai/harness/release-matrix.json +163 -0
  93. package/dist/agentic/shared/ai/harness/release-result.schema.json +219 -0
  94. package/dist/agentic/shared/ai/harness/result.schema.json +109 -0
  95. package/dist/agentic/shared/ai/harness/routing-response.schema.json +22 -0
  96. package/dist/agentic/shared/ai/harness/target-validation-result.schema.json +73 -0
  97. package/dist/agentic/shared/ai/harness/validators.json +82 -0
  98. package/dist/agentic/shared/ai/harness/writable-ast-oracles.mjs +2121 -0
  99. package/dist/agentic/shared/ai/harness/writable-behavior-oracles.mjs +1096 -0
  100. package/dist/agentic/shared/ai/harness/writable-spec-oracles.mjs +412 -0
  101. package/dist/agentic/shared/ai/lessons/_template.md +16 -0
  102. package/dist/agentic/shared/ai/lessons.md +26 -3
  103. package/dist/agentic/shared/ai/review-checklist.md +36 -0
  104. package/dist/agentic/shared/ai/skills/om-auto-implement-spec/SKILL.md +21 -0
  105. package/dist/agentic/shared/ai/skills/om-auto-review-pr/SKILL.md +4 -0
  106. package/dist/agentic/shared/ai/skills/om-auto-upgrade-0.6.6-to-0.6.7/SKILL.md +98 -0
  107. package/dist/agentic/shared/ai/skills/om-backend-ui-design/SKILL.md +21 -241
  108. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/crud-surfaces.md +31 -0
  109. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/frontend-and-design-system.md +53 -0
  110. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/page-and-navigation.md +15 -0
  111. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/quality-states.md +11 -0
  112. package/dist/agentic/shared/ai/skills/om-build-workflow/SKILL.md +30 -0
  113. package/dist/agentic/shared/ai/skills/om-build-workflow/references/activity-contracts.md +12 -0
  114. package/dist/agentic/shared/ai/skills/om-build-workflow/references/durability-and-progress.md +13 -0
  115. package/dist/agentic/shared/ai/skills/om-build-workflow/references/workflow-design.md +14 -0
  116. package/dist/agentic/shared/ai/skills/om-create-ai-agent/SKILL.md +28 -0
  117. package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/attachments-and-overrides.md +12 -0
  118. package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/module-agents-and-tools.md +22 -0
  119. package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/orchestrator-agents.md +12 -0
  120. package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/surface-selector.md +19 -0
  121. package/dist/agentic/shared/ai/skills/om-data-model-design/SKILL.md +17 -601
  122. package/dist/agentic/shared/ai/skills/om-data-model-design/references/integrity-and-concurrency.md +21 -0
  123. package/dist/agentic/shared/ai/skills/om-data-model-design/references/migration-workflow.md +15 -0
  124. package/dist/agentic/shared/ai/skills/om-data-model-design/references/schema-design.md +16 -0
  125. package/dist/agentic/shared/ai/skills/om-data-model-design/references/sensitive-data.md +10 -0
  126. package/dist/agentic/shared/ai/skills/om-eject-and-customize/SKILL.md +15 -310
  127. package/dist/agentic/shared/ai/skills/om-eject-and-customize/references/decision-and-procedure.md +19 -0
  128. package/dist/agentic/shared/ai/skills/om-evolve-harness/SKILL.md +31 -0
  129. package/dist/agentic/shared/ai/skills/om-evolve-harness/references/case-template.md +100 -0
  130. package/dist/agentic/shared/ai/skills/om-evolve-harness/references/case-workflow.md +16 -0
  131. package/dist/agentic/shared/ai/skills/om-evolve-harness/references/knowledge-change.md +115 -0
  132. package/dist/agentic/shared/ai/skills/om-evolve-harness/references/owner-selection.md +17 -0
  133. package/dist/agentic/shared/ai/skills/om-framework-context/SKILL.md +25 -0
  134. package/dist/agentic/shared/ai/skills/om-framework-context/references/resolver-procedure.md +11 -0
  135. package/dist/agentic/shared/ai/skills/om-framework-context/references/skew-and-escalation.md +13 -0
  136. package/dist/agentic/shared/ai/skills/om-help/SKILL.md +15 -97
  137. package/dist/agentic/shared/ai/skills/om-help/references/delivery-workflows.md +18 -0
  138. package/dist/agentic/shared/ai/skills/om-help/references/task-families.md +20 -0
  139. package/dist/agentic/shared/ai/skills/om-implement-spec/SKILL.md +33 -152
  140. package/dist/agentic/shared/ai/skills/om-implement-spec/references/phases-and-gates.md +33 -0
  141. package/dist/agentic/shared/ai/skills/om-implement-spec/references/planning-and-progress.md +40 -0
  142. package/dist/agentic/shared/ai/skills/om-implement-spec/references/report-templates.md +27 -0
  143. package/dist/agentic/shared/ai/skills/om-implement-spec/references/spec-resolution.md +24 -0
  144. package/dist/agentic/shared/ai/skills/om-integration-builder/SKILL.md +25 -708
  145. package/dist/agentic/shared/ai/skills/om-integration-builder/references/package-and-activation.md +16 -0
  146. package/dist/agentic/shared/ai/skills/om-integration-builder/references/provider-families.md +25 -0
  147. package/dist/agentic/shared/ai/skills/om-integration-builder/references/security-and-reliability.md +15 -0
  148. package/dist/agentic/shared/ai/skills/om-integration-builder/references/sync-and-files.md +12 -0
  149. package/dist/agentic/shared/ai/skills/om-judge-agent-session/SKILL.md +34 -0
  150. package/dist/agentic/shared/ai/skills/om-judge-agent-session/agents/openai.yaml +4 -0
  151. package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/agentic-setup.md +11 -0
  152. package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/input-normalization.md +31 -0
  153. package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/judge-workflow.md +39 -0
  154. package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/report-template.md +43 -0
  155. package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/rules.md +11 -0
  156. package/dist/agentic/shared/ai/skills/om-module-scaffold/SKILL.md +20 -820
  157. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/api-and-domain.md +32 -0
  158. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/business-one-shot-blueprints.md +172 -0
  159. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/data-and-migrations.md +14 -0
  160. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/discovery-surface-catalog.md +83 -0
  161. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/module-surfaces.md +40 -0
  162. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/planning.md +11 -0
  163. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/runtime-cache-and-queues.md +22 -0
  164. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/verification.md +13 -0
  165. package/dist/agentic/shared/ai/skills/om-share-this-session/SKILL.md +41 -0
  166. package/dist/agentic/shared/ai/skills/om-share-this-session/references/agentic-setup.md +19 -0
  167. package/dist/agentic/shared/ai/skills/om-share-this-session/references/bundle-preparation.md +44 -0
  168. package/dist/agentic/shared/ai/skills/om-share-this-session/references/consent-and-review.md +39 -0
  169. package/dist/agentic/shared/ai/skills/om-share-this-session/references/publication.md +20 -0
  170. package/dist/agentic/shared/ai/skills/om-share-this-session/references/report-templates.md +57 -0
  171. package/dist/agentic/shared/ai/skills/om-share-this-session/references/rules.md +11 -0
  172. package/dist/agentic/shared/ai/skills/om-share-this-session/scripts/prepare-share-bundle.mjs +486 -0
  173. package/dist/agentic/shared/ai/skills/om-system-extension/SKILL.md +20 -843
  174. package/dist/agentic/shared/ai/skills/om-system-extension/references/extension-branches.md +42 -0
  175. package/dist/agentic/shared/ai/skills/om-system-extension/references/mechanism-selector.md +27 -0
  176. package/dist/agentic/shared/ai/skills/om-system-extension/references/read-write-roundtrip.md +13 -0
  177. package/dist/agentic/shared/ai/skills/om-system-extension/references/unified-overrides.md +43 -0
  178. package/dist/agentic/shared/ai/skills/om-system-extension/references/verification.md +11 -0
  179. package/dist/agentic/shared/ai/skills/om-trim-unused-modules/SKILL.md +15 -63
  180. package/dist/agentic/shared/ai/skills/om-trim-unused-modules/references/dependency-and-redirect.md +15 -0
  181. package/dist/agentic/shared/ai/skills/om-troubleshooter/SKILL.md +17 -467
  182. package/dist/agentic/shared/ai/skills/om-troubleshooter/references/diagnosis-map.md +29 -0
  183. package/dist/agentic/shared/ai/skills/om-troubleshooter/references/regression-oracles.md +14 -0
  184. package/dist/agentic/shared/ai/skills/tiers.json +143 -21
  185. package/dist/agentic/shared/ai/skills/tiers.schema.json +52 -40
  186. package/dist/agentic/shared/ai/specs/README.md +4 -3
  187. package/dist/agentic/shared/ai/specs/SPEC-000-template.md +226 -10
  188. package/dist/agentic/shared/ai/trackers/github.md +108 -4
  189. package/dist/agentic/shared/scripts/agent-harness-tool-server.mjs +224 -0
  190. package/dist/agentic/shared/scripts/check-lessons.mjs +178 -0
  191. package/dist/agentic/shared/scripts/evaluate-agent-harness.mjs +3585 -0
  192. package/dist/agentic/shared/scripts/execution-sandbox.mjs +329 -0
  193. package/dist/agentic/shared/scripts/framework-context.mjs +888 -0
  194. package/dist/agentic/shared/scripts/install-skills.mjs +1029 -0
  195. package/dist/agentic/shared/scripts/install-skills.sh +4 -694
  196. package/dist/agentic/shared/scripts/prepare-agent-harness-fixture.mjs +222 -0
  197. package/dist/agentic/shared/scripts/run-agent-harness-release.mjs +1774 -0
  198. package/dist/agentic/shared/scripts/validate-knowledge-change.mjs +911 -0
  199. package/dist/bin.js +13 -1
  200. package/dist/bin.js.map +2 -2
  201. package/dist/lib/__integration__/TC-INT-008.spec.js +88 -8
  202. package/dist/lib/__integration__/TC-INT-008.spec.js.map +2 -2
  203. package/dist/lib/agentic-init.js +13 -3
  204. package/dist/lib/agentic-init.js.map +2 -2
  205. package/dist/lib/agentic-setup.js +434 -186
  206. package/dist/lib/agentic-setup.js.map +2 -2
  207. package/dist/lib/generators/extensions/injection-widgets.js +20 -0
  208. package/dist/lib/generators/extensions/injection-widgets.js.map +2 -2
  209. package/dist/lib/generators/module-extension-facts.js +1872 -0
  210. package/dist/lib/generators/module-extension-facts.js.map +7 -0
  211. package/dist/lib/generators/module-fact-sources.js +70 -0
  212. package/dist/lib/generators/module-fact-sources.js.map +7 -0
  213. package/dist/lib/generators/module-facts-discovery.js +64 -7
  214. package/dist/lib/generators/module-facts-discovery.js.map +2 -2
  215. package/dist/lib/generators/module-facts.js +1629 -52
  216. package/dist/lib/generators/module-facts.js.map +3 -3
  217. package/dist/lib/generators/module-override-targets.js +688 -0
  218. package/dist/lib/generators/module-override-targets.js.map +7 -0
  219. package/dist/lib/generators/module-registry.js +11 -5
  220. package/dist/lib/generators/module-registry.js.map +2 -2
  221. package/dist/lib/load-env.js +24 -0
  222. package/dist/lib/load-env.js.map +7 -0
  223. package/dist/lib/resolver.js +2 -0
  224. package/dist/lib/resolver.js.map +2 -2
  225. package/dist/lib/telemetry-init.js +358 -0
  226. package/dist/lib/telemetry-init.js.map +7 -0
  227. package/dist/lib/testing/integration.js +5 -2
  228. package/dist/lib/testing/integration.js.map +2 -2
  229. package/dist/mercato.js +23 -1
  230. package/dist/mercato.js.map +2 -2
  231. package/package.json +13 -11
  232. package/src/bin.ts +33 -1
  233. package/src/lib/__integration__/TC-INT-008.spec.ts +107 -9
  234. package/src/lib/__tests__/agentic-init.test.ts +41 -5
  235. package/src/lib/__tests__/agentic-setup.ownership.test.ts +386 -0
  236. package/src/lib/__tests__/injection-widget-id-validation.test.ts +184 -0
  237. package/src/lib/__tests__/load-env.test.ts +65 -0
  238. package/src/lib/__tests__/telemetry-init.test.ts +298 -0
  239. package/src/lib/agentic-init.ts +15 -3
  240. package/src/lib/agentic-setup.ts +573 -222
  241. package/src/lib/generators/__tests__/activation-adapter-coverage.test.ts +92 -0
  242. package/src/lib/generators/__tests__/module-extension-activations.test.ts +762 -0
  243. package/src/lib/generators/__tests__/module-extension-facts.test.ts +603 -0
  244. package/src/lib/generators/__tests__/module-facts.bc-guard.test.ts +139 -2
  245. package/src/lib/generators/__tests__/module-facts.computed-di-token.test.ts +88 -0
  246. package/src/lib/generators/__tests__/module-facts.customers.fixture.test.ts +1 -0
  247. package/src/lib/generators/__tests__/module-facts.discovery.test.ts +54 -10
  248. package/src/lib/generators/__tests__/module-facts.extension-hosts.test.ts +108 -0
  249. package/src/lib/generators/__tests__/module-facts.local-reference.test.ts +391 -0
  250. package/src/lib/generators/__tests__/module-facts.owned-contracts.test.ts +561 -0
  251. package/src/lib/generators/__tests__/module-facts.search-entity-id.test.ts +151 -0
  252. package/src/lib/generators/__tests__/module-facts.source-links.test.ts +160 -0
  253. package/src/lib/generators/__tests__/module-override-targets.roundtrip.test.ts +149 -0
  254. package/src/lib/generators/__tests__/module-override-targets.test.ts +328 -0
  255. package/src/lib/generators/__tests__/module-subset.test.ts +18 -0
  256. package/src/lib/generators/extensions/injection-widgets.ts +51 -0
  257. package/src/lib/generators/module-extension-facts.ts +2433 -0
  258. package/src/lib/generators/module-fact-sources.ts +108 -0
  259. package/src/lib/generators/module-facts-discovery.ts +104 -7
  260. package/src/lib/generators/module-facts.ts +2387 -138
  261. package/src/lib/generators/module-override-targets.ts +863 -0
  262. package/src/lib/generators/module-registry.ts +16 -6
  263. package/src/lib/load-env.ts +30 -0
  264. package/src/lib/resolver.ts +3 -0
  265. package/src/lib/telemetry-init.ts +461 -0
  266. package/src/lib/testing/__tests__/integration.test.ts +4 -0
  267. package/src/lib/testing/integration.ts +5 -2
  268. package/src/mercato.ts +26 -1
  269. package/dist/agentic/guides/cache.md +0 -45
  270. package/dist/agentic/guides/core.md +0 -453
  271. package/dist/agentic/guides/events.md +0 -117
  272. package/dist/agentic/guides/queue.md +0 -53
  273. package/dist/agentic/guides/search.md +0 -115
  274. package/dist/agentic/guides/shared.md +0 -108
  275. package/dist/agentic/guides/ui.md +0 -347
  276. package/dist/agentic/shared/ai/skills/om-auto-continue-pr-loop/SKILL.md +0 -27
  277. package/dist/agentic/shared/ai/skills/om-auto-create-pr-loop/SKILL.md +0 -27
  278. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/ui-components.md +0 -260
  279. package/dist/agentic/shared/ai/skills/om-data-model-design/references/mikro-orm-cheatsheet.md +0 -146
  280. package/dist/agentic/shared/ai/skills/om-help/references/skills-catalog.md +0 -84
  281. package/dist/agentic/shared/ai/skills/om-help/references/workflow-sequences.md +0 -193
  282. package/dist/agentic/shared/ai/skills/om-integration-builder/STANDALONE.md +0 -34
  283. package/dist/agentic/shared/ai/skills/om-integration-builder/references/adapter-contracts.md +0 -762
  284. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/naming-conventions.md +0 -50
  285. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/navigation-patterns.md +0 -97
  286. package/dist/agentic/shared/ai/skills/om-system-extension/references/extension-contracts.md +0 -271
  287. package/dist/agentic/shared/ai/skills/om-troubleshooter/references/diagnostic-commands.md +0 -101
@@ -0,0 +1,108 @@
1
+ import type {
2
+ ModuleFactSourceKind,
3
+ ModuleFactSourceRef,
4
+ ModuleFactsJsonEntry,
5
+ } from './module-facts'
6
+
7
+ /**
8
+ * The subset of a module's facts needed to resolve the provenance index. Both
9
+ * the in-memory `ModuleFacts` and the emitted `ModuleFactsJsonEntry` satisfy it.
10
+ */
11
+ export type FactSourceLookupInput = Pick<
12
+ ModuleFactsJsonEntry,
13
+ | 'apiRoutes'
14
+ | 'cliCommands'
15
+ | 'backendPages'
16
+ | 'frontendPages'
17
+ | 'aiTools'
18
+ | 'aiAgents'
19
+ | 'ownedContracts'
20
+ | 'extensionSurfaces'
21
+ | 'factSources'
22
+ >
23
+
24
+ export type FactSourceLookup = (kind: ModuleFactSourceKind, id: string) => ModuleFactSourceRef | null
25
+
26
+ function identityKey(left: string, right: string): string {
27
+ return JSON.stringify([left, right])
28
+ }
29
+
30
+ /**
31
+ * Fact sections that do not serialize a source inline: their provenance lives in
32
+ * `factSources` under the mapped kind, so a `factRef` into them resolves with one
33
+ * extra hop. Used by `fact-ref` extension hosts, which reference the fact they
34
+ * expose rather than a declaration of their own.
35
+ */
36
+ const SECTION_FACT_KINDS: Record<string, ModuleFactSourceKind> = {
37
+ entities: 'entity',
38
+ events: 'event',
39
+ aclFeatures: 'acl-feature',
40
+ notifications: 'notification',
41
+ searchEntities: 'search',
42
+ }
43
+
44
+ /**
45
+ * Builds the single provenance lookup every consumer uses. `factSources` entries
46
+ * carrying an inline `source` resolve directly; `factRef` entries are followed
47
+ * into the fact section that already serializes the declaration site, so every
48
+ * proven `(kind, id)` resolves deterministically without duplicated payloads.
49
+ */
50
+ export function buildFactSourceLookup(facts: FactSourceLookupInput): FactSourceLookup {
51
+ const bySection = new Map<string, ModuleFactSourceRef>()
52
+ const register = (factSection: string, factKey: string, source: ModuleFactSourceRef): void => {
53
+ bySection.set(identityKey(factSection, factKey), source)
54
+ }
55
+ for (const route of facts.apiRoutes ?? []) {
56
+ if (route.sourcePath) register('apiRoutes', route.path, { sourcePath: route.sourcePath })
57
+ }
58
+ for (const command of facts.cliCommands ?? []) {
59
+ register('cliCommands', command.command, { sourcePath: command.sourcePath })
60
+ }
61
+ for (const page of facts.backendPages ?? []) register('backendPages', page.path, { sourcePath: page.sourcePath })
62
+ for (const page of facts.frontendPages ?? []) register('frontendPages', page.path, { sourcePath: page.sourcePath })
63
+ for (const tool of facts.aiTools ?? []) register('aiTools', tool.name, { sourcePath: tool.sourcePath })
64
+ for (const agent of facts.aiAgents ?? []) register('aiAgents', agent.id, { sourcePath: agent.sourcePath })
65
+ for (const [kind, ownedFacts] of Object.entries(facts.ownedContracts ?? {})) {
66
+ for (const fact of ownedFacts ?? []) register(`ownedContracts.${kind}`, fact.id, fact.source)
67
+ }
68
+ for (const contribution of facts.extensionSurfaces?.contributions ?? []) {
69
+ register('extensionSurfaces.contributions', contribution.id, { sourcePath: contribution.source.path })
70
+ }
71
+ const factRefHostTargets = new Map<string, { factSection: string; factKey: string }>()
72
+ for (const host of facts.extensionSurfaces?.hosts ?? []) {
73
+ if (host.source.kind === 'fact-ref') {
74
+ factRefHostTargets.set(host.key, { factSection: host.source.factSection, factKey: host.source.factKey })
75
+ continue
76
+ }
77
+ register('extensionSurfaces.hosts', host.key, { sourcePath: host.source.path })
78
+ }
79
+
80
+ const entries = new Map<string, { source?: ModuleFactSourceRef; factSection?: string; factKey?: string }>()
81
+ for (const entry of facts.factSources ?? []) {
82
+ entries.set(identityKey(entry.kind, entry.id), {
83
+ ...(entry.source ? { source: entry.source } : {}),
84
+ ...(entry.factRef ? { factSection: entry.factRef.factSection, factKey: entry.factRef.factKey } : {}),
85
+ })
86
+ }
87
+
88
+ const resolve = (kind: ModuleFactSourceKind, id: string, depth: number): ModuleFactSourceRef | null => {
89
+ if (depth > 2) return null
90
+ const entry = entries.get(identityKey(kind, id))
91
+ if (!entry) return null
92
+ if (entry.source) return entry.source
93
+ if (entry.factSection === undefined) return null
94
+ const factKey = entry.factKey ?? id
95
+ const direct = bySection.get(identityKey(entry.factSection, factKey))
96
+ if (direct) return direct
97
+ if (entry.factSection === 'extensionSurfaces.hosts') {
98
+ const hostTarget = factRefHostTargets.get(factKey)
99
+ const hostKind = hostTarget ? SECTION_FACT_KINDS[hostTarget.factSection] : undefined
100
+ if (hostTarget && hostKind) return resolve(hostKind, hostTarget.factKey, depth + 1)
101
+ if (hostTarget) return bySection.get(identityKey(hostTarget.factSection, hostTarget.factKey)) ?? null
102
+ }
103
+ const sectionKind = SECTION_FACT_KINDS[entry.factSection]
104
+ return sectionKind ? resolve(sectionKind, factKey, depth + 1) : null
105
+ }
106
+
107
+ return (kind, id) => resolve(kind, id, 0)
108
+ }
@@ -29,13 +29,59 @@ export function hasReadableModuleSource(moduleRoot: string): boolean {
29
29
  return false
30
30
  }
31
31
 
32
- function dedupeById(sources: ModuleFactSource[]): ModuleFactSource[] {
33
- const seen = new Set<string>()
32
+ function resolveDuplicateModuleIds(
33
+ sources: ModuleFactSource[],
34
+ resolver: PackageResolver,
35
+ ): ModuleFactSource[] {
36
+ const sourcesByModule = new Map<string, ModuleFactSource[]>()
37
+ for (const source of sources) {
38
+ const matches = sourcesByModule.get(source.moduleId) ?? []
39
+ matches.push(source)
40
+ sourcesByModule.set(source.moduleId, matches)
41
+ }
42
+
43
+ const duplicates = [...sourcesByModule.entries()].filter(([, matches]) => matches.length > 1)
44
+ if (duplicates.length === 0) return sources
45
+
46
+ const selectedProviders = new Map<string, Set<string>>()
47
+ const implicitCoreSelections = new Set<string>()
48
+ for (const entry of resolver.loadEnabledModules()) {
49
+ const providers = selectedProviders.get(entry.id) ?? new Set<string>()
50
+ providers.add(entry.from ?? '@open-mercato/core')
51
+ selectedProviders.set(entry.id, providers)
52
+ if (entry.from === undefined) implicitCoreSelections.add(entry.id)
53
+ }
54
+
55
+ const selectedSources = new Map<string, ModuleFactSource>()
56
+ for (const [moduleId, matches] of duplicates) {
57
+ const providers = [...new Set(matches.map((source) => source.from ?? '<unknown>'))]
58
+ .sort((left, right) => left.localeCompare(right))
59
+ const configuredProviders = [...(selectedProviders.get(moduleId) ?? [])]
60
+ .sort((left, right) => left.localeCompare(right))
61
+ const selected = configuredProviders.length === 1
62
+ ? matches.filter((source) => source.from === configuredProviders[0])
63
+ : []
64
+
65
+ if (selected.length !== 1) {
66
+ const configured = configuredProviders.length > 0
67
+ ? implicitCoreSelections.has(moduleId)
68
+ ? '; src/modules.ts omits "from", which defaults to @open-mercato/core'
69
+ : `; src/modules.ts selects ${configuredProviders.join(', ')}`
70
+ : '; src/modules.ts does not select a provider'
71
+ throw new Error(
72
+ `[module-facts] duplicate module id "${moduleId}" is provided by ${providers.join(', ')}${configured}. `
73
+ + 'Select exactly one matching provider in src/modules.ts.',
74
+ )
75
+ }
76
+ selectedSources.set(moduleId, selected[0])
77
+ }
78
+
79
+ const emitted = new Set<string>()
34
80
  const result: ModuleFactSource[] = []
35
81
  for (const source of sources) {
36
- if (seen.has(source.moduleId)) continue
37
- seen.add(source.moduleId)
38
- result.push(source)
82
+ if (emitted.has(source.moduleId)) continue
83
+ emitted.add(source.moduleId)
84
+ result.push(selectedSources.get(source.moduleId) ?? source)
39
85
  }
40
86
  return result
41
87
  }
@@ -51,8 +97,59 @@ export function discoverPackageModuleSources(resolver: PackageResolver): ModuleF
51
97
  for (const discovered of discoverModulesInPackage(pkg.path)) {
52
98
  const moduleRoot = path.join(pkg.modulesPath, discovered.moduleId)
53
99
  if (!hasReadableModuleSource(moduleRoot)) continue
54
- sources.push({ moduleId: discovered.moduleId, moduleRoot, from: pkg.name })
100
+ sources.push({
101
+ moduleId: discovered.moduleId,
102
+ moduleRoot,
103
+ from: pkg.name,
104
+ packageVersion: pkg.version ?? null,
105
+ })
55
106
  }
56
107
  }
57
- return dedupeById(sources)
108
+ return resolveDuplicateModuleIds(sources, resolver)
109
+ }
110
+
111
+ /** App-local modules always live under this app-root-relative directory. */
112
+ export const LOCAL_MODULES_DIRECTORY = path.posix.join('src', 'modules')
113
+
114
+ /**
115
+ * Locates an app-local module that is projected into the reference bundle rather than the
116
+ * normal package outputs. `appRoot` is the directory containing `src/modules` — the
117
+ * create-app template root at build time, the generated app root at scaffold and
118
+ * `agentic:init` time — so the same module yields the same portable `src/modules/<id>`
119
+ * provenance from every root. Returns `null` when the module is absent or is not readable
120
+ * TypeScript source, because a reference bundle built from an unreadable root would claim
121
+ * an empty surface rather than fail.
122
+ */
123
+ export function discoverLocalReferenceModuleSource(options: {
124
+ appRoot: string
125
+ moduleId: string
126
+ }): ModuleFactSource | null {
127
+ const moduleRoot = path.join(options.appRoot, 'src', 'modules', options.moduleId)
128
+ if (!hasReadableModuleSource(moduleRoot)) return null
129
+ return {
130
+ moduleId: options.moduleId,
131
+ moduleRoot,
132
+ portableSourceRoot: path.posix.join(LOCAL_MODULES_DIRECTORY, options.moduleId),
133
+ sourceKind: 'local-reference',
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Appends the local reference source to the package batch, rejecting a duplicate module
139
+ * id *before* assignment. A package that already provides the same id would otherwise be
140
+ * silently replaced by (or silently replace) the app-local projection, and the emitted
141
+ * bundle would attribute one module's surfaces to the other's source tree.
142
+ */
143
+ export function appendLocalReferenceModuleSource(
144
+ packageSources: readonly ModuleFactSource[],
145
+ reference: ModuleFactSource,
146
+ ): ModuleFactSource[] {
147
+ const conflict = packageSources.find((source) => source.moduleId === reference.moduleId)
148
+ if (conflict) {
149
+ throw new Error(
150
+ `[module-facts] local reference module "${reference.moduleId}" collides with the module provided by `
151
+ + `${conflict.from ?? '<unknown package>'}. Rename the app-local module or remove the package providing it.`,
152
+ )
153
+ }
154
+ return [...packageSources, reference]
58
155
  }