@agentbrain/mcp-server 1.4.13 → 1.4.19
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/index.js +10 -9
- package/dist/index.js.map +1 -1
- package/dist/tools/load-context.d.ts +4 -0
- package/dist/tools/load-context.d.ts.map +1 -1
- package/dist/tools/load-context.js +26 -6
- package/dist/tools/load-context.js.map +1 -1
- package/dist/tools/load-spec.d.ts.map +1 -0
- package/dist/tools/load-spec.js +51 -0
- package/dist/tools/load-spec.js.map +1 -0
- package/package.json +1 -1
- package/dist/index.d.ts +0 -3
- package/dist/tools/__tests__/load-task-context.test.d.ts +0 -2
- package/dist/tools/__tests__/load-task-context.test.d.ts.map +0 -1
- package/dist/tools/__tests__/load-task-context.test.js +0 -71
- package/dist/tools/__tests__/load-task-context.test.js.map +0 -1
- package/dist/tools/load-standards.d.ts +0 -31
- package/dist/tools/load-task-context.d.ts +0 -36
- package/dist/tools/load-task-context.d.ts.map +0 -1
- package/dist/tools/load-task-context.js +0 -57
- package/dist/tools/load-task-context.js.map +0 -1
- package/dist/tools/save-handoff.d.ts +0 -34
- package/dist/tools/scan-repo.d.ts +0 -33
package/dist/index.js
CHANGED
|
@@ -7,7 +7,7 @@ import { scanRepo, scanRepoSchema } from './tools/scan-repo.js';
|
|
|
7
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
|
-
import {
|
|
10
|
+
import { loadSpecTool, loadSpecSchema } from './tools/load-spec.js';
|
|
11
11
|
// Create MCP server
|
|
12
12
|
const server = new Server({
|
|
13
13
|
name: 'agentbrain',
|
|
@@ -24,7 +24,7 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
|
24
24
|
scanRepoSchema,
|
|
25
25
|
loadStandardsSchema,
|
|
26
26
|
loadContextSchema,
|
|
27
|
-
|
|
27
|
+
loadSpecSchema,
|
|
28
28
|
saveHandoffSchema,
|
|
29
29
|
],
|
|
30
30
|
};
|
|
@@ -57,25 +57,26 @@ server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
|
57
57
|
],
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
|
-
case '
|
|
61
|
-
const result = await
|
|
60
|
+
case 'load_spec': {
|
|
61
|
+
const result = await loadSpecTool(args);
|
|
62
62
|
return {
|
|
63
63
|
content: [
|
|
64
64
|
{
|
|
65
65
|
type: 'text',
|
|
66
|
-
text:
|
|
66
|
+
text: result.slug
|
|
67
|
+
? `${result.content}\n\n---\n\n[Loaded spec: ${result.slug}]`
|
|
68
|
+
: result.content,
|
|
67
69
|
},
|
|
68
70
|
],
|
|
69
71
|
};
|
|
70
72
|
}
|
|
71
|
-
case '
|
|
72
|
-
const
|
|
73
|
-
const result = await loadTaskContext(typedArgs);
|
|
73
|
+
case 'save_handoff': {
|
|
74
|
+
const result = await saveHandoff(args);
|
|
74
75
|
return {
|
|
75
76
|
content: [
|
|
76
77
|
{
|
|
77
78
|
type: 'text',
|
|
78
|
-
text:
|
|
79
|
+
text: `Handoff saved to ${result.filePath}\n\nTokens used: ${result.tokensUsed}\n\n---\n\n${result.content}`,
|
|
79
80
|
},
|
|
80
81
|
],
|
|
81
82
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,wBAAwB;AAExB,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAE/D,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAE9E,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAExE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAExE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,10 @@ export interface LoadContextOutput {
|
|
|
6
6
|
content: string;
|
|
7
7
|
fromCache: boolean;
|
|
8
8
|
tokensUsed: number;
|
|
9
|
+
stale?: boolean;
|
|
10
|
+
cached_sha?: string;
|
|
11
|
+
current_sha?: string;
|
|
12
|
+
message?: string;
|
|
9
13
|
}
|
|
10
14
|
export declare function loadContext(input: LoadContextInput): Promise<LoadContextOutput>;
|
|
11
15
|
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;
|
|
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"}
|
|
@@ -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 } from '@agentbrain/core';
|
|
6
|
+
import { loadAIConfig, generateContext, getCachedDoc, getGitHash, loadCache } from '@agentbrain/core';
|
|
7
7
|
/**
|
|
8
8
|
* Expand path: handles ~, relative paths, etc.
|
|
9
9
|
*/
|
|
@@ -18,6 +18,8 @@ export async function loadContext(input) {
|
|
|
18
18
|
// Expand path to handle ~, relative paths, etc.
|
|
19
19
|
const expandedPath = expandPath(repo_path);
|
|
20
20
|
const contextDir = join(expandedPath, 'agentbrain');
|
|
21
|
+
// Get current git hash for staleness check
|
|
22
|
+
const currentGitHash = await getGitHash(expandedPath);
|
|
21
23
|
// Try to load from disk first
|
|
22
24
|
const contextPath = join(contextDir, 'context.md');
|
|
23
25
|
const depMapPath = join(contextDir, 'dependency-map.md');
|
|
@@ -29,25 +31,42 @@ export async function loadContext(input) {
|
|
|
29
31
|
const depMap = await readFile(depMapPath, 'utf-8');
|
|
30
32
|
const patterns = await readFile(patternsPath, 'utf-8');
|
|
31
33
|
const combined = `# Repository Context\n\n${context}\n\n---\n\n# Dependency Map\n\n${depMap}\n\n---\n\n# Patterns\n\n${patterns}`;
|
|
34
|
+
// Check if cached git hash matches current HEAD
|
|
35
|
+
const cache = await loadCache(expandedPath);
|
|
36
|
+
const isStale = cache && cache.gitHash !== currentGitHash;
|
|
32
37
|
return {
|
|
33
38
|
content: combined,
|
|
34
39
|
fromCache: true,
|
|
35
40
|
tokensUsed: 0,
|
|
41
|
+
...(isStale && {
|
|
42
|
+
stale: true,
|
|
43
|
+
cached_sha: cache.gitHash,
|
|
44
|
+
current_sha: currentGitHash,
|
|
45
|
+
message: 'Context may be outdated. Run agentbrain init to refresh.',
|
|
46
|
+
}),
|
|
36
47
|
};
|
|
37
48
|
}
|
|
38
49
|
// Need to generate - requires API key
|
|
39
50
|
const aiConfig = await loadAIConfig();
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
const cachedPatterns = await getCachedDoc(expandedPath, gitHash, 'patterns');
|
|
51
|
+
// Check cache validity (using currentGitHash from above)
|
|
52
|
+
const cachedContext = await getCachedDoc(expandedPath, currentGitHash, 'context');
|
|
53
|
+
const cachedDepMap = await getCachedDoc(expandedPath, currentGitHash, 'dependency-map');
|
|
54
|
+
const cachedPatterns = await getCachedDoc(expandedPath, currentGitHash, 'patterns');
|
|
45
55
|
if (!force_refresh && cachedContext && cachedDepMap && cachedPatterns) {
|
|
46
56
|
const combined = `# Repository Context\n\n${cachedContext.content}\n\n---\n\n# Dependency Map\n\n${cachedDepMap.content}\n\n---\n\n# Patterns\n\n${cachedPatterns.content}`;
|
|
57
|
+
// Check if cached git hash matches current HEAD
|
|
58
|
+
const cache = await loadCache(expandedPath);
|
|
59
|
+
const isStale = cache && cache.gitHash !== currentGitHash;
|
|
47
60
|
return {
|
|
48
61
|
content: combined,
|
|
49
62
|
fromCache: true,
|
|
50
63
|
tokensUsed: 0,
|
|
64
|
+
...(isStale && {
|
|
65
|
+
stale: true,
|
|
66
|
+
cached_sha: cache.gitHash,
|
|
67
|
+
current_sha: currentGitHash,
|
|
68
|
+
message: 'Context may be outdated. Run agentbrain init to refresh.',
|
|
69
|
+
}),
|
|
51
70
|
};
|
|
52
71
|
}
|
|
53
72
|
// Generate new context
|
|
@@ -59,6 +78,7 @@ export async function loadContext(input) {
|
|
|
59
78
|
const combined = result.docs
|
|
60
79
|
.map((doc) => `# ${doc.type}\n\n${doc.content}`)
|
|
61
80
|
.join('\n\n---\n\n');
|
|
81
|
+
// Newly generated content is never stale
|
|
62
82
|
return {
|
|
63
83
|
content: combined,
|
|
64
84
|
fromCache: false,
|
|
@@ -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,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"load-context.js","sourceRoot":"","sources":["../../src/tools/load-context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// MCP tool: load_spec - Load specification files
|
|
2
|
+
import { listSpecs, loadSpec } from '@agentbrain/core';
|
|
3
|
+
export const loadSpecSchema = {
|
|
4
|
+
name: 'load_spec',
|
|
5
|
+
description: 'Load a specification file by task name, or list all available specs if no task provided',
|
|
6
|
+
inputSchema: {
|
|
7
|
+
type: 'object',
|
|
8
|
+
properties: {
|
|
9
|
+
repoPath: {
|
|
10
|
+
type: 'string',
|
|
11
|
+
description: 'Absolute path to the repository',
|
|
12
|
+
},
|
|
13
|
+
task: {
|
|
14
|
+
type: 'string',
|
|
15
|
+
description: 'Optional: Task description or slug to load specific spec (e.g., "add-stripe-webhook-handler")',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
required: ['repoPath'],
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
export async function loadSpecTool(input) {
|
|
22
|
+
const { repoPath, task } = input;
|
|
23
|
+
// If no task provided, list all available specs
|
|
24
|
+
if (!task) {
|
|
25
|
+
const specs = await listSpecs(repoPath);
|
|
26
|
+
if (specs.length === 0) {
|
|
27
|
+
return {
|
|
28
|
+
content: 'No specs found. Run `agentbrain spec "<task>"` to create your first specification.',
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
content: `Available specs:\n\n${specs.map((s) => `- ${s}`).join('\n')}\n\nTo load a spec, provide the task slug as the "task" parameter.`,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
// Convert task to slug format (kebab-case)
|
|
36
|
+
const slug = task
|
|
37
|
+
.toLowerCase()
|
|
38
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
39
|
+
.replace(/^-+|-+$/g, '');
|
|
40
|
+
const content = await loadSpec(repoPath, slug);
|
|
41
|
+
if (!content) {
|
|
42
|
+
return {
|
|
43
|
+
content: `Spec not found: ${slug}\n\nRun \`agentbrain spec "${task}"\` to create it.`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
content,
|
|
48
|
+
slug,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=load-spec.js.map
|
|
@@ -0,0 +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"}
|
package/package.json
CHANGED
package/dist/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"load-task-context.test.d.ts","sourceRoot":"","sources":["../../../src/tools/__tests__/load-task-context.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from '@jest/globals';
|
|
2
|
-
import { loadTaskContextSchema } from '../load-task-context.js';
|
|
3
|
-
// Simple unit tests for MCP tool schema and basic validation
|
|
4
|
-
// Full integration tests would require mocking the entire core module
|
|
5
|
-
describe('loadTaskContextSchema', () => {
|
|
6
|
-
it('has correct tool name', () => {
|
|
7
|
-
expect(loadTaskContextSchema.name).toBe('load_task_context');
|
|
8
|
-
});
|
|
9
|
-
it('has valid input schema structure', () => {
|
|
10
|
-
expect(loadTaskContextSchema.inputSchema).toBeDefined();
|
|
11
|
-
expect(loadTaskContextSchema.inputSchema.type).toBe('object');
|
|
12
|
-
expect(loadTaskContextSchema.inputSchema.properties).toBeDefined();
|
|
13
|
-
expect(loadTaskContextSchema.inputSchema.required).toBeDefined();
|
|
14
|
-
});
|
|
15
|
-
it('has required fields in schema', () => {
|
|
16
|
-
const required = loadTaskContextSchema.inputSchema.required;
|
|
17
|
-
expect(Array.isArray(required)).toBe(true);
|
|
18
|
-
expect(required).toContain('repo_path');
|
|
19
|
-
expect(required).toContain('task');
|
|
20
|
-
});
|
|
21
|
-
it('has optional max_files parameter', () => {
|
|
22
|
-
const properties = loadTaskContextSchema.inputSchema.properties;
|
|
23
|
-
expect(properties).toHaveProperty('max_files');
|
|
24
|
-
expect(properties.max_files.type).toBe('number');
|
|
25
|
-
const required = loadTaskContextSchema.inputSchema.required;
|
|
26
|
-
expect(required).not.toContain('max_files');
|
|
27
|
-
});
|
|
28
|
-
it('has repo_path parameter with correct type', () => {
|
|
29
|
-
const properties = loadTaskContextSchema.inputSchema.properties;
|
|
30
|
-
expect(properties.repo_path).toBeDefined();
|
|
31
|
-
expect(properties.repo_path.type).toBe('string');
|
|
32
|
-
expect(properties.repo_path.description).toBeDefined();
|
|
33
|
-
});
|
|
34
|
-
it('has task parameter with correct type', () => {
|
|
35
|
-
const properties = loadTaskContextSchema.inputSchema.properties;
|
|
36
|
-
expect(properties.task).toBeDefined();
|
|
37
|
-
expect(properties.task.type).toBe('string');
|
|
38
|
-
expect(properties.task.description).toBeDefined();
|
|
39
|
-
});
|
|
40
|
-
it('describes near-zero cost feature', () => {
|
|
41
|
-
expect(loadTaskContextSchema.description).toContain('cached summaries');
|
|
42
|
-
});
|
|
43
|
-
it('mentions re-use of cached data', () => {
|
|
44
|
-
expect(loadTaskContextSchema.description.toLowerCase()).toContain('re-use');
|
|
45
|
-
});
|
|
46
|
-
it('has clear description', () => {
|
|
47
|
-
expect(loadTaskContextSchema.description.length).toBeGreaterThan(20);
|
|
48
|
-
expect(loadTaskContextSchema.description).toContain('task');
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
describe('load-task-context module exports', () => {
|
|
52
|
-
it('exports loadTaskContext function', async () => {
|
|
53
|
-
const module = await import('../load-task-context.js');
|
|
54
|
-
expect(module.loadTaskContext).toBeDefined();
|
|
55
|
-
expect(typeof module.loadTaskContext).toBe('function');
|
|
56
|
-
});
|
|
57
|
-
it('exports loadTaskContextSchema object', async () => {
|
|
58
|
-
const module = await import('../load-task-context.js');
|
|
59
|
-
expect(module.loadTaskContextSchema).toBeDefined();
|
|
60
|
-
expect(typeof module.loadTaskContextSchema).toBe('object');
|
|
61
|
-
});
|
|
62
|
-
it('exports LoadTaskContextInput type', async () => {
|
|
63
|
-
const module = await import('../load-task-context.js');
|
|
64
|
-
expect(module).toBeDefined();
|
|
65
|
-
});
|
|
66
|
-
it('exports LoadTaskContextOutput type', async () => {
|
|
67
|
-
const module = await import('../load-task-context.js');
|
|
68
|
-
expect(module).toBeDefined();
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
//# sourceMappingURL=load-task-context.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"load-task-context.test.js","sourceRoot":"","sources":["../../../src/tools/__tests__/load-task-context.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import type { AgentTarget } from '@agentbrain/core';
|
|
2
|
-
export interface LoadStandardsInput {
|
|
3
|
-
repo_path: string;
|
|
4
|
-
agent: AgentTarget;
|
|
5
|
-
}
|
|
6
|
-
export interface LoadStandardsOutput {
|
|
7
|
-
content: string;
|
|
8
|
-
filePath: string;
|
|
9
|
-
agent: AgentTarget;
|
|
10
|
-
}
|
|
11
|
-
export declare function loadStandards(input: LoadStandardsInput): Promise<LoadStandardsOutput>;
|
|
12
|
-
export declare const loadStandardsSchema: {
|
|
13
|
-
name: string;
|
|
14
|
-
description: string;
|
|
15
|
-
inputSchema: {
|
|
16
|
-
type: string;
|
|
17
|
-
properties: {
|
|
18
|
-
repo_path: {
|
|
19
|
-
type: string;
|
|
20
|
-
description: string;
|
|
21
|
-
};
|
|
22
|
-
agent: {
|
|
23
|
-
type: string;
|
|
24
|
-
enum: string[];
|
|
25
|
-
description: string;
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
|
-
required: string[];
|
|
29
|
-
};
|
|
30
|
-
};
|
|
31
|
-
//# sourceMappingURL=load-standards.d.ts.map
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
export interface LoadTaskContextInput {
|
|
2
|
-
repo_path: string;
|
|
3
|
-
task: string;
|
|
4
|
-
max_files?: number;
|
|
5
|
-
}
|
|
6
|
-
export interface LoadTaskContextOutput {
|
|
7
|
-
content: string;
|
|
8
|
-
selectedFiles: number;
|
|
9
|
-
totalFilesScored: number;
|
|
10
|
-
tokensUsed: number;
|
|
11
|
-
cost: number;
|
|
12
|
-
}
|
|
13
|
-
export declare function loadTaskContext(input: LoadTaskContextInput): Promise<LoadTaskContextOutput>;
|
|
14
|
-
export declare const loadTaskContextSchema: {
|
|
15
|
-
name: string;
|
|
16
|
-
description: string;
|
|
17
|
-
inputSchema: {
|
|
18
|
-
type: string;
|
|
19
|
-
properties: {
|
|
20
|
-
repo_path: {
|
|
21
|
-
type: string;
|
|
22
|
-
description: string;
|
|
23
|
-
};
|
|
24
|
-
task: {
|
|
25
|
-
type: string;
|
|
26
|
-
description: string;
|
|
27
|
-
};
|
|
28
|
-
max_files: {
|
|
29
|
-
type: string;
|
|
30
|
-
description: string;
|
|
31
|
-
};
|
|
32
|
-
};
|
|
33
|
-
required: string[];
|
|
34
|
-
};
|
|
35
|
-
};
|
|
36
|
-
//# sourceMappingURL=load-task-context.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"load-task-context.d.ts","sourceRoot":"","sources":["../../src/tools/load-task-context.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;IACrB,gBAAgB,EAAE,MAAM,CAAA;IACxB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;CACb;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CAwBhC;AAED,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;CAuBjC,CAAA"}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
// MCP tool: load_task_context - load task-focused context
|
|
2
|
-
import { resolve } from 'node:path';
|
|
3
|
-
import { homedir } from 'node:os';
|
|
4
|
-
import { loadAIConfig, generateTaskContext } from '@agentbrain/core';
|
|
5
|
-
/**
|
|
6
|
-
* Expand path: handles ~, relative paths, etc.
|
|
7
|
-
*/
|
|
8
|
-
function expandPath(path) {
|
|
9
|
-
if (path.startsWith('~/') || path === '~') {
|
|
10
|
-
return path.replace('~', homedir());
|
|
11
|
-
}
|
|
12
|
-
return resolve(path);
|
|
13
|
-
}
|
|
14
|
-
export async function loadTaskContext(input) {
|
|
15
|
-
const { repo_path, task, max_files = 20 } = input;
|
|
16
|
-
// Expand path to handle ~, relative paths, etc.
|
|
17
|
-
const expandedPath = expandPath(repo_path);
|
|
18
|
-
// Load AI config
|
|
19
|
-
const aiConfig = await loadAIConfig();
|
|
20
|
-
// Generate task-focused context
|
|
21
|
-
const result = await generateTaskContext({
|
|
22
|
-
repoPath: expandedPath,
|
|
23
|
-
aiConfig,
|
|
24
|
-
task,
|
|
25
|
-
maxFiles: max_files,
|
|
26
|
-
});
|
|
27
|
-
return {
|
|
28
|
-
content: result.content,
|
|
29
|
-
selectedFiles: result.selectedFiles.length,
|
|
30
|
-
totalFilesScored: result.totalFilesScored,
|
|
31
|
-
tokensUsed: result.tokens,
|
|
32
|
-
cost: result.cost,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
export const loadTaskContextSchema = {
|
|
36
|
-
name: 'load_task_context',
|
|
37
|
-
description: 'Generate task-focused context by scoring cached file summaries against a specific task. Near-zero cost on repeat calls since it re-uses cached summaries.',
|
|
38
|
-
inputSchema: {
|
|
39
|
-
type: 'object',
|
|
40
|
-
properties: {
|
|
41
|
-
repo_path: {
|
|
42
|
-
type: 'string',
|
|
43
|
-
description: 'Absolute path to the repository',
|
|
44
|
-
},
|
|
45
|
-
task: {
|
|
46
|
-
type: 'string',
|
|
47
|
-
description: 'Description of the task (e.g., "add OAuth login to auth module", "fix bug in payment processing")',
|
|
48
|
-
},
|
|
49
|
-
max_files: {
|
|
50
|
-
type: 'number',
|
|
51
|
-
description: 'Maximum number of relevant files to include (default: 20)',
|
|
52
|
-
},
|
|
53
|
-
},
|
|
54
|
-
required: ['repo_path', 'task'],
|
|
55
|
-
},
|
|
56
|
-
};
|
|
57
|
-
//# sourceMappingURL=load-task-context.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"load-task-context.js","sourceRoot":"","sources":["../../src/tools/load-task-context.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAE1D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAEpE;;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;AAgBD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAA2B;IAE3B,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,EAAE,EAAE,GAAG,KAAK,CAAA;IAEjD,gDAAgD;IAChD,MAAM,YAAY,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;IAE1C,iBAAiB;IACjB,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAA;IAErC,gCAAgC;IAChC,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC;QACvC,QAAQ,EAAE,YAAY;QACtB,QAAQ;QACR,IAAI;QACJ,QAAQ,EAAE,SAAS;KACpB,CAAC,CAAA;IAEF,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM;QAC1C,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;QACzC,UAAU,EAAE,MAAM,CAAC,MAAM;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI;KAClB,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACT,2JAA2J;IAC7J,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,EACT,mGAAmG;aACtG;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,2DAA2D;aACzE;SACF;QACD,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC;KAChC;CACF,CAAA"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
export interface SaveHandoffInput {
|
|
2
|
-
repo_path: string;
|
|
3
|
-
goal?: string;
|
|
4
|
-
commit_count?: number;
|
|
5
|
-
}
|
|
6
|
-
export interface SaveHandoffOutput {
|
|
7
|
-
content: string;
|
|
8
|
-
filePath: string;
|
|
9
|
-
tokensUsed: number;
|
|
10
|
-
}
|
|
11
|
-
export declare function saveHandoff(input: SaveHandoffInput): Promise<SaveHandoffOutput>;
|
|
12
|
-
export declare const saveHandoffSchema: {
|
|
13
|
-
name: string;
|
|
14
|
-
description: string;
|
|
15
|
-
inputSchema: {
|
|
16
|
-
type: string;
|
|
17
|
-
properties: {
|
|
18
|
-
repo_path: {
|
|
19
|
-
type: string;
|
|
20
|
-
description: string;
|
|
21
|
-
};
|
|
22
|
-
goal: {
|
|
23
|
-
type: string;
|
|
24
|
-
description: string;
|
|
25
|
-
};
|
|
26
|
-
commit_count: {
|
|
27
|
-
type: string;
|
|
28
|
-
description: string;
|
|
29
|
-
};
|
|
30
|
-
};
|
|
31
|
-
required: string[];
|
|
32
|
-
};
|
|
33
|
-
};
|
|
34
|
-
//# sourceMappingURL=save-handoff.d.ts.map
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
export interface ScanRepoInput {
|
|
2
|
-
repo_path: string;
|
|
3
|
-
max_files?: number;
|
|
4
|
-
}
|
|
5
|
-
export interface ScanRepoOutput {
|
|
6
|
-
totalFiles: number;
|
|
7
|
-
relevantFiles: Array<{
|
|
8
|
-
path: string;
|
|
9
|
-
language: string;
|
|
10
|
-
size: number;
|
|
11
|
-
}>;
|
|
12
|
-
scannedAt: string;
|
|
13
|
-
}
|
|
14
|
-
export declare function scanRepo(input: ScanRepoInput): Promise<ScanRepoOutput>;
|
|
15
|
-
export declare const scanRepoSchema: {
|
|
16
|
-
name: string;
|
|
17
|
-
description: string;
|
|
18
|
-
inputSchema: {
|
|
19
|
-
type: string;
|
|
20
|
-
properties: {
|
|
21
|
-
repo_path: {
|
|
22
|
-
type: string;
|
|
23
|
-
description: string;
|
|
24
|
-
};
|
|
25
|
-
max_files: {
|
|
26
|
-
type: string;
|
|
27
|
-
description: string;
|
|
28
|
-
};
|
|
29
|
-
};
|
|
30
|
-
required: string[];
|
|
31
|
-
};
|
|
32
|
-
};
|
|
33
|
-
//# sourceMappingURL=scan-repo.d.ts.map
|