@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.
- package/.turbo/turbo-build.log +6 -2
- package/dist/agentic/github-copilot/copilot-instructions.md.template +37 -0
- package/dist/agentic/github-copilot/instructions/entity-guard.instructions.md +27 -0
- package/dist/agentic/github-copilot/instructions/generated-guard.instructions.md +10 -0
- package/dist/agentic/github-copilot/mcp.json.example +13 -0
- package/dist/agentic/guides/module-facts.json +11527 -283
- package/dist/agentic/guides/module-facts.v2.json +11527 -283
- package/dist/agentic/guides/modules/agent_orchestrator/acl-features.md +31 -0
- package/dist/agentic/guides/modules/agent_orchestrator/active-extension-bindings.md +12 -0
- package/dist/agentic/guides/modules/agent_orchestrator/ai-agents.md +12 -0
- package/dist/agentic/guides/modules/agent_orchestrator/ai-tools-mcp-capabilities.md +13 -0
- package/dist/agentic/guides/modules/agent_orchestrator/backend-pages.md +28 -0
- package/dist/agentic/guides/modules/agent_orchestrator/cli-commands.md +14 -0
- package/dist/agentic/guides/modules/agent_orchestrator/contribution-resolutions.md +49 -0
- package/dist/agentic/guides/modules/agent_orchestrator/di-registrations-rich.md +42 -0
- package/dist/agentic/guides/modules/agent_orchestrator/di-service-tokens.md +24 -0
- package/dist/agentic/guides/modules/agent_orchestrator/domain-commands.md +28 -0
- package/dist/agentic/guides/modules/agent_orchestrator/encryption.md +20 -0
- package/dist/agentic/guides/modules/agent_orchestrator/entities.md +31 -0
- package/dist/agentic/guides/modules/agent_orchestrator/events.md +38 -0
- package/dist/agentic/guides/modules/agent_orchestrator/exact-override-targets.md +122 -0
- package/dist/agentic/guides/modules/agent_orchestrator/host-extension-points.md +10 -0
- package/dist/agentic/guides/modules/agent_orchestrator/index.md +31 -0
- package/dist/agentic/guides/modules/agent_orchestrator/owned-contract-module-metadata.md +11 -0
- package/dist/agentic/guides/modules/agent_orchestrator/setup.md +11 -0
- package/dist/agentic/guides/modules/agent_orchestrator/umes-contributions.md +49 -0
- package/dist/agentic/guides/modules/agent_orchestrator/umes-hosts.md +61 -0
- package/dist/agentic/guides/modules/agent_orchestrator/workers.md +14 -0
- package/dist/agentic/guides/modules/ai_assistant/di-registrations-rich.md +3 -2
- package/dist/agentic/guides/modules/ai_assistant/di-service-tokens.md +2 -1
- package/dist/agentic/guides/modules/ai_assistant/exact-override-targets.md +3 -2
- package/dist/agentic/guides/modules/ai_assistant/index.md +1 -1
- package/dist/agentic/guides/modules/api_docs/index.md +1 -1
- package/dist/agentic/guides/modules/api_keys/index.md +1 -1
- package/dist/agentic/guides/modules/attachments/index.md +1 -1
- package/dist/agentic/guides/modules/audit_logs/index.md +1 -1
- package/dist/agentic/guides/modules/auth/index.md +1 -1
- package/dist/agentic/guides/modules/business_rules/index.md +1 -1
- package/dist/agentic/guides/modules/catalog/index.md +1 -1
- package/dist/agentic/guides/modules/channel_apns/index.md +1 -1
- package/dist/agentic/guides/modules/channel_discord/index.md +1 -1
- package/dist/agentic/guides/modules/channel_expo/index.md +1 -1
- package/dist/agentic/guides/modules/channel_fcm/index.md +1 -1
- package/dist/agentic/guides/modules/channel_gmail/index.md +1 -1
- package/dist/agentic/guides/modules/channel_imap/index.md +1 -1
- package/dist/agentic/guides/modules/channel_resend/index.md +1 -1
- package/dist/agentic/guides/modules/channel_ses/index.md +1 -1
- package/dist/agentic/guides/modules/checkout/index.md +1 -1
- package/dist/agentic/guides/modules/communication_channels/index.md +1 -1
- package/dist/agentic/guides/modules/configs/index.md +1 -1
- package/dist/agentic/guides/modules/content/index.md +1 -1
- package/dist/agentic/guides/modules/currencies/index.md +1 -1
- package/dist/agentic/guides/modules/customer_accounts/cli-commands.md +11 -0
- package/dist/agentic/guides/modules/customer_accounts/exact-override-targets.md +5 -4
- package/dist/agentic/guides/modules/customer_accounts/index.md +3 -2
- package/dist/agentic/guides/modules/customer_accounts/setup.md +1 -1
- package/dist/agentic/guides/modules/customers/contribution-resolutions.md +1 -0
- package/dist/agentic/guides/modules/customers/exact-override-targets.md +1 -0
- package/dist/agentic/guides/modules/customers/incoming-installed-contributions.md +3 -0
- package/dist/agentic/guides/modules/customers/index.md +2 -2
- package/dist/agentic/guides/modules/customers/umes-contributions.md +1 -0
- package/dist/agentic/guides/modules/dashboards/index.md +1 -1
- package/dist/agentic/guides/modules/data_sync/index.md +1 -1
- package/dist/agentic/guides/modules/design_system/index.md +1 -1
- package/dist/agentic/guides/modules/devices/index.md +1 -1
- package/dist/agentic/guides/modules/dictionaries/index.md +1 -1
- package/dist/agentic/guides/modules/directory/index.md +1 -1
- package/dist/agentic/guides/modules/documents/index.md +1 -1
- package/dist/agentic/guides/modules/entities/index.md +1 -1
- package/dist/agentic/guides/modules/eudr/index.md +1 -1
- package/dist/agentic/guides/modules/events/index.md +1 -1
- package/dist/agentic/guides/modules/feature_toggles/index.md +1 -1
- package/dist/agentic/guides/modules/gateway_stripe/index.md +1 -1
- package/dist/agentic/guides/modules/generators/index.md +1 -1
- package/dist/agentic/guides/modules/inbox_ops/index.md +1 -1
- package/dist/agentic/guides/modules/integrations/index.md +1 -1
- package/dist/agentic/guides/modules/messages/index.md +1 -1
- package/dist/agentic/guides/modules/notifications/index.md +1 -1
- package/dist/agentic/guides/modules/onboarding/index.md +1 -1
- package/dist/agentic/guides/modules/payment_gateways/index.md +1 -1
- package/dist/agentic/guides/modules/perspectives/index.md +1 -1
- package/dist/agentic/guides/modules/phone_calls/index.md +1 -1
- package/dist/agentic/guides/modules/planner/index.md +1 -1
- package/dist/agentic/guides/modules/portal/index.md +1 -1
- package/dist/agentic/guides/modules/progress/index.md +1 -1
- package/dist/agentic/guides/modules/push_notifications/index.md +1 -1
- package/dist/agentic/guides/modules/query_index/index.md +1 -1
- package/dist/agentic/guides/modules/record_locks/index.md +1 -1
- package/dist/agentic/guides/modules/resources/index.md +1 -1
- package/dist/agentic/guides/modules/sales/index.md +1 -1
- package/dist/agentic/guides/modules/scheduler/index.md +1 -1
- package/dist/agentic/guides/modules/search/index.md +1 -1
- package/dist/agentic/guides/modules/security/index.md +1 -1
- package/dist/agentic/guides/modules/seeds/cli-commands.md +14 -0
- package/dist/agentic/guides/modules/seeds/exact-override-targets.md +14 -0
- package/dist/agentic/guides/modules/seeds/index.md +14 -0
- package/dist/agentic/guides/modules/seeds/owned-contract-module-metadata.md +11 -0
- package/dist/agentic/guides/modules/shipping_carriers/index.md +1 -1
- package/dist/agentic/guides/modules/sso/index.md +1 -1
- package/dist/agentic/guides/modules/staff/index.md +1 -1
- package/dist/agentic/guides/modules/storage_s3/index.md +1 -1
- package/dist/agentic/guides/modules/sync_akeneo/index.md +1 -1
- package/dist/agentic/guides/modules/sync_excel/index.md +1 -1
- package/dist/agentic/guides/modules/system_status_overlays/index.md +1 -1
- package/dist/agentic/guides/modules/tillio/index.md +1 -1
- package/dist/agentic/guides/modules/translations/index.md +1 -1
- package/dist/agentic/guides/modules/warranty_claims/index.md +1 -1
- package/dist/agentic/guides/modules/webhooks/index.md +1 -1
- package/dist/agentic/guides/modules/wms/index.md +1 -1
- package/dist/agentic/guides/modules/workflows/acl-features.md +11 -1
- package/dist/agentic/guides/modules/workflows/active-extension-bindings.md +4 -1
- package/dist/agentic/guides/modules/workflows/ai-tools-mcp-capabilities.md +17 -0
- package/dist/agentic/guides/modules/workflows/backend-pages.md +3 -0
- package/dist/agentic/guides/modules/workflows/contribution-resolutions.md +24 -0
- package/dist/agentic/guides/modules/workflows/di-registrations-rich.md +11 -7
- package/dist/agentic/guides/modules/workflows/di-service-tokens.md +11 -7
- package/dist/agentic/guides/modules/workflows/domain-commands.md +11 -0
- package/dist/agentic/guides/modules/workflows/entities.md +2 -0
- package/dist/agentic/guides/modules/workflows/events.md +14 -8
- package/dist/agentic/guides/modules/workflows/exact-override-targets.md +45 -10
- package/dist/agentic/guides/modules/workflows/frontend-pages.md +2 -0
- package/dist/agentic/guides/modules/workflows/incoming-installed-contributions.md +17 -0
- package/dist/agentic/guides/modules/workflows/index.md +15 -12
- package/dist/agentic/guides/modules/workflows/notifications.md +2 -0
- package/dist/agentic/guides/modules/workflows/setup.md +1 -1
- package/dist/agentic/guides/modules/workflows/umes-contributions.md +24 -0
- package/dist/agentic/guides/modules/workflows/umes-hosts.md +14 -6
- package/dist/agentic/guides/modules/workflows/workers.md +4 -1
- package/dist/agentic/guides/reference-module-facts.json +2 -2
- package/dist/agentic/guides/reference-modules/example/index.md +1 -1
- package/dist/agentic/guides/upstream/AGENTS.md +3 -1
- package/dist/agentic/guides/upstream/manifest.json +2 -2
- package/dist/agentic/shared/ai/harness/design-system-inventory.json +118 -106
- package/dist/agentic/shared/ai/harness/source-link-inventory.json +8 -8
- package/dist/lib/agentic-init.js +4 -0
- package/dist/lib/agentic-init.js.map +2 -2
- package/dist/lib/agentic-setup.js +19 -5
- package/dist/lib/agentic-setup.js.map +2 -2
- package/dist/lib/generators/extensions/agent-files.js +913 -0
- package/dist/lib/generators/extensions/agent-files.js.map +7 -0
- package/dist/lib/generators/extensions/index.js +2 -0
- package/dist/lib/generators/extensions/index.js.map +2 -2
- package/dist/lib/generators/index.js +3 -1
- package/dist/lib/generators/index.js.map +2 -2
- package/dist/lib/generators/module-registry.js +40 -11
- package/dist/lib/generators/module-registry.js.map +2 -2
- package/dist/lib/generators/route-collisions.js +35 -0
- package/dist/lib/generators/route-collisions.js.map +7 -0
- package/dist/lib/generators/web-research-adapters.js +95 -0
- package/dist/lib/generators/web-research-adapters.js.map +7 -0
- package/dist/mercato.js +5 -2
- package/dist/mercato.js.map +2 -2
- package/package.json +6 -6
- package/src/__tests__/agent-files.test.ts +199 -0
- package/src/__tests__/mercato.test.ts +14 -0
- package/src/lib/__tests__/agentic-init.test.ts +11 -0
- package/src/lib/__tests__/agentic-setup.ownership.test.ts +5 -0
- package/src/lib/agentic-init.ts +4 -0
- package/src/lib/agentic-setup.ts +30 -5
- package/src/lib/generators/__tests__/agent-files-extension.test.ts +477 -0
- package/src/lib/generators/__tests__/module-facts.bc-guard.test.ts +25 -8
- package/src/lib/generators/__tests__/route-collisions.test.ts +155 -0
- package/src/lib/generators/extensions/agent-files.ts +1332 -0
- package/src/lib/generators/extensions/index.ts +2 -0
- package/src/lib/generators/index.ts +1 -0
- package/src/lib/generators/module-registry.ts +66 -17
- package/src/lib/generators/route-collisions.ts +57 -0
- package/src/lib/generators/web-research-adapters.ts +133 -0
- 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...");
|