/* * repro_issue431.c - Reproduce-first case for OPEN bug #431. * * Issue: #431 - "VSCode Profiles do not inherit the default mcp.json from * the install process" * * Root cause: * install_editor_agent_configs() in src/cli/cli.c (around line 3217) writes * exactly ONE mcp.json path for VS Code: * macOS - /Library/Application Support/Code/User/mcp.json * Linux - /Code/User/mcp.json * There is NO logic that scans Code/User/profiles/ for existing per-profile * subdirectories and writes a matching mcp.json inside each one. * cbm_install_vscode_mcp() itself takes a single config_path argument and * has no profile-aware variant. The install API does not support profile * paths today. * * Expected (correct) behaviour: * When Code/User/profiles// directories exist at install time, the * install should ALSO write an mcp.json inside each profile directory so * that VSCode profile users get the MCP server without manual steps. * Concretely: after cbm_build_install_plan_json() (the dry-run oracle for * the real install), the plan MUST list the per-profile path * Code/User/profiles/5552b383/mcp.json * among its config_files_planned entries. * * Actual (buggy) behaviour: * Only Code/User/mcp.json appears in the plan. * Code/User/profiles/5552b383/mcp.json is absent. * * Why RED on current code: * The fixture creates the VSCode detection directory * /Library/Application Support/Code/User * and also a profile subdirectory * /Library/Application Support/Code/User/profiles/5552b383/ * cbm_build_install_plan_json() runs the real install logic in dry-run mode. * The assertion checks that the profile path appears in the JSON plan. * On current code it does NOT appear, so ASSERT fires RED. * * Fix location (not implemented here): * src/cli/cli.c, install_editor_agent_configs(): * After building the default vscode cp, scan Code/User/profiles/ for * subdirectories and call install_generic_agent_config() (or record into * the plan) for each discovered profile path, using cbm_install_vscode_mcp. */ #include #include "test_framework.h" #include "test_helpers.h" #include #include #include #include #include /* ── Fixture layout ───────────────────────────────────────────────────────── * * We emulate a macOS-style VSCode user config tree that contains ONE profile. * On Linux the detection key is $XDG_CONFIG_HOME/Code/User; the bug is the * same on both platforms. We use the portable cbm_app_config_dir() path on * non-Apple builds and the Library path on Apple builds so the detection in * cbm_detect_agents() actually fires, which is required for the plan to * include VSCode at all. * * / * Library/Application Support/Code/User/ <- detection sentinel dir * profiles/ * 5552b383/ <- active VSCode profile id * * After cbm_build_install_plan_json(tmpdir, BIN) the plan JSON must contain: * "Library/Application Support/Code/User/profiles/5552b383/mcp.json" * which it does NOT on buggy code (only the default mcp.json is listed). */ TEST(repro_issue431_vscode_profile_inherits_mcp_json) { /* --- set up temp home dir --- */ char tmpdir[512]; snprintf(tmpdir, sizeof(tmpdir), "/tmp/cbm_repro431_XXXXXX"); if (!cbm_mkdtemp(tmpdir)) FAIL("cbm_mkdtemp failed"); /* Create the VSCode User dir so cbm_detect_agents() marks vscode=true. * Mirror the real VSCode layout: the profile lives under profiles// */ #ifdef __APPLE__ const char *code_user_rel = "Library/Application Support/Code/User"; const char *profile_dir_rel = "Library/Application Support/Code/User/profiles/5552b383"; const char *profile_mcp_rel = "Library/Application Support/Code/User/profiles/5552b383/mcp.json"; #else /* Linux: detection uses cbm_app_config_dir() which is XDG-derived. * cbm_detect_agents() resolves that internally; we emulate it with * .config/Code/User which is the standard XDG fallback. */ const char *code_user_rel = ".config/Code/User"; const char *profile_dir_rel = ".config/Code/User/profiles/5552b383"; const char *profile_mcp_rel = ".config/Code/User/profiles/5552b383/mcp.json"; #endif /* Create the Code/User directory tree (detection sentinel) */ char code_user[768]; snprintf(code_user, sizeof(code_user), "%s/%s", tmpdir, code_user_rel); ASSERT_EQ(0, th_mkdir_p(code_user)); /* Create the per-profile subdirectory (mirrors what VSCode creates when * the user switches to a named profile) */ char profile_dir[768]; snprintf(profile_dir, sizeof(profile_dir), "%s/%s", tmpdir, profile_dir_rel); ASSERT_EQ(0, th_mkdir_p(profile_dir)); /* --- Precondition: VSCode is detected --- */ cbm_detected_agents_t agents = cbm_detect_agents(tmpdir); if (!agents.vscode) { /* #431 IS FIXED: install_vscode_profile_configs() (cli.c:3211) scans * Code/User/profiles/ and plans a per-profile mcp.json, so the assertion * below passes as a genuine regression guard whenever detection fires * (which it does for this fixture). This branch is only reached if * cbm_detect_agents() cannot see the fixture home on some platform — in * which case the fix cannot be VERIFIED here. Skip honestly rather than * vacuously PASS (would hide a future regression) or FAIL (would red a * fixed bug). */ th_rmtree(tmpdir); SKIP_PLATFORM("VSCode detection did not fire for the synthetic fixture " "home; cannot verify the #431 per-profile install here"); } /* --- Run the install plan oracle (dry-run, no mutations) --- */ char *plan_json = cbm_build_install_plan_json(tmpdir, "/usr/local/bin/codebase-memory-mcp"); ASSERT_NOT_NULL(plan_json); /* Sanity: the plan must mention vscode at all */ ASSERT(strstr(plan_json, "vscode") != NULL); /* * RED assertion: the per-profile mcp.json path must appear in * config_files_planned. On buggy code ONLY the default * "Code/User/mcp.json" is listed and "profiles/5552b383/mcp.json" * is absent, so this ASSERT fires RED. */ int profile_path_found = (strstr(plan_json, profile_mcp_rel) != NULL); free(plan_json); th_rmtree(tmpdir); ASSERT_TRUE(profile_path_found); PASS(); } /* ── Suite ──────────────────────────────────────────────────────────────── */ SUITE(repro_issue431) { RUN_TEST(repro_issue431_vscode_profile_inherits_mcp_json); }