Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 4 additions & 3 deletions packages/core/util/mcp-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,10 @@ export function addMcpServers(
let modified = false;

for (const [key, value] of Object.entries(servers)) {
if (!existing[key]) {
const edits = jsonc.modify(text, [rootKey, key], value, { formattingOptions });
text = jsonc.applyEdits(text, edits);
const edits = jsonc.modify(text, [rootKey, key], value, { formattingOptions });
const newText = jsonc.applyEdits(text, edits);
if (newText !== text) {
text = newText;
modified = true;
}
}
Expand Down
27 changes: 23 additions & 4 deletions spec/unit/ai-config-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { App, Config, FS_TOKEN, FsFileSystem, GoogleAnalytics, IFileSystem, Inqu
import * as coreDetect from "../../packages/core/util/detect-framework";
import { configureMCP, configureSkills } from "../../packages/cli/lib/commands/ai-config";
import * as aiConfig from "../../packages/cli/lib/commands/ai-config";
import { addMcpServers } from "../../packages/core/util/mcp-config";

const IGNITEUI_SERVER_KEY = "igniteui-cli";
const IGNITEUI_THEMING_SERVER_KEY = "igniteui-theming";
Expand Down Expand Up @@ -104,19 +105,37 @@ describe("Unit - ai-config command", () => {
expect((config.servers as any)[IGNITEUI_THEMING_SERVER_KEY]).toEqual(igniteuiThemingServer);
});

it("is a no-op and logs when both servers are already configured", () => {
it("is a no-op when both servers are already configured", () => {
const mockFs = createMockFs(JSON.stringify({
servers: {
[IGNITEUI_SERVER_KEY]: igniteuiServer,
[IGNITEUI_THEMING_SERVER_KEY]: igniteuiThemingServer
}
}));
}, null, 2));
App.container.set(FS_TOKEN, mockFs);

configureMCP(["vscode"]);
const result = addMcpServers("vscode");

expect(result).toBe(false);
expect(mockFs.writeFile).not.toHaveBeenCalled();
expect(Util.log).toHaveBeenCalledWith(jasmine.stringContaining("already configured"));
});

it("updates config when server configuration is outdated", () => {
const mockFs = createMockFs(JSON.stringify({
servers: {
[IGNITEUI_SERVER_KEY]: { command: "npx", args: ["-y", "igniteui-cli", "old-command"] },
[IGNITEUI_THEMING_SERVER_KEY]: igniteuiThemingServer
}
}, null, 2));
App.container.set(FS_TOKEN, mockFs);

const result = addMcpServers("vscode");

expect(result).toBe(true);
expect(mockFs.writeFile).toHaveBeenCalled();
const config = writtenConfig(mockFs);
expect((config.servers as any)[IGNITEUI_SERVER_KEY]).toEqual(igniteuiServer);
expect((config.servers as any)[IGNITEUI_THEMING_SERVER_KEY]).toEqual(igniteuiThemingServer);
});

it("preserves existing third-party servers when adding igniteui servers", () => {
Expand Down