Skip to content

Commit ca58e85

Browse files
data-douserCopilot
andauthored
Use dynamic package version and respect CODEQL_MCP_TMP_DIR env var (#27)
* fix: Address PR #24 review feedback - Replace hardcoded version in language-server.ts with dynamic getPackageVersion() that reads from package.json (cached) - Add getUserWorkspaceDir() for user-relative path resolution that falls back to process.cwd() in npm-installed (non-monorepo) layouts - Honor CODEQL_MCP_TMP_DIR env var in temp-dir.ts for read-only package root scenarios (e.g., npm global installs) - Move session-data-manager default storage from packageRoot to getProjectTmpBase() so it respects CODEQL_MCP_TMP_DIR override - Fix misleading test name: "should accept valid CODEQL_PATH" was actually testing rejection of non-existent paths - Add skipIf(win32) guard on sh-dependent PATH prepend test * Address PR #27 review feedback: path normalization, tests, and conventions (#28) * Initial plan * Fix import ordering, restore dot prefix, normalize temp dir paths, add unit tests Co-authored-by: data-douser <70299490+data-douser@users.noreply.github.com> * Remove weak test case and document limitation in comment Co-authored-by: data-douser <70299490+data-douser@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: data-douser <70299490+data-douser@users.noreply.github.com> --------- Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
1 parent 6e2e0e2 commit ca58e85

File tree

10 files changed

+295
-59
lines changed

10 files changed

+295
-59
lines changed

server/dist/codeql-development-mcp-server.js

Lines changed: 58 additions & 35 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/dist/codeql-development-mcp-server.js.map

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/src/lib/cli-tool-registry.ts

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { executeCodeQLCommand, executeQLTCommand, CLIExecutionResult } from './c
88
import { logger } from '../utils/logger';
99
import { evaluateQueryResults, QueryEvaluationResult, extractQueryMetadata } from './query-results-evaluator';
1010
import { getOrCreateLogDirectory } from './log-directory-manager';
11-
import { packageRootDir, resolveToolQueryPackPath, workspaceRootDir } from '../utils/package-paths';
11+
import { getUserWorkspaceDir, packageRootDir, resolveToolQueryPackPath } from '../utils/package-paths';
1212
import { writeFileSync, rmSync, existsSync, mkdirSync } from 'fs';
1313
import { basename, dirname, isAbsolute, join, resolve } from 'path';
1414
import { createProjectTempDir } from '../utils/temp-dir';
@@ -215,19 +215,21 @@ export function registerCLITool(server: McpServer, definition: CLIToolDefinition
215215
case 'codeql_test_run':
216216
case 'codeql_resolve_tests':
217217
// Handle tests parameter as positional arguments for test tools.
218-
// Resolve relative paths against workspaceRootDir since the MCP
219-
// server's cwd may not be the repo root.
218+
// Resolve relative paths against the user's effective workspace
219+
// directory. In monorepo layouts this is the repo root; in npm-
220+
// installed layouts it falls back to process.cwd().
220221
if (tests && Array.isArray(tests)) {
222+
const userDir = getUserWorkspaceDir();
221223
positionalArgs = [...positionalArgs, ...(tests as string[]).map(
222-
t => isAbsolute(t) ? t : resolve(workspaceRootDir, t)
224+
t => isAbsolute(t) ? t : resolve(userDir, t)
223225
)];
224226
}
225227
break;
226228

227229
case 'codeql_query_run': {
228230
// Resolve database path to absolute path if it's relative
229231
if (options.database && typeof options.database === 'string' && !isAbsolute(options.database)) {
230-
options.database = resolve(workspaceRootDir, options.database);
232+
options.database = resolve(getUserWorkspaceDir(), options.database);
231233
logger.info(`Resolved database path to: ${options.database}`);
232234
}
233235

@@ -389,9 +391,9 @@ export function registerCLITool(server: McpServer, definition: CLIToolDefinition
389391
let cwd: string | undefined;
390392
if ((name === 'codeql_pack_install' || name === 'codeql_pack_ls') && (dir || packDir)) {
391393
const rawCwd = (dir || packDir) as string;
392-
// Resolve relative paths against the workspace root, not process.cwd(),
393-
// since the MCP server's cwd may differ (especially in VS Code).
394-
cwd = isAbsolute(rawCwd) ? rawCwd : resolve(workspaceRootDir, rawCwd);
394+
// Resolve relative paths against the user's effective workspace
395+
// directory rather than a potentially read-only package root.
396+
cwd = isAbsolute(rawCwd) ? rawCwd : resolve(getUserWorkspaceDir(), rawCwd);
395397
}
396398

397399
// Add --additional-packs for commands that need to access local test packs.

server/src/lib/language-server.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { setTimeout, clearTimeout } from 'timers';
99
import { pathToFileURL } from 'url';
1010
import { delimiter, join } from 'path';
1111
import { logger } from '../utils/logger';
12+
import { getPackageVersion } from '../utils/package-paths';
1213
import { getProjectTmpDir } from '../utils/temp-dir';
1314
import { getResolvedCodeQLDir } from './cli-executor';
1415

@@ -243,7 +244,7 @@ export class CodeQLLanguageServer extends EventEmitter {
243244
processId: process.pid,
244245
clientInfo: {
245246
name: 'codeql-development-mcp-server',
246-
version: '2.23.9'
247+
version: getPackageVersion()
247248
},
248249
capabilities: {
249250
textDocument: {

server/src/lib/session-data-manager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { JSONFileSync } from 'lowdb/node';
88
import { mkdirSync, writeFileSync } from 'fs';
99
import { join } from 'path';
1010
import { randomUUID } from 'crypto';
11-
import { getPackageRootDir } from '../utils/package-paths';
11+
import { getProjectTmpBase } from '../utils/temp-dir';
1212
import {
1313
QueryDevelopmentSession,
1414
QueryState,
@@ -403,6 +403,6 @@ function parseBoolEnv(envVar: string | undefined, defaultValue: boolean): boolea
403403

404404
// Export singleton instance with environment variable support
405405
export const sessionDataManager = new SessionDataManager({
406-
storageLocation: process.env.MONITORING_STORAGE_LOCATION || join(getPackageRootDir(), '.ql-mcp-tracking'),
406+
storageLocation: process.env.MONITORING_STORAGE_LOCATION || join(getProjectTmpBase(), '.ql-mcp-tracking'),
407407
enableMonitoringTools: parseBoolEnv(process.env.ENABLE_MONITORING_TOOLS, false),
408408
});

0 commit comments

Comments
 (0)