@context-forge/mcp 0.1.0 → 0.2.2

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 (37) hide show
  1. package/README.md +43 -1
  2. package/dist/index.js +13 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/tools/configTools.d.ts +3 -0
  5. package/dist/tools/configTools.d.ts.map +1 -0
  6. package/dist/tools/configTools.js +91 -0
  7. package/dist/tools/configTools.js.map +1 -0
  8. package/dist/tools/contextTools.d.ts.map +1 -1
  9. package/dist/tools/contextTools.js +17 -12
  10. package/dist/tools/contextTools.js.map +1 -1
  11. package/dist/tools/guideTools.d.ts +3 -0
  12. package/dist/tools/guideTools.d.ts.map +1 -0
  13. package/dist/tools/guideTools.js +107 -0
  14. package/dist/tools/guideTools.js.map +1 -0
  15. package/dist/tools/introspectionTools.d.ts +3 -0
  16. package/dist/tools/introspectionTools.d.ts.map +1 -0
  17. package/dist/tools/introspectionTools.js +215 -0
  18. package/dist/tools/introspectionTools.js.map +1 -0
  19. package/dist/tools/projectTools.d.ts.map +1 -1
  20. package/dist/tools/projectTools.js +46 -20
  21. package/dist/tools/projectTools.js.map +1 -1
  22. package/dist/tools/resolveProjectId.d.ts +13 -0
  23. package/dist/tools/resolveProjectId.d.ts.map +1 -0
  24. package/dist/tools/resolveProjectId.js +26 -0
  25. package/dist/tools/resolveProjectId.js.map +1 -0
  26. package/dist/tools/stateTools.d.ts.map +1 -1
  27. package/dist/tools/stateTools.js +7 -5
  28. package/dist/tools/stateTools.js.map +1 -1
  29. package/dist/tools/versionTool.d.ts +3 -0
  30. package/dist/tools/versionTool.d.ts.map +1 -0
  31. package/dist/tools/versionTool.js +11 -0
  32. package/dist/tools/versionTool.js.map +1 -0
  33. package/dist/tools/workflowTools.d.ts +3 -0
  34. package/dist/tools/workflowTools.d.ts.map +1 -0
  35. package/dist/tools/workflowTools.js +63 -0
  36. package/dist/tools/workflowTools.js.map +1 -0
  37. package/package.json +2 -2
package/README.md CHANGED
@@ -65,17 +65,59 @@ Add the following to your Cursor MCP settings (`.cursor/mcp.json` in your projec
65
65
 
66
66
  ## Available Tools
67
67
 
68
+ ### Project Management
69
+
68
70
  | Tool | Description |
69
71
  |------|-------------|
70
72
  | `project_list` | List all configured projects with summary fields |
71
- | `project_get` | Get full project details by ID |
73
+ | `project_get` | Get full project details by ID (or default project) |
72
74
  | `project_update` | Update project configuration (slice, instruction, phase, etc.) |
75
+
76
+ ### Context Generation
77
+
78
+ | Tool | Description |
79
+ |------|-------------|
73
80
  | `context_build` | Generate a complete context prompt from project configuration |
74
81
  | `template_preview` | Preview context output without side effects |
75
82
  | `prompt_list` | List available prompt templates for a project |
76
83
  | `prompt_get` | Get the full content of a specific prompt template |
77
84
  | `context_summarize` | Update project session state (recent events, notes) |
78
85
 
86
+ ### Configuration
87
+
88
+ | Tool | Description |
89
+ |------|-------------|
90
+ | `config_get` | Get the current value of a config key (with source: project/user/default) |
91
+ | `config_set` | Set a config key at user or project scope |
92
+ | `config_list` | List all config keys with current values, sources, and defaults |
93
+
94
+ ### Artifact Introspection
95
+
96
+ Tools that parse methodology documents and extract structured information. All return JSON; all accept `projectId` (or `filePath` for file-targeted tools) and fall back to `default_project`.
97
+
98
+ | Tool | Description |
99
+ |------|-------------|
100
+ | `project_structure` | Build full project model (foundation, initiatives, slices, tasks, future work) — equivalent to parse.py `build_model()` |
101
+ | `introspection_slice_plan` | Parse a slice plan and return entries with index, name, status, and completion counts |
102
+ | `introspection_tasks` | Parse a task file and return items with done state, total count, and inferred status |
103
+ | `introspection_frontmatter` | Extract YAML frontmatter key-value pairs from any methodology document |
104
+ | `introspection_documents` | Detect which methodology files exist for a given slice index (design, tasks, arch, plan) |
105
+ | `introspection_future_work` | Parse the `## Future Work` section from a slice plan document |
106
+
107
+ ### Workflow
108
+
109
+ Tools that operate across all slice plans in a project to support planning and review.
110
+
111
+ | Tool | Description |
112
+ |------|-------------|
113
+ | `workflow_future` | Aggregate all future work items across a project, grouped by source initiative, with markdown summary. Accepts optional `status` filter (`all`/`pending`/`completed`) and `includeMarkdown` flag. |
114
+
115
+ **Tip:** Set `default_project` once and omit `projectId` from all other tool calls:
116
+
117
+ ```
118
+ config_set key="default_project" value="project_1739..." scope="user"
119
+ ```
120
+
79
121
  For full parameter details, see the [Tool Reference](../../docs/TOOLS.md).
80
122
 
81
123
  ## Prerequisites
package/dist/index.js CHANGED
@@ -1,13 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  // MCP SDK: @modelcontextprotocol/sdk v1.26.0 (v1 monolithic package)
3
3
  // Zod: v4.1.5 — imported as `z` from 'zod'
4
+ import { createRequire } from 'node:module';
4
5
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
5
6
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
6
7
  import { registerProjectTools } from './tools/projectTools.js';
7
8
  import { registerContextTools } from './tools/contextTools.js';
8
9
  import { registerStateTools } from './tools/stateTools.js';
10
+ import { registerConfigTools } from './tools/configTools.js';
11
+ import { registerIntrospectionTools } from './tools/introspectionTools.js';
12
+ import { registerWorkflowTools } from './tools/workflowTools.js';
13
+ import { registerVersionTool } from './tools/versionTool.js';
14
+ import { registerGuideTools } from './tools/guideTools.js';
15
+ const require = createRequire(import.meta.url);
16
+ const { version: SERVER_VERSION } = require('../package.json');
9
17
  const SERVER_NAME = 'context-forge-mcp';
10
- const SERVER_VERSION = '0.1.0';
11
18
  function log(message) {
12
19
  console.error(`[${SERVER_NAME}] ${message}`);
13
20
  }
@@ -19,6 +26,11 @@ async function main() {
19
26
  registerProjectTools(server);
20
27
  registerContextTools(server);
21
28
  registerStateTools(server);
29
+ registerConfigTools(server);
30
+ registerIntrospectionTools(server);
31
+ registerWorkflowTools(server);
32
+ registerGuideTools(server);
33
+ registerVersionTool(server, SERVER_NAME, SERVER_VERSION);
22
34
  const transport = new StdioServerTransport();
23
35
  await server.connect(transport);
24
36
  log('Server started');
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,qEAAqE;AACrE,2CAA2C;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,GAAG,mBAAmB,CAAC;AACxC,MAAM,cAAc,GAAG,OAAO,CAAC;AAE/B,SAAS,GAAG,CAAC,OAAe;IAC1B,OAAO,CAAC,KAAK,CAAC,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IAEH,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAE3B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACxB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,IAAI,WAAW,kBAAkB,OAAO,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,qEAAqE;AACrE,2CAA2C;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAwB,CAAC;AACtF,MAAM,WAAW,GAAG,mBAAmB,CAAC;AAExC,SAAS,GAAG,CAAC,OAAe;IAC1B,OAAO,CAAC,KAAK,CAAC,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IAEH,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,0BAA0B,CAAC,MAAM,CAAC,CAAC;IACnC,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC;IAEzD,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AACxB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;IAC9B,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACvE,OAAO,CAAC,KAAK,CAAC,IAAI,WAAW,kBAAkB,OAAO,EAAE,CAAC,CAAC;IAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerConfigTools(server: McpServer): void;
3
+ //# sourceMappingURL=configTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configTools.d.ts","sourceRoot":"","sources":["../../src/tools/configTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAoG3D"}
@@ -0,0 +1,91 @@
1
+ import { z } from 'zod';
2
+ import { ConfigManager, getUserConfigPath, getProjectConfigPath } from '@context-forge/core/node';
3
+ import { errorResult, jsonResult } from './contextTools.js';
4
+ export function registerConfigTools(server) {
5
+ // --- config_get ---
6
+ server.registerTool('config_get', {
7
+ title: 'Get Config Value',
8
+ description: 'Get the current value of a configuration key. ' +
9
+ 'Returns the value, its source (project/user/default), and description. ' +
10
+ 'Resolution order: project config → user config → built-in default.',
11
+ inputSchema: {
12
+ key: z.string().describe('Config key to retrieve (e.g. "default_project", "guide.source")'),
13
+ projectPath: z
14
+ .string()
15
+ .optional()
16
+ .describe('Absolute path to project root, to include project-level config in resolution'),
17
+ },
18
+ annotations: { readOnlyHint: true, openWorldHint: false },
19
+ }, async ({ key, projectPath }) => {
20
+ try {
21
+ const cm = new ConfigManager(projectPath);
22
+ const result = await cm.get(key);
23
+ return jsonResult(result);
24
+ }
25
+ catch (error) {
26
+ const message = error instanceof Error ? error.message : String(error);
27
+ return errorResult(message);
28
+ }
29
+ });
30
+ // --- config_set ---
31
+ server.registerTool('config_set', {
32
+ title: 'Set Config Value',
33
+ description: 'Set a configuration key to a new value at user or project scope. ' +
34
+ 'Use scope="user" for machine-wide defaults, scope="project" to override for a specific project.',
35
+ inputSchema: {
36
+ key: z.string().describe('Config key to set (e.g. "default_project", "guide.auto_update")'),
37
+ value: z
38
+ .union([z.string(), z.boolean(), z.number()])
39
+ .describe('Value to set. Must match the key\'s expected type.'),
40
+ scope: z
41
+ .enum(['user', 'project'])
42
+ .describe('Scope: "user" writes to user-level config, "project" writes to project-level config'),
43
+ projectPath: z
44
+ .string()
45
+ .optional()
46
+ .describe('Absolute path to project root. Required when scope is "project".'),
47
+ },
48
+ annotations: { destructiveHint: false, idempotentHint: true, openWorldHint: false },
49
+ }, async ({ key, value, scope, projectPath }) => {
50
+ try {
51
+ const cm = new ConfigManager(projectPath);
52
+ await cm.set(key, value, scope);
53
+ const result = await cm.get(key);
54
+ return jsonResult({ success: true, ...result });
55
+ }
56
+ catch (error) {
57
+ const message = error instanceof Error ? error.message : String(error);
58
+ return errorResult(message);
59
+ }
60
+ });
61
+ // --- config_list ---
62
+ server.registerTool('config_list', {
63
+ title: 'List Config Values',
64
+ description: 'List all known configuration keys with their current values, sources, types, and defaults. ' +
65
+ 'Useful for inspecting the current configuration state.',
66
+ inputSchema: {
67
+ projectPath: z
68
+ .string()
69
+ .optional()
70
+ .describe('Absolute path to project root, to include project-level config in resolution'),
71
+ },
72
+ annotations: { readOnlyHint: true, openWorldHint: false },
73
+ }, async ({ projectPath }) => {
74
+ try {
75
+ const cm = new ConfigManager(projectPath);
76
+ const entries = await cm.list();
77
+ return jsonResult({
78
+ entries,
79
+ configPaths: {
80
+ user: getUserConfigPath(),
81
+ project: projectPath ? getProjectConfigPath(projectPath) : null,
82
+ },
83
+ });
84
+ }
85
+ catch (error) {
86
+ const message = error instanceof Error ? error.message : String(error);
87
+ return errorResult(message);
88
+ }
89
+ });
90
+ }
91
+ //# sourceMappingURL=configTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configTools.js","sourceRoot":"","sources":["../../src/tools/configTools.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"contextTools.d.ts","sourceRoot":"","sources":["../../src/tools/contextTools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CAEzG;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAEtF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAEvF;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAChC,sBAAsB,CAAC,EAAE,MAAM,GAC9B,OAAO,CAAC,MAAM,CAAC,CAkCjB;AAeD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAwK5D"}
1
+ {"version":3,"file":"contextTools.d.ts","sourceRoot":"","sources":["../../src/tools/contextTools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAIvD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CAEzG;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAEtF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG;IAAE,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAEvF;AAED;;;GAGG;AACH,wBAAsB,eAAe,CACnC,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,EAChC,sBAAsB,CAAC,EAAE,MAAM,GAC9B,OAAO,CAAC,MAAM,CAAC,CAkCjB;AAeD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA4K5D"}
@@ -1,6 +1,7 @@
1
1
  import * as path from 'node:path';
2
2
  import { z } from 'zod';
3
3
  import { FileProjectStore, createContextPipeline, SystemPromptParser } from '@context-forge/core/node';
4
+ import { resolveProjectId } from './resolveProjectId.js';
4
5
  import { PROMPT_FILE_RELATIVE_PATH } from '@context-forge/core';
5
6
  // --- Shared helpers ---
6
7
  export function errorResult(message) {
@@ -43,9 +44,9 @@ export async function generateContext(projectId, overrides, additionalInstructio
43
44
  }
44
45
  /** Zod schema for optional project parameter overrides */
45
46
  const contextOverridesSchema = {
46
- projectId: z.string().describe('Project ID. Use project_list to find IDs.'),
47
- slice: z.string().optional().describe('Override the current slice name'),
48
- taskFile: z.string().optional().describe('Override the task file name'),
47
+ projectId: z.string().optional().describe('Project ID. Use project_list to find IDs. Omit to use default_project config.'),
48
+ fileSlice: z.string().optional().describe('Override the current slice name'),
49
+ fileTasks: z.string().optional().describe('Override the task file name'),
49
50
  instruction: z.string().optional().describe('Override the instruction type (e.g., implementation, design, review)'),
50
51
  developmentPhase: z.string().optional().describe('Override the current development phase'),
51
52
  workType: z.enum(['start', 'continue']).optional().describe('Override whether starting or continuing work'),
@@ -56,11 +57,12 @@ export function registerContextTools(server) {
56
57
  // --- context_build ---
57
58
  server.registerTool('context_build', {
58
59
  title: 'Build Context',
59
- description: 'Build a complete context prompt for a Context Forge project. This is the primary tool for generating structured context blocks. Optionally override project parameters (slice, instruction, etc.) without modifying the stored project. Returns the assembled context ready for use.',
60
+ description: 'Build a complete context prompt for a Context Forge project. This is the primary tool for generating structured context blocks. Optionally override project parameters (fileSlice, instruction, etc.) without modifying the stored project. Returns the assembled context ready for use.',
60
61
  inputSchema: contextOverridesSchema,
61
62
  annotations: { readOnlyHint: false, idempotentHint: true, openWorldHint: false },
62
63
  }, async ({ projectId, additionalInstructions, ...overrideFields }) => {
63
64
  try {
65
+ const resolvedId = await resolveProjectId(projectId);
64
66
  // Collect defined overrides
65
67
  const overrides = {};
66
68
  for (const [key, value] of Object.entries(overrideFields)) {
@@ -68,7 +70,7 @@ export function registerContextTools(server) {
68
70
  overrides[key] = value;
69
71
  }
70
72
  }
71
- const contextString = await generateContext(projectId, Object.keys(overrides).length > 0 ? overrides : undefined, additionalInstructions);
73
+ const contextString = await generateContext(resolvedId, Object.keys(overrides).length > 0 ? overrides : undefined, additionalInstructions);
72
74
  return textResult(contextString);
73
75
  }
74
76
  catch (error) {
@@ -84,13 +86,14 @@ export function registerContextTools(server) {
84
86
  annotations: { readOnlyHint: true, idempotentHint: true, openWorldHint: false },
85
87
  }, async ({ projectId, additionalInstructions, ...overrideFields }) => {
86
88
  try {
89
+ const resolvedId = await resolveProjectId(projectId);
87
90
  const overrides = {};
88
91
  for (const [key, value] of Object.entries(overrideFields)) {
89
92
  if (value !== undefined) {
90
93
  overrides[key] = value;
91
94
  }
92
95
  }
93
- const contextString = await generateContext(projectId, Object.keys(overrides).length > 0 ? overrides : undefined, additionalInstructions);
96
+ const contextString = await generateContext(resolvedId, Object.keys(overrides).length > 0 ? overrides : undefined, additionalInstructions);
94
97
  return textResult(contextString);
95
98
  }
96
99
  catch (error) {
@@ -103,15 +106,16 @@ export function registerContextTools(server) {
103
106
  title: 'List Prompts',
104
107
  description: 'List available prompt templates for a Context Forge project. Returns template names and metadata. Use prompt_get to retrieve the full content of a specific template.',
105
108
  inputSchema: {
106
- projectId: z.string().describe('Project ID. Use project_list to find IDs.'),
109
+ projectId: z.string().optional().describe('Project ID. Use project_list to find IDs. Omit to use default_project config.'),
107
110
  },
108
111
  annotations: { readOnlyHint: true, openWorldHint: false },
109
112
  }, async ({ projectId }) => {
110
113
  try {
114
+ const resolvedId = await resolveProjectId(projectId);
111
115
  const store = new FileProjectStore();
112
- const project = await store.getById(projectId);
116
+ const project = await store.getById(resolvedId);
113
117
  if (!project) {
114
- return errorResult(`Project not found: '${projectId}'. Use the project_list tool to see available projects and their IDs.`);
118
+ return errorResult(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects and their IDs.`);
115
119
  }
116
120
  if (!project.projectPath) {
117
121
  return errorResult(`Project '${project.name}' has no configured project path. Set a project path before listing prompts.`);
@@ -136,16 +140,17 @@ export function registerContextTools(server) {
136
140
  title: 'Get Prompt',
137
141
  description: 'Get the full content of a specific prompt template. Returns the raw template text. Useful for inspecting what a template contains before building context with it.',
138
142
  inputSchema: {
139
- projectId: z.string().describe('Project ID. Use project_list to find IDs.'),
143
+ projectId: z.string().optional().describe('Project ID. Use project_list to find IDs. Omit to use default_project config.'),
140
144
  templateName: z.string().describe('Template name or key to match. Use prompt_list to see available templates.'),
141
145
  },
142
146
  annotations: { readOnlyHint: true, openWorldHint: false },
143
147
  }, async ({ projectId, templateName }) => {
144
148
  try {
149
+ const resolvedId = await resolveProjectId(projectId);
145
150
  const store = new FileProjectStore();
146
- const project = await store.getById(projectId);
151
+ const project = await store.getById(resolvedId);
147
152
  if (!project) {
148
- return errorResult(`Project not found: '${projectId}'. Use the project_list tool to see available projects and their IDs.`);
153
+ return errorResult(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects and their IDs.`);
149
154
  }
150
155
  if (!project.projectPath) {
151
156
  return errorResult(`Project '${project.name}' has no configured project path. Set a project path before retrieving prompts.`);
@@ -1 +1 @@
1
- {"version":3,"file":"contextTools.js","sourceRoot":"","sources":["../../src/tools/contextTools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contextTools.js","sourceRoot":"","sources":["../../src/tools/contextTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerGuideTools(server: McpServer): void;
3
+ //# sourceMappingURL=guideTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guideTools.d.ts","sourceRoot":"","sources":["../../src/tools/guideTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyBpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAsG1D"}
@@ -0,0 +1,107 @@
1
+ import { z } from 'zod';
2
+ import { FileProjectStore, GuideManager, ConfigManager } from '@context-forge/core/node';
3
+ import { resolveProjectId } from './resolveProjectId.js';
4
+ import { errorResult, jsonResult } from './contextTools.js';
5
+ /** Resolve projectId to projectPath, throwing actionable errors */
6
+ async function resolveProjectPath(projectId) {
7
+ const resolvedId = await resolveProjectId(projectId);
8
+ const store = new FileProjectStore();
9
+ const project = await store.getById(resolvedId);
10
+ if (!project) {
11
+ throw new Error(`Project not found: '${resolvedId}'. Use project_list to see available projects.`);
12
+ }
13
+ if (!project.projectPath) {
14
+ throw new Error(`Project '${project.name}' has no configured project path. Set a project path first.`);
15
+ }
16
+ return project.projectPath;
17
+ }
18
+ export function registerGuideTools(server) {
19
+ // --- guide_status ---
20
+ server.registerTool('guide_status', {
21
+ title: 'Guide Status',
22
+ description: 'Check the installation status of the AI project guide for a project. ' +
23
+ 'Returns whether the guide is installed, what method was used (submodule/clone/manual), ' +
24
+ 'current version, latest available version, and whether an update is available.',
25
+ inputSchema: {
26
+ projectId: z
27
+ .string()
28
+ .optional()
29
+ .describe('Project ID or name. Falls back to default_project config if omitted.'),
30
+ },
31
+ annotations: { readOnlyHint: true, openWorldHint: false },
32
+ }, async ({ projectId }) => {
33
+ try {
34
+ const projectPath = await resolveProjectPath(projectId);
35
+ const cm = new ConfigManager(projectPath);
36
+ const manager = new GuideManager(projectPath, cm);
37
+ const info = await manager.status();
38
+ return jsonResult(info);
39
+ }
40
+ catch (error) {
41
+ const message = error instanceof Error ? error.message : String(error);
42
+ return errorResult(message);
43
+ }
44
+ });
45
+ // --- guide_install ---
46
+ server.registerTool('guide_install', {
47
+ title: 'Install Guide',
48
+ description: 'Install the AI project guide into a project directory. ' +
49
+ 'Supports three strategies: "submodule" (default, requires git repo), ' +
50
+ '"clone" (standalone git clone), or "manual" (tarball download, no git needed). ' +
51
+ 'Error if the guide is already installed — use guide_update instead.',
52
+ inputSchema: {
53
+ projectId: z
54
+ .string()
55
+ .optional()
56
+ .describe('Project ID or name. Falls back to default_project config if omitted.'),
57
+ strategy: z
58
+ .enum(['submodule', 'clone', 'manual'])
59
+ .optional()
60
+ .describe('Installation strategy. Overrides guide.git_strategy config for this call.'),
61
+ source: z
62
+ .string()
63
+ .optional()
64
+ .describe('Source repository URL. Overrides guide.source config for this call.'),
65
+ },
66
+ annotations: { readOnlyHint: false, openWorldHint: true },
67
+ }, async ({ projectId, strategy, source }) => {
68
+ try {
69
+ const projectPath = await resolveProjectPath(projectId);
70
+ const cm = new ConfigManager(projectPath);
71
+ const manager = new GuideManager(projectPath, cm);
72
+ const result = await manager.install(strategy, source);
73
+ return jsonResult(result);
74
+ }
75
+ catch (error) {
76
+ const message = error instanceof Error ? error.message : String(error);
77
+ return errorResult(message);
78
+ }
79
+ });
80
+ // --- guide_update ---
81
+ server.registerTool('guide_update', {
82
+ title: 'Update Guide',
83
+ description: 'Update an existing AI project guide installation to the latest version. ' +
84
+ 'Uses the same strategy that was used for installation. ' +
85
+ 'Error if the guide is not installed — use guide_install first.',
86
+ inputSchema: {
87
+ projectId: z
88
+ .string()
89
+ .optional()
90
+ .describe('Project ID or name. Falls back to default_project config if omitted.'),
91
+ },
92
+ annotations: { readOnlyHint: false, openWorldHint: true },
93
+ }, async ({ projectId }) => {
94
+ try {
95
+ const projectPath = await resolveProjectPath(projectId);
96
+ const cm = new ConfigManager(projectPath);
97
+ const manager = new GuideManager(projectPath, cm);
98
+ const result = await manager.update();
99
+ return jsonResult(result);
100
+ }
101
+ catch (error) {
102
+ const message = error instanceof Error ? error.message : String(error);
103
+ return errorResult(message);
104
+ }
105
+ });
106
+ }
107
+ //# sourceMappingURL=guideTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guideTools.js","sourceRoot":"","sources":["../../src/tools/guideTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ export declare function registerIntrospectionTools(server: McpServer): void;
3
+ //# sourceMappingURL=introspectionTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"introspectionTools.d.ts","sourceRoot":"","sources":["../../src/tools/introspectionTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuGpE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgLlE"}
@@ -0,0 +1,215 @@
1
+ import { z } from 'zod';
2
+ import { FileProjectStore, ArtifactIntrospector, buildModel, } from '@context-forge/core/node';
3
+ import { join } from 'node:path';
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
+ * Resolve an absolute file path from either:
13
+ * - filePath (absolute, takes precedence)
14
+ * - projectId + path (resolved via project store)
15
+ */
16
+ async function resolveIntrospectionPath(args) {
17
+ if (args.filePath) {
18
+ return args.filePath;
19
+ }
20
+ if (!args.path) {
21
+ throw new Error('Either filePath (absolute) or projectId + path (relative) must be provided.');
22
+ }
23
+ const resolvedId = await resolveProjectId(args.projectId);
24
+ const store = new FileProjectStore();
25
+ const project = await store.getById(resolvedId);
26
+ if (!project) {
27
+ throw new Error(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects.`);
28
+ }
29
+ if (!project.projectPath) {
30
+ throw new Error(`Project '${resolvedId}' has no projectPath configured. Set it with project_update.`);
31
+ }
32
+ return join(project.projectPath, args.path);
33
+ }
34
+ /**
35
+ * Resolve a project's absolute path from projectId or explicit projectPath.
36
+ */
37
+ async function resolveProjectPath(args) {
38
+ if (args.projectPath) {
39
+ return args.projectPath;
40
+ }
41
+ const resolvedId = await resolveProjectId(args.projectId);
42
+ const store = new FileProjectStore();
43
+ const project = await store.getById(resolvedId);
44
+ if (!project) {
45
+ throw new Error(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects.`);
46
+ }
47
+ if (!project.projectPath) {
48
+ throw new Error(`Project '${resolvedId}' has no projectPath configured. Set it with project_update.`);
49
+ }
50
+ return project.projectPath;
51
+ }
52
+ // Common input schema fragments
53
+ const filePathSchema = {
54
+ projectId: z
55
+ .string()
56
+ .optional()
57
+ .describe('Project ID. Omit to use default_project config.'),
58
+ path: z
59
+ .string()
60
+ .optional()
61
+ .describe('Relative path from project root to the target file.'),
62
+ filePath: z
63
+ .string()
64
+ .optional()
65
+ .describe('Absolute path to the target file. Overrides projectId + path.'),
66
+ };
67
+ export function registerIntrospectionTools(server) {
68
+ // --- introspection_slice_plan ---
69
+ server.registerTool('introspection_slice_plan', {
70
+ title: 'Parse Slice Plan',
71
+ description: 'Parse a slice plan document and return structured data: entries with index, name, status, ' +
72
+ 'isChecked, plus totalSlices and completedSlices counts.',
73
+ inputSchema: filePathSchema,
74
+ annotations: { readOnlyHint: true, openWorldHint: false },
75
+ }, async (args) => {
76
+ try {
77
+ const resolved = await resolveIntrospectionPath(args);
78
+ const introspector = new ArtifactIntrospector();
79
+ const result = await introspector.parseSlicePlan(resolved);
80
+ return jsonResult(result);
81
+ }
82
+ catch (error) {
83
+ const msg = error instanceof Error ? error.message : String(error);
84
+ return errorResult(`Error: ${msg}`);
85
+ }
86
+ });
87
+ // --- introspection_tasks ---
88
+ server.registerTool('introspection_tasks', {
89
+ title: 'Parse Task File',
90
+ description: 'Parse a task file and return structured data: items with name and done status, ' +
91
+ 'plus totalTasks, completedTasks, and inferredStatus.',
92
+ inputSchema: filePathSchema,
93
+ annotations: { readOnlyHint: true, openWorldHint: false },
94
+ }, async (args) => {
95
+ try {
96
+ const resolved = await resolveIntrospectionPath(args);
97
+ const introspector = new ArtifactIntrospector();
98
+ const result = await introspector.parseTaskFile(resolved);
99
+ return jsonResult(result);
100
+ }
101
+ catch (error) {
102
+ const msg = error instanceof Error ? error.message : String(error);
103
+ return errorResult(`Error: ${msg}`);
104
+ }
105
+ });
106
+ // --- introspection_frontmatter ---
107
+ server.registerTool('introspection_frontmatter', {
108
+ title: 'Parse Frontmatter',
109
+ description: 'Extract YAML frontmatter from a markdown file. Returns found (boolean) and data ' +
110
+ '(key-value pairs).',
111
+ inputSchema: filePathSchema,
112
+ annotations: { readOnlyHint: true, openWorldHint: false },
113
+ }, async (args) => {
114
+ try {
115
+ const resolved = await resolveIntrospectionPath(args);
116
+ const introspector = new ArtifactIntrospector();
117
+ const result = await introspector.parseFrontmatter(resolved);
118
+ return jsonResult(result);
119
+ }
120
+ catch (error) {
121
+ const msg = error instanceof Error ? error.message : String(error);
122
+ return errorResult(`Error: ${msg}`);
123
+ }
124
+ });
125
+ // --- introspection_documents ---
126
+ server.registerTool('introspection_documents', {
127
+ title: 'Detect Documents',
128
+ description: 'Detect methodology documents for a given slice index. Returns paths to sliceDesign, ' +
129
+ 'taskFile(s), architecture, and slicePlan if they exist.',
130
+ inputSchema: {
131
+ projectId: z
132
+ .string()
133
+ .optional()
134
+ .describe('Project ID. Omit to use default_project config.'),
135
+ projectPath: z
136
+ .string()
137
+ .optional()
138
+ .describe('Absolute path to project root. Overrides projectId.'),
139
+ sliceIndex: z
140
+ .number()
141
+ .describe('Numeric slice index to check (e.g., 163).'),
142
+ },
143
+ annotations: { readOnlyHint: true, openWorldHint: false },
144
+ }, async (args) => {
145
+ try {
146
+ const resolved = await resolveProjectPath({
147
+ projectId: args.projectId,
148
+ projectPath: args.projectPath,
149
+ });
150
+ const introspector = new ArtifactIntrospector();
151
+ const result = await introspector.detectDocuments(resolved, args.sliceIndex);
152
+ return jsonResult(result);
153
+ }
154
+ catch (error) {
155
+ const msg = error instanceof Error ? error.message : String(error);
156
+ return errorResult(`Error: ${msg}`);
157
+ }
158
+ });
159
+ // --- introspection_future_work ---
160
+ server.registerTool('introspection_future_work', {
161
+ title: 'Parse Future Work',
162
+ description: 'Parse the Future Work section from a slice plan document. Returns items with index, ' +
163
+ 'name, and done status.',
164
+ inputSchema: {
165
+ ...filePathSchema,
166
+ nextIndex: z
167
+ .number()
168
+ .optional()
169
+ .describe('Starting index for auto-numbering unnumbered items.'),
170
+ },
171
+ annotations: { readOnlyHint: true, openWorldHint: false },
172
+ }, async (args) => {
173
+ try {
174
+ const resolved = await resolveIntrospectionPath(args);
175
+ const introspector = new ArtifactIntrospector();
176
+ const result = await introspector.parseFutureWork(resolved, args.nextIndex);
177
+ return jsonResult(result);
178
+ }
179
+ catch (error) {
180
+ const msg = error instanceof Error ? error.message : String(error);
181
+ return errorResult(`Error: ${msg}`);
182
+ }
183
+ });
184
+ // --- project_structure ---
185
+ server.registerTool('project_structure', {
186
+ title: 'Project Structure',
187
+ description: 'Build the full project model for a Context Forge project. Returns structured data ' +
188
+ 'including foundation docs, project architecture, initiatives with slices and tasks, ' +
189
+ 'future slices, quality/investigation/maintenance docs, and devlog status. ' +
190
+ 'Equivalent to parse.py build_model() output.',
191
+ inputSchema: {
192
+ projectId: z
193
+ .string()
194
+ .optional()
195
+ .describe('Project ID. Omit to use default_project config.'),
196
+ name: z.string().optional().describe('Override project name in output.'),
197
+ description: z.string().optional().describe('Override project description in output.'),
198
+ },
199
+ annotations: { readOnlyHint: true, openWorldHint: false },
200
+ }, async (args) => {
201
+ try {
202
+ const projectPath = await resolveProjectPath({ projectId: args.projectId });
203
+ const result = await buildModel(projectPath, {
204
+ name: args.name,
205
+ description: args.description,
206
+ });
207
+ return jsonResult(result);
208
+ }
209
+ catch (error) {
210
+ const msg = error instanceof Error ? error.message : String(error);
211
+ return errorResult(`Error: ${msg}`);
212
+ }
213
+ });
214
+ }
215
+ //# 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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"projectTools.d.ts","sourceRoot":"","sources":["../../src/tools/projectTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsCpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0H5D"}
1
+ {"version":3,"file":"projectTools.d.ts","sourceRoot":"","sources":["../../src/tools/projectTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAsCpE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0J5D"}
@@ -1,13 +1,14 @@
1
1
  import { z } from 'zod';
2
- import { FileProjectStore } from '@context-forge/core/node';
2
+ import { FileProjectStore, ArtifactIntrospector } from '@context-forge/core/node';
3
+ import { getSchema } from '@context-forge/core';
4
+ import { resolveProjectId } from './resolveProjectId.js';
3
5
  function toSummary(project) {
4
6
  return {
5
7
  id: project.id,
6
8
  name: project.name,
7
- slice: project.slice,
9
+ fileSlice: project.fileSlice,
8
10
  template: project.template,
9
11
  instruction: project.instruction,
10
- isMonorepo: project.isMonorepo,
11
12
  projectPath: project.projectPath,
12
13
  updatedAt: project.updatedAt,
13
14
  };
@@ -40,17 +41,31 @@ export function registerProjectTools(server) {
40
41
  // --- project_get ---
41
42
  server.registerTool('project_get', {
42
43
  title: 'Get Project',
43
- description: 'Get full details for a specific Context Forge project by ID. Returns all project fields including configuration, custom data, and timestamps. Use project_list first to find project IDs.',
44
+ 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.',
44
45
  inputSchema: {
45
- id: z.string().describe('Project ID (e.g., project_1739...). Use project_list to find IDs.'),
46
+ id: z.string().optional().describe('Project ID (e.g., project_1739...). Omit to use default_project config.'),
46
47
  },
47
48
  annotations: { readOnlyHint: true, openWorldHint: false },
48
49
  }, async ({ id }) => {
49
50
  try {
51
+ const resolvedId = await resolveProjectId(id);
50
52
  const store = new FileProjectStore();
51
- const project = await store.getById(id);
53
+ const project = await store.getById(resolvedId);
52
54
  if (!project) {
53
- return errorResult(`Project not found: '${id}'. Use the project_list tool to see available projects and their IDs.`);
55
+ return errorResult(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects and their IDs.`);
56
+ }
57
+ // Enrich with introspection when projectPath is available
58
+ if (project.projectPath) {
59
+ try {
60
+ const introspector = new ArtifactIntrospector();
61
+ const introspection = await introspector.summarize(project);
62
+ return jsonResult({ ...project, introspection });
63
+ }
64
+ catch (e) {
65
+ // Graceful degradation — return project without introspection
66
+ const msg = e instanceof Error ? e.message : String(e);
67
+ console.error(`Introspection failed for project ${resolvedId}: ${msg}`);
68
+ }
54
69
  }
55
70
  return jsonResult(project);
56
71
  }
@@ -62,25 +77,26 @@ export function registerProjectTools(server) {
62
77
  // --- project_update ---
63
78
  server.registerTool('project_update', {
64
79
  title: 'Update Project',
65
- description: 'Update configuration fields on an existing Context Forge project. Provide the project ID and any fields to change (e.g., slice, instruction, developmentPhase). Returns the full updated project. Does not delete or replace — only modifies specified fields.',
80
+ 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.',
66
81
  inputSchema: {
67
- id: z.string().describe('Project ID to update'),
82
+ id: z.string().optional().describe('Project ID to update. Omit to use default_project config.'),
68
83
  name: z.string().optional().describe('Project display name'),
69
84
  template: z.string().optional().describe('Template name'),
70
- slice: z.string().optional().describe('Current slice name'),
71
- taskFile: z.string().optional().describe('Task file name'),
85
+ fileSlice: z.string().optional().describe('Current slice name'),
86
+ fileTasks: z.string().optional().describe('Task file name'),
72
87
  instruction: z.string().optional().describe('Instruction type (e.g., implementation, design, review)'),
73
88
  developmentPhase: z.string().optional().describe('Current development phase'),
74
89
  workType: z.enum(['start', 'continue']).optional().describe('Whether starting or continuing work'),
75
- projectDate: z.string().optional().describe('Project date string'),
76
- isMonorepo: z.boolean().optional().describe('Whether project uses monorepo mode'),
77
- isMonorepoEnabled: z.boolean().optional().describe('Whether monorepo UI is enabled'),
90
+ dateProject: z.string().optional().describe('Project date string'),
78
91
  projectPath: z.string().optional().describe('Absolute path to project root'),
92
+ fileHLD: z.string().optional().describe('Path to HLD document (relative to project root)'),
93
+ fileArch: z.string().optional().describe('Path to architecture document (relative to project root)'),
94
+ fileSlicePlan: z.string().optional().describe('Path to slice plan (relative to project root)'),
95
+ fileSpec: z.string().optional().describe('Path to project spec (relative to project root)'),
79
96
  customData: z
80
97
  .object({
81
98
  recentEvents: z.string().optional(),
82
99
  additionalNotes: z.string().optional(),
83
- monorepoNote: z.string().optional(),
84
100
  availableTools: z.string().optional(),
85
101
  })
86
102
  .optional()
@@ -89,6 +105,7 @@ export function registerProjectTools(server) {
89
105
  annotations: { destructiveHint: false, idempotentHint: true, openWorldHint: false },
90
106
  }, async ({ id, ...fields }) => {
91
107
  try {
108
+ const resolvedId = await resolveProjectId(id);
92
109
  // Collect defined update fields (exclude undefined values)
93
110
  const updates = {};
94
111
  for (const [key, value] of Object.entries(fields)) {
@@ -97,17 +114,17 @@ export function registerProjectTools(server) {
97
114
  }
98
115
  }
99
116
  if (Object.keys(updates).length === 0) {
100
- return errorResult('No update fields provided. Specify at least one field to update (e.g., slice, instruction, name).');
117
+ return errorResult('No update fields provided. Specify at least one field to update (e.g., fileSlice, instruction, name).');
101
118
  }
102
119
  const store = new FileProjectStore();
103
120
  // Check project exists
104
- const existing = await store.getById(id);
121
+ const existing = await store.getById(resolvedId);
105
122
  if (!existing) {
106
- return errorResult(`Project not found: '${id}'. Use the project_list tool to see available projects and their IDs.`);
123
+ return errorResult(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects and their IDs.`);
107
124
  }
108
- await store.update(id, updates);
125
+ await store.update(resolvedId, updates);
109
126
  // Read back updated project
110
- const updated = await store.getById(id);
127
+ const updated = await store.getById(resolvedId);
111
128
  return jsonResult(updated);
112
129
  }
113
130
  catch (error) {
@@ -115,5 +132,14 @@ export function registerProjectTools(server) {
115
132
  return errorResult(`Error: ${message}`);
116
133
  }
117
134
  });
135
+ // --- project_schema ---
136
+ server.registerTool('project_schema', {
137
+ title: 'Project Schema',
138
+ 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.',
139
+ inputSchema: {},
140
+ annotations: { readOnlyHint: true, openWorldHint: false },
141
+ }, async () => {
142
+ return jsonResult(getSchema());
143
+ });
118
144
  }
119
145
  //# sourceMappingURL=projectTools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"projectTools.js","sourceRoot":"","sources":["../../src/tools/projectTools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"projectTools.js","sourceRoot":"","sources":["../../src/tools/projectTools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Resolves the project ID to use for an MCP tool call.
3
+ *
4
+ * Priority:
5
+ * 1. explicitId — if provided, return it immediately
6
+ * 2. default_project config key — if configured, return its value
7
+ * 3. Throws a descriptive error with usage guidance
8
+ *
9
+ * @param explicitId - projectId from the MCP tool arguments (may be undefined)
10
+ * @param configProjectPath - optional projectPath for reading project-level config
11
+ */
12
+ export declare function resolveProjectId(explicitId?: string, configProjectPath?: string): Promise<string>;
13
+ //# sourceMappingURL=resolveProjectId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveProjectId.d.ts","sourceRoot":"","sources":["../../src/tools/resolveProjectId.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,CAAC,EAAE,MAAM,EACnB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,MAAM,CAAC,CAiBjB"}
@@ -0,0 +1,26 @@
1
+ import { ConfigManager } from '@context-forge/core/node';
2
+ /**
3
+ * Resolves the project ID to use for an MCP tool call.
4
+ *
5
+ * Priority:
6
+ * 1. explicitId — if provided, return it immediately
7
+ * 2. default_project config key — if configured, return its value
8
+ * 3. Throws a descriptive error with usage guidance
9
+ *
10
+ * @param explicitId - projectId from the MCP tool arguments (may be undefined)
11
+ * @param configProjectPath - optional projectPath for reading project-level config
12
+ */
13
+ export async function resolveProjectId(explicitId, configProjectPath) {
14
+ if (explicitId) {
15
+ return explicitId;
16
+ }
17
+ const cm = new ConfigManager(configProjectPath);
18
+ const result = await cm.get('default_project');
19
+ const defaultId = result.value;
20
+ if (defaultId) {
21
+ return defaultId;
22
+ }
23
+ throw new Error('No project ID provided and no default_project configured. ' +
24
+ 'Either pass a projectId argument or set a default with: config_set key="default_project" value="<id>" scope="user"');
25
+ }
26
+ //# sourceMappingURL=resolveProjectId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveProjectId.js","sourceRoot":"","sources":["../../src/tools/resolveProjectId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAmB,EACnB,iBAA0B;IAE1B,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,EAAE,GAAG,IAAI,aAAa,CAAC,iBAAiB,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,MAAM,CAAC,KAAe,CAAC;IAEzC,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,4DAA4D;QAC1D,oHAAoH,CACvH,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"stateTools.d.ts","sourceRoot":"","sources":["../../src/tools/stateTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiE1D"}
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"}
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod';
2
2
  import { FileProjectStore } from '@context-forge/core/node';
3
3
  import { errorResult, jsonResult } from './contextTools.js';
4
+ import { resolveProjectId } from './resolveProjectId.js';
4
5
  export function registerStateTools(server) {
5
6
  // --- context_summarize ---
6
7
  server.registerTool('context_summarize', {
@@ -9,7 +10,7 @@ export function registerStateTools(server) {
9
10
  'which will be included in subsequent context_build output. Use this after significant work milestones, context ' +
10
11
  "switches, or to record session progress for continuity. Analogous to Claude Code's /compact but for project-level state.",
11
12
  inputSchema: {
12
- projectId: z.string().describe('Project ID to update. Use project_list to find IDs.'),
13
+ projectId: z.string().optional().describe('Project ID to update. Use project_list to find IDs. Omit to use default_project config.'),
13
14
  summary: z
14
15
  .string()
15
16
  .describe('Summary of recent events, session progress, or current project state. ' +
@@ -27,11 +28,12 @@ export function registerStateTools(server) {
27
28
  if (!summary.trim()) {
28
29
  return errorResult('Summary text is required. Provide a non-empty summary of recent events or session state.');
29
30
  }
31
+ const resolvedId = await resolveProjectId(projectId);
30
32
  const store = new FileProjectStore();
31
33
  // Check project exists
32
- const existing = await store.getById(projectId);
34
+ const existing = await store.getById(resolvedId);
33
35
  if (!existing) {
34
- return errorResult(`Project not found: '${projectId}'. Use the project_list tool to see available projects and their IDs.`);
36
+ return errorResult(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects and their IDs.`);
35
37
  }
36
38
  // Merge customData: preserve existing fields, overlay summary + optional additionalNotes
37
39
  const mergedCustomData = {
@@ -39,9 +41,9 @@ export function registerStateTools(server) {
39
41
  recentEvents: summary,
40
42
  ...(additionalNotes !== undefined && { additionalNotes }),
41
43
  };
42
- await store.update(projectId, { customData: mergedCustomData });
44
+ await store.update(resolvedId, { customData: mergedCustomData });
43
45
  // Read back updated project
44
- const updated = await store.getById(projectId);
46
+ const updated = await store.getById(resolvedId);
45
47
  return jsonResult(updated);
46
48
  }
47
49
  catch (error) {
@@ -1 +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;AAE5D,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,CAAC,qDAAqD,CAAC;YACrF,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,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;YAErC,uBAAuB;YACvB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,WAAW,CAChB,uBAAuB,SAAS,uEAAuE,CACxG,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,SAAS,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC;YAEhE,4BAA4B;YAC5B,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC/C,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"}
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,yFAAyF,CAAC;YACpI,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;AAapE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiE7D"}
@@ -0,0 +1,63 @@
1
+ import { z } from 'zod';
2
+ import { FileProjectStore, FutureWorkCollector } from '@context-forge/core/node';
3
+ import { resolveProjectId } from './resolveProjectId.js';
4
+ function errorResult(message) {
5
+ return { content: [{ type: 'text', text: message }], isError: true };
6
+ }
7
+ function jsonResult(data) {
8
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
9
+ }
10
+ export function registerWorkflowTools(server) {
11
+ // --- workflow_future ---
12
+ server.registerTool('workflow_future', {
13
+ title: 'Future Work Collector',
14
+ description: 'Aggregate future work items across all slice plans in a project. ' +
15
+ 'Returns a FutureWorkCollectorResult with groups (by initiative), totals, and a markdown summary. ' +
16
+ 'Two source patterns are supported: (1) inline ## Future Work sections in regular slice plans, ' +
17
+ '(2) standalone *-slices.future.* files whose entire main body is future work. ' +
18
+ 'Response shape: { projectPath, groups[], totalItems, pendingItems, completedItems, markdown }. ' +
19
+ 'Each group: { initiativeIndex, initiativeName, sourceFile, items[], totalItems, pendingItems, completedItems }. ' +
20
+ 'Each item: { index, name, done, sourceFile, sourceInitiativeIndex, sourceInitiativeName }.',
21
+ inputSchema: {
22
+ projectId: z
23
+ .string()
24
+ .optional()
25
+ .describe('Project ID. Omit to use default_project config.'),
26
+ status: z
27
+ .enum(['all', 'pending', 'completed'])
28
+ .optional()
29
+ .default('all')
30
+ .describe('Filter items by completion state. Default: "all".'),
31
+ includeMarkdown: z
32
+ .boolean()
33
+ .optional()
34
+ .default(true)
35
+ .describe('Include markdown summary field in response. Default: true.'),
36
+ },
37
+ annotations: { readOnlyHint: true, openWorldHint: false },
38
+ }, async (args) => {
39
+ try {
40
+ const resolvedId = await resolveProjectId(args.projectId);
41
+ const store = new FileProjectStore();
42
+ const project = await store.getById(resolvedId);
43
+ if (!project) {
44
+ return errorResult(`Project not found: '${resolvedId}'. Use the project_list tool to see available projects.`);
45
+ }
46
+ if (!project.projectPath) {
47
+ return errorResult(`Project '${resolvedId}' has no projectPath configured. Set it with project_update.`);
48
+ }
49
+ const collector = new FutureWorkCollector();
50
+ const result = await collector.collect(project.projectPath, args.status ?? 'all');
51
+ if (!args.includeMarkdown) {
52
+ const { markdown: _md, ...rest } = result;
53
+ return jsonResult(rest);
54
+ }
55
+ return jsonResult(result);
56
+ }
57
+ catch (error) {
58
+ const msg = error instanceof Error ? error.message : String(error);
59
+ return errorResult(`Error: ${msg}`);
60
+ }
61
+ });
62
+ }
63
+ //# 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@context-forge/mcp",
3
- "version": "0.1.0",
3
+ "version": "0.2.2",
4
4
  "description": "MCP server for Context Forge — generates structured AI context prompts from project configuration and templates",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -34,7 +34,7 @@
34
34
  "dependencies": {
35
35
  "@modelcontextprotocol/sdk": "^1.26.0",
36
36
  "zod": "^4.1.5",
37
- "@context-forge/core": "0.1.0"
37
+ "@context-forge/core": "0.2.2"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^25.3.0",