@context-forge/mcp 0.8.5 → 0.8.6

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.
Files changed (61) hide show
  1. package/dist/index.d.ts +3 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +51 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/tools/agentGuideTool.d.ts +3 -0
  6. package/dist/tools/agentGuideTool.d.ts.map +1 -0
  7. package/dist/tools/agentGuideTool.js +83 -0
  8. package/dist/tools/agentGuideTool.js.map +1 -0
  9. package/dist/tools/agentOnboardTool.d.ts +3 -0
  10. package/dist/tools/agentOnboardTool.d.ts.map +1 -0
  11. package/dist/tools/agentOnboardTool.js +85 -0
  12. package/dist/tools/agentOnboardTool.js.map +1 -0
  13. package/dist/tools/agentQuickstartTool.d.ts +3 -0
  14. package/dist/tools/agentQuickstartTool.d.ts.map +1 -0
  15. package/dist/tools/agentQuickstartTool.js +60 -0
  16. package/dist/tools/agentQuickstartTool.js.map +1 -0
  17. package/dist/tools/configTools.d.ts +3 -0
  18. package/dist/tools/configTools.d.ts.map +1 -0
  19. package/dist/tools/configTools.js +76 -0
  20. package/dist/tools/configTools.js.map +1 -0
  21. package/dist/tools/contextTools.d.ts +28 -0
  22. package/dist/tools/contextTools.d.ts.map +1 -0
  23. package/dist/tools/contextTools.js +229 -0
  24. package/dist/tools/contextTools.js.map +1 -0
  25. package/dist/tools/guideTools.d.ts +3 -0
  26. package/dist/tools/guideTools.d.ts.map +1 -0
  27. package/dist/tools/guideTools.js +130 -0
  28. package/dist/tools/guideTools.js.map +1 -0
  29. package/dist/tools/introspectionTools.d.ts +3 -0
  30. package/dist/tools/introspectionTools.d.ts.map +1 -0
  31. package/dist/tools/introspectionTools.js +276 -0
  32. package/dist/tools/introspectionTools.js.map +1 -0
  33. package/dist/tools/projectTools.d.ts +3 -0
  34. package/dist/tools/projectTools.d.ts.map +1 -0
  35. package/dist/tools/projectTools.js +264 -0
  36. package/dist/tools/projectTools.js.map +1 -0
  37. package/dist/tools/resolveOperationPath.d.ts +28 -0
  38. package/dist/tools/resolveOperationPath.d.ts.map +1 -0
  39. package/dist/tools/resolveOperationPath.js +56 -0
  40. package/dist/tools/resolveOperationPath.js.map +1 -0
  41. package/dist/tools/resolveProjectId.d.ts +14 -0
  42. package/dist/tools/resolveProjectId.d.ts.map +1 -0
  43. package/dist/tools/resolveProjectId.js +86 -0
  44. package/dist/tools/resolveProjectId.js.map +1 -0
  45. package/dist/tools/stateTools.d.ts +3 -0
  46. package/dist/tools/stateTools.d.ts.map +1 -0
  47. package/dist/tools/stateTools.js +55 -0
  48. package/dist/tools/stateTools.js.map +1 -0
  49. package/dist/tools/versionTool.d.ts +3 -0
  50. package/dist/tools/versionTool.d.ts.map +1 -0
  51. package/dist/tools/versionTool.js +11 -0
  52. package/dist/tools/versionTool.js.map +1 -0
  53. package/dist/tools/workflowTools.d.ts +3 -0
  54. package/dist/tools/workflowTools.d.ts.map +1 -0
  55. package/dist/tools/workflowTools.js +270 -0
  56. package/dist/tools/workflowTools.js.map +1 -0
  57. package/dist/tools/worktreeTools.d.ts +3 -0
  58. package/dist/tools/worktreeTools.d.ts.map +1 -0
  59. package/dist/tools/worktreeTools.js +234 -0
  60. package/dist/tools/worktreeTools.js.map +1 -0
  61. package/package.json +2 -2
@@ -0,0 +1,56 @@
1
+ import { FileProjectStore } from '@context-forge/core/node';
2
+ import { resolveProjectId } from './resolveProjectId.js';
3
+ /**
4
+ * Resolve the operation path and optional index range for a worktree-aware
5
+ * MCP tool call. When worktreeId is provided, looks up the worktree by
6
+ * ID or name and returns its path and index range.
7
+ *
8
+ * All worktrees (including default) return their indexRange for filtering.
9
+ * Returns no indexRange only when no worktreeId or no worktrees.
10
+ */
11
+ export async function resolveOperationContext(args) {
12
+ const resolvedId = await resolveProjectId(args.projectId);
13
+ const store = new FileProjectStore();
14
+ const project = await store.getById(resolvedId);
15
+ if (!project) {
16
+ throw new Error(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects.`);
17
+ }
18
+ if (!project.projectPath) {
19
+ throw new Error(`Project '${resolvedId}' has no projectPath configured. Set it with project_update.`);
20
+ }
21
+ if (!args.worktreeId) {
22
+ return { operationPath: project.projectPath };
23
+ }
24
+ if (!project.worktrees) {
25
+ return { operationPath: project.projectPath };
26
+ }
27
+ const wt = project.worktrees.find((w) => w.id === args.worktreeId || w.name.toLowerCase() === args.worktreeId.toLowerCase());
28
+ if (!wt) {
29
+ return { operationPath: project.projectPath };
30
+ }
31
+ const operationPath = wt.worktreePath ?? project.projectPath;
32
+ return { operationPath, indexRange: wt.indexRange };
33
+ }
34
+ /**
35
+ * Resolve all worktree paths for cross-worktree aggregation (--all mode).
36
+ * Returns deduplicated array of all paths (projectPath + worktree paths).
37
+ */
38
+ export async function resolveAllOperationPaths(args) {
39
+ const resolvedId = await resolveProjectId(args.projectId);
40
+ const store = new FileProjectStore();
41
+ const project = await store.getById(resolvedId);
42
+ if (!project) {
43
+ throw new Error(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects.`);
44
+ }
45
+ if (!project.projectPath) {
46
+ throw new Error(`Project '${resolvedId}' has no projectPath configured. Set it with project_update.`);
47
+ }
48
+ const pathSet = new Set();
49
+ pathSet.add(project.projectPath);
50
+ for (const wt of project.worktrees ?? []) {
51
+ if (wt.worktreePath)
52
+ pathSet.add(wt.worktreePath);
53
+ }
54
+ return { paths: [...pathSet], project };
55
+ }
56
+ //# sourceMappingURL=resolveOperationPath.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveOperationPath.js","sourceRoot":"","sources":["../../src/tools/resolveOperationPath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAOzD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,IAAiD;IAEjD,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAEhD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,uBAAuB,UAAU,yDAAyD,CAC3F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,YAAY,UAAU,8DAA8D,CACrF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;IAChD,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAC/B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,UAAW,CAAC,WAAW,EAAE,CAC3F,CAAC;IAEF,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;IAChD,CAAC;IAED,MAAM,aAAa,GAAG,EAAE,CAAC,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;IAC7D,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,EAAE,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAA4B;IAE5B,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;IACrC,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAEhD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,uBAAuB,UAAU,yDAAyD,CAC3F,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,YAAY,UAAU,8DAA8D,CACrF,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IACjC,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;QACzC,IAAI,EAAE,CAAC,YAAY;YAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Resolves the project ID to use for an MCP tool call.
3
+ * Accepts a project ID, name (case-insensitive), or omit to resolve from CWD.
4
+ *
5
+ * Priority:
6
+ * 1. If value looks like an auto-generated ID, return it directly (no store lookup)
7
+ * 2. Otherwise, search by ID then by name
8
+ * 3. If no explicit ID, resolve from CWD (match against registered project/worktree paths)
9
+ * 4. Throws a descriptive error with usage guidance
10
+ *
11
+ * @param explicitId - projectId or project name from MCP tool arguments (may be undefined)
12
+ */
13
+ export declare function resolveProjectId(explicitId?: string): Promise<string>;
14
+ //# sourceMappingURL=resolveProjectId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveProjectId.d.ts","sourceRoot":"","sources":["../../src/tools/resolveProjectId.ts"],"names":[],"mappings":"AA2CA;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CA2CjB"}
@@ -0,0 +1,86 @@
1
+ import { FileProjectStore } from '@context-forge/core/node';
2
+ /** Project IDs start with the "project_" prefix */
3
+ const PROJECT_ID_RE = /^project_/;
4
+ /**
5
+ * Match CWD against registered project paths and worktree paths.
6
+ * Returns the best match (longest path wins; worktree over project root on tie).
7
+ */
8
+ function findProjectByCwd(projects) {
9
+ const cwd = process.cwd();
10
+ const candidates = [];
11
+ for (const p of projects) {
12
+ if (p.projectPath) {
13
+ candidates.push({ id: p.id, path: p.projectPath, isWorktree: false });
14
+ }
15
+ for (const wt of p.worktrees ?? []) {
16
+ if (wt.worktreePath) {
17
+ candidates.push({ id: p.id, path: wt.worktreePath, isWorktree: true });
18
+ }
19
+ }
20
+ }
21
+ const matches = candidates
22
+ .filter((c) => {
23
+ const path = c.path.endsWith('/') ? c.path.slice(0, -1) : c.path;
24
+ return cwd === path || cwd.startsWith(path + '/');
25
+ })
26
+ .sort((a, b) => {
27
+ const lenDiff = b.path.length - a.path.length;
28
+ if (lenDiff !== 0)
29
+ return lenDiff;
30
+ if (a.isWorktree && !b.isWorktree)
31
+ return -1;
32
+ if (!a.isWorktree && b.isWorktree)
33
+ return 1;
34
+ return 0;
35
+ });
36
+ return matches.length > 0 ? matches[0].id : null;
37
+ }
38
+ /**
39
+ * Resolves the project ID to use for an MCP tool call.
40
+ * Accepts a project ID, name (case-insensitive), or omit to resolve from CWD.
41
+ *
42
+ * Priority:
43
+ * 1. If value looks like an auto-generated ID, return it directly (no store lookup)
44
+ * 2. Otherwise, search by ID then by name
45
+ * 3. If no explicit ID, resolve from CWD (match against registered project/worktree paths)
46
+ * 4. Throws a descriptive error with usage guidance
47
+ *
48
+ * @param explicitId - projectId or project name from MCP tool arguments (may be undefined)
49
+ */
50
+ export async function resolveProjectId(explicitId) {
51
+ // Fast path: project IDs pass through without store lookup
52
+ if (explicitId && PROJECT_ID_RE.test(explicitId)) {
53
+ return explicitId;
54
+ }
55
+ // Need to consult the store for name lookup or CWD resolution
56
+ let projects;
57
+ try {
58
+ const store = new FileProjectStore();
59
+ projects = await store.getAll();
60
+ }
61
+ catch {
62
+ throw new Error('No project ID provided and project store is unavailable.\n' +
63
+ ' Use project_list to see available projects.\n' +
64
+ ' Use project_create to register a new project.');
65
+ }
66
+ if (explicitId) {
67
+ // Try exact ID match first (for non-standard IDs)
68
+ const byId = projects.find((p) => p.id === explicitId);
69
+ if (byId)
70
+ return byId.id;
71
+ // Try case-insensitive name match
72
+ const lower = explicitId.toLowerCase();
73
+ const byName = projects.find((p) => p.name?.toLowerCase() === lower);
74
+ if (byName)
75
+ return byName.id;
76
+ throw new Error(`Project not found: '${explicitId}'. Use the project_list tool to see available projects.`);
77
+ }
78
+ // No explicit ID — resolve from CWD
79
+ const cwdMatch = findProjectByCwd(projects);
80
+ if (cwdMatch)
81
+ return cwdMatch;
82
+ throw new Error('No project ID provided. Pass a projectId argument (ID or name).\n' +
83
+ ' Use project_list to see available projects.\n' +
84
+ ' Use project_create to register a new project.');
85
+ }
86
+ //# sourceMappingURL=resolveProjectId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveProjectId.js","sourceRoot":"","sources":["../../src/tools/resolveProjectId.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerStateTools(server: McpServer): void;
3
+ //# sourceMappingURL=stateTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateTools.d.ts","sourceRoot":"","sources":["../../src/tools/stateTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkE1D"}
@@ -0,0 +1,55 @@
1
+ import { z } from 'zod';
2
+ import { FileProjectStore } from '@context-forge/core/node';
3
+ import { errorResult, jsonResult } from './contextTools.js';
4
+ import { resolveProjectId } from './resolveProjectId.js';
5
+ export function registerStateTools(server) {
6
+ // --- context_summarize ---
7
+ server.registerTool('context_summarize', {
8
+ title: 'Summarize Context',
9
+ description: "Update a project's session state summary. Persists the provided summary text as the project's recent events, " +
10
+ 'which will be included in subsequent context_build output. Use this after significant work milestones, context ' +
11
+ "switches, or to record session progress for continuity. Analogous to Claude Code's /compact but for project-level state.",
12
+ inputSchema: {
13
+ projectId: z.string().optional().describe('Project ID to update. Use project_list to find IDs. Omit to resolve from CWD.'),
14
+ summary: z
15
+ .string()
16
+ .describe('Summary of recent events, session progress, or current project state. ' +
17
+ 'This replaces the current recentEvents field and will appear in subsequent context_build output.'),
18
+ additionalNotes: z
19
+ .string()
20
+ .optional()
21
+ .describe('Optional additional notes to persist alongside the summary. ' +
22
+ 'Replaces the current additionalNotes field if provided.'),
23
+ },
24
+ annotations: { destructiveHint: false, idempotentHint: true, openWorldHint: false },
25
+ }, async ({ projectId, summary, additionalNotes }) => {
26
+ try {
27
+ // Validate non-empty summary
28
+ if (!summary.trim()) {
29
+ return errorResult('Summary text is required. Provide a non-empty summary of recent events or session state.');
30
+ }
31
+ const resolvedId = await resolveProjectId(projectId);
32
+ const store = new FileProjectStore();
33
+ // Check project exists
34
+ const existing = await store.getById(resolvedId);
35
+ if (!existing) {
36
+ return errorResult(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects and their IDs.`);
37
+ }
38
+ // Merge customData: preserve existing fields, overlay summary + optional additionalNotes
39
+ const mergedCustomData = {
40
+ ...existing.customData,
41
+ recentEvents: summary,
42
+ ...(additionalNotes !== undefined && { additionalNotes }),
43
+ };
44
+ await store.update(resolvedId, { customData: mergedCustomData });
45
+ // Read back updated project
46
+ const updated = await store.getById(resolvedId);
47
+ return jsonResult(updated);
48
+ }
49
+ catch (error) {
50
+ const message = error instanceof Error ? error.message : String(error);
51
+ return errorResult(`Error: ${message}`);
52
+ }
53
+ });
54
+ }
55
+ //# sourceMappingURL=stateTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateTools.js","sourceRoot":"","sources":["../../src/tools/stateTools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,4BAA4B;IAC5B,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,+GAA+G;YAC/G,iHAAiH;YACjH,0HAA0H;QAC5H,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,+EAA+E,CAAC;YAC1H,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,CACP,wEAAwE;gBACtE,kGAAkG,CACrG;YACH,eAAe,EAAE,CAAC;iBACf,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,8DAA8D;gBAC5D,yDAAyD,CAC5D;SACJ;QACD,WAAW,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KACpF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,EAAE,EAAE,EAAE;QAChD,IAAI,CAAC;YACH,6BAA6B;YAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;gBACpB,OAAO,WAAW,CAChB,0FAA0F,CAC3F,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,SAAS,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAErC,uBAAuB;YACvB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,WAAW,CAChB,uBAAuB,UAAU,uEAAuE,CACzG,CAAC;YACJ,CAAC;YAED,yFAAyF;YACzF,MAAM,gBAAgB,GAAG;gBACvB,GAAG,QAAQ,CAAC,UAAU;gBACtB,YAAY,EAAE,OAAO;gBACrB,GAAG,CAAC,eAAe,KAAK,SAAS,IAAI,EAAE,eAAe,EAAE,CAAC;aAC1D,CAAC;YAEF,MAAM,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAEjE,4BAA4B;YAC5B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAChD,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,WAAW,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerVersionTool(server: McpServer, name: string, version: string): void;
3
+ //# sourceMappingURL=versionTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versionTool.d.ts","sourceRoot":"","sources":["../../src/tools/versionTool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAa1F"}
@@ -0,0 +1,11 @@
1
+ export function registerVersionTool(server, name, version) {
2
+ server.registerTool('server_version', {
3
+ title: 'Server Version',
4
+ description: 'Returns the Context Forge MCP server name and version.',
5
+ inputSchema: {},
6
+ annotations: { readOnlyHint: true, openWorldHint: false },
7
+ }, async () => ({
8
+ content: [{ type: 'text', text: JSON.stringify({ name, version }) }],
9
+ }));
10
+ }
11
+ //# sourceMappingURL=versionTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versionTool.js","sourceRoot":"","sources":["../../src/tools/versionTool.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,mBAAmB,CAAC,MAAiB,EAAE,IAAY,EAAE,OAAe;IAClF,MAAM,CAAC,YAAY,CACjB,gBAAgB,EAChB;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,wDAAwD;QACrE,WAAW,EAAE,EAAE;QACf,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE;KAC1D,EACD,KAAK,IAAI,EAAE,CAAC,CAAC;QACX,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;KAC9E,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerWorkflowTools(server: McpServer): void;
3
+ //# sourceMappingURL=workflowTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflowTools.d.ts","sourceRoot":"","sources":["../../src/tools/workflowTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsDpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsR7D"}
@@ -0,0 +1,270 @@
1
+ import { z } from 'zod';
2
+ import { FileProjectStore, FutureWorkCollector, WorkflowNavigator, ArtifactIntrospector, ConsistencyChecker, ConfigManager, getStoragePath, createVersionedBackup, } from '@context-forge/core/node';
3
+ import { applyWorktreeOverlay, resolveProject } from '@context-forge/core';
4
+ import { resolveProjectId } from './resolveProjectId.js';
5
+ function errorResult(message) {
6
+ return { content: [{ type: 'text', text: message }], isError: true };
7
+ }
8
+ function jsonResult(data) {
9
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
10
+ }
11
+ /**
12
+ * Merge findings from multiple checkAll runs, deduplicating by rule+location+description.
13
+ * TODO: Extract to @context-forge/core shared utility (200-slices future work item 7)
14
+ */
15
+ function mergeCheckResults(results) {
16
+ if (results.length === 1)
17
+ return results[0];
18
+ const seen = new Set();
19
+ const allFindings = [];
20
+ for (const result of results) {
21
+ for (const finding of result.findings) {
22
+ const key = `${finding.rule}|${finding.location}|${finding.description}`;
23
+ if (!seen.has(key)) {
24
+ seen.add(key);
25
+ allFindings.push(finding);
26
+ }
27
+ }
28
+ }
29
+ const projectPath = results[0].projectPath;
30
+ const errors = allFindings.filter((f) => f.severity === 'error').length;
31
+ const warnings = allFindings.filter((f) => f.severity === 'warning').length;
32
+ const infos = allFindings.filter((f) => f.severity === 'info').length;
33
+ const total = allFindings.length;
34
+ const parts = [];
35
+ if (errors > 0)
36
+ parts.push(`${errors} error${errors !== 1 ? 's' : ''}`);
37
+ if (warnings > 0)
38
+ parts.push(`${warnings} warning${warnings !== 1 ? 's' : ''}`);
39
+ if (infos > 0)
40
+ parts.push(`${infos} info${infos !== 1 ? 's' : ''}`);
41
+ const summary = total === 0 ? 'No inconsistencies found' : `${total} finding${total !== 1 ? 's' : ''}: ${parts.join(', ')}`;
42
+ return { projectPath, findings: allFindings, totalFindings: total, errors, warnings, infos, summary };
43
+ }
44
+ export function registerWorkflowTools(server) {
45
+ // --- workflow_future ---
46
+ server.registerTool('workflow_future', {
47
+ title: 'Future Work Collector',
48
+ description: 'Aggregate future work items across all slice plans in a project. ' +
49
+ 'Returns a FutureWorkCollectorResult with groups (by initiative), totals, and a markdown summary. ' +
50
+ 'Two source patterns are supported: (1) inline ## Future Work sections in regular slice plans, ' +
51
+ '(2) standalone *-slices.future.* files whose entire main body is future work. ' +
52
+ 'Response shape: { projectPath, groups[], totalItems, pendingItems, completedItems, markdown }. ' +
53
+ 'Each group: { initiativeIndex, initiativeName, sourceFile, items[], totalItems, pendingItems, completedItems }. ' +
54
+ 'Each item: { index, name, done, sourceFile, sourceInitiativeIndex, sourceInitiativeName }.',
55
+ inputSchema: {
56
+ projectId: z
57
+ .string()
58
+ .optional()
59
+ .describe('Project ID. Omit to resolve from CWD.'),
60
+ status: z
61
+ .enum(['all', 'pending', 'completed'])
62
+ .optional()
63
+ .default('all')
64
+ .describe('Filter items by completion state. Default: "all".'),
65
+ includeMarkdown: z
66
+ .boolean()
67
+ .optional()
68
+ .default(true)
69
+ .describe('Include markdown summary field in response. Default: true.'),
70
+ },
71
+ annotations: { readOnlyHint: true, openWorldHint: false },
72
+ }, async (args) => {
73
+ try {
74
+ const resolvedId = await resolveProjectId(args.projectId);
75
+ const store = new FileProjectStore();
76
+ const project = await store.getById(resolvedId);
77
+ if (!project) {
78
+ return errorResult(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects.`);
79
+ }
80
+ if (!project.projectPath) {
81
+ return errorResult(`Project '${resolvedId}' has no projectPath configured. Set it with project_update.`);
82
+ }
83
+ const collector = new FutureWorkCollector();
84
+ const result = await collector.collect(project.projectPath, args.status ?? 'all');
85
+ if (!args.includeMarkdown) {
86
+ const { markdown: _md, ...rest } = result;
87
+ return jsonResult(rest);
88
+ }
89
+ return jsonResult(result);
90
+ }
91
+ catch (error) {
92
+ const msg = error instanceof Error ? error.message : String(error);
93
+ return errorResult(`Error: ${msg}`);
94
+ }
95
+ });
96
+ // --- workflow_status ---
97
+ server.registerTool('workflow_status', {
98
+ title: 'Workflow Status',
99
+ description: 'Get the current workflow status for a project. Returns project phase, active slice status ' +
100
+ '(needs-design, needs-tasks, in-implementation, complete), task progress, and slice plan overview. ' +
101
+ 'Response shape: { project, phase, activeSlice: { name, index, status, taskProgress? }, slicePlan?, summary }.',
102
+ inputSchema: {
103
+ projectId: z
104
+ .string()
105
+ .optional()
106
+ .describe('Project ID. Omit to resolve from CWD.'),
107
+ worktreeId: z
108
+ .string()
109
+ .optional()
110
+ .describe('Worktree ID or name. When provided, overlays worktree fields onto the project before computing status.'),
111
+ },
112
+ annotations: { readOnlyHint: true, openWorldHint: false },
113
+ }, async (args) => {
114
+ try {
115
+ const resolvedId = await resolveProjectId(args.projectId);
116
+ const store = new FileProjectStore();
117
+ const project = await resolveProject(store, resolvedId, args.worktreeId);
118
+ if (!project) {
119
+ return errorResult(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects.`);
120
+ }
121
+ const nav = new WorkflowNavigator();
122
+ const status = await nav.getStatus(project);
123
+ const result = project.resolvedWorktree
124
+ ? { ...status, worktree: project.resolvedWorktree }
125
+ : status;
126
+ return jsonResult(result);
127
+ }
128
+ catch (error) {
129
+ const msg = error instanceof Error ? error.message : String(error);
130
+ return errorResult(`Error: ${msg}`);
131
+ }
132
+ });
133
+ // --- workflow_next ---
134
+ server.registerTool('workflow_next', {
135
+ title: 'Workflow Next Action',
136
+ description: 'Get the recommended next action for a project based on its current state. ' +
137
+ 'Returns a prioritized recommendation with rationale and optional suggested CLI command. ' +
138
+ 'Response shape: { recommendation, rationale, suggestedCommand?, slice?, phase?, summary }.',
139
+ inputSchema: {
140
+ projectId: z
141
+ .string()
142
+ .optional()
143
+ .describe('Project ID. Omit to resolve from CWD.'),
144
+ worktreeId: z
145
+ .string()
146
+ .optional()
147
+ .describe('Worktree ID or name. When provided, overlays worktree fields onto the project before computing next action.'),
148
+ },
149
+ annotations: { readOnlyHint: true, openWorldHint: false },
150
+ }, async (args) => {
151
+ try {
152
+ const resolvedId = await resolveProjectId(args.projectId);
153
+ const store = new FileProjectStore();
154
+ const project = await resolveProject(store, resolvedId, args.worktreeId);
155
+ if (!project) {
156
+ return errorResult(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects.`);
157
+ }
158
+ const nav = new WorkflowNavigator();
159
+ const next = await nav.getNext(project);
160
+ const result = project.resolvedWorktree
161
+ ? { ...next, worktree: project.resolvedWorktree }
162
+ : next;
163
+ return jsonResult(result);
164
+ }
165
+ catch (error) {
166
+ const msg = error instanceof Error ? error.message : String(error);
167
+ return errorResult(`Error: ${msg}`);
168
+ }
169
+ });
170
+ // --- workflow_check ---
171
+ server.registerTool('workflow_check', {
172
+ title: 'Consistency Check',
173
+ description: 'Run consistency checks on a project to detect mismatches between related artifacts. ' +
174
+ 'Detects: task completion vs. slice plan checkbox, frontmatter status vs. computed state, ' +
175
+ 'missing artifact cross-references, plan checkbox vs. frontmatter status, ' +
176
+ 'duplicate slice indices, missing plan status field, plan status vs. entries, architecture status vs. plans. ' +
177
+ 'Defaults to all-slices mode; provide sliceIndex to narrow to one slice. ' +
178
+ 'With fix=true, applies non-destructive corrections to fixable findings. ' +
179
+ 'Response shape: { projectPath, findings[], totalFindings, errors, warnings, infos, summary, ' +
180
+ 'fixed?, fixLog?, fixErrors? }.',
181
+ inputSchema: {
182
+ projectId: z
183
+ .string()
184
+ .optional()
185
+ .describe('Project ID. Omit to resolve from CWD.'),
186
+ sliceIndex: z
187
+ .number()
188
+ .optional()
189
+ .describe('Check only a specific slice by index. Omit for all-slices mode.'),
190
+ fix: z
191
+ .boolean()
192
+ .optional()
193
+ .describe('Apply non-destructive corrections to fixable findings. Default: false (or workflow.auto_fix config).'),
194
+ },
195
+ annotations: { readOnlyHint: false, openWorldHint: false },
196
+ }, async (args) => {
197
+ try {
198
+ const resolvedId = await resolveProjectId(args.projectId);
199
+ const store = new FileProjectStore();
200
+ const project = await store.getById(resolvedId);
201
+ if (!project) {
202
+ return errorResult(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects.`);
203
+ }
204
+ const introspector = new ArtifactIntrospector();
205
+ const checker = new ConsistencyChecker(introspector);
206
+ // Determine fix mode: explicit arg > config key > false
207
+ let fixMode = args.fix ?? false;
208
+ if (!fixMode) {
209
+ try {
210
+ const cm = new ConfigManager(project.projectPath);
211
+ const autoFixResult = await cm.get('workflow.auto_fix');
212
+ if (autoFixResult.value === true) {
213
+ fixMode = true;
214
+ }
215
+ }
216
+ catch {
217
+ // Config read failed — default to check-only
218
+ }
219
+ }
220
+ // Build project views: one per worktree overlay so all workflow fields are visible.
221
+ // Findings are merged and deduplicated — aggregate rules (filesystem scan) run per
222
+ // view but produce the same results, so deduplication collapses them correctly.
223
+ // TODO: Extract merge logic to @context-forge/core shared utility (200-slices future work item 7)
224
+ const worktrees = project.worktrees ?? [];
225
+ const projectViews = worktrees.length > 0
226
+ ? worktrees.map((wt) => applyWorktreeOverlay(project, wt.id))
227
+ : [project];
228
+ let result;
229
+ if (args.sliceIndex !== undefined) {
230
+ // Single-slice mode
231
+ const sliceViews = projectViews.map((v) => ({ ...v, fileSlice: `${args.sliceIndex}-slice` }));
232
+ const checkResults = await Promise.all(sliceViews.map((v) => fixMode ? checker.fix(v) : checker.check(v)));
233
+ result = mergeCheckResults(checkResults);
234
+ }
235
+ else {
236
+ // All-slices mode (no confirmation prompt in MCP)
237
+ const checkResults = await Promise.all(projectViews.map((v) => fixMode ? checker.fixAll(v) : checker.checkAll(v)));
238
+ result = mergeCheckResults(checkResults);
239
+ }
240
+ return jsonResult(result);
241
+ }
242
+ catch (error) {
243
+ const msg = error instanceof Error ? error.message : String(error);
244
+ return errorResult(`Error: ${msg}`);
245
+ }
246
+ });
247
+ // --- storage_backup ---
248
+ server.registerTool('storage_backup', {
249
+ title: 'Create Versioned Backup',
250
+ description: 'Create a versioned timestamped backup of the projects.json data file. ' +
251
+ 'Keeps the last 10 backups, automatically pruning older ones. ' +
252
+ 'Response shape: { storagePath, backedUp: string[] }.',
253
+ inputSchema: {},
254
+ annotations: { readOnlyHint: false, openWorldHint: false },
255
+ }, async () => {
256
+ try {
257
+ const storagePath = getStoragePath();
258
+ const files = ['projects.json'];
259
+ for (const file of files) {
260
+ await createVersionedBackup(storagePath, file);
261
+ }
262
+ return jsonResult({ storagePath, backedUp: files });
263
+ }
264
+ catch (error) {
265
+ const msg = error instanceof Error ? error.message : String(error);
266
+ return errorResult(`Error: ${msg}`);
267
+ }
268
+ });
269
+ }
270
+ //# sourceMappingURL=workflowTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflowTools.js","sourceRoot":"","sources":["../../src/tools/workflowTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerWorktreeTools(server: McpServer): void;
3
+ //# sourceMappingURL=worktreeTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktreeTools.d.ts","sourceRoot":"","sources":["../../src/tools/worktreeTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyDpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuO7D"}