diff --git a/src/cli/qmd.ts b/src/cli/qmd.ts index bfcd392..f42d1be 100755 --- a/src/cli/qmd.ts +++ b/src/cli/qmd.ts @@ -101,9 +101,12 @@ import { } from "../collections.js"; import { getEmbeddedQmdSkillContent, getEmbeddedQmdSkillFiles } from "../embedded-skills.js"; -// Enable production mode - allows using default database path -// Tests must set INDEX_PATH or use createStore() with explicit path -enableProductionMode(); +// NOTE: enableProductionMode() is intentionally NOT called at module scope here. +// Importing this module for its exports (e.g. buildEditorUri, termLink from +// test/cli.test.ts) must not flip the global production flag, as that leaks +// into unrelated tests that rely on the default (development) database path +// resolution. The flag is flipped inside the CLI's main-module guard below so +// it only fires when qmd is actually invoked as a script. // ============================================================================= // Store/DB lifecycle (no legacy singletons in store.ts) @@ -2821,6 +2824,11 @@ const isMain = argv1 === __filename || argv1?.endsWith("/qmd.js") || (argv1 != null && realpathSync(argv1) === __filename); if (isMain) { + // Flip to production mode only when this module is executed as the CLI + // entrypoint, not when imported for its exports. Tests must set INDEX_PATH + // or use createStore() with an explicit path. + enableProductionMode(); + const cli = parseCLI(); if (cli.values.version) { diff --git a/src/mcp/server.ts b/src/mcp/server.ts index 0cfb607..4fd0d77 100644 --- a/src/mcp/server.ts +++ b/src/mcp/server.ts @@ -32,8 +32,6 @@ import { import { getConfigPath } from "../collections.js"; import { enableProductionMode } from "../store.js"; -enableProductionMode(); - // ============================================================================= // Types for structured content // ============================================================================= @@ -541,6 +539,12 @@ Intent-aware lex (C++ performance, not sports): // ============================================================================= export async function startMcpServer(): Promise { + // Opt into production mode when the MCP server is actually started, not + // when this module is merely imported for its exports. Importing the module + // at the top level flipped the global production flag and broke test + // isolation for downstream suites that expect the default (development) + // database path behaviour. + enableProductionMode(); const configPath = getConfigPath(); const store = await createStore({ dbPath: getDefaultDbPath(), @@ -566,6 +570,10 @@ export type HttpServerHandle = { * Binds to localhost only. Returns a handle for shutdown and port discovery. */ export async function startMcpHttpServer(port: number, options?: { quiet?: boolean }): Promise { + // See startMcpServer() for the rationale — flip production mode here so the + // HTTP transport resolves the real database path, without leaking state into + // callers that only import this module for its exports (e.g. tests). + enableProductionMode(); const configPath = getConfigPath(); const store = await createStore({ dbPath: getDefaultDbPath(),