@agentbrain/mcp-server 1.4.20 → 1.4.34

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 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":"AAkBA,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;CACjB;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAwFrF;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAkB7B,CAAA"}
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
  */
@@ -17,7 +17,7 @@ export async function loadContext(input) {
17
17
  const { repo_path, force_refresh = false } = input;
18
18
  // Expand path to handle ~, relative paths, etc.
19
19
  const expandedPath = expandPath(repo_path);
20
- const contextDir = join(expandedPath, 'agentbrain');
20
+ const contextDir = join(expandedPath, '.agentbrain');
21
21
  // Get current git hash for staleness check
22
22
  const currentGitHash = await getGitHash(expandedPath);
23
23
  // Try to load from disk first
@@ -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,10 +46,9 @@ 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
- // Need to generate - requires API key
50
- const aiConfig = await loadAIConfig();
51
52
  // Check cache validity (using currentGitHash from above)
52
53
  const cachedContext = await getCachedDoc(expandedPath, currentGitHash, 'context');
53
54
  const cachedDepMap = await getCachedDoc(expandedPath, currentGitHash, 'dependency-map');
@@ -57,6 +58,8 @@ export async function loadContext(input) {
57
58
  // Check if cached git hash matches current HEAD
58
59
  const cache = await loadCache(expandedPath);
59
60
  const isStale = cache && cache.gitHash !== currentGitHash;
61
+ // Check for doom loop warnings
62
+ const doomWarning = await getPendingDoomForMCP(expandedPath);
60
63
  return {
61
64
  content: combined,
62
65
  fromCache: true,
@@ -67,8 +70,11 @@ export async function loadContext(input) {
67
70
  current_sha: currentGitHash,
68
71
  message: 'Context may be outdated. Run agentbrain init to refresh.',
69
72
  }),
73
+ doom_warning: doomWarning,
70
74
  };
71
75
  }
76
+ // Need to generate - requires API key (only loaded if we reach this point)
77
+ const aiConfig = await loadAIConfig();
72
78
  // Generate new context
73
79
  const result = await generateContext({
74
80
  repoPath: expandedPath,
@@ -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":"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"}
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":"AAIA,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;CAmB1B,CAAA;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqC7C"}
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"}
@@ -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;AAOtD,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,CAChC,KAAoB;IAEpB,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;IAEhC,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;aACvF,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;SAC1I,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;SACtF,CAAA;IACH,CAAC;IAED,OAAO;QACL,OAAO;QACP,IAAI;KACL,CAAA;AACH,CAAC"}
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,CA+BrF;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;CAsB7B,CAAA"}
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
- const outputDir = join(expandedPath, 'agentbrain');
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, result.doc.content, 'utf-8');
43
+ await writeFile(filePath, finalContent, 'utf-8');
36
44
  return {
37
- content: result.doc.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;AAEhE;;GAEG;AACH,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QAC1C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;IACrC,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC,CAAA;AACtB,CAAC;AAcD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,KAAuB;IACvD,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,YAAY,GAAG,CAAC,EAAE,GAAG,KAAK,CAAA;IAEnD,gDAAgD;IAChD,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;IAE1C,iBAAiB;IACjB,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAA;IAErC,mBAAmB;IACnB,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;QACnC,QAAQ,EAAE,YAAY;QACtB,QAAQ;QACR,IAAI;QACJ,WAAW,EAAE,YAAY;KAC1B,CAAC,CAAA;IAEF,gBAAgB;IAChB,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAA;IAClD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC7C,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;IAC9C,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAEtD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO;QAC3B,QAAQ,EAAE,wBAAwB;QAClC,UAAU,EAAE,MAAM,CAAC,UAAU;KAC9B,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,cAAc;IACpB,WAAW,EACT,2HAA2H;IAC7H,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iCAAiC;aAC/C;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0DAA0D;aACxE;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iEAAiE;aAC/E;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,CAAC;KACxB;CACF,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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentbrain/mcp-server",
3
- "version": "1.4.20",
3
+ "version": "1.4.34",
4
4
  "description": "Model Context Protocol server for AgentBrain - connect Claude, Cursor, and Windsurf to repository intelligence",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",