@agentbrain/mcp-server 1.4.20 → 1.4.33
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/README.md +160 -2
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/create-spec.d.ts +82 -0
- package/dist/tools/create-spec.d.ts.map +1 -0
- package/dist/tools/create-spec.js +83 -0
- package/dist/tools/create-spec.js.map +1 -0
- package/dist/tools/load-context.d.ts +2 -0
- package/dist/tools/load-context.d.ts.map +1 -1
- package/dist/tools/load-context.js +10 -1
- package/dist/tools/load-context.js.map +1 -1
- package/dist/tools/load-spec.d.ts +30 -0
- package/dist/tools/load-spec.d.ts.map +1 -1
- package/dist/tools/load-spec.js +7 -1
- package/dist/tools/load-spec.js.map +1 -1
- package/dist/tools/save-handoff.d.ts.map +1 -1
- package/dist/tools/save-handoff.js +11 -3
- package/dist/tools/save-handoff.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,6 +11,7 @@ This MCP server lets **Claude Desktop**, **Cursor**, and **Windsurf** access Age
|
|
|
11
11
|
- 📝 Load task specifications
|
|
12
12
|
- 📋 Read coding standards
|
|
13
13
|
- 💾 Save session handoffs
|
|
14
|
+
- ⚠️ Detect doom loops automatically
|
|
14
15
|
|
|
15
16
|
**No CLI commands needed** - your agent does it all automatically!
|
|
16
17
|
|
|
@@ -245,6 +246,28 @@ Once configured, your agent can use these 5 tools:
|
|
|
245
246
|
- "Give me the full context of this codebase"
|
|
246
247
|
- "Load project intelligence for my app"
|
|
247
248
|
|
|
249
|
+
**Returns:**
|
|
250
|
+
```json
|
|
251
|
+
{
|
|
252
|
+
"content": "# Repository Intelligence\n\n...",
|
|
253
|
+
"fromCache": true,
|
|
254
|
+
"tokensUsed": 0,
|
|
255
|
+
"doom_warning": null // or doom loop details if detected
|
|
256
|
+
}
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
**Doom Loop Detection:** If you've been modifying the same files repeatedly, `doom_warning` will contain:
|
|
260
|
+
```json
|
|
261
|
+
{
|
|
262
|
+
"detected": true,
|
|
263
|
+
"files": [
|
|
264
|
+
"src/auth.ts (8 times · 80%)",
|
|
265
|
+
"src/main.ts (6 times · 60%)"
|
|
266
|
+
],
|
|
267
|
+
"message": "Doom loop detected. Stop coding. Investigate root cause first."
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
248
271
|
**Cost:**
|
|
249
272
|
- **First time:** ~$0.02-0.05 (generates documentation)
|
|
250
273
|
- **After that:** $0.00 (uses cache)
|
|
@@ -268,12 +291,21 @@ Once configured, your agent can use these 5 tools:
|
|
|
268
291
|
|
|
269
292
|
**Returns:**
|
|
270
293
|
If task specified: The spec content
|
|
271
|
-
If no task: List of all available specs in agentbrain/specs/
|
|
294
|
+
If no task: List of all available specs in .agentbrain/specs/
|
|
272
295
|
|
|
273
296
|
**Cost:** Free - reads from disk
|
|
274
297
|
|
|
275
298
|
**Note:** Specs must be created first using `agentbrain spec` CLI command.
|
|
276
299
|
|
|
300
|
+
**Returns:**
|
|
301
|
+
```json
|
|
302
|
+
{
|
|
303
|
+
"content": "# Task Specification: Add OAuth\n\n...",
|
|
304
|
+
"slug": "add-oauth-authentication",
|
|
305
|
+
"doom_warning": null // or doom loop details if detected
|
|
306
|
+
}
|
|
307
|
+
```
|
|
308
|
+
|
|
277
309
|
**Example usage:**
|
|
278
310
|
```typescript
|
|
279
311
|
// List all specs
|
|
@@ -285,6 +317,8 @@ load_spec({ repoPath: "/path/to/project", task: "add-oauth-authentication" })
|
|
|
285
317
|
// Returns: Full spec content with problem, approach, acceptance criteria, etc.
|
|
286
318
|
```
|
|
287
319
|
|
|
320
|
+
**Doom Loop Detection:** Like `load_context`, this tool returns doom warnings if detected.
|
|
321
|
+
|
|
288
322
|
---
|
|
289
323
|
|
|
290
324
|
### 4. `load_standards` - Load Coding Standards
|
|
@@ -316,6 +350,27 @@ load_spec({ repoPath: "/path/to/project", task: "add-oauth-authentication" })
|
|
|
316
350
|
- "Create a handoff document with goal: implemented auth"
|
|
317
351
|
- "Generate a session summary with the last 10 commits"
|
|
318
352
|
|
|
353
|
+
**Returns:**
|
|
354
|
+
```json
|
|
355
|
+
{
|
|
356
|
+
"path": ".agentbrain/handoff.md",
|
|
357
|
+
"created": true,
|
|
358
|
+
"doom_warning": null // or doom loop details if detected
|
|
359
|
+
}
|
|
360
|
+
```
|
|
361
|
+
|
|
362
|
+
**Doom Loop Detection:** If a doom loop is detected, a warning section is **automatically appended** to the handoff document:
|
|
363
|
+
|
|
364
|
+
```markdown
|
|
365
|
+
## ⚠ Doom Loop Warning
|
|
366
|
+
|
|
367
|
+
The following files were modified repeatedly before this handoff. Investigate before continuing:
|
|
368
|
+
- src/auth.ts (8 times · 80%)
|
|
369
|
+
- src/main.ts (6 times · 60%)
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
This ensures the next session starts with awareness of potential issues.
|
|
373
|
+
|
|
319
374
|
**Cost:** ~$0.01
|
|
320
375
|
|
|
321
376
|
---
|
|
@@ -352,7 +407,7 @@ Agent: "Based on your current architecture, I recommend adding a
|
|
|
352
407
|
```
|
|
353
408
|
You: "Save a handoff with goal: Implemented notification system"
|
|
354
409
|
Agent: *Uses save_handoff tool*
|
|
355
|
-
Agent: "Handoff saved to agentbrain/handoff.md!
|
|
410
|
+
Agent: "Handoff saved to .agentbrain/handoff.md!
|
|
356
411
|
Summary: Added NotificationService, integrated with existing
|
|
357
412
|
user system, added tests. Next steps: Add email integration
|
|
358
413
|
and push notification support."
|
|
@@ -360,6 +415,59 @@ Agent: "Handoff saved to agentbrain/handoff.md!
|
|
|
360
415
|
|
|
361
416
|
---
|
|
362
417
|
|
|
418
|
+
## Doom Loop Detection in MCP
|
|
419
|
+
|
|
420
|
+
AgentBrain MCP tools automatically detect doom loops - situations where you're modifying the same files repeatedly, indicating you may be stuck.
|
|
421
|
+
|
|
422
|
+
### How It Works
|
|
423
|
+
|
|
424
|
+
1. **Post-commit hook** analyzes git history in the background
|
|
425
|
+
2. **Hook logs detection** to `.agentbrain/update.log` if threshold exceeded
|
|
426
|
+
3. **MCP tools check** for pending doom warnings on every call
|
|
427
|
+
4. **Warning included** in tool responses if detected
|
|
428
|
+
|
|
429
|
+
### Which Tools Return Doom Warnings
|
|
430
|
+
|
|
431
|
+
Three "decision point" tools include doom warnings:
|
|
432
|
+
|
|
433
|
+
- **`load_context`** - When loading full context at session start
|
|
434
|
+
- **`load_spec`** - When loading task specifications
|
|
435
|
+
- **`save_handoff`** - When saving session handoffs (also appends to document)
|
|
436
|
+
|
|
437
|
+
### Stateless Design
|
|
438
|
+
|
|
439
|
+
Unlike the CLI (which shows warnings once per commit), MCP tools are **stateless**:
|
|
440
|
+
|
|
441
|
+
- Warning appears in **every tool response** while the doom condition exists
|
|
442
|
+
- Never marked as "shown" - agents can see warnings multiple times
|
|
443
|
+
- This ensures warnings aren't missed in long sessions
|
|
444
|
+
|
|
445
|
+
### Example: Agent Response with Doom Warning
|
|
446
|
+
|
|
447
|
+
When your agent calls `load_context` during a doom loop:
|
|
448
|
+
|
|
449
|
+
```
|
|
450
|
+
Agent: "I've loaded the repository context. However, I notice a doom loop
|
|
451
|
+
warning - you've been modifying src/auth.ts 8 times in the last 10
|
|
452
|
+
commits (80%). This suggests we may be stuck. Should we step back
|
|
453
|
+
and investigate the root cause first?"
|
|
454
|
+
```
|
|
455
|
+
|
|
456
|
+
The agent can proactively suggest stopping to plan rather than continuing to code.
|
|
457
|
+
|
|
458
|
+
### Clearing Doom Warnings
|
|
459
|
+
|
|
460
|
+
Doom warnings clear automatically when:
|
|
461
|
+
- You commit changes to **different files** (breaking the pattern)
|
|
462
|
+
- Enough commits pass that repeated files drop below threshold
|
|
463
|
+
|
|
464
|
+
Or manually via CLI:
|
|
465
|
+
```bash
|
|
466
|
+
agentbrain doom --commits 20 --threshold 6 # Check with different thresholds
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
---
|
|
470
|
+
|
|
363
471
|
## Troubleshooting
|
|
364
472
|
|
|
365
473
|
### "AgentBrain not showing up in my agent"
|
|
@@ -415,6 +523,56 @@ ls /path/to/your/project
|
|
|
415
523
|
|
|
416
524
|
---
|
|
417
525
|
|
|
526
|
+
### "Doom warnings appearing too often"
|
|
527
|
+
|
|
528
|
+
**Adjust sensitivity via CLI:**
|
|
529
|
+
|
|
530
|
+
Doom detection uses these defaults:
|
|
531
|
+
- Last **10 commits** analyzed
|
|
532
|
+
- File must appear **4+ times** to trigger (40%+)
|
|
533
|
+
|
|
534
|
+
To change thresholds, edit the post-commit hook or run manually:
|
|
535
|
+
```bash
|
|
536
|
+
agentbrain doom --commits 15 --threshold 6
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
**Excluded automatically:**
|
|
540
|
+
- Lock files (package-lock.json, yarn.lock, etc.)
|
|
541
|
+
- AgentBrain files (CLAUDE.md, .cursorrules, etc.)
|
|
542
|
+
- Markdown documentation files
|
|
543
|
+
|
|
544
|
+
**False positives are rare** - if you see a doom warning, you're likely stuck on a problem.
|
|
545
|
+
|
|
546
|
+
---
|
|
547
|
+
|
|
548
|
+
### "Doom warnings not appearing when they should"
|
|
549
|
+
|
|
550
|
+
**1. Check if doom detection is enabled:**
|
|
551
|
+
```bash
|
|
552
|
+
# Verify post-commit hook exists
|
|
553
|
+
ls -la .git/hooks/post-commit
|
|
554
|
+
# or for Husky:
|
|
555
|
+
ls -la .husky/post-commit
|
|
556
|
+
```
|
|
557
|
+
|
|
558
|
+
**2. Check update log:**
|
|
559
|
+
```bash
|
|
560
|
+
cat .agentbrain/update.log | grep DOOM
|
|
561
|
+
```
|
|
562
|
+
|
|
563
|
+
**3. Manually check for doom loop:**
|
|
564
|
+
```bash
|
|
565
|
+
agentbrain doom
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
**4. Reinstall hooks if needed:**
|
|
569
|
+
```bash
|
|
570
|
+
agentbrain disable --remove-hooks
|
|
571
|
+
agentbrain setup --no-confirm
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
---
|
|
575
|
+
|
|
418
576
|
## Configuration Examples
|
|
419
577
|
|
|
420
578
|
### Minimal Configuration (Recommended)
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,7 @@ import { loadStandards, loadStandardsSchema } from './tools/load-standards.js';
|
|
|
8
8
|
import { loadContext, loadContextSchema } from './tools/load-context.js';
|
|
9
9
|
import { saveHandoff, saveHandoffSchema } from './tools/save-handoff.js';
|
|
10
10
|
import { loadSpecTool, loadSpecSchema } from './tools/load-spec.js';
|
|
11
|
+
import { createSpecTool, createSpecSchema } from './tools/create-spec.js';
|
|
11
12
|
import { detectDoomLoop, detectDoomLoopSchema } from './tools/detect-doom-loop.js';
|
|
12
13
|
// Create MCP server
|
|
13
14
|
const server = new Server({
|
|
@@ -26,6 +27,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
26
27
|
loadStandardsSchema,
|
|
27
28
|
loadContextSchema,
|
|
28
29
|
loadSpecSchema,
|
|
30
|
+
createSpecSchema,
|
|
29
31
|
detectDoomLoopSchema,
|
|
30
32
|
saveHandoffSchema,
|
|
31
33
|
],
|
|
@@ -72,6 +74,17 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
72
74
|
],
|
|
73
75
|
};
|
|
74
76
|
}
|
|
77
|
+
case 'create_spec': {
|
|
78
|
+
const result = await createSpecTool(args);
|
|
79
|
+
return {
|
|
80
|
+
content: [
|
|
81
|
+
{
|
|
82
|
+
type: 'text',
|
|
83
|
+
text: `Spec created successfully!\n\nFile: ${result.specPath}\nSlug: ${result.slug}\nTokens used: ${result.tokensUsed}\nCost: ~$${result.cost.toFixed(4)}\n${result.injected ? 'Injected into agent files: YES' : 'Injected into agent files: NO'}\n\n---\n\n${result.content}`,
|
|
84
|
+
},
|
|
85
|
+
],
|
|
86
|
+
};
|
|
87
|
+
}
|
|
75
88
|
case 'detect_doom_loop': {
|
|
76
89
|
const result = await detectDoomLoop(args);
|
|
77
90
|
return {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const createSpecSchema: {
|
|
3
|
+
readonly name: "create_spec";
|
|
4
|
+
readonly description: "Create a task specification with AI-guided structure. Generates a spec file with problem statement, scope, acceptance criteria, and implementation notes based on repository context.";
|
|
5
|
+
readonly inputSchema: {
|
|
6
|
+
readonly type: "object";
|
|
7
|
+
readonly properties: {
|
|
8
|
+
readonly repoPath: {
|
|
9
|
+
readonly type: "string";
|
|
10
|
+
readonly description: "Absolute path to the repository";
|
|
11
|
+
};
|
|
12
|
+
readonly task: {
|
|
13
|
+
readonly type: "string";
|
|
14
|
+
readonly description: "Brief task description (e.g., \"add OAuth authentication\")";
|
|
15
|
+
};
|
|
16
|
+
readonly problem: {
|
|
17
|
+
readonly type: "string";
|
|
18
|
+
readonly description: "What problem does this solve? (1-2 sentences)";
|
|
19
|
+
};
|
|
20
|
+
readonly approach: {
|
|
21
|
+
readonly type: "string";
|
|
22
|
+
readonly description: "Your implementation approach or \"not sure yet\" if unknown";
|
|
23
|
+
};
|
|
24
|
+
readonly outOfScope: {
|
|
25
|
+
readonly type: "string";
|
|
26
|
+
readonly description: "What should NOT be touched or changed";
|
|
27
|
+
};
|
|
28
|
+
readonly doneCriteria: {
|
|
29
|
+
readonly type: "string";
|
|
30
|
+
readonly description: "What does \"done\" look like? (acceptance criteria)";
|
|
31
|
+
};
|
|
32
|
+
readonly risks: {
|
|
33
|
+
readonly type: "string";
|
|
34
|
+
readonly description: "Any edge cases or risks to consider";
|
|
35
|
+
};
|
|
36
|
+
readonly inject: {
|
|
37
|
+
readonly type: "boolean";
|
|
38
|
+
readonly description: "Inject spec reference into agent files (CLAUDE.md, .cursorrules, etc.) [default: true]";
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
readonly required: readonly ["repoPath", "task", "problem", "doneCriteria"];
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
declare const inputSchema: z.ZodObject<{
|
|
45
|
+
repoPath: z.ZodString;
|
|
46
|
+
task: z.ZodString;
|
|
47
|
+
problem: z.ZodString;
|
|
48
|
+
approach: z.ZodOptional<z.ZodString>;
|
|
49
|
+
outOfScope: z.ZodOptional<z.ZodString>;
|
|
50
|
+
doneCriteria: z.ZodString;
|
|
51
|
+
risks: z.ZodOptional<z.ZodString>;
|
|
52
|
+
inject: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
53
|
+
}, "strip", z.ZodTypeAny, {
|
|
54
|
+
repoPath: string;
|
|
55
|
+
task: string;
|
|
56
|
+
problem: string;
|
|
57
|
+
doneCriteria: string;
|
|
58
|
+
inject: boolean;
|
|
59
|
+
approach?: string | undefined;
|
|
60
|
+
outOfScope?: string | undefined;
|
|
61
|
+
risks?: string | undefined;
|
|
62
|
+
}, {
|
|
63
|
+
repoPath: string;
|
|
64
|
+
task: string;
|
|
65
|
+
problem: string;
|
|
66
|
+
doneCriteria: string;
|
|
67
|
+
approach?: string | undefined;
|
|
68
|
+
outOfScope?: string | undefined;
|
|
69
|
+
risks?: string | undefined;
|
|
70
|
+
inject?: boolean | undefined;
|
|
71
|
+
}>;
|
|
72
|
+
export type CreateSpecInput = z.infer<typeof inputSchema>;
|
|
73
|
+
export declare function createSpecTool(input: CreateSpecInput): Promise<{
|
|
74
|
+
specPath: string;
|
|
75
|
+
slug: string;
|
|
76
|
+
content: string;
|
|
77
|
+
tokensUsed: number;
|
|
78
|
+
cost: number;
|
|
79
|
+
injected: boolean;
|
|
80
|
+
}>;
|
|
81
|
+
export {};
|
|
82
|
+
//# sourceMappingURL=create-spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-spec.d.ts","sourceRoot":"","sources":["../../src/tools/create-spec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAKvB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6CnB,CAAA;AAEV,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;EASf,CAAA;AAEF,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAA;AAEzD,wBAAsB,cAAc,CAAC,KAAK,EAAE,eAAe;;;;;;;GAiC1D"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// create-spec.ts - MCP tool to create task specifications
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { createSpec as coreCreateSpec } from '@agentbrain/core';
|
|
4
|
+
import { loadAIConfig } from '@agentbrain/core';
|
|
5
|
+
import { resolve } from 'node:path';
|
|
6
|
+
export const createSpecSchema = {
|
|
7
|
+
name: 'create_spec',
|
|
8
|
+
description: 'Create a task specification with AI-guided structure. Generates a spec file with problem statement, scope, acceptance criteria, and implementation notes based on repository context.',
|
|
9
|
+
inputSchema: {
|
|
10
|
+
type: 'object',
|
|
11
|
+
properties: {
|
|
12
|
+
repoPath: {
|
|
13
|
+
type: 'string',
|
|
14
|
+
description: 'Absolute path to the repository',
|
|
15
|
+
},
|
|
16
|
+
task: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
description: 'Brief task description (e.g., "add OAuth authentication")',
|
|
19
|
+
},
|
|
20
|
+
problem: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
description: 'What problem does this solve? (1-2 sentences)',
|
|
23
|
+
},
|
|
24
|
+
approach: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: 'Your implementation approach or "not sure yet" if unknown',
|
|
27
|
+
},
|
|
28
|
+
outOfScope: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
description: 'What should NOT be touched or changed',
|
|
31
|
+
},
|
|
32
|
+
doneCriteria: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
description: 'What does "done" look like? (acceptance criteria)',
|
|
35
|
+
},
|
|
36
|
+
risks: {
|
|
37
|
+
type: 'string',
|
|
38
|
+
description: 'Any edge cases or risks to consider',
|
|
39
|
+
},
|
|
40
|
+
inject: {
|
|
41
|
+
type: 'boolean',
|
|
42
|
+
description: 'Inject spec reference into agent files (CLAUDE.md, .cursorrules, etc.) [default: true]',
|
|
43
|
+
},
|
|
44
|
+
},
|
|
45
|
+
required: ['repoPath', 'task', 'problem', 'doneCriteria'],
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
const inputSchema = z.object({
|
|
49
|
+
repoPath: z.string(),
|
|
50
|
+
task: z.string(),
|
|
51
|
+
problem: z.string(),
|
|
52
|
+
approach: z.string().optional(),
|
|
53
|
+
outOfScope: z.string().optional(),
|
|
54
|
+
doneCriteria: z.string(),
|
|
55
|
+
risks: z.string().optional(),
|
|
56
|
+
inject: z.boolean().optional().default(true),
|
|
57
|
+
});
|
|
58
|
+
export async function createSpecTool(input) {
|
|
59
|
+
// Validate input
|
|
60
|
+
const validated = inputSchema.parse(input);
|
|
61
|
+
const repoPath = resolve(validated.repoPath);
|
|
62
|
+
// Load AI config (will use env vars or stored config)
|
|
63
|
+
const aiConfig = await loadAIConfig();
|
|
64
|
+
// Build answers object for spec generation
|
|
65
|
+
const answers = {
|
|
66
|
+
problem: validated.problem,
|
|
67
|
+
approach: validated.approach || 'not sure yet',
|
|
68
|
+
outOfScope: validated.outOfScope || 'none specified',
|
|
69
|
+
doneCriteria: validated.doneCriteria,
|
|
70
|
+
risks: validated.risks || 'none specified',
|
|
71
|
+
};
|
|
72
|
+
// Use core createSpec function (handles everything: generate, save, inject)
|
|
73
|
+
const result = await coreCreateSpec(validated.task, answers, repoPath, aiConfig);
|
|
74
|
+
return {
|
|
75
|
+
specPath: result.filePath.replace(repoPath, '').slice(1), // Relative path
|
|
76
|
+
slug: result.slug,
|
|
77
|
+
content: result.content,
|
|
78
|
+
tokensUsed: result.tokensUsed,
|
|
79
|
+
cost: result.cost,
|
|
80
|
+
injected: true, // coreCreateSpec always injects
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=create-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-spec.js","sourceRoot":"","sources":["../../src/tools/create-spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type DoomWarningForMCP } from '@agentbrain/core';
|
|
1
2
|
export interface LoadContextInput {
|
|
2
3
|
repo_path: string;
|
|
3
4
|
force_refresh?: boolean;
|
|
@@ -10,6 +11,7 @@ export interface LoadContextOutput {
|
|
|
10
11
|
cached_sha?: string;
|
|
11
12
|
current_sha?: string;
|
|
12
13
|
message?: string;
|
|
14
|
+
doom_warning?: DoomWarningForMCP | null;
|
|
13
15
|
}
|
|
14
16
|
export declare function loadContext(input: LoadContextInput): Promise<LoadContextOutput>;
|
|
15
17
|
export declare const loadContextSchema: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-context.d.ts","sourceRoot":"","sources":["../../src/tools/load-context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"load-context.d.ts","sourceRoot":"","sources":["../../src/tools/load-context.ts"],"names":[],"mappings":"AAMA,OAAO,EAOL,KAAK,iBAAiB,EACvB,MAAM,kBAAkB,CAAA;AAYzB,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,OAAO,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAA;CACxC;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAoGrF;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAkB7B,CAAA"}
|
|
@@ -3,7 +3,7 @@ import { readFile } from 'node:fs/promises';
|
|
|
3
3
|
import { existsSync } from 'node:fs';
|
|
4
4
|
import { join, resolve } from 'node:path';
|
|
5
5
|
import { homedir } from 'node:os';
|
|
6
|
-
import { loadAIConfig, generateContext, getCachedDoc, getGitHash, loadCache } from '@agentbrain/core';
|
|
6
|
+
import { loadAIConfig, generateContext, getCachedDoc, getGitHash, loadCache, getPendingDoomForMCP, } from '@agentbrain/core';
|
|
7
7
|
/**
|
|
8
8
|
* Expand path: handles ~, relative paths, etc.
|
|
9
9
|
*/
|
|
@@ -34,6 +34,8 @@ export async function loadContext(input) {
|
|
|
34
34
|
// Check if cached git hash matches current HEAD
|
|
35
35
|
const cache = await loadCache(expandedPath);
|
|
36
36
|
const isStale = cache && cache.gitHash !== currentGitHash;
|
|
37
|
+
// Check for doom loop warnings
|
|
38
|
+
const doomWarning = await getPendingDoomForMCP(expandedPath);
|
|
37
39
|
return {
|
|
38
40
|
content: combined,
|
|
39
41
|
fromCache: true,
|
|
@@ -44,6 +46,7 @@ export async function loadContext(input) {
|
|
|
44
46
|
current_sha: currentGitHash,
|
|
45
47
|
message: 'Context may be outdated. Run agentbrain init to refresh.',
|
|
46
48
|
}),
|
|
49
|
+
doom_warning: doomWarning,
|
|
47
50
|
};
|
|
48
51
|
}
|
|
49
52
|
// Need to generate - requires API key
|
|
@@ -57,6 +60,8 @@ export async function loadContext(input) {
|
|
|
57
60
|
// Check if cached git hash matches current HEAD
|
|
58
61
|
const cache = await loadCache(expandedPath);
|
|
59
62
|
const isStale = cache && cache.gitHash !== currentGitHash;
|
|
63
|
+
// Check for doom loop warnings
|
|
64
|
+
const doomWarning = await getPendingDoomForMCP(expandedPath);
|
|
60
65
|
return {
|
|
61
66
|
content: combined,
|
|
62
67
|
fromCache: true,
|
|
@@ -67,6 +72,7 @@ export async function loadContext(input) {
|
|
|
67
72
|
current_sha: currentGitHash,
|
|
68
73
|
message: 'Context may be outdated. Run agentbrain init to refresh.',
|
|
69
74
|
}),
|
|
75
|
+
doom_warning: doomWarning,
|
|
70
76
|
};
|
|
71
77
|
}
|
|
72
78
|
// Generate new context
|
|
@@ -78,11 +84,14 @@ export async function loadContext(input) {
|
|
|
78
84
|
const combined = result.docs
|
|
79
85
|
.map((doc) => `# ${doc.type}\n\n${doc.content}`)
|
|
80
86
|
.join('\n\n---\n\n');
|
|
87
|
+
// Check for doom loop warnings
|
|
88
|
+
const doomWarning = await getPendingDoomForMCP(expandedPath);
|
|
81
89
|
// Newly generated content is never stale
|
|
82
90
|
return {
|
|
83
91
|
content: combined,
|
|
84
92
|
fromCache: false,
|
|
85
93
|
tokensUsed: result.totalTokens,
|
|
94
|
+
doom_warning: doomWarning,
|
|
86
95
|
};
|
|
87
96
|
}
|
|
88
97
|
export const loadContextSchema = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-context.js","sourceRoot":"","sources":["../../src/tools/load-context.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAE9D,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"load-context.js","sourceRoot":"","sources":["../../src/tools/load-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type DoomWarningForMCP } from '@agentbrain/core';
|
|
2
|
+
export interface LoadSpecInput {
|
|
3
|
+
repoPath: string;
|
|
4
|
+
task?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface LoadSpecOutput {
|
|
7
|
+
content: string;
|
|
8
|
+
slug?: string;
|
|
9
|
+
doom_warning?: DoomWarningForMCP | null;
|
|
10
|
+
}
|
|
11
|
+
export declare const loadSpecSchema: {
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
inputSchema: {
|
|
15
|
+
type: string;
|
|
16
|
+
properties: {
|
|
17
|
+
repoPath: {
|
|
18
|
+
type: string;
|
|
19
|
+
description: string;
|
|
20
|
+
};
|
|
21
|
+
task: {
|
|
22
|
+
type: string;
|
|
23
|
+
description: string;
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
required: string[];
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
export declare function loadSpecTool(input: LoadSpecInput): Promise<LoadSpecOutput>;
|
|
30
|
+
//# sourceMappingURL=load-spec.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-spec.d.ts","sourceRoot":"","sources":["../../src/tools/load-spec.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"load-spec.d.ts","sourceRoot":"","sources":["../../src/tools/load-spec.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6C,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpG,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAA;CACxC;AAED,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;CAmB1B,CAAA;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CA4ChF"}
|
package/dist/tools/load-spec.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// MCP tool: load_spec - Load specification files
|
|
2
|
-
import { listSpecs, loadSpec } from '@agentbrain/core';
|
|
2
|
+
import { listSpecs, loadSpec, getPendingDoomForMCP } from '@agentbrain/core';
|
|
3
3
|
export const loadSpecSchema = {
|
|
4
4
|
name: 'load_spec',
|
|
5
5
|
description: 'Load a specification file by task name, or list all available specs if no task provided',
|
|
@@ -20,16 +20,20 @@ export const loadSpecSchema = {
|
|
|
20
20
|
};
|
|
21
21
|
export async function loadSpecTool(input) {
|
|
22
22
|
const { repoPath, task } = input;
|
|
23
|
+
// Check for doom loop warnings
|
|
24
|
+
const doomWarning = await getPendingDoomForMCP(repoPath);
|
|
23
25
|
// If no task provided, list all available specs
|
|
24
26
|
if (!task) {
|
|
25
27
|
const specs = await listSpecs(repoPath);
|
|
26
28
|
if (specs.length === 0) {
|
|
27
29
|
return {
|
|
28
30
|
content: 'No specs found. Run `agentbrain spec "<task>"` to create your first specification.',
|
|
31
|
+
doom_warning: doomWarning,
|
|
29
32
|
};
|
|
30
33
|
}
|
|
31
34
|
return {
|
|
32
35
|
content: `Available specs:\n\n${specs.map((s) => `- ${s}`).join('\n')}\n\nTo load a spec, provide the task slug as the "task" parameter.`,
|
|
36
|
+
doom_warning: doomWarning,
|
|
33
37
|
};
|
|
34
38
|
}
|
|
35
39
|
// Convert task to slug format (kebab-case)
|
|
@@ -41,11 +45,13 @@ export async function loadSpecTool(input) {
|
|
|
41
45
|
if (!content) {
|
|
42
46
|
return {
|
|
43
47
|
content: `Spec not found: ${slug}\n\nRun \`agentbrain spec "${task}"\` to create it.`,
|
|
48
|
+
doom_warning: doomWarning,
|
|
44
49
|
};
|
|
45
50
|
}
|
|
46
51
|
return {
|
|
47
52
|
content,
|
|
48
53
|
slug,
|
|
54
|
+
doom_warning: doomWarning,
|
|
49
55
|
};
|
|
50
56
|
}
|
|
51
57
|
//# sourceMappingURL=load-spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-spec.js","sourceRoot":"","sources":["../../src/tools/load-spec.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"load-spec.js","sourceRoot":"","sources":["../../src/tools/load-spec.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,oBAAoB,EAA0B,MAAM,kBAAkB,CAAA;AAapG,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,IAAI,EAAE,WAAW;IACjB,WAAW,EACT,yFAAyF;IAC3F,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iCAAiC;aAC/C;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,+FAA+F;aAClG;SACF;QACD,QAAQ,EAAE,CAAC,UAAU,CAAC;KACvB;CACF,CAAA;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAoB;IACrD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;IAEhC,+BAA+B;IAC/B,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CAAA;IAExD,gDAAgD;IAChD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAA;QAEvC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,OAAO,EACL,oFAAoF;gBACtF,YAAY,EAAE,WAAW;aAC1B,CAAA;QACH,CAAC;QAED,OAAO;YACL,OAAO,EAAE,uBAAuB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,oEAAoE;YACzI,YAAY,EAAE,WAAW;SAC1B,CAAA;IACH,CAAC;IAED,2CAA2C;IAC3C,MAAM,IAAI,GAAG,IAAI;SACd,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;SAC3B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;IAE1B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE,mBAAmB,IAAI,8BAA8B,IAAI,mBAAmB;YACrF,YAAY,EAAE,WAAW;SAC1B,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO;QACP,IAAI;QACJ,YAAY,EAAE,WAAW;KAC1B,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-handoff.d.ts","sourceRoot":"","sources":["../../src/tools/save-handoff.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,
|
|
1
|
+
{"version":3,"file":"save-handoff.d.ts","sourceRoot":"","sources":["../../src/tools/save-handoff.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAyCrF;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;CAsB7B,CAAA"}
|
|
@@ -3,7 +3,7 @@ import { writeFile, mkdir } from 'node:fs/promises';
|
|
|
3
3
|
import { existsSync } from 'node:fs';
|
|
4
4
|
import { join, resolve } from 'node:path';
|
|
5
5
|
import { homedir } from 'node:os';
|
|
6
|
-
import { loadAIConfig, generateHandoff } from '@agentbrain/core';
|
|
6
|
+
import { loadAIConfig, generateHandoff, getPendingDoomForMCP } from '@agentbrain/core';
|
|
7
7
|
/**
|
|
8
8
|
* Expand path: handles ~, relative paths, etc.
|
|
9
9
|
*/
|
|
@@ -26,15 +26,23 @@ export async function saveHandoff(input) {
|
|
|
26
26
|
goal,
|
|
27
27
|
commitCount: commit_count,
|
|
28
28
|
});
|
|
29
|
+
// Check for doom loop warnings
|
|
30
|
+
const doomWarning = await getPendingDoomForMCP(expandedPath);
|
|
31
|
+
// Append doom warning section if detected
|
|
32
|
+
let finalContent = result.doc.content;
|
|
33
|
+
if (doomWarning && doomWarning.detected) {
|
|
34
|
+
const doomSection = `\n\n## ⚠ Doom Loop Warning\n\nThe following files were modified repeatedly before this handoff. Investigate before continuing:\n${doomWarning.files.map((f) => `- ${f}`).join('\n')}\n`;
|
|
35
|
+
finalContent = result.doc.content + doomSection;
|
|
36
|
+
}
|
|
29
37
|
// Write to disk
|
|
30
38
|
const outputDir = join(expandedPath, 'agentbrain');
|
|
31
39
|
if (!existsSync(outputDir)) {
|
|
32
40
|
await mkdir(outputDir, { recursive: true });
|
|
33
41
|
}
|
|
34
42
|
const filePath = join(outputDir, 'handoff.md');
|
|
35
|
-
await writeFile(filePath,
|
|
43
|
+
await writeFile(filePath, finalContent, 'utf-8');
|
|
36
44
|
return {
|
|
37
|
-
content:
|
|
45
|
+
content: finalContent,
|
|
38
46
|
filePath: '.agentbrain/handoff.md',
|
|
39
47
|
tokensUsed: result.tokenCount,
|
|
40
48
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-handoff.js","sourceRoot":"","sources":["../../src/tools/save-handoff.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"save-handoff.js","sourceRoot":"","sources":["../../src/tools/save-handoff.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED