diff --git a/CHANGELOG.md b/CHANGELOG.md index e9facb253..9ebc9d61a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -# 15.0.0-rc.0 (2026-04-02) +# 15.0.0 (2026-04-22) ## Highlights @@ -29,6 +29,9 @@ All scaffolded projects now include AI-ready configuration files to enhance the * **Claude skills** for component usage, theming customization, and bundle size optimization ([#1573](https://github.com/IgniteUI/igniteui-cli/pull/1573)) * **`ig ai-config` CLI command** to configure AI tooling in an existing project: writes `.vscode/mcp.json` with `igniteui-cli` and `igniteui-theming` MCP servers and copies AI coding skill files from installed Ignite UI packages to `.claude/skills/` ([#1502](https://github.com/IgniteUI/igniteui-cli/pull/1502)) * **AI skills auto-copy on `ng add`**: the `cli-config` Angular schematic now automatically copies skill files from the installed Ignite UI package's `skills/` directory into `.claude/skills/` as part of the `ng add igniteui-angular` flow ([#1502](https://github.com/IgniteUI/igniteui-cli/pull/1502)) +* **`ng add` ai-config schematic:** a dedicated `ai-config` Angular schematic configures VS Code MCP settings with `angular-cli` and `igniteui-cli` MCP servers when running `ng add igniteui-angular` ([#1624](https://github.com/IgniteUI/igniteui-cli/pull/1624)) +* **Skills fallback from project template:** `ig ai-config` now falls back to copying skill files from the project template when the installed package does not include a `skills/` directory ([#1644](https://github.com/IgniteUI/igniteui-cli/pull/1644)) +* **Web Components skills without framework config:** `ig ai-config` now correctly adds `igniteui-webcomponents` skills even when no framework is configured in the project ([#1634](https://github.com/IgniteUI/igniteui-cli/pull/1634)) --- @@ -54,6 +57,7 @@ A comprehensive modernization of all Angular templates to align with Angular v21 * **React packages update:** updated `igniteui-react-core/charts/gauges` to ~19.5.2 and `igniteui-react[-grids]` to ~19.6.0 ([#1567](https://github.com/IgniteUI/igniteui-cli/pull/1567)) * **Web Components packages update:** updated igniteui-webcomponents packages to latest ([#1566](https://github.com/IgniteUI/igniteui-cli/pull/1566)) * **Web Components grid fixes:** corrected component usage and dependencies in grid templates ([#1562](https://github.com/IgniteUI/igniteui-cli/pull/1562)) +* **Web Components (`igc-ts`) project template modernization:** updated Vite config, switched from `eslint.config.mjs` to `eslint.config.js`, removed the `web-dev-server.config.mjs` dev server, and refreshed package scripts ([#1609](https://github.com/IgniteUI/igniteui-cli/pull/1609)) --- @@ -80,6 +84,9 @@ A comprehensive modernization of all Angular templates to align with Angular v21 ### Bug Fixes & Maintenance +* **execute:** fixed CLI loading to use the correct local version when a version mismatch between global and local installations is detected ([#1640](https://github.com/IgniteUI/igniteui-cli/pull/1640)) +* **templates:** hidden internal base project templates from the available project list in interactive selection ([#1649](https://github.com/IgniteUI/igniteui-cli/pull/1649)) +* **mcp:** removed `@next` tag from MCP server NPM package configurations; all scaffolded projects now reference the stable release ([d56d2d7](https://github.com/IgniteUI/igniteui-cli/commit/d56d2d7f8)) * **eslint:** correct config ignores and resolve lint errors ([#1557](https://github.com/IgniteUI/igniteui-cli/pull/1557)) * **lint:** re-enable `no-console` rule ([3ffa07f](https://github.com/IgniteUI/igniteui-cli/commit/3ffa07ff8812e93dd358b38332f3abc2ea955af2)) * **tslint:** cleanup all leftover references to tslint ([#1558](https://github.com/IgniteUI/igniteui-cli/pull/1558)) @@ -89,7 +96,7 @@ A comprehensive modernization of all Angular templates to align with Angular v21 * **CLI error handling:** added `.fail()` handler to yargs to gracefully handle command validation errors (e.g., missing required subcommands) instead of showing raw stack traces ([#1614](https://github.com/IgniteUI/igniteui-cli/pull/1614)) * **Unknown command detection:** running `ig ` now prints an error message and available commands instead of silently falling through to the step-by-step interactive mode ([#1614](https://github.com/IgniteUI/igniteui-cli/pull/1614)) * **Unhandled promise rejection:** added `.catch()` in the CLI entry point to catch and display unexpected errors cleanly ([#1614](https://github.com/IgniteUI/igniteui-cli/pull/1614)) -* **upgrade-packages:** aligned with React 19.4.0+ licensing migration, now upgrading `igniteui-react-dockmanager` and no longer upgrading `igniteui-react` ([#1641](https://github.com/IgniteUI/igniteui-cli/pull/1641)) +* **upgrade-packages:** aligned with React 19.4.0+ licensing migration, now upgrading `igniteui-react-dockmanager` and no longer upgrading `igniteui-react` ([#1638](https://github.com/IgniteUI/igniteui-cli/pull/1638)) --- diff --git a/packages/cli/templates/react/igr-ts/grid/basic/index.ts b/packages/cli/templates/react/igr-ts/grid/basic/index.ts index 1e415b602..7a3b80396 100644 --- a/packages/cli/templates/react/igr-ts/grid/basic/index.ts +++ b/packages/cli/templates/react/igr-ts/grid/basic/index.ts @@ -14,7 +14,7 @@ class GridTemplate extends IgniteUIForReactTemplate { this.projectType = "igr-ts"; this.components = ["Grid"]; this.controlGroup = "Data Grids"; - this.packages = ["igniteui-react-grids@~19.6.0"]; + this.packages = ["igniteui-react-grids@~19.6.1"]; this.hasExtraConfiguration = false; } diff --git a/packages/cli/templates/react/igr-ts/projects/_base/files/__dot__vscode/mcp.json b/packages/cli/templates/react/igr-ts/projects/_base/files/__dot__vscode/mcp.json index d9c2d293c..f1fe46dd4 100644 --- a/packages/cli/templates/react/igr-ts/projects/_base/files/__dot__vscode/mcp.json +++ b/packages/cli/templates/react/igr-ts/projects/_base/files/__dot__vscode/mcp.json @@ -2,7 +2,7 @@ "servers": { "igniteui-cli": { "command": "npx", - "args": ["-y", "igniteui-cli@next", "mcp"] + "args": ["-y", "igniteui-cli", "mcp"] }, "igniteui-theming": { "command": "npx", diff --git a/packages/cli/templates/react/igr-ts/projects/_base/files/package.json b/packages/cli/templates/react/igr-ts/projects/_base/files/package.json index 10f880b52..e8ffef8be 100644 --- a/packages/cli/templates/react/igr-ts/projects/_base/files/package.json +++ b/packages/cli/templates/react/igr-ts/projects/_base/files/package.json @@ -15,7 +15,7 @@ "@testing-library/react": "^16.3.0", "element-internals-polyfill": "^3.0.2", "functions-have-names": "^1.2.3", - "igniteui-react": "~19.6.0", + "igniteui-react": "~19.6.1", "react": "^19.2.4", "react-app-polyfill": "^3.0.0", "react-dom": "^19.2.4", diff --git a/packages/cli/templates/webcomponents/igc-ts/projects/_base/files/__dot__vscode/mcp.json b/packages/cli/templates/webcomponents/igc-ts/projects/_base/files/__dot__vscode/mcp.json index d9c2d293c..f1fe46dd4 100644 --- a/packages/cli/templates/webcomponents/igc-ts/projects/_base/files/__dot__vscode/mcp.json +++ b/packages/cli/templates/webcomponents/igc-ts/projects/_base/files/__dot__vscode/mcp.json @@ -2,7 +2,7 @@ "servers": { "igniteui-cli": { "command": "npx", - "args": ["-y", "igniteui-cli@next", "mcp"] + "args": ["-y", "igniteui-cli", "mcp"] }, "igniteui-theming": { "command": "npx", diff --git a/packages/cli/templates/webcomponents/igc-ts/projects/_base/files/package.json b/packages/cli/templates/webcomponents/igc-ts/projects/_base/files/package.json index f18c797ce..3e3972040 100644 --- a/packages/cli/templates/webcomponents/igc-ts/projects/_base/files/package.json +++ b/packages/cli/templates/webcomponents/igc-ts/projects/_base/files/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@vaadin/router": "^2.0.0", - "igniteui-webcomponents": "~7.1.0", + "igniteui-webcomponents": "~7.1.2", "lit": "^3.3.2" }, "devDependencies": { diff --git a/packages/cli/templates/webcomponents/igc-ts/projects/_base_with_home/files/package.json b/packages/cli/templates/webcomponents/igc-ts/projects/_base_with_home/files/package.json index 56366ccbc..28c96d6be 100644 --- a/packages/cli/templates/webcomponents/igc-ts/projects/_base_with_home/files/package.json +++ b/packages/cli/templates/webcomponents/igc-ts/projects/_base_with_home/files/package.json @@ -15,7 +15,7 @@ "@vaadin/router": "^2.0.0", "@igniteui/material-icons-extended": "^3.0.2", "igniteui-dockmanager": "^2.1.0", - "igniteui-webcomponents": "~7.1.0", + "igniteui-webcomponents": "~7.1.2", "igniteui-webcomponents-charts": "~7.0.0", "igniteui-webcomponents-core": "~7.0.0", "igniteui-webcomponents-gauges": "~7.0.0", diff --git a/packages/core/util/mcp-config.ts b/packages/core/util/mcp-config.ts index ce500d99c..bf41928df 100644 --- a/packages/core/util/mcp-config.ts +++ b/packages/core/util/mcp-config.ts @@ -10,7 +10,7 @@ export interface McpServerEntry { const IGNITEUI_MCP_SERVERS: Record = { "igniteui-cli": { command: "npx", - args: ["-y", "igniteui-cli@next", "mcp"] + args: ["-y", "igniteui-cli", "mcp"] }, "igniteui-theming": { command: "npx", diff --git a/packages/igniteui-mcp/Specification.md b/packages/igniteui-mcp/Specification.md index 66f4b5b3f..2c6969b8f 100644 --- a/packages/igniteui-mcp/Specification.md +++ b/packages/igniteui-mcp/Specification.md @@ -222,8 +222,8 @@ Build: Compile the TypeScript source into the `dist/` directory. "servers": { "igniteui-cli": { "command": "npx", - "args": ["-y", "igniteui-cli@next", "mcp"] - }, + "args": ["-y", "igniteui-cli", "mcp"] + } } } ``` @@ -235,8 +235,8 @@ Build: Compile the TypeScript source into the `dist/` directory. "mcpServers": { "igniteui-cli": { "command": "npx", - "args": ["-y", "igniteui-cli@next", "mcp"] - }, + "args": ["-y", "igniteui-cli", "mcp"] + } } } ``` @@ -249,8 +249,8 @@ or `%APPDATA%\Claude\claude_desktop_config.json` (Windows) "mcpServers": { "igniteui-cli": { "command": "npx", - "args": ["-y", "igniteui-cli@next", "mcp"] - }, + "args": ["-y", "igniteui-cli", "mcp"] + } } } ``` diff --git a/packages/igniteui-mcp/igniteui-doc-mcp/README.md b/packages/igniteui-mcp/igniteui-doc-mcp/README.md index 8117ff4d8..0a44dbfa2 100644 --- a/packages/igniteui-mcp/igniteui-doc-mcp/README.md +++ b/packages/igniteui-mcp/igniteui-doc-mcp/README.md @@ -53,7 +53,7 @@ Add to `.vscode/mcp.json`: "servers": { "igniteui-cli": { "command": "npx", - "args": ["-y", "igniteui-cli@next", "mcp"] + "args": ["-y", "igniteui-cli", "mcp"] } } } @@ -69,7 +69,7 @@ Add to `claude_desktop_config.json`: "mcpServers": { "igniteui-cli": { "command": "npx", - "args": ["-y", "igniteui-cli@next", "mcp"] + "args": ["-y", "igniteui-cli", "mcp"] } } } @@ -84,7 +84,7 @@ Add to Cursor MCP settings: "mcpServers": { "igniteui-cli": { "command": "npx", - "args": ["-y", "igniteui-cli@next", "mcp"] + "args": ["-y", "igniteui-cli", "mcp"] } } } diff --git a/packages/igx-templates/constants.ts b/packages/igx-templates/constants.ts index 06e977a17..18ec61b39 100644 --- a/packages/igx-templates/constants.ts +++ b/packages/igx-templates/constants.ts @@ -1 +1 @@ -export const IGNITEUI_ANGULAR_PACKAGE = "igniteui-angular@~21.2.0-rc.2"; +export const IGNITEUI_ANGULAR_PACKAGE = "igniteui-angular@~21.2.0"; diff --git a/packages/igx-templates/igx-ts/projects/_base/files/__dot__vscode/mcp.json b/packages/igx-templates/igx-ts/projects/_base/files/__dot__vscode/mcp.json index 4ba84b23f..2a2df3497 100644 --- a/packages/igx-templates/igx-ts/projects/_base/files/__dot__vscode/mcp.json +++ b/packages/igx-templates/igx-ts/projects/_base/files/__dot__vscode/mcp.json @@ -6,7 +6,7 @@ }, "igniteui-cli": { "command": "npx", - "args": ["-y", "igniteui-cli@next", "mcp"] + "args": ["-y", "igniteui-cli", "mcp"] }, "igniteui-theming": { "command": "npx", diff --git a/packages/igx-templates/igx-ts/projects/_base/files/package.json b/packages/igx-templates/igx-ts/projects/_base/files/package.json index 1283fd072..c7be17355 100644 --- a/packages/igx-templates/igx-ts/projects/_base/files/package.json +++ b/packages/igx-templates/igx-ts/projects/_base/files/package.json @@ -20,7 +20,7 @@ "@angular/platform-browser-dynamic": "~21.2.0", "@angular/router": "~21.2.0", "hammerjs": "~2.0.8", - "igniteui-angular": "~21.2.0-rc.2", + "igniteui-angular": "~21.2.0", "minireset.css": "~0.0.7", "rxjs": "~7.8.1", "tslib": "~2.8.1", diff --git a/packages/igx-templates/igx-ts/projects/side-nav-auth/files/package.json b/packages/igx-templates/igx-ts/projects/side-nav-auth/files/package.json index 9b1ab1f42..87cadeff4 100644 --- a/packages/igx-templates/igx-ts/projects/side-nav-auth/files/package.json +++ b/packages/igx-templates/igx-ts/projects/side-nav-auth/files/package.json @@ -21,7 +21,7 @@ "@angular/router": "~21.2.0", "angular-auth-oidc-client": "~21.0.1", "hammerjs": "~2.0.8", - "igniteui-angular": "~21.2.0-rc.2", + "igniteui-angular": "~21.2.0", "minireset.css": "~0.0.7", "rxjs": "~7.8.1", "tslib": "~2.8.1", diff --git a/packages/ng-schematics/src/cli-config/index_spec.ts b/packages/ng-schematics/src/cli-config/index_spec.ts index 562c24a6b..fc42a5bd9 100644 --- a/packages/ng-schematics/src/cli-config/index_spec.ts +++ b/packages/ng-schematics/src/cli-config/index_spec.ts @@ -324,7 +324,7 @@ export const appConfig: ApplicationConfig = { expect(tree.exists(mcpFilePath)).toBeTruthy(); const content = JSON.parse(tree.readContent(mcpFilePath)); - expect(content.servers["igniteui-cli"]).toEqual({ command: "npx", args: ["-y", "igniteui-cli@next", "mcp"] }); + expect(content.servers["igniteui-cli"]).toEqual({ command: "npx", args: ["-y", "igniteui-cli", "mcp"] }); expect(content.servers["igniteui-theming"]).toEqual({ command: "npx", args: ["-y", "igniteui-theming", "igniteui-theming-mcp"] }); }); @@ -339,21 +339,21 @@ export const appConfig: ApplicationConfig = { await runner.runSchematic("cli-config", {}, tree); const content = JSON.parse(tree.readContent(mcpFilePath)); - expect(content.servers["igniteui-cli"]).toEqual({ command: "npx", args: ["-y", "igniteui-cli@next", "mcp"] }); + expect(content.servers["igniteui-cli"]).toEqual({ command: "npx", args: ["-y", "igniteui-cli", "mcp"] }); expect(content.servers["igniteui-theming"]).toEqual({ command: "npx", args: ["-y", "igniteui-theming", "igniteui-theming-mcp"] }); }); it("should add missing igniteui-theming server if only igniteui is already present", async () => { tree.create(mcpFilePath, JSON.stringify({ servers: { - "igniteui-cli": { command: "npx", args: ["-y", "igniteui-cli@next", "mcp"] } + "igniteui-cli": { command: "npx", args: ["-y", "igniteui-cli", "mcp"] } } })); await runner.runSchematic("cli-config", {}, tree); const content = JSON.parse(tree.readContent(mcpFilePath)); - expect(content.servers["igniteui-cli"]).toEqual({ command: "npx", args: ["-y", "igniteui-cli@next", "mcp"] }); + expect(content.servers["igniteui-cli"]).toEqual({ command: "npx", args: ["-y", "igniteui-cli", "mcp"] }); expect(content.servers["igniteui-theming"]).toEqual({ command: "npx", args: ["-y", "igniteui-theming", "igniteui-theming-mcp"] }); }); @@ -367,7 +367,7 @@ export const appConfig: ApplicationConfig = { await runner.runSchematic("cli-config", {}, tree); const content = JSON.parse(tree.readContent(mcpFilePath)); - expect(content.servers["igniteui-cli"]).toEqual({ command: "npx", args: ["-y", "igniteui-cli@next", "mcp"] }); + expect(content.servers["igniteui-cli"]).toEqual({ command: "npx", args: ["-y", "igniteui-cli", "mcp"] }); expect(content.servers["igniteui-theming"]).toEqual({ command: "npx", args: ["-y", "igniteui-theming", "igniteui-theming-mcp"] }); }); @@ -375,7 +375,7 @@ export const appConfig: ApplicationConfig = { const existing = { servers: { "angular-cli": { command: "npx", args: ["-y", "@angular/cli", "mcp"] }, - "igniteui-cli": { command: "npx", args: ["-y", "igniteui-cli@next", "mcp"] }, + "igniteui-cli": { command: "npx", args: ["-y", "igniteui-cli", "mcp"] }, "igniteui-theming": { command: "npx", args: ["-y", "igniteui-theming", "igniteui-theming-mcp"] } } }; diff --git a/packages/ng-schematics/src/ng-new/index_spec.ts b/packages/ng-schematics/src/ng-new/index_spec.ts index 567ba4066..26eb4fb04 100644 --- a/packages/ng-schematics/src/ng-new/index_spec.ts +++ b/packages/ng-schematics/src/ng-new/index_spec.ts @@ -239,7 +239,7 @@ describe("Schematics ng-new", () => { expect(e.exists(mcpFilePath)).toBeTruthy(); const content = JSON.parse(e.readContent(mcpFilePath)); - expect(content.servers["igniteui-cli"]).toEqual({ command: "npx", args: ["-y", "igniteui-cli@next", "mcp"] }); + expect(content.servers["igniteui-cli"]).toEqual({ command: "npx", args: ["-y", "igniteui-cli", "mcp"] }); expect(content.servers["igniteui-theming"]).toEqual({ command: "npx", args: ["-y", "igniteui-theming", "igniteui-theming-mcp"] }); }); }); diff --git a/spec/unit/ai-config-spec.ts b/spec/unit/ai-config-spec.ts index c3bddebfe..71b17e87d 100644 --- a/spec/unit/ai-config-spec.ts +++ b/spec/unit/ai-config-spec.ts @@ -5,7 +5,7 @@ import * as aiConfig from "../../packages/cli/lib/commands/ai-config"; const IGNITEUI_SERVER_KEY = "igniteui-cli"; const IGNITEUI_THEMING_SERVER_KEY = "igniteui-theming"; -const igniteuiServer = { command: "npx", args: ["-y", "igniteui-cli@next", "mcp"] }; +const igniteuiServer = { command: "npx", args: ["-y", "igniteui-cli", "mcp"] }; const igniteuiThemingServer = { command: "npx", args: ["-y", "igniteui-theming", "igniteui-theming-mcp"] }; function createMockFs(existingContent?: string): IFileSystem {