fix(coding-agent): scope disabled-only autocomplete to enable/disable; fix changelog section

- collectMcpServerNames takes an includeDisabled flag (default true); the
  /mcp completer now passes false for test/reconnect/reauth/unauth, whose
  handlers (#resolveServerForAuth, reconnectServer) can never resolve a
  disabled-only discovered name (dropped from mcpManager, absent from
  mcpServers). enable/disable keep offering it since #handleSetEnabled
  handles that case for both directions.
- Moved the /mcp autocomplete CHANGELOG entry from the now-released
  ## [17.1.0] section (where an earlier upstream merge relocated it) back
  under ## [Unreleased].
This commit is contained in:
Mathews-Tom
2026-07-24 07:42:30 +05:30
parent 395f4b7530
commit 416a3cf65e
4 changed files with 62 additions and 13 deletions
@@ -136,6 +136,30 @@ describe("MCP server-name autocomplete", () => {
expect(filtered?.[0]?.value).toBe("enable my-server ");
});
test("/mcp getArgumentCompletions offers a disabled-only discovered name for enable/disable but not test/reconnect/reauth/unauth", async () => {
// "discovered-disabled" is a third-party server that was /mcp disable'd:
// present only in userConfig.disabledServers, absent from mcpServers, and
// no longer reported by the manager (loadAllMCPConfigs drops disabled
// sources). #resolveServerForAuth/reconnectServer can't resolve it, so
// test/reconnect/reauth/unauth must not suggest it.
await Bun.write(
getMCPConfigPath("user", projectDir),
`${JSON.stringify({ mcpServers: {}, disabledServers: ["discovered-disabled"] }, null, 2)}\n`,
);
await writeConfig("project", projectDir, {});
const { ctx } = createFakeCtx([]);
const runtime: TuiSlashCommandRuntime = { ctx };
const mcp = buildTuiBuiltinSlashCommands(runtime).find(c => c.name === "mcp");
if (!mcp?.getArgumentCompletions) throw new Error("expected /mcp command with getArgumentCompletions");
expect((await mcp.getArgumentCompletions("enable "))?.map(item => item.label)).toEqual(["discovered-disabled"]);
expect((await mcp.getArgumentCompletions("disable "))?.map(item => item.label)).toEqual(["discovered-disabled"]);
expect(await mcp.getArgumentCompletions("test ")).toBeNull();
expect(await mcp.getArgumentCompletions("reconnect ")).toBeNull();
expect(await mcp.getArgumentCompletions("reauth ")).toBeNull();
expect(await mcp.getArgumentCompletions("unauth ")).toBeNull();
});
test("/mcp getArgumentCompletions returns null for subcommands that don't take a server name", async () => {
await writeConfig("user", projectDir, { "my-server": { type: "stdio", command: "one" } });
const { ctx } = createFakeCtx([]);