@agentteams/cli 0.1.83 → 0.1.84
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/.eslintcache +1 -1
- package/dist/auth/activeCredential.d.ts +22 -0
- package/dist/auth/activeCredential.d.ts.map +1 -0
- package/dist/auth/activeCredential.js +25 -0
- package/dist/auth/activeCredential.js.map +1 -0
- package/dist/auth/credentialStore.d.ts +89 -0
- package/dist/auth/credentialStore.d.ts.map +1 -0
- package/dist/auth/credentialStore.js +254 -0
- package/dist/auth/credentialStore.js.map +1 -0
- package/dist/auth/personalTokenClient.d.ts +155 -0
- package/dist/auth/personalTokenClient.d.ts.map +1 -0
- package/dist/auth/personalTokenClient.js +312 -0
- package/dist/auth/personalTokenClient.js.map +1 -0
- package/dist/auth/personalTokenStore.d.ts +16 -0
- package/dist/auth/personalTokenStore.d.ts.map +1 -0
- package/dist/auth/personalTokenStore.js +27 -0
- package/dist/auth/personalTokenStore.js.map +1 -0
- package/dist/commands/agentConfig.d.ts.map +1 -1
- package/dist/commands/agentConfig.js +8 -6
- package/dist/commands/agentConfig.js.map +1 -1
- package/dist/commands/auth.d.ts +97 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +245 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +16 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/convention.d.ts +11 -0
- package/dist/commands/convention.d.ts.map +1 -1
- package/dist/commands/convention.js +35 -11
- package/dist/commands/convention.js.map +1 -1
- package/dist/commands/dependency.d.ts.map +1 -1
- package/dist/commands/dependency.js +8 -6
- package/dist/commands/dependency.js.map +1 -1
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +19 -14
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/init.d.ts +17 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +90 -9
- package/dist/commands/init.js.map +1 -1
- package/dist/index.js +101 -15
- package/dist/index.js.map +1 -1
- package/dist/mcp/context.d.ts +15 -1
- package/dist/mcp/context.d.ts.map +1 -1
- package/dist/mcp/context.js +24 -5
- package/dist/mcp/context.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +5 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +25 -22
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp-registration/clients.d.ts.map +1 -1
- package/dist/mcp-registration/clients.js +1 -9
- package/dist/mcp-registration/clients.js.map +1 -1
- package/dist/mcp-registration/doctor.d.ts +38 -0
- package/dist/mcp-registration/doctor.d.ts.map +1 -0
- package/dist/mcp-registration/doctor.js +379 -0
- package/dist/mcp-registration/doctor.js.map +1 -0
- package/dist/mcp-registration/index.d.ts +7 -5
- package/dist/mcp-registration/index.d.ts.map +1 -1
- package/dist/mcp-registration/index.js +46 -21
- package/dist/mcp-registration/index.js.map +1 -1
- package/dist/mcp-registration/install.d.ts.map +1 -1
- package/dist/mcp-registration/install.js +12 -15
- package/dist/mcp-registration/install.js.map +1 -1
- package/dist/mcp-registration/render.d.ts +8 -6
- package/dist/mcp-registration/render.d.ts.map +1 -1
- package/dist/mcp-registration/render.js +15 -36
- package/dist/mcp-registration/render.js.map +1 -1
- package/dist/mcp-registration/serverSpec.d.ts +31 -18
- package/dist/mcp-registration/serverSpec.d.ts.map +1 -1
- package/dist/mcp-registration/serverSpec.js +36 -20
- package/dist/mcp-registration/serverSpec.js.map +1 -1
- package/dist/mcp-registration/types.d.ts +0 -3
- package/dist/mcp-registration/types.d.ts.map +1 -1
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/apiKeyInput.d.ts +16 -0
- package/dist/utils/apiKeyInput.d.ts.map +1 -0
- package/dist/utils/apiKeyInput.js +47 -0
- package/dist/utils/apiKeyInput.js.map +1 -0
- package/dist/utils/authServer.d.ts +32 -3
- package/dist/utils/authServer.d.ts.map +1 -1
- package/dist/utils/authServer.js +46 -6
- package/dist/utils/authServer.js.map +1 -1
- package/dist/utils/config.d.ts +118 -15
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +182 -8
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +16 -0
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/httpClient.d.ts.map +1 -1
- package/dist/utils/httpClient.js +25 -0
- package/dist/utils/httpClient.js.map +1 -1
- package/dist/utils/initOutput.d.ts.map +1 -1
- package/dist/utils/initOutput.js +30 -0
- package/dist/utils/initOutput.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
import { existsSync, readFileSync, unlinkSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { DEFAULT_API_URL, findProjectConfig, saveConfig } from '../utils/config.js';
|
|
4
|
+
import { getPersonalTokenClient } from '../auth/personalTokenClient.js';
|
|
5
|
+
import { BACKUP_SUFFIX, PROJECT_SCOPE_FILE_MODE, USER_SCOPE_FILE_MODE, writeConfigFileAtomically, } from './atomicWrite.js';
|
|
6
|
+
import { MCP_CLIENTS } from './clients.js';
|
|
7
|
+
import { McpConfigParseError, readContainerEntry, upsertContainerEntry } from './jsonc.js';
|
|
8
|
+
import { buildEntryValue } from './render.js';
|
|
9
|
+
import { buildServerSpec, MCP_SERVER_NAME } from './serverSpec.js';
|
|
10
|
+
/**
|
|
11
|
+
* A `key_` that starts a value, not one embedded in a longer identifier.
|
|
12
|
+
*
|
|
13
|
+
* The lookbehind is what keeps `license_key_path` or `api_key_source` out of the
|
|
14
|
+
* scan, and the length floor keeps a bare `key_x` out of it: an agent key is
|
|
15
|
+
* always `key_{uuid}_{uuid}`. Matching those would make doctor report — and,
|
|
16
|
+
* before the entry check below, rewrite — files that never held a credential.
|
|
17
|
+
*/
|
|
18
|
+
const KEY_PATTERN = /(?<![A-Za-z0-9_-])key_[A-Za-z0-9][A-Za-z0-9_-]{7,}/g;
|
|
19
|
+
function resolvePathContext(overrides) {
|
|
20
|
+
return {
|
|
21
|
+
homeDir: overrides?.homeDir ?? homedir(),
|
|
22
|
+
cwd: overrides?.cwd ?? process.cwd(),
|
|
23
|
+
env: overrides?.env ?? process.env,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function countKeyMaterial(source) {
|
|
27
|
+
return source.match(KEY_PATTERN)?.length ?? 0;
|
|
28
|
+
}
|
|
29
|
+
function redactKeyMaterial(value) {
|
|
30
|
+
return value.replace(KEY_PATTERN, '***');
|
|
31
|
+
}
|
|
32
|
+
function readSource(path) {
|
|
33
|
+
try {
|
|
34
|
+
return readFileSync(path, 'utf-8');
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function buildCandidates(context) {
|
|
41
|
+
const candidates = new Map();
|
|
42
|
+
const projectConfigPath = findProjectConfig(context.cwd);
|
|
43
|
+
if (projectConfigPath) {
|
|
44
|
+
candidates.set(projectConfigPath, {
|
|
45
|
+
path: projectConfigPath,
|
|
46
|
+
kind: 'project-config',
|
|
47
|
+
definitions: [],
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
for (const client of MCP_CLIENTS) {
|
|
51
|
+
for (const scope of ['user', 'project']) {
|
|
52
|
+
const definition = client.scopes[scope];
|
|
53
|
+
const path = definition.configPath(context);
|
|
54
|
+
const candidate = candidates.get(path) ?? { path, kind: 'mcp-config', definitions: [] };
|
|
55
|
+
candidate.definitions.push({
|
|
56
|
+
clientId: client.id,
|
|
57
|
+
scope,
|
|
58
|
+
format: definition.format,
|
|
59
|
+
containerKey: definition.containerKey,
|
|
60
|
+
entryShape: definition.entryShape,
|
|
61
|
+
});
|
|
62
|
+
candidates.set(path, candidate);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
for (const primary of [...candidates.values()]) {
|
|
66
|
+
const backupPath = `${primary.path}${BACKUP_SUFFIX}`;
|
|
67
|
+
candidates.set(backupPath, {
|
|
68
|
+
path: backupPath,
|
|
69
|
+
kind: 'backup',
|
|
70
|
+
primaryPath: primary.path,
|
|
71
|
+
definitions: [...primary.definitions],
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return [...candidates.values()];
|
|
75
|
+
}
|
|
76
|
+
function scanCandidates(candidates) {
|
|
77
|
+
let scannedFiles = 0;
|
|
78
|
+
const findings = [];
|
|
79
|
+
for (const candidate of candidates) {
|
|
80
|
+
if (!existsSync(candidate.path))
|
|
81
|
+
continue;
|
|
82
|
+
scannedFiles += 1;
|
|
83
|
+
const source = readSource(candidate.path);
|
|
84
|
+
if (source === null)
|
|
85
|
+
continue;
|
|
86
|
+
const occurrences = countKeyMaterial(source);
|
|
87
|
+
if (occurrences === 0)
|
|
88
|
+
continue;
|
|
89
|
+
findings.push({
|
|
90
|
+
path: redactKeyMaterial(candidate.path),
|
|
91
|
+
kind: candidate.kind,
|
|
92
|
+
occurrences,
|
|
93
|
+
clientIds: [...new Set(candidate.definitions.map((definition) => definition.clientId))],
|
|
94
|
+
scopes: [...new Set(candidate.definitions.map((definition) => definition.scope))],
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return { scannedFiles, findings };
|
|
98
|
+
}
|
|
99
|
+
async function hasValidPersonalCredential(apiUrl) {
|
|
100
|
+
const client = getPersonalTokenClient(apiUrl);
|
|
101
|
+
if (!client.hasCredential())
|
|
102
|
+
return false;
|
|
103
|
+
try {
|
|
104
|
+
return Boolean(await client.getAccessToken());
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function cleanProjectConfig(candidate, dependencies) {
|
|
111
|
+
const displayPath = redactKeyMaterial(candidate.path);
|
|
112
|
+
const source = readSource(candidate.path);
|
|
113
|
+
if (source === null) {
|
|
114
|
+
return {
|
|
115
|
+
path: displayPath,
|
|
116
|
+
outcome: 'FAILED',
|
|
117
|
+
detail: 'Could not read the project config; it was left unchanged.',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
let config;
|
|
121
|
+
try {
|
|
122
|
+
const parsed = JSON.parse(source);
|
|
123
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
124
|
+
throw new Error('not an object');
|
|
125
|
+
config = parsed;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
return {
|
|
129
|
+
path: displayPath,
|
|
130
|
+
outcome: 'SKIPPED',
|
|
131
|
+
detail: 'The project config format was not recognized and was left unchanged.',
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
if (typeof config.teamId !== 'string' ||
|
|
135
|
+
config.teamId.length === 0 ||
|
|
136
|
+
typeof config.projectId !== 'string' ||
|
|
137
|
+
config.projectId.length === 0 ||
|
|
138
|
+
typeof config.apiKey !== 'string' ||
|
|
139
|
+
countKeyMaterial(config.apiKey) === 0) {
|
|
140
|
+
return {
|
|
141
|
+
path: displayPath,
|
|
142
|
+
outcome: 'SKIPPED',
|
|
143
|
+
detail: 'The project config did not contain a removable legacy apiKey field and was left unchanged.',
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
if (config.authMode !== 'personal-token') {
|
|
147
|
+
return {
|
|
148
|
+
path: displayPath,
|
|
149
|
+
outcome: 'SKIPPED',
|
|
150
|
+
detail: "The project has not completed personal-token migration. Run 'agentteams auth login' before removing its only credential.",
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
const apiUrl = typeof config.apiUrl === 'string' && config.apiUrl.length > 0 ? config.apiUrl : DEFAULT_API_URL;
|
|
154
|
+
const credentialCheck = dependencies.hasValidPersonalCredential ?? hasValidPersonalCredential;
|
|
155
|
+
if (!(await credentialCheck(apiUrl))) {
|
|
156
|
+
return {
|
|
157
|
+
path: displayPath,
|
|
158
|
+
outcome: 'SKIPPED',
|
|
159
|
+
detail: "No valid personal credential is available. Run 'agentteams auth login' and retry; the legacy apiKey was preserved.",
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
const next = { ...config };
|
|
163
|
+
delete next.apiKey;
|
|
164
|
+
try {
|
|
165
|
+
saveConfig(candidate.path, next);
|
|
166
|
+
return {
|
|
167
|
+
path: displayPath,
|
|
168
|
+
outcome: 'CLEANED',
|
|
169
|
+
detail: 'Removed only apiKey after validating the personal credential; all other project fields were preserved.',
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return {
|
|
174
|
+
path: displayPath,
|
|
175
|
+
outcome: 'FAILED',
|
|
176
|
+
detail: 'Could not atomically update the project config; it was left unchanged.',
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function cleanMcpConfig(candidate, context) {
|
|
181
|
+
const displayPath = redactKeyMaterial(candidate.path);
|
|
182
|
+
const editable = candidate.definitions.find((definition) => definition.format !== 'toml' && typeof definition.containerKey === 'string');
|
|
183
|
+
if (!editable?.containerKey) {
|
|
184
|
+
return {
|
|
185
|
+
path: displayPath,
|
|
186
|
+
outcome: 'SKIPPED',
|
|
187
|
+
detail: 'This config format has no safe comment-preserving editor; it was left unchanged.',
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
const source = readSource(candidate.path);
|
|
191
|
+
if (source === null) {
|
|
192
|
+
return { path: displayPath, outcome: 'FAILED', detail: 'Could not read the MCP config; it was left unchanged.' };
|
|
193
|
+
}
|
|
194
|
+
// Doctor cleans an entry it already owns; it never creates one. `upsertContainerEntry`
|
|
195
|
+
// below is an upsert, so reaching it with no existing entry would register an MCP
|
|
196
|
+
// server the user never asked for — in a file (`~/.claude.json` at user scope) that
|
|
197
|
+
// also holds unrelated history whose `key_` traces are what pulled it into the scan.
|
|
198
|
+
let existingEntry;
|
|
199
|
+
try {
|
|
200
|
+
existingEntry = readContainerEntry(source, editable.containerKey, MCP_SERVER_NAME);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
return {
|
|
204
|
+
path: displayPath,
|
|
205
|
+
outcome: 'SKIPPED',
|
|
206
|
+
detail: error instanceof McpConfigParseError
|
|
207
|
+
? 'The MCP config could not be parsed and was left unchanged.'
|
|
208
|
+
: 'The MCP config format was not recognized and was left unchanged.',
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
if (existingEntry === undefined) {
|
|
212
|
+
return {
|
|
213
|
+
path: displayPath,
|
|
214
|
+
outcome: 'SKIPPED',
|
|
215
|
+
detail: 'AgentTeams is not registered in this config, so nothing was inserted; the key material it holds belongs to another tool and needs manual removal.',
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
if (countKeyMaterial(JSON.stringify(existingEntry) ?? '') === 0) {
|
|
219
|
+
return {
|
|
220
|
+
path: displayPath,
|
|
221
|
+
outcome: 'SKIPPED',
|
|
222
|
+
detail: 'The AgentTeams entry was already secret-free; key material elsewhere in the file was left unchanged.',
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
let edited;
|
|
226
|
+
try {
|
|
227
|
+
edited = upsertContainerEntry(source, {
|
|
228
|
+
containerKey: editable.containerKey,
|
|
229
|
+
entryKey: MCP_SERVER_NAME,
|
|
230
|
+
entryValue: buildEntryValue(editable.entryShape ?? 'plain', buildServerSpec({ context })),
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
return {
|
|
235
|
+
path: displayPath,
|
|
236
|
+
outcome: 'SKIPPED',
|
|
237
|
+
detail: error instanceof McpConfigParseError
|
|
238
|
+
? 'The MCP config could not be parsed and was left unchanged.'
|
|
239
|
+
: 'The MCP config format was not recognized and was left unchanged.',
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
if (edited.unchanged) {
|
|
243
|
+
return {
|
|
244
|
+
path: displayPath,
|
|
245
|
+
outcome: 'SKIPPED',
|
|
246
|
+
detail: 'The AgentTeams entry was already secret-free; key material elsewhere in the file was left unchanged.',
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
const isUserScope = candidate.definitions.some((definition) => definition.scope === 'user');
|
|
250
|
+
const mode = isUserScope ? USER_SCOPE_FILE_MODE : PROJECT_SCOPE_FILE_MODE;
|
|
251
|
+
let written;
|
|
252
|
+
try {
|
|
253
|
+
written = writeConfigFileAtomically(candidate.path, edited.text, mode, isUserScope ? mode : undefined);
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return {
|
|
257
|
+
path: displayPath,
|
|
258
|
+
outcome: 'FAILED',
|
|
259
|
+
detail: 'Could not atomically update the MCP config; the remaining location is reported below.',
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
// The config is already rewritten at this point. A backup that refuses to unlink is a
|
|
263
|
+
// leftover copy to report, not a reason to tell the user the cleanup failed and have
|
|
264
|
+
// them repeat it.
|
|
265
|
+
let backupNote = '';
|
|
266
|
+
if (written.backupPath) {
|
|
267
|
+
try {
|
|
268
|
+
unlinkSync(written.backupPath);
|
|
269
|
+
}
|
|
270
|
+
catch {
|
|
271
|
+
backupNote = ` The pre-edit backup still holds the old key material and could not be removed; delete it manually: ${written.backupPath}`;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
const remaining = countKeyMaterial(readSource(candidate.path) ?? '');
|
|
275
|
+
return {
|
|
276
|
+
path: displayPath,
|
|
277
|
+
outcome: remaining === 0 ? 'CLEANED' : 'SKIPPED',
|
|
278
|
+
detail: (remaining === 0
|
|
279
|
+
? 'Rewrote only the AgentTeams MCP entry with the secret-free runtime spec.'
|
|
280
|
+
: 'The AgentTeams entry was cleaned, but unrelated key material remains and was not modified.') + backupNote,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
function cleanBackup(candidate) {
|
|
284
|
+
const displayPath = redactKeyMaterial(candidate.path);
|
|
285
|
+
if (!existsSync(candidate.path)) {
|
|
286
|
+
return { path: displayPath, outcome: 'CLEANED', detail: 'The stale AgentTeams backup was already removed.' };
|
|
287
|
+
}
|
|
288
|
+
const primarySource = candidate.primaryPath ? readSource(candidate.primaryPath) : null;
|
|
289
|
+
if (primarySource === null || countKeyMaterial(primarySource) > 0) {
|
|
290
|
+
return {
|
|
291
|
+
path: displayPath,
|
|
292
|
+
outcome: 'SKIPPED',
|
|
293
|
+
detail: 'The primary config is missing or still contains key material, so its recovery backup was preserved.',
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
try {
|
|
297
|
+
unlinkSync(candidate.path);
|
|
298
|
+
return {
|
|
299
|
+
path: displayPath,
|
|
300
|
+
outcome: 'CLEANED',
|
|
301
|
+
detail: 'Removed the stale AgentTeams backup after its primary was clean.',
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
return { path: displayPath, outcome: 'FAILED', detail: 'Could not remove the stale AgentTeams backup.' };
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
function renderFinding(finding) {
|
|
309
|
+
const clients = finding.clientIds.length > 0 ? ` (${finding.clientIds.join(', ')})` : '';
|
|
310
|
+
return `- ${finding.kind}: ${finding.path}${clients} — ${finding.occurrences} redacted key location(s)`;
|
|
311
|
+
}
|
|
312
|
+
function renderReport(report) {
|
|
313
|
+
const lines = [
|
|
314
|
+
`AgentTeams MCP doctor — scanned ${report.scannedFiles} existing config/backup file(s)`,
|
|
315
|
+
`Found ${report.findings.length} file(s) containing legacy key material.`,
|
|
316
|
+
...report.findings.map(renderFinding),
|
|
317
|
+
];
|
|
318
|
+
if (!report.confirmed) {
|
|
319
|
+
lines.push('');
|
|
320
|
+
lines.push('Audit only: no files were changed.');
|
|
321
|
+
if (report.findings.length > 0) {
|
|
322
|
+
lines.push('Re-run `agentteams mcp doctor --yes` to confirm the safe cleanup actions.');
|
|
323
|
+
}
|
|
324
|
+
return redactKeyMaterial(lines.join('\n'));
|
|
325
|
+
}
|
|
326
|
+
lines.push('');
|
|
327
|
+
lines.push('Confirmed cleanup results:');
|
|
328
|
+
lines.push(...report.cleanup.map((result) => `- [${result.outcome}] ${result.path} — ${result.detail}`));
|
|
329
|
+
lines.push('');
|
|
330
|
+
lines.push(`Remaining: ${report.remainingFindings.length} file(s) containing legacy key material.`);
|
|
331
|
+
lines.push(...report.remainingFindings.map(renderFinding));
|
|
332
|
+
return redactKeyMaterial(lines.join('\n'));
|
|
333
|
+
}
|
|
334
|
+
export async function runMcpDoctorCommand(options, dependencies = {}) {
|
|
335
|
+
const context = resolvePathContext(dependencies.context);
|
|
336
|
+
const candidates = buildCandidates(context);
|
|
337
|
+
const initial = scanCandidates(candidates);
|
|
338
|
+
if (!options.yes) {
|
|
339
|
+
const report = {
|
|
340
|
+
confirmed: false,
|
|
341
|
+
scannedFiles: initial.scannedFiles,
|
|
342
|
+
findings: initial.findings,
|
|
343
|
+
cleanup: [],
|
|
344
|
+
remainingFindings: initial.findings,
|
|
345
|
+
};
|
|
346
|
+
return { text: renderReport(report), json: report, exitCode: 0 };
|
|
347
|
+
}
|
|
348
|
+
const candidateByPath = new Map(candidates.map((candidate) => [redactKeyMaterial(candidate.path), candidate]));
|
|
349
|
+
const cleanup = [];
|
|
350
|
+
for (const finding of initial.findings.filter((item) => item.kind === 'project-config')) {
|
|
351
|
+
const candidate = candidateByPath.get(finding.path);
|
|
352
|
+
if (candidate)
|
|
353
|
+
cleanup.push(await cleanProjectConfig(candidate, dependencies));
|
|
354
|
+
}
|
|
355
|
+
for (const finding of initial.findings.filter((item) => item.kind === 'mcp-config')) {
|
|
356
|
+
const candidate = candidateByPath.get(finding.path);
|
|
357
|
+
if (candidate)
|
|
358
|
+
cleanup.push(cleanMcpConfig(candidate, context));
|
|
359
|
+
}
|
|
360
|
+
for (const finding of initial.findings.filter((item) => item.kind === 'backup')) {
|
|
361
|
+
const candidate = candidateByPath.get(finding.path);
|
|
362
|
+
if (candidate)
|
|
363
|
+
cleanup.push(cleanBackup(candidate));
|
|
364
|
+
}
|
|
365
|
+
const after = scanCandidates(candidates);
|
|
366
|
+
const report = {
|
|
367
|
+
confirmed: true,
|
|
368
|
+
scannedFiles: initial.scannedFiles,
|
|
369
|
+
findings: initial.findings,
|
|
370
|
+
cleanup,
|
|
371
|
+
remainingFindings: after.findings,
|
|
372
|
+
};
|
|
373
|
+
return {
|
|
374
|
+
text: renderReport(report),
|
|
375
|
+
json: report,
|
|
376
|
+
exitCode: after.findings.length === 0 ? 0 : 1,
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/mcp-registration/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,UAAU,EAAwB,MAAM,oBAAoB,CAAC;AAC1G,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,oBAAoB,EACpB,yBAAyB,GAC1B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAGnE;;;;;;;GAOG;AACH,MAAM,WAAW,GAAG,qDAAqD,CAAC;AA0D1E,SAAS,kBAAkB,CAAC,SAAmC;IAC7D,OAAO;QACL,OAAO,EAAE,SAAS,EAAE,OAAO,IAAI,OAAO,EAAE;QACxC,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QACpC,GAAG,EAAE,SAAS,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG;KACnC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,MAAc;IACtC,OAAO,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,OAAuB;IAC9C,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IACpD,MAAM,iBAAiB,GAAG,iBAAiB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEzD,IAAI,iBAAiB,EAAE,CAAC;QACtB,UAAU,CAAC,GAAG,CAAC,iBAAiB,EAAE;YAChC,IAAI,EAAE,iBAAiB;YACvB,IAAI,EAAE,gBAAgB;YACtB,WAAW,EAAE,EAAE;SAChB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,SAAS,CAAU,EAAE,CAAC;YACjD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,IAAI,GAAG,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAqB,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;YACjG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC;gBACzB,QAAQ,EAAE,MAAM,CAAC,EAAE;gBACnB,KAAK;gBACL,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,YAAY,EAAE,UAAU,CAAC,YAAY;gBACrC,UAAU,EAAE,UAAU,CAAC,UAAU;aAClC,CAAC,CAAC;YACH,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QAC/C,MAAM,UAAU,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,aAAa,EAAE,CAAC;QACrD,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE;YACzB,IAAI,EAAE,UAAU;YAChB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,WAAW,EAAE,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;SACtC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,cAAc,CAAC,UAA2B;IACjD,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,QAAQ,GAAuB,EAAE,CAAC;IAExC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC;YAAE,SAAS;QAC1C,YAAY,IAAI,CAAC,CAAC;QAClB,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,MAAM,KAAK,IAAI;YAAE,SAAS;QAC9B,MAAM,WAAW,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,WAAW,KAAK,CAAC;YAAE,SAAS;QAEhC,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC;YACvC,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,WAAW;YACX,SAAS,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvF,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;SAClF,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,0BAA0B,CAAC,MAAc;IACtD,MAAM,MAAM,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,CAAC;QACH,OAAO,OAAO,CAAC,MAAM,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,SAAwB,EACxB,YAAmC;IAEnC,MAAM,WAAW,GAAG,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,2DAA2D;SACpE,CAAC;IACJ,CAAC;IAED,IAAI,MAA+B,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAY,CAAC;QAC7C,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAC7G,MAAM,GAAG,MAAiC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,sEAAsE;SAC/E,CAAC;IACJ,CAAC;IAED,IACE,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QACjC,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAC1B,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ;QACpC,MAAM,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;QAC7B,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;QACjC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EACrC,CAAC;QACD,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,4FAA4F;SACrG,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,gBAAgB,EAAE,CAAC;QACzC,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,SAAS;YAClB,MAAM,EACJ,0HAA0H;SAC7H,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC;IAC/G,MAAM,eAAe,GAAG,YAAY,CAAC,0BAA0B,IAAI,0BAA0B,CAAC;IAC9F,IAAI,CAAC,CAAC,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;QACrC,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,SAAS;YAClB,MAAM,EACJ,oHAAoH;SACvH,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,EAAE,GAAG,MAAM,EAAE,CAAC;IAC3B,OAAO,IAAI,CAAC,MAAM,CAAC;IACnB,IAAI,CAAC;QACH,UAAU,CAAC,SAAS,CAAC,IAAI,EAAE,IAAuB,CAAC,CAAC;QACpD,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,wGAAwG;SACjH,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,wEAAwE;SACjF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,SAAwB,EAAE,OAAuB;IACvE,MAAM,WAAW,GAAG,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CACzC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,IAAI,OAAO,UAAU,CAAC,YAAY,KAAK,QAAQ,CAC5F,CAAC;IACF,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,kFAAkF;SAC3F,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC1C,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,uDAAuD,EAAE,CAAC;IACnH,CAAC;IAED,uFAAuF;IACvF,kFAAkF;IAClF,oFAAoF;IACpF,qFAAqF;IACrF,IAAI,aAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,aAAa,GAAG,kBAAkB,CAAC,MAAM,EAAE,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACrF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,SAAS;YAClB,MAAM,EACJ,KAAK,YAAY,mBAAmB;gBAClC,CAAC,CAAC,4DAA4D;gBAC9D,CAAC,CAAC,kEAAkE;SACzE,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,SAAS;YAClB,MAAM,EACJ,mJAAmJ;SACtJ,CAAC;IACJ,CAAC;IAED,IAAI,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,sGAAsG;SAC/G,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE;YACpC,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,QAAQ,EAAE,eAAe;YACzB,UAAU,EAAE,eAAe,CAAC,QAAQ,CAAC,UAAU,IAAI,OAAO,EAAE,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;SAC1F,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,SAAS;YAClB,MAAM,EACJ,KAAK,YAAY,mBAAmB;gBAClC,CAAC,CAAC,4DAA4D;gBAC9D,CAAC,CAAC,kEAAkE;SACzE,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,sGAAsG;SAC/G,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC;IAC5F,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,uBAAuB,CAAC;IAE1E,IAAI,OAAO,CAAC;IACZ,IAAI,CAAC;QACH,OAAO,GAAG,yBAAyB,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACzG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,uFAAuF;SAChG,CAAC;IACJ,CAAC;IAED,sFAAsF;IACtF,qFAAqF;IACrF,kBAAkB;IAClB,IAAI,UAAU,GAAG,EAAE,CAAC;IACpB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,UAAU,GAAG,uGAAuG,OAAO,CAAC,UAAU,EAAE,CAAC;QAC3I,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;QAChD,MAAM,EACJ,CAAC,SAAS,KAAK,CAAC;YACd,CAAC,CAAC,0EAA0E;YAC5E,CAAC,CAAC,4FAA4F,CAAC,GAAG,UAAU;KACjH,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,SAAwB;IAC3C,MAAM,WAAW,GAAG,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,kDAAkD,EAAE,CAAC;IAC/G,CAAC;IAED,MAAM,aAAa,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACvF,IAAI,aAAa,KAAK,IAAI,IAAI,gBAAgB,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;QAClE,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,qGAAqG;SAC9G,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,SAAS;YAClB,MAAM,EAAE,kEAAkE;SAC3E,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,+CAA+C,EAAE,CAAC;IAC3G,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAAyB;IAC9C,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACzF,OAAO,KAAK,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,GAAG,OAAO,MAAM,OAAO,CAAC,WAAW,2BAA2B,CAAC;AAC1G,CAAC;AAED,SAAS,YAAY,CAAC,MAAuB;IAC3C,MAAM,KAAK,GAAG;QACZ,mCAAmC,MAAM,CAAC,YAAY,iCAAiC;QACvF,SAAS,MAAM,CAAC,QAAQ,CAAC,MAAM,0CAA0C;QACzE,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;KACtC,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,iBAAiB,CAAC,MAAM,0CAA0C,CAAC,CAAC;IACpG,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,iBAAiB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAC3D,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAgC,EAChC,eAAsC,EAAE;IAExC,MAAM,OAAO,GAAG,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IAE3C,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,MAAM,GAAoB;YAC9B,SAAS,EAAE,KAAK;YAChB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,EAAE;YACX,iBAAiB,EAAE,OAAO,CAAC,QAAQ;SACpC,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAC/G,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,EAAE,CAAC;QACxF,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,MAAM,kBAAkB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;IACjF,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,EAAE,CAAC;QACpF,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,EAAE,CAAC;QAChF,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpD,IAAI,SAAS;YAAE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,MAAM,GAAoB;QAC9B,SAAS,EAAE,IAAI;QACf,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO;QACP,iBAAiB,EAAE,KAAK,CAAC,QAAQ;KAClC,CAAC;IACF,OAAO;QACL,IAAI,EAAE,YAAY,CAAC,MAAM,CAAC;QAC1B,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC9C,CAAC;AACJ,CAAC"}
|
|
@@ -4,9 +4,11 @@ import type { McpPathContext } from './types.js';
|
|
|
4
4
|
import type { VendorRunner } from './vendorCommand.js';
|
|
5
5
|
export { MCP_CLIENTS, findClient, listClientIds } from './clients.js';
|
|
6
6
|
export { detectClients } from './detect.js';
|
|
7
|
+
export { runMcpDoctorCommand } from './doctor.js';
|
|
8
|
+
export type { McpDoctorCleanup, McpDoctorCommandOptions, McpDoctorCommandOutput, McpDoctorDependencies, McpDoctorFinding, McpDoctorReport, } from './doctor.js';
|
|
7
9
|
export { buildBatchPlan, installClient, resolveInstallExitCode, runBatchInstall } from './install.js';
|
|
8
|
-
export { renderConfigSnippet, renderVendorCommandLine,
|
|
9
|
-
export { buildServerSpec, MCP_SERVER_NAME
|
|
10
|
+
export { renderConfigSnippet, renderVendorCommandLine, redactKeyMaterial } from './render.js';
|
|
11
|
+
export { buildServerSpec, MCP_SERVER_NAME } from './serverSpec.js';
|
|
10
12
|
export type { McpCredentials } from './serverSpec.js';
|
|
11
13
|
export * from './types.js';
|
|
12
14
|
declare const MCP_CLIENT_ID_LIST: ("claude-code" | "codex" | "copilot-cli" | "opencode" | "amp" | "cursor-cli" | "kimi-cli" | "antigravity")[];
|
|
@@ -35,9 +37,9 @@ export interface CommandOutput {
|
|
|
35
37
|
}
|
|
36
38
|
/**
|
|
37
39
|
* `config` is the escape hatch: it renders the exact fragment each client
|
|
38
|
-
* expects and never touches a file, a vendor CLI or the network. The
|
|
39
|
-
*
|
|
40
|
-
*
|
|
40
|
+
* expects and never touches a file, a vendor CLI or the network. The spawned
|
|
41
|
+
* server resolves local project identity and credentials for itself, so the
|
|
42
|
+
* fragment is safe to paste without any environment values.
|
|
41
43
|
*/
|
|
42
44
|
export declare function runMcpConfigCommand(options: McpRegistrationCommandOptions, dependencies?: McpRegistrationDependencies): CommandOutput;
|
|
43
45
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp-registration/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD,OAAO,EAAoC,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,KAAK,EAA8B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp-registration/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD,OAAO,EAAoC,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,KAAK,EAA8B,cAAc,EAA2B,MAAM,YAAY,CAAC;AACtG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EACV,gBAAgB,EAChB,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,sBAAsB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC9F,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACnE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,cAAc,YAAY,CAAC;AAE3B,QAAA,MAAM,kBAAkB,8GAAkB,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAE9B,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,iFAAiF;AACjF,MAAM,WAAW,2BAA2B;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,qBAAqB,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;CAClB;AAgED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,6BAA6B,EACtC,YAAY,CAAC,EAAE,2BAA2B,GACzC,aAAa,CA4Cf;AAsBD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,6BAA6B,EACtC,YAAY,CAAC,EAAE,2BAA2B,GACzC,aAAa,CAmGf"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { homedir } from 'node:os';
|
|
2
|
-
import { getConfigurationNotFoundMessage,
|
|
2
|
+
import { getConfigurationNotFoundMessage, loadConfigIdentity } from '../utils/config.js';
|
|
3
3
|
import { buildConfigOverrides } from '../utils/apiContext.js';
|
|
4
4
|
import { findClient, listClientIds } from './clients.js';
|
|
5
5
|
import { buildBatchPlan, installClient, resolveInstallExitCode, runBatchInstall } from './install.js';
|
|
@@ -7,23 +7,34 @@ import { renderConfigSnippet, renderVendorCommandLine } from './render.js';
|
|
|
7
7
|
import { buildServerSpec, MCP_SERVER_NAME } from './serverSpec.js';
|
|
8
8
|
export { MCP_CLIENTS, findClient, listClientIds } from './clients.js';
|
|
9
9
|
export { detectClients } from './detect.js';
|
|
10
|
+
export { runMcpDoctorCommand } from './doctor.js';
|
|
10
11
|
export { buildBatchPlan, installClient, resolveInstallExitCode, runBatchInstall } from './install.js';
|
|
11
|
-
export { renderConfigSnippet, renderVendorCommandLine,
|
|
12
|
-
export { buildServerSpec, MCP_SERVER_NAME
|
|
12
|
+
export { renderConfigSnippet, renderVendorCommandLine, redactKeyMaterial } from './render.js';
|
|
13
|
+
export { buildServerSpec, MCP_SERVER_NAME } from './serverSpec.js';
|
|
13
14
|
export * from './types.js';
|
|
14
15
|
const MCP_CLIENT_ID_LIST = listClientIds();
|
|
15
16
|
export { MCP_CLIENT_ID_LIST };
|
|
17
|
+
/**
|
|
18
|
+
* What goes into a client's config file.
|
|
19
|
+
*
|
|
20
|
+
* Registration uses identity only for command context and human-readable
|
|
21
|
+
* output. The generated server spec never receives these values:
|
|
22
|
+
* `agentteams mcp` resolves project identity and credentials at request time.
|
|
23
|
+
*/
|
|
16
24
|
function resolveCredentials(options, dependencies) {
|
|
17
25
|
if (dependencies?.credentials)
|
|
18
26
|
return dependencies.credentials;
|
|
19
|
-
const
|
|
20
|
-
|
|
27
|
+
const overrides = buildConfigOverrides(options);
|
|
28
|
+
const identity = loadConfigIdentity(overrides);
|
|
29
|
+
if (!identity)
|
|
21
30
|
throw new Error(getConfigurationNotFoundMessage());
|
|
31
|
+
// Identity only. Asking for a credential plan here would be dead work — the spec
|
|
32
|
+
// embeds nothing — and it would attach a side effect (the legacy `key_` warning)
|
|
33
|
+
// to `mcp config`, which renders a snippet and touches no file.
|
|
22
34
|
return {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
apiUrl: config.apiUrl,
|
|
35
|
+
projectId: identity.projectId,
|
|
36
|
+
teamId: identity.teamId,
|
|
37
|
+
apiUrl: identity.apiUrl,
|
|
27
38
|
};
|
|
28
39
|
}
|
|
29
40
|
function resolvePathContext(overrides) {
|
|
@@ -40,6 +51,18 @@ function parseScope(value) {
|
|
|
40
51
|
return value;
|
|
41
52
|
throw new Error(`Unsupported scope: ${String(value)}. Use "user" or "project".`);
|
|
42
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* Say which runtime the entry will spawn, so the choice is never silent.
|
|
56
|
+
*
|
|
57
|
+
* The bare executable is the fast path; `npx` is what a machine without a global install
|
|
58
|
+
* gets. Either way the user sees the reason here instead of discovering it as a client-side
|
|
59
|
+
* "server failed to start" (or as an unexplained cold start on every request).
|
|
60
|
+
*/
|
|
61
|
+
function describeRuntime(spec) {
|
|
62
|
+
return spec.command === 'npx'
|
|
63
|
+
? 'No global `agentteams` was found on PATH, so the entry runs the published package with npx. Run `npm install -g @agentteams/cli` and re-register for a faster start.'
|
|
64
|
+
: 'The entry runs the globally installed `agentteams` executable.';
|
|
65
|
+
}
|
|
43
66
|
function parseClientId(value) {
|
|
44
67
|
const client = findClient(value);
|
|
45
68
|
if (!client) {
|
|
@@ -49,16 +72,16 @@ function parseClientId(value) {
|
|
|
49
72
|
}
|
|
50
73
|
/**
|
|
51
74
|
* `config` is the escape hatch: it renders the exact fragment each client
|
|
52
|
-
* expects and never touches a file, a vendor CLI or the network. The
|
|
53
|
-
*
|
|
54
|
-
*
|
|
75
|
+
* expects and never touches a file, a vendor CLI or the network. The spawned
|
|
76
|
+
* server resolves local project identity and credentials for itself, so the
|
|
77
|
+
* fragment is safe to paste without any environment values.
|
|
55
78
|
*/
|
|
56
79
|
export function runMcpConfigCommand(options, dependencies) {
|
|
57
80
|
const credentials = resolveCredentials(options, dependencies);
|
|
58
81
|
const context = resolvePathContext(dependencies?.context);
|
|
59
82
|
const scope = parseScope(options.scope);
|
|
60
83
|
const clientIds = options.client ? [parseClientId(options.client)] : MCP_CLIENT_ID_LIST;
|
|
61
|
-
const spec = buildServerSpec({
|
|
84
|
+
const spec = buildServerSpec({ serverEntry: options.serverEntry, context });
|
|
62
85
|
const sections = clientIds.map((clientId) => {
|
|
63
86
|
const client = findClient(clientId);
|
|
64
87
|
if (!client)
|
|
@@ -80,7 +103,8 @@ export function runMcpConfigCommand(options, dependencies) {
|
|
|
80
103
|
});
|
|
81
104
|
const lines = [
|
|
82
105
|
`AgentTeams MCP config (${scope} scope) — project ${credentials.projectId}, team ${credentials.teamId}`,
|
|
83
|
-
'
|
|
106
|
+
'No credentials or project binding are embedded. The MCP server resolves local configuration and the OS credential store at request time.',
|
|
107
|
+
describeRuntime(spec),
|
|
84
108
|
];
|
|
85
109
|
for (const section of sections) {
|
|
86
110
|
lines.push('');
|
|
@@ -115,7 +139,6 @@ function summarize(results) {
|
|
|
115
139
|
failed: results.filter((r) => r.outcome === 'FAILED').length,
|
|
116
140
|
};
|
|
117
141
|
}
|
|
118
|
-
const USER_SCOPE_BINDING_WARNING = 'Warning: a user-scope registration is machine-wide. If this client already has an "agentteams" server pointing at a different AgentTeams project, applying this plan re-points it.';
|
|
119
142
|
/**
|
|
120
143
|
* `install` has two modes:
|
|
121
144
|
* - `--client <id>`: apply a single client/scope (project scope allowed here).
|
|
@@ -141,9 +164,9 @@ export function runMcpInstallCommand(options, dependencies) {
|
|
|
141
164
|
const lines = [
|
|
142
165
|
`AgentTeams MCP install — ${client.label} (${scope} scope)`,
|
|
143
166
|
`Project ${credentials.projectId}, team ${credentials.teamId}`,
|
|
167
|
+
'The server entry contains no credentials or project binding; runtime resolution uses local configuration and the OS credential store.',
|
|
168
|
+
describeRuntime(buildServerSpec({ serverEntry: options.serverEntry, context })),
|
|
144
169
|
];
|
|
145
|
-
if (scope === 'user')
|
|
146
|
-
lines.push(USER_SCOPE_BINDING_WARNING);
|
|
147
170
|
lines.push(renderResultLine(result));
|
|
148
171
|
if (result.backupPath)
|
|
149
172
|
lines.push(`Backup: ${result.backupPath}`);
|
|
@@ -170,10 +193,10 @@ export function runMcpInstallCommand(options, dependencies) {
|
|
|
170
193
|
const lines = [
|
|
171
194
|
'AgentTeams MCP install — dry run (no files were changed)',
|
|
172
195
|
`Plan: register "${MCP_SERVER_NAME}" at ${scope} scope for project ${plan.binding.projectId}, team ${plan.binding.teamId}`,
|
|
196
|
+
'The server entries contain no credentials or project binding; runtime resolution uses local configuration and the OS credential store.',
|
|
197
|
+
describeRuntime(buildServerSpec({ serverEntry: options.serverEntry, context })),
|
|
173
198
|
'',
|
|
174
199
|
];
|
|
175
|
-
if (scope === 'user')
|
|
176
|
-
lines.splice(2, 0, USER_SCOPE_BINDING_WARNING);
|
|
177
200
|
for (const entry of plan.entries) {
|
|
178
201
|
lines.push(`- ${entry.clientId} [${entry.applicable ? 'will apply' : 'skip'}] ${formatDetectionEvidence(entry)}`);
|
|
179
202
|
lines.push(` target: ${entry.targetPath} via ${entry.strategy}`);
|
|
@@ -189,20 +212,22 @@ export function runMcpInstallCommand(options, dependencies) {
|
|
|
189
212
|
const { plan, results } = runBatchInstall({
|
|
190
213
|
context,
|
|
191
214
|
credentials,
|
|
215
|
+
scope,
|
|
192
216
|
serverEntry: options.serverEntry,
|
|
193
217
|
vendorRunner: dependencies?.vendorRunner,
|
|
194
218
|
detectionDependencies: dependencies?.detectionDependencies,
|
|
195
219
|
});
|
|
196
220
|
const summary = summarize(results);
|
|
197
221
|
const lines = [
|
|
198
|
-
`AgentTeams MCP install — applied at
|
|
222
|
+
`AgentTeams MCP install — applied at ${scope} scope for project ${plan.binding.projectId}, team ${plan.binding.teamId}`,
|
|
223
|
+
describeRuntime(buildServerSpec({ serverEntry: options.serverEntry, context })),
|
|
199
224
|
...results.map(renderResultLine),
|
|
200
225
|
'',
|
|
201
226
|
`Summary: ${summary.applied} registered, ${summary.skipped} skipped, ${summary.failed} failed.`,
|
|
202
227
|
];
|
|
203
228
|
return {
|
|
204
229
|
text: lines.join('\n'),
|
|
205
|
-
json: { scope
|
|
230
|
+
json: { scope, dryRun: false, plan, results, summary },
|
|
206
231
|
exitCode: resolveInstallExitCode(results),
|
|
207
232
|
};
|
|
208
233
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp-registration/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,+BAA+B,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp-registration/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/mcp-registration/install.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/mcp-registration/install.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,EAAsC,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC/G,OAAO,EAAoC,KAAK,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,mBAAmB,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAChH,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEzE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,KAAK,EAAE,QAAQ,CAAC;IAChB,WAAW,EAAE,cAAc,CAAC;IAC5B,OAAO,EAAE,cAAc,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAyJD,wFAAwF;AACxF,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa,CA6B1E;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,CAAC;IACtC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,KAAK,EAAE,QAAQ,CAAC;IAChB,QAAQ,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,mFAAmF;IACnF,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,cAAc,CAAC;IACxB,WAAW,EAAE,cAAc,CAAC;IAC5B,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,qBAAqB,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC;CAChE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,SAAS,CAkCxE;AAED,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;IACnE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,aAAa,EAAE,CAAA;CAAE,CAmC9G;AAED,kGAAkG;AAClG,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,MAAM,CAEvE;AAED,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,CAAC"}
|