@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
|
|
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.
|
|
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":"
|
|
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
|
|
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.
|
|
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
|
-
//
|
|
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
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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;
|
|
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.
|
|
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.
|
|
37
|
+
"@context-forge/core": "0.6.27"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/node": "^25.3.0",
|