@agentbrain/mcp-server 1.4.38 → 1.4.55
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/dist/tools/load-context.d.ts.map +1 -1
- package/dist/tools/load-context.js +100 -10
- package/dist/tools/load-context.js.map +1 -1
- package/dist/tools/save-context.d.ts.map +1 -1
- package/dist/tools/save-context.js +71 -65
- package/dist/tools/save-context.js.map +1 -1
- package/dist/tools/setup-repo.d.ts +1 -0
- package/dist/tools/setup-repo.d.ts.map +1 -1
- package/dist/tools/setup-repo.js +53 -13
- package/dist/tools/setup-repo.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-context.d.ts","sourceRoot":"","sources":["../../src/tools/load-context.ts"],"names":[],"mappings":"AAMA,OAAO,EAOL,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"load-context.d.ts","sourceRoot":"","sources":["../../src/tools/load-context.ts"],"names":[],"mappings":"AAMA,OAAO,EAOL,KAAK,iBAAiB,EAKvB,MAAM,kBAAkB,CAAA;AAazB,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,CA2NrF;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAkB7B,CAAA"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
// MCP tool: load_context - load context docs at session start
|
|
2
|
-
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { readFile, writeFile } 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, getPendingDoomForMCP, } from '@agentbrain/core';
|
|
6
|
+
import { loadAIConfig, generateContext, getCachedDoc, getGitHash, loadCache, getPendingDoomForMCP, ensureGitignore, installPostCommitHook, isGitRepository, createAgentFilesShared, } from '@agentbrain/core';
|
|
7
|
+
import { setupRepo } from './setup-repo.js';
|
|
7
8
|
/**
|
|
8
9
|
* Expand path: handles ~, relative paths, etc.
|
|
9
10
|
*/
|
|
@@ -31,6 +32,57 @@ export async function loadContext(input) {
|
|
|
31
32
|
const depMap = await readFile(depMapPath, 'utf-8');
|
|
32
33
|
const patterns = await readFile(patternsPath, 'utf-8');
|
|
33
34
|
const combined = `# Repository Context\n\n${context}\n\n---\n\n# Dependency Map\n\n${depMap}\n\n---\n\n# Patterns\n\n${patterns}`;
|
|
35
|
+
// Post-processing: If cache.json or setup-source.json is missing, agent wrote files directly
|
|
36
|
+
const cachePath = join(contextDir, 'cache.json');
|
|
37
|
+
const setupSourcePath = join(contextDir, 'setup-source.json');
|
|
38
|
+
const cacheExists = existsSync(cachePath);
|
|
39
|
+
const setupSourceExists = existsSync(setupSourcePath);
|
|
40
|
+
if (!cacheExists || !setupSourceExists) {
|
|
41
|
+
// Agent wrote files directly — run post-processing
|
|
42
|
+
try {
|
|
43
|
+
// Write cache.json
|
|
44
|
+
if (!cacheExists) {
|
|
45
|
+
const cache = {
|
|
46
|
+
gitHash: currentGitHash,
|
|
47
|
+
docs: {
|
|
48
|
+
context: {
|
|
49
|
+
type: 'context',
|
|
50
|
+
content: context,
|
|
51
|
+
savedAt: new Date().toISOString(),
|
|
52
|
+
},
|
|
53
|
+
'dependency-map': {
|
|
54
|
+
type: 'dependency-map',
|
|
55
|
+
content: depMap,
|
|
56
|
+
savedAt: new Date().toISOString(),
|
|
57
|
+
},
|
|
58
|
+
patterns: {
|
|
59
|
+
type: 'patterns',
|
|
60
|
+
content: patterns,
|
|
61
|
+
savedAt: new Date().toISOString(),
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
savedAt: new Date().toISOString(),
|
|
65
|
+
};
|
|
66
|
+
await writeFile(cachePath, JSON.stringify(cache, null, 2), 'utf-8');
|
|
67
|
+
}
|
|
68
|
+
// Write setup-source.json
|
|
69
|
+
if (!setupSourceExists) {
|
|
70
|
+
await writeFile(setupSourcePath, JSON.stringify({ source: 'mcp', setupAt: new Date().toISOString() }, null, 2), 'utf-8');
|
|
71
|
+
}
|
|
72
|
+
// Update .gitignore
|
|
73
|
+
await ensureGitignore(expandedPath);
|
|
74
|
+
// Install git hook if this is a git repository
|
|
75
|
+
if (isGitRepository(expandedPath)) {
|
|
76
|
+
await installPostCommitHook(expandedPath);
|
|
77
|
+
}
|
|
78
|
+
// Create agent files
|
|
79
|
+
await createAgentFilesShared(expandedPath);
|
|
80
|
+
console.error('[load_context] Post-processing completed for manually-written files');
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
console.error('[load_context] Post-processing failed:', err);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
34
86
|
// Check if cached git hash matches current HEAD
|
|
35
87
|
const cache = await loadCache(expandedPath);
|
|
36
88
|
const isStale = cache && cache.gitHash !== currentGitHash;
|
|
@@ -79,14 +131,52 @@ export async function loadContext(input) {
|
|
|
79
131
|
aiConfig = await loadAIConfig();
|
|
80
132
|
}
|
|
81
133
|
catch {
|
|
82
|
-
// No API key configured - return
|
|
134
|
+
// No API key configured - call setupRepo internally and return friendly message
|
|
135
|
+
const setupData = await setupRepo({ repo_path: expandedPath });
|
|
136
|
+
// Format file tree
|
|
137
|
+
const fileTreeSection = `\n## 📁 Repository Structure\n\n${setupData.file_tree}\n`;
|
|
138
|
+
// Format key files (truncate for readability)
|
|
139
|
+
const keyFilesSection = `\n## 🔑 Key Files Found\n\n${setupData.key_files.slice(0, 10).map(f => {
|
|
140
|
+
const preview = f.content.slice(0, 300);
|
|
141
|
+
return `**${f.path}**\n\`\`\`\n${preview}${f.content.length > 300 ? '\n...(truncated)' : ''}\n\`\`\``;
|
|
142
|
+
}).join('\n\n')}`;
|
|
143
|
+
const friendlyMessage = `👋 Looks like this is your first time setting up AgentBrain for this repo! Let me help you get started.
|
|
144
|
+
|
|
145
|
+
I've scanned your repository and found ${setupData.key_files.length} key files. Now I need you to analyze the code and create three context documents:
|
|
146
|
+
|
|
147
|
+
${fileTreeSection}
|
|
148
|
+
${keyFilesSection}
|
|
149
|
+
|
|
150
|
+
## 📝 What I Need You To Create
|
|
151
|
+
|
|
152
|
+
Based on the files above, please generate these three documents:
|
|
153
|
+
|
|
154
|
+
**1. context.md** - Architecture overview covering:
|
|
155
|
+
- What this codebase does (product purpose)
|
|
156
|
+
- Tech stack and key frameworks
|
|
157
|
+
- Repository structure and main directories
|
|
158
|
+
- Entry points and core flows
|
|
159
|
+
|
|
160
|
+
**2. dependency-map.md** - Dependency relationships covering:
|
|
161
|
+
- How modules/services relate to each other
|
|
162
|
+
- Data flow through the system
|
|
163
|
+
- External dependencies and their purposes
|
|
164
|
+
|
|
165
|
+
**3. patterns.md** - Coding patterns covering:
|
|
166
|
+
- Code conventions used consistently
|
|
167
|
+
- How new features should be structured
|
|
168
|
+
- Error handling approaches
|
|
169
|
+
- Important patterns developers should follow
|
|
170
|
+
|
|
171
|
+
Once you've created these documents, call **save_context()** with:
|
|
172
|
+
- context: [your context.md content]
|
|
173
|
+
- dependency_map: [your dependency-map.md content]
|
|
174
|
+
- patterns: [your patterns.md content]
|
|
175
|
+
- repo_path: "${expandedPath}"
|
|
176
|
+
|
|
177
|
+
${setupData.hook_installed ? '\n✅ Git hook installed - context will auto-update after commits!' : '\n⚠️ Git hook installation failed - you may need to run setup again.'}`;
|
|
83
178
|
return {
|
|
84
|
-
content:
|
|
85
|
-
'1. Call setup_repo() to scan the repo and get instructions\n' +
|
|
86
|
-
'2. Generate the three context documents based on what setup_repo returns\n' +
|
|
87
|
-
'3. Call save_context() with your generated content\n\n' +
|
|
88
|
-
'After that, load_context will work instantly with no API key needed.\n\n' +
|
|
89
|
-
'Alternative: Run `agentbrain setup` in your terminal (requires API key, one-time ~$0.03)',
|
|
179
|
+
content: friendlyMessage,
|
|
90
180
|
fromCache: false,
|
|
91
181
|
tokensUsed: 0,
|
|
92
182
|
doom_warning: null,
|
|
@@ -113,7 +203,7 @@ export async function loadContext(input) {
|
|
|
113
203
|
}
|
|
114
204
|
export const loadContextSchema = {
|
|
115
205
|
name: 'load_context',
|
|
116
|
-
description: 'Load
|
|
206
|
+
description: 'Load codebase context. If first time setup, automatically scans repo and returns file tree + key files with friendly instructions. Agent then generates context documents. No API key needed.',
|
|
117
207
|
inputSchema: {
|
|
118
208
|
type: 'object',
|
|
119
209
|
properties: {
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"load-context.js","sourceRoot":"","sources":["../../src/tools/load-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-context.d.ts","sourceRoot":"","sources":["../../src/tools/save-context.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,cAAc,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAA;IAC5D,OAAO,EAAE,MAAM,CAAA;CAChB;
|
|
1
|
+
{"version":3,"file":"save-context.d.ts","sourceRoot":"","sources":["../../src/tools/save-context.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE,MAAM,EAAE,CAAA;IACvB,cAAc,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAA;IAC5D,OAAO,EAAE,MAAM,CAAA;CAChB;AAgGD,wBAAsB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAmIrF;AAED,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;CA0B7B,CAAA"}
|
|
@@ -73,31 +73,28 @@ async function hasAgentBrainSection(filePath) {
|
|
|
73
73
|
return content.includes('── AgentBrain ──');
|
|
74
74
|
}
|
|
75
75
|
/**
|
|
76
|
-
*
|
|
76
|
+
* Update or append AgentBrain section to agent file
|
|
77
77
|
*/
|
|
78
|
-
async function
|
|
78
|
+
async function updateOrAppendAgentSection(filePath, content) {
|
|
79
79
|
const marker = '# ── AgentBrain ──────────────────────────────';
|
|
80
80
|
const endMarker = '# ── End AgentBrain ──────────────────────────';
|
|
81
|
-
if (await hasAgentBrainSection(filePath)) {
|
|
82
|
-
return; // Already has AgentBrain section
|
|
83
|
-
}
|
|
84
81
|
let existingContent = '';
|
|
85
82
|
if (existsSync(filePath)) {
|
|
86
83
|
existingContent = await readFile(filePath, 'utf-8');
|
|
87
84
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
85
|
+
// Check if AgentBrain section already exists
|
|
86
|
+
if (existingContent.includes(marker)) {
|
|
87
|
+
// Replace existing section
|
|
88
|
+
const beforeMarker = existingContent.substring(0, existingContent.indexOf(marker));
|
|
89
|
+
const afterMarker = existingContent.substring(existingContent.indexOf(endMarker) + endMarker.length);
|
|
90
|
+
const newContent = `${beforeMarker}${marker}\n${content}\n${endMarker}${afterMarker}`;
|
|
91
|
+
await writeFile(filePath, newContent, 'utf-8');
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
// Append new section
|
|
95
|
+
const agentBrainSection = `\n${marker}\n${content}\n${endMarker}\n`;
|
|
96
|
+
await writeFile(filePath, existingContent + agentBrainSection, 'utf-8');
|
|
98
97
|
}
|
|
99
|
-
// Modern files get replaced entirely (they're auto-loaded)
|
|
100
|
-
await writeFile(filePath, content, 'utf-8');
|
|
101
98
|
}
|
|
102
99
|
export async function saveContext(input) {
|
|
103
100
|
const { repo_path, context, dependency_map, patterns } = input;
|
|
@@ -143,68 +140,77 @@ export async function saveContext(input) {
|
|
|
143
140
|
};
|
|
144
141
|
await writeFile(cachePath, JSON.stringify(cache, null, 2), 'utf-8');
|
|
145
142
|
filesWritten.push('.agentbrain/cache.json');
|
|
146
|
-
//
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
// Step
|
|
143
|
+
// Write setup-source marker for git hook behavior
|
|
144
|
+
const setupSourcePath = join(contextDir, 'setup-source.json');
|
|
145
|
+
await writeFile(setupSourcePath, JSON.stringify({ source: 'mcp', setupAt: new Date().toISOString() }, null, 2), 'utf-8');
|
|
146
|
+
filesWritten.push('.agentbrain/setup-source.json');
|
|
147
|
+
// Step 4: Update .gitignore AFTER .agentbrain/ directory and all files are confirmed to exist
|
|
148
|
+
// (context.md, dependency-map.md, patterns.md, cache.json, setup-source.json)
|
|
149
|
+
try {
|
|
150
|
+
await ensureGitignore(expandedPath);
|
|
151
|
+
console.error('[save_context] .gitignore updated');
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
console.error('[save_context] .gitignore update failed:', err);
|
|
155
|
+
}
|
|
156
|
+
// Step 5 & 6: Create agent files with exclusive detection
|
|
157
|
+
// Only ONE agent file should be created/updated based on what exists
|
|
151
158
|
const modernContent = getAgentFileContent(true);
|
|
152
159
|
const legacyContent = getAgentFileContent(false);
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
160
|
+
let message = '';
|
|
161
|
+
// Define all paths
|
|
162
|
+
const cursorrules = join(expandedPath, '.cursorrules');
|
|
163
|
+
const cursorRulesDir = join(expandedPath, '.cursor', 'rules');
|
|
164
|
+
const cursorModernFile = join(cursorRulesDir, 'agentbrain.mdc');
|
|
165
|
+
const windsurfrules = join(expandedPath, '.windsurfrules');
|
|
166
|
+
const windsurfRulesDir = join(expandedPath, '.windsurf', 'rules');
|
|
167
|
+
const windsurfModernFile = join(windsurfRulesDir, 'agentbrain.md');
|
|
168
|
+
const claudePath = join(expandedPath, 'CLAUDE.md');
|
|
169
|
+
// Exclusive if/else if/else - stop after first match
|
|
170
|
+
if (existsSync(cursorrules)) {
|
|
171
|
+
// Legacy Cursor file exists
|
|
172
|
+
await updateOrAppendAgentSection(cursorrules, legacyContent);
|
|
161
173
|
filesWritten.push('.cursorrules');
|
|
174
|
+
message = 'Updated existing .cursorrules';
|
|
162
175
|
}
|
|
163
|
-
else if (
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
|
|
176
|
+
else if (existsSync(cursorRulesDir)) {
|
|
177
|
+
// Modern Cursor directory exists
|
|
178
|
+
await updateOrAppendAgentSection(cursorModernFile, modernContent);
|
|
179
|
+
filesWritten.push('.cursor/rules/agentbrain.mdc');
|
|
180
|
+
message = 'Updated .cursor/rules/agentbrain.mdc';
|
|
181
|
+
}
|
|
182
|
+
else if (existsSync(windsurfRulesDir)) {
|
|
183
|
+
// Modern Windsurf directory exists
|
|
184
|
+
await updateOrAppendAgentSection(windsurfModernFile, legacyContent);
|
|
167
185
|
filesWritten.push('.windsurf/rules/agentbrain.md');
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
186
|
+
message = 'Updated .windsurf/rules/agentbrain.md';
|
|
187
|
+
}
|
|
188
|
+
else if (existsSync(windsurfrules)) {
|
|
189
|
+
// Legacy Windsurf file exists
|
|
190
|
+
await updateOrAppendAgentSection(windsurfrules, legacyContent);
|
|
171
191
|
filesWritten.push('.windsurfrules');
|
|
192
|
+
message = 'Updated existing .windsurfrules';
|
|
172
193
|
}
|
|
173
|
-
else if (
|
|
174
|
-
//
|
|
175
|
-
|
|
176
|
-
await appendToAgentFile(claudePath, legacyContent);
|
|
194
|
+
else if (existsSync(claudePath)) {
|
|
195
|
+
// Claude file exists
|
|
196
|
+
await updateOrAppendAgentSection(claudePath, legacyContent);
|
|
177
197
|
filesWritten.push('CLAUDE.md');
|
|
198
|
+
message = 'Updated existing CLAUDE.md';
|
|
178
199
|
}
|
|
179
200
|
else {
|
|
180
|
-
//
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
await appendToAgentFile(cursorPath, legacyContent);
|
|
186
|
-
await appendToAgentFile(windsurfPath, legacyContent);
|
|
187
|
-
filesWritten.push('CLAUDE.md', '.cursorrules', '.windsurfrules');
|
|
188
|
-
}
|
|
189
|
-
// Step 7: Generate message
|
|
190
|
-
let message = '';
|
|
191
|
-
if (agentType === 'cursor') {
|
|
192
|
-
message = `Detected Cursor (.cursor/ directory found). Created .cursor/rules/agentbrain.mdc (modern, always applied) and .cursorrules (legacy fallback).`;
|
|
193
|
-
}
|
|
194
|
-
else if (agentType === 'windsurf') {
|
|
195
|
-
message = `Detected Windsurf (.windsurf/ directory found). Created .windsurf/rules/agentbrain.md (modern, always applied) and .windsurfrules (legacy fallback).`;
|
|
196
|
-
}
|
|
197
|
-
else if (agentType === 'claude') {
|
|
198
|
-
message = `Detected Claude (CLAUDE.md found). Updated CLAUDE.md with AgentBrain context loading instructions.`;
|
|
199
|
-
}
|
|
200
|
-
else {
|
|
201
|
-
message = `Could not detect your agent type. Created CLAUDE.md, .cursorrules, and .windsurfrules as a safe default. If you're using Cursor, .cursor/rules/agentbrain.mdc gives better performance. If Windsurf, use .windsurf/rules/agentbrain.md instead.`;
|
|
201
|
+
// Nothing detected - default to modern Cursor
|
|
202
|
+
await mkdir(cursorRulesDir, { recursive: true });
|
|
203
|
+
await updateOrAppendAgentSection(cursorModernFile, modernContent);
|
|
204
|
+
filesWritten.push('.cursor/rules/agentbrain.mdc');
|
|
205
|
+
message = 'Created .cursor/rules/agentbrain.mdc (modern format)';
|
|
202
206
|
}
|
|
207
|
+
// Determine agent type for response
|
|
208
|
+
let detectedAgent = detectAgentType(expandedPath);
|
|
203
209
|
return {
|
|
204
210
|
success: true,
|
|
205
211
|
files_written: filesWritten,
|
|
206
|
-
agent_detected:
|
|
207
|
-
message: `Context saved successfully. ${message}
|
|
212
|
+
agent_detected: detectedAgent,
|
|
213
|
+
message: `Context saved successfully. ${message}`,
|
|
208
214
|
};
|
|
209
215
|
}
|
|
210
216
|
export const saveContextSchema = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"save-context.js","sourceRoot":"","sources":["../../src/tools/save-context.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAEhE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC7D,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,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAE9D;;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;AAkBD;;GAEG;AACH,SAAS,eAAe,CAAC,QAAgB;IACvC,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,EAAE,CAAC;QAC1C,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO,UAAU,CAAA;IACnB,CAAC;IACD,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QAC5C,OAAO,QAAQ,CAAA;IACjB,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,cAAuB;IAClD,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;gDAmB0B,CAAA;IAE9C,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO;;;;;EAKT,WAAW,EAAE,CAAA;IACb,CAAC;IAED,OAAO,WAAW,CAAA;AACpB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,oBAAoB,CAAC,QAAgB;IAClD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACjD,OAAO,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAA;AAC7C,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,
|
|
1
|
+
{"version":3,"file":"save-context.js","sourceRoot":"","sources":["../../src/tools/save-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-repo.d.ts","sourceRoot":"","sources":["../../src/tools/setup-repo.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,MAAM,CAAA;KAChB,CAAC,CAAA;IACF,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"setup-repo.d.ts","sourceRoot":"","sources":["../../src/tools/setup-repo.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,KAAK,CAAC;QACf,IAAI,EAAE,MAAM,CAAA;QACZ,OAAO,EAAE,MAAM,CAAA;KAChB,CAAC,CAAA;IACF,cAAc,EAAE,OAAO,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CA4F/E;AAED,eAAO,MAAM,eAAe;;;;;;;;;;;;;CAc3B,CAAA"}
|
package/dist/tools/setup-repo.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// MCP tool: setup_repo - scan repo and return data for agent to generate context
|
|
2
|
-
import { scanRepository, readFileContent } from '@agentbrain/core';
|
|
2
|
+
import { scanRepository, readFileContent, installPostCommitHook, isGitRepository } from '@agentbrain/core';
|
|
3
3
|
import { resolve } from 'node:path';
|
|
4
4
|
import { homedir } from 'node:os';
|
|
5
5
|
/**
|
|
@@ -32,27 +32,67 @@ export async function setupRepo(input) {
|
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
34
|
}
|
|
35
|
-
//
|
|
36
|
-
|
|
35
|
+
// Install git hook if in a git repository
|
|
36
|
+
let hookInstalled = false;
|
|
37
|
+
if (isGitRepository(expandedPath)) {
|
|
38
|
+
try {
|
|
39
|
+
await installPostCommitHook(expandedPath);
|
|
40
|
+
hookInstalled = true;
|
|
41
|
+
console.error('[setup_repo] Hook installed successfully');
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
hookInstalled = false;
|
|
45
|
+
console.error('[setup_repo] Hook installation failed:', err);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const instructions = `You MUST follow these exact steps in order.
|
|
49
|
+
Do not deviate. Do not skip steps. Do not generate files yourself.
|
|
50
|
+
|
|
51
|
+
STEP 1: Read the file tree and key files above carefully.
|
|
52
|
+
|
|
53
|
+
STEP 2: Generate exactly THREE documents based on what you read:
|
|
54
|
+
|
|
55
|
+
DOCUMENT 1 — context.md
|
|
56
|
+
Write a concise architecture overview covering:
|
|
57
|
+
- What this codebase does (product purpose)
|
|
58
|
+
- Tech stack (frameworks, databases, key libraries)
|
|
59
|
+
- Repository layout (key directories and what they contain)
|
|
60
|
+
- Main entry points
|
|
61
|
+
- Key flows (how data moves through the system)
|
|
37
62
|
|
|
38
|
-
|
|
63
|
+
DOCUMENT 2 — dependency-map.md
|
|
64
|
+
Write a dependency and data flow overview covering:
|
|
65
|
+
- How modules/services relate to each other
|
|
66
|
+
- Request flow (from entry point to database)
|
|
67
|
+
- External dependencies and integrations
|
|
68
|
+
- What calls what
|
|
39
69
|
|
|
40
|
-
|
|
70
|
+
DOCUMENT 3 — patterns.md
|
|
71
|
+
Write a coding patterns and conventions guide covering:
|
|
72
|
+
- Code style and conventions used consistently
|
|
73
|
+
- How new features should be structured
|
|
74
|
+
- Error handling patterns
|
|
75
|
+
- Authentication/authorization patterns
|
|
76
|
+
- Anything a new developer must know to write code that fits
|
|
41
77
|
|
|
42
|
-
3
|
|
78
|
+
STEP 3: Call save_context() with ALL THREE documents.
|
|
79
|
+
Use these exact parameter names:
|
|
80
|
+
- context: [your context.md content]
|
|
81
|
+
- dependency_map: [your dependency-map.md content]
|
|
82
|
+
- patterns: [your patterns.md content]
|
|
83
|
+
- repo_path: "${expandedPath}"
|
|
43
84
|
|
|
44
|
-
|
|
85
|
+
STEP 4: Call load_context() with repo_path: "${expandedPath}"
|
|
86
|
+
to confirm context loads successfully from cache.
|
|
45
87
|
|
|
46
|
-
|
|
47
|
-
-
|
|
48
|
-
|
|
49
|
-
- Include specific file paths and module names
|
|
50
|
-
- Identify the main entry points and core business logic
|
|
51
|
-
- Note any important patterns or conventions used consistently`;
|
|
88
|
+
${hookInstalled
|
|
89
|
+
? 'Git hook installed. Context will auto-refresh after every commit.'
|
|
90
|
+
: 'Git hook could not be installed. Call setup_repo() again to retry.'}`;
|
|
52
91
|
return {
|
|
53
92
|
repo_path: expandedPath,
|
|
54
93
|
file_tree: fileTree,
|
|
55
94
|
key_files: keyFiles,
|
|
95
|
+
hook_installed: hookInstalled,
|
|
56
96
|
instructions,
|
|
57
97
|
};
|
|
58
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-repo.js","sourceRoot":"","sources":["../../src/tools/setup-repo.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"setup-repo.js","sourceRoot":"","sources":["../../src/tools/setup-repo.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAC1G,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEjC;;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;AAiBD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,KAAqB;IACnD,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAA;IAE3B,gDAAgD;IAChD,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;IAE1C,4CAA4C;IAC5C,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,YAAY,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;IAEvE,gCAAgC;IAChC,MAAM,QAAQ,GAAG,UAAU,CAAC,aAAa;SACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC;SACvC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,kDAAkD;IAClD,MAAM,QAAQ,GAA6C,EAAE,CAAA;IAE7D,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACzD,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9D,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO;aACR,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,0CAA0C;IAC1C,IAAI,aAAa,GAAG,KAAK,CAAA;IACzB,IAAI,eAAe,CAAC,YAAY,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,qBAAqB,CAAC,YAAY,CAAC,CAAA;YACzC,aAAa,GAAG,IAAI,CAAA;YACpB,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAA;QAC3D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,aAAa,GAAG,KAAK,CAAA;YACrB,OAAO,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAA;QAC9D,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmCL,YAAY;;+CAEiB,YAAY;;;EAGzD,aAAa;QACb,CAAC,CAAC,mEAAmE;QACrE,CAAC,CAAC,oEACJ,EAAE,CAAA;IAEA,OAAO;QACL,SAAS,EAAE,YAAY;QACvB,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,QAAQ;QACnB,cAAc,EAAE,aAAa;QAC7B,YAAY;KACb,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,IAAI,EAAE,YAAY;IAClB,WAAW,EACT,+LAA+L;IACjM,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,iCAAiC;aAC/C;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,CAAC;KACxB;CACF,CAAA"}
|
package/package.json
CHANGED