Skip to content

Commit b9ea116

Browse files
Marina-L-StoyanovakdinevdkalinovInfra
authored
feat(ng-schematics): add ai-config schematic for AI/MCP server config… (#1624)
* feat(ng-schematics): add ai-config schematic for AI/MCP server configuration * fix(ng-schematics): use jsonc-parser for parsing MCP configuration file * feat(ng-schematics): add angular-cli server configuration to MCP settings * feat(ng-schematics): use jsonc-parser for MCP configuration updates to parse json with comments * fix(ng-schematics): ensure .vscode/mcp.json is not modified if both servers are present --------- Co-authored-by: Konstantin Dinev <kdinev@infragistics.com> Co-authored-by: DKalinov <dkalinov@infragistics.com> Co-authored-by: dkalinovInfra <130121354+dkalinovInfra@users.noreply.github.com>
1 parent dbd270d commit b9ea116

3 files changed

Lines changed: 26 additions & 9 deletions

File tree

packages/ng-schematics/src/cli-config/index.ts

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as ts from "typescript";
22
import { DependencyNotFoundException } from "@angular-devkit/core";
33
import { chain, FileDoesNotExistException, Rule, SchematicContext, Tree } from "@angular-devkit/schematics";
4+
import * as jsonc from "jsonc-parser";
45
import { addClassToBody, FormatSettings, NPM_ANGULAR, resolvePackage, TypeScriptAstTransformer, TypeScriptUtils } from "@igniteui/cli-core";
56
import { AngularTypeScriptFileUpdate } from "@igniteui/angular-templates";
67
import { createCliConfig } from "../utils/cli-config";
@@ -120,6 +121,10 @@ function importStyles(): Rule {
120121
export function addAIConfig(): Rule {
121122
return (tree: Tree) => {
122123
const mcpFilePath = "/.vscode/mcp.json";
124+
const angularCliServer = {
125+
command: "npx",
126+
args: ["-y", "@angular/cli", "mcp"]
127+
};
123128
const igniteuiServer = {
124129
command: "npx",
125130
args: ["-y", "igniteui-cli@next", "mcp"]
@@ -130,24 +135,31 @@ export function addAIConfig(): Rule {
130135
};
131136

132137
if (tree.exists(mcpFilePath)) {
133-
const content = JSON.parse(tree.read(mcpFilePath)!.toString());
138+
let text = tree.read(mcpFilePath)!.toString();
139+
const content = jsonc.parse(text);
134140
const servers = content.servers ?? {};
135-
let modified = false;
141+
const formattingOptions: jsonc.FormattingOptions = { tabSize: 2, insertSpaces: true };
142+
const newServers: Record<string, object> = {};
143+
if (!servers["angular-cli"]) {
144+
newServers["angular-cli"] = angularCliServer;
145+
}
136146
if (!servers["igniteui-cli"]) {
137-
servers["igniteui-cli"] = igniteuiServer;
138-
modified = true;
147+
newServers["igniteui-cli"] = igniteuiServer;
139148
}
140149
if (!servers["igniteui-theming"]) {
141-
servers["igniteui-theming"] = igniteuiThemingServer;
142-
modified = true;
150+
newServers["igniteui-theming"] = igniteuiThemingServer;
151+
}
152+
for (const [key, value] of Object.entries(newServers)) {
153+
const edits = jsonc.modify(text, ["servers", key], value, { formattingOptions });
154+
text = jsonc.applyEdits(text, edits);
143155
}
144-
if (modified) {
145-
content.servers = servers;
146-
tree.overwrite(mcpFilePath, JSON.stringify(content, null, 2));
156+
if (Object.keys(newServers).length > 0) {
157+
tree.overwrite(mcpFilePath, text);
147158
}
148159
} else {
149160
const mcpConfig = {
150161
servers: {
162+
"angular-cli": angularCliServer,
151163
"igniteui-cli": igniteuiServer,
152164
"igniteui-theming": igniteuiThemingServer
153165
}

packages/ng-schematics/src/cli-config/index_spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,6 +363,7 @@ export const appConfig: ApplicationConfig = {
363363
it("should not modify .vscode/mcp.json if both servers are already present", async () => {
364364
const existing = {
365365
servers: {
366+
"angular-cli": { command: "npx", args: ["-y", "@angular/cli", "mcp"] },
366367
"igniteui-cli": { command: "npx", args: ["-y", "igniteui-cli@next", "mcp"] },
367368
"igniteui-theming": { command: "npx", args: ["-y", "igniteui-theming", "igniteui-theming-mcp"] }
368369
}

packages/ng-schematics/src/collection.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,10 @@
3333
"description": "Installs the needed dependencies onto the host application.",
3434
"factory": "./cli-config/index"
3535
},
36+
"ai-config": {
37+
"description": "Adds AI/MCP server configuration to .vscode/mcp.json.",
38+
"factory": "./cli-config/index#addAIConfig"
39+
},
3640
"upgrade-packages": {
3741
"description": "Upgrades to the licensed Ignite UI for Angular packages",
3842
"factory": "./upgrade-packages/index",

0 commit comments

Comments
 (0)