Files
wehub-resource-sync 41cb1c0170
OpenSSF Scorecard / scorecard (push) Failing after 0s
DCO / dco (push) Failing after 0s
CodeQL SAST / analyze (push) Failing after 1s
Deploy Pages / deploy (push) Failing after 1s
chore: import upstream snapshot with attribution
2026-07-13 12:28:05 +08:00

154 lines
6.8 KiB
C

/*
* 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 - <home>/Library/Application Support/Code/User/mcp.json
* Linux - <appconfig>/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/<id>/ 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
* <home>/Library/Application Support/Code/User
* and also a profile subdirectory
* <home>/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 <foundation/compat.h>
#include "test_framework.h"
#include "test_helpers.h"
#include <cli/cli.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/stat.h>
/* ── 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.
*
* <tmpdir>/
* 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/<id>/ */
#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);
}