fix: resolve all test failures and Cubic review issues

- Fix unstable-agent-babysitter: add promptAsync to test mock
- Fix claude-code-mcp-loader: isolate tests from user home configs
- Fix npm-dist-tags: encode packageName for scoped packages
- Fix agent-builder: clone source to prevent shared object mutation
- Fix add-plugin-to-opencode-config: handle JSONC with leading comments
- Fix auth-plugins/add-provider-config: error on parse failures
- Fix bun-install: clear timeout on completion
- Fix git-diff-stats: include untracked files in diff summary
This commit is contained in:
YeonGyu-Kim
2026-02-08 15:31:32 +09:00
parent 119e18c810
commit c7122b4127
9 changed files with 91 additions and 71 deletions
@@ -4,10 +4,19 @@ import { join } from "path"
import { tmpdir } from "os"
const TEST_DIR = join(tmpdir(), "mcp-loader-test-" + Date.now())
const TEST_HOME = join(TEST_DIR, "home")
describe("getSystemMcpServerNames", () => {
beforeEach(() => {
mkdirSync(TEST_DIR, { recursive: true })
mkdirSync(TEST_HOME, { recursive: true })
mock.module("os", () => ({
homedir: () => TEST_HOME,
tmpdir,
}))
mock.module("../../shared", () => ({
getClaudeConfigDir: () => join(TEST_HOME, ".claude"),
}))
})
afterEach(() => {
@@ -162,7 +171,7 @@ describe("getSystemMcpServerNames", () => {
it("reads user-level MCP config from ~/.claude.json", async () => {
// given
const userConfigPath = join(TEST_DIR, ".claude.json")
const userConfigPath = join(TEST_HOME, ".claude.json")
const userMcpConfig = {
mcpServers: {
"user-server": {
@@ -171,53 +180,37 @@ describe("getSystemMcpServerNames", () => {
},
},
}
writeFileSync(userConfigPath, JSON.stringify(userMcpConfig))
const originalCwd = process.cwd()
process.chdir(TEST_DIR)
try {
mock.module("os", () => ({
homedir: () => TEST_DIR,
tmpdir,
}))
writeFileSync(userConfigPath, JSON.stringify(userMcpConfig))
// when
const { getSystemMcpServerNames } = await import("./loader")
const names = getSystemMcpServerNames()
// then
expect(names.has("user-server")).toBe(true)
} finally {
process.chdir(originalCwd)
rmSync(userConfigPath, { force: true })
}
})
it("reads both ~/.claude.json and ~/.claude/.mcp.json for user scope", async () => {
// given: simulate both user-level config files
const userClaudeJson = join(TEST_DIR, ".claude.json")
const claudeDir = join(TEST_DIR, ".claude")
const claudeDirMcpJson = join(claudeDir, ".mcp.json")
// given
const claudeDir = join(TEST_HOME, ".claude")
mkdirSync(claudeDir, { recursive: true })
// ~/.claude.json has server-a
writeFileSync(userClaudeJson, JSON.stringify({
writeFileSync(join(TEST_HOME, ".claude.json"), JSON.stringify({
mcpServers: {
"server-from-claude-json": {
command: "npx",
args: ["server-a"],
},
"server-from-claude-json": { command: "npx", args: ["server-a"] },
},
}))
// ~/.claude/.mcp.json has server-b (CLI-managed)
writeFileSync(claudeDirMcpJson, JSON.stringify({
writeFileSync(join(claudeDir, ".mcp.json"), JSON.stringify({
mcpServers: {
"server-from-mcp-json": {
command: "npx",
args: ["server-b"],
},
"server-from-mcp-json": { command: "npx", args: ["server-b"] },
},
}))
@@ -225,20 +218,11 @@ describe("getSystemMcpServerNames", () => {
process.chdir(TEST_DIR)
try {
mock.module("os", () => ({
homedir: () => TEST_DIR,
tmpdir,
}))
// Also mock getClaudeConfigDir to point to our test .claude dir
mock.module("../../shared", () => ({
getClaudeConfigDir: () => claudeDir,
}))
// when
const { getSystemMcpServerNames } = await import("./loader")
const names = getSystemMcpServerNames()
// Both sources should be merged
// then
expect(names.has("server-from-claude-json")).toBe(true)
expect(names.has("server-from-mcp-json")).toBe(true)
} finally {