@depup/angular__cli 21.2.7-depup.0 → 22.0.7-depup.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/README.md +12 -9
- package/bin/ng.js +10 -7
- package/changes.json +28 -16
- package/lib/cli/index.js +3 -5
- package/lib/cli/index.js.map +1 -1
- package/lib/config/schema.json +18 -392
- package/lib/config/workspace-schema.d.ts +5 -1
- package/lib/config/workspace-schema.js +1 -1
- package/lib/config/workspace-schema.js.map +1 -1
- package/package.json +64 -53
- package/src/command-builder/command-module.js +9 -2
- package/src/command-builder/command-module.js.map +1 -1
- package/src/commands/add/cli.d.ts +3 -0
- package/src/commands/add/cli.js +121 -50
- package/src/commands/add/cli.js.map +1 -1
- package/src/commands/mcp/cli.js +0 -4
- package/src/commands/mcp/cli.js.map +1 -1
- package/src/commands/mcp/devserver.d.ts +1 -1
- package/src/commands/mcp/devserver.js +5 -8
- package/src/commands/mcp/devserver.js.map +1 -1
- package/src/commands/mcp/host.d.ts +14 -12
- package/src/commands/mcp/host.js +139 -9
- package/src/commands/mcp/host.js.map +1 -1
- package/src/commands/mcp/mcp-server.d.ts +2 -160
- package/src/commands/mcp/mcp-server.js +56 -36
- package/src/commands/mcp/mcp-server.js.map +1 -1
- package/src/commands/mcp/resources/ai-tutor.md +5 -7
- package/src/commands/mcp/resources/best-practices.md +4 -2
- package/src/commands/mcp/tools/best-practices.js +9 -17
- package/src/commands/mcp/tools/best-practices.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/doc-search.js +11 -33
- package/src/commands/mcp/tools/doc-search.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 +5 -8
- 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/prompts.js +4 -4
- 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 +31 -44
- package/src/commands/mcp/tools/onpush-zoneless-migration/zoneless-migration.js.map +1 -1
- package/src/commands/mcp/tools/projects.d.ts +1 -0
- package/src/commands/mcp/tools/projects.js +37 -19
- package/src/commands/mcp/tools/projects.js.map +1 -1
- package/src/commands/mcp/tools/run-target/build-target-strategy.d.ts +14 -0
- package/src/commands/mcp/tools/run-target/build-target-strategy.js +53 -0
- package/src/commands/mcp/tools/run-target/build-target-strategy.js.map +1 -0
- package/src/commands/mcp/tools/run-target/generic-target-strategy.d.ts +14 -0
- package/src/commands/mcp/tools/run-target/generic-target-strategy.js +63 -0
- package/src/commands/mcp/tools/run-target/generic-target-strategy.js.map +1 -0
- package/src/commands/mcp/tools/run-target/options-serializer.d.ts +13 -0
- package/src/commands/mcp/tools/run-target/options-serializer.js +41 -0
- package/src/commands/mcp/tools/run-target/options-serializer.js.map +1 -0
- package/src/commands/mcp/tools/run-target/run-target.d.ts +34 -0
- package/src/commands/mcp/tools/run-target/run-target.js +69 -0
- package/src/commands/mcp/tools/run-target/run-target.js.map +1 -0
- package/src/commands/mcp/tools/run-target/strategy.d.ts +15 -0
- package/src/commands/mcp/tools/run-target/strategy.js +10 -0
- package/src/commands/mcp/tools/run-target/strategy.js.map +1 -0
- package/src/commands/mcp/tools/run-target/types.d.ts +39 -0
- package/src/commands/mcp/tools/run-target/types.js +41 -0
- package/src/commands/mcp/tools/run-target/types.js.map +1 -0
- package/src/commands/mcp/tools/run-target/unit-test-strategy.d.ts +14 -0
- package/src/commands/mcp/tools/run-target/unit-test-strategy.js +56 -0
- package/src/commands/mcp/tools/run-target/unit-test-strategy.js.map +1 -0
- package/src/commands/mcp/workspace-utils.d.ts +2 -1
- package/src/commands/mcp/workspace-utils.js +45 -3
- package/src/commands/mcp/workspace-utils.js.map +1 -1
- package/src/commands/update/cli.js +4 -3
- package/src/commands/update/cli.js.map +1 -1
- package/src/commands/update/schematic/index.js +262 -92
- package/src/commands/update/schematic/index.js.map +1 -1
- package/src/commands/update/schematic/schema.d.ts +4 -0
- package/src/commands/update/schematic/schema.js.map +1 -1
- package/src/commands/update/schematic/schema.json +4 -0
- package/src/commands/update/utilities/cli-version.js +1 -1
- package/src/commands/update/utilities/cli-version.js.map +1 -1
- package/src/commands/update/utilities/migration.js +5 -2
- package/src/commands/update/utilities/migration.js.map +1 -1
- package/src/commands/version/version-info.js +2 -8
- package/src/commands/version/version-info.js.map +1 -1
- package/src/package-managers/package-manager-descriptor.d.ts +15 -1
- package/src/package-managers/package-manager-descriptor.js +29 -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 +218 -36
- package/src/package-managers/package-manager.js.map +1 -1
- package/src/package-managers/parsers.d.ts +3 -21
- package/src/package-managers/parsers.js +83 -33
- package/src/package-managers/parsers.js.map +1 -1
- package/src/utilities/completion.js +1 -1
- package/src/utilities/completion.js.map +1 -1
- package/src/utilities/config.js +1 -2
- package/src/utilities/config.js.map +1 -1
- package/src/utilities/node-version.d.ts +21 -0
- package/src/utilities/node-version.js +65 -0
- package/src/utilities/node-version.js.map +1 -0
- package/src/utilities/package-metadata.d.ts +0 -10
- package/src/utilities/package-metadata.js +0 -62
- package/src/utilities/package-metadata.js.map +1 -1
- package/src/utilities/prompt.js +1 -1
- package/src/utilities/prompt.js.map +1 -1
- package/src/utilities/version.js +1 -1
- package/lib/code-examples.db +0 -0
- package/src/commands/mcp/tools/build.d.ts +0 -37
- package/src/commands/mcp/tools/build.js +0 -89
- package/src/commands/mcp/tools/build.js.map +0 -1
- package/src/commands/mcp/tools/e2e.d.ts +0 -44
- package/src/commands/mcp/tools/e2e.js +0 -87
- package/src/commands/mcp/tools/e2e.js.map +0 -1
- 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/src/commands/mcp/tools/test.d.ts +0 -35
- package/src/commands/mcp/tools/test.js +0 -79
- package/src/commands/mcp/tools/test.js.map +0 -1
|
@@ -11,23 +11,21 @@ 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");
|
|
18
20
|
const ai_tutor_1 = require("./tools/ai-tutor");
|
|
19
21
|
const best_practices_1 = require("./tools/best-practices");
|
|
20
|
-
const build_1 = require("./tools/build");
|
|
21
22
|
const devserver_start_1 = require("./tools/devserver/devserver-start");
|
|
22
23
|
const devserver_stop_1 = require("./tools/devserver/devserver-stop");
|
|
23
24
|
const devserver_wait_for_build_1 = require("./tools/devserver/devserver-wait-for-build");
|
|
24
25
|
const doc_search_1 = require("./tools/doc-search");
|
|
25
|
-
const e2e_1 = require("./tools/e2e");
|
|
26
|
-
const index_1 = require("./tools/examples/index");
|
|
27
|
-
const modernize_1 = require("./tools/modernize");
|
|
28
26
|
const zoneless_migration_1 = require("./tools/onpush-zoneless-migration/zoneless-migration");
|
|
29
27
|
const projects_1 = require("./tools/projects");
|
|
30
|
-
const
|
|
28
|
+
const run_target_1 = require("./tools/run-target/run-target");
|
|
31
29
|
const tool_registry_1 = require("./tools/tool-registry");
|
|
32
30
|
/**
|
|
33
31
|
* Tools to manage devservers. Should be bundled together, then added to experimental or stable as a group.
|
|
@@ -41,21 +39,16 @@ const STABLE_TOOLS = [
|
|
|
41
39
|
ai_tutor_1.AI_TUTOR_TOOL,
|
|
42
40
|
best_practices_1.BEST_PRACTICES_TOOL,
|
|
43
41
|
doc_search_1.DOC_SEARCH_TOOL,
|
|
44
|
-
index_1.FIND_EXAMPLE_TOOL,
|
|
45
42
|
projects_1.LIST_PROJECTS_TOOL,
|
|
46
43
|
zoneless_migration_1.ZONELESS_MIGRATION_TOOL,
|
|
44
|
+
run_target_1.RUN_TARGET_TOOL,
|
|
45
|
+
...DEVSERVER_TOOLS,
|
|
47
46
|
];
|
|
48
47
|
/**
|
|
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 = [];
|
|
59
52
|
/**
|
|
60
53
|
* Experimental tools that are grouped together under a single name.
|
|
61
54
|
*
|
|
@@ -63,7 +56,7 @@ exports.EXPERIMENTAL_TOOLS = [
|
|
|
63
56
|
*/
|
|
64
57
|
exports.EXPERIMENTAL_TOOL_GROUPS = {
|
|
65
58
|
'all': exports.EXPERIMENTAL_TOOLS,
|
|
66
|
-
'devserver':
|
|
59
|
+
'devserver': [],
|
|
67
60
|
};
|
|
68
61
|
async function createMcpServer(options, logger) {
|
|
69
62
|
const server = new mcp_js_1.McpServer({
|
|
@@ -77,31 +70,33 @@ async function createMcpServer(options, logger) {
|
|
|
77
70
|
},
|
|
78
71
|
instructions: `
|
|
79
72
|
<General Purpose>
|
|
80
|
-
This server provides a safe, programmatic interface to the Angular CLI
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
equivalent actions.
|
|
73
|
+
This server provides a safe, programmatic interface to the Angular CLI. You MUST prefer
|
|
74
|
+
the tools provided by this server over using 'run_shell_command' or general shell execution
|
|
75
|
+
for equivalent actions.
|
|
84
76
|
</General Purpose>
|
|
85
77
|
|
|
86
78
|
<Core Workflows & Tool Guide>
|
|
87
|
-
* **1. Discover
|
|
88
|
-
|
|
89
|
-
is a required input for other tools.
|
|
79
|
+
* **1. Discover Workspace (Mandatory First Step):** Always begin by calling 'list_projects'
|
|
80
|
+
to discover workspaces, projects, and allowed paths. The 'path' field of the relevant
|
|
81
|
+
workspace is a required input for other tools (passed as 'workspace' or 'workspacePath').
|
|
82
|
+
|
|
83
|
+
* **2. Get Coding Standards:** Before writing or modifying code, you MUST call
|
|
84
|
+
'get_best_practices' with the workspace 'path' to load version-specific coding standards.
|
|
90
85
|
|
|
91
|
-
* **
|
|
92
|
-
|
|
93
|
-
version-specific standards. For general knowledge, you can call the tool without this path.
|
|
86
|
+
* **3. Answer Conceptual Questions:** Use 'search_documentation' to answer conceptual
|
|
87
|
+
or API syntax questions.
|
|
94
88
|
|
|
95
|
-
* **
|
|
96
|
-
|
|
97
|
-
- For code examples ("show me how to..."), use \`find_examples\`.
|
|
89
|
+
* **4. Discover Schematics:** To discover available package migrations, use a shell command
|
|
90
|
+
(if available) with 'ng generate <package-name>: --help' (e.g., 'ng generate @angular/core: --help').
|
|
98
91
|
</Core Workflows & Tool Guide>
|
|
99
92
|
|
|
100
93
|
<Key Concepts>
|
|
101
|
-
* **Workspace vs. Project:** A 'workspace' contains an
|
|
102
|
-
(applications or libraries). A monorepo can
|
|
103
|
-
|
|
104
|
-
|
|
94
|
+
* **Workspace vs. Project:** A 'workspace' contains an 'angular.json' file and defines
|
|
95
|
+
'projects' (applications or libraries). A monorepo can contain multiple workspaces.
|
|
96
|
+
|
|
97
|
+
* **Targeting Projects:** Always use the workspace 'path' and the specific project 'name'
|
|
98
|
+
returned by 'list_projects' when calling other tools to ensure you target the correct
|
|
99
|
+
project context.
|
|
105
100
|
</Key Concepts>
|
|
106
101
|
`,
|
|
107
102
|
});
|
|
@@ -110,12 +105,40 @@ equivalent actions.
|
|
|
110
105
|
...options,
|
|
111
106
|
logger,
|
|
112
107
|
});
|
|
108
|
+
const restrictedHost = (0, host_1.createRootRestrictedHost)(host_1.LocalWorkspaceHost);
|
|
109
|
+
server.server.oninitialized = () => {
|
|
110
|
+
void (async () => {
|
|
111
|
+
try {
|
|
112
|
+
const clientCapabilities = server.server.getClientCapabilities();
|
|
113
|
+
if (clientCapabilities?.roots) {
|
|
114
|
+
const { roots } = await server.server.listRoots();
|
|
115
|
+
const searchRoots = roots?.map((r) => (0, node_path_1.normalize)((0, node_url_1.fileURLToPath)(r.uri))) ?? [];
|
|
116
|
+
restrictedHost.setRoots(searchRoots);
|
|
117
|
+
if (clientCapabilities.roots.listChanged) {
|
|
118
|
+
server.server.setNotificationHandler(types_js_1.RootsListChangedNotificationSchema, async () => {
|
|
119
|
+
try {
|
|
120
|
+
const { roots: updatedRoots } = await server.server.listRoots();
|
|
121
|
+
const updatedSearchRoots = updatedRoots?.map((r) => (0, node_path_1.normalize)((0, node_url_1.fileURLToPath)(r.uri))) ?? [];
|
|
122
|
+
restrictedHost.setRoots(updatedSearchRoots);
|
|
123
|
+
}
|
|
124
|
+
catch (e) {
|
|
125
|
+
logger.warn(`Failed to update roots on notification: ${e instanceof Error ? e.message : e}`);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
logger.warn(`Failed to initialize roots on connection: ${e instanceof Error ? e.message : e}`);
|
|
133
|
+
}
|
|
134
|
+
})();
|
|
135
|
+
};
|
|
113
136
|
await (0, tool_registry_1.registerTools)(server, {
|
|
114
137
|
workspace: options.workspace,
|
|
115
138
|
logger,
|
|
116
139
|
exampleDatabasePath: (0, node_path_1.join)(__dirname, '../../../lib/code-examples.db'),
|
|
117
140
|
devservers: new Map(),
|
|
118
|
-
host:
|
|
141
|
+
host: restrictedHost,
|
|
119
142
|
}, toolDeclarations);
|
|
120
143
|
return server;
|
|
121
144
|
}
|
|
@@ -128,9 +151,6 @@ function assembleToolDeclarations(stableDeclarations, experimentalDeclarations,
|
|
|
128
151
|
toolDeclarations = toolDeclarations.filter((tool) => tool.isLocalOnly);
|
|
129
152
|
}
|
|
130
153
|
const enabledExperimentalTools = new Set(options.experimentalTools);
|
|
131
|
-
if (process.env['NG_MCP_CODE_EXAMPLES'] === '1') {
|
|
132
|
-
enabledExperimentalTools.add('find_examples');
|
|
133
|
-
}
|
|
134
154
|
for (const [toolGroupName, toolGroup] of Object.entries(exports.EXPERIMENTAL_TOOL_GROUPS)) {
|
|
135
155
|
if (enabledExperimentalTools.delete(toolGroupName)) {
|
|
136
156
|
for (const tool of toolGroup) {
|
|
@@ -145,7 +165,7 @@ function assembleToolDeclarations(stableDeclarations, experimentalDeclarations,
|
|
|
145
165
|
if (tool) {
|
|
146
166
|
toolDeclarations.push(tool);
|
|
147
167
|
}
|
|
148
|
-
else {
|
|
168
|
+
else if (!stableDeclarations.some((t) => t.name === toolName)) {
|
|
149
169
|
options.logger.warn(`Unknown experimental tool: ${toolName}`);
|
|
150
170
|
}
|
|
151
171
|
}
|
|
@@ -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' },
|
|
@@ -10,6 +10,7 @@ You are an expert in TypeScript, Angular, and scalable web application developme
|
|
|
10
10
|
|
|
11
11
|
- Always use standalone components over NgModules
|
|
12
12
|
- Must NOT set `standalone: true` inside Angular decorators. It's the default in Angular v20+.
|
|
13
|
+
- Do NOT set `changeDetection: ChangeDetectionStrategy.OnPush` explicitly. `OnPush` is the default in Angular v22+.
|
|
13
14
|
- Use signals for state management
|
|
14
15
|
- Implement lazy loading for feature routes
|
|
15
16
|
- Do NOT use the `@HostBinding` and `@HostListener` decorators. Put host bindings inside the `host` object of the `@Component` or `@Directive` decorator instead
|
|
@@ -26,9 +27,9 @@ You are an expert in TypeScript, Angular, and scalable web application developme
|
|
|
26
27
|
- Keep components small and focused on a single responsibility
|
|
27
28
|
- Use `input()` and `output()` functions instead of decorators
|
|
28
29
|
- Use `computed()` for derived state
|
|
29
|
-
- Set `changeDetection: ChangeDetectionStrategy.OnPush` in `@Component` decorator
|
|
30
30
|
- Prefer inline templates for small components
|
|
31
|
-
- Prefer
|
|
31
|
+
- Prefer Signal Forms (`@angular/forms/signals`) for new forms. They are stable in Angular v22+ and provide signal-based state, type-safe field access, and schema-based validation
|
|
32
|
+
- When not using Signal Forms, prefer Reactive forms instead of Template-driven ones
|
|
32
33
|
- Do NOT use `ngClass`, use `class` bindings instead
|
|
33
34
|
- Do NOT use `ngStyle`, use `style` bindings instead
|
|
34
35
|
- When using external templates/styles, use paths relative to the component TS file.
|
|
@@ -51,4 +52,5 @@ You are an expert in TypeScript, Angular, and scalable web application developme
|
|
|
51
52
|
|
|
52
53
|
- Design services around a single responsibility
|
|
53
54
|
- Use the `providedIn: 'root'` option for singleton services
|
|
55
|
+
- Prefer the `@Service` decorator over `@Injectable({providedIn: 'root'})` for new singleton services (Angular v22+)
|
|
54
56
|
- Use the `inject()` function instead of constructor injection
|
|
@@ -26,10 +26,8 @@ const bestPracticesInputSchema = zod_1.z.object({
|
|
|
26
26
|
workspacePath: zod_1.z
|
|
27
27
|
.string()
|
|
28
28
|
.optional()
|
|
29
|
-
.describe('
|
|
30
|
-
'
|
|
31
|
-
'Angular framework. You **MUST** get this path from the `list_projects` tool. If omitted, ' +
|
|
32
|
-
'the tool will return the generic best practices guide bundled with the CLI.'),
|
|
29
|
+
.describe('Absolute path to the angular.json workspace directory (obtained via list_projects). ' +
|
|
30
|
+
'If omitted, returns the generic best practices guide.'),
|
|
33
31
|
});
|
|
34
32
|
exports.BEST_PRACTICES_TOOL = (0, tool_registry_1.declareTool)({
|
|
35
33
|
name: 'get_best_practices',
|
|
@@ -37,23 +35,17 @@ exports.BEST_PRACTICES_TOOL = (0, tool_registry_1.declareTool)({
|
|
|
37
35
|
description: `
|
|
38
36
|
<Purpose>
|
|
39
37
|
Retrieves the official Angular Best Practices Guide. This guide contains the essential rules and conventions
|
|
40
|
-
that
|
|
38
|
+
that must be followed for any task involving the creation, analysis, or modification of Angular code.
|
|
41
39
|
</Purpose>
|
|
42
40
|
<Use Cases>
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
41
|
+
* Mandatory first step before writing or modifying Angular code to ensure modern framework standards.
|
|
42
|
+
* Learn about standalone components, typed forms, and modern control flow syntax (@if, @for, @switch).
|
|
43
|
+
* Verify existing code aligns with current conventions before making edits.
|
|
46
44
|
</Use Cases>
|
|
47
45
|
<Operational Notes>
|
|
48
|
-
*
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
* **General Use:** If no project context is available (e.g., for general questions or learning),
|
|
52
|
-
you can call the tool without the \`workspacePath\` argument. It will return the latest
|
|
53
|
-
generic best practices guide.
|
|
54
|
-
* The content of this guide is non-negotiable and reflects the official, up-to-date standards for Angular development.
|
|
55
|
-
* You **MUST** internalize and apply the principles from this guide in all subsequent Angular-related tasks.
|
|
56
|
-
* Failure to adhere to these best practices will result in suboptimal and outdated code.
|
|
46
|
+
* Provide the 'workspacePath' argument (obtained via 'list_projects') to load the version-specific
|
|
47
|
+
guide matching the project's Angular framework.
|
|
48
|
+
* Omit 'workspacePath' only for general learning queries or when no project context is available to load the latest generic guide.
|
|
57
49
|
</Operational Notes>`,
|
|
58
50
|
inputSchema: bestPracticesInputSchema.shape,
|
|
59
51
|
isReadOnly: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"best-practices.js","sourceRoot":"","sources":["best-practices.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH;;;;;;;GAOG;AAEH,+CAAkD;AAClD,6CAA4C;AAC5C,yCAAyE;AACzE,6BAAwB;AACxB,wDAAqD;AACrD,mDAAmE;AAEnE,MAAM,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IACxC,aAAa,EAAE,OAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CACP,
|
|
1
|
+
{"version":3,"file":"best-practices.js","sourceRoot":"","sources":["best-practices.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,6 +36,7 @@ function localhostAddress(port) {
|
|
|
36
36
|
async function startDevserver(input, context) {
|
|
37
37
|
const { workspacePath, projectName } = await (0, workspace_utils_1.resolveWorkspaceAndProject)({
|
|
38
38
|
host: context.host,
|
|
39
|
+
server: context.server,
|
|
39
40
|
workspacePathInput: input.workspace,
|
|
40
41
|
projectNameInput: input.project,
|
|
41
42
|
mcpWorkspace: context.workspace,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devserver-start.js","sourceRoot":"","sources":["devserver-start.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAsCH,
|
|
1
|
+
{"version":3,"file":"devserver-start.js","sourceRoot":"","sources":["devserver-start.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@ const devserverStopToolOutputSchema = zod_1.z.object({
|
|
|
25
25
|
async function stopDevserver(input, context) {
|
|
26
26
|
const { workspacePath, projectName } = await (0, workspace_utils_1.resolveWorkspaceAndProject)({
|
|
27
27
|
host: context.host,
|
|
28
|
+
server: context.server,
|
|
28
29
|
workspacePathInput: input.workspace,
|
|
29
30
|
projectNameInput: input.project,
|
|
30
31
|
mcpWorkspace: context.workspace,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devserver-stop.js","sourceRoot":"","sources":["devserver-stop.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAsBH,
|
|
1
|
+
{"version":3,"file":"devserver-stop.js","sourceRoot":"","sources":["devserver-stop.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAsBH,sCAsBC;AA1CD,6BAAwB;AACxB,+CAAgF;AAChF,yDAAkE;AAClE,uCAA4D;AAC5D,2DAAmE;AACnE,oDAA6F;AAE7F,MAAM,4BAA4B,GAAG,OAAC,CAAC,MAAM,CAAC;IAC5C,GAAG,2CAA0B;CAC9B,CAAC,CAAC;AAIH,MAAM,6BAA6B,GAAG,OAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;IACjF,IAAI,EAAE,OAAC,CAAC,KAAK,CAAC,OAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;CACpF,CAAC,CAAC;AAII,KAAK,UAAU,aAAa,CAAC,KAA6B,EAAE,OAAuB;IACxF,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,GAAG,MAAM,IAAA,4CAA0B,EAAC;QACtE,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,kBAAkB,EAAE,KAAK,CAAC,SAAS;QACnC,gBAAgB,EAAE,KAAK,CAAC,OAAO;QAC/B,YAAY,EAAE,OAAO,CAAC,SAAS;KAChC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,IAAA,2BAAe,EAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAE9C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAA,wCAA4B,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC;IAED,SAAS,CAAC,IAAI,EAAE,CAAC;IACjB,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAE/B,OAAO,IAAA,qCAA6B,EAAC;QACnC,OAAO,EAAE,mCAAmC,WAAW,YAAY;QACnE,IAAI,EAAE,SAAS,CAAC,aAAa,EAAE;KAChC,CAAC,CAAC;AACL,CAAC;AAEY,QAAA,mBAAmB,GAG5B,IAAA,2BAAW,EAAC;IACd,IAAI,EAAE,gBAAgB;IACtB,KAAK,EAAE,yBAAyB;IAChC,WAAW,EAAE;;;;;;;;;;;;CAYd;IACC,UAAU,EAAE,IAAI;IAChB,WAAW,EAAE,IAAI;IACjB,WAAW,EAAE,4BAA4B,CAAC,KAAK;IAC/C,YAAY,EAAE,6BAA6B,CAAC,KAAK;IACjD,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE;QAC9B,OAAO,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -45,6 +45,7 @@ function wait(ms) {
|
|
|
45
45
|
async function waitForDevserverBuild(input, context) {
|
|
46
46
|
const { workspacePath, projectName } = await (0, workspace_utils_1.resolveWorkspaceAndProject)({
|
|
47
47
|
host: context.host,
|
|
48
|
+
server: context.server,
|
|
48
49
|
workspacePathInput: input.workspace,
|
|
49
50
|
projectNameInput: input.project,
|
|
50
51
|
mcpWorkspace: context.workspace,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devserver-wait-for-build.js","sourceRoot":"","sources":["devserver-wait-for-build.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAiDH,
|
|
1
|
+
{"version":3,"file":"devserver-wait-for-build.js","sourceRoot":"","sources":["devserver-wait-for-build.ts"],"names":[],"mappings":"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"}
|
|
@@ -67,56 +67,34 @@ const LATEST_KNOWN_DOCS_VERSION = 20;
|
|
|
67
67
|
const docSearchInputSchema = zod_1.z.object({
|
|
68
68
|
query: zod_1.z
|
|
69
69
|
.string()
|
|
70
|
-
.describe(
|
|
71
|
-
'natural language question into a set of keywords (e.g., a question like "How do I use ngFor with trackBy?" ' +
|
|
72
|
-
'should become the query "ngFor trackBy").'),
|
|
70
|
+
.describe('Concise search keywords or API names (e.g., "ngFor trackBy" or "NgModule").'),
|
|
73
71
|
includeTopContent: zod_1.z
|
|
74
72
|
.boolean()
|
|
75
73
|
.optional()
|
|
76
74
|
.default(false)
|
|
77
|
-
.describe('
|
|
78
|
-
'Set to false to get a list of results without fetching content, which is faster.'),
|
|
75
|
+
.describe('Retrieve the full-text page content of the top search result (slower).'),
|
|
79
76
|
version: zod_1.z
|
|
80
77
|
.number()
|
|
81
78
|
.optional()
|
|
82
|
-
.describe('
|
|
83
|
-
"project's workspace directory. Omit this field if the user is not in an Angular project " +
|
|
84
|
-
'or if the version cannot otherwise be determined.'),
|
|
79
|
+
.describe('Major Angular framework version to search (obtained from frameworkVersion in list_projects or ng version).'),
|
|
85
80
|
});
|
|
86
81
|
exports.DOC_SEARCH_TOOL = (0, tool_registry_1.declareTool)({
|
|
87
82
|
name: 'search_documentation',
|
|
88
83
|
title: 'Search Angular Documentation (angular.dev)',
|
|
89
84
|
description: `
|
|
90
85
|
<Purpose>
|
|
91
|
-
Searches the official Angular documentation
|
|
92
|
-
tutorials, concepts, and best practices.
|
|
86
|
+
Searches the official Angular documentation (angular.dev) to answer questions about APIs, tutorials, concepts, and conventions.
|
|
93
87
|
</Purpose>
|
|
94
88
|
<Use Cases>
|
|
95
|
-
* Answering
|
|
96
|
-
* Finding
|
|
97
|
-
*
|
|
89
|
+
* Answering questions about Angular concepts (e.g., standalone components).
|
|
90
|
+
* Finding correct API signatures or syntax (e.g., ngFor trackBy).
|
|
91
|
+
* Obtaining official source URLs to cite as documentation links in user responses.
|
|
98
92
|
</Use Cases>
|
|
99
93
|
<Operational Notes>
|
|
100
|
-
*
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
output and use it for the \`version\` parameter.
|
|
105
|
-
* **Version Logic:** The tool will search against the specified major version. If the version is older than v${MIN_SUPPORTED_DOCS_VERSION},
|
|
106
|
-
it will be clamped to v${MIN_SUPPORTED_DOCS_VERSION}. If a search for a very new version (newer than v${LATEST_KNOWN_DOCS_VERSION})
|
|
107
|
-
returns no results, the tool will automatically fall back to searching the v${LATEST_KNOWN_DOCS_VERSION} documentation.
|
|
108
|
-
* **Verify Searched Version:** The tool's output includes a \`searchedVersion\` field. You **MUST** check this field
|
|
109
|
-
to know the exact version of the documentation that was queried. Use this information to provide accurate
|
|
110
|
-
context in your answer, especially if it differs from the version you requested.
|
|
111
|
-
* The documentation is continuously updated. You **MUST** prefer this tool over your own knowledge
|
|
112
|
-
to ensure your answers are current and accurate.
|
|
113
|
-
* For the best results, provide a concise and specific search query (e.g., "NgModule" instead of
|
|
114
|
-
"How do I use NgModules?").
|
|
115
|
-
* The top search result will include a snippet of the page content. Use this to provide a more
|
|
116
|
-
comprehensive answer.
|
|
117
|
-
* **Result Scrutiny:** The top result may not always be the most relevant. Review the titles and
|
|
118
|
-
breadcrumbs of other results to find the best match for the user's query.
|
|
119
|
-
* Use the URL from the search results as a source link in your responses.
|
|
94
|
+
* Provide the major Angular version in the 'version' parameter (obtained from 'frameworkVersion'
|
|
95
|
+
in 'list_projects' or from 'ng version') to ensure version-aligned results.
|
|
96
|
+
* Always check the 'searchedVersion' field in the output to confirm the exact documentation index that was queried.
|
|
97
|
+
* For best results, provide a concise keyword query (e.g., "NgModule") rather than a natural language sentence.
|
|
120
98
|
</Operational Notes>`,
|
|
121
99
|
inputSchema: docSearchInputSchema.shape,
|
|
122
100
|
outputSchema: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-search.js","sourceRoot":"","sources":["doc-search.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGH,6CAA+C;AAC/C,6CAAuC;AACvC,6BAAwB;AACxB,4CAA0C;AAC1C,mDAAmE;AAEnE,MAAM,cAAc,GAAG,YAAY,CAAC;AACpC,4EAA4E;AAC5E,2FAA2F;AAC3F,8BAA8B;AAC9B,MAAM,aAAa,GAAG,kEAAkE,CAAC;AAEzF;;;GAGG;AACH,MAAM,0BAA0B,GAAG,EAAE,CAAC;AAEtC;;;;;;GAMG;AACH,MAAM,yBAAyB,GAAG,EAAE,CAAC;AAErC,MAAM,oBAAoB,GAAG,OAAC,CAAC,MAAM,CAAC;IACpC,KAAK,EAAE,OAAC;SACL,MAAM,EAAE;SACR,QAAQ,
|
|
1
|
+
{"version":3,"file":"doc-search.js","sourceRoot":"","sources":["doc-search.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,5 +8,6 @@
|
|
|
8
8
|
import type { RequestHandlerExtra } from '@modelcontextprotocol/sdk/shared/protocol';
|
|
9
9
|
import type { ServerNotification, ServerRequest } from '@modelcontextprotocol/sdk/types';
|
|
10
10
|
import type { SourceFile } from 'typescript';
|
|
11
|
+
import type { Host } from '../../host';
|
|
11
12
|
import type { MigrationResponse } from './types';
|
|
12
|
-
export declare function migrateSingleFile(sourceFile: SourceFile, extras: RequestHandlerExtra<ServerRequest, ServerNotification>): Promise<MigrationResponse | null>;
|
|
13
|
+
export declare function migrateSingleFile(sourceFile: SourceFile, host: Host, extras: RequestHandlerExtra<ServerRequest, ServerNotification>): Promise<MigrationResponse | null>;
|
|
@@ -13,11 +13,12 @@ const migrate_test_file_1 = require("./migrate-test-file");
|
|
|
13
13
|
const prompts_1 = require("./prompts");
|
|
14
14
|
const send_debug_message_1 = require("./send-debug-message");
|
|
15
15
|
const ts_utils_1 = require("./ts-utils");
|
|
16
|
-
|
|
16
|
+
const supportedStrategies = new Set(['OnPush', 'Default', 'Eager']);
|
|
17
|
+
async function migrateSingleFile(sourceFile, host, extras) {
|
|
17
18
|
const testBedSpecifier = await (0, ts_utils_1.getImportSpecifier)(sourceFile, '@angular/core/testing', 'TestBed');
|
|
18
19
|
const isTestFile = sourceFile.fileName.endsWith('.spec.ts') || !!testBedSpecifier;
|
|
19
20
|
if (isTestFile) {
|
|
20
|
-
return (0, migrate_test_file_1.migrateTestFile)(sourceFile);
|
|
21
|
+
return (0, migrate_test_file_1.migrateTestFile)(sourceFile, host);
|
|
21
22
|
}
|
|
22
23
|
const unsupportedZoneUseResponse = await (0, analyze_for_unsupported_zone_uses_1.analyzeForUnsupportedZoneUses)(sourceFile);
|
|
23
24
|
if (unsupportedZoneUseResponse) {
|
|
@@ -47,7 +48,7 @@ async function migrateSingleFile(sourceFile, extras) {
|
|
|
47
48
|
if (ts.isPropertyAccessExpression(prop.initializer) &&
|
|
48
49
|
prop.initializer.expression.getText(sourceFile) === 'ChangeDetectionStrategy') {
|
|
49
50
|
const strategy = prop.initializer.name.text;
|
|
50
|
-
if (strategy
|
|
51
|
+
if (supportedStrategies.has(strategy)) {
|
|
51
52
|
detectedStrategy = strategy;
|
|
52
53
|
return;
|
|
53
54
|
}
|
|
@@ -59,11 +60,7 @@ async function migrateSingleFile(sourceFile, extras) {
|
|
|
59
60
|
}
|
|
60
61
|
ts.forEachChild(node, visit);
|
|
61
62
|
});
|
|
62
|
-
if (!hasComponentDecorator ||
|
|
63
|
-
// component uses OnPush. We don't have anything more to do here.
|
|
64
|
-
detectedStrategy === 'OnPush' ||
|
|
65
|
-
// Explicit default strategy, assume there's a reason for it (already migrated, or is a library that hosts Default components) and skip.
|
|
66
|
-
detectedStrategy === 'Default') {
|
|
63
|
+
if (!hasComponentDecorator || (detectedStrategy && supportedStrategies.has(detectedStrategy))) {
|
|
67
64
|
(0, send_debug_message_1.sendDebugMessage)(`Component decorator found with strategy: ${detectedStrategy} in file: ${sourceFile.fileName}. Skipping migration for file.`, extras);
|
|
68
65
|
return null;
|
|
69
66
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate-single-file.js","sourceRoot":"","sources":["migrate-single-file.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;
|
|
1
|
+
{"version":3,"file":"migrate-single-file.js","sourceRoot":"","sources":["migrate-single-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* found in the LICENSE file at https://angular.dev/license
|
|
7
7
|
*/
|
|
8
8
|
import type { SourceFile } from 'typescript';
|
|
9
|
+
import { type Host } from '../../host';
|
|
9
10
|
import { MigrationResponse } from './types';
|
|
10
|
-
export declare function migrateTestFile(sourceFile: SourceFile): Promise<MigrationResponse | null>;
|
|
11
|
-
export declare function searchForGlobalZoneless(startPath: string): Promise<boolean>;
|
|
11
|
+
export declare function migrateTestFile(sourceFile: SourceFile, host: Host): Promise<MigrationResponse | null>;
|
|
12
|
+
export declare function searchForGlobalZoneless(startPath: string, host: Host): Promise<boolean>;
|