@angular/cli 21.1.1 → 21.2.0-next.0
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/lib/code-examples.db +0 -0
- package/package.json +17 -18
- package/src/analytics/analytics-collector.d.ts +6 -3
- package/src/analytics/analytics-collector.js +7 -7
- package/src/analytics/analytics-collector.js.map +1 -1
- package/src/analytics/analytics.d.ts +1 -1
- package/src/command-builder/command-module.d.ts +4 -33
- package/src/command-builder/command-module.js +11 -48
- package/src/command-builder/command-module.js.map +1 -1
- package/src/command-builder/command-runner.js +59 -4
- package/src/command-builder/command-runner.js.map +1 -1
- package/src/command-builder/definitions.d.ts +41 -0
- package/src/command-builder/definitions.js +20 -0
- package/src/command-builder/definitions.js.map +1 -0
- package/src/command-builder/schematics-command-module.js +13 -1
- package/src/command-builder/schematics-command-module.js.map +1 -1
- package/src/command-builder/utilities/prettier.d.ts +13 -0
- package/src/command-builder/utilities/prettier.js +71 -0
- package/src/command-builder/utilities/prettier.js.map +1 -0
- package/src/commands/add/cli.d.ts +0 -1
- package/src/commands/add/cli.js +21 -34
- package/src/commands/add/cli.js.map +1 -1
- package/src/commands/mcp/devserver.d.ts +18 -3
- package/src/commands/mcp/devserver.js +23 -3
- package/src/commands/mcp/devserver.js.map +1 -1
- package/src/commands/mcp/mcp-server.d.ts +28 -12
- package/src/commands/mcp/resources/best-practices.md +0 -1
- package/src/commands/mcp/shared-options.d.ts +12 -0
- package/src/commands/mcp/shared-options.js +22 -0
- package/src/commands/mcp/shared-options.js.map +1 -0
- package/src/commands/mcp/tools/build.d.ts +4 -4
- package/src/commands/mcp/tools/build.js +13 -12
- package/src/commands/mcp/tools/build.js.map +1 -1
- package/src/commands/mcp/tools/devserver/devserver-start.d.ts +1 -8
- package/src/commands/mcp/tools/devserver/devserver-start.js +18 -13
- package/src/commands/mcp/tools/devserver/devserver-start.js.map +1 -1
- package/src/commands/mcp/tools/devserver/devserver-stop.d.ts +3 -20
- package/src/commands/mcp/tools/devserver/devserver-stop.js +18 -33
- package/src/commands/mcp/tools/devserver/devserver-stop.js.map +1 -1
- package/src/commands/mcp/tools/devserver/devserver-wait-for-build.d.ts +3 -12
- package/src/commands/mcp/tools/devserver/devserver-wait-for-build.js +22 -37
- package/src/commands/mcp/tools/devserver/devserver-wait-for-build.js.map +1 -1
- package/src/commands/mcp/tools/e2e.d.ts +1 -0
- package/src/commands/mcp/tools/e2e.js +14 -14
- package/src/commands/mcp/tools/e2e.js.map +1 -1
- package/src/commands/mcp/tools/modernize.d.ts +5 -4
- package/src/commands/mcp/tools/modernize.js +29 -38
- package/src/commands/mcp/tools/modernize.js.map +1 -1
- package/src/commands/mcp/tools/onpush-zoneless-migration/migrate-test-file.js +2 -2
- package/src/commands/mcp/tools/onpush-zoneless-migration/migrate-test-file.js.map +1 -1
- package/src/commands/mcp/tools/test.d.ts +4 -4
- package/src/commands/mcp/tools/test.js +13 -12
- package/src/commands/mcp/tools/test.js.map +1 -1
- package/src/commands/mcp/utils.d.ts +0 -31
- package/src/commands/mcp/utils.js +4 -61
- package/src/commands/mcp/utils.js.map +1 -1
- package/src/commands/mcp/workspace-utils.d.ts +53 -0
- package/src/commands/mcp/workspace-utils.js +138 -0
- package/src/commands/mcp/workspace-utils.js.map +1 -0
- package/src/commands/update/cli.js +46 -30
- package/src/commands/update/cli.js.map +1 -1
- package/src/commands/update/schematic/index.js.map +1 -1
- package/src/commands/update/utilities/cli-version.d.ts +1 -1
- package/src/commands/version/cli.js +1 -1
- package/src/commands/version/cli.js.map +1 -1
- package/src/commands/version/version-info.d.ts +2 -7
- package/src/commands/version/version-info.js +2 -2
- package/src/commands/version/version-info.js.map +1 -1
- package/src/package-managers/factory.d.ts +5 -1
- package/src/package-managers/factory.js +39 -31
- package/src/package-managers/factory.js.map +1 -1
- package/src/package-managers/host.d.ts +9 -0
- package/src/package-managers/host.js +2 -1
- package/src/package-managers/host.js.map +1 -1
- package/src/package-managers/package-manager-descriptor.d.ts +2 -2
- package/src/package-managers/package-manager-descriptor.js +3 -3
- package/src/package-managers/package-manager-descriptor.js.map +1 -1
- package/src/package-managers/package-manager.d.ts +8 -3
- package/src/package-managers/package-manager.js +31 -3
- package/src/package-managers/package-manager.js.map +1 -1
- package/src/package-managers/package-metadata.d.ts +4 -0
- package/src/package-managers/parsers.d.ts +32 -19
- package/src/package-managers/parsers.js +94 -61
- package/src/package-managers/parsers.js.map +1 -1
- package/src/utilities/config.js +6 -6
- package/src/utilities/config.js.map +1 -1
- package/src/utilities/find-up.d.ts +14 -1
- package/src/utilities/find-up.js +47 -43
- package/src/utilities/find-up.js.map +1 -1
- package/src/utilities/package-metadata.d.ts +3 -0
- package/src/utilities/package-metadata.js.map +1 -1
- package/src/utilities/project.js +1 -1
- package/src/utilities/project.js.map +1 -1
- package/src/utilities/version.js +1 -1
- package/src/utilities/package-manager.d.ts +0 -49
- package/src/utilities/package-manager.js +0 -327
- package/src/utilities/package-manager.js.map +0 -1
- package/src/utilities/package-tree.d.ts +0 -32
- package/src/utilities/package-tree.js +0 -95
- package/src/utilities/package-tree.js.map +0 -1
|
@@ -9,9 +9,10 @@
|
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.MODERNIZE_TOOL = void 0;
|
|
11
11
|
exports.runModernization = runModernization;
|
|
12
|
-
const path_1 = require("path");
|
|
13
12
|
const zod_1 = require("zod");
|
|
13
|
+
const shared_options_1 = require("../shared-options");
|
|
14
14
|
const utils_1 = require("../utils");
|
|
15
|
+
const workspace_utils_1 = require("../workspace-utils");
|
|
15
16
|
const tool_registry_1 = require("./tool-registry");
|
|
16
17
|
const TRANSFORMATIONS = [
|
|
17
18
|
{
|
|
@@ -58,14 +59,15 @@ const TRANSFORMATIONS = [
|
|
|
58
59
|
},
|
|
59
60
|
];
|
|
60
61
|
const modernizeInputSchema = zod_1.z.object({
|
|
61
|
-
|
|
62
|
-
.array(zod_1.z.string())
|
|
63
|
-
.optional()
|
|
64
|
-
.describe('A list of paths to directories with files to modernize.'),
|
|
62
|
+
...shared_options_1.workspaceAndProjectOptions,
|
|
65
63
|
transformations: zod_1.z
|
|
66
64
|
.array(zod_1.z.enum(TRANSFORMATIONS.map((t) => t.name)))
|
|
67
65
|
.optional()
|
|
68
66
|
.describe('A list of specific transformations to apply.'),
|
|
67
|
+
path: zod_1.z
|
|
68
|
+
.string()
|
|
69
|
+
.optional()
|
|
70
|
+
.describe('The path to the file or directory to modernize, relative to the workspace root.'),
|
|
69
71
|
});
|
|
70
72
|
const modernizeOutputSchema = zod_1.z.object({
|
|
71
73
|
instructions: zod_1.z
|
|
@@ -74,9 +76,8 @@ const modernizeOutputSchema = zod_1.z.object({
|
|
|
74
76
|
.describe('Migration summary, as well as any instructions that need to be performed to complete the migrations.'),
|
|
75
77
|
logs: zod_1.z.array(zod_1.z.string()).optional().describe('All logs from all executed commands.'),
|
|
76
78
|
});
|
|
77
|
-
async function runModernization(input,
|
|
79
|
+
async function runModernization(input, context) {
|
|
78
80
|
const transformationNames = input.transformations ?? [];
|
|
79
|
-
const directories = input.directories ?? [];
|
|
80
81
|
if (transformationNames.length === 0) {
|
|
81
82
|
return (0, utils_1.createStructuredContentOutput)({
|
|
82
83
|
instructions: [
|
|
@@ -85,22 +86,12 @@ async function runModernization(input, host) {
|
|
|
85
86
|
],
|
|
86
87
|
});
|
|
87
88
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
const firstDir = directories[0];
|
|
97
|
-
const executionDir = (await host.stat(firstDir)).isDirectory() ? firstDir : (0, path_1.dirname)(firstDir);
|
|
98
|
-
const angularProjectRoot = (0, utils_1.findAngularJsonDir)(executionDir, host);
|
|
99
|
-
if (!angularProjectRoot) {
|
|
100
|
-
return (0, utils_1.createStructuredContentOutput)({
|
|
101
|
-
instructions: ['Could not find an angular.json file in the current or parent directories.'],
|
|
102
|
-
});
|
|
103
|
-
}
|
|
89
|
+
const { workspacePath, projectName } = await (0, workspace_utils_1.resolveWorkspaceAndProject)({
|
|
90
|
+
host: context.host,
|
|
91
|
+
workspacePathInput: input.workspace,
|
|
92
|
+
projectNameInput: input.project,
|
|
93
|
+
mcpWorkspace: context.workspace,
|
|
94
|
+
});
|
|
104
95
|
const instructions = [];
|
|
105
96
|
let logs = [];
|
|
106
97
|
const transformationsToRun = TRANSFORMATIONS.filter((t) => transformationNames.includes(t.name));
|
|
@@ -115,20 +106,20 @@ async function runModernization(input, host) {
|
|
|
115
106
|
}
|
|
116
107
|
else {
|
|
117
108
|
// Simple case, run the command.
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
}
|
|
109
|
+
const command = 'ng';
|
|
110
|
+
const args = ['generate', `@angular/core:${transformation.name}`, '--project', projectName];
|
|
111
|
+
if (input.path) {
|
|
112
|
+
args.push('--path', input.path);
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
logs = (await context.host.runCommand(command, args, {
|
|
116
|
+
cwd: workspacePath,
|
|
117
|
+
})).logs;
|
|
118
|
+
instructions.push(`Migration ${transformation.name} completed successfully.`);
|
|
119
|
+
}
|
|
120
|
+
catch (e) {
|
|
121
|
+
logs = (0, utils_1.getCommandErrorLogs)(e);
|
|
122
|
+
instructions.push(`Migration ${transformation.name} failed.`);
|
|
132
123
|
}
|
|
133
124
|
}
|
|
134
125
|
}
|
|
@@ -169,6 +160,6 @@ ${TRANSFORMATIONS.map((t) => ` * ${t.name}: ${t.description}`).join('\n')}
|
|
|
169
160
|
outputSchema: modernizeOutputSchema.shape,
|
|
170
161
|
isLocalOnly: true,
|
|
171
162
|
isReadOnly: false,
|
|
172
|
-
factory: (context) => (input) => runModernization(input, context
|
|
163
|
+
factory: (context) => (input) => runModernization(input, context),
|
|
173
164
|
});
|
|
174
165
|
//# sourceMappingURL=modernize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modernize.js","sourceRoot":"","sources":["modernize.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
1
|
+
{"version":3,"file":"modernize.js","sourceRoot":"","sources":["modernize.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ exports.migrateTestFile = migrateTestFile;
|
|
|
11
11
|
exports.searchForGlobalZoneless = searchForGlobalZoneless;
|
|
12
12
|
const node_fs_1 = require("node:fs");
|
|
13
13
|
const promises_1 = require("node:fs/promises");
|
|
14
|
-
const
|
|
14
|
+
const workspace_utils_1 = require("../../workspace-utils");
|
|
15
15
|
const prompts_1 = require("./prompts");
|
|
16
16
|
const ts_utils_1 = require("./ts-utils");
|
|
17
17
|
async function migrateTestFile(sourceFile) {
|
|
@@ -36,7 +36,7 @@ async function migrateTestFile(sourceFile) {
|
|
|
36
36
|
return (0, prompts_1.createFixResponseForZoneTests)(sourceFile);
|
|
37
37
|
}
|
|
38
38
|
async function searchForGlobalZoneless(startPath) {
|
|
39
|
-
const angularJsonDir = (0,
|
|
39
|
+
const angularJsonDir = (0, workspace_utils_1.findAngularJsonDir)(startPath);
|
|
40
40
|
if (!angularJsonDir) {
|
|
41
41
|
// Cannot determine project root, fallback to original behavior or assume false.
|
|
42
42
|
// For now, let's assume no global setup if angular.json is not found.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-test-file.js","sourceRoot":"","sources":["migrate-test-file.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAWH,0CAyBC;AAED,0DAwBC;AA5DD,qCAAmD;AACnD,+CAAwC;AAGxC,
|
|
1
|
+
{"version":3,"file":"migrate-test-file.js","sourceRoot":"","sources":["migrate-test-file.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAWH,0CAyBC;AAED,0DAwBC;AA5DD,qCAAmD;AACnD,+CAAwC;AAGxC,2DAA2D;AAC3D,uCAAoG;AACpG,yCAA4C;AAGrC,KAAK,UAAU,eAAe,CAAC,UAAsB;IAC1D,MAAM,EAAE,GAAG,MAAM,IAAA,yBAAc,GAAE,CAAC;IAClC,yIAAyI;IACzI,IAAI,+BAA+B,GAAG,MAAM,uBAAuB,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzF,IAAI,CAAC,+BAA+B,EAAE,CAAC;QACrC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,SAAS,KAAK,CAAC,IAAI;YAC7C,IACE,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBACzB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,gCAAgC,EACxE,CAAC;gBACD,+BAA+B,GAAG,IAAI,CAAC;gBAEvC,OAAO;YACT,CAAC;YACD,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,+BAA+B,EAAE,CAAC;QACrC,sEAAsE;QACtE,OAAO,IAAA,kDAAwC,EAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvE,CAAC;IAED,mIAAmI;IACnI,OAAO,IAAA,uCAA6B,EAAC,UAAU,CAAC,CAAC;AACnD,CAAC;AAEM,KAAK,UAAU,uBAAuB,CAAC,SAAiB;IAC7D,MAAM,cAAc,GAAG,IAAA,oCAAkB,EAAC,SAAS,CAAC,CAAC;IACrD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,gFAAgF;QAChF,sEAAsE;QACtE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAA,eAAI,EAAC,GAAG,cAAc,UAAU,CAAC,CAAC;QAChD,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAA,sBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC5C,IACE,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC;gBACvC,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAClD,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
* found in the LICENSE file at https://angular.dev/license
|
|
7
7
|
*/
|
|
8
8
|
import { z } from 'zod';
|
|
9
|
-
import { type
|
|
10
|
-
import { type McpToolDeclaration } from './tool-registry';
|
|
9
|
+
import { type McpToolContext, type McpToolDeclaration } from './tool-registry';
|
|
11
10
|
declare const testToolInputSchema: z.ZodObject<{
|
|
12
|
-
project: z.ZodOptional<z.ZodString>;
|
|
13
11
|
filter: z.ZodOptional<z.ZodString>;
|
|
12
|
+
workspace: z.ZodOptional<z.ZodString>;
|
|
13
|
+
project: z.ZodOptional<z.ZodString>;
|
|
14
14
|
}, z.core.$strip>;
|
|
15
15
|
export type TestToolInput = z.infer<typeof testToolInputSchema>;
|
|
16
16
|
declare const testToolOutputSchema: z.ZodObject<{
|
|
@@ -21,7 +21,7 @@ declare const testToolOutputSchema: z.ZodObject<{
|
|
|
21
21
|
logs: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
22
22
|
}, z.core.$strip>;
|
|
23
23
|
export type TestToolOutput = z.infer<typeof testToolOutputSchema>;
|
|
24
|
-
export declare function runTest(input: TestToolInput,
|
|
24
|
+
export declare function runTest(input: TestToolInput, context: McpToolContext): Promise<{
|
|
25
25
|
content: {
|
|
26
26
|
type: "text";
|
|
27
27
|
text: string;
|
|
@@ -10,27 +10,28 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
10
10
|
exports.TEST_TOOL = void 0;
|
|
11
11
|
exports.runTest = runTest;
|
|
12
12
|
const zod_1 = require("zod");
|
|
13
|
-
const
|
|
13
|
+
const shared_options_1 = require("../shared-options");
|
|
14
14
|
const utils_1 = require("../utils");
|
|
15
|
+
const workspace_utils_1 = require("../workspace-utils");
|
|
15
16
|
const tool_registry_1 = require("./tool-registry");
|
|
16
17
|
const testStatusSchema = zod_1.z.enum(['success', 'failure']);
|
|
17
18
|
const testToolInputSchema = zod_1.z.object({
|
|
18
|
-
|
|
19
|
-
.string()
|
|
20
|
-
.optional()
|
|
21
|
-
.describe('Which project to test in a monorepo context. If not provided, tests all projects.'),
|
|
19
|
+
...shared_options_1.workspaceAndProjectOptions,
|
|
22
20
|
filter: zod_1.z.string().optional().describe('Filter the executed tests by spec name.'),
|
|
23
21
|
});
|
|
24
22
|
const testToolOutputSchema = zod_1.z.object({
|
|
25
23
|
status: testStatusSchema.describe('Test execution status.'),
|
|
26
24
|
logs: zod_1.z.array(zod_1.z.string()).optional().describe('Output logs from `ng test`.'),
|
|
27
25
|
});
|
|
28
|
-
async function runTest(input,
|
|
26
|
+
async function runTest(input, context) {
|
|
27
|
+
const { workspacePath, projectName } = await (0, workspace_utils_1.resolveWorkspaceAndProject)({
|
|
28
|
+
host: context.host,
|
|
29
|
+
workspacePathInput: input.workspace,
|
|
30
|
+
projectNameInput: input.project,
|
|
31
|
+
mcpWorkspace: context.workspace,
|
|
32
|
+
});
|
|
29
33
|
// Build "ng"'s command line.
|
|
30
|
-
const args = ['test'];
|
|
31
|
-
if (input.project) {
|
|
32
|
-
args.push(input.project);
|
|
33
|
-
}
|
|
34
|
+
const args = ['test', projectName];
|
|
34
35
|
// This is ran by the agent so we want a non-watched, headless test.
|
|
35
36
|
args.push('--browsers', 'ChromeHeadless');
|
|
36
37
|
args.push('--watch', 'false');
|
|
@@ -40,7 +41,7 @@ async function runTest(input, host) {
|
|
|
40
41
|
let status = 'success';
|
|
41
42
|
let logs = [];
|
|
42
43
|
try {
|
|
43
|
-
logs = (await host.runCommand('ng', args)).logs;
|
|
44
|
+
logs = (await context.host.runCommand('ng', args, { cwd: workspacePath })).logs;
|
|
44
45
|
}
|
|
45
46
|
catch (e) {
|
|
46
47
|
status = 'failure';
|
|
@@ -73,6 +74,6 @@ Perform a one-off, non-watched unit test execution with ng test.
|
|
|
73
74
|
isLocalOnly: true,
|
|
74
75
|
inputSchema: testToolInputSchema.shape,
|
|
75
76
|
outputSchema: testToolOutputSchema.shape,
|
|
76
|
-
factory: () => (input) => runTest(input,
|
|
77
|
+
factory: (context) => (input) => runTest(input, context),
|
|
77
78
|
});
|
|
78
79
|
//# sourceMappingURL=test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.js","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["test.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAyBH,0BAmCC;AA1DD,6BAAwB;AACxB,sDAA+D;AAC/D,oCAA8E;AAC9E,wDAAgE;AAChE,mDAA4F;AAE5F,MAAM,gBAAgB,GAAG,OAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAGxD,MAAM,mBAAmB,GAAG,OAAC,CAAC,MAAM,CAAC;IACnC,GAAG,2CAA0B;IAC7B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yCAAyC,CAAC;CAClF,CAAC,CAAC;AAIH,MAAM,oBAAoB,GAAG,OAAC,CAAC,MAAM,CAAC;IACpC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,wBAAwB,CAAC;IAC3D,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;CAC7E,CAAC,CAAC;AAII,KAAK,UAAU,OAAO,CAAC,KAAoB,EAAE,OAAuB;IACzE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,4CAA0B,EAAC;QACtE,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,kBAAkB,EAAE,KAAK,CAAC,SAAS;QACnC,gBAAgB,EAAE,KAAK,CAAC,OAAO;QAC/B,YAAY,EAAE,OAAO,CAAC,SAAS;KAChC,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEnC,oEAAoE;IACpE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;IAC1C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAE9B,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,MAAM,GAAe,SAAS,CAAC;IACnC,IAAI,IAAI,GAAa,EAAE,CAAC;IAExB,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAClF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,SAAS,CAAC;QACnB,IAAI,GAAG,IAAA,2BAAmB,EAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,iBAAiB,GAAmB;QACxC,MAAM;QACN,IAAI;KACL,CAAC;IAEF,OAAO,IAAA,qCAA6B,EAAC,iBAAiB,CAAC,CAAC;AAC1D,CAAC;AAEY,QAAA,SAAS,GAGlB,IAAA,2BAAW,EAAC;IACd,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,WAAW;IAClB,WAAW,EAAE;;;;;;;;;;;;;CAad;IACC,UAAU,EAAE,KAAK;IACjB,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,mBAAmB,CAAC,KAAK;IACtC,YAAY,EAAE,oBAAoB,CAAC,KAAK;IACxC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;CACzD,CAAC,CAAC"}
|
|
@@ -5,12 +5,6 @@
|
|
|
5
5
|
* Use of this source code is governed by an MIT-style license that can be
|
|
6
6
|
* found in the LICENSE file at https://angular.dev/license
|
|
7
7
|
*/
|
|
8
|
-
/**
|
|
9
|
-
* @fileoverview
|
|
10
|
-
* Utility functions shared across MCP tools.
|
|
11
|
-
*/
|
|
12
|
-
import { workspaces } from '@angular-devkit/core';
|
|
13
|
-
import { McpToolContext } from './tools/tool-registry';
|
|
14
8
|
/**
|
|
15
9
|
* Returns simple structured content output from an MCP tool.
|
|
16
10
|
*
|
|
@@ -23,31 +17,6 @@ export declare function createStructuredContentOutput<OutputType>(structuredCont
|
|
|
23
17
|
}[];
|
|
24
18
|
structuredContent: OutputType;
|
|
25
19
|
};
|
|
26
|
-
/**
|
|
27
|
-
* Searches for an angular.json file by traversing up the directory tree from a starting directory.
|
|
28
|
-
*
|
|
29
|
-
* @param startDir The directory path to start searching from
|
|
30
|
-
* @param host The workspace host instance used to check file existence. Defaults to LocalWorkspaceHost
|
|
31
|
-
* @returns The absolute path to the directory containing angular.json, or null if not found
|
|
32
|
-
*
|
|
33
|
-
* @remarks
|
|
34
|
-
* This function performs an upward directory traversal starting from `startDir`.
|
|
35
|
-
* It checks each directory for the presence of an angular.json file until either:
|
|
36
|
-
* - The file is found (returns the directory path)
|
|
37
|
-
* - The root of the filesystem is reached (returns null)
|
|
38
|
-
*/
|
|
39
|
-
export declare function findAngularJsonDir(startDir: string, host?: import("./host").Host): string | null;
|
|
40
|
-
/**
|
|
41
|
-
* Searches for a project in the current workspace, by name.
|
|
42
|
-
*/
|
|
43
|
-
export declare function getProject(context: McpToolContext, name: string): workspaces.ProjectDefinition | undefined;
|
|
44
|
-
/**
|
|
45
|
-
* Returns the name of the default project in the current workspace, or undefined if none exists.
|
|
46
|
-
*
|
|
47
|
-
* If no default project is defined but there's only a single project in the workspace, its name will
|
|
48
|
-
* be returned.
|
|
49
|
-
*/
|
|
50
|
-
export declare function getDefaultProjectName(context: McpToolContext): string | undefined;
|
|
51
20
|
/**
|
|
52
21
|
* Get the logs of a failing command.
|
|
53
22
|
*
|
|
@@ -8,11 +8,11 @@
|
|
|
8
8
|
*/
|
|
9
9
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
10
|
exports.createStructuredContentOutput = createStructuredContentOutput;
|
|
11
|
-
exports.findAngularJsonDir = findAngularJsonDir;
|
|
12
|
-
exports.getProject = getProject;
|
|
13
|
-
exports.getDefaultProjectName = getDefaultProjectName;
|
|
14
11
|
exports.getCommandErrorLogs = getCommandErrorLogs;
|
|
15
|
-
|
|
12
|
+
/**
|
|
13
|
+
* @fileoverview
|
|
14
|
+
* Utility functions shared across MCP tools.
|
|
15
|
+
*/
|
|
16
16
|
const host_1 = require("./host");
|
|
17
17
|
/**
|
|
18
18
|
* Returns simple structured content output from an MCP tool.
|
|
@@ -25,63 +25,6 @@ function createStructuredContentOutput(structuredContent) {
|
|
|
25
25
|
structuredContent,
|
|
26
26
|
};
|
|
27
27
|
}
|
|
28
|
-
/**
|
|
29
|
-
* Searches for an angular.json file by traversing up the directory tree from a starting directory.
|
|
30
|
-
*
|
|
31
|
-
* @param startDir The directory path to start searching from
|
|
32
|
-
* @param host The workspace host instance used to check file existence. Defaults to LocalWorkspaceHost
|
|
33
|
-
* @returns The absolute path to the directory containing angular.json, or null if not found
|
|
34
|
-
*
|
|
35
|
-
* @remarks
|
|
36
|
-
* This function performs an upward directory traversal starting from `startDir`.
|
|
37
|
-
* It checks each directory for the presence of an angular.json file until either:
|
|
38
|
-
* - The file is found (returns the directory path)
|
|
39
|
-
* - The root of the filesystem is reached (returns null)
|
|
40
|
-
*/
|
|
41
|
-
function findAngularJsonDir(startDir, host = host_1.LocalWorkspaceHost) {
|
|
42
|
-
let currentDir = startDir;
|
|
43
|
-
while (true) {
|
|
44
|
-
if (host.existsSync((0, node_path_1.join)(currentDir, 'angular.json'))) {
|
|
45
|
-
return currentDir;
|
|
46
|
-
}
|
|
47
|
-
const parentDir = (0, node_path_1.dirname)(currentDir);
|
|
48
|
-
if (parentDir === currentDir) {
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
currentDir = parentDir;
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Searches for a project in the current workspace, by name.
|
|
56
|
-
*/
|
|
57
|
-
function getProject(context, name) {
|
|
58
|
-
const projects = context.workspace?.projects;
|
|
59
|
-
if (!projects) {
|
|
60
|
-
return undefined;
|
|
61
|
-
}
|
|
62
|
-
return projects.get(name);
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Returns the name of the default project in the current workspace, or undefined if none exists.
|
|
66
|
-
*
|
|
67
|
-
* If no default project is defined but there's only a single project in the workspace, its name will
|
|
68
|
-
* be returned.
|
|
69
|
-
*/
|
|
70
|
-
function getDefaultProjectName(context) {
|
|
71
|
-
const projects = context.workspace?.projects;
|
|
72
|
-
if (!projects) {
|
|
73
|
-
return undefined;
|
|
74
|
-
}
|
|
75
|
-
const defaultProjectName = context.workspace?.extensions['defaultProject'];
|
|
76
|
-
if (defaultProjectName) {
|
|
77
|
-
return defaultProjectName;
|
|
78
|
-
}
|
|
79
|
-
// No default project defined? This might still be salvageable if only a single project exists.
|
|
80
|
-
if (projects.size === 1) {
|
|
81
|
-
return Array.from(projects.keys())[0];
|
|
82
|
-
}
|
|
83
|
-
return undefined;
|
|
84
|
-
}
|
|
85
28
|
/**
|
|
86
29
|
* Get the logs of a failing command.
|
|
87
30
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["utils.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["utils.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAcH,sEAKC;AAOD,kDAQC;AAhCD;;;GAGG;AAEH,iCAAsC;AAEtC;;;;GAIG;AACH,SAAgB,6BAA6B,CAAa,iBAA6B;IACrF,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;QACtF,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,CAAU;IAC5C,IAAI,CAAC,YAAY,mBAAY,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;SAAM,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;QAC9B,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google LLC All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.dev/license
|
|
7
|
+
*/
|
|
8
|
+
import { workspaces } from '@angular-devkit/core';
|
|
9
|
+
import { AngularWorkspace } from '../../utilities/config';
|
|
10
|
+
import { type Host } from './host';
|
|
11
|
+
import { McpToolContext } from './tools/tool-registry';
|
|
12
|
+
/**
|
|
13
|
+
* Searches for an angular.json file by traversing up the directory tree from a starting directory.
|
|
14
|
+
*
|
|
15
|
+
* @param startDir The directory path to start searching from
|
|
16
|
+
* @param host The workspace host instance used to check file existence. Defaults to LocalWorkspaceHost
|
|
17
|
+
* @returns The absolute path to the directory containing angular.json, or null if not found
|
|
18
|
+
*
|
|
19
|
+
* @remarks
|
|
20
|
+
* This function performs an upward directory traversal starting from `startDir`.
|
|
21
|
+
* It checks each directory for the presence of an angular.json file until either:
|
|
22
|
+
* - The file is found (returns the directory path)
|
|
23
|
+
* - The root of the filesystem is reached (returns null)
|
|
24
|
+
*/
|
|
25
|
+
export declare function findAngularJsonDir(startDir: string, host?: Host): string | null;
|
|
26
|
+
/**
|
|
27
|
+
* Searches for a project in the current workspace, by name.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getProject(context: McpToolContext, name: string): workspaces.ProjectDefinition | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Returns the name of the default project in the current workspace, or undefined if none exists.
|
|
32
|
+
*
|
|
33
|
+
* If no default project is defined but there's only a single project in the workspace, its name will
|
|
34
|
+
* be returned.
|
|
35
|
+
*/
|
|
36
|
+
export declare function getDefaultProjectName(workspace: AngularWorkspace | undefined): string | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Resolves workspace and project for tools to operate on.
|
|
39
|
+
*
|
|
40
|
+
* If `workspacePathInput` is absent, uses the MCP's configured workspace. If none is configured, use the
|
|
41
|
+
* current directory as the workspace.
|
|
42
|
+
* If `projectNameInput` is absent, uses the default project in the workspace.
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveWorkspaceAndProject({ host, workspacePathInput, projectNameInput, mcpWorkspace, }: {
|
|
45
|
+
host: Host;
|
|
46
|
+
workspacePathInput?: string;
|
|
47
|
+
projectNameInput?: string;
|
|
48
|
+
mcpWorkspace?: AngularWorkspace;
|
|
49
|
+
}): Promise<{
|
|
50
|
+
workspace: AngularWorkspace;
|
|
51
|
+
workspacePath: string;
|
|
52
|
+
projectName: string;
|
|
53
|
+
}>;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright Google LLC All Rights Reserved.
|
|
5
|
+
*
|
|
6
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
7
|
+
* found in the LICENSE file at https://angular.dev/license
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.findAngularJsonDir = findAngularJsonDir;
|
|
11
|
+
exports.getProject = getProject;
|
|
12
|
+
exports.getDefaultProjectName = getDefaultProjectName;
|
|
13
|
+
exports.resolveWorkspaceAndProject = resolveWorkspaceAndProject;
|
|
14
|
+
const node_path_1 = require("node:path");
|
|
15
|
+
const config_1 = require("../../utilities/config");
|
|
16
|
+
const host_1 = require("./host");
|
|
17
|
+
/**
|
|
18
|
+
* Searches for an angular.json file by traversing up the directory tree from a starting directory.
|
|
19
|
+
*
|
|
20
|
+
* @param startDir The directory path to start searching from
|
|
21
|
+
* @param host The workspace host instance used to check file existence. Defaults to LocalWorkspaceHost
|
|
22
|
+
* @returns The absolute path to the directory containing angular.json, or null if not found
|
|
23
|
+
*
|
|
24
|
+
* @remarks
|
|
25
|
+
* This function performs an upward directory traversal starting from `startDir`.
|
|
26
|
+
* It checks each directory for the presence of an angular.json file until either:
|
|
27
|
+
* - The file is found (returns the directory path)
|
|
28
|
+
* - The root of the filesystem is reached (returns null)
|
|
29
|
+
*/
|
|
30
|
+
function findAngularJsonDir(startDir, host = host_1.LocalWorkspaceHost) {
|
|
31
|
+
let currentDir = startDir;
|
|
32
|
+
while (true) {
|
|
33
|
+
if (host.existsSync((0, node_path_1.join)(currentDir, 'angular.json'))) {
|
|
34
|
+
return currentDir;
|
|
35
|
+
}
|
|
36
|
+
const parentDir = (0, node_path_1.dirname)(currentDir);
|
|
37
|
+
if (parentDir === currentDir) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
currentDir = parentDir;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Searches for a project in the current workspace, by name.
|
|
45
|
+
*/
|
|
46
|
+
function getProject(context, name) {
|
|
47
|
+
const projects = context.workspace?.projects;
|
|
48
|
+
if (!projects) {
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
return projects.get(name);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Returns the name of the default project in the current workspace, or undefined if none exists.
|
|
55
|
+
*
|
|
56
|
+
* If no default project is defined but there's only a single project in the workspace, its name will
|
|
57
|
+
* be returned.
|
|
58
|
+
*/
|
|
59
|
+
function getDefaultProjectName(workspace) {
|
|
60
|
+
const projects = workspace?.projects;
|
|
61
|
+
if (!projects) {
|
|
62
|
+
return undefined;
|
|
63
|
+
}
|
|
64
|
+
const defaultProjectName = workspace?.extensions['defaultProject'];
|
|
65
|
+
if (defaultProjectName) {
|
|
66
|
+
return defaultProjectName;
|
|
67
|
+
}
|
|
68
|
+
// No default project defined? This might still be salvageable if only a single project exists.
|
|
69
|
+
if (projects.size === 1) {
|
|
70
|
+
return Array.from(projects.keys())[0];
|
|
71
|
+
}
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Resolves workspace and project for tools to operate on.
|
|
76
|
+
*
|
|
77
|
+
* If `workspacePathInput` is absent, uses the MCP's configured workspace. If none is configured, use the
|
|
78
|
+
* current directory as the workspace.
|
|
79
|
+
* If `projectNameInput` is absent, uses the default project in the workspace.
|
|
80
|
+
*/
|
|
81
|
+
async function resolveWorkspaceAndProject({ host, workspacePathInput, projectNameInput, mcpWorkspace, }) {
|
|
82
|
+
let workspacePath;
|
|
83
|
+
let workspace;
|
|
84
|
+
if (workspacePathInput) {
|
|
85
|
+
if (!host.existsSync(workspacePathInput)) {
|
|
86
|
+
throw new Error(`Workspace path does not exist: ${workspacePathInput}. ` +
|
|
87
|
+
"You can use 'list_projects' to find available workspaces.");
|
|
88
|
+
}
|
|
89
|
+
if (!host.existsSync((0, node_path_1.join)(workspacePathInput, 'angular.json'))) {
|
|
90
|
+
throw new Error(`No angular.json found at ${workspacePathInput}. ` +
|
|
91
|
+
"You can use 'list_projects' to find available workspaces.");
|
|
92
|
+
}
|
|
93
|
+
workspacePath = workspacePathInput;
|
|
94
|
+
const configPath = (0, node_path_1.join)(workspacePath, 'angular.json');
|
|
95
|
+
try {
|
|
96
|
+
workspace = await config_1.AngularWorkspace.load(configPath);
|
|
97
|
+
}
|
|
98
|
+
catch (e) {
|
|
99
|
+
throw new Error(`Failed to load workspace configuration at ${configPath}: ${e instanceof Error ? e.message : e}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
else if (mcpWorkspace) {
|
|
103
|
+
workspace = mcpWorkspace;
|
|
104
|
+
workspacePath = workspace.basePath;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
const found = findAngularJsonDir(process.cwd(), host);
|
|
108
|
+
if (!found) {
|
|
109
|
+
throw new Error('Could not find an Angular workspace (angular.json) in the current directory. ' +
|
|
110
|
+
"You can use 'list_projects' to find available workspaces.");
|
|
111
|
+
}
|
|
112
|
+
workspacePath = found;
|
|
113
|
+
const configPath = (0, node_path_1.join)(workspacePath, 'angular.json');
|
|
114
|
+
try {
|
|
115
|
+
workspace = await config_1.AngularWorkspace.load(configPath);
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
throw new Error(`Failed to load workspace configuration at ${configPath}: ${e instanceof Error ? e.message : e}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
let projectName = projectNameInput;
|
|
122
|
+
if (projectName) {
|
|
123
|
+
if (!workspace.projects.has(projectName)) {
|
|
124
|
+
throw new Error(`Project '${projectName}' not found in workspace path ${workspacePath}. ` +
|
|
125
|
+
"You can use 'list_projects' to find available projects.");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
projectName = getDefaultProjectName(workspace);
|
|
130
|
+
}
|
|
131
|
+
if (!projectName) {
|
|
132
|
+
throw new Error(`No project name provided and no default project found in workspace path ${workspacePath}. ` +
|
|
133
|
+
'Please provide a project name or set a default project in angular.json. ' +
|
|
134
|
+
"You can use 'list_projects' to find available projects.");
|
|
135
|
+
}
|
|
136
|
+
return { workspace, workspacePath, projectName };
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=workspace-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-utils.js","sourceRoot":"","sources":["workspace-utils.ts"],"names":[],"mappings":"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"}
|