@open-mercato/cli 0.7.1-develop.7191.1.3c9346566b → 0.7.1-develop.7194.1.ab4fc81f82

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 (169) hide show
  1. package/.turbo/turbo-build.log +6 -2
  2. package/dist/agentic/github-copilot/copilot-instructions.md.template +37 -0
  3. package/dist/agentic/github-copilot/instructions/entity-guard.instructions.md +27 -0
  4. package/dist/agentic/github-copilot/instructions/generated-guard.instructions.md +10 -0
  5. package/dist/agentic/github-copilot/mcp.json.example +13 -0
  6. package/dist/agentic/guides/module-facts.json +11527 -283
  7. package/dist/agentic/guides/module-facts.v2.json +11527 -283
  8. package/dist/agentic/guides/modules/agent_orchestrator/acl-features.md +31 -0
  9. package/dist/agentic/guides/modules/agent_orchestrator/active-extension-bindings.md +12 -0
  10. package/dist/agentic/guides/modules/agent_orchestrator/ai-agents.md +12 -0
  11. package/dist/agentic/guides/modules/agent_orchestrator/ai-tools-mcp-capabilities.md +13 -0
  12. package/dist/agentic/guides/modules/agent_orchestrator/backend-pages.md +28 -0
  13. package/dist/agentic/guides/modules/agent_orchestrator/cli-commands.md +14 -0
  14. package/dist/agentic/guides/modules/agent_orchestrator/contribution-resolutions.md +49 -0
  15. package/dist/agentic/guides/modules/agent_orchestrator/di-registrations-rich.md +42 -0
  16. package/dist/agentic/guides/modules/agent_orchestrator/di-service-tokens.md +24 -0
  17. package/dist/agentic/guides/modules/agent_orchestrator/domain-commands.md +28 -0
  18. package/dist/agentic/guides/modules/agent_orchestrator/encryption.md +20 -0
  19. package/dist/agentic/guides/modules/agent_orchestrator/entities.md +31 -0
  20. package/dist/agentic/guides/modules/agent_orchestrator/events.md +38 -0
  21. package/dist/agentic/guides/modules/agent_orchestrator/exact-override-targets.md +122 -0
  22. package/dist/agentic/guides/modules/agent_orchestrator/host-extension-points.md +10 -0
  23. package/dist/agentic/guides/modules/agent_orchestrator/index.md +31 -0
  24. package/dist/agentic/guides/modules/agent_orchestrator/owned-contract-module-metadata.md +11 -0
  25. package/dist/agentic/guides/modules/agent_orchestrator/setup.md +11 -0
  26. package/dist/agentic/guides/modules/agent_orchestrator/umes-contributions.md +49 -0
  27. package/dist/agentic/guides/modules/agent_orchestrator/umes-hosts.md +61 -0
  28. package/dist/agentic/guides/modules/agent_orchestrator/workers.md +14 -0
  29. package/dist/agentic/guides/modules/ai_assistant/di-registrations-rich.md +3 -2
  30. package/dist/agentic/guides/modules/ai_assistant/di-service-tokens.md +2 -1
  31. package/dist/agentic/guides/modules/ai_assistant/exact-override-targets.md +3 -2
  32. package/dist/agentic/guides/modules/ai_assistant/index.md +1 -1
  33. package/dist/agentic/guides/modules/api_docs/index.md +1 -1
  34. package/dist/agentic/guides/modules/api_keys/index.md +1 -1
  35. package/dist/agentic/guides/modules/attachments/index.md +1 -1
  36. package/dist/agentic/guides/modules/audit_logs/index.md +1 -1
  37. package/dist/agentic/guides/modules/auth/index.md +1 -1
  38. package/dist/agentic/guides/modules/business_rules/index.md +1 -1
  39. package/dist/agentic/guides/modules/catalog/index.md +1 -1
  40. package/dist/agentic/guides/modules/channel_apns/index.md +1 -1
  41. package/dist/agentic/guides/modules/channel_discord/index.md +1 -1
  42. package/dist/agentic/guides/modules/channel_expo/index.md +1 -1
  43. package/dist/agentic/guides/modules/channel_fcm/index.md +1 -1
  44. package/dist/agentic/guides/modules/channel_gmail/index.md +1 -1
  45. package/dist/agentic/guides/modules/channel_imap/index.md +1 -1
  46. package/dist/agentic/guides/modules/channel_resend/index.md +1 -1
  47. package/dist/agentic/guides/modules/channel_ses/index.md +1 -1
  48. package/dist/agentic/guides/modules/checkout/index.md +1 -1
  49. package/dist/agentic/guides/modules/communication_channels/index.md +1 -1
  50. package/dist/agentic/guides/modules/configs/index.md +1 -1
  51. package/dist/agentic/guides/modules/content/index.md +1 -1
  52. package/dist/agentic/guides/modules/currencies/index.md +1 -1
  53. package/dist/agentic/guides/modules/customer_accounts/cli-commands.md +11 -0
  54. package/dist/agentic/guides/modules/customer_accounts/exact-override-targets.md +5 -4
  55. package/dist/agentic/guides/modules/customer_accounts/index.md +3 -2
  56. package/dist/agentic/guides/modules/customer_accounts/setup.md +1 -1
  57. package/dist/agentic/guides/modules/customers/contribution-resolutions.md +1 -0
  58. package/dist/agentic/guides/modules/customers/exact-override-targets.md +1 -0
  59. package/dist/agentic/guides/modules/customers/incoming-installed-contributions.md +3 -0
  60. package/dist/agentic/guides/modules/customers/index.md +2 -2
  61. package/dist/agentic/guides/modules/customers/umes-contributions.md +1 -0
  62. package/dist/agentic/guides/modules/dashboards/index.md +1 -1
  63. package/dist/agentic/guides/modules/data_sync/index.md +1 -1
  64. package/dist/agentic/guides/modules/design_system/index.md +1 -1
  65. package/dist/agentic/guides/modules/devices/index.md +1 -1
  66. package/dist/agentic/guides/modules/dictionaries/index.md +1 -1
  67. package/dist/agentic/guides/modules/directory/index.md +1 -1
  68. package/dist/agentic/guides/modules/documents/index.md +1 -1
  69. package/dist/agentic/guides/modules/entities/index.md +1 -1
  70. package/dist/agentic/guides/modules/eudr/index.md +1 -1
  71. package/dist/agentic/guides/modules/events/index.md +1 -1
  72. package/dist/agentic/guides/modules/feature_toggles/index.md +1 -1
  73. package/dist/agentic/guides/modules/gateway_stripe/index.md +1 -1
  74. package/dist/agentic/guides/modules/generators/index.md +1 -1
  75. package/dist/agentic/guides/modules/inbox_ops/index.md +1 -1
  76. package/dist/agentic/guides/modules/integrations/index.md +1 -1
  77. package/dist/agentic/guides/modules/messages/index.md +1 -1
  78. package/dist/agentic/guides/modules/notifications/index.md +1 -1
  79. package/dist/agentic/guides/modules/onboarding/index.md +1 -1
  80. package/dist/agentic/guides/modules/payment_gateways/index.md +1 -1
  81. package/dist/agentic/guides/modules/perspectives/index.md +1 -1
  82. package/dist/agentic/guides/modules/phone_calls/index.md +1 -1
  83. package/dist/agentic/guides/modules/planner/index.md +1 -1
  84. package/dist/agentic/guides/modules/portal/index.md +1 -1
  85. package/dist/agentic/guides/modules/progress/index.md +1 -1
  86. package/dist/agentic/guides/modules/push_notifications/index.md +1 -1
  87. package/dist/agentic/guides/modules/query_index/index.md +1 -1
  88. package/dist/agentic/guides/modules/record_locks/index.md +1 -1
  89. package/dist/agentic/guides/modules/resources/index.md +1 -1
  90. package/dist/agentic/guides/modules/sales/index.md +1 -1
  91. package/dist/agentic/guides/modules/scheduler/index.md +1 -1
  92. package/dist/agentic/guides/modules/search/index.md +1 -1
  93. package/dist/agentic/guides/modules/security/index.md +1 -1
  94. package/dist/agentic/guides/modules/seeds/cli-commands.md +14 -0
  95. package/dist/agentic/guides/modules/seeds/exact-override-targets.md +14 -0
  96. package/dist/agentic/guides/modules/seeds/index.md +14 -0
  97. package/dist/agentic/guides/modules/seeds/owned-contract-module-metadata.md +11 -0
  98. package/dist/agentic/guides/modules/shipping_carriers/index.md +1 -1
  99. package/dist/agentic/guides/modules/sso/index.md +1 -1
  100. package/dist/agentic/guides/modules/staff/index.md +1 -1
  101. package/dist/agentic/guides/modules/storage_s3/index.md +1 -1
  102. package/dist/agentic/guides/modules/sync_akeneo/index.md +1 -1
  103. package/dist/agentic/guides/modules/sync_excel/index.md +1 -1
  104. package/dist/agentic/guides/modules/system_status_overlays/index.md +1 -1
  105. package/dist/agentic/guides/modules/tillio/index.md +1 -1
  106. package/dist/agentic/guides/modules/translations/index.md +1 -1
  107. package/dist/agentic/guides/modules/warranty_claims/index.md +1 -1
  108. package/dist/agentic/guides/modules/webhooks/index.md +1 -1
  109. package/dist/agentic/guides/modules/wms/index.md +1 -1
  110. package/dist/agentic/guides/modules/workflows/acl-features.md +11 -1
  111. package/dist/agentic/guides/modules/workflows/active-extension-bindings.md +4 -1
  112. package/dist/agentic/guides/modules/workflows/ai-tools-mcp-capabilities.md +17 -0
  113. package/dist/agentic/guides/modules/workflows/backend-pages.md +3 -0
  114. package/dist/agentic/guides/modules/workflows/contribution-resolutions.md +24 -0
  115. package/dist/agentic/guides/modules/workflows/di-registrations-rich.md +11 -7
  116. package/dist/agentic/guides/modules/workflows/di-service-tokens.md +11 -7
  117. package/dist/agentic/guides/modules/workflows/domain-commands.md +11 -0
  118. package/dist/agentic/guides/modules/workflows/entities.md +2 -0
  119. package/dist/agentic/guides/modules/workflows/events.md +14 -8
  120. package/dist/agentic/guides/modules/workflows/exact-override-targets.md +45 -10
  121. package/dist/agentic/guides/modules/workflows/frontend-pages.md +2 -0
  122. package/dist/agentic/guides/modules/workflows/incoming-installed-contributions.md +17 -0
  123. package/dist/agentic/guides/modules/workflows/index.md +15 -12
  124. package/dist/agentic/guides/modules/workflows/notifications.md +2 -0
  125. package/dist/agentic/guides/modules/workflows/setup.md +1 -1
  126. package/dist/agentic/guides/modules/workflows/umes-contributions.md +24 -0
  127. package/dist/agentic/guides/modules/workflows/umes-hosts.md +14 -6
  128. package/dist/agentic/guides/modules/workflows/workers.md +4 -1
  129. package/dist/agentic/guides/reference-module-facts.json +2 -2
  130. package/dist/agentic/guides/reference-modules/example/index.md +1 -1
  131. package/dist/agentic/guides/upstream/AGENTS.md +3 -1
  132. package/dist/agentic/guides/upstream/manifest.json +2 -2
  133. package/dist/agentic/shared/ai/harness/design-system-inventory.json +118 -106
  134. package/dist/agentic/shared/ai/harness/source-link-inventory.json +8 -8
  135. package/dist/lib/agentic-init.js +4 -0
  136. package/dist/lib/agentic-init.js.map +2 -2
  137. package/dist/lib/agentic-setup.js +19 -5
  138. package/dist/lib/agentic-setup.js.map +2 -2
  139. package/dist/lib/generators/extensions/agent-files.js +913 -0
  140. package/dist/lib/generators/extensions/agent-files.js.map +7 -0
  141. package/dist/lib/generators/extensions/index.js +2 -0
  142. package/dist/lib/generators/extensions/index.js.map +2 -2
  143. package/dist/lib/generators/index.js +3 -1
  144. package/dist/lib/generators/index.js.map +2 -2
  145. package/dist/lib/generators/module-registry.js +40 -11
  146. package/dist/lib/generators/module-registry.js.map +2 -2
  147. package/dist/lib/generators/route-collisions.js +35 -0
  148. package/dist/lib/generators/route-collisions.js.map +7 -0
  149. package/dist/lib/generators/web-research-adapters.js +95 -0
  150. package/dist/lib/generators/web-research-adapters.js.map +7 -0
  151. package/dist/mercato.js +5 -2
  152. package/dist/mercato.js.map +2 -2
  153. package/package.json +6 -6
  154. package/src/__tests__/agent-files.test.ts +199 -0
  155. package/src/__tests__/mercato.test.ts +14 -0
  156. package/src/lib/__tests__/agentic-init.test.ts +11 -0
  157. package/src/lib/__tests__/agentic-setup.ownership.test.ts +5 -0
  158. package/src/lib/agentic-init.ts +4 -0
  159. package/src/lib/agentic-setup.ts +30 -5
  160. package/src/lib/generators/__tests__/agent-files-extension.test.ts +477 -0
  161. package/src/lib/generators/__tests__/module-facts.bc-guard.test.ts +25 -8
  162. package/src/lib/generators/__tests__/route-collisions.test.ts +155 -0
  163. package/src/lib/generators/extensions/agent-files.ts +1332 -0
  164. package/src/lib/generators/extensions/index.ts +2 -0
  165. package/src/lib/generators/index.ts +1 -0
  166. package/src/lib/generators/module-registry.ts +66 -17
  167. package/src/lib/generators/route-collisions.ts +57 -0
  168. package/src/lib/generators/web-research-adapters.ts +133 -0
  169. package/src/mercato.ts +4 -1
@@ -0,0 +1,35 @@
1
+ function detectBackendRouteCollisions(registrations) {
2
+ const byPath = /* @__PURE__ */ new Map();
3
+ for (const registration of registrations) {
4
+ const existing = byPath.get(registration.routePath);
5
+ if (existing) existing.push(registration);
6
+ else byPath.set(registration.routePath, [registration]);
7
+ }
8
+ const errors = [];
9
+ const notes = [];
10
+ for (const [routePath, entries] of byPath) {
11
+ const moduleIds = new Set(entries.map((entry) => entry.moduleId));
12
+ if (moduleIds.size < 2) continue;
13
+ const packageModuleIds = Array.from(
14
+ new Set(entries.filter((entry) => entry.packageSourced).map((entry) => entry.moduleId))
15
+ ).sort((a, b) => a.localeCompare(b));
16
+ if (packageModuleIds.length >= 2) {
17
+ errors.push(
18
+ `Backend route "${routePath}" is registered by ${packageModuleIds.length} package modules: ${packageModuleIds.map((id) => `"${id}"`).join(", ")}. Duplicate backend paths between package modules are always a bug \u2014 rename one module's page directory.`
19
+ );
20
+ continue;
21
+ }
22
+ const appModuleIds = Array.from(
23
+ new Set(entries.filter((entry) => !entry.packageSourced).map((entry) => entry.moduleId))
24
+ ).sort((a, b) => a.localeCompare(b));
25
+ const shadowedId = packageModuleIds[0];
26
+ notes.push(
27
+ shadowedId ? `Backend route "${routePath}" from package module "${shadowedId}" is shadowed by app module(s) ${appModuleIds.map((id) => `"${id}"`).join(", ")} (intentional override mechanism).` : `Backend route "${routePath}" is registered by multiple app modules: ${appModuleIds.map((id) => `"${id}"`).join(", ")}.`
28
+ );
29
+ }
30
+ return { errors, notes };
31
+ }
32
+ export {
33
+ detectBackendRouteCollisions
34
+ };
35
+ //# sourceMappingURL=route-collisions.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/lib/generators/route-collisions.ts"],
4
+ "sourcesContent": ["export type BackendRouteRegistration = {\n routePath: string\n moduleId: string\n packageSourced: boolean\n}\n\nexport type BackendRouteCollisionResult = {\n errors: string[]\n notes: string[]\n}\n\nexport function detectBackendRouteCollisions(\n registrations: BackendRouteRegistration[],\n): BackendRouteCollisionResult {\n const byPath = new Map<string, BackendRouteRegistration[]>()\n for (const registration of registrations) {\n const existing = byPath.get(registration.routePath)\n if (existing) existing.push(registration)\n else byPath.set(registration.routePath, [registration])\n }\n\n const errors: string[] = []\n const notes: string[] = []\n for (const [routePath, entries] of byPath) {\n const moduleIds = new Set(entries.map((entry) => entry.moduleId))\n if (moduleIds.size < 2) continue\n\n const packageModuleIds = Array.from(\n new Set(entries.filter((entry) => entry.packageSourced).map((entry) => entry.moduleId)),\n ).sort((a, b) => a.localeCompare(b))\n\n if (packageModuleIds.length >= 2) {\n errors.push(\n `Backend route \"${routePath}\" is registered by ${packageModuleIds.length} package modules: ${packageModuleIds\n .map((id) => `\"${id}\"`)\n .join(', ')}. Duplicate backend paths between package modules are always a bug \u2014 rename one module's page directory.`,\n )\n continue\n }\n\n const appModuleIds = Array.from(\n new Set(entries.filter((entry) => !entry.packageSourced).map((entry) => entry.moduleId)),\n ).sort((a, b) => a.localeCompare(b))\n const shadowedId = packageModuleIds[0]\n notes.push(\n shadowedId\n ? `Backend route \"${routePath}\" from package module \"${shadowedId}\" is shadowed by app module(s) ${appModuleIds\n .map((id) => `\"${id}\"`)\n .join(', ')} (intentional override mechanism).`\n : `Backend route \"${routePath}\" is registered by multiple app modules: ${appModuleIds\n .map((id) => `\"${id}\"`)\n .join(', ')}.`,\n )\n }\n\n return { errors, notes }\n}\n"],
5
+ "mappings": "AAWO,SAAS,6BACd,eAC6B;AAC7B,QAAM,SAAS,oBAAI,IAAwC;AAC3D,aAAW,gBAAgB,eAAe;AACxC,UAAM,WAAW,OAAO,IAAI,aAAa,SAAS;AAClD,QAAI,SAAU,UAAS,KAAK,YAAY;AAAA,QACnC,QAAO,IAAI,aAAa,WAAW,CAAC,YAAY,CAAC;AAAA,EACxD;AAEA,QAAM,SAAmB,CAAC;AAC1B,QAAM,QAAkB,CAAC;AACzB,aAAW,CAAC,WAAW,OAAO,KAAK,QAAQ;AACzC,UAAM,YAAY,IAAI,IAAI,QAAQ,IAAI,CAAC,UAAU,MAAM,QAAQ,CAAC;AAChE,QAAI,UAAU,OAAO,EAAG;AAExB,UAAM,mBAAmB,MAAM;AAAA,MAC7B,IAAI,IAAI,QAAQ,OAAO,CAAC,UAAU,MAAM,cAAc,EAAE,IAAI,CAAC,UAAU,MAAM,QAAQ,CAAC;AAAA,IACxF,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AAEnC,QAAI,iBAAiB,UAAU,GAAG;AAChC,aAAO;AAAA,QACL,kBAAkB,SAAS,sBAAsB,iBAAiB,MAAM,qBAAqB,iBAC1F,IAAI,CAAC,OAAO,IAAI,EAAE,GAAG,EACrB,KAAK,IAAI,CAAC;AAAA,MACf;AACA;AAAA,IACF;AAEA,UAAM,eAAe,MAAM;AAAA,MACzB,IAAI,IAAI,QAAQ,OAAO,CAAC,UAAU,CAAC,MAAM,cAAc,EAAE,IAAI,CAAC,UAAU,MAAM,QAAQ,CAAC;AAAA,IACzF,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,cAAc,CAAC,CAAC;AACnC,UAAM,aAAa,iBAAiB,CAAC;AACrC,UAAM;AAAA,MACJ,aACI,kBAAkB,SAAS,0BAA0B,UAAU,kCAAkC,aAC9F,IAAI,CAAC,OAAO,IAAI,EAAE,GAAG,EACrB,KAAK,IAAI,CAAC,uCACb,kBAAkB,SAAS,4CAA4C,aACpE,IAAI,CAAC,OAAO,IAAI,EAAE,GAAG,EACrB,KAAK,IAAI,CAAC;AAAA,IACnB;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,MAAM;AACzB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,95 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { calculateStructureChecksum, createGeneratorResult, writeGeneratedFile } from "../utils.js";
4
+ const MANIFEST_NAMESPACE = "openMercato";
5
+ const ADAPTER_MANIFEST_KEY = "webResearchAdapter";
6
+ function readJson(file) {
7
+ try {
8
+ return JSON.parse(fs.readFileSync(file, "utf8"));
9
+ } catch {
10
+ return null;
11
+ }
12
+ }
13
+ function readManifest(packageJsonPath) {
14
+ const parsed = readJson(packageJsonPath);
15
+ if (typeof parsed !== "object" || parsed === null) return null;
16
+ const pkg = parsed;
17
+ const namespace = pkg[MANIFEST_NAMESPACE];
18
+ if (typeof namespace !== "object" || namespace === null) return null;
19
+ const manifest = namespace[ADAPTER_MANIFEST_KEY];
20
+ if (typeof manifest !== "object" || manifest === null) return null;
21
+ const adapterId = manifest.id;
22
+ const packageName = pkg.name;
23
+ if (typeof packageName !== "string" || packageName.length === 0) return null;
24
+ if (typeof adapterId !== "string" || adapterId.length === 0) return null;
25
+ return { packageName, adapterId, sourceRoot: path.dirname(packageJsonPath) };
26
+ }
27
+ function scanDirectory(root, results) {
28
+ if (!fs.existsSync(root)) return;
29
+ let entries;
30
+ try {
31
+ entries = fs.readdirSync(root, { withFileTypes: true });
32
+ } catch {
33
+ return;
34
+ }
35
+ for (const entry of entries) {
36
+ if (!entry.isDirectory() && !entry.isSymbolicLink()) continue;
37
+ if (entry.name === ".bin" || entry.name === ".cache") continue;
38
+ const child = path.join(root, entry.name);
39
+ if (entry.name.startsWith("@")) {
40
+ scanDirectory(child, results);
41
+ continue;
42
+ }
43
+ const discovered = readManifest(path.join(child, "package.json"));
44
+ if (discovered && !results.has(discovered.packageName)) results.set(discovered.packageName, discovered);
45
+ }
46
+ }
47
+ function identifierFor(index) {
48
+ return `adapter${index}`;
49
+ }
50
+ async function generateWebResearchAdapters(options) {
51
+ const { resolver, quiet } = options;
52
+ const result = createGeneratorResult();
53
+ const outputDir = resolver.getOutputDir();
54
+ const outFile = path.join(outputDir, "web-research-adapters.generated.ts");
55
+ const checksumFile = path.join(outputDir, "web-research-adapters.checksum");
56
+ const appDir = resolver.getAppDir();
57
+ const repoRoot = path.resolve(appDir, "..", "..");
58
+ const discovered = /* @__PURE__ */ new Map();
59
+ const scanRoots = [
60
+ path.join(repoRoot, "packages"),
61
+ path.join(repoRoot, "node_modules"),
62
+ path.join(appDir, "node_modules")
63
+ ];
64
+ for (const root of scanRoots) scanDirectory(root, discovered);
65
+ const adapters = [...discovered.values()].sort(
66
+ (left, right) => left.packageName.localeCompare(right.packageName)
67
+ );
68
+ const imports = adapters.map((adapter, index) => `import * as ${identifierFor(index)} from '${adapter.packageName}'`).join("\n");
69
+ const entries = adapters.map(
70
+ (adapter, index) => ` { packageName: '${adapter.packageName}', module: ${identifierFor(index)} },`
71
+ ).join("\n");
72
+ const content = `// AUTO-GENERATED \u2014 do not edit by hand.
73
+ // Source: packages declaring \`${MANIFEST_NAMESPACE}.${ADAPTER_MANIFEST_KEY}\` in package.json.
74
+ // Regenerate with: yarn generate
75
+ import type { AdapterRegistryEntry } from '@open-mercato/web-research'
76
+ ${imports}
77
+
78
+ export const webResearchAdapterEntries: AdapterRegistryEntry[] = [
79
+ ${entries}
80
+ ]
81
+ `;
82
+ writeGeneratedFile({
83
+ outFile,
84
+ checksumFile,
85
+ content,
86
+ structureChecksum: calculateStructureChecksum(adapters.map((adapter) => adapter.sourceRoot)),
87
+ result,
88
+ quiet
89
+ });
90
+ return result;
91
+ }
92
+ export {
93
+ generateWebResearchAdapters
94
+ };
95
+ //# sourceMappingURL=web-research-adapters.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/lib/generators/web-research-adapters.ts"],
4
+ "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport type { PackageResolver } from '../resolver'\nimport { calculateStructureChecksum, createGeneratorResult, type GeneratorResult, writeGeneratedFile } from '../utils'\n\nexport interface WebResearchAdaptersOptions {\n resolver: PackageResolver\n quiet?: boolean\n}\n\n/**\n * Mirrors `openMercato.webResearchAdapter` in `@open-mercato/web-research`. It is\n * duplicated rather than imported because the CLI must not depend on the engine\n * package to run its generators.\n */\nconst MANIFEST_NAMESPACE = 'openMercato'\nconst ADAPTER_MANIFEST_KEY = 'webResearchAdapter'\n\ntype DiscoveredAdapter = {\n packageName: string\n adapterId: string\n sourceRoot: string\n}\n\nfunction readJson(file: string): unknown {\n try {\n return JSON.parse(fs.readFileSync(file, 'utf8'))\n } catch {\n return null\n }\n}\n\nfunction readManifest(packageJsonPath: string): DiscoveredAdapter | null {\n const parsed = readJson(packageJsonPath)\n if (typeof parsed !== 'object' || parsed === null) return null\n const pkg = parsed as Record<string, unknown>\n const namespace = pkg[MANIFEST_NAMESPACE]\n if (typeof namespace !== 'object' || namespace === null) return null\n const manifest = (namespace as Record<string, unknown>)[ADAPTER_MANIFEST_KEY]\n if (typeof manifest !== 'object' || manifest === null) return null\n const adapterId = (manifest as Record<string, unknown>).id\n const packageName = pkg.name\n if (typeof packageName !== 'string' || packageName.length === 0) return null\n if (typeof adapterId !== 'string' || adapterId.length === 0) return null\n return { packageName, adapterId, sourceRoot: path.dirname(packageJsonPath) }\n}\n\nfunction scanDirectory(root: string, results: Map<string, DiscoveredAdapter>): void {\n if (!fs.existsSync(root)) return\n let entries: fs.Dirent[]\n try {\n entries = fs.readdirSync(root, { withFileTypes: true })\n } catch {\n return\n }\n for (const entry of entries) {\n if (!entry.isDirectory() && !entry.isSymbolicLink()) continue\n if (entry.name === '.bin' || entry.name === '.cache') continue\n const child = path.join(root, entry.name)\n // Scoped packages nest one level deeper (`@scope/name`).\n if (entry.name.startsWith('@')) {\n scanDirectory(child, results)\n continue\n }\n const discovered = readManifest(path.join(child, 'package.json'))\n if (discovered && !results.has(discovered.packageName)) results.set(discovered.packageName, discovered)\n }\n}\n\nfunction identifierFor(index: number): string {\n return `adapter${index}`\n}\n\n/**\n * Emits the statically imported adapter registry. Discovery happens here, at\n * build time, because a bundler cannot follow `import()` with a runtime-computed\n * specifier \u2014 a dynamic registry would resolve to nothing under Turbopack.\n */\nexport async function generateWebResearchAdapters(\n options: WebResearchAdaptersOptions,\n): Promise<GeneratorResult> {\n const { resolver, quiet } = options\n const result = createGeneratorResult()\n const outputDir = resolver.getOutputDir()\n const outFile = path.join(outputDir, 'web-research-adapters.generated.ts')\n const checksumFile = path.join(outputDir, 'web-research-adapters.checksum')\n\n const appDir = resolver.getAppDir()\n const repoRoot = path.resolve(appDir, '..', '..')\n const discovered = new Map<string, DiscoveredAdapter>()\n const scanRoots = [\n path.join(repoRoot, 'packages'),\n path.join(repoRoot, 'node_modules'),\n path.join(appDir, 'node_modules'),\n ]\n for (const root of scanRoots) scanDirectory(root, discovered)\n\n const adapters = [...discovered.values()].sort((left, right) =>\n left.packageName.localeCompare(right.packageName),\n )\n\n const imports = adapters\n .map((adapter, index) => `import * as ${identifierFor(index)} from '${adapter.packageName}'`)\n .join('\\n')\n const entries = adapters\n .map(\n (adapter, index) =>\n ` { packageName: '${adapter.packageName}', module: ${identifierFor(index)} },`,\n )\n .join('\\n')\n\n const content = `// AUTO-GENERATED \u2014 do not edit by hand.\n// Source: packages declaring \\`${MANIFEST_NAMESPACE}.${ADAPTER_MANIFEST_KEY}\\` in package.json.\n// Regenerate with: yarn generate\nimport type { AdapterRegistryEntry } from '@open-mercato/web-research'\n${imports}\n\nexport const webResearchAdapterEntries: AdapterRegistryEntry[] = [\n${entries}\n]\n`\n\n writeGeneratedFile({\n outFile,\n checksumFile,\n content,\n structureChecksum: calculateStructureChecksum(adapters.map((adapter) => adapter.sourceRoot)),\n result,\n quiet,\n })\n\n return result\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/dist/mercato.js CHANGED
@@ -573,7 +573,8 @@ async function runGeneratorSuite(quiet) {
573
573
  generateModuleEntities,
574
574
  generateModuleDi,
575
575
  generateModulePackageSources,
576
- generateOpenApi
576
+ generateOpenApi,
577
+ generateWebResearchAdapters
577
578
  } = await import("./lib/generators/index.js");
578
579
  const resolver = createResolver();
579
580
  const results = [
@@ -582,6 +583,7 @@ async function runGeneratorSuite(quiet) {
582
583
  await generateModuleEntities({ resolver, quiet }),
583
584
  await generateModuleDi({ resolver, quiet }),
584
585
  await generateModulePackageSources({ resolver, quiet }),
586
+ await generateWebResearchAdapters({ resolver, quiet }),
585
587
  await generateOpenApi({ resolver, quiet })
586
588
  ];
587
589
  return results.some((result) => (result?.filesWritten.length ?? 0) > 0);
@@ -841,13 +843,14 @@ async function run(argv = process.argv) {
841
843
  }
842
844
  console.log("\u{1F527} Preparing modules (registry, entities, DI)...");
843
845
  const { createResolver } = await import("./lib/resolver.js");
844
- const { generateEntityIds, generateModuleRegistries, generateModuleEntities, generateModuleDi, generateModulePackageSources, generateOpenApi } = await import("./lib/generators/index.js");
846
+ const { generateEntityIds, generateModuleRegistries, generateModuleEntities, generateModuleDi, generateModulePackageSources, generateOpenApi, generateWebResearchAdapters } = await import("./lib/generators/index.js");
845
847
  const resolver = createResolver();
846
848
  await generateEntityIds({ resolver, quiet: true });
847
849
  await generateModuleRegistries({ resolver, quiet: true });
848
850
  await generateModuleEntities({ resolver, quiet: true });
849
851
  await generateModuleDi({ resolver, quiet: true });
850
852
  await generateModulePackageSources({ resolver, quiet: true });
853
+ await generateWebResearchAdapters({ resolver, quiet: true });
851
854
  await generateOpenApi({ resolver, quiet: true });
852
855
  console.log("\u2705 Modules prepared\n");
853
856
  console.log("\u{1F4CA} Applying database migrations...");