metheus-governance-mcp-cli 0.2.10 → 0.2.11

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 (2) hide show
  1. package/cli.mjs +38 -28
  2. package/package.json +1 -1
package/cli.mjs CHANGED
@@ -140,12 +140,33 @@ function firstNonEmptyString(values) {
140
140
  return "";
141
141
  }
142
142
 
143
+ function isEditorInstallDirectory(candidatePath) {
144
+ const normalized = String(candidatePath || "").replace(/\//g, "\\").toLowerCase();
145
+ if (!normalized) return false;
146
+ // Guard against runtime cwd/env resolving to editor installation directory
147
+ // instead of the actual opened workspace.
148
+ if (normalized.includes("\\appdata\\local\\programs\\microsoft vs code")) return true;
149
+ if (normalized.includes("\\program files\\microsoft vs code")) return true;
150
+ if (normalized.includes("\\program files (x86)\\microsoft vs code")) return true;
151
+ return false;
152
+ }
153
+
154
+ function sanitizeWorkspaceCandidate(rawCandidate) {
155
+ const fileCandidate = fileURIToLocalPath(rawCandidate);
156
+ const candidate = firstNonEmptyString([fileCandidate, rawCandidate]);
157
+ if (!candidate) return "";
158
+ const resolved = resolveWorkspaceDir(candidate);
159
+ if (!resolved) return "";
160
+ if (isEditorInstallDirectory(resolved)) return "";
161
+ return resolved;
162
+ }
163
+
143
164
  function extractWorkspaceCandidateFromFolders(rawFolders) {
144
165
  if (!Array.isArray(rawFolders)) return "";
145
166
  for (const folder of rawFolders) {
146
167
  if (typeof folder === "string") {
147
- const direct = firstNonEmptyString([fileURIToLocalPath(folder), folder]);
148
- if (direct) return resolveWorkspaceDir(direct);
168
+ const direct = sanitizeWorkspaceCandidate(folder);
169
+ if (direct) return direct;
149
170
  continue;
150
171
  }
151
172
  if (!folder || typeof folder !== "object" || Array.isArray(folder)) continue;
@@ -157,8 +178,8 @@ function extractWorkspaceCandidateFromFolders(rawFolders) {
157
178
  folder.root_path,
158
179
  folder.rootPath,
159
180
  ]);
160
- const candidate = firstNonEmptyString([fileURIToLocalPath(uriValue), uriValue]);
161
- if (candidate) return resolveWorkspaceDir(candidate);
181
+ const candidate = sanitizeWorkspaceCandidate(uriValue);
182
+ if (candidate) return candidate;
162
183
  }
163
184
  return "";
164
185
  }
@@ -192,10 +213,7 @@ function extractWorkspaceCandidateFromRequest(requestObj, toolArgs) {
192
213
  meta.root_uri,
193
214
  meta.rootUri,
194
215
  ]);
195
- const fileCandidate = fileURIToLocalPath(rawCandidate);
196
- const candidate = firstNonEmptyString([fileCandidate, rawCandidate]);
197
- if (!candidate) return "";
198
- return resolveWorkspaceDir(candidate);
216
+ return sanitizeWorkspaceCandidate(rawCandidate);
199
217
  }
200
218
 
201
219
  function extractWorkspaceCandidateFromEnv() {
@@ -208,26 +226,22 @@ function extractWorkspaceCandidateFromEnv() {
208
226
  process.env.WORKSPACE_DIR,
209
227
  process.env.WORKSPACE_FOLDER,
210
228
  process.env.VSCODE_WORKSPACE_FOLDER,
211
- process.env.VSCODE_CWD,
212
229
  process.env.PWD,
213
230
  process.env.INIT_CWD,
231
+ process.env.VSCODE_CWD,
214
232
  ]);
215
- const fileCandidate = fileURIToLocalPath(rawCandidate);
216
- const candidate = firstNonEmptyString([fileCandidate, rawCandidate]);
217
- if (!candidate) return "";
218
- return resolveWorkspaceDir(candidate);
233
+ return sanitizeWorkspaceCandidate(rawCandidate);
219
234
  }
220
235
 
221
236
  function resolveWorkspaceDirForRequest(defaultWorkspaceDir, requestObj, toolArgs) {
222
237
  const requestCandidate = extractWorkspaceCandidateFromRequest(requestObj, toolArgs);
223
238
  const envCandidate = extractWorkspaceCandidateFromEnv();
224
- const candidate = firstNonEmptyString([
225
- requestCandidate,
226
- envCandidate,
227
- defaultWorkspaceDir,
228
- process.cwd(),
229
- ]);
230
- return resolveWorkspaceDir(candidate);
239
+ const homeCandidate = firstNonEmptyString([process.env.USERPROFILE, process.env.HOME]);
240
+ for (const rawCandidate of [requestCandidate, envCandidate, defaultWorkspaceDir, process.cwd(), homeCandidate]) {
241
+ const resolved = sanitizeWorkspaceCandidate(rawCandidate);
242
+ if (resolved) return resolved;
243
+ }
244
+ return resolveWorkspaceDir(process.cwd());
231
245
  }
232
246
 
233
247
  function resolveProjectIDForRequest({
@@ -3508,14 +3522,10 @@ async function runProxy(flags) {
3508
3522
  } else if (envWorkspaceCandidate) {
3509
3523
  sessionWorkspaceDir = envWorkspaceCandidate;
3510
3524
  }
3511
- const requestWorkspaceDir = resolveWorkspaceDir(
3512
- firstNonEmptyString([
3513
- requestWorkspaceCandidate,
3514
- envWorkspaceCandidate,
3515
- sessionWorkspaceDir,
3516
- args.workspaceDir,
3517
- process.cwd(),
3518
- ]),
3525
+ const requestWorkspaceDir = resolveWorkspaceDirForRequest(
3526
+ firstNonEmptyString([sessionWorkspaceDir, args.workspaceDir, process.cwd()]),
3527
+ requestObj,
3528
+ toolArgs,
3519
3529
  );
3520
3530
  let autoSyncSummary = null;
3521
3531
  if (isJsonRpcMethod(requestObj, "tools/call")) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "metheus-governance-mcp-cli",
3
- "version": "0.2.10",
3
+ "version": "0.2.11",
4
4
  "description": "Metheus Governance MCP CLI (setup + stdio proxy)",
5
5
  "type": "module",
6
6
  "files": [