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.
- package/bin/install.cjs +10 -10
- package/dist/server/api/types.d.ts +7 -0
- package/dist/server/api/types.d.ts.map +1 -1
- package/dist/server/tools/__tests__/augmentation.test.d.ts +8 -0
- package/dist/server/tools/__tests__/augmentation.test.d.ts.map +1 -0
- package/dist/server/tools/__tests__/augmentation.test.js +76 -0
- package/dist/server/tools/__tests__/augmentation.test.js.map +1 -0
- package/dist/server/tools/__tests__/route-helpers.test.d.ts +5 -0
- package/dist/server/tools/__tests__/route-helpers.test.d.ts.map +1 -0
- package/dist/server/tools/__tests__/route-helpers.test.js +49 -0
- package/dist/server/tools/__tests__/route-helpers.test.js.map +1 -0
- package/dist/server/tools/agent-spawn.d.ts +25 -0
- package/dist/server/tools/agent-spawn.d.ts.map +1 -0
- package/dist/server/tools/agent-spawn.js +95 -0
- package/dist/server/tools/agent-spawn.js.map +1 -0
- package/dist/server/tools/augmentation.d.ts +45 -0
- package/dist/server/tools/augmentation.d.ts.map +1 -0
- package/dist/server/tools/augmentation.js +167 -0
- package/dist/server/tools/augmentation.js.map +1 -0
- package/dist/server/tools/route-helpers.d.ts +45 -0
- package/dist/server/tools/route-helpers.d.ts.map +1 -0
- package/dist/server/tools/route-helpers.js +93 -0
- package/dist/server/tools/route-helpers.js.map +1 -0
- package/dist/server/tools/route.d.ts +4 -3
- package/dist/server/tools/route.d.ts.map +1 -1
- package/dist/server/tools/route.js +63 -308
- package/dist/server/tools/route.js.map +1 -1
- 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 (
|
|
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}
|
|
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
|
-
//
|
|
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 @@
|
|
|
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":"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"}
|
|
@@ -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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"}
|