create-merlin-brain 3.12.0 → 3.13.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 (28) hide show
  1. package/bin/install.cjs +10 -10
  2. package/dist/server/api/types.d.ts +7 -0
  3. package/dist/server/api/types.d.ts.map +1 -1
  4. package/dist/server/tools/__tests__/augmentation.test.d.ts +8 -0
  5. package/dist/server/tools/__tests__/augmentation.test.d.ts.map +1 -0
  6. package/dist/server/tools/__tests__/augmentation.test.js +76 -0
  7. package/dist/server/tools/__tests__/augmentation.test.js.map +1 -0
  8. package/dist/server/tools/__tests__/route-helpers.test.d.ts +5 -0
  9. package/dist/server/tools/__tests__/route-helpers.test.d.ts.map +1 -0
  10. package/dist/server/tools/__tests__/route-helpers.test.js +49 -0
  11. package/dist/server/tools/__tests__/route-helpers.test.js.map +1 -0
  12. package/dist/server/tools/agent-spawn.d.ts +25 -0
  13. package/dist/server/tools/agent-spawn.d.ts.map +1 -0
  14. package/dist/server/tools/agent-spawn.js +95 -0
  15. package/dist/server/tools/agent-spawn.js.map +1 -0
  16. package/dist/server/tools/augmentation.d.ts +45 -0
  17. package/dist/server/tools/augmentation.d.ts.map +1 -0
  18. package/dist/server/tools/augmentation.js +167 -0
  19. package/dist/server/tools/augmentation.js.map +1 -0
  20. package/dist/server/tools/route-helpers.d.ts +45 -0
  21. package/dist/server/tools/route-helpers.d.ts.map +1 -0
  22. package/dist/server/tools/route-helpers.js +93 -0
  23. package/dist/server/tools/route-helpers.js.map +1 -0
  24. package/dist/server/tools/route.d.ts +4 -3
  25. package/dist/server/tools/route.d.ts.map +1 -1
  26. package/dist/server/tools/route.js +63 -308
  27. package/dist/server/tools/route.js.map +1 -1
  28. package/package.json +5 -2
package/bin/install.cjs CHANGED
@@ -145,7 +145,7 @@ function logError(msg) {
145
145
  log(` ${colors.red}✗${colors.reset} ${msg}`);
146
146
  }
147
147
 
148
- // Minimum Claude Code version required (--agent flag support)
148
+ // Minimum Claude Code version required (MCP server support)
149
149
  const MIN_CLAUDE_VERSION = '2.0.0';
150
150
 
151
151
  function parseVersion(v) {
@@ -199,7 +199,7 @@ function ensureClaudeCode() {
199
199
  }
200
200
 
201
201
  // Needs update
202
- logWarn(`Claude Code v${currentVersion} is too old (need >= ${MIN_CLAUDE_VERSION} for --agent support)`);
202
+ logWarn(`Claude Code v${currentVersion} is too old (need >= ${MIN_CLAUDE_VERSION})`);
203
203
  log(` ${colors.cyan}Updating Claude Code...${colors.reset}`);
204
204
 
205
205
  try {
@@ -340,23 +340,17 @@ function setupShellIntegration() {
340
340
  } else {
341
341
  logWarn(`Unknown shell (${shell}), skipping shell setup`);
342
342
  log(` Add manually to your shell rc file:`);
343
- log(` ${colors.cyan}function claude() { command claude --agent merlin "$@"; }${colors.reset}`);
344
343
  log(` ${colors.cyan}alias cc='claude'${colors.reset}`);
345
344
  return false;
346
345
  }
347
346
 
348
- // Simple Merlin shell integration - just wrap claude with merlin agent
347
+ // Merlin shell integration - shortcut alias and loop command
349
348
  const merlinBlock = `
350
349
  # ══════════════════════════════════════════════════════════════
351
350
  # Merlin Brain - The AI Brain for Claude Code
352
351
  # https://merlin.build
353
352
  # ══════════════════════════════════════════════════════════════
354
353
 
355
- # Simple claude wrapper - run with merlin agent
356
- claude() {
357
- command claude --agent merlin "$@"
358
- }
359
-
360
354
  # Shortcut alias
361
355
  alias cc="claude"
362
356
 
@@ -387,11 +381,17 @@ merlin-loop() {
387
381
  fs.writeFileSync(rcFile, rcContent);
388
382
  logSuccess('Updating existing Merlin shell integration');
389
383
  }
384
+
385
+ // Remove broken claude() wrapper from older installs (--agent flag doesn't exist)
386
+ if (rcContent.includes('command claude --agent')) {
387
+ rcContent = rcContent.replace(/\n?# Simple claude wrapper.*\nclaude\(\) \{\n\s*command claude --agent.*\n\}\n?/g, '\n');
388
+ fs.writeFileSync(rcFile, rcContent);
389
+ logSuccess('Removed broken claude() wrapper (--agent flag is not valid)');
390
+ }
390
391
  }
391
392
 
392
393
  // Add new Merlin integration block
393
394
  fs.appendFileSync(rcFile, merlinBlock);
394
- logSuccess(`Configured 'claude' command to use Merlin`);
395
395
  logSuccess(`Added 'cc' shortcut`);
396
396
  logSuccess(`Version check enabled (run /merlin:update to update)`);
397
397
  return true;
@@ -196,6 +196,13 @@ export interface AgentIndexResult {
196
196
  rating: number;
197
197
  userThumbsUp: number;
198
198
  }
199
+ /** Augmentation data injected into agent handoff from cloud catalog */
200
+ export interface AugmentationResult {
201
+ slug: string;
202
+ grade: string;
203
+ description: string;
204
+ systemPrompt: string;
205
+ }
199
206
  /** Agent index detail */
200
207
  export interface AgentIndexDetail extends AgentIndexResult {
201
208
  systemPrompt: string | null;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/api/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/server/api/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Tests for augmentation module — cache, discovery eligibility, handoff building.
3
+ *
4
+ * Tests use a temp directory for cache operations to avoid polluting
5
+ * the real ~/.claude/agents/_cloud/ directory.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=augmentation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"augmentation.test.d.ts","sourceRoot":"","sources":["../../../../src/server/tools/__tests__/augmentation.test.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Tests for augmentation module — cache, discovery eligibility, handoff building.
3
+ *
4
+ * Tests use a temp directory for cache operations to avoid polluting
5
+ * the real ~/.claude/agents/_cloud/ directory.
6
+ */
7
+ import { describe, it, expect } from 'vitest';
8
+ // We need to mock the CLOUD_CACHE_DIR before importing the module
9
+ // Since the module uses a constant, we'll test the exported functions
10
+ // that don't depend on the hardcoded path, and test cache behavior
11
+ // through integration-style tests with a temp dir.
12
+ // Test shouldAugment and buildAugmentationSection directly
13
+ import { shouldAugment, buildAugmentationSection } from '../augmentation.js';
14
+ describe('shouldAugment', () => {
15
+ it('returns true for code-writing agents', () => {
16
+ expect(shouldAugment('implementation-dev')).toBe(true);
17
+ expect(shouldAugment('merlin-frontend')).toBe(true);
18
+ expect(shouldAugment('hardening-guard')).toBe(true);
19
+ expect(shouldAugment('tests-qa')).toBe(true);
20
+ expect(shouldAugment('ui-builder')).toBe(true);
21
+ expect(shouldAugment('merlin-executor')).toBe(true);
22
+ expect(shouldAugment('merlin-api-designer')).toBe(true);
23
+ expect(shouldAugment('merlin-security')).toBe(true);
24
+ });
25
+ it('returns false for non-code-writing agents', () => {
26
+ expect(shouldAugment('docs-keeper')).toBe(false);
27
+ expect(shouldAugment('merlin-planner')).toBe(false);
28
+ expect(shouldAugment('merlin-verifier')).toBe(false);
29
+ expect(shouldAugment('merlin-reviewer')).toBe(false);
30
+ expect(shouldAugment('product-spec')).toBe(false);
31
+ expect(shouldAugment('system-architect')).toBe(false);
32
+ });
33
+ it('returns true for unknown agents (opt-out model)', () => {
34
+ expect(shouldAugment('custom-agent')).toBe(true);
35
+ expect(shouldAugment('my-special-agent')).toBe(true);
36
+ });
37
+ });
38
+ describe('buildAugmentationSection', () => {
39
+ it('builds correct markdown section', () => {
40
+ const result = buildAugmentationSection({
41
+ slug: 'prisma-expert',
42
+ grade: 'A++',
43
+ description: 'Prisma ORM patterns and migrations',
44
+ systemPrompt: 'You are a Prisma expert. Always use prisma migrate for schema changes.',
45
+ });
46
+ expect(result[0]).toBe('## Domain Expertise (auto-augmented)');
47
+ expect(result[1]).toContain('prisma-expert');
48
+ expect(result[1]).toContain('A++');
49
+ expect(result[3]).toContain('Prisma expert');
50
+ expect(result[5]).toContain('supplementary domain knowledge');
51
+ });
52
+ it('truncates prompts over 4000 characters', () => {
53
+ const longPrompt = 'x'.repeat(5000);
54
+ const result = buildAugmentationSection({
55
+ slug: 'long-agent',
56
+ grade: 'A',
57
+ description: 'Test',
58
+ systemPrompt: longPrompt,
59
+ });
60
+ const promptSection = result[3];
61
+ expect(promptSection.length).toBeLessThan(4100); // 4000 + truncation message
62
+ expect(promptSection).toContain('truncated');
63
+ });
64
+ it('does not truncate prompts under 4000 characters', () => {
65
+ const shortPrompt = 'You are a specialist. Do good work.';
66
+ const result = buildAugmentationSection({
67
+ slug: 'short-agent',
68
+ grade: 'A+',
69
+ description: 'Test',
70
+ systemPrompt: shortPrompt,
71
+ });
72
+ expect(result[3]).toBe(shortPrompt);
73
+ expect(result[3]).not.toContain('truncated');
74
+ });
75
+ });
76
+ //# sourceMappingURL=augmentation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"augmentation.test.js","sourceRoot":"","sources":["../../../../src/server/tools/__tests__/augmentation.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Tests for route-helpers — effort prefix building, agent roles constants.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=route-helpers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-helpers.test.d.ts","sourceRoot":"","sources":["../../../../src/server/tools/__tests__/route-helpers.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Tests for route-helpers — effort prefix building, agent roles constants.
3
+ */
4
+ import { describe, it, expect } from 'vitest';
5
+ import { buildEffortPrefix, AGENT_ROLES, WORKFLOW_AGENTS } from '../route-helpers.js';
6
+ describe('buildEffortPrefix', () => {
7
+ it('returns ultrathink prefix for high effort', () => {
8
+ const { prefix, suffix } = buildEffortPrefix('high');
9
+ expect(prefix).toBe('ultrathink\n\n');
10
+ expect(suffix).toBe('');
11
+ });
12
+ it('returns concise suffix for low effort', () => {
13
+ const { prefix, suffix } = buildEffortPrefix('low');
14
+ expect(prefix).toBe('');
15
+ expect(suffix).toContain('concise');
16
+ });
17
+ it('returns empty strings for medium effort', () => {
18
+ const { prefix, suffix } = buildEffortPrefix('medium');
19
+ expect(prefix).toBe('');
20
+ expect(suffix).toBe('');
21
+ });
22
+ });
23
+ describe('AGENT_ROLES', () => {
24
+ it('contains all 8 core specialist agents', () => {
25
+ const expected = [
26
+ 'product-spec', 'system-architect', 'implementation-dev',
27
+ 'dry-refactor', 'hardening-guard', 'tests-qa',
28
+ 'ops-railway', 'docs-keeper',
29
+ ];
30
+ for (const agent of expected) {
31
+ expect(AGENT_ROLES).toHaveProperty(agent);
32
+ expect(typeof AGENT_ROLES[agent]).toBe('string');
33
+ }
34
+ expect(Object.keys(AGENT_ROLES).length).toBe(8);
35
+ });
36
+ });
37
+ describe('WORKFLOW_AGENTS', () => {
38
+ it('contains expected workflow agents', () => {
39
+ expect(WORKFLOW_AGENTS).toContain('merlin-planner');
40
+ expect(WORKFLOW_AGENTS).toContain('merlin-executor');
41
+ expect(WORKFLOW_AGENTS).toContain('merlin-frontend');
42
+ expect(WORKFLOW_AGENTS).toContain('merlin-security');
43
+ });
44
+ it('does not contain core specialist agents', () => {
45
+ expect(WORKFLOW_AGENTS).not.toContain('implementation-dev');
46
+ expect(WORKFLOW_AGENTS).not.toContain('product-spec');
47
+ });
48
+ });
49
+ //# sourceMappingURL=route-helpers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-helpers.test.js","sourceRoot":"","sources":["../../../../src/server/tools/__tests__/route-helpers.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxB,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAG;YACf,cAAc,EAAE,kBAAkB,EAAE,oBAAoB;YACxD,cAAc,EAAE,iBAAiB,EAAE,UAAU;YAC7C,aAAa,EAAE,aAAa;SAC7B,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACpD,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACrD,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QACrD,MAAM,CAAC,eAAe,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;QAC5D,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Agent Spawn — Fresh Claude process spawning and output management.
3
+ *
4
+ * Handles the actual child process lifecycle: spawn, timeout, output
5
+ * capture, memory limits, and cleanup.
6
+ */
7
+ import type { IsolationMode } from './route-helpers.js';
8
+ /**
9
+ * Spawn a fresh Claude process and capture its output.
10
+ * Removes CLAUDECODE env var so child doesn't reject as nested session.
11
+ */
12
+ export declare function spawnAgent(agent: string, input: string, timeoutMs: number, model?: string, isolation?: IsolationMode): Promise<{
13
+ stdout: string;
14
+ stderr: string;
15
+ exitCode: number | null;
16
+ }>;
17
+ /**
18
+ * Get list of available agent names from ~/.claude/agents/ and .claude/agents/
19
+ */
20
+ export declare function getAvailableAgents(): string[];
21
+ /**
22
+ * Truncate output to prevent context window explosion.
23
+ */
24
+ export declare function truncateOutput(output: string, maxLength?: number): string;
25
+ //# sourceMappingURL=agent-spawn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-spawn.d.ts","sourceRoot":"","sources":["../../../src/server/tools/agent-spawn.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKxD;;;GAGG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,aAAa,GACxB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAgEtE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAW7C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAc,GAAG,MAAM,CAIhF"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Agent Spawn — Fresh Claude process spawning and output management.
3
+ *
4
+ * Handles the actual child process lifecycle: spawn, timeout, output
5
+ * capture, memory limits, and cleanup.
6
+ */
7
+ import { spawn } from 'child_process';
8
+ import { existsSync, readdirSync } from 'fs';
9
+ import { join } from 'path';
10
+ import { homedir } from 'os';
11
+ /** Max output size to prevent context explosion (100KB) */
12
+ const MAX_OUTPUT_SIZE = 100 * 1024;
13
+ /**
14
+ * Spawn a fresh Claude process and capture its output.
15
+ * Removes CLAUDECODE env var so child doesn't reject as nested session.
16
+ */
17
+ export function spawnAgent(agent, input, timeoutMs, model, isolation) {
18
+ return new Promise((resolve, reject) => {
19
+ let settled = false;
20
+ const settle = (fn, value) => {
21
+ if (settled)
22
+ return;
23
+ settled = true;
24
+ clearTimeout(timer);
25
+ fn(value);
26
+ };
27
+ const childEnv = { ...process.env };
28
+ delete childEnv.CLAUDECODE;
29
+ const spawnArgs = [
30
+ '--agent', agent,
31
+ '-p',
32
+ '--permission-mode', 'acceptEdits',
33
+ '--output-format', 'text',
34
+ ];
35
+ if (isolation === 'worktree') {
36
+ spawnArgs.push('--worktree');
37
+ }
38
+ if (model) {
39
+ spawnArgs.push('--model', model);
40
+ }
41
+ const proc = spawn('claude', spawnArgs, {
42
+ stdio: ['pipe', 'pipe', 'pipe'],
43
+ env: childEnv,
44
+ });
45
+ let stdout = '';
46
+ let stderr = '';
47
+ proc.stdout.on('data', (data) => {
48
+ stdout += data.toString();
49
+ if (stdout.length > MAX_OUTPUT_SIZE) {
50
+ proc.kill('SIGTERM');
51
+ settle(reject, new Error('Agent output exceeded 100KB limit'));
52
+ }
53
+ });
54
+ proc.stderr.on('data', (data) => {
55
+ stderr += data.toString();
56
+ });
57
+ proc.stdin.write(input);
58
+ proc.stdin.end();
59
+ const timer = setTimeout(() => {
60
+ proc.kill('SIGTERM');
61
+ settle(reject, new Error(`Agent timed out after ${Math.round(timeoutMs / 60000)} minutes`));
62
+ }, timeoutMs);
63
+ proc.on('close', (code) => {
64
+ settle(resolve, { stdout, stderr, exitCode: code });
65
+ });
66
+ proc.on('error', (err) => {
67
+ settle(reject, err);
68
+ });
69
+ });
70
+ }
71
+ /**
72
+ * Get list of available agent names from ~/.claude/agents/ and .claude/agents/
73
+ */
74
+ export function getAvailableAgents() {
75
+ const agents = new Set();
76
+ const globalDir = join(homedir(), '.claude', 'agents');
77
+ if (existsSync(globalDir)) {
78
+ readdirSync(globalDir).filter(f => f.endsWith('.md')).forEach(f => agents.add(f.replace('.md', '')));
79
+ }
80
+ const localDir = join(process.cwd(), '.claude', 'agents');
81
+ if (existsSync(localDir)) {
82
+ readdirSync(localDir).filter(f => f.endsWith('.md')).forEach(f => agents.add(f.replace('.md', '')));
83
+ }
84
+ return [...agents].sort();
85
+ }
86
+ /**
87
+ * Truncate output to prevent context window explosion.
88
+ */
89
+ export function truncateOutput(output, maxLength = 50000) {
90
+ if (output.length <= maxLength)
91
+ return output;
92
+ const truncated = output.slice(0, maxLength);
93
+ return truncated + `\n\n... [Output truncated at ${maxLength} chars. Full output was ${output.length} chars]`;
94
+ }
95
+ //# sourceMappingURL=agent-spawn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-spawn.js","sourceRoot":"","sources":["../../../src/server/tools/agent-spawn.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAG7B,2DAA2D;AAC3D,MAAM,eAAe,GAAG,GAAG,GAAG,IAAI,CAAC;AAEnC;;;GAGG;AACH,MAAM,UAAU,UAAU,CACxB,KAAa,EACb,KAAa,EACb,SAAiB,EACjB,KAAc,EACd,SAAyB;IAEzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,EAAkC,EAAE,KAAU,EAAE,EAAE;YAChE,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,EAAE,CAAC,KAAK,CAAC,CAAC;QACZ,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAC,UAAU,CAAC;QAE3B,MAAM,SAAS,GAAG;YAChB,SAAS,EAAE,KAAK;YAChB,IAAI;YACJ,mBAAmB,EAAE,aAAa;YAClC,iBAAiB,EAAE,MAAM;SAC1B,CAAC;QAEF,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE;YACtC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,QAAQ;SACd,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACtC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC1B,IAAI,MAAM,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrB,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;YACjE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;YACtC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAEjB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrB,MAAM,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,yBAAyB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;QAC9F,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IACvD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACvG,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC1D,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,WAAW,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACtG,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,YAAoB,KAAK;IACtE,IAAI,MAAM,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,MAAM,CAAC;IAC9C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7C,OAAO,SAAS,GAAG,gCAAgC,SAAS,2BAA2B,MAAM,CAAC,MAAM,SAAS,CAAC;AAChH,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Augmentation — Cloud agent discovery, caching, and expertise injection.
3
+ *
4
+ * When a task matches a cloud-indexed agent (A/A+/A++), this module:
5
+ * 1. Discovers the match via catalog search
6
+ * 2. Fetches the agent's system prompt (cache-first, API fallback)
7
+ * 3. Returns structured data for handoff injection
8
+ *
9
+ * Cache: ~/.claude/agents/_cloud/<slug>.md
10
+ * - 7-day TTL with stale-while-revalidate fallback
11
+ * - 50-file LRU cap with mtime-based eviction
12
+ * - Underscore prefix keeps _cloud/ out of agent loader's flat directory scan
13
+ */
14
+ import type { ToolContext } from './types.js';
15
+ import type { AugmentationResult } from '../api/types.js';
16
+ /** Discovery result from catalog search */
17
+ export interface DiscoveryHint {
18
+ name: string;
19
+ grade: string;
20
+ description: string;
21
+ slug: string;
22
+ }
23
+ /**
24
+ * Discovery-first routing: check the catalog for a better-fit
25
+ * community/specialist agent. Returns a hint if a high-scoring
26
+ * match exists (A/A+/A++), otherwise null.
27
+ */
28
+ export declare function discoverBetterAgent(client: ToolContext['client'], task: string, chosenAgent: string): Promise<DiscoveryHint | null>;
29
+ /**
30
+ * Check whether an agent should be augmented.
31
+ * Returns true for all code-writing agents (opt-out model).
32
+ */
33
+ export declare function shouldAugment(agent: string): boolean;
34
+ /**
35
+ * Fetch augmentation data for a discovered cloud agent.
36
+ * Checks local disk cache first, falls back to API, caches result.
37
+ * Returns null silently on any failure — augmentation never blocks routing.
38
+ */
39
+ export declare function fetchAugmentation(client: ToolContext['client'], hint: DiscoveryHint): Promise<AugmentationResult | null>;
40
+ /**
41
+ * Build the domain expertise handoff section from augmentation data.
42
+ * Caps injected content at 4000 characters.
43
+ */
44
+ export declare function buildAugmentationSection(augmentation: AugmentationResult): string[];
45
+ //# sourceMappingURL=augmentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"augmentation.d.ts","sourceRoot":"","sources":["../../../src/server/tools/augmentation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAY1D,2CAA2C;AAC3C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAsED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,EAC7B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAmB/B;AAID;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,EAC7B,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CA0BpC;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAiBnF"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Augmentation — Cloud agent discovery, caching, and expertise injection.
3
+ *
4
+ * When a task matches a cloud-indexed agent (A/A+/A++), this module:
5
+ * 1. Discovers the match via catalog search
6
+ * 2. Fetches the agent's system prompt (cache-first, API fallback)
7
+ * 3. Returns structured data for handoff injection
8
+ *
9
+ * Cache: ~/.claude/agents/_cloud/<slug>.md
10
+ * - 7-day TTL with stale-while-revalidate fallback
11
+ * - 50-file LRU cap with mtime-based eviction
12
+ * - Underscore prefix keeps _cloud/ out of agent loader's flat directory scan
13
+ */
14
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, statSync, unlinkSync } from 'fs';
15
+ import { join } from 'path';
16
+ import { homedir } from 'os';
17
+ const CLOUD_CACHE_DIR = join(homedir(), '.claude', 'agents', '_cloud');
18
+ const TTL_MS = 7 * 24 * 60 * 60 * 1000; // 7 days
19
+ const MAX_CACHE_FILES = 50;
20
+ /** Agents that should NOT be augmented (non-code-writing agents) */
21
+ const AUGMENT_EXCLUDED = new Set([
22
+ 'docs-keeper', 'merlin-planner', 'merlin-verifier',
23
+ 'merlin-reviewer', 'product-spec', 'system-architect',
24
+ ]);
25
+ function getCachedPrompt(slug, ignoreExpiry = false) {
26
+ const filePath = join(CLOUD_CACHE_DIR, `${slug}.md`);
27
+ if (!existsSync(filePath))
28
+ return null;
29
+ try {
30
+ const content = readFileSync(filePath, 'utf-8');
31
+ const fmMatch = content.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);
32
+ if (!fmMatch)
33
+ return null;
34
+ const frontmatter = fmMatch[1];
35
+ const systemPrompt = fmMatch[2].trim();
36
+ if (!systemPrompt || systemPrompt.length < 50)
37
+ return null;
38
+ const cachedAtMatch = frontmatter.match(/^cached_at:\s*(.+)$/m);
39
+ if (!ignoreExpiry && cachedAtMatch) {
40
+ const cachedAt = new Date(cachedAtMatch[1]).getTime();
41
+ if (Date.now() - cachedAt > TTL_MS)
42
+ return null;
43
+ }
44
+ const gradeMatch = frontmatter.match(/^grade:\s*(.+)$/m);
45
+ const grade = gradeMatch ? gradeMatch[1].trim() : 'A';
46
+ return { systemPrompt, grade };
47
+ }
48
+ catch {
49
+ return null;
50
+ }
51
+ }
52
+ function setCachedPrompt(slug, grade, systemPrompt) {
53
+ try {
54
+ mkdirSync(CLOUD_CACHE_DIR, { recursive: true });
55
+ const files = readdirSync(CLOUD_CACHE_DIR).filter(f => f.endsWith('.md'));
56
+ if (files.length >= MAX_CACHE_FILES) {
57
+ const sorted = files
58
+ .map(f => ({ name: f, mtime: statSync(join(CLOUD_CACHE_DIR, f)).mtimeMs }))
59
+ .sort((a, b) => a.mtime - b.mtime);
60
+ const toRemove = sorted.slice(0, files.length - MAX_CACHE_FILES + 1);
61
+ for (const f of toRemove) {
62
+ unlinkSync(join(CLOUD_CACHE_DIR, f.name));
63
+ }
64
+ }
65
+ const content = [
66
+ '---',
67
+ `slug: ${slug}`,
68
+ `grade: ${grade}`,
69
+ `cached_at: ${new Date().toISOString()}`,
70
+ `source: merlin-cloud-index`,
71
+ '---',
72
+ systemPrompt,
73
+ ].join('\n');
74
+ writeFileSync(join(CLOUD_CACHE_DIR, `${slug}.md`), content, 'utf-8');
75
+ }
76
+ catch (err) {
77
+ console.error(`[augmentation] Failed to write cache for ${slug}: ${err}`);
78
+ }
79
+ }
80
+ // ─── Discovery ───────────────────────────────────────────────────────
81
+ /**
82
+ * Discovery-first routing: check the catalog for a better-fit
83
+ * community/specialist agent. Returns a hint if a high-scoring
84
+ * match exists (A/A+/A++), otherwise null.
85
+ */
86
+ export async function discoverBetterAgent(client, task, chosenAgent) {
87
+ try {
88
+ const results = await client.searchAgentsIndex(task, { limit: 3 });
89
+ if (!results || results.length === 0)
90
+ return null;
91
+ const topMatch = results[0];
92
+ const grade = (topMatch.grade || '').toUpperCase();
93
+ if ((grade === 'A++' || grade === 'A+' || grade === 'A') && topMatch.slug !== chosenAgent && topMatch.name !== chosenAgent) {
94
+ return {
95
+ name: topMatch.name,
96
+ grade: topMatch.grade || '',
97
+ description: topMatch.description || '',
98
+ slug: topMatch.slug,
99
+ };
100
+ }
101
+ return null;
102
+ }
103
+ catch {
104
+ return null;
105
+ }
106
+ }
107
+ // ─── Augmentation ────────────────────────────────────────────────────
108
+ /**
109
+ * Check whether an agent should be augmented.
110
+ * Returns true for all code-writing agents (opt-out model).
111
+ */
112
+ export function shouldAugment(agent) {
113
+ return !AUGMENT_EXCLUDED.has(agent);
114
+ }
115
+ /**
116
+ * Fetch augmentation data for a discovered cloud agent.
117
+ * Checks local disk cache first, falls back to API, caches result.
118
+ * Returns null silently on any failure — augmentation never blocks routing.
119
+ */
120
+ export async function fetchAugmentation(client, hint) {
121
+ try {
122
+ const cached = getCachedPrompt(hint.slug);
123
+ if (cached) {
124
+ console.error(`[augmentation] Cache hit: ${hint.slug}`);
125
+ return { slug: hint.slug, grade: cached.grade, description: hint.description, systemPrompt: cached.systemPrompt };
126
+ }
127
+ const detail = await client.getAgentIndexDetail(hint.slug);
128
+ if (!detail?.systemPrompt || detail.systemPrompt.length < 50) {
129
+ console.error(`[augmentation] Skipping: prompt too short for ${hint.slug}`);
130
+ return null;
131
+ }
132
+ setCachedPrompt(hint.slug, hint.grade, detail.systemPrompt);
133
+ console.error(`[augmentation] Fetched: ${hint.slug} (${hint.grade}) — ${detail.systemPrompt.length} chars`);
134
+ return { slug: hint.slug, grade: hint.grade, description: hint.description, systemPrompt: detail.systemPrompt };
135
+ }
136
+ catch (err) {
137
+ console.error(`[augmentation] Fetch failed for ${hint.slug}: ${err}`);
138
+ const stale = getCachedPrompt(hint.slug, true);
139
+ if (stale) {
140
+ console.error(`[augmentation] Using stale cache for ${hint.slug}`);
141
+ return { slug: hint.slug, grade: stale.grade, description: hint.description, systemPrompt: stale.systemPrompt };
142
+ }
143
+ return null;
144
+ }
145
+ }
146
+ /**
147
+ * Build the domain expertise handoff section from augmentation data.
148
+ * Caps injected content at 4000 characters.
149
+ */
150
+ export function buildAugmentationSection(augmentation) {
151
+ const maxChars = 4000;
152
+ const promptContent = augmentation.systemPrompt.length > maxChars
153
+ ? augmentation.systemPrompt.slice(0, maxChars) + '\n[... truncated, showing first 4000 chars]'
154
+ : augmentation.systemPrompt;
155
+ return [
156
+ `## Domain Expertise (auto-augmented)`,
157
+ `Source: ${augmentation.slug} (${augmentation.grade}) — from Merlin cloud catalog`,
158
+ '---',
159
+ promptContent,
160
+ '---',
161
+ 'NOTE: This is supplementary domain knowledge. Your primary identity, project',
162
+ 'conventions, and coding style remain unchanged. Use this expertise to inform',
163
+ 'your implementation choices, not to override project patterns.',
164
+ '',
165
+ ];
166
+ }
167
+ //# sourceMappingURL=augmentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"augmentation.js","sourceRoot":"","sources":["../../../src/server/tools/augmentation.ts"],"names":[],"mappings":"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"}