@context-forge/mcp 0.6.25 → 0.6.27

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.
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * Resolves the project ID to use for an MCP tool call.
3
- * Accepts a project ID or name (case-insensitive name match).
3
+ * Accepts a project ID, name (case-insensitive), or omit to resolve from CWD.
4
4
  *
5
5
  * Priority:
6
6
  * 1. If value looks like an auto-generated ID, return it directly (no store lookup)
7
7
  * 2. Otherwise, search by ID then by name
8
- * 3. Throws a descriptive error with usage guidance
8
+ * 3. If no explicit ID, resolve from CWD (match against registered project/worktree paths)
9
+ * 4. Throws a descriptive error with usage guidance
9
10
  *
10
11
  * @param explicitId - projectId or project name from MCP tool arguments (may be undefined)
11
12
  */
@@ -1 +1 @@
1
- {"version":3,"file":"resolveProjectId.d.ts","sourceRoot":"","sources":["../../src/tools/resolveProjectId.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,CAAC,CAkCjB"}
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"}
@@ -1,31 +1,69 @@
1
1
  import { FileProjectStore } from '@context-forge/core/node';
2
2
  /** Project IDs start with the "project_" prefix */
3
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
+ }
4
38
  /**
5
39
  * Resolves the project ID to use for an MCP tool call.
6
- * Accepts a project ID or name (case-insensitive name match).
40
+ * Accepts a project ID, name (case-insensitive), or omit to resolve from CWD.
7
41
  *
8
42
  * Priority:
9
43
  * 1. If value looks like an auto-generated ID, return it directly (no store lookup)
10
44
  * 2. Otherwise, search by ID then by name
11
- * 3. Throws a descriptive error with usage guidance
45
+ * 3. If no explicit ID, resolve from CWD (match against registered project/worktree paths)
46
+ * 4. Throws a descriptive error with usage guidance
12
47
  *
13
48
  * @param explicitId - projectId or project name from MCP tool arguments (may be undefined)
14
49
  */
15
50
  export async function resolveProjectId(explicitId) {
16
- if (!explicitId) {
17
- throw new Error('No project ID provided. Pass a projectId argument (ID or name).\n' +
18
- ' Use project_list to see available projects.\n' +
19
- ' Use project_create to register a new project.');
20
- }
21
51
  // Fast path: project IDs pass through without store lookup
22
- if (PROJECT_ID_RE.test(explicitId)) {
52
+ if (explicitId && PROJECT_ID_RE.test(explicitId)) {
23
53
  return explicitId;
24
54
  }
25
- // Name-based lookup: search all projects
55
+ // Need to consult the store for name lookup or CWD resolution
56
+ let projects;
26
57
  try {
27
58
  const store = new FileProjectStore();
28
- const projects = await store.getAll();
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) {
29
67
  // Try exact ID match first (for non-standard IDs)
30
68
  const byId = projects.find((p) => p.id === explicitId);
31
69
  if (byId)
@@ -35,10 +73,14 @@ export async function resolveProjectId(explicitId) {
35
73
  const byName = projects.find((p) => p.name?.toLowerCase() === lower);
36
74
  if (byName)
37
75
  return byName.id;
76
+ throw new Error(`Project not found: '${explicitId}'. Use the project_list tool to see available projects.`);
38
77
  }
39
- catch {
40
- // Store unavailable — fall through to error
41
- }
42
- throw new Error(`Project not found: '${explicitId}'. Use the project_list tool to see available projects.`);
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.');
43
85
  }
44
86
  //# sourceMappingURL=resolveProjectId.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resolveProjectId.js","sourceRoot":"","sources":["../../src/tools/resolveProjectId.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,mDAAmD;AACnD,MAAM,aAAa,GAAG,WAAW,CAAC;AAElC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,UAAmB;IAEnB,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CACb,mEAAmE;YACjE,iDAAiD;YACjD,iDAAiD,CACpD,CAAC;IACJ,CAAC;IAED,2DAA2D;IAC3D,IAAI,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,yCAAyC;IACzC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC;QAEtC,kDAAkD;QAClD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;QACvD,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAEzB,kCAAkC;QAClC,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,KAAK,CAAC,CAAC;QACrE,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;IAC9C,CAAC;IAED,MAAM,IAAI,KAAK,CACb,uBAAuB,UAAU,yDAAyD,CAC3F,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"resolveProjectId.js","sourceRoot":"","sources":["../../src/tools/resolveProjectId.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.6.25",
3
+ "version": "0.6.27",
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.6.25"
37
+ "@context-forge/core": "0.6.27"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^25.3.0",