@angular/cli 21.0.0-next.0 → 21.0.0-next.10
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/cli/index.js +1 -0
- package/lib/cli/index.js.map +1 -0
- package/lib/code-examples.db +0 -0
- package/lib/config/schema.json +276 -51
- package/lib/config/workspace-schema.d.ts +57 -2
- package/lib/config/workspace-schema.js +23 -2
- package/lib/config/workspace-schema.js.map +1 -0
- package/lib/init.js +1 -0
- package/lib/init.js.map +1 -0
- package/package.json +24 -23
- package/src/analytics/analytics-collector.js +1 -0
- package/src/analytics/analytics-collector.js.map +1 -0
- package/src/analytics/analytics-parameters.js +1 -0
- package/src/analytics/analytics-parameters.js.map +1 -0
- package/src/analytics/analytics.js +1 -0
- package/src/analytics/analytics.js.map +1 -0
- package/src/command-builder/architect-base-command-module.js +1 -0
- package/src/command-builder/architect-base-command-module.js.map +1 -0
- package/src/command-builder/architect-command-module.js +21 -7
- package/src/command-builder/architect-command-module.js.map +1 -0
- package/src/command-builder/command-module.js +1 -0
- package/src/command-builder/command-module.js.map +1 -0
- package/src/command-builder/command-runner.js +2 -2
- package/src/command-builder/command-runner.js.map +1 -0
- package/src/command-builder/schematics-command-module.js +8 -2
- package/src/command-builder/schematics-command-module.js.map +1 -0
- package/src/command-builder/utilities/command.js +1 -0
- package/src/command-builder/utilities/command.js.map +1 -0
- package/src/command-builder/utilities/json-help.js +1 -0
- package/src/command-builder/utilities/json-help.js.map +1 -0
- package/src/command-builder/utilities/json-schema.d.ts +13 -1
- package/src/command-builder/utilities/json-schema.js +180 -96
- package/src/command-builder/utilities/json-schema.js.map +1 -0
- package/src/command-builder/utilities/normalize-options-middleware.js +1 -0
- package/src/command-builder/utilities/normalize-options-middleware.js.map +1 -0
- package/src/command-builder/utilities/schematic-engine-host.js +5 -6
- package/src/command-builder/utilities/schematic-engine-host.js.map +1 -0
- package/src/command-builder/utilities/schematic-workflow.js +1 -0
- package/src/command-builder/utilities/schematic-workflow.js.map +1 -0
- package/src/commands/add/cli.d.ts +2 -1
- package/src/commands/add/cli.js +179 -94
- package/src/commands/add/cli.js.map +1 -0
- package/src/commands/analytics/cli.js +1 -0
- package/src/commands/analytics/cli.js.map +1 -0
- package/src/commands/analytics/info/cli.js +1 -0
- package/src/commands/analytics/info/cli.js.map +1 -0
- package/src/commands/analytics/settings/cli.js +1 -0
- package/src/commands/analytics/settings/cli.js.map +1 -0
- package/src/commands/build/cli.js +1 -0
- package/src/commands/build/cli.js.map +1 -0
- package/src/commands/cache/clean/cli.js +1 -0
- package/src/commands/cache/clean/cli.js.map +1 -0
- package/src/commands/cache/cli.js +1 -0
- package/src/commands/cache/cli.js.map +1 -0
- package/src/commands/cache/info/cli.js +36 -11
- package/src/commands/cache/info/cli.js.map +1 -0
- package/src/commands/cache/settings/cli.js +1 -0
- package/src/commands/cache/settings/cli.js.map +1 -0
- package/src/commands/cache/utilities.js +1 -0
- package/src/commands/cache/utilities.js.map +1 -0
- package/src/commands/command-config.js +1 -0
- package/src/commands/command-config.js.map +1 -0
- package/src/commands/completion/cli.js +1 -0
- package/src/commands/completion/cli.js.map +1 -0
- package/src/commands/config/cli.js +1 -0
- package/src/commands/config/cli.js.map +1 -0
- package/src/commands/deploy/cli.js +1 -0
- package/src/commands/deploy/cli.js.map +1 -0
- package/src/commands/e2e/cli.js +1 -0
- package/src/commands/e2e/cli.js.map +1 -0
- package/src/commands/extract-i18n/cli.js +1 -0
- package/src/commands/extract-i18n/cli.js.map +1 -0
- package/src/commands/generate/cli.js +1 -0
- package/src/commands/generate/cli.js.map +1 -0
- package/src/commands/lint/cli.js +1 -0
- package/src/commands/lint/cli.js.map +1 -0
- package/src/commands/make-this-awesome/cli.js +1 -0
- package/src/commands/make-this-awesome/cli.js.map +1 -0
- package/src/commands/mcp/cli.js +1 -0
- package/src/commands/mcp/cli.js.map +1 -0
- package/src/commands/mcp/constants.d.ts +1 -1
- package/src/commands/mcp/constants.js +2 -1
- package/src/commands/mcp/constants.js.map +1 -0
- package/src/commands/mcp/mcp-server.d.ts +3 -3
- package/src/commands/mcp/mcp-server.js +40 -4
- package/src/commands/mcp/mcp-server.js.map +1 -0
- package/src/commands/mcp/resources/ai-tutor.md +627 -0
- package/src/commands/mcp/resources/instructions.js +1 -0
- package/src/commands/mcp/resources/instructions.js.map +1 -0
- package/src/commands/mcp/tools/ai-tutor.d.ts +8 -0
- package/src/commands/mcp/tools/ai-tutor.js +62 -0
- package/src/commands/mcp/tools/ai-tutor.js.map +1 -0
- package/src/commands/mcp/tools/best-practices.d.ts +4 -1
- package/src/commands/mcp/tools/best-practices.js +167 -22
- package/src/commands/mcp/tools/best-practices.js.map +1 -0
- package/src/commands/mcp/tools/doc-search.d.ts +20 -1
- package/src/commands/mcp/tools/doc-search.js +186 -67
- package/src/commands/mcp/tools/doc-search.js.map +1 -0
- package/src/commands/mcp/tools/examples.d.ts +35 -1
- package/src/commands/mcp/tools/examples.js +414 -56
- package/src/commands/mcp/tools/examples.js.map +1 -0
- package/src/commands/mcp/tools/modernize.js +29 -27
- package/src/commands/mcp/tools/modernize.js.map +1 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/analyze_for_unsupported_zone_uses.d.ts +17 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/analyze_for_unsupported_zone_uses.js +62 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/analyze_for_unsupported_zone_uses.js.map +1 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/migrate_single_file.d.ts +12 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/migrate_single_file.js +73 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/migrate_single_file.js.map +1 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/migrate_test_file.d.ts +11 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/migrate_test_file.js +106 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/migrate_test_file.js.map +1 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/prompts.d.ts +15 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/prompts.js +238 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/prompts.js.map +1 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/send_debug_message.d.ts +10 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/send_debug_message.js +20 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/send_debug_message.js.map +1 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/ts_utils.d.ts +36 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/ts_utils.js +136 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/ts_utils.js.map +1 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/types.d.ts +13 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/types.js +10 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/types.js.map +1 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.d.ts +14 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.js +228 -0
- package/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.js.map +1 -0
- package/src/commands/mcp/tools/projects.d.ts +75 -16
- package/src/commands/mcp/tools/projects.js +427 -30
- package/src/commands/mcp/tools/projects.js.map +1 -0
- package/src/commands/mcp/tools/tool-registry.d.ts +2 -1
- package/src/commands/mcp/tools/tool-registry.js +4 -2
- package/src/commands/mcp/tools/tool-registry.js.map +1 -0
- package/src/commands/new/cli.js +2 -0
- package/src/commands/new/cli.js.map +1 -0
- package/src/commands/run/cli.js +1 -0
- package/src/commands/run/cli.js.map +1 -0
- package/src/commands/serve/cli.js +1 -0
- package/src/commands/serve/cli.js.map +1 -0
- package/src/commands/test/cli.js +1 -0
- package/src/commands/test/cli.js.map +1 -0
- package/src/commands/update/cli.js +1 -0
- package/src/commands/update/cli.js.map +1 -0
- package/src/commands/update/schematic/index.js +1 -0
- package/src/commands/update/schematic/index.js.map +1 -0
- package/src/commands/update/schematic/schema.d.ts +0 -1
- package/src/commands/update/schematic/schema.js +1 -1
- package/src/commands/update/schematic/schema.js.map +1 -0
- package/src/commands/update/schematic/schema.json +1 -1
- package/src/commands/version/cli.d.ts +3 -7
- package/src/commands/version/cli.js +50 -49
- package/src/commands/version/cli.js.map +1 -0
- package/src/commands/version/version-info.d.ts +28 -10
- package/src/commands/version/version-info.js +34 -50
- package/src/commands/version/version-info.js.map +1 -0
- package/src/package-managers/discovery.d.ts +23 -0
- package/src/package-managers/discovery.js +110 -0
- package/src/package-managers/discovery.js.map +1 -0
- package/src/package-managers/error.d.ts +31 -0
- package/src/package-managers/error.js +41 -0
- package/src/package-managers/error.js.map +1 -0
- package/src/package-managers/factory.d.ts +25 -0
- package/src/package-managers/factory.js +123 -0
- package/src/package-managers/factory.js.map +1 -0
- package/src/package-managers/host.d.ts +64 -0
- package/src/package-managers/host.js +69 -0
- package/src/package-managers/host.js.map +1 -0
- package/src/package-managers/index.d.ts +12 -0
- package/src/package-managers/index.js +15 -0
- package/src/package-managers/index.js.map +1 -0
- package/src/package-managers/logger.d.ts +27 -0
- package/src/package-managers/logger.js +10 -0
- package/src/package-managers/logger.js.map +1 -0
- package/src/package-managers/package-manager-descriptor.d.ts +204 -0
- package/src/package-managers/package-manager-descriptor.js +147 -0
- package/src/package-managers/package-manager-descriptor.js.map +1 -0
- package/src/package-managers/package-manager.d.ts +144 -0
- package/src/package-managers/package-manager.js +304 -0
- package/src/package-managers/package-manager.js.map +1 -0
- package/src/package-managers/package-metadata.d.ts +87 -0
- package/src/package-managers/package-metadata.js +10 -0
- package/src/package-managers/package-metadata.js.map +1 -0
- package/src/package-managers/package-tree.d.ts +23 -0
- package/src/package-managers/package-tree.js +10 -0
- package/src/package-managers/package-tree.js.map +1 -0
- package/src/package-managers/parsers.d.ts +92 -0
- package/src/package-managers/parsers.js +234 -0
- package/src/package-managers/parsers.js.map +1 -0
- package/src/package-managers/testing/mock-host.d.ts +26 -0
- package/src/package-managers/testing/mock-host.js +53 -0
- package/src/package-managers/testing/mock-host.js.map +1 -0
- package/src/utilities/color.js +1 -0
- package/src/utilities/color.js.map +1 -0
- package/src/utilities/completion.js +1 -0
- package/src/utilities/completion.js.map +1 -0
- package/src/utilities/config.js +1 -0
- package/src/utilities/config.js.map +1 -0
- package/src/utilities/environment-options.js +1 -0
- package/src/utilities/environment-options.js.map +1 -0
- package/src/utilities/eol.js +1 -0
- package/src/utilities/eol.js.map +1 -0
- package/src/utilities/error.js +1 -0
- package/src/utilities/error.js.map +1 -0
- package/src/utilities/find-up.js +1 -0
- package/src/utilities/find-up.js.map +1 -0
- package/src/utilities/json-file.js +1 -0
- package/src/utilities/json-file.js.map +1 -0
- package/src/utilities/log-file.js +1 -0
- package/src/utilities/log-file.js.map +1 -0
- package/src/utilities/memoize.js +1 -0
- package/src/utilities/memoize.js.map +1 -0
- package/src/utilities/package-manager.d.ts +12 -0
- package/src/utilities/package-manager.js +52 -35
- package/src/utilities/package-manager.js.map +1 -0
- package/src/utilities/package-metadata.js +1 -0
- package/src/utilities/package-metadata.js.map +1 -0
- package/src/utilities/package-tree.js +1 -0
- package/src/utilities/package-tree.js.map +1 -0
- package/src/utilities/project.js +1 -0
- package/src/utilities/project.js.map +1 -0
- package/src/utilities/prompt.js +1 -0
- package/src/utilities/prompt.js.map +1 -0
- package/src/utilities/tty.js +1 -0
- package/src/utilities/tty.js.map +1 -0
- package/src/utilities/version.js +2 -1
- package/src/utilities/version.js.map +1 -0
|
@@ -46,45 +46,143 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
46
46
|
exports.FIND_EXAMPLE_TOOL = void 0;
|
|
47
47
|
exports.escapeSearchQuery = escapeSearchQuery;
|
|
48
48
|
const promises_1 = require("node:fs/promises");
|
|
49
|
+
const node_module_1 = require("node:module");
|
|
49
50
|
const node_path_1 = __importDefault(require("node:path"));
|
|
50
51
|
const zod_1 = require("zod");
|
|
51
52
|
const tool_registry_1 = require("./tool-registry");
|
|
52
53
|
const findExampleInputSchema = zod_1.z.object({
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
-
|
|
67
|
-
- Example: '
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
-
|
|
71
|
-
|
|
72
|
-
-
|
|
73
|
-
|
|
74
|
-
-
|
|
54
|
+
workspacePath: zod_1.z
|
|
55
|
+
.string()
|
|
56
|
+
.optional()
|
|
57
|
+
.describe('The absolute path to the `angular.json` file for the workspace. This is used to find the ' +
|
|
58
|
+
'version-specific code examples that correspond to the installed version of the ' +
|
|
59
|
+
'Angular framework. You **MUST** get this path from the `list_projects` tool. If omitted, ' +
|
|
60
|
+
'the tool will search the generic code examples bundled with the CLI.'),
|
|
61
|
+
query: zod_1.z
|
|
62
|
+
.string()
|
|
63
|
+
.describe(`The primary, conceptual search query. This should capture the user's main goal or question ` +
|
|
64
|
+
`(e.g., 'lazy loading a route' or 'how to use signal inputs'). The query will be processed ` +
|
|
65
|
+
'by a powerful full-text search engine.\n\n' +
|
|
66
|
+
'Key Syntax Features (see https://www.sqlite.org/fts5.html for full documentation):\n' +
|
|
67
|
+
' - AND (default): Space-separated terms are combined with AND.\n' +
|
|
68
|
+
' - Example: \'standalone component\' (finds results with both "standalone" and "component")\n' +
|
|
69
|
+
' - OR: Use the OR operator to find results with either term.\n' +
|
|
70
|
+
" - Example: 'validation OR validator'\n" +
|
|
71
|
+
' - NOT: Use the NOT operator to exclude terms.\n' +
|
|
72
|
+
" - Example: 'forms NOT reactive'\n" +
|
|
73
|
+
' - Grouping: Use parentheses () to group expressions.\n' +
|
|
74
|
+
" - Example: '(validation OR validator) AND forms'\n" +
|
|
75
|
+
' - Phrase Search: Use double quotes "" for exact phrases.\n' +
|
|
76
|
+
' - Example: \'"template-driven forms"\'\n' +
|
|
77
|
+
' - Prefix Search: Use an asterisk * for prefix matching.\n' +
|
|
78
|
+
' - Example: \'rout*\' (matches "route", "router", "routing")'),
|
|
79
|
+
keywords: zod_1.z
|
|
80
|
+
.array(zod_1.z.string())
|
|
81
|
+
.optional()
|
|
82
|
+
.describe('A list of specific, exact keywords to narrow the search. Use this for precise terms like ' +
|
|
83
|
+
'API names, function names, or decorators (e.g., `ngFor`, `trackBy`, `inject`).'),
|
|
84
|
+
required_packages: zod_1.z
|
|
85
|
+
.array(zod_1.z.string())
|
|
86
|
+
.optional()
|
|
87
|
+
.describe("A list of NPM packages that an example must use. Use this when the user's request is " +
|
|
88
|
+
'specific to a feature within a certain package (e.g., if the user asks about `ngModel`, ' +
|
|
89
|
+
'you should filter by `@angular/forms`).'),
|
|
90
|
+
related_concepts: zod_1.z
|
|
91
|
+
.array(zod_1.z.string())
|
|
92
|
+
.optional()
|
|
93
|
+
.describe('A list of high-level concepts to filter by. Use this to find examples related to broader ' +
|
|
94
|
+
'architectural ideas or patterns (e.g., `signals`, `dependency injection`, `routing`).'),
|
|
95
|
+
includeExperimental: zod_1.z
|
|
96
|
+
.boolean()
|
|
97
|
+
.optional()
|
|
98
|
+
.default(false)
|
|
99
|
+
.describe('By default, this tool returns only production-safe examples. Set this to `true` **only if** ' +
|
|
100
|
+
'the user explicitly asks for a bleeding-edge feature or if a stable solution to their ' +
|
|
101
|
+
'problem cannot be found. If you set this to `true`, you **MUST** preface your answer by ' +
|
|
102
|
+
'warning the user that the example uses experimental APIs that are not suitable for production.'),
|
|
103
|
+
});
|
|
104
|
+
const findExampleOutputSchema = zod_1.z.object({
|
|
105
|
+
examples: zod_1.z.array(zod_1.z.object({
|
|
106
|
+
title: zod_1.z
|
|
107
|
+
.string()
|
|
108
|
+
.describe('The title of the example. Use this as a heading when presenting the example to the user.'),
|
|
109
|
+
summary: zod_1.z
|
|
110
|
+
.string()
|
|
111
|
+
.describe("A one-sentence summary of the example's purpose. Use this to help the user decide " +
|
|
112
|
+
'if the example is relevant to them.'),
|
|
113
|
+
keywords: zod_1.z
|
|
114
|
+
.array(zod_1.z.string())
|
|
115
|
+
.optional()
|
|
116
|
+
.describe('A list of keywords for the example. You can use these to explain why this example ' +
|
|
117
|
+
"was a good match for the user's query."),
|
|
118
|
+
required_packages: zod_1.z
|
|
119
|
+
.array(zod_1.z.string())
|
|
120
|
+
.optional()
|
|
121
|
+
.describe('A list of NPM packages required for the example to work. Before presenting the code, ' +
|
|
122
|
+
'you should inform the user if any of these packages need to be installed.'),
|
|
123
|
+
related_concepts: zod_1.z
|
|
124
|
+
.array(zod_1.z.string())
|
|
125
|
+
.optional()
|
|
126
|
+
.describe('A list of related concepts. You can suggest these to the user as topics for ' +
|
|
127
|
+
'follow-up questions.'),
|
|
128
|
+
related_tools: zod_1.z
|
|
129
|
+
.array(zod_1.z.string())
|
|
130
|
+
.optional()
|
|
131
|
+
.describe('A list of related MCP tools. You can suggest these as potential next steps for the user.'),
|
|
132
|
+
content: zod_1.z
|
|
133
|
+
.string()
|
|
134
|
+
.describe('A complete, self-contained Angular code example in Markdown format. This should be ' +
|
|
135
|
+
'presented to the user inside a markdown code block.'),
|
|
136
|
+
snippet: zod_1.z
|
|
137
|
+
.string()
|
|
138
|
+
.optional()
|
|
139
|
+
.describe('A contextual snippet from the content showing the matched search term. This field is ' +
|
|
140
|
+
'critical for efficiently evaluating a result`s relevance. It enables two primary ' +
|
|
141
|
+
'workflows:\n\n' +
|
|
142
|
+
'1. For direct questions: You can internally review snippets to select the single best ' +
|
|
143
|
+
'result before generating a comprehensive answer from its full `content`.\n' +
|
|
144
|
+
'2. For ambiguous or exploratory questions: You can present a summary of titles and ' +
|
|
145
|
+
'snippets to the user, allowing them to guide the next step.'),
|
|
146
|
+
})),
|
|
75
147
|
});
|
|
76
148
|
exports.FIND_EXAMPLE_TOOL = (0, tool_registry_1.declareTool)({
|
|
77
149
|
name: 'find_examples',
|
|
78
150
|
title: 'Find Angular Code Examples',
|
|
79
|
-
description:
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
151
|
+
description: `
|
|
152
|
+
<Purpose>
|
|
153
|
+
Augments your knowledge base with a curated database of official, best-practice code examples,
|
|
154
|
+
focusing on **modern, new, and recently updated** Angular features. This tool acts as a RAG
|
|
155
|
+
(Retrieval-Augmented Generation) source, providing ground-truth information on the latest Angular
|
|
156
|
+
APIs and patterns. You **MUST** use it to understand and apply current standards when working with
|
|
157
|
+
new or evolving features.
|
|
158
|
+
</Purpose>
|
|
159
|
+
<Use Cases>
|
|
160
|
+
* **Knowledge Augmentation:** Learning about new or updated Angular features (e.g., query: 'signal input' or 'deferrable views').
|
|
161
|
+
* **Modern Implementation:** Finding the correct modern syntax for features
|
|
162
|
+
(e.g., query: 'functional route guard' or 'http client with fetch').
|
|
163
|
+
* **Refactoring to Modern Patterns:** Upgrading older code by finding examples of new syntax
|
|
164
|
+
(e.g., query: 'built-in control flow' to replace "*ngIf").
|
|
165
|
+
* **Advanced Filtering:** Combining a full-text search with filters to narrow results.
|
|
166
|
+
(e.g., query: 'forms', required_packages: ['@angular/forms'], keywords: ['validation'])
|
|
167
|
+
</Use Cases>
|
|
168
|
+
<Operational Notes>
|
|
169
|
+
* **Project-Specific Use (Recommended):** For tasks inside a user's project, you **MUST** provide the
|
|
170
|
+
\`workspacePath\` argument to get examples that match the project's Angular version. Get this
|
|
171
|
+
path from \`list_projects\`.
|
|
172
|
+
* **General Use:** If no project context is available (e.g., for general questions or learning),
|
|
173
|
+
you can call the tool without the \`workspacePath\` argument. It will return the latest
|
|
174
|
+
generic examples.
|
|
175
|
+
* **Tool Selection:** This database primarily contains examples for new and recently updated Angular
|
|
176
|
+
features. For established, core features, the main documentation (via the
|
|
177
|
+
\`search_documentation\` tool) may be a better source of information.
|
|
178
|
+
* The examples in this database are the single source of truth for modern Angular coding patterns.
|
|
179
|
+
* The search query uses a powerful full-text search syntax (FTS5). Refer to the 'query'
|
|
180
|
+
parameter description for detailed syntax rules and examples.
|
|
181
|
+
* You can combine the main 'query' with optional filters like 'keywords', 'required_packages',
|
|
182
|
+
and 'related_concepts' to create highly specific searches.
|
|
183
|
+
</Operational Notes>`,
|
|
87
184
|
inputSchema: findExampleInputSchema.shape,
|
|
185
|
+
outputSchema: findExampleOutputSchema.shape,
|
|
88
186
|
isReadOnly: true,
|
|
89
187
|
isLocalOnly: true,
|
|
90
188
|
shouldRegister: ({ logger }) => {
|
|
@@ -99,34 +197,174 @@ exports.FIND_EXAMPLE_TOOL = (0, tool_registry_1.declareTool)({
|
|
|
99
197
|
},
|
|
100
198
|
factory: createFindExampleHandler,
|
|
101
199
|
});
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
200
|
+
/**
|
|
201
|
+
* Attempts to find a version-specific example database from the user's installed
|
|
202
|
+
* version of `@angular/core`. It looks for a custom `angular` metadata property in the
|
|
203
|
+
* framework's `package.json` to locate the database.
|
|
204
|
+
*
|
|
205
|
+
* @example A sample `package.json` `angular` field:
|
|
206
|
+
* ```json
|
|
207
|
+
* {
|
|
208
|
+
* "angular": {
|
|
209
|
+
* "examples": {
|
|
210
|
+
* "format": "sqlite",
|
|
211
|
+
* "path": "./resources/code-examples.db"
|
|
212
|
+
* }
|
|
213
|
+
* }
|
|
214
|
+
* }
|
|
215
|
+
* ```
|
|
216
|
+
*
|
|
217
|
+
* @param workspacePath The absolute path to the user's `angular.json` file.
|
|
218
|
+
* @param logger The MCP tool context logger for reporting warnings.
|
|
219
|
+
* @returns A promise that resolves to an object containing the database path and source,
|
|
220
|
+
* or `undefined` if the database could not be resolved.
|
|
221
|
+
*/
|
|
222
|
+
async function getVersionSpecificExampleDatabase(workspacePath, logger) {
|
|
223
|
+
// 1. Resolve the path to package.json
|
|
224
|
+
let pkgJsonPath;
|
|
225
|
+
try {
|
|
226
|
+
const workspaceRequire = (0, node_module_1.createRequire)(workspacePath);
|
|
227
|
+
pkgJsonPath = workspaceRequire.resolve('@angular/core/package.json');
|
|
228
|
+
}
|
|
229
|
+
catch (e) {
|
|
230
|
+
logger.warn(`Could not resolve '@angular/core/package.json' from '${workspacePath}'. ` +
|
|
231
|
+
'Is Angular installed in this project? Falling back to the bundled examples.');
|
|
232
|
+
return undefined;
|
|
233
|
+
}
|
|
234
|
+
// 2. Read and parse package.json, then find the database.
|
|
235
|
+
try {
|
|
236
|
+
const pkgJsonContent = await (0, promises_1.readFile)(pkgJsonPath, 'utf-8');
|
|
237
|
+
const pkgJson = JSON.parse(pkgJsonContent);
|
|
238
|
+
const examplesInfo = pkgJson['angular']?.examples;
|
|
239
|
+
if (examplesInfo && examplesInfo.format === 'sqlite' && typeof examplesInfo.path === 'string') {
|
|
240
|
+
const packageDirectory = node_path_1.default.dirname(pkgJsonPath);
|
|
241
|
+
const dbPath = node_path_1.default.resolve(packageDirectory, examplesInfo.path);
|
|
242
|
+
// Ensure the resolved database path is within the package boundary.
|
|
243
|
+
const relativePath = node_path_1.default.relative(packageDirectory, dbPath);
|
|
244
|
+
if (relativePath.startsWith('..') || node_path_1.default.isAbsolute(relativePath)) {
|
|
245
|
+
logger.warn(`Detected a potential path traversal attempt in '${pkgJsonPath}'. ` +
|
|
246
|
+
`The path '${examplesInfo.path}' escapes the package boundary. ` +
|
|
247
|
+
'Falling back to the bundled examples.');
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
// Check the file size to prevent reading a very large file.
|
|
251
|
+
const stats = await (0, promises_1.stat)(dbPath);
|
|
252
|
+
if (stats.size > 10 * 1024 * 1024) {
|
|
253
|
+
// 10MB
|
|
254
|
+
logger.warn(`The example database at '${dbPath}' is larger than 10MB (${stats.size} bytes). ` +
|
|
255
|
+
'This is unexpected and the file will not be used. Falling back to the bundled examples.');
|
|
256
|
+
return undefined;
|
|
257
|
+
}
|
|
258
|
+
const source = `framework version ${pkgJson.version}`;
|
|
259
|
+
return { dbPath, source };
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
logger.warn(`Did not find valid 'angular.examples' metadata in '${pkgJsonPath}'. ` +
|
|
263
|
+
'Falling back to the bundled examples.');
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (e) {
|
|
267
|
+
logger.warn(`Failed to read or parse version-specific examples metadata referenced in '${pkgJsonPath}': ${e instanceof Error ? e.message : e}. Falling back to the bundled examples.`);
|
|
107
268
|
}
|
|
269
|
+
return undefined;
|
|
270
|
+
}
|
|
271
|
+
async function createFindExampleHandler({ logger, exampleDatabasePath }) {
|
|
272
|
+
const runtimeDb = process.env['NG_MCP_EXAMPLES_DIR']
|
|
273
|
+
? await setupRuntimeExamples(process.env['NG_MCP_EXAMPLES_DIR'])
|
|
274
|
+
: undefined;
|
|
108
275
|
suppressSqliteWarning();
|
|
109
|
-
return async (
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
276
|
+
return async (input) => {
|
|
277
|
+
// If the dev-time override is present, use it and bypass all other logic.
|
|
278
|
+
if (runtimeDb) {
|
|
279
|
+
return queryDatabase(runtimeDb, input);
|
|
280
|
+
}
|
|
281
|
+
let dbPath;
|
|
282
|
+
// First, try to get the version-specific guide.
|
|
283
|
+
if (input.workspacePath) {
|
|
284
|
+
const versionSpecific = await getVersionSpecificExampleDatabase(input.workspacePath, logger);
|
|
285
|
+
if (versionSpecific) {
|
|
286
|
+
dbPath = versionSpecific.dbPath;
|
|
114
287
|
}
|
|
115
|
-
const { DatabaseSync } = await Promise.resolve().then(() => __importStar(require('node:sqlite')));
|
|
116
|
-
db = new DatabaseSync(exampleDatabasePath, { readOnly: true });
|
|
117
288
|
}
|
|
118
|
-
|
|
119
|
-
|
|
289
|
+
// If the version-specific guide was not found for any reason, fall back to the bundled version.
|
|
290
|
+
if (!dbPath) {
|
|
291
|
+
dbPath = exampleDatabasePath;
|
|
292
|
+
}
|
|
293
|
+
if (!dbPath) {
|
|
294
|
+
// This should be prevented by the registration logic in mcp-server.ts
|
|
295
|
+
throw new Error('Example database path is not available.');
|
|
120
296
|
}
|
|
121
|
-
const
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
297
|
+
const { DatabaseSync } = await Promise.resolve().then(() => __importStar(require('node:sqlite')));
|
|
298
|
+
const db = new DatabaseSync(dbPath, { readOnly: true });
|
|
299
|
+
return queryDatabase(db, input);
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
function queryDatabase(db, input) {
|
|
303
|
+
const { query, keywords, required_packages, related_concepts, includeExperimental } = input;
|
|
304
|
+
// Build the query dynamically
|
|
305
|
+
const params = [];
|
|
306
|
+
let sql = `SELECT e.title, e.summary, e.keywords, e.required_packages, e.related_concepts, e.related_tools, e.content, ` +
|
|
307
|
+
// The `snippet` function generates a contextual snippet of the matched text.
|
|
308
|
+
// Column 6 is the `content` column. We highlight matches with asterisks and limit the snippet size.
|
|
309
|
+
"snippet(examples_fts, 6, '**', '**', '...', 15) AS snippet " +
|
|
310
|
+
'FROM examples e JOIN examples_fts ON e.id = examples_fts.rowid';
|
|
311
|
+
const whereClauses = [];
|
|
312
|
+
// FTS query
|
|
313
|
+
if (query) {
|
|
314
|
+
whereClauses.push('examples_fts MATCH ?');
|
|
315
|
+
params.push(escapeSearchQuery(query));
|
|
316
|
+
}
|
|
317
|
+
// JSON array filters
|
|
318
|
+
const addJsonFilter = (column, values) => {
|
|
319
|
+
if (values?.length) {
|
|
320
|
+
for (const value of values) {
|
|
321
|
+
whereClauses.push(`e.${column} LIKE ?`);
|
|
322
|
+
params.push(`%"${value}"%`);
|
|
323
|
+
}
|
|
126
324
|
}
|
|
127
|
-
|
|
128
|
-
|
|
325
|
+
};
|
|
326
|
+
addJsonFilter('keywords', keywords);
|
|
327
|
+
addJsonFilter('required_packages', required_packages);
|
|
328
|
+
addJsonFilter('related_concepts', related_concepts);
|
|
329
|
+
if (!includeExperimental) {
|
|
330
|
+
whereClauses.push('e.experimental = 0');
|
|
331
|
+
}
|
|
332
|
+
if (whereClauses.length > 0) {
|
|
333
|
+
sql += ` WHERE ${whereClauses.join(' AND ')}`;
|
|
334
|
+
}
|
|
335
|
+
// Order the results by relevance using the BM25 algorithm.
|
|
336
|
+
// The weights assigned to each column boost the ranking of documents where the
|
|
337
|
+
// search term appears in a more important field.
|
|
338
|
+
// Column order: title, summary, keywords, required_packages, related_concepts, related_tools, content
|
|
339
|
+
sql += ' ORDER BY bm25(examples_fts, 10.0, 5.0, 5.0, 1.0, 2.0, 1.0, 1.0);';
|
|
340
|
+
const queryStatement = db.prepare(sql);
|
|
341
|
+
// Query database and return results
|
|
342
|
+
const examples = [];
|
|
343
|
+
const textContent = [];
|
|
344
|
+
for (const exampleRecord of queryStatement.all(...params)) {
|
|
345
|
+
const record = exampleRecord;
|
|
346
|
+
const example = {
|
|
347
|
+
title: record['title'],
|
|
348
|
+
summary: record['summary'],
|
|
349
|
+
keywords: JSON.parse(record['keywords'] || '[]'),
|
|
350
|
+
required_packages: JSON.parse(record['required_packages'] || '[]'),
|
|
351
|
+
related_concepts: JSON.parse(record['related_concepts'] || '[]'),
|
|
352
|
+
related_tools: JSON.parse(record['related_tools'] || '[]'),
|
|
353
|
+
content: record['content'],
|
|
354
|
+
snippet: record['snippet'],
|
|
129
355
|
};
|
|
356
|
+
examples.push(example);
|
|
357
|
+
// Also create a more structured text output
|
|
358
|
+
let text = `## Example: ${example.title}\n**Summary:** ${example.summary}`;
|
|
359
|
+
if (example.snippet) {
|
|
360
|
+
text += `\n**Snippet:** ${example.snippet}`;
|
|
361
|
+
}
|
|
362
|
+
text += `\n\n---\n\n${example.content}`;
|
|
363
|
+
textContent.push({ type: 'text', text });
|
|
364
|
+
}
|
|
365
|
+
return {
|
|
366
|
+
content: textContent,
|
|
367
|
+
structuredContent: { examples },
|
|
130
368
|
};
|
|
131
369
|
}
|
|
132
370
|
/**
|
|
@@ -206,19 +444,139 @@ function suppressSqliteWarning() {
|
|
|
206
444
|
return originalProcessEmit.apply(process, arguments);
|
|
207
445
|
};
|
|
208
446
|
}
|
|
447
|
+
/**
|
|
448
|
+
* A simple YAML front matter parser.
|
|
449
|
+
*
|
|
450
|
+
* This function extracts the YAML block enclosed by `---` at the beginning of a string
|
|
451
|
+
* and parses it into a JavaScript object. It is not a full YAML parser and only
|
|
452
|
+
* supports simple key-value pairs and string arrays.
|
|
453
|
+
*
|
|
454
|
+
* @param content The string content to parse.
|
|
455
|
+
* @returns A record containing the parsed front matter data.
|
|
456
|
+
*/
|
|
457
|
+
function parseFrontmatter(content) {
|
|
458
|
+
const match = content.match(/^---\r?\n(.*?)\r?\n---/s);
|
|
459
|
+
if (!match) {
|
|
460
|
+
return {};
|
|
461
|
+
}
|
|
462
|
+
const frontmatter = match[1];
|
|
463
|
+
const data = {};
|
|
464
|
+
const lines = frontmatter.split(/\r?\n/);
|
|
465
|
+
let currentKey = '';
|
|
466
|
+
let isArray = false;
|
|
467
|
+
const arrayValues = [];
|
|
468
|
+
for (const line of lines) {
|
|
469
|
+
const keyValueMatch = line.match(/^([^:]+):\s*(.*)/);
|
|
470
|
+
if (keyValueMatch) {
|
|
471
|
+
if (currentKey && isArray) {
|
|
472
|
+
data[currentKey] = arrayValues.slice();
|
|
473
|
+
arrayValues.length = 0;
|
|
474
|
+
}
|
|
475
|
+
const [, key, value] = keyValueMatch;
|
|
476
|
+
currentKey = key.trim();
|
|
477
|
+
isArray = value.trim() === '';
|
|
478
|
+
if (!isArray) {
|
|
479
|
+
const trimmedValue = value.trim();
|
|
480
|
+
if (trimmedValue === 'true') {
|
|
481
|
+
data[currentKey] = true;
|
|
482
|
+
}
|
|
483
|
+
else if (trimmedValue === 'false') {
|
|
484
|
+
data[currentKey] = false;
|
|
485
|
+
}
|
|
486
|
+
else {
|
|
487
|
+
data[currentKey] = trimmedValue;
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
else {
|
|
492
|
+
const arrayItemMatch = line.match(/^\s*-\s*(.*)/);
|
|
493
|
+
if (arrayItemMatch && currentKey && isArray) {
|
|
494
|
+
let value = arrayItemMatch[1].trim();
|
|
495
|
+
// Unquote if the value is quoted.
|
|
496
|
+
if ((value.startsWith("'") && value.endsWith("'")) ||
|
|
497
|
+
(value.startsWith('"') && value.endsWith('"'))) {
|
|
498
|
+
value = value.slice(1, -1);
|
|
499
|
+
}
|
|
500
|
+
arrayValues.push(value);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
if (currentKey && isArray) {
|
|
505
|
+
data[currentKey] = arrayValues;
|
|
506
|
+
}
|
|
507
|
+
return data;
|
|
508
|
+
}
|
|
209
509
|
async function setupRuntimeExamples(examplesPath) {
|
|
210
510
|
const { DatabaseSync } = await Promise.resolve().then(() => __importStar(require('node:sqlite')));
|
|
211
511
|
const db = new DatabaseSync(':memory:');
|
|
212
|
-
|
|
213
|
-
|
|
512
|
+
// Create a relational table to store the structured example data.
|
|
513
|
+
db.exec(`
|
|
514
|
+
CREATE TABLE examples (
|
|
515
|
+
id INTEGER PRIMARY KEY,
|
|
516
|
+
title TEXT NOT NULL,
|
|
517
|
+
summary TEXT NOT NULL,
|
|
518
|
+
keywords TEXT,
|
|
519
|
+
required_packages TEXT,
|
|
520
|
+
related_concepts TEXT,
|
|
521
|
+
related_tools TEXT,
|
|
522
|
+
experimental INTEGER NOT NULL DEFAULT 0,
|
|
523
|
+
content TEXT NOT NULL
|
|
524
|
+
);
|
|
525
|
+
`);
|
|
526
|
+
// Create an FTS5 virtual table to provide full-text search capabilities.
|
|
527
|
+
db.exec(`
|
|
528
|
+
CREATE VIRTUAL TABLE examples_fts USING fts5(
|
|
529
|
+
title,
|
|
530
|
+
summary,
|
|
531
|
+
keywords,
|
|
532
|
+
required_packages,
|
|
533
|
+
related_concepts,
|
|
534
|
+
related_tools,
|
|
535
|
+
content,
|
|
536
|
+
content='examples',
|
|
537
|
+
content_rowid='id',
|
|
538
|
+
tokenize = 'porter ascii'
|
|
539
|
+
);
|
|
540
|
+
`);
|
|
541
|
+
// Create triggers to keep the FTS table synchronized with the examples table.
|
|
542
|
+
db.exec(`
|
|
543
|
+
CREATE TRIGGER examples_after_insert AFTER INSERT ON examples BEGIN
|
|
544
|
+
INSERT INTO examples_fts(rowid, title, summary, keywords, required_packages, related_concepts, related_tools, content)
|
|
545
|
+
VALUES (
|
|
546
|
+
new.id, new.title, new.summary, new.keywords, new.required_packages, new.related_concepts,
|
|
547
|
+
new.related_tools, new.content
|
|
548
|
+
);
|
|
549
|
+
END;
|
|
550
|
+
`);
|
|
551
|
+
const insertStatement = db.prepare('INSERT INTO examples(' +
|
|
552
|
+
'title, summary, keywords, required_packages, related_concepts, related_tools, experimental, content' +
|
|
553
|
+
') VALUES(?, ?, ?, ?, ?, ?, ?, ?);');
|
|
554
|
+
const frontmatterSchema = zod_1.z.object({
|
|
555
|
+
title: zod_1.z.string(),
|
|
556
|
+
summary: zod_1.z.string(),
|
|
557
|
+
keywords: zod_1.z.array(zod_1.z.string()).optional(),
|
|
558
|
+
required_packages: zod_1.z.array(zod_1.z.string()).optional(),
|
|
559
|
+
related_concepts: zod_1.z.array(zod_1.z.string()).optional(),
|
|
560
|
+
related_tools: zod_1.z.array(zod_1.z.string()).optional(),
|
|
561
|
+
experimental: zod_1.z.boolean().optional(),
|
|
562
|
+
});
|
|
214
563
|
db.exec('BEGIN TRANSACTION');
|
|
215
|
-
for await (const entry of (0, promises_1.glob)('
|
|
564
|
+
for await (const entry of (0, promises_1.glob)('**/*.md', { cwd: examplesPath, withFileTypes: true })) {
|
|
216
565
|
if (!entry.isFile()) {
|
|
217
566
|
continue;
|
|
218
567
|
}
|
|
219
|
-
const
|
|
220
|
-
|
|
568
|
+
const content = await (0, promises_1.readFile)(node_path_1.default.join(entry.parentPath, entry.name), 'utf-8');
|
|
569
|
+
const frontmatter = parseFrontmatter(content);
|
|
570
|
+
const validation = frontmatterSchema.safeParse(frontmatter);
|
|
571
|
+
if (!validation.success) {
|
|
572
|
+
// eslint-disable-next-line no-console
|
|
573
|
+
console.warn(`Skipping invalid example file ${entry.name}:`, validation.error.issues);
|
|
574
|
+
continue;
|
|
575
|
+
}
|
|
576
|
+
const { title, summary, keywords, required_packages, related_concepts, related_tools, experimental, } = validation.data;
|
|
577
|
+
insertStatement.run(title, summary, JSON.stringify(keywords ?? []), JSON.stringify(required_packages ?? []), JSON.stringify(related_concepts ?? []), JSON.stringify(related_tools ?? []), experimental ? 1 : 0, content);
|
|
221
578
|
}
|
|
222
579
|
db.exec('END TRANSACTION');
|
|
223
580
|
return db;
|
|
224
581
|
}
|
|
582
|
+
//# sourceMappingURL=examples.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"examples.js","sourceRoot":"","sources":["examples.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,11 +22,6 @@ const TRANSFORMATIONS = [
|
|
|
22
22
|
description: 'Converts tags for elements with no content to be self-closing (e.g., `<app-foo></app-foo>` becomes `<app-foo />`).',
|
|
23
23
|
documentationUrl: 'https://angular.dev/reference/migrations/self-closing-tags',
|
|
24
24
|
},
|
|
25
|
-
{
|
|
26
|
-
name: 'test-bed-get',
|
|
27
|
-
description: 'Updates `TestBed.get` to the preferred and type-safe `TestBed.inject` in TypeScript test files.',
|
|
28
|
-
documentationUrl: 'https://angular.dev/guide/testing/dependency-injection',
|
|
29
|
-
},
|
|
30
25
|
{
|
|
31
26
|
name: 'inject',
|
|
32
27
|
description: 'Converts usages of constructor-based injection to the inject() function.',
|
|
@@ -59,17 +54,14 @@ const TRANSFORMATIONS = [
|
|
|
59
54
|
'3. Run `ng g @angular/core:standalone` and select "Bootstrap the project using standalone APIs"',
|
|
60
55
|
documentationUrl: 'https://angular.dev/reference/migrations/standalone',
|
|
61
56
|
},
|
|
62
|
-
{
|
|
63
|
-
name: 'zoneless',
|
|
64
|
-
description: 'Migrates the application to be zoneless.',
|
|
65
|
-
documentationUrl: 'https://angular.dev/guide/zoneless',
|
|
66
|
-
},
|
|
67
57
|
];
|
|
68
58
|
const modernizeInputSchema = zod_1.z.object({
|
|
69
59
|
// Casting to [string, ...string[]] since the enum definition requires a nonempty array.
|
|
70
60
|
transformations: zod_1.z
|
|
71
61
|
.array(zod_1.z.enum(TRANSFORMATIONS.map((t) => t.name)))
|
|
72
|
-
.optional()
|
|
62
|
+
.optional()
|
|
63
|
+
.describe('A list of specific transformations to get instructions for. ' +
|
|
64
|
+
'If omitted, general guidance is provided.'),
|
|
73
65
|
});
|
|
74
66
|
function generateInstructions(transformationNames) {
|
|
75
67
|
if (transformationNames.length === 0) {
|
|
@@ -107,29 +99,39 @@ async function runModernization(input) {
|
|
|
107
99
|
exports.MODERNIZE_TOOL = (0, tool_registry_1.declareTool)({
|
|
108
100
|
name: 'modernize',
|
|
109
101
|
title: 'Modernize Angular Code',
|
|
110
|
-
description:
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
102
|
+
description: `
|
|
103
|
+
<Purpose>
|
|
104
|
+
Provides instructions and commands for modernizing Angular code to align with the latest best
|
|
105
|
+
practices and syntax. This tool helps ensure code is idiomatic, readable, and maintainable by
|
|
106
|
+
generating the exact steps needed to perform specific migrations.
|
|
107
|
+
</Purpose>
|
|
108
|
+
<Use Cases>
|
|
109
|
+
* **Applying Specific Migrations:** Get the precise commands to update code to modern patterns
|
|
110
|
+
(e.g., selecting 'control-flow-migration' to replace *ngIf with @if).
|
|
111
|
+
* **Upgrading Existing Code:** Modernize an entire project by running the 'standalone' migration,
|
|
112
|
+
which provides a multi-step command sequence.
|
|
113
|
+
* **Discovering Available Migrations:** Call the tool with no transformations to get a link to the
|
|
114
|
+
general best practices guide.
|
|
115
|
+
</Use Cases>
|
|
116
|
+
<Operational Notes>
|
|
117
|
+
* **Execution:** This tool **provides instructions**, which you **MUST** then execute as shell commands.
|
|
118
|
+
It does not modify code directly.
|
|
119
|
+
* **Standalone Migration:** The 'standalone' transformation is a special, multi-step process.
|
|
120
|
+
You **MUST** execute the commands in the exact order provided and validate your application
|
|
121
|
+
between each step.
|
|
122
|
+
* **Transformation List:** The following transformations are available:
|
|
123
|
+
${TRANSFORMATIONS.map((t) => ` * ${t.name}: ${t.description}`).join('\n')}
|
|
124
|
+
</Operational Notes>`,
|
|
125
125
|
inputSchema: modernizeInputSchema.shape,
|
|
126
126
|
outputSchema: {
|
|
127
127
|
instructions: zod_1.z
|
|
128
128
|
.array(zod_1.z.string())
|
|
129
129
|
.optional()
|
|
130
|
-
.describe('A list of instructions
|
|
130
|
+
.describe('A list of instructions and shell commands to run the requested modernizations. ' +
|
|
131
|
+
'Each string in the array is a separate step or command.'),
|
|
131
132
|
},
|
|
132
133
|
isLocalOnly: true,
|
|
133
134
|
isReadOnly: true,
|
|
134
135
|
factory: () => (input) => runModernization(input),
|
|
135
136
|
});
|
|
137
|
+
//# sourceMappingURL=modernize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modernize.js","sourceRoot":"","sources":["modernize.ts"],"names":[],"mappings":"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"}
|