@angular/cli 22.0.0-next.6 → 22.0.0-next.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/ng.js +2 -2
- package/lib/config/schema.json +10 -1
- package/lib/config/workspace-schema.d.ts +4 -0
- package/package.json +17 -17
- package/src/commands/mcp/devserver.js +1 -1
- package/src/commands/mcp/devserver.js.map +1 -1
- package/src/commands/mcp/host.d.ts +8 -12
- package/src/commands/mcp/host.js +96 -11
- package/src/commands/mcp/host.js.map +1 -1
- package/src/commands/mcp/mcp-server.d.ts +0 -20
- package/src/commands/mcp/mcp-server.js +38 -15
- package/src/commands/mcp/mcp-server.js.map +1 -1
- package/src/commands/mcp/resources/ai-tutor.md +5 -7
- package/src/commands/mcp/tools/build.js +2 -1
- package/src/commands/mcp/tools/build.js.map +1 -1
- package/src/commands/mcp/tools/devserver/devserver-start.js +1 -0
- package/src/commands/mcp/tools/devserver/devserver-start.js.map +1 -1
- package/src/commands/mcp/tools/devserver/devserver-stop.js +1 -0
- package/src/commands/mcp/tools/devserver/devserver-stop.js.map +1 -1
- package/src/commands/mcp/tools/devserver/devserver-wait-for-build.js +1 -0
- package/src/commands/mcp/tools/devserver/devserver-wait-for-build.js.map +1 -1
- package/src/commands/mcp/tools/e2e.js +2 -1
- package/src/commands/mcp/tools/e2e.js.map +1 -1
- package/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file.d.ts +2 -1
- package/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file.js +2 -2
- package/src/commands/mcp/tools/onpush-zoneless-migration/migrate-single-file.js.map +1 -1
- package/src/commands/mcp/tools/onpush-zoneless-migration/migrate-test-file.d.ts +3 -2
- package/src/commands/mcp/tools/onpush-zoneless-migration/migrate-test-file.js +8 -8
- package/src/commands/mcp/tools/onpush-zoneless-migration/migrate-test-file.js.map +1 -1
- package/src/commands/mcp/tools/onpush-zoneless-migration/ts-utils.d.ts +2 -1
- package/src/commands/mcp/tools/onpush-zoneless-migration/ts-utils.js +2 -3
- package/src/commands/mcp/tools/onpush-zoneless-migration/ts-utils.js.map +1 -1
- package/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.d.ts +2 -1
- package/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.js +21 -21
- package/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.js.map +1 -1
- package/src/commands/mcp/tools/test.js +1 -1
- package/src/commands/mcp/tools/test.js.map +1 -1
- package/src/commands/mcp/workspace-utils.d.ts +2 -1
- package/src/commands/mcp/workspace-utils.js +43 -1
- package/src/commands/mcp/workspace-utils.js.map +1 -1
- package/src/package-managers/package-manager-descriptor.d.ts +7 -1
- package/src/package-managers/package-manager-descriptor.js +2 -0
- package/src/package-managers/package-manager-descriptor.js.map +1 -1
- package/src/package-managers/package-manager.d.ts +4 -0
- package/src/package-managers/package-manager.js +26 -1
- package/src/package-managers/package-manager.js.map +1 -1
- package/src/package-managers/parsers.d.ts +3 -6
- package/src/package-managers/parsers.js +84 -7
- package/src/package-managers/parsers.js.map +1 -1
- package/src/utilities/node-version.js +1 -1
- package/src/utilities/package-metadata.d.ts +0 -10
- package/src/utilities/package-metadata.js +0 -49
- package/src/utilities/package-metadata.js.map +1 -1
- package/src/utilities/version.js +1 -1
- package/lib/code-examples.db +0 -0
- package/src/commands/mcp/tools/examples/database-discovery.d.ts +0 -34
- package/src/commands/mcp/tools/examples/database-discovery.js +0 -87
- package/src/commands/mcp/tools/examples/database-discovery.js.map +0 -1
- package/src/commands/mcp/tools/examples/database.d.ts +0 -35
- package/src/commands/mcp/tools/examples/database.js +0 -125
- package/src/commands/mcp/tools/examples/database.js.map +0 -1
- package/src/commands/mcp/tools/examples/index.d.ts +0 -26
- package/src/commands/mcp/tools/examples/index.js +0 -149
- package/src/commands/mcp/tools/examples/index.js.map +0 -1
- package/src/commands/mcp/tools/examples/query-escaper.d.ts +0 -20
- package/src/commands/mcp/tools/examples/query-escaper.js +0 -68
- package/src/commands/mcp/tools/examples/query-escaper.js.map +0 -1
- package/src/commands/mcp/tools/examples/runtime-database.d.ts +0 -10
- package/src/commands/mcp/tools/examples/runtime-database.js +0 -192
- package/src/commands/mcp/tools/examples/runtime-database.js.map +0 -1
- package/src/commands/mcp/tools/examples/schemas.d.ts +0 -29
- package/src/commands/mcp/tools/examples/schemas.js +0 -101
- package/src/commands/mcp/tools/examples/schemas.js.map +0 -1
- package/src/commands/mcp/tools/examples/utils.d.ts +0 -14
- package/src/commands/mcp/tools/examples/utils.js +0 -31
- package/src/commands/mcp/tools/examples/utils.js.map +0 -1
- package/src/commands/mcp/tools/modernize.d.ts +0 -43
- package/src/commands/mcp/tools/modernize.js +0 -165
- package/src/commands/mcp/tools/modernize.js.map +0 -1
package/bin/ng.js
CHANGED
|
@@ -45,13 +45,13 @@ if (rawCommandName === '--get-yargs-completions' || rawCommandName === 'completi
|
|
|
45
45
|
// These would then crash with a hard to diagnose error message.
|
|
46
46
|
const [major] = process.versions.node.split('.', 1).map((part) => Number(part));
|
|
47
47
|
|
|
48
|
-
if (major
|
|
48
|
+
if (major === 23 || major === 25) {
|
|
49
49
|
// Allow new odd numbered releases with a warning.
|
|
50
50
|
console.warn(
|
|
51
51
|
'Node.js version ' +
|
|
52
52
|
process.version +
|
|
53
53
|
' detected.\n' +
|
|
54
|
-
'
|
|
54
|
+
'Prior to version 27, odd numbered Node.js versions will not enter LTS status and should not be used for production.' +
|
|
55
55
|
' For more information, please see https://nodejs.org/en/about/previous-releases/.',
|
|
56
56
|
);
|
|
57
57
|
|
package/lib/config/schema.json
CHANGED
|
@@ -1948,6 +1948,11 @@
|
|
|
1948
1948
|
"type": "boolean",
|
|
1949
1949
|
"default": true,
|
|
1950
1950
|
"description": "When true, the 'type' option will be appended to the generated class name. When false, only the file name will include the type."
|
|
1951
|
+
},
|
|
1952
|
+
"injectable": {
|
|
1953
|
+
"type": "boolean",
|
|
1954
|
+
"default": false,
|
|
1955
|
+
"description": "When true, generates an `@Injectable` instead of `@Service`."
|
|
1951
1956
|
}
|
|
1952
1957
|
}
|
|
1953
1958
|
},
|
|
@@ -4322,7 +4327,7 @@
|
|
|
4322
4327
|
"string",
|
|
4323
4328
|
"boolean"
|
|
4324
4329
|
],
|
|
4325
|
-
"description": "Specifies the configuration file for the selected test runner. If a string is provided, it will be used as the path to the configuration file. If `true`, the builder will search for a default configuration file (e.g., `vitest.config.ts` or `karma.conf.js`). If `false`, no external configuration file will be used.\\nFor Vitest, this enables advanced options and the use of custom plugins. Please note that while the file is loaded, the Angular team does not provide direct support for its specific contents or any third-party plugins used within it.",
|
|
4330
|
+
"description": "Specifies the configuration file for the selected test runner. If a string is provided, it will be used as the path to the configuration file. If `true`, the builder will search for a default configuration file (e.g., `vitest-base.config.ts` or `karma.conf.js`). If `false`, no external configuration file will be used.\\nFor Vitest, this enables advanced options and the use of custom plugins. Please note that while the file is loaded, the Angular team does not provide direct support for its specific contents or any third-party plugins used within it.",
|
|
4326
4331
|
"default": false
|
|
4327
4332
|
},
|
|
4328
4333
|
"browsers": {
|
|
@@ -4377,6 +4382,10 @@
|
|
|
4377
4382
|
"type": "boolean",
|
|
4378
4383
|
"description": "Enables the Vitest UI for interactive test execution. This option is only available for the Vitest runner."
|
|
4379
4384
|
},
|
|
4385
|
+
"isolate": {
|
|
4386
|
+
"type": "boolean",
|
|
4387
|
+
"description": "Enables isolation for test execution. When true, Vitest runs tests in separate threads or processes. This option is only available for the Vitest runner. Defaults to false to align with the Karma/Jasmine experience."
|
|
4388
|
+
},
|
|
4380
4389
|
"quiet": {
|
|
4381
4390
|
"type": "boolean",
|
|
4382
4391
|
"description": "Suppresses the verbose build summary and stats table on each rebuild. Defaults to `true` locally and `false` in CI environments."
|
|
@@ -969,6 +969,10 @@ export type AngularServiceOptionsSchema = {
|
|
|
969
969
|
* folder with the service's name will be created to contain the files.
|
|
970
970
|
*/
|
|
971
971
|
flat?: boolean;
|
|
972
|
+
/**
|
|
973
|
+
* When true, generates an `@Injectable` instead of `@Service`.
|
|
974
|
+
*/
|
|
975
|
+
injectable?: boolean;
|
|
972
976
|
/**
|
|
973
977
|
* The name for the new service. This will be used to create the service's class and spec
|
|
974
978
|
* files (e.g., `my-service.service.ts` and `my-service.service.spec.ts`).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@angular/cli",
|
|
3
|
-
"version": "22.0.0-next.
|
|
3
|
+
"version": "22.0.0-next.8",
|
|
4
4
|
"description": "CLI tool for Angular",
|
|
5
5
|
"main": "lib/cli/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -25,15 +25,15 @@
|
|
|
25
25
|
},
|
|
26
26
|
"homepage": "https://github.com/angular/angular-cli",
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@angular-devkit/architect": "0.2200.0-next.
|
|
29
|
-
"@angular-devkit/core": "22.0.0-next.
|
|
30
|
-
"@angular-devkit/schematics": "22.0.0-next.
|
|
28
|
+
"@angular-devkit/architect": "0.2200.0-next.8",
|
|
29
|
+
"@angular-devkit/core": "22.0.0-next.8",
|
|
30
|
+
"@angular-devkit/schematics": "22.0.0-next.8",
|
|
31
31
|
"@inquirer/prompts": "8.4.2",
|
|
32
32
|
"@listr2/prompt-adapter-inquirer": "4.2.3",
|
|
33
33
|
"@modelcontextprotocol/sdk": "1.29.0",
|
|
34
|
-
"@schematics/angular": "22.0.0-next.
|
|
34
|
+
"@schematics/angular": "22.0.0-next.8",
|
|
35
35
|
"@yarnpkg/lockfile": "1.1.0",
|
|
36
|
-
"algoliasearch": "5.
|
|
36
|
+
"algoliasearch": "5.52.1",
|
|
37
37
|
"ini": "6.0.0",
|
|
38
38
|
"jsonc-parser": "3.3.1",
|
|
39
39
|
"listr2": "10.2.1",
|
|
@@ -42,24 +42,24 @@
|
|
|
42
42
|
"parse5-html-rewriting-stream": "8.0.1",
|
|
43
43
|
"semver": "7.7.4",
|
|
44
44
|
"yargs": "18.0.0",
|
|
45
|
-
"zod": "4.3
|
|
45
|
+
"zod": "4.4.3"
|
|
46
46
|
},
|
|
47
47
|
"ng-update": {
|
|
48
48
|
"migrations": "@schematics/angular/migrations/migration-collection.json",
|
|
49
49
|
"packageGroup": {
|
|
50
|
-
"@angular/cli": "22.0.0-next.
|
|
51
|
-
"@angular/build": "22.0.0-next.
|
|
52
|
-
"@angular/ssr": "22.0.0-next.
|
|
53
|
-
"@angular-devkit/architect": "0.2200.0-next.
|
|
54
|
-
"@angular-devkit/build-angular": "22.0.0-next.
|
|
55
|
-
"@angular-devkit/build-webpack": "0.2200.0-next.
|
|
56
|
-
"@angular-devkit/core": "22.0.0-next.
|
|
57
|
-
"@angular-devkit/schematics": "22.0.0-next.
|
|
50
|
+
"@angular/cli": "22.0.0-next.8",
|
|
51
|
+
"@angular/build": "22.0.0-next.8",
|
|
52
|
+
"@angular/ssr": "22.0.0-next.8",
|
|
53
|
+
"@angular-devkit/architect": "0.2200.0-next.8",
|
|
54
|
+
"@angular-devkit/build-angular": "22.0.0-next.8",
|
|
55
|
+
"@angular-devkit/build-webpack": "0.2200.0-next.8",
|
|
56
|
+
"@angular-devkit/core": "22.0.0-next.8",
|
|
57
|
+
"@angular-devkit/schematics": "22.0.0-next.8"
|
|
58
58
|
}
|
|
59
59
|
},
|
|
60
|
-
"packageManager": "pnpm@10.33.
|
|
60
|
+
"packageManager": "pnpm@10.33.2",
|
|
61
61
|
"engines": {
|
|
62
|
-
"node": "^22.22.0 ||
|
|
62
|
+
"node": "^22.22.0 || ^24.13.1 || >=26.0.0",
|
|
63
63
|
"npm": "^6.11.0 || ^7.5.6 || >=8.0.0",
|
|
64
64
|
"yarn": ">= 1.13.0"
|
|
65
65
|
}
|
|
@@ -51,7 +51,7 @@ class LocalDevserver {
|
|
|
51
51
|
args.push(this.project);
|
|
52
52
|
}
|
|
53
53
|
args.push(`--port=${this.port}`);
|
|
54
|
-
this.devserverProcess = this.host.
|
|
54
|
+
this.devserverProcess = this.host.startNgProcess(args, {
|
|
55
55
|
stdio: 'pipe',
|
|
56
56
|
cwd: this.workspacePath,
|
|
57
57
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devserver.js","sourceRoot":"","sources":["devserver.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAoKH,0CAEC;AAED,oEAeC;AAlLD,mEAAmE;AAEnE,MAAM,uBAAuB,GAAG,yCAAyC,CAAC;AAC1E,MAAM,oBAAoB,GAAG,uCAAuC,CAAC;AACrE,MAAM,2BAA2B,GAAG,kDAAkD,CAAC;AACvF,MAAM,8BAA8B,GAAG,mCAAmC,CAAC;AAC3E,MAAM,gCAAgC,GAAG,mCAAmC,CAAC;AAE7E,MAAM,oBAAoB,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAC9D,MAAM,kBAAkB,GAAG;IACzB,uBAAuB;IACvB,oBAAoB;IACpB,2BAA2B;IAC3B,gCAAgC;CACjC,CAAC;AAmDF;;GAEG;AACH,MAAa,cAAc;IAChB,IAAI,CAAO;IACX,IAAI,CAAS;IACb,aAAa,CAAS;IACtB,OAAO,CAAS;IAEjB,gBAAgB,GAAwB,IAAI,CAAC;IAC7C,UAAU,GAAa,EAAE,CAAC;IAC1B,eAAe,GAAG,KAAK,CAAC;IACxB,wBAAwB,GAAY,SAAS,CAAC;IAC9C,iBAAiB,GAAgB,SAAS,CAAC;IAEnD,YAAY,EACV,IAAI,EACJ,IAAI,EACJ,aAAa,EACb,OAAO,GAMR;QACC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"devserver.js","sourceRoot":"","sources":["devserver.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAoKH,0CAEC;AAED,oEAeC;AAlLD,mEAAmE;AAEnE,MAAM,uBAAuB,GAAG,yCAAyC,CAAC;AAC1E,MAAM,oBAAoB,GAAG,uCAAuC,CAAC;AACrE,MAAM,2BAA2B,GAAG,kDAAkD,CAAC;AACvF,MAAM,8BAA8B,GAAG,mCAAmC,CAAC;AAC3E,MAAM,gCAAgC,GAAG,mCAAmC,CAAC;AAE7E,MAAM,oBAAoB,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAC9D,MAAM,kBAAkB,GAAG;IACzB,uBAAuB;IACvB,oBAAoB;IACpB,2BAA2B;IAC3B,gCAAgC;CACjC,CAAC;AAmDF;;GAEG;AACH,MAAa,cAAc;IAChB,IAAI,CAAO;IACX,IAAI,CAAS;IACb,aAAa,CAAS;IACtB,OAAO,CAAS;IAEjB,gBAAgB,GAAwB,IAAI,CAAC;IAC7C,UAAU,GAAa,EAAE,CAAC;IAC1B,eAAe,GAAG,KAAK,CAAC;IACxB,wBAAwB,GAAY,SAAS,CAAC;IAC9C,iBAAiB,GAAgB,SAAS,CAAC;IAEnD,YAAY,EACV,IAAI,EACJ,IAAI,EACJ,aAAa,EACb,OAAO,GAMR;QACC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;YACrD,KAAK,EAAE,MAAM;YACb,GAAG,EAAE,IAAI,CAAC,aAAa;SACxB,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAChD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,CAAC;IAEO,MAAM,CAAC,GAAW;QACxB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE1B,IAAI,oBAAoB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACpE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAC7D,CAAC;aAAM,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;YACzE,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,4EAA4E;YAC5E,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC,UAAU,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACxF,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAC/B,CAAC;IAED,aAAa;QACX,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAC9B,CAAC;IAED,kBAAkB;QAChB,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,iBAAiB;YAC9B,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC;SAC3D,CAAC;IACJ,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;CACF;AAzFD,wCAyFC;AAED,SAAgB,eAAe,CAAC,aAAqB,EAAE,WAAmB;IACxE,OAAO,GAAG,aAAa,IAAI,WAAW,EAAE,CAAC;AAC3C,CAAC;AAED,SAAgB,4BAA4B,CAC1C,UAAmE;IAEnE,IAAI,UAAU,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;SACnD,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,MAAM,CAAC,OAAO,wBAAwB,MAAM,CAAC,aAAa,GAAG,CAAC;SAC5F,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,IAAI,KAAK,CACd,qDAAqD,cAAc,IAAI;QACrE,6DAA6D,CAChE,CAAC;AACJ,CAAC"}
|
|
@@ -37,7 +37,7 @@ export interface Host {
|
|
|
37
37
|
* @param encoding The encoding to use.
|
|
38
38
|
* @returns A promise that resolves to the file content.
|
|
39
39
|
*/
|
|
40
|
-
readFile(path: string, encoding:
|
|
40
|
+
readFile(path: string, encoding: BufferEncoding): Promise<string>;
|
|
41
41
|
/**
|
|
42
42
|
* Finds files matching a glob pattern.
|
|
43
43
|
* @param pattern The glob pattern.
|
|
@@ -51,22 +51,14 @@ export interface Host {
|
|
|
51
51
|
parentPath: string;
|
|
52
52
|
isFile(): boolean;
|
|
53
53
|
}>;
|
|
54
|
-
/**
|
|
55
|
-
* Resolves a module request from a given path.
|
|
56
|
-
* @param request The module request to resolve.
|
|
57
|
-
* @param from The path from which to resolve the request.
|
|
58
|
-
* @returns The resolved module path.
|
|
59
|
-
*/
|
|
60
|
-
resolveModule(request: string, from: string): string;
|
|
61
54
|
/**
|
|
62
55
|
* Spawns a child process and returns a promise that resolves with the process's
|
|
63
56
|
* output or rejects with a structured error.
|
|
64
|
-
* @param command The command to run.
|
|
65
57
|
* @param args The arguments to pass to the command.
|
|
66
58
|
* @param options Options for the child process.
|
|
67
59
|
* @returns A promise that resolves with the standard output and standard error of the command.
|
|
68
60
|
*/
|
|
69
|
-
|
|
61
|
+
executeNgCommand(args: readonly string[], options?: {
|
|
70
62
|
timeout?: number;
|
|
71
63
|
stdio?: 'pipe' | 'ignore';
|
|
72
64
|
cwd?: string;
|
|
@@ -76,12 +68,11 @@ export interface Host {
|
|
|
76
68
|
}>;
|
|
77
69
|
/**
|
|
78
70
|
* Spawns a long-running child process and returns the `ChildProcess` object.
|
|
79
|
-
* @param command The command to run.
|
|
80
71
|
* @param args The arguments to pass to the command.
|
|
81
72
|
* @param options Options for the child process.
|
|
82
73
|
* @returns The spawned `ChildProcess` instance.
|
|
83
74
|
*/
|
|
84
|
-
|
|
75
|
+
startNgProcess(args: readonly string[], options?: {
|
|
85
76
|
stdio?: 'pipe' | 'ignore';
|
|
86
77
|
cwd?: string;
|
|
87
78
|
env?: Record<string, string>;
|
|
@@ -94,8 +85,13 @@ export interface Host {
|
|
|
94
85
|
* Checks whether a TCP port is available on the system.
|
|
95
86
|
*/
|
|
96
87
|
isPortAvailable(port: number): Promise<boolean>;
|
|
88
|
+
/**
|
|
89
|
+
* Sets the allowed roots for this host.
|
|
90
|
+
*/
|
|
91
|
+
setRoots(roots: string[]): void;
|
|
97
92
|
}
|
|
98
93
|
/**
|
|
99
94
|
* A concrete implementation of the `Host` interface that runs on a local workspace.
|
|
100
95
|
*/
|
|
101
96
|
export declare const LocalWorkspaceHost: Host;
|
|
97
|
+
export declare function createRootRestrictedHost(baseHost: Host, initialRoots?: string[]): Host;
|
package/src/commands/mcp/host.js
CHANGED
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.LocalWorkspaceHost = exports.CommandError = void 0;
|
|
11
|
+
exports.createRootRestrictedHost = createRootRestrictedHost;
|
|
11
12
|
/**
|
|
12
13
|
* @fileoverview
|
|
13
14
|
* This file defines an abstraction layer for operating-system or file-system operations, such as
|
|
@@ -16,6 +17,7 @@ exports.LocalWorkspaceHost = exports.CommandError = void 0;
|
|
|
16
17
|
*/
|
|
17
18
|
const fs_1 = require("fs");
|
|
18
19
|
const node_child_process_1 = require("node:child_process");
|
|
20
|
+
const node_fs_1 = require("node:fs");
|
|
19
21
|
const promises_1 = require("node:fs/promises");
|
|
20
22
|
const node_module_1 = require("node:module");
|
|
21
23
|
const node_net_1 = require("node:net");
|
|
@@ -33,9 +35,10 @@ class CommandError extends Error {
|
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
37
|
exports.CommandError = CommandError;
|
|
36
|
-
function
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
function resolveNgCommand(args, cwd) {
|
|
39
|
+
const defaultCommand = { command: 'ng', args };
|
|
40
|
+
if (!cwd) {
|
|
41
|
+
return defaultCommand;
|
|
39
42
|
}
|
|
40
43
|
try {
|
|
41
44
|
const workspaceRequire = (0, node_module_1.createRequire)((0, node_path_1.join)(cwd, 'package.json'));
|
|
@@ -53,7 +56,7 @@ function resolveCommand(command, args, cwd) {
|
|
|
53
56
|
catch {
|
|
54
57
|
// Failed to resolve the CLI binary, fall back to assuming `ng` is on PATH.
|
|
55
58
|
}
|
|
56
|
-
return
|
|
59
|
+
return defaultCommand;
|
|
57
60
|
}
|
|
58
61
|
/**
|
|
59
62
|
* A concrete implementation of the `Host` interface that runs on a local workspace.
|
|
@@ -65,11 +68,8 @@ exports.LocalWorkspaceHost = {
|
|
|
65
68
|
glob: function (pattern, options) {
|
|
66
69
|
return (0, promises_1.glob)(pattern, { ...options, withFileTypes: true });
|
|
67
70
|
},
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
},
|
|
71
|
-
runCommand: async (command, args, options = {}) => {
|
|
72
|
-
const resolved = resolveCommand(command, args, options.cwd);
|
|
71
|
+
executeNgCommand: async (args, options = {}) => {
|
|
72
|
+
const resolved = resolveNgCommand(args, options.cwd);
|
|
73
73
|
const signal = options.timeout ? AbortSignal.timeout(options.timeout) : undefined;
|
|
74
74
|
return new Promise((resolve, reject) => {
|
|
75
75
|
const childProcess = (0, node_child_process_1.spawn)(resolved.command, resolved.args, {
|
|
@@ -105,8 +105,8 @@ exports.LocalWorkspaceHost = {
|
|
|
105
105
|
});
|
|
106
106
|
});
|
|
107
107
|
},
|
|
108
|
-
|
|
109
|
-
const resolved =
|
|
108
|
+
startNgProcess(args, options = {}) {
|
|
109
|
+
const resolved = resolveNgCommand(args, options.cwd);
|
|
110
110
|
return (0, node_child_process_1.spawn)(resolved.command, resolved.args, {
|
|
111
111
|
shell: false,
|
|
112
112
|
stdio: options.stdio ?? 'pipe',
|
|
@@ -150,5 +150,90 @@ exports.LocalWorkspaceHost = {
|
|
|
150
150
|
});
|
|
151
151
|
});
|
|
152
152
|
},
|
|
153
|
+
setRoots(roots) {
|
|
154
|
+
// LocalWorkspaceHost does not enforce roots, so this is a no-op.
|
|
155
|
+
},
|
|
153
156
|
};
|
|
157
|
+
function createRootRestrictedHost(baseHost, initialRoots = [process.cwd()]) {
|
|
158
|
+
let roots = initialRoots;
|
|
159
|
+
function checkPath(path) {
|
|
160
|
+
const resolvedPath = (0, node_path_1.resolve)(path);
|
|
161
|
+
let realPath;
|
|
162
|
+
try {
|
|
163
|
+
realPath = (0, node_fs_1.realpathSync)(resolvedPath);
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
if (e.code === 'ENOENT') {
|
|
167
|
+
// Path does not exist. Find the first existing ancestor.
|
|
168
|
+
let current = resolvedPath;
|
|
169
|
+
while (current) {
|
|
170
|
+
try {
|
|
171
|
+
realPath = (0, node_fs_1.realpathSync)(current);
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
if (err.code !== 'ENOENT') {
|
|
176
|
+
throw err;
|
|
177
|
+
}
|
|
178
|
+
const parent = (0, node_path_1.dirname)(current);
|
|
179
|
+
if (parent === current) {
|
|
180
|
+
// Reached filesystem root
|
|
181
|
+
throw err;
|
|
182
|
+
}
|
|
183
|
+
current = parent;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
throw e;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const isAllowed = roots.some((root) => {
|
|
192
|
+
const rel = (0, node_path_1.relative)(root, realPath);
|
|
193
|
+
return !rel.startsWith('..') && !(0, node_path_1.isAbsolute)(rel);
|
|
194
|
+
});
|
|
195
|
+
if (!isAllowed) {
|
|
196
|
+
throw new Error(`Access denied: path '${path}' is outside allowed roots.`);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
return {
|
|
200
|
+
...baseHost,
|
|
201
|
+
setRoots(newRoots) {
|
|
202
|
+
roots = newRoots;
|
|
203
|
+
},
|
|
204
|
+
stat(path) {
|
|
205
|
+
checkPath(path);
|
|
206
|
+
return baseHost.stat(path);
|
|
207
|
+
},
|
|
208
|
+
existsSync(path) {
|
|
209
|
+
checkPath(path);
|
|
210
|
+
return baseHost.existsSync(path);
|
|
211
|
+
},
|
|
212
|
+
readFile(path, encoding) {
|
|
213
|
+
checkPath(path);
|
|
214
|
+
return baseHost.readFile(path, encoding);
|
|
215
|
+
},
|
|
216
|
+
glob(pattern, options) {
|
|
217
|
+
if (pattern.includes('..')) {
|
|
218
|
+
throw new Error(`Access denied: glob pattern '${pattern}' contains path traversal sequences.`);
|
|
219
|
+
}
|
|
220
|
+
checkPath(options.cwd);
|
|
221
|
+
const firstWildcardIndex = pattern.search(/[*?[{]/);
|
|
222
|
+
const basePath = firstWildcardIndex >= 0 ? pattern.substring(0, firstWildcardIndex) : pattern;
|
|
223
|
+
const targetDir = (0, node_path_1.resolve)(options.cwd, basePath);
|
|
224
|
+
checkPath(targetDir);
|
|
225
|
+
return baseHost.glob(pattern, options);
|
|
226
|
+
},
|
|
227
|
+
executeNgCommand(args, options = {}) {
|
|
228
|
+
const effectiveCwd = options?.cwd ?? process.cwd();
|
|
229
|
+
checkPath(effectiveCwd);
|
|
230
|
+
return baseHost.executeNgCommand(args, options);
|
|
231
|
+
},
|
|
232
|
+
startNgProcess(args, options = {}) {
|
|
233
|
+
const effectiveCwd = options?.cwd ?? process.cwd();
|
|
234
|
+
checkPath(effectiveCwd);
|
|
235
|
+
return baseHost.startNgProcess(args, options);
|
|
236
|
+
},
|
|
237
|
+
};
|
|
238
|
+
}
|
|
154
239
|
//# sourceMappingURL=host.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host.js","sourceRoot":"","sources":["host.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["host.ts"],"names":[],"mappings":"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"}
|
|
@@ -32,16 +32,6 @@ export declare const EXPERIMENTAL_TOOLS: readonly [import("./tools/tool-registry
|
|
|
32
32
|
failure: "failure";
|
|
33
33
|
}>;
|
|
34
34
|
logs: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
35
|
-
}>, import("./tools/tool-registry").McpToolDeclaration<{
|
|
36
|
-
transformations: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodEnum<{
|
|
37
|
-
[x: string]: string;
|
|
38
|
-
}>>>;
|
|
39
|
-
path: import("zod").ZodOptional<import("zod").ZodString>;
|
|
40
|
-
workspace: import("zod").ZodOptional<import("zod").ZodString>;
|
|
41
|
-
project: import("zod").ZodOptional<import("zod").ZodString>;
|
|
42
|
-
}, {
|
|
43
|
-
instructions: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
44
|
-
logs: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
45
35
|
}>, import("./tools/tool-registry").McpToolDeclaration<{
|
|
46
36
|
filter: import("zod").ZodOptional<import("zod").ZodString>;
|
|
47
37
|
workspace: import("zod").ZodOptional<import("zod").ZodString>;
|
|
@@ -104,16 +94,6 @@ export declare const EXPERIMENTAL_TOOL_GROUPS: {
|
|
|
104
94
|
failure: "failure";
|
|
105
95
|
}>;
|
|
106
96
|
logs: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
107
|
-
}>, import("./tools/tool-registry").McpToolDeclaration<{
|
|
108
|
-
transformations: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodEnum<{
|
|
109
|
-
[x: string]: string;
|
|
110
|
-
}>>>;
|
|
111
|
-
path: import("zod").ZodOptional<import("zod").ZodString>;
|
|
112
|
-
workspace: import("zod").ZodOptional<import("zod").ZodString>;
|
|
113
|
-
project: import("zod").ZodOptional<import("zod").ZodString>;
|
|
114
|
-
}, {
|
|
115
|
-
instructions: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
116
|
-
logs: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
117
97
|
}>, import("./tools/tool-registry").McpToolDeclaration<{
|
|
118
98
|
filter: import("zod").ZodOptional<import("zod").ZodString>;
|
|
119
99
|
workspace: import("zod").ZodOptional<import("zod").ZodString>;
|
|
@@ -11,7 +11,9 @@ exports.EXPERIMENTAL_TOOL_GROUPS = exports.EXPERIMENTAL_TOOLS = void 0;
|
|
|
11
11
|
exports.createMcpServer = createMcpServer;
|
|
12
12
|
exports.assembleToolDeclarations = assembleToolDeclarations;
|
|
13
13
|
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
14
|
+
const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
|
|
14
15
|
const node_path_1 = require("node:path");
|
|
16
|
+
const node_url_1 = require("node:url");
|
|
15
17
|
const version_1 = require("../../utilities/version");
|
|
16
18
|
const host_1 = require("./host");
|
|
17
19
|
const instructions_1 = require("./resources/instructions");
|
|
@@ -23,8 +25,6 @@ const devserver_stop_1 = require("./tools/devserver/devserver-stop");
|
|
|
23
25
|
const devserver_wait_for_build_1 = require("./tools/devserver/devserver-wait-for-build");
|
|
24
26
|
const doc_search_1 = require("./tools/doc-search");
|
|
25
27
|
const e2e_1 = require("./tools/e2e");
|
|
26
|
-
const index_1 = require("./tools/examples/index");
|
|
27
|
-
const modernize_1 = require("./tools/modernize");
|
|
28
28
|
const zoneless_migration_1 = require("./tools/onpush-zoneless-migration/zoneless-migration");
|
|
29
29
|
const projects_1 = require("./tools/projects");
|
|
30
30
|
const test_1 = require("./tools/test");
|
|
@@ -41,7 +41,6 @@ const STABLE_TOOLS = [
|
|
|
41
41
|
ai_tutor_1.AI_TUTOR_TOOL,
|
|
42
42
|
best_practices_1.BEST_PRACTICES_TOOL,
|
|
43
43
|
doc_search_1.DOC_SEARCH_TOOL,
|
|
44
|
-
index_1.FIND_EXAMPLE_TOOL,
|
|
45
44
|
projects_1.LIST_PROJECTS_TOOL,
|
|
46
45
|
zoneless_migration_1.ZONELESS_MIGRATION_TOOL,
|
|
47
46
|
];
|
|
@@ -49,13 +48,7 @@ const STABLE_TOOLS = [
|
|
|
49
48
|
* The set of tools that are available but not enabled by default.
|
|
50
49
|
* These tools are considered experimental and may have limitations.
|
|
51
50
|
*/
|
|
52
|
-
exports.EXPERIMENTAL_TOOLS = [
|
|
53
|
-
build_1.BUILD_TOOL,
|
|
54
|
-
e2e_1.E2E_TOOL,
|
|
55
|
-
modernize_1.MODERNIZE_TOOL,
|
|
56
|
-
test_1.TEST_TOOL,
|
|
57
|
-
...DEVSERVER_TOOLS,
|
|
58
|
-
];
|
|
51
|
+
exports.EXPERIMENTAL_TOOLS = [build_1.BUILD_TOOL, e2e_1.E2E_TOOL, test_1.TEST_TOOL, ...DEVSERVER_TOOLS];
|
|
59
52
|
/**
|
|
60
53
|
* Experimental tools that are grouped together under a single name.
|
|
61
54
|
*
|
|
@@ -94,7 +87,12 @@ equivalent actions.
|
|
|
94
87
|
|
|
95
88
|
* **3. Answer User Questions:**
|
|
96
89
|
- For conceptual questions ("what is..."), use \`search_documentation\`.
|
|
97
|
-
|
|
90
|
+
|
|
91
|
+
* **4. Discover Schematics for Modernization:** Since this server does not provide a
|
|
92
|
+
specific tool for listing available schematics, you can use a shell command (if
|
|
93
|
+
available) with \`ng generate <package-name>: --help\` to discover what migrations
|
|
94
|
+
are available in a package (e.g., running \`ng generate @angular/core: --help\`
|
|
95
|
+
will list migrations like \`control-flow\` and \`standalone\`).
|
|
98
96
|
</Core Workflows & Tool Guide>
|
|
99
97
|
|
|
100
98
|
<Key Concepts>
|
|
@@ -110,12 +108,40 @@ equivalent actions.
|
|
|
110
108
|
...options,
|
|
111
109
|
logger,
|
|
112
110
|
});
|
|
111
|
+
const restrictedHost = (0, host_1.createRootRestrictedHost)(host_1.LocalWorkspaceHost);
|
|
112
|
+
server.server.oninitialized = () => {
|
|
113
|
+
void (async () => {
|
|
114
|
+
try {
|
|
115
|
+
const clientCapabilities = server.server.getClientCapabilities();
|
|
116
|
+
if (clientCapabilities?.roots) {
|
|
117
|
+
const { roots } = await server.server.listRoots();
|
|
118
|
+
const searchRoots = roots?.map((r) => (0, node_path_1.normalize)((0, node_url_1.fileURLToPath)(r.uri))) ?? [];
|
|
119
|
+
restrictedHost.setRoots(searchRoots);
|
|
120
|
+
if (clientCapabilities.roots.listChanged) {
|
|
121
|
+
server.server.setNotificationHandler(types_js_1.RootsListChangedNotificationSchema, async () => {
|
|
122
|
+
try {
|
|
123
|
+
const { roots: updatedRoots } = await server.server.listRoots();
|
|
124
|
+
const updatedSearchRoots = updatedRoots?.map((r) => (0, node_path_1.normalize)((0, node_url_1.fileURLToPath)(r.uri))) ?? [];
|
|
125
|
+
restrictedHost.setRoots(updatedSearchRoots);
|
|
126
|
+
}
|
|
127
|
+
catch (e) {
|
|
128
|
+
logger.warn(`Failed to update roots on notification: ${e instanceof Error ? e.message : e}`);
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
catch (e) {
|
|
135
|
+
logger.warn(`Failed to initialize roots on connection: ${e instanceof Error ? e.message : e}`);
|
|
136
|
+
}
|
|
137
|
+
})();
|
|
138
|
+
};
|
|
113
139
|
await (0, tool_registry_1.registerTools)(server, {
|
|
114
140
|
workspace: options.workspace,
|
|
115
141
|
logger,
|
|
116
142
|
exampleDatabasePath: (0, node_path_1.join)(__dirname, '../../../lib/code-examples.db'),
|
|
117
143
|
devservers: new Map(),
|
|
118
|
-
host:
|
|
144
|
+
host: restrictedHost,
|
|
119
145
|
}, toolDeclarations);
|
|
120
146
|
return server;
|
|
121
147
|
}
|
|
@@ -128,9 +154,6 @@ function assembleToolDeclarations(stableDeclarations, experimentalDeclarations,
|
|
|
128
154
|
toolDeclarations = toolDeclarations.filter((tool) => tool.isLocalOnly);
|
|
129
155
|
}
|
|
130
156
|
const enabledExperimentalTools = new Set(options.experimentalTools);
|
|
131
|
-
if (process.env['NG_MCP_CODE_EXAMPLES'] === '1') {
|
|
132
|
-
enabledExperimentalTools.add('find_examples');
|
|
133
|
-
}
|
|
134
157
|
for (const [toolGroupName, toolGroup] of Object.entries(exports.EXPERIMENTAL_TOOL_GROUPS)) {
|
|
135
158
|
if (enabledExperimentalTools.delete(toolGroupName)) {
|
|
136
159
|
for (const tool of toolGroup) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["mcp-server.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["mcp-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -361,7 +361,6 @@ When teaching or generating code for Phase 5 (Signal Forms), you **must** strict
|
|
|
361
361
|
|
|
362
362
|
@Component({
|
|
363
363
|
selector: 'app-example',
|
|
364
|
-
standalone: true,
|
|
365
364
|
imports: [Field],
|
|
366
365
|
template: `
|
|
367
366
|
<form (submit)="save($event)">
|
|
@@ -661,7 +660,7 @@ touch src/app/mock-recipes.ts
|
|
|
661
660
|
id: 1,
|
|
662
661
|
name: 'Spaghetti Carbonara',
|
|
663
662
|
description: 'A classic Italian pasta dish.',
|
|
664
|
-
imgUrl: '
|
|
663
|
+
imgUrl: 'INSERT_IMAGE_URL',
|
|
665
664
|
ingredients: [
|
|
666
665
|
{ name: 'Spaghetti', quantity: 200, unit: 'g' },
|
|
667
666
|
{ name: 'Guanciale', quantity: 100, unit: 'g' },
|
|
@@ -674,7 +673,7 @@ touch src/app/mock-recipes.ts
|
|
|
674
673
|
id: 2,
|
|
675
674
|
name: 'Caprese Salad',
|
|
676
675
|
description: 'A simple and refreshing Italian salad.',
|
|
677
|
-
imgUrl: '
|
|
676
|
+
imgUrl: 'INSERT_IMAGE_URL',
|
|
678
677
|
ingredients: [
|
|
679
678
|
{ name: 'Tomatoes', quantity: 4, unit: 'each' },
|
|
680
679
|
{ name: 'Fresh Mozzarella', quantity: 200, unit: 'g' },
|
|
@@ -718,7 +717,7 @@ touch src/app/mock-recipes.ts
|
|
|
718
717
|
id: 1,
|
|
719
718
|
name: 'Spaghetti Carbonara',
|
|
720
719
|
description: 'A classic Italian pasta dish.',
|
|
721
|
-
imgUrl: '
|
|
720
|
+
imgUrl: 'INSERT_IMAGE_URL',
|
|
722
721
|
isFavorite: true,
|
|
723
722
|
ingredients: [
|
|
724
723
|
{ name: 'Spaghetti', quantity: 200, unit: 'g' },
|
|
@@ -732,7 +731,7 @@ touch src/app/mock-recipes.ts
|
|
|
732
731
|
id: 2,
|
|
733
732
|
name: 'Caprese Salad',
|
|
734
733
|
description: 'A simple and refreshing Italian salad.',
|
|
735
|
-
imgUrl: '
|
|
734
|
+
imgUrl: 'INSERT_IMAGE_URL',
|
|
736
735
|
isFavorite: false,
|
|
737
736
|
ingredients: [
|
|
738
737
|
{ name: 'Tomatoes', quantity: 4, unit: 'each' },
|
|
@@ -787,8 +786,7 @@ touch src/app/mock-recipes.ts
|
|
|
787
786
|
name: 'Spaghetti Carbonara',
|
|
788
787
|
description: 'A classic Italian pasta dish.',
|
|
789
788
|
authorEmail: 'mario@italy.com', // Add this
|
|
790
|
-
imgUrl:
|
|
791
|
-
'[https://via.placeholder.com/300x200.png?text=Spaghetti+Carbonara](https://via.placeholder.com/300x200.png?text=Spaghetti+Carbonara)',
|
|
789
|
+
imgUrl: 'INSERT_IMAGE_URL',
|
|
792
790
|
isFavorite: true,
|
|
793
791
|
ingredients: [
|
|
794
792
|
{ name: 'Spaghetti', quantity: 200, unit: 'g' },
|
|
@@ -31,6 +31,7 @@ const buildToolOutputSchema = zod_1.z.object({
|
|
|
31
31
|
async function runBuild(input, context) {
|
|
32
32
|
const { workspacePath, projectName } = await (0, workspace_utils_1.resolveWorkspaceAndProject)({
|
|
33
33
|
host: context.host,
|
|
34
|
+
server: context.server,
|
|
34
35
|
workspacePathInput: input.workspace,
|
|
35
36
|
projectNameInput: input.project,
|
|
36
37
|
mcpWorkspace: context.workspace,
|
|
@@ -41,7 +42,7 @@ async function runBuild(input, context) {
|
|
|
41
42
|
let logs;
|
|
42
43
|
let outputPath;
|
|
43
44
|
try {
|
|
44
|
-
logs = (await context.host.
|
|
45
|
+
logs = (await context.host.executeNgCommand(args, { cwd: workspacePath })).logs;
|
|
45
46
|
}
|
|
46
47
|
catch (e) {
|
|
47
48
|
status = 'failure';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["build.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AA+BH,
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["build.ts"],"names":[],"mappings":"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"}
|