@context-forge/mcp 0.8.5 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/agentGuideTool.d.ts +3 -0
- package/dist/tools/agentGuideTool.d.ts.map +1 -0
- package/dist/tools/agentGuideTool.js +83 -0
- package/dist/tools/agentGuideTool.js.map +1 -0
- package/dist/tools/agentOnboardTool.d.ts +3 -0
- package/dist/tools/agentOnboardTool.d.ts.map +1 -0
- package/dist/tools/agentOnboardTool.js +85 -0
- package/dist/tools/agentOnboardTool.js.map +1 -0
- package/dist/tools/agentQuickstartTool.d.ts +3 -0
- package/dist/tools/agentQuickstartTool.d.ts.map +1 -0
- package/dist/tools/agentQuickstartTool.js +60 -0
- package/dist/tools/agentQuickstartTool.js.map +1 -0
- package/dist/tools/configTools.d.ts +3 -0
- package/dist/tools/configTools.d.ts.map +1 -0
- package/dist/tools/configTools.js +76 -0
- package/dist/tools/configTools.js.map +1 -0
- package/dist/tools/contextTools.d.ts +28 -0
- package/dist/tools/contextTools.d.ts.map +1 -0
- package/dist/tools/contextTools.js +229 -0
- package/dist/tools/contextTools.js.map +1 -0
- package/dist/tools/guideTools.d.ts +3 -0
- package/dist/tools/guideTools.d.ts.map +1 -0
- package/dist/tools/guideTools.js +130 -0
- package/dist/tools/guideTools.js.map +1 -0
- package/dist/tools/introspectionTools.d.ts +3 -0
- package/dist/tools/introspectionTools.d.ts.map +1 -0
- package/dist/tools/introspectionTools.js +276 -0
- package/dist/tools/introspectionTools.js.map +1 -0
- package/dist/tools/projectTools.d.ts +3 -0
- package/dist/tools/projectTools.d.ts.map +1 -0
- package/dist/tools/projectTools.js +264 -0
- package/dist/tools/projectTools.js.map +1 -0
- package/dist/tools/resolveOperationPath.d.ts +28 -0
- package/dist/tools/resolveOperationPath.d.ts.map +1 -0
- package/dist/tools/resolveOperationPath.js +56 -0
- package/dist/tools/resolveOperationPath.js.map +1 -0
- package/dist/tools/resolveProjectId.d.ts +14 -0
- package/dist/tools/resolveProjectId.d.ts.map +1 -0
- package/dist/tools/resolveProjectId.js +86 -0
- package/dist/tools/resolveProjectId.js.map +1 -0
- package/dist/tools/stateTools.d.ts +3 -0
- package/dist/tools/stateTools.d.ts.map +1 -0
- package/dist/tools/stateTools.js +55 -0
- package/dist/tools/stateTools.js.map +1 -0
- package/dist/tools/versionTool.d.ts +3 -0
- package/dist/tools/versionTool.d.ts.map +1 -0
- package/dist/tools/versionTool.js +11 -0
- package/dist/tools/versionTool.js.map +1 -0
- package/dist/tools/workflowTools.d.ts +3 -0
- package/dist/tools/workflowTools.d.ts.map +1 -0
- package/dist/tools/workflowTools.js +272 -0
- package/dist/tools/workflowTools.js.map +1 -0
- package/dist/tools/worktreeTools.d.ts +3 -0
- package/dist/tools/worktreeTools.d.ts.map +1 -0
- package/dist/tools/worktreeTools.js +234 -0
- package/dist/tools/worktreeTools.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { FileProjectStore, ArtifactIntrospector, buildModel, mergeProjectModels, } from '@context-forge/core/node';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { resolveProjectId } from './resolveProjectId.js';
|
|
5
|
+
import { resolveOperationContext, resolveAllOperationPaths } from './resolveOperationPath.js';
|
|
6
|
+
function errorResult(message) {
|
|
7
|
+
return { content: [{ type: 'text', text: message }], isError: true };
|
|
8
|
+
}
|
|
9
|
+
function jsonResult(data) {
|
|
10
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Resolve an absolute file path from either:
|
|
14
|
+
* - filePath (absolute, takes precedence)
|
|
15
|
+
* - projectId + path (resolved via project store)
|
|
16
|
+
*/
|
|
17
|
+
async function resolveIntrospectionPath(args) {
|
|
18
|
+
if (args.filePath) {
|
|
19
|
+
return args.filePath;
|
|
20
|
+
}
|
|
21
|
+
if (!args.path) {
|
|
22
|
+
throw new Error('Either filePath (absolute) or projectId + path (relative) must be provided.');
|
|
23
|
+
}
|
|
24
|
+
// Use worktree-aware resolution when worktreeId is provided
|
|
25
|
+
if (args.worktreeId) {
|
|
26
|
+
const { operationPath } = await resolveOperationContext({
|
|
27
|
+
projectId: args.projectId,
|
|
28
|
+
worktreeId: args.worktreeId,
|
|
29
|
+
});
|
|
30
|
+
return join(operationPath, args.path);
|
|
31
|
+
}
|
|
32
|
+
const resolvedId = await resolveProjectId(args.projectId);
|
|
33
|
+
const store = new FileProjectStore();
|
|
34
|
+
const project = await store.getById(resolvedId);
|
|
35
|
+
if (!project) {
|
|
36
|
+
throw new Error(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects.`);
|
|
37
|
+
}
|
|
38
|
+
if (!project.projectPath) {
|
|
39
|
+
throw new Error(`Project '${resolvedId}' has no projectPath configured. Set it with project_update.`);
|
|
40
|
+
}
|
|
41
|
+
return join(project.projectPath, args.path);
|
|
42
|
+
}
|
|
43
|
+
// Common input schema fragments
|
|
44
|
+
const filePathSchema = {
|
|
45
|
+
projectId: z
|
|
46
|
+
.string()
|
|
47
|
+
.optional()
|
|
48
|
+
.describe('Project ID. Omit to resolve from CWD.'),
|
|
49
|
+
path: z
|
|
50
|
+
.string()
|
|
51
|
+
.optional()
|
|
52
|
+
.describe('Relative path from project root to the target file.'),
|
|
53
|
+
filePath: z
|
|
54
|
+
.string()
|
|
55
|
+
.optional()
|
|
56
|
+
.describe('Absolute path to the target file. Overrides projectId + path.'),
|
|
57
|
+
worktreeId: z
|
|
58
|
+
.string()
|
|
59
|
+
.optional()
|
|
60
|
+
.describe('Worktree name or ID. Omit to use project root.'),
|
|
61
|
+
};
|
|
62
|
+
export function registerIntrospectionTools(server) {
|
|
63
|
+
// --- introspection_slice_plan ---
|
|
64
|
+
server.registerTool('introspection_slice_plan', {
|
|
65
|
+
title: 'Parse Slice Plan',
|
|
66
|
+
description: 'Parse a slice plan document and return structured data: entries with index, name, status, ' +
|
|
67
|
+
'isChecked, plus totalSlices and completedSlices counts.',
|
|
68
|
+
inputSchema: filePathSchema,
|
|
69
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
70
|
+
}, async (args) => {
|
|
71
|
+
try {
|
|
72
|
+
const resolved = await resolveIntrospectionPath(args);
|
|
73
|
+
const introspector = new ArtifactIntrospector();
|
|
74
|
+
const result = await introspector.parseSlicePlan(resolved);
|
|
75
|
+
// Filter by worktree index range if applicable
|
|
76
|
+
if (args.worktreeId) {
|
|
77
|
+
const { indexRange } = await resolveOperationContext({
|
|
78
|
+
projectId: args.projectId,
|
|
79
|
+
worktreeId: args.worktreeId,
|
|
80
|
+
});
|
|
81
|
+
if (indexRange) {
|
|
82
|
+
result.entries = result.entries.filter((e) => e.index >= indexRange[0] && e.index <= indexRange[1]);
|
|
83
|
+
result.totalSlices = result.entries.length;
|
|
84
|
+
result.completedSlices = result.entries.filter((e) => e.isChecked).length;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return jsonResult(result);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
91
|
+
return errorResult(`Error: ${msg}`);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
// --- introspection_tasks ---
|
|
95
|
+
server.registerTool('introspection_tasks', {
|
|
96
|
+
title: 'Parse Task File',
|
|
97
|
+
description: 'Parse a task file and return structured data: items with name and done status, ' +
|
|
98
|
+
'plus totalTasks, completedTasks, and inferredStatus.',
|
|
99
|
+
inputSchema: filePathSchema,
|
|
100
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
101
|
+
}, async (args) => {
|
|
102
|
+
try {
|
|
103
|
+
const resolved = await resolveIntrospectionPath(args);
|
|
104
|
+
const introspector = new ArtifactIntrospector();
|
|
105
|
+
const result = await introspector.parseTaskFile(resolved);
|
|
106
|
+
return jsonResult(result);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
110
|
+
return errorResult(`Error: ${msg}`);
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
// --- introspection_frontmatter ---
|
|
114
|
+
server.registerTool('introspection_frontmatter', {
|
|
115
|
+
title: 'Parse Frontmatter',
|
|
116
|
+
description: 'Extract YAML frontmatter from a markdown file. Returns found (boolean) and data ' +
|
|
117
|
+
'(key-value pairs).',
|
|
118
|
+
inputSchema: filePathSchema,
|
|
119
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
120
|
+
}, async (args) => {
|
|
121
|
+
try {
|
|
122
|
+
const resolved = await resolveIntrospectionPath(args);
|
|
123
|
+
const introspector = new ArtifactIntrospector();
|
|
124
|
+
const result = await introspector.parseFrontmatter(resolved);
|
|
125
|
+
return jsonResult(result);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
129
|
+
return errorResult(`Error: ${msg}`);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
// --- introspection_documents ---
|
|
133
|
+
server.registerTool('introspection_documents', {
|
|
134
|
+
title: 'Detect Documents',
|
|
135
|
+
description: 'Detect methodology documents for a given slice index. Returns paths to sliceDesign, ' +
|
|
136
|
+
'taskFile(s), architecture, and slicePlan if they exist.',
|
|
137
|
+
inputSchema: {
|
|
138
|
+
projectId: z
|
|
139
|
+
.string()
|
|
140
|
+
.optional()
|
|
141
|
+
.describe('Project ID. Omit to resolve from CWD.'),
|
|
142
|
+
projectPath: z
|
|
143
|
+
.string()
|
|
144
|
+
.optional()
|
|
145
|
+
.describe('Absolute path to project root. Overrides projectId.'),
|
|
146
|
+
worktreeId: z
|
|
147
|
+
.string()
|
|
148
|
+
.optional()
|
|
149
|
+
.describe('Worktree name or ID. Omit to use project root.'),
|
|
150
|
+
sliceIndex: z
|
|
151
|
+
.number()
|
|
152
|
+
.describe('Numeric slice index to check (e.g., 163).'),
|
|
153
|
+
},
|
|
154
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
155
|
+
}, async (args) => {
|
|
156
|
+
try {
|
|
157
|
+
let resolved;
|
|
158
|
+
if (args.projectPath) {
|
|
159
|
+
resolved = args.projectPath;
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
const ctx = await resolveOperationContext({
|
|
163
|
+
projectId: args.projectId,
|
|
164
|
+
worktreeId: args.worktreeId,
|
|
165
|
+
});
|
|
166
|
+
resolved = ctx.operationPath;
|
|
167
|
+
}
|
|
168
|
+
const introspector = new ArtifactIntrospector();
|
|
169
|
+
const result = await introspector.detectDocuments(resolved, args.sliceIndex);
|
|
170
|
+
return jsonResult(result);
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
174
|
+
return errorResult(`Error: ${msg}`);
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
// --- introspection_future_work ---
|
|
178
|
+
server.registerTool('introspection_future_work', {
|
|
179
|
+
title: 'Parse Future Work',
|
|
180
|
+
description: 'Parse the Future Work section from a slice plan document. Returns items with index, ' +
|
|
181
|
+
'name, and done status.',
|
|
182
|
+
inputSchema: {
|
|
183
|
+
...filePathSchema,
|
|
184
|
+
nextIndex: z
|
|
185
|
+
.number()
|
|
186
|
+
.optional()
|
|
187
|
+
.describe('Starting index for auto-numbering unnumbered items.'),
|
|
188
|
+
},
|
|
189
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
190
|
+
}, async (args) => {
|
|
191
|
+
try {
|
|
192
|
+
const resolved = await resolveIntrospectionPath(args);
|
|
193
|
+
const introspector = new ArtifactIntrospector();
|
|
194
|
+
const result = await introspector.parseFutureWork(resolved, args.nextIndex);
|
|
195
|
+
// Filter by worktree index range if applicable
|
|
196
|
+
if (args.worktreeId) {
|
|
197
|
+
const { indexRange } = await resolveOperationContext({
|
|
198
|
+
projectId: args.projectId,
|
|
199
|
+
worktreeId: args.worktreeId,
|
|
200
|
+
});
|
|
201
|
+
if (indexRange && result.items) {
|
|
202
|
+
result.items = result.items.filter((item) => {
|
|
203
|
+
if (!item.index)
|
|
204
|
+
return true;
|
|
205
|
+
const idx = parseInt(item.index, 10);
|
|
206
|
+
return isNaN(idx) || (idx >= indexRange[0] && idx <= indexRange[1]);
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return jsonResult(result);
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
214
|
+
return errorResult(`Error: ${msg}`);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
// --- project_structure ---
|
|
218
|
+
server.registerTool('project_structure', {
|
|
219
|
+
title: 'Project Structure',
|
|
220
|
+
description: 'Build the full project model for a Context Forge project. Returns structured data ' +
|
|
221
|
+
'including foundation docs, project architecture, initiatives with slices and tasks, ' +
|
|
222
|
+
'future slices, quality/investigation/maintenance docs, and devlog status. ' +
|
|
223
|
+
'Equivalent to parse.py build_model() output.',
|
|
224
|
+
inputSchema: {
|
|
225
|
+
projectId: z
|
|
226
|
+
.string()
|
|
227
|
+
.optional()
|
|
228
|
+
.describe('Project ID. Omit to resolve from CWD.'),
|
|
229
|
+
worktreeId: z
|
|
230
|
+
.string()
|
|
231
|
+
.optional()
|
|
232
|
+
.describe('Worktree name or ID. Omit to use project root.'),
|
|
233
|
+
all: z
|
|
234
|
+
.boolean()
|
|
235
|
+
.optional()
|
|
236
|
+
.describe('Scan all worktree paths and aggregate results.'),
|
|
237
|
+
name: z.string().optional().describe('Override project name in output.'),
|
|
238
|
+
description: z.string().optional().describe('Override project description in output.'),
|
|
239
|
+
},
|
|
240
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
241
|
+
}, async (args) => {
|
|
242
|
+
try {
|
|
243
|
+
if (args.all) {
|
|
244
|
+
const { paths } = await resolveAllOperationPaths({ projectId: args.projectId });
|
|
245
|
+
const models = (await Promise.all(paths.map((p) => buildModel(p, { name: args.name, description: args.description }).catch(() => null)))).filter((m) => m !== null);
|
|
246
|
+
if (models.length === 0) {
|
|
247
|
+
return errorResult('No models could be built from any worktree path.');
|
|
248
|
+
}
|
|
249
|
+
return jsonResult(mergeProjectModels(models));
|
|
250
|
+
}
|
|
251
|
+
const { operationPath, indexRange } = await resolveOperationContext({
|
|
252
|
+
projectId: args.projectId,
|
|
253
|
+
worktreeId: args.worktreeId,
|
|
254
|
+
});
|
|
255
|
+
const result = await buildModel(operationPath, {
|
|
256
|
+
name: args.name,
|
|
257
|
+
description: args.description,
|
|
258
|
+
});
|
|
259
|
+
// Filter initiatives by index range
|
|
260
|
+
if (indexRange) {
|
|
261
|
+
for (const key of Object.keys(result.initiatives)) {
|
|
262
|
+
const idx = parseInt(key, 10);
|
|
263
|
+
if (idx < indexRange[0] || idx > indexRange[1]) {
|
|
264
|
+
delete result.initiatives[key];
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return jsonResult(result);
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
const msg = error instanceof Error ? error.message : String(error);
|
|
272
|
+
return errorResult(`Error: ${msg}`);
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
//# sourceMappingURL=introspectionTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"introspectionTools.js","sourceRoot":"","sources":["../../src/tools/introspectionTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectTools.d.ts","sourceRoot":"","sources":["../../src/tools/projectTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuCpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAySpF"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { FileProjectStore, ArtifactIntrospector, WorktreeService, computeAutoSetFields } from '@context-forge/core/node';
|
|
4
|
+
import { getSchema, resolveProject, WORKTREE_SCOPED_FIELDS, PROJECT_TO_WORKTREE_FIELD, buildProjectCreationDefaults } from '@context-forge/core';
|
|
5
|
+
import { resolveProjectId } from './resolveProjectId.js';
|
|
6
|
+
function toSummary(project) {
|
|
7
|
+
return {
|
|
8
|
+
id: project.id,
|
|
9
|
+
name: project.name,
|
|
10
|
+
fileSlice: project.fileSlice,
|
|
11
|
+
template: project.template,
|
|
12
|
+
instruction: project.instruction,
|
|
13
|
+
projectPath: project.projectPath,
|
|
14
|
+
updatedAt: project.updatedAt,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function errorResult(message) {
|
|
18
|
+
return { content: [{ type: 'text', text: message }], isError: true };
|
|
19
|
+
}
|
|
20
|
+
function jsonResult(data) {
|
|
21
|
+
return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
|
|
22
|
+
}
|
|
23
|
+
export function registerProjectTools(server, serverVersion) {
|
|
24
|
+
// --- project_list ---
|
|
25
|
+
server.registerTool('project_list', {
|
|
26
|
+
title: 'List Projects',
|
|
27
|
+
description: 'List all configured Context Forge projects. Returns project IDs, names, current slices, and other summary fields. Use this to discover available projects before calling project_get or project_update.',
|
|
28
|
+
inputSchema: {},
|
|
29
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
30
|
+
}, async () => {
|
|
31
|
+
try {
|
|
32
|
+
const store = new FileProjectStore();
|
|
33
|
+
const allProjects = await store.getAll();
|
|
34
|
+
const projects = allProjects.map(toSummary);
|
|
35
|
+
return jsonResult({ projects, count: projects.length });
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
39
|
+
return errorResult(`Error: ${message}`);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
// --- project_create ---
|
|
43
|
+
server.registerTool('project_create', {
|
|
44
|
+
title: 'Create Project',
|
|
45
|
+
description: 'Create a new Context Forge project entry with sensible defaults. Returns the same shape as project_get (full ProjectData plus introspection when projectPath is provided). Does NOT install guides, commands, or configure the IDE — those are separate operations.',
|
|
46
|
+
inputSchema: {
|
|
47
|
+
name: z.string().describe('Project display name (required)'),
|
|
48
|
+
projectPath: z.string().optional().describe('Absolute path to the project root. When omitted, the project is created without a path (can be set later via project_update).'),
|
|
49
|
+
developmentPhase: z.string().optional().describe('Initial development phase. Defaults to "Phase 0: Concept".'),
|
|
50
|
+
},
|
|
51
|
+
annotations: { destructiveHint: false, idempotentHint: false, openWorldHint: false },
|
|
52
|
+
}, async ({ name, projectPath, developmentPhase }) => {
|
|
53
|
+
try {
|
|
54
|
+
const trimmedName = name.trim();
|
|
55
|
+
if (!trimmedName) {
|
|
56
|
+
return errorResult('Project name is required.');
|
|
57
|
+
}
|
|
58
|
+
const normalizedPath = projectPath ? path.resolve(projectPath.trim()) : undefined;
|
|
59
|
+
const store = new FileProjectStore();
|
|
60
|
+
if (normalizedPath) {
|
|
61
|
+
const existing = await store.getAll();
|
|
62
|
+
const duplicate = existing.find((p) => p.projectPath === normalizedPath);
|
|
63
|
+
if (duplicate) {
|
|
64
|
+
return errorResult(`A project is already registered at this path: '${duplicate.name}' (ID: ${duplicate.id}). Use project_get to retrieve it.`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const project = await store.create(buildProjectCreationDefaults({
|
|
68
|
+
name: trimmedName,
|
|
69
|
+
projectPath: normalizedPath,
|
|
70
|
+
developmentPhase,
|
|
71
|
+
}));
|
|
72
|
+
if (project.projectPath) {
|
|
73
|
+
try {
|
|
74
|
+
const introspector = new ArtifactIntrospector();
|
|
75
|
+
const introspection = await introspector.summarize(project);
|
|
76
|
+
return jsonResult({ ...project, introspection });
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
80
|
+
console.error(`Introspection failed for new project ${project.id}: ${msg}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return jsonResult(project);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
87
|
+
return errorResult(`Error: ${message}`);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
// --- project_get ---
|
|
91
|
+
server.registerTool('project_get', {
|
|
92
|
+
title: 'Get Project',
|
|
93
|
+
description: 'Get full details for a specific Context Forge project by ID. Returns all project fields including configuration, custom data, and timestamps. When the project has a projectPath, the response includes an `introspection` field with: slicePlan (totalSlices, completedSlices, summary), currentTasks (totalTasks, completedTasks, inferredStatus, summary), and artifacts (presence flags for slicePlan, HLD, arch, spec, currentSliceDesign, currentTaskFile). Use project_list first to find project IDs.',
|
|
94
|
+
inputSchema: {
|
|
95
|
+
id: z.string().optional().describe('Project ID (e.g., project_1739...). Omit to resolve from CWD.'),
|
|
96
|
+
worktreeId: z
|
|
97
|
+
.string()
|
|
98
|
+
.optional()
|
|
99
|
+
.describe('Worktree ID or name. When provided, returns the resolved project view with ' +
|
|
100
|
+
'worktree-scoped fields (fileSlice, fileArch, developmentPhase, etc.) reflecting ' +
|
|
101
|
+
"the worktree's values instead of the project-level values."),
|
|
102
|
+
},
|
|
103
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
104
|
+
}, async ({ id, worktreeId }) => {
|
|
105
|
+
try {
|
|
106
|
+
const resolvedId = await resolveProjectId(id);
|
|
107
|
+
const store = new FileProjectStore();
|
|
108
|
+
const project = await resolveProject(store, resolvedId, worktreeId);
|
|
109
|
+
if (!project) {
|
|
110
|
+
return errorResult(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects and their IDs.`);
|
|
111
|
+
}
|
|
112
|
+
const serverInfo = serverVersion
|
|
113
|
+
? { serverVersion, hint: 'Call agent_quickstart for tool orientation, agent_onboard for new project setup.' }
|
|
114
|
+
: undefined;
|
|
115
|
+
// Enrich with introspection when projectPath is available
|
|
116
|
+
if (project.projectPath) {
|
|
117
|
+
try {
|
|
118
|
+
const introspector = new ArtifactIntrospector();
|
|
119
|
+
const introspection = await introspector.summarize(project);
|
|
120
|
+
return jsonResult({ ...project, introspection, ...(serverInfo && { serverInfo }) });
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
// Graceful degradation — return project without introspection
|
|
124
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
125
|
+
console.error(`Introspection failed for project ${resolvedId}: ${msg}`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return jsonResult({ ...project, ...(serverInfo && { serverInfo }) });
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
132
|
+
return errorResult(`Error: ${message}`);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
// --- project_update ---
|
|
136
|
+
server.registerTool('project_update', {
|
|
137
|
+
title: 'Update Project',
|
|
138
|
+
description: 'Update configuration fields on an existing Context Forge project. Provide the project ID and any fields to change (e.g., fileSlice, instruction, developmentPhase). Returns the full updated project. Does not delete or replace — only modifies specified fields.',
|
|
139
|
+
inputSchema: {
|
|
140
|
+
id: z.string().optional().describe('Project ID to update. Omit to resolve from CWD.'),
|
|
141
|
+
worktreeId: z.string().optional().describe('Worktree ID or name. When provided, workflow fields (fileSlice, instruction, etc.) are routed to the worktree context instead of the project.'),
|
|
142
|
+
name: z.string().optional().describe('Project display name'),
|
|
143
|
+
template: z.string().optional().describe('Template name'),
|
|
144
|
+
fileSlice: z.string().optional().describe('Current slice name'),
|
|
145
|
+
fileTasks: z.string().optional().describe('Task file name'),
|
|
146
|
+
instruction: z.string().optional().describe('Instruction type (e.g., implementation, design, review)'),
|
|
147
|
+
developmentPhase: z.string().optional().describe('Current development phase'),
|
|
148
|
+
workType: z.enum(['start', 'continue']).optional().describe('Whether starting or continuing work'),
|
|
149
|
+
dateProject: z.string().optional().describe('Project date string'),
|
|
150
|
+
projectPath: z.string().optional().describe('Absolute path to project root'),
|
|
151
|
+
fileHLD: z.string().optional().describe('Path to HLD document (relative to project root)'),
|
|
152
|
+
fileArch: z.string().optional().describe('Path to architecture document (relative to project root)'),
|
|
153
|
+
fileSlicePlan: z.string().optional().describe('Path to slice plan (relative to project root)'),
|
|
154
|
+
fileSpec: z.string().optional().describe('Path to project spec (relative to project root)'),
|
|
155
|
+
fileConcept: z.string().optional().describe('Path to concept document (relative to project root)'),
|
|
156
|
+
customData: z
|
|
157
|
+
.object({
|
|
158
|
+
recentEvents: z.string().optional(),
|
|
159
|
+
additionalNotes: z.string().optional(),
|
|
160
|
+
availableTools: z.string().optional(),
|
|
161
|
+
})
|
|
162
|
+
.optional()
|
|
163
|
+
.describe('Custom data fields for context generation'),
|
|
164
|
+
},
|
|
165
|
+
annotations: { destructiveHint: false, idempotentHint: true, openWorldHint: false },
|
|
166
|
+
}, async ({ id, worktreeId, ...fields }) => {
|
|
167
|
+
try {
|
|
168
|
+
const resolvedId = await resolveProjectId(id);
|
|
169
|
+
// Collect defined update fields (exclude undefined values)
|
|
170
|
+
const allUpdates = {};
|
|
171
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
172
|
+
if (value !== undefined) {
|
|
173
|
+
allUpdates[key] = value;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (Object.keys(allUpdates).length === 0) {
|
|
177
|
+
return errorResult('No update fields provided. Specify at least one field to update (e.g., fileSlice, instruction, name).');
|
|
178
|
+
}
|
|
179
|
+
const store = new FileProjectStore();
|
|
180
|
+
// Check project exists
|
|
181
|
+
const existing = await store.getById(resolvedId);
|
|
182
|
+
if (!existing) {
|
|
183
|
+
return errorResult(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects and their IDs.`);
|
|
184
|
+
}
|
|
185
|
+
// --- Worktree-aware field routing ---
|
|
186
|
+
if (worktreeId) {
|
|
187
|
+
const service = new WorktreeService(store);
|
|
188
|
+
let wt = await service.getWorktree(resolvedId, worktreeId);
|
|
189
|
+
if (!wt) {
|
|
190
|
+
wt = await service.getWorktreeByName(resolvedId, worktreeId);
|
|
191
|
+
}
|
|
192
|
+
if (!wt) {
|
|
193
|
+
return errorResult(`Worktree '${worktreeId}' not found. Use worktree_list to see available worktrees.`);
|
|
194
|
+
}
|
|
195
|
+
// Split fields into worktree-scoped and project-level
|
|
196
|
+
const worktreeUpdates = {};
|
|
197
|
+
const projectUpdates = {};
|
|
198
|
+
for (const [key, value] of Object.entries(allUpdates)) {
|
|
199
|
+
if (WORKTREE_SCOPED_FIELDS.has(key)) {
|
|
200
|
+
const wtKey = PROJECT_TO_WORKTREE_FIELD[key] ?? key;
|
|
201
|
+
worktreeUpdates[wtKey] = value;
|
|
202
|
+
// Compute auto-set fields (skip if caller explicitly provided the derived field)
|
|
203
|
+
const autoSet = computeAutoSetFields(key, value, existing.projectPath);
|
|
204
|
+
for (const [derivedField, derivedValue] of Object.entries(autoSet.derivedUpdates)) {
|
|
205
|
+
if (!(derivedField in allUpdates)) {
|
|
206
|
+
const derivedWtKey = PROJECT_TO_WORKTREE_FIELD[derivedField] ?? derivedField;
|
|
207
|
+
worktreeUpdates[derivedWtKey] = derivedValue;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
projectUpdates[key] = value;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Apply worktree updates
|
|
216
|
+
if (Object.keys(worktreeUpdates).length > 0) {
|
|
217
|
+
await service.updateWorktree(resolvedId, wt.id, worktreeUpdates);
|
|
218
|
+
}
|
|
219
|
+
// Apply project-level updates
|
|
220
|
+
if (Object.keys(projectUpdates).length > 0) {
|
|
221
|
+
await store.update(resolvedId, projectUpdates);
|
|
222
|
+
}
|
|
223
|
+
const updated = await store.getById(resolvedId);
|
|
224
|
+
return jsonResult({ ...updated, _worktreeUpdated: wt.id });
|
|
225
|
+
}
|
|
226
|
+
// --- Standard (non-worktree) path ---
|
|
227
|
+
const updates = { ...allUpdates };
|
|
228
|
+
const autoSetInfo = {};
|
|
229
|
+
// Compute auto-set derived fields for each updated field
|
|
230
|
+
for (const [key, value] of Object.entries(allUpdates)) {
|
|
231
|
+
const autoSet = computeAutoSetFields(key, value, existing.projectPath);
|
|
232
|
+
for (const [derivedField, derivedValue] of Object.entries(autoSet.derivedUpdates)) {
|
|
233
|
+
// Only auto-set if caller didn't explicitly provide the derived field
|
|
234
|
+
if (!(derivedField in allUpdates)) {
|
|
235
|
+
updates[derivedField] = derivedValue;
|
|
236
|
+
autoSetInfo[derivedField] = derivedValue;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
await store.update(resolvedId, updates);
|
|
241
|
+
// Read back updated project
|
|
242
|
+
const updated = await store.getById(resolvedId);
|
|
243
|
+
const result = { ...updated };
|
|
244
|
+
if (Object.keys(autoSetInfo).length > 0) {
|
|
245
|
+
result._autoSet = autoSetInfo;
|
|
246
|
+
}
|
|
247
|
+
return jsonResult(result);
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
251
|
+
return errorResult(`Error: ${message}`);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
// --- project_schema ---
|
|
255
|
+
server.registerTool('project_schema', {
|
|
256
|
+
title: 'Project Schema',
|
|
257
|
+
description: 'Returns the full project data schema including field definitions, aliases, groups, and enum values. Use this to discover available fields for project_update, understand field types, and find short aliases for field names.',
|
|
258
|
+
inputSchema: {},
|
|
259
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
260
|
+
}, async () => {
|
|
261
|
+
return jsonResult(getSchema());
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=projectTools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectTools.js","sourceRoot":"","sources":["../../src/tools/projectTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ProjectData } from '@context-forge/core';
|
|
2
|
+
export interface ResolvedOperation {
|
|
3
|
+
operationPath: string;
|
|
4
|
+
indexRange?: [number, number];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Resolve the operation path and optional index range for a worktree-aware
|
|
8
|
+
* MCP tool call. When worktreeId is provided, looks up the worktree by
|
|
9
|
+
* ID or name and returns its path and index range.
|
|
10
|
+
*
|
|
11
|
+
* All worktrees (including default) return their indexRange for filtering.
|
|
12
|
+
* Returns no indexRange only when no worktreeId or no worktrees.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveOperationContext(args: {
|
|
15
|
+
projectId?: string;
|
|
16
|
+
worktreeId?: string;
|
|
17
|
+
}): Promise<ResolvedOperation>;
|
|
18
|
+
/**
|
|
19
|
+
* Resolve all worktree paths for cross-worktree aggregation (--all mode).
|
|
20
|
+
* Returns deduplicated array of all paths (projectPath + worktree paths).
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveAllOperationPaths(args: {
|
|
23
|
+
projectId?: string;
|
|
24
|
+
}): Promise<{
|
|
25
|
+
paths: string[];
|
|
26
|
+
project: ProjectData;
|
|
27
|
+
}>;
|
|
28
|
+
//# sourceMappingURL=resolveOperationPath.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveOperationPath.d.ts","sourceRoot":"","sources":["../../src/tools/resolveOperationPath.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC,iBAAiB,CAAC,CAmC5B;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3B,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,WAAW,CAAA;CAAE,CAAC,CAwBpD"}
|