@soleri/forge 0.0.1 → 4.0.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 (128) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/README.md +199 -0
  3. package/dist/facades/forge.facade.d.ts +9 -0
  4. package/dist/facades/forge.facade.js +134 -0
  5. package/dist/facades/forge.facade.js.map +1 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.js +81 -0
  8. package/dist/index.js.map +1 -0
  9. package/dist/knowledge-installer.d.ts +31 -0
  10. package/dist/knowledge-installer.js +437 -0
  11. package/dist/knowledge-installer.js.map +1 -0
  12. package/dist/scaffolder.d.ts +13 -0
  13. package/dist/scaffolder.js +330 -0
  14. package/dist/scaffolder.js.map +1 -0
  15. package/dist/templates/activate.d.ts +9 -0
  16. package/dist/templates/activate.js +139 -0
  17. package/dist/templates/activate.js.map +1 -0
  18. package/dist/templates/brain.d.ts +6 -0
  19. package/dist/templates/brain.js +478 -0
  20. package/dist/templates/brain.js.map +1 -0
  21. package/dist/templates/claude-md-template.d.ts +11 -0
  22. package/dist/templates/claude-md-template.js +73 -0
  23. package/dist/templates/claude-md-template.js.map +1 -0
  24. package/dist/templates/core-facade.d.ts +6 -0
  25. package/dist/templates/core-facade.js +456 -0
  26. package/dist/templates/core-facade.js.map +1 -0
  27. package/dist/templates/domain-facade.d.ts +7 -0
  28. package/dist/templates/domain-facade.js +119 -0
  29. package/dist/templates/domain-facade.js.map +1 -0
  30. package/dist/templates/entry-point.d.ts +5 -0
  31. package/dist/templates/entry-point.js +116 -0
  32. package/dist/templates/entry-point.js.map +1 -0
  33. package/dist/templates/facade-factory.d.ts +1 -0
  34. package/dist/templates/facade-factory.js +63 -0
  35. package/dist/templates/facade-factory.js.map +1 -0
  36. package/dist/templates/facade-types.d.ts +1 -0
  37. package/dist/templates/facade-types.js +46 -0
  38. package/dist/templates/facade-types.js.map +1 -0
  39. package/dist/templates/inject-claude-md.d.ts +11 -0
  40. package/dist/templates/inject-claude-md.js +92 -0
  41. package/dist/templates/inject-claude-md.js.map +1 -0
  42. package/dist/templates/intelligence-loader.d.ts +1 -0
  43. package/dist/templates/intelligence-loader.js +43 -0
  44. package/dist/templates/intelligence-loader.js.map +1 -0
  45. package/dist/templates/intelligence-types.d.ts +1 -0
  46. package/dist/templates/intelligence-types.js +24 -0
  47. package/dist/templates/intelligence-types.js.map +1 -0
  48. package/dist/templates/llm-client.d.ts +7 -0
  49. package/dist/templates/llm-client.js +300 -0
  50. package/dist/templates/llm-client.js.map +1 -0
  51. package/dist/templates/llm-key-pool.d.ts +7 -0
  52. package/dist/templates/llm-key-pool.js +211 -0
  53. package/dist/templates/llm-key-pool.js.map +1 -0
  54. package/dist/templates/llm-types.d.ts +5 -0
  55. package/dist/templates/llm-types.js +161 -0
  56. package/dist/templates/llm-types.js.map +1 -0
  57. package/dist/templates/llm-utils.d.ts +5 -0
  58. package/dist/templates/llm-utils.js +260 -0
  59. package/dist/templates/llm-utils.js.map +1 -0
  60. package/dist/templates/package-json.d.ts +2 -0
  61. package/dist/templates/package-json.js +37 -0
  62. package/dist/templates/package-json.js.map +1 -0
  63. package/dist/templates/persona.d.ts +2 -0
  64. package/dist/templates/persona.js +42 -0
  65. package/dist/templates/persona.js.map +1 -0
  66. package/dist/templates/planner.d.ts +5 -0
  67. package/dist/templates/planner.js +150 -0
  68. package/dist/templates/planner.js.map +1 -0
  69. package/dist/templates/readme.d.ts +5 -0
  70. package/dist/templates/readme.js +316 -0
  71. package/dist/templates/readme.js.map +1 -0
  72. package/dist/templates/setup-script.d.ts +6 -0
  73. package/dist/templates/setup-script.js +112 -0
  74. package/dist/templates/setup-script.js.map +1 -0
  75. package/dist/templates/test-brain.d.ts +6 -0
  76. package/dist/templates/test-brain.js +474 -0
  77. package/dist/templates/test-brain.js.map +1 -0
  78. package/dist/templates/test-facades.d.ts +6 -0
  79. package/dist/templates/test-facades.js +649 -0
  80. package/dist/templates/test-facades.js.map +1 -0
  81. package/dist/templates/test-llm.d.ts +7 -0
  82. package/dist/templates/test-llm.js +574 -0
  83. package/dist/templates/test-llm.js.map +1 -0
  84. package/dist/templates/test-loader.d.ts +5 -0
  85. package/dist/templates/test-loader.js +146 -0
  86. package/dist/templates/test-loader.js.map +1 -0
  87. package/dist/templates/test-planner.d.ts +5 -0
  88. package/dist/templates/test-planner.js +271 -0
  89. package/dist/templates/test-planner.js.map +1 -0
  90. package/dist/templates/test-vault.d.ts +5 -0
  91. package/dist/templates/test-vault.js +380 -0
  92. package/dist/templates/test-vault.js.map +1 -0
  93. package/dist/templates/tsconfig.d.ts +1 -0
  94. package/dist/templates/tsconfig.js +25 -0
  95. package/dist/templates/tsconfig.js.map +1 -0
  96. package/dist/templates/vault.d.ts +5 -0
  97. package/dist/templates/vault.js +263 -0
  98. package/dist/templates/vault.js.map +1 -0
  99. package/dist/templates/vitest-config.d.ts +1 -0
  100. package/dist/templates/vitest-config.js +27 -0
  101. package/dist/templates/vitest-config.js.map +1 -0
  102. package/dist/types.d.ts +89 -0
  103. package/dist/types.js +21 -0
  104. package/dist/types.js.map +1 -0
  105. package/package.json +42 -4
  106. package/src/__tests__/knowledge-installer.test.ts +805 -0
  107. package/src/__tests__/scaffolder.test.ts +323 -0
  108. package/src/facades/forge.facade.ts +150 -0
  109. package/src/index.ts +101 -0
  110. package/src/knowledge-installer.ts +532 -0
  111. package/src/scaffolder.ts +386 -0
  112. package/src/templates/activate.ts +145 -0
  113. package/src/templates/claude-md-template.ts +137 -0
  114. package/src/templates/core-facade.ts +457 -0
  115. package/src/templates/domain-facade.ts +121 -0
  116. package/src/templates/entry-point.ts +120 -0
  117. package/src/templates/inject-claude-md.ts +94 -0
  118. package/src/templates/llm-client.ts +301 -0
  119. package/src/templates/package-json.ts +39 -0
  120. package/src/templates/persona.ts +45 -0
  121. package/src/templates/readme.ts +319 -0
  122. package/src/templates/setup-script.ts +113 -0
  123. package/src/templates/test-facades.ts +656 -0
  124. package/src/templates/tsconfig.ts +25 -0
  125. package/src/templates/vitest-config.ts +26 -0
  126. package/src/types.ts +68 -0
  127. package/tsconfig.json +21 -0
  128. package/vitest.config.ts +15 -0
@@ -0,0 +1,437 @@
1
+ import { existsSync, readFileSync, writeFileSync, readdirSync, copyFileSync, mkdirSync, } from 'node:fs';
2
+ import { join, basename } from 'node:path';
3
+ import { execFileSync } from 'node:child_process';
4
+ import { generateDomainFacade, pascalCase, capitalize } from './templates/domain-facade.js';
5
+ const VALID_TYPES = new Set(['pattern', 'anti-pattern', 'rule']);
6
+ const VALID_SEVERITIES = new Set(['critical', 'warning', 'suggestion']);
7
+ // ---------- Vault-only facade generator ----------
8
+ /**
9
+ * Generate a domain facade for older agents that lack a Brain module.
10
+ * Uses vault.search() instead of brain.intelligentSearch() and
11
+ * vault.add() instead of brain.enrichAndCapture().
12
+ */
13
+ export function generateVaultOnlyDomainFacade(agentId, domain) {
14
+ const facadeName = `${agentId}_${domain.replace(/-/g, '_')}`;
15
+ return `import { z } from 'zod';
16
+ import type { FacadeConfig } from './types.js';
17
+ import type { Vault } from '../vault/vault.js';
18
+
19
+ export function create${pascalCase(domain)}Facade(vault: Vault): FacadeConfig {
20
+ return {
21
+ name: '${facadeName}',
22
+ description: '${capitalize(domain.replace(/-/g, ' '))} patterns, rules, and guidance.',
23
+ ops: [
24
+ {
25
+ name: 'get_patterns',
26
+ description: 'Get ${domain} patterns filtered by tags or severity.',
27
+ auth: 'read',
28
+ schema: z.object({
29
+ tags: z.array(z.string()).optional(),
30
+ severity: z.enum(['critical', 'warning', 'suggestion']).optional(),
31
+ type: z.enum(['pattern', 'anti-pattern', 'rule']).optional(),
32
+ limit: z.number().optional(),
33
+ }),
34
+ handler: async (params) => {
35
+ return vault.list({
36
+ domain: '${domain}',
37
+ severity: params.severity as string | undefined,
38
+ type: params.type as string | undefined,
39
+ tags: params.tags as string[] | undefined,
40
+ limit: (params.limit as number) ?? 20,
41
+ });
42
+ },
43
+ },
44
+ {
45
+ name: 'search',
46
+ description: 'Search ${domain} knowledge by query.',
47
+ auth: 'read',
48
+ schema: z.object({
49
+ query: z.string(),
50
+ limit: z.number().optional(),
51
+ }),
52
+ handler: async (params) => {
53
+ return vault.search(params.query as string, {
54
+ domain: '${domain}',
55
+ limit: (params.limit as number) ?? 10,
56
+ });
57
+ },
58
+ },
59
+ {
60
+ name: 'get_entry',
61
+ description: 'Get a specific ${domain} knowledge entry by ID.',
62
+ auth: 'read',
63
+ schema: z.object({ id: z.string() }),
64
+ handler: async (params) => {
65
+ const entry = vault.get(params.id as string);
66
+ if (!entry) return { error: 'Entry not found: ' + params.id };
67
+ return entry;
68
+ },
69
+ },
70
+ {
71
+ name: 'capture',
72
+ description: 'Capture a new ${domain} pattern, anti-pattern, or rule.',
73
+ auth: 'write',
74
+ schema: z.object({
75
+ id: z.string(),
76
+ type: z.enum(['pattern', 'anti-pattern', 'rule']),
77
+ title: z.string(),
78
+ severity: z.enum(['critical', 'warning', 'suggestion']),
79
+ description: z.string(),
80
+ context: z.string().optional(),
81
+ example: z.string().optional(),
82
+ counterExample: z.string().optional(),
83
+ why: z.string().optional(),
84
+ tags: z.array(z.string()),
85
+ }),
86
+ handler: async (params) => {
87
+ vault.add({
88
+ id: params.id as string,
89
+ type: params.type as 'pattern' | 'anti-pattern' | 'rule',
90
+ domain: '${domain}',
91
+ title: params.title as string,
92
+ severity: params.severity as 'critical' | 'warning' | 'suggestion',
93
+ description: params.description as string,
94
+ context: params.context as string | undefined,
95
+ example: params.example as string | undefined,
96
+ counterExample: params.counterExample as string | undefined,
97
+ why: params.why as string | undefined,
98
+ tags: params.tags as string[],
99
+ });
100
+ return { captured: params.id, domain: '${domain}' };
101
+ },
102
+ },
103
+ {
104
+ name: 'remove',
105
+ description: 'Remove a ${domain} knowledge entry by ID.',
106
+ auth: 'admin',
107
+ schema: z.object({ id: z.string() }),
108
+ handler: async (params) => {
109
+ const removed = vault.remove(params.id as string);
110
+ return { removed, id: params.id };
111
+ },
112
+ },
113
+ ],
114
+ };
115
+ }
116
+ `;
117
+ }
118
+ export async function installKnowledge(params) {
119
+ const { agentPath, bundlePath, generateFacades = true } = params;
120
+ const warnings = [];
121
+ const facadesGenerated = [];
122
+ const sourceFilesPatched = [];
123
+ // ── Step 1: Validate agent path ──────────────────────────────────
124
+ const pkgPath = join(agentPath, 'package.json');
125
+ if (!existsSync(pkgPath)) {
126
+ return fail(agentPath, '', 'No package.json found — is this an agent project?');
127
+ }
128
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
129
+ const pkgName = pkg.name ?? '';
130
+ if (!pkgName.endsWith('-mcp')) {
131
+ return fail(agentPath, pkgName, `package.json name "${pkgName}" does not end with -mcp`);
132
+ }
133
+ const agentId = pkgName.replace(/-mcp$/, '');
134
+ const dataDir = join(agentPath, 'src', 'intelligence', 'data');
135
+ if (!existsSync(dataDir)) {
136
+ return fail(agentPath, agentId, 'src/intelligence/data/ directory not found');
137
+ }
138
+ const hasBrain = existsSync(join(agentPath, 'src', 'brain'));
139
+ // ── Step 2: Read and validate bundles ────────────────────────────
140
+ const bundleFiles = collectBundleFiles(bundlePath);
141
+ if (bundleFiles.length === 0) {
142
+ return fail(agentPath, agentId, `No .json bundle files found at ${bundlePath}`);
143
+ }
144
+ const bundles = [];
145
+ const issues = [];
146
+ for (const file of bundleFiles) {
147
+ try {
148
+ const raw = readFileSync(file, 'utf-8');
149
+ const parsed = JSON.parse(raw);
150
+ const fileIssues = validateBundle(parsed, file);
151
+ if (fileIssues.length > 0) {
152
+ issues.push(...fileIssues);
153
+ }
154
+ else {
155
+ bundles.push({ file, bundle: parsed });
156
+ }
157
+ }
158
+ catch (err) {
159
+ issues.push(`${basename(file)}: invalid JSON — ${err instanceof Error ? err.message : String(err)}`);
160
+ }
161
+ }
162
+ if (bundles.length === 0) {
163
+ return fail(agentPath, agentId, `All bundles failed validation:\n${issues.join('\n')}`);
164
+ }
165
+ if (issues.length > 0) {
166
+ warnings.push(...issues);
167
+ }
168
+ // Determine which domains are new vs existing
169
+ const existingDataFiles = readdirSync(dataDir).filter((f) => f.endsWith('.json'));
170
+ const existingDomains = new Set(existingDataFiles.map((f) => f.replace(/\.json$/, '')));
171
+ const domainsAdded = [];
172
+ const domainsUpdated = [];
173
+ for (const { bundle } of bundles) {
174
+ if (existingDomains.has(bundle.domain)) {
175
+ domainsUpdated.push(bundle.domain);
176
+ }
177
+ else {
178
+ domainsAdded.push(bundle.domain);
179
+ }
180
+ }
181
+ // ── Step 3: Copy bundles ─────────────────────────────────────────
182
+ for (const { file, bundle } of bundles) {
183
+ const dest = join(dataDir, `${bundle.domain}.json`);
184
+ copyFileSync(file, dest);
185
+ }
186
+ // Also copy to dist/intelligence/data/ if dist exists
187
+ const distDataDir = join(agentPath, 'dist', 'intelligence', 'data');
188
+ if (existsSync(join(agentPath, 'dist'))) {
189
+ mkdirSync(distDataDir, { recursive: true });
190
+ for (const { file, bundle } of bundles) {
191
+ copyFileSync(file, join(distDataDir, `${bundle.domain}.json`));
192
+ }
193
+ }
194
+ // ── Step 4: Generate facades for new domains ─────────────────────
195
+ if (generateFacades && domainsAdded.length > 0) {
196
+ const facadesDir = join(agentPath, 'src', 'facades');
197
+ for (const domain of domainsAdded) {
198
+ const facadePath = join(facadesDir, `${domain}.facade.ts`);
199
+ // Skip if facade already exists (idempotent)
200
+ if (existsSync(facadePath)) {
201
+ warnings.push(`Facade ${domain}.facade.ts already exists — skipped`);
202
+ continue;
203
+ }
204
+ const facadeCode = hasBrain
205
+ ? generateDomainFacade(agentId, domain)
206
+ : generateVaultOnlyDomainFacade(agentId, domain);
207
+ writeFileSync(facadePath, facadeCode, 'utf-8');
208
+ facadesGenerated.push(`${domain}.facade.ts`);
209
+ }
210
+ // ── Step 5: Patch src/index.ts ───────────────────────────────────
211
+ const indexPath = join(agentPath, 'src', 'index.ts');
212
+ if (existsSync(indexPath)) {
213
+ const patched = patchIndexTs(readFileSync(indexPath, 'utf-8'), domainsAdded, hasBrain);
214
+ if (patched !== null) {
215
+ writeFileSync(indexPath, patched, 'utf-8');
216
+ sourceFilesPatched.push('src/index.ts');
217
+ }
218
+ else {
219
+ warnings.push('Could not patch src/index.ts — anchor patterns not found. Manual patching needed.');
220
+ }
221
+ }
222
+ // ── Step 6: Patch src/activation/claude-md-content.ts ────────────
223
+ const claudeMdPath = join(agentPath, 'src', 'activation', 'claude-md-content.ts');
224
+ if (existsSync(claudeMdPath)) {
225
+ const patched = patchClaudeMdContent(readFileSync(claudeMdPath, 'utf-8'), agentId, domainsAdded);
226
+ if (patched !== null) {
227
+ writeFileSync(claudeMdPath, patched, 'utf-8');
228
+ sourceFilesPatched.push('src/activation/claude-md-content.ts');
229
+ }
230
+ else {
231
+ warnings.push('Could not patch claude-md-content.ts — anchor not found. Manual patching needed.');
232
+ }
233
+ }
234
+ }
235
+ // ── Step 7: Build ────────────────────────────────────────────────
236
+ let buildOutput = '';
237
+ try {
238
+ // Using execFileSync with npx to avoid shell injection — command is hardcoded
239
+ buildOutput = execFileSync('npm', ['run', 'build'], {
240
+ cwd: agentPath,
241
+ encoding: 'utf-8',
242
+ timeout: 60_000,
243
+ stdio: ['pipe', 'pipe', 'pipe'],
244
+ });
245
+ }
246
+ catch (err) {
247
+ const stderr = err.stderr ?? '';
248
+ buildOutput = `Build failed: ${stderr}`;
249
+ warnings.push('Build failed — check buildOutput for details');
250
+ }
251
+ // ── Step 8: Return result ────────────────────────────────────────
252
+ const entriesTotal = bundles.reduce((sum, { bundle }) => sum + bundle.entries.length, 0);
253
+ const summaryParts = [
254
+ `Installed ${bundles.length} bundle(s) with ${entriesTotal} entries into ${agentId}`,
255
+ ];
256
+ if (domainsAdded.length > 0)
257
+ summaryParts.push(`New domains: ${domainsAdded.join(', ')}`);
258
+ if (domainsUpdated.length > 0)
259
+ summaryParts.push(`Updated domains: ${domainsUpdated.join(', ')}`);
260
+ if (facadesGenerated.length > 0)
261
+ summaryParts.push(`Generated ${facadesGenerated.length} facade(s)`);
262
+ if (sourceFilesPatched.length > 0)
263
+ summaryParts.push(`Patched: ${sourceFilesPatched.join(', ')}`);
264
+ if (warnings.length > 0)
265
+ summaryParts.push(`${warnings.length} warning(s)`);
266
+ return {
267
+ success: !warnings.some((w) => w.includes('Build failed')),
268
+ agentPath,
269
+ agentId,
270
+ bundlesInstalled: bundles.length,
271
+ entriesTotal,
272
+ domainsAdded,
273
+ domainsUpdated,
274
+ facadesGenerated,
275
+ sourceFilesPatched,
276
+ buildOutput,
277
+ warnings,
278
+ summary: summaryParts.join('. ') + '.',
279
+ };
280
+ }
281
+ // ---------- Helpers ----------
282
+ function fail(agentPath, agentId, message) {
283
+ return {
284
+ success: false,
285
+ agentPath,
286
+ agentId,
287
+ bundlesInstalled: 0,
288
+ entriesTotal: 0,
289
+ domainsAdded: [],
290
+ domainsUpdated: [],
291
+ facadesGenerated: [],
292
+ sourceFilesPatched: [],
293
+ buildOutput: '',
294
+ warnings: [message],
295
+ summary: message,
296
+ };
297
+ }
298
+ function collectBundleFiles(bundlePath) {
299
+ if (bundlePath.endsWith('.json')) {
300
+ return existsSync(bundlePath) ? [bundlePath] : [];
301
+ }
302
+ if (!existsSync(bundlePath))
303
+ return [];
304
+ return readdirSync(bundlePath)
305
+ .filter((f) => f.endsWith('.json'))
306
+ .map((f) => join(bundlePath, f));
307
+ }
308
+ function validateBundle(bundle, file) {
309
+ const issues = [];
310
+ const name = basename(file);
311
+ if (!bundle.domain || typeof bundle.domain !== 'string') {
312
+ issues.push(`${name}: missing or invalid "domain"`);
313
+ }
314
+ if (!bundle.version || typeof bundle.version !== 'string') {
315
+ issues.push(`${name}: missing or invalid "version"`);
316
+ }
317
+ if (!Array.isArray(bundle.entries)) {
318
+ issues.push(`${name}: "entries" must be an array`);
319
+ return issues; // can't validate entries
320
+ }
321
+ for (let i = 0; i < bundle.entries.length; i++) {
322
+ const entry = bundle.entries[i];
323
+ const prefix = `${name}[${i}]`;
324
+ if (!entry.id)
325
+ issues.push(`${prefix}: missing "id"`);
326
+ if (!VALID_TYPES.has(entry.type))
327
+ issues.push(`${prefix}: invalid type "${entry.type}"`);
328
+ if (!entry.domain)
329
+ issues.push(`${prefix}: missing "domain"`);
330
+ if (!entry.title)
331
+ issues.push(`${prefix}: missing "title"`);
332
+ if (!VALID_SEVERITIES.has(entry.severity))
333
+ issues.push(`${prefix}: invalid severity "${entry.severity}"`);
334
+ if (!entry.description)
335
+ issues.push(`${prefix}: missing "description"`);
336
+ if (!Array.isArray(entry.tags))
337
+ issues.push(`${prefix}: "tags" must be an array`);
338
+ }
339
+ return issues;
340
+ }
341
+ // ---------- Source file patching ----------
342
+ /**
343
+ * Patch the agent's src/index.ts to add imports and facade registrations
344
+ * for new domains.
345
+ *
346
+ * Anchor patterns:
347
+ * - Import: insert before `import { createCoreFacade }`
348
+ * - Facade array: insert before `createCoreFacade(`
349
+ */
350
+ export function patchIndexTs(source, newDomains, hasBrain) {
351
+ // Filter out domains whose imports already exist (idempotent)
352
+ const domainsToImport = newDomains.filter((d) => {
353
+ const fn = `create${pascalCase(d)}Facade`;
354
+ return !source.includes(`import { ${fn} }`);
355
+ });
356
+ // Filter out domains whose facade calls already exist
357
+ const domainsToRegister = newDomains.filter((d) => {
358
+ const fn = `create${pascalCase(d)}Facade(`;
359
+ return !source.includes(fn);
360
+ });
361
+ // Nothing to patch
362
+ if (domainsToImport.length === 0 && domainsToRegister.length === 0) {
363
+ return source;
364
+ }
365
+ let patched = source;
366
+ // ── Insert imports ──
367
+ if (domainsToImport.length > 0) {
368
+ const importAnchor = /^(import \{ createCoreFacade \}.*$)/m;
369
+ if (!importAnchor.test(patched))
370
+ return null;
371
+ const newImports = domainsToImport
372
+ .map((d) => {
373
+ const fn = `create${pascalCase(d)}Facade`;
374
+ return `import { ${fn} } from './facades/${d}.facade.js';`;
375
+ })
376
+ .join('\n');
377
+ patched = patched.replace(importAnchor, `${newImports}\n$1`);
378
+ }
379
+ // ── Insert facade creations ──
380
+ if (domainsToRegister.length > 0) {
381
+ const facadeAnchor = /^(\s+createCoreFacade\()/m;
382
+ if (!facadeAnchor.test(patched))
383
+ return null;
384
+ const newCreations = domainsToRegister
385
+ .map((d) => {
386
+ const fn = `create${pascalCase(d)}Facade`;
387
+ const args = hasBrain ? 'vault, brain' : 'vault';
388
+ return ` ${fn}(${args}),`;
389
+ })
390
+ .join('\n');
391
+ patched = patched.replace(facadeAnchor, `${newCreations}\n$1`);
392
+ }
393
+ return patched;
394
+ }
395
+ /**
396
+ * Patch the agent's src/activation/claude-md-content.ts to add
397
+ * facade table rows for new domains.
398
+ *
399
+ * Primary anchor: line containing `| Memory search |` (newer agents)
400
+ * Fallback anchor: line containing `## Intent Detection` (older agents without memory/brain rows)
401
+ */
402
+ export function patchClaudeMdContent(source, agentId, newDomains) {
403
+ const facadeId = agentId.replace(/-/g, '_');
404
+ const bt = '`';
405
+ // Filter out domains whose rows already exist (idempotent)
406
+ const domainsToAdd = newDomains.filter((d) => {
407
+ const toolName = `${facadeId}_${d.replace(/-/g, '_')}`;
408
+ return !source.includes(`${toolName}`);
409
+ });
410
+ if (domainsToAdd.length === 0)
411
+ return source;
412
+ // Try primary anchor first, then fallback for older agents
413
+ let anchorIdx = source.indexOf("'| Memory search |");
414
+ if (anchorIdx === -1) {
415
+ // Older agents: insert before the empty line preceding ## Intent Detection
416
+ anchorIdx = source.indexOf("'## Intent Detection'");
417
+ if (anchorIdx === -1)
418
+ return null;
419
+ // Back up to include the preceding empty string line ('',)
420
+ const emptyLineIdx = source.lastIndexOf("'',", anchorIdx);
421
+ if (emptyLineIdx !== -1 && anchorIdx - emptyLineIdx < 20) {
422
+ // Find the start of that line (the indentation)
423
+ const lineStart = source.lastIndexOf('\n', emptyLineIdx);
424
+ anchorIdx = lineStart === -1 ? emptyLineIdx : lineStart + 1;
425
+ }
426
+ }
427
+ const newRows = domainsToAdd.flatMap((d) => {
428
+ const toolName = `${facadeId}_${d.replace(/-/g, '_')}`;
429
+ return [
430
+ ` '| ${d} patterns | ${bt}${toolName}${bt} | ${bt}get_patterns${bt} |',`,
431
+ ` '| Search ${d} | ${bt}${toolName}${bt} | ${bt}search${bt} |',`,
432
+ ` '| Capture ${d} | ${bt}${toolName}${bt} | ${bt}capture${bt} |',`,
433
+ ];
434
+ });
435
+ return source.slice(0, anchorIdx) + newRows.join('\n') + '\n' + source.slice(anchorIdx);
436
+ }
437
+ //# sourceMappingURL=knowledge-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-installer.js","sourceRoot":"","sources":["../src/knowledge-installer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { AgentConfig, ScaffoldResult, ScaffoldPreview, AgentInfo } from './types.js';
2
+ /**
3
+ * Preview what scaffold will create without writing anything.
4
+ */
5
+ export declare function previewScaffold(config: AgentConfig): ScaffoldPreview;
6
+ /**
7
+ * Scaffold a complete MCP agent project.
8
+ */
9
+ export declare function scaffold(config: AgentConfig): ScaffoldResult;
10
+ /**
11
+ * List agents in a directory.
12
+ */
13
+ export declare function listAgents(parentDir: string): AgentInfo[];