Merge pull request #602 from fxstein/fix/mcp-production-mode-test-leak

fix(mcp): do not enable production mode at module import time
This commit is contained in:
Tobias Lütke 2026-05-02 20:16:27 -04:00 committed by GitHub
commit a2fcac8225
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 21 additions and 5 deletions

View File

@ -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) {

View File

@ -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<void> {
// 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<HttpServerHandle> {
// 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(),