@agents-dev/cli 0.7.7

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.
Files changed (152) hide show
  1. package/AGENTS.md +400 -0
  2. package/CHANGELOG.md +297 -0
  3. package/CONTRIBUTING.md +164 -0
  4. package/LICENSE +21 -0
  5. package/README.md +117 -0
  6. package/bin/agents +24 -0
  7. package/dist/cli.d.ts +1 -0
  8. package/dist/cli.js +282 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/connect.d.ts +7 -0
  11. package/dist/commands/connect.js +48 -0
  12. package/dist/commands/connect.js.map +1 -0
  13. package/dist/commands/disconnect.d.ts +7 -0
  14. package/dist/commands/disconnect.js +47 -0
  15. package/dist/commands/disconnect.js.map +1 -0
  16. package/dist/commands/doctor.d.ts +6 -0
  17. package/dist/commands/doctor.js +430 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/init.d.ts +5 -0
  20. package/dist/commands/init.js +24 -0
  21. package/dist/commands/init.js.map +1 -0
  22. package/dist/commands/mcp-add.d.ts +20 -0
  23. package/dist/commands/mcp-add.js +250 -0
  24. package/dist/commands/mcp-add.js.map +1 -0
  25. package/dist/commands/mcp-import.d.ts +13 -0
  26. package/dist/commands/mcp-import.js +207 -0
  27. package/dist/commands/mcp-import.js.map +1 -0
  28. package/dist/commands/mcp-list.d.ts +5 -0
  29. package/dist/commands/mcp-list.js +34 -0
  30. package/dist/commands/mcp-list.js.map +1 -0
  31. package/dist/commands/mcp-remove.d.ts +7 -0
  32. package/dist/commands/mcp-remove.js +34 -0
  33. package/dist/commands/mcp-remove.js.map +1 -0
  34. package/dist/commands/mcp-test.d.ts +8 -0
  35. package/dist/commands/mcp-test.js +402 -0
  36. package/dist/commands/mcp-test.js.map +1 -0
  37. package/dist/commands/reset.d.ts +6 -0
  38. package/dist/commands/reset.js +76 -0
  39. package/dist/commands/reset.js.map +1 -0
  40. package/dist/commands/start.d.ts +6 -0
  41. package/dist/commands/start.js +292 -0
  42. package/dist/commands/start.js.map +1 -0
  43. package/dist/commands/status.d.ts +7 -0
  44. package/dist/commands/status.js +278 -0
  45. package/dist/commands/status.js.map +1 -0
  46. package/dist/commands/sync.d.ts +6 -0
  47. package/dist/commands/sync.js +22 -0
  48. package/dist/commands/sync.js.map +1 -0
  49. package/dist/commands/watch.d.ts +7 -0
  50. package/dist/commands/watch.js +117 -0
  51. package/dist/commands/watch.js.map +1 -0
  52. package/dist/core/claudeCli.d.ts +7 -0
  53. package/dist/core/claudeCli.js +35 -0
  54. package/dist/core/claudeCli.js.map +1 -0
  55. package/dist/core/config.d.ts +17 -0
  56. package/dist/core/config.js +121 -0
  57. package/dist/core/config.js.map +1 -0
  58. package/dist/core/cursorCli.d.ts +9 -0
  59. package/dist/core/cursorCli.js +60 -0
  60. package/dist/core/cursorCli.js.map +1 -0
  61. package/dist/core/fs.d.ts +11 -0
  62. package/dist/core/fs.js +76 -0
  63. package/dist/core/fs.js.map +1 -0
  64. package/dist/core/gitignore.d.ts +3 -0
  65. package/dist/core/gitignore.js +54 -0
  66. package/dist/core/gitignore.js.map +1 -0
  67. package/dist/core/mcp.d.ts +8 -0
  68. package/dist/core/mcp.js +134 -0
  69. package/dist/core/mcp.js.map +1 -0
  70. package/dist/core/mcpCrud.d.ts +34 -0
  71. package/dist/core/mcpCrud.js +105 -0
  72. package/dist/core/mcpCrud.js.map +1 -0
  73. package/dist/core/mcpImport.d.ts +14 -0
  74. package/dist/core/mcpImport.js +507 -0
  75. package/dist/core/mcpImport.js.map +1 -0
  76. package/dist/core/mcpSecrets.d.ts +27 -0
  77. package/dist/core/mcpSecrets.js +144 -0
  78. package/dist/core/mcpSecrets.js.map +1 -0
  79. package/dist/core/mcpValidation.d.ts +19 -0
  80. package/dist/core/mcpValidation.js +78 -0
  81. package/dist/core/mcpValidation.js.map +1 -0
  82. package/dist/core/paths.d.ts +37 -0
  83. package/dist/core/paths.js +43 -0
  84. package/dist/core/paths.js.map +1 -0
  85. package/dist/core/project.d.ts +16 -0
  86. package/dist/core/project.js +34 -0
  87. package/dist/core/project.js.map +1 -0
  88. package/dist/core/renderers.d.ts +14 -0
  89. package/dist/core/renderers.js +113 -0
  90. package/dist/core/renderers.js.map +1 -0
  91. package/dist/core/shell.d.ts +8 -0
  92. package/dist/core/shell.js +21 -0
  93. package/dist/core/shell.js.map +1 -0
  94. package/dist/core/shellWords.d.ts +1 -0
  95. package/dist/core/shellWords.js +84 -0
  96. package/dist/core/shellWords.js.map +1 -0
  97. package/dist/core/skills.d.ts +8 -0
  98. package/dist/core/skills.js +150 -0
  99. package/dist/core/skills.js.map +1 -0
  100. package/dist/core/skillsValidation.d.ts +1 -0
  101. package/dist/core/skillsValidation.js +68 -0
  102. package/dist/core/skillsValidation.js.map +1 -0
  103. package/dist/core/sync.d.ts +2 -0
  104. package/dist/core/sync.js +427 -0
  105. package/dist/core/sync.js.map +1 -0
  106. package/dist/core/syncLock.d.ts +1 -0
  107. package/dist/core/syncLock.js +84 -0
  108. package/dist/core/syncLock.js.map +1 -0
  109. package/dist/core/templates.d.ts +1 -0
  110. package/dist/core/templates.js +38 -0
  111. package/dist/core/templates.js.map +1 -0
  112. package/dist/core/trust.d.ts +7 -0
  113. package/dist/core/trust.js +51 -0
  114. package/dist/core/trust.js.map +1 -0
  115. package/dist/core/vscodeSettings.d.ts +17 -0
  116. package/dist/core/vscodeSettings.js +212 -0
  117. package/dist/core/vscodeSettings.js.map +1 -0
  118. package/dist/core/warnings.d.ts +2 -0
  119. package/dist/core/warnings.js +26 -0
  120. package/dist/core/warnings.js.map +1 -0
  121. package/dist/integrations/antigravity.d.ts +9 -0
  122. package/dist/integrations/antigravity.js +13 -0
  123. package/dist/integrations/antigravity.js.map +1 -0
  124. package/dist/integrations/claude.d.ts +1 -0
  125. package/dist/integrations/claude.js +4 -0
  126. package/dist/integrations/claude.js.map +1 -0
  127. package/dist/integrations/codex.d.ts +5 -0
  128. package/dist/integrations/codex.js +5 -0
  129. package/dist/integrations/codex.js.map +1 -0
  130. package/dist/integrations/copilotVscode.d.ts +7 -0
  131. package/dist/integrations/copilotVscode.js +9 -0
  132. package/dist/integrations/copilotVscode.js.map +1 -0
  133. package/dist/integrations/cursor.d.ts +7 -0
  134. package/dist/integrations/cursor.js +9 -0
  135. package/dist/integrations/cursor.js.map +1 -0
  136. package/dist/integrations/gemini.d.ts +12 -0
  137. package/dist/integrations/gemini.js +15 -0
  138. package/dist/integrations/gemini.js.map +1 -0
  139. package/dist/integrations/registry.d.ts +9 -0
  140. package/dist/integrations/registry.js +21 -0
  141. package/dist/integrations/registry.js.map +1 -0
  142. package/dist/types.d.ts +85 -0
  143. package/dist/types.js +2 -0
  144. package/dist/types.js.map +1 -0
  145. package/docs/EXAMPLES.md +211 -0
  146. package/docs/README.md +26 -0
  147. package/docs/agents-system.md +178 -0
  148. package/package.json +77 -0
  149. package/templates/agents/AGENTS.md +23 -0
  150. package/templates/agents/README.md +25 -0
  151. package/templates/agents/skills/README.md +27 -0
  152. package/templates/agents/skills/skill-guide/SKILL.md +29 -0
@@ -0,0 +1,250 @@
1
+ import * as clack from '@clack/prompts';
2
+ import { loadAgentsConfig } from '../core/config.js';
3
+ import { upsertMcpServers } from '../core/mcpCrud.js';
4
+ import { inferSecretArgs, splitServerSecrets } from '../core/mcpSecrets.js';
5
+ import { runMcpImport } from './mcp-import.js';
6
+ import { parseKeyValue, parseSecretArg, parseTargetOptions, resolveDefaultTargets, validateEnvKey, validateHeaderKey, validateServerName, validateTransport } from '../core/mcpValidation.js';
7
+ import { performSync } from '../core/sync.js';
8
+ import { formatWarnings } from '../core/warnings.js';
9
+ import { parseShellWords } from '../core/shellWords.js';
10
+ export async function runMcpAdd(options) {
11
+ const nameInput = options.name?.trim();
12
+ if (nameInput && isHttpUrl(nameInput)) {
13
+ ensureNoInlineAddFlagsForUrl(options);
14
+ process.stdout.write(`Detected MCP source URL. Running import flow for ${nameInput}...\n`);
15
+ await runMcpImport({
16
+ projectRoot: options.projectRoot,
17
+ url: nameInput,
18
+ targets: options.targets,
19
+ replace: options.replace,
20
+ noSync: options.noSync,
21
+ nonInteractive: options.nonInteractive
22
+ });
23
+ return;
24
+ }
25
+ const config = await loadAgentsConfig(options.projectRoot);
26
+ let name = nameInput ?? '';
27
+ let transport = options.transport ? validateTransport(options.transport) : undefined;
28
+ let command = options.command?.trim();
29
+ let url = options.url?.trim();
30
+ let args = [...(options.args ?? [])];
31
+ if (!options.nonInteractive) {
32
+ if (!name) {
33
+ name = await promptText('MCP server name', 'context7');
34
+ if (isHttpUrl(name)) {
35
+ ensureNoInlineAddFlagsForUrl(options);
36
+ process.stdout.write(`Detected MCP source URL. Running import flow for ${name}...\n`);
37
+ await runMcpImport({
38
+ projectRoot: options.projectRoot,
39
+ url: name,
40
+ targets: options.targets,
41
+ replace: options.replace,
42
+ noSync: options.noSync,
43
+ nonInteractive: options.nonInteractive
44
+ });
45
+ return;
46
+ }
47
+ }
48
+ if (!transport) {
49
+ const selected = await promptSelect('Transport', [
50
+ { label: 'stdio', value: 'stdio' },
51
+ { label: 'http', value: 'http' },
52
+ { label: 'sse', value: 'sse' }
53
+ ]);
54
+ transport = selected;
55
+ }
56
+ if (transport === 'stdio' && !command) {
57
+ command = await promptText('Command', 'npx');
58
+ }
59
+ if ((transport === 'http' || transport === 'sse') && !url) {
60
+ url = await promptText('URL', 'https://example.com/mcp');
61
+ }
62
+ if (transport === 'stdio' && args.length === 0) {
63
+ const raw = await promptOptionalText('Args (space-separated, optional)');
64
+ args = parseShellWords(raw);
65
+ }
66
+ }
67
+ if (!name) {
68
+ throw new Error('MCP server name is required.');
69
+ }
70
+ validateServerName(name);
71
+ const finalTransport = transport ?? validateTransport('stdio');
72
+ if (finalTransport === 'stdio' && !command) {
73
+ throw new Error('Missing --command for stdio transport.');
74
+ }
75
+ if ((finalTransport === 'http' || finalTransport === 'sse') && !url) {
76
+ throw new Error('Missing --url for http/sse transport.');
77
+ }
78
+ const parsedTargets = parseTargetOptions(options.targets);
79
+ const defaultTargets = resolveDefaultTargets(config);
80
+ const targets = parsedTargets.length > 0 ? parsedTargets : defaultTargets.targets;
81
+ const envMap = toMap(options.env, 'env', (key) => validateEnvKey(key, 'environment variable'));
82
+ const headerMap = toMap(options.headers, 'header', (key) => validateHeaderKey(key, 'header'));
83
+ const explicitSecretEnv = toMap(options.secretEnv, 'secret env', (key) => validateEnvKey(key, 'secret environment variable'));
84
+ const explicitSecretHeaders = toMap(options.secretHeaders, 'secret header', (key) => validateHeaderKey(key, 'secret header'));
85
+ const explicitSecretArgs = (options.secretArgs ?? []).map(parseSecretArg);
86
+ if (explicitSecretArgs.length > 0 && args.length === 0) {
87
+ throw new Error('Cannot use --secret-arg without --arg values.');
88
+ }
89
+ const baseServer = {
90
+ transport: finalTransport,
91
+ enabled: !options.disabled,
92
+ targets
93
+ };
94
+ if (options.description?.trim()) {
95
+ baseServer.description = options.description.trim();
96
+ }
97
+ if (finalTransport === 'stdio') {
98
+ baseServer.command = command;
99
+ if (args.length > 0)
100
+ baseServer.args = args;
101
+ }
102
+ else {
103
+ baseServer.url = url;
104
+ }
105
+ if (Object.keys(envMap).length > 0)
106
+ baseServer.env = envMap;
107
+ if (Object.keys(headerMap).length > 0)
108
+ baseServer.headers = headerMap;
109
+ const inferredSecretArgIndexes = inferSecretArgs(baseServer.args ?? []);
110
+ const inferredSecretArgs = inferredSecretArgIndexes.map((index) => ({
111
+ index,
112
+ value: (baseServer.args ?? [])[index]
113
+ }));
114
+ const mergedSecretArgs = mergeSecretArgs(explicitSecretArgs, inferredSecretArgs);
115
+ const split = splitServerSecrets({
116
+ name,
117
+ server: baseServer,
118
+ secretEnv: explicitSecretEnv,
119
+ secretHeaders: explicitSecretHeaders,
120
+ secretArgs: mergedSecretArgs
121
+ });
122
+ const upserted = await upsertMcpServers({
123
+ projectRoot: options.projectRoot,
124
+ updates: [
125
+ {
126
+ name,
127
+ server: split.publicServer,
128
+ localOverride: split.localOverride
129
+ }
130
+ ],
131
+ replace: options.replace
132
+ });
133
+ const warnings = [];
134
+ if (!parsedTargets.length && defaultTargets.warning) {
135
+ warnings.push(defaultTargets.warning);
136
+ }
137
+ if (!options.noSync) {
138
+ const sync = await performSync({
139
+ projectRoot: options.projectRoot,
140
+ check: false,
141
+ verbose: false
142
+ });
143
+ warnings.push(...sync.warnings);
144
+ }
145
+ const action = upserted.updated.includes(name) ? 'updated' : 'added';
146
+ process.stdout.write(`MCP server ${action}: ${name}\n`);
147
+ if (options.noSync) {
148
+ process.stdout.write('Skipped sync (--no-sync).\n');
149
+ }
150
+ const warningBlock = formatWarnings(warnings, 4);
151
+ if (warningBlock) {
152
+ process.stdout.write(warningBlock);
153
+ }
154
+ }
155
+ function ensureNoInlineAddFlagsForUrl(options) {
156
+ const unsupported = [];
157
+ if (options.transport)
158
+ unsupported.push('--transport');
159
+ if (options.command)
160
+ unsupported.push('--command');
161
+ if (options.args && options.args.length > 0)
162
+ unsupported.push('--arg');
163
+ if (options.url)
164
+ unsupported.push('--url');
165
+ if (options.env && options.env.length > 0)
166
+ unsupported.push('--env');
167
+ if (options.headers && options.headers.length > 0)
168
+ unsupported.push('--header');
169
+ if (options.secretEnv && options.secretEnv.length > 0)
170
+ unsupported.push('--secret-env');
171
+ if (options.secretHeaders && options.secretHeaders.length > 0)
172
+ unsupported.push('--secret-header');
173
+ if (options.secretArgs && options.secretArgs.length > 0)
174
+ unsupported.push('--secret-arg');
175
+ if (options.description?.trim())
176
+ unsupported.push('--description');
177
+ if (options.disabled)
178
+ unsupported.push('--disabled');
179
+ if (unsupported.length > 0) {
180
+ throw new Error(`When the positional argument is a URL, manual server flags are not supported (${unsupported.join(', ')}). Use "agents mcp import --url <url>" for advanced control.`);
181
+ }
182
+ }
183
+ function isHttpUrl(value) {
184
+ try {
185
+ const parsed = new URL(value);
186
+ return parsed.protocol === 'http:' || parsed.protocol === 'https:';
187
+ }
188
+ catch {
189
+ return false;
190
+ }
191
+ }
192
+ function toMap(values, label, validateKey) {
193
+ const out = {};
194
+ for (const entry of values ?? []) {
195
+ const parsed = parseKeyValue(entry, label);
196
+ validateKey?.(parsed.key);
197
+ out[parsed.key] = parsed.value;
198
+ }
199
+ return out;
200
+ }
201
+ function mergeSecretArgs(primary, fallback) {
202
+ const out = new Map();
203
+ for (const item of fallback) {
204
+ out.set(item.index, item.value);
205
+ }
206
+ for (const item of primary) {
207
+ out.set(item.index, item.value);
208
+ }
209
+ return [...out.entries()]
210
+ .sort((a, b) => a[0] - b[0])
211
+ .map(([index, value]) => ({ index, value }));
212
+ }
213
+ async function promptText(message, placeholder) {
214
+ const value = await clack.text({
215
+ message,
216
+ placeholder
217
+ });
218
+ if (clack.isCancel(value)) {
219
+ clack.cancel('Canceled.');
220
+ process.exit(1);
221
+ }
222
+ return String(value).trim();
223
+ }
224
+ async function promptOptionalText(message) {
225
+ const value = await clack.text({
226
+ message,
227
+ placeholder: ''
228
+ });
229
+ if (clack.isCancel(value)) {
230
+ clack.cancel('Canceled.');
231
+ process.exit(1);
232
+ }
233
+ return String(value);
234
+ }
235
+ async function promptSelect(message, options) {
236
+ const promptOptions = options.map((entry) => ({
237
+ label: entry.label,
238
+ value: entry.value
239
+ }));
240
+ const value = await clack.select({
241
+ message,
242
+ options: promptOptions
243
+ });
244
+ if (clack.isCancel(value)) {
245
+ clack.cancel('Canceled.');
246
+ process.exit(1);
247
+ }
248
+ return value;
249
+ }
250
+ //# sourceMappingURL=mcp-add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-add.js","sourceRoot":"","sources":["../../src/commands/mcp-add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export interface McpImportOptions {
2
+ projectRoot: string;
3
+ file?: string;
4
+ json?: string;
5
+ url?: string;
6
+ name?: string;
7
+ targets?: string[];
8
+ replace: boolean;
9
+ noSync: boolean;
10
+ nonInteractive: boolean;
11
+ promptSecretValue?: (message: string) => Promise<string>;
12
+ }
13
+ export declare function runMcpImport(options: McpImportOptions): Promise<void>;
@@ -0,0 +1,207 @@
1
+ import * as clack from '@clack/prompts';
2
+ import { loadAgentsConfig } from '../core/config.js';
3
+ import { parseImportedServers, readImportInput } from '../core/mcpImport.js';
4
+ import { upsertMcpServers } from '../core/mcpCrud.js';
5
+ import { inferSecretArgs, inferSecretKeyValues, isLikelyTemplateSecretValue, isPlaceholderValue, isSecretArgFlag, isSecretLikeKey, splitServerSecrets } from '../core/mcpSecrets.js';
6
+ import { parseTargetOptions, resolveDefaultTargets, validateServerName } from '../core/mcpValidation.js';
7
+ import { performSync } from '../core/sync.js';
8
+ import { formatWarnings } from '../core/warnings.js';
9
+ export async function runMcpImport(options) {
10
+ const config = await loadAgentsConfig(options.projectRoot);
11
+ const payload = await readImportInput({
12
+ filePath: options.file,
13
+ jsonText: options.json,
14
+ url: options.url
15
+ });
16
+ const imported = parseImportedServers(payload, options.name);
17
+ const targetOverride = parseTargetOptions(options.targets);
18
+ const defaultTargets = resolveDefaultTargets(config);
19
+ const warnings = [];
20
+ if (targetOverride.length === 0 && defaultTargets.warning) {
21
+ warnings.push(defaultTargets.warning);
22
+ }
23
+ const shouldPromptSecrets = !options.nonInteractive && (Boolean(options.promptSecretValue)
24
+ || (process.stdin.isTTY && process.stdout.isTTY));
25
+ const updates = [];
26
+ for (const entry of imported) {
27
+ validateServerName(entry.name);
28
+ const baseServer = {
29
+ ...entry.server,
30
+ targets: resolveTargets(entry.server.targets, targetOverride, defaultTargets.targets)
31
+ };
32
+ const secretEnv = inferSecretKeyValues(baseServer.env);
33
+ const secretEnvKeys = new Set(Object.keys(secretEnv));
34
+ const secretHeaders = inferSecretKeyValues(baseServer.headers);
35
+ const secretHeaderKeys = new Set(Object.keys(secretHeaders));
36
+ const secretArgs = inferSecretArgs(baseServer.args ?? []).map((index) => ({
37
+ index,
38
+ value: (baseServer.args ?? [])[index]
39
+ }));
40
+ const secretArgIndexes = new Set(secretArgs.map((entry) => entry.index));
41
+ if (shouldPromptSecrets) {
42
+ const prompted = await promptForOptionalSecrets({
43
+ name: entry.name,
44
+ server: baseServer,
45
+ secretEnv,
46
+ secretEnvKeys,
47
+ secretHeaders,
48
+ secretHeaderKeys,
49
+ secretArgs,
50
+ secretArgIndexes,
51
+ promptSecretValue: options.promptSecretValue ?? promptSecretInput
52
+ });
53
+ warnings.push(...prompted.warnings);
54
+ }
55
+ const split = splitServerSecrets({
56
+ name: entry.name,
57
+ server: baseServer,
58
+ secretEnv,
59
+ secretHeaders,
60
+ secretArgs,
61
+ secretEnvKeys: [...secretEnvKeys],
62
+ secretHeaderKeys: [...secretHeaderKeys],
63
+ secretArgIndexes: [...secretArgIndexes]
64
+ });
65
+ updates.push({
66
+ name: entry.name,
67
+ server: split.publicServer,
68
+ localOverride: split.localOverride
69
+ });
70
+ }
71
+ const result = await upsertMcpServers({
72
+ projectRoot: options.projectRoot,
73
+ updates,
74
+ replace: options.replace
75
+ });
76
+ if (!options.noSync) {
77
+ const sync = await performSync({
78
+ projectRoot: options.projectRoot,
79
+ check: false,
80
+ verbose: false
81
+ });
82
+ warnings.push(...sync.warnings);
83
+ }
84
+ process.stdout.write(`Imported MCP servers: ${updates.length} (created: ${String(result.created.length)}, updated: ${String(result.updated.length)})\n`);
85
+ if (result.created.length > 0) {
86
+ process.stdout.write(`Created: ${result.created.join(', ')}\n`);
87
+ }
88
+ if (result.updated.length > 0) {
89
+ process.stdout.write(`Updated: ${result.updated.join(', ')}\n`);
90
+ }
91
+ if (options.noSync) {
92
+ process.stdout.write('Skipped sync (--no-sync).\n');
93
+ }
94
+ const warningBlock = formatWarnings(warnings, 4);
95
+ if (warningBlock) {
96
+ process.stdout.write(warningBlock);
97
+ }
98
+ }
99
+ function resolveTargets(existing, override, defaults) {
100
+ if (override.length > 0)
101
+ return override;
102
+ if (existing && existing.length > 0)
103
+ return existing;
104
+ return defaults;
105
+ }
106
+ async function promptForOptionalSecrets(args) {
107
+ const skipped = [];
108
+ const envCandidates = getTemplateSecretEnvKeys(args.server);
109
+ for (const key of envCandidates) {
110
+ args.secretEnvKeys.add(key);
111
+ const entered = await args.promptSecretValue(`Secret for "${args.name}" env "${key}" (optional, Enter to skip)`);
112
+ if (entered.length > 0) {
113
+ args.secretEnv[key] = entered;
114
+ continue;
115
+ }
116
+ delete args.secretEnv[key];
117
+ skipped.push(`env:${key}`);
118
+ }
119
+ const headerCandidates = getTemplateSecretHeaderKeys(args.server);
120
+ for (const key of headerCandidates) {
121
+ args.secretHeaderKeys.add(key);
122
+ const entered = await args.promptSecretValue(`Secret for "${args.name}" header "${key}" (optional, Enter to skip)`);
123
+ if (entered.length > 0) {
124
+ args.secretHeaders[key] = entered;
125
+ continue;
126
+ }
127
+ delete args.secretHeaders[key];
128
+ skipped.push(`header:${key}`);
129
+ }
130
+ const secretArgMap = new Map(args.secretArgs.map((entry) => [entry.index, entry.value]));
131
+ const secretArgCandidates = getTemplateSecretArgIndexes(args.server);
132
+ for (const index of secretArgCandidates) {
133
+ args.secretArgIndexes.add(index);
134
+ const flag = args.server.args?.[index - 1];
135
+ const label = flag ? `arg #${String(index)} (${flag})` : `arg #${String(index)}`;
136
+ const entered = await args.promptSecretValue(`Secret for "${args.name}" ${label} (optional, Enter to skip)`);
137
+ if (entered.length > 0) {
138
+ secretArgMap.set(index, entered);
139
+ continue;
140
+ }
141
+ secretArgMap.delete(index);
142
+ skipped.push(`arg:${String(index)}`);
143
+ }
144
+ args.secretArgs.splice(0, args.secretArgs.length, ...[...secretArgMap.entries()]
145
+ .sort((a, b) => a[0] - b[0])
146
+ .map(([index, value]) => ({ index, value })));
147
+ if (skipped.length === 0)
148
+ return { warnings: [] };
149
+ return {
150
+ warnings: [
151
+ `MCP server "${args.name}" has skipped secret values (${skipped.join(', ')}). Add them later in .agents/local.json.`,
152
+ ]
153
+ };
154
+ }
155
+ function getTemplateSecretEnvKeys(server) {
156
+ const out = [];
157
+ for (const [key, value] of Object.entries(server.env ?? {})) {
158
+ if (!isSecretLikeKey(key))
159
+ continue;
160
+ if (!isTemplateOrPlaceholderSecret(value))
161
+ continue;
162
+ out.push(key);
163
+ }
164
+ return out.sort((a, b) => a.localeCompare(b));
165
+ }
166
+ function getTemplateSecretHeaderKeys(server) {
167
+ const out = [];
168
+ for (const [key, value] of Object.entries(server.headers ?? {})) {
169
+ if (!isSecretLikeKey(key))
170
+ continue;
171
+ if (!isTemplateOrPlaceholderSecret(value))
172
+ continue;
173
+ out.push(key);
174
+ }
175
+ return out.sort((a, b) => a.localeCompare(b));
176
+ }
177
+ function getTemplateSecretArgIndexes(server) {
178
+ const args = server.args ?? [];
179
+ const out = new Set();
180
+ for (let i = 0; i < args.length - 1; i += 1) {
181
+ const flag = args[i];
182
+ const value = args[i + 1];
183
+ if (!isSecretArgFlag(flag))
184
+ continue;
185
+ if (value.startsWith('-'))
186
+ continue;
187
+ if (!isTemplateOrPlaceholderSecret(value))
188
+ continue;
189
+ out.add(i + 1);
190
+ }
191
+ return [...out].sort((a, b) => a - b);
192
+ }
193
+ function isTemplateOrPlaceholderSecret(value) {
194
+ return isPlaceholderValue(value) || isLikelyTemplateSecretValue(value);
195
+ }
196
+ async function promptSecretInput(message) {
197
+ const value = await clack.password({
198
+ message,
199
+ mask: '•'
200
+ });
201
+ if (clack.isCancel(value)) {
202
+ clack.cancel('Canceled.');
203
+ process.exit(1);
204
+ }
205
+ return String(value ?? '').trim();
206
+ }
207
+ //# sourceMappingURL=mcp-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-import.js","sourceRoot":"","sources":["../../src/commands/mcp-import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface McpListOptions {
2
+ projectRoot: string;
3
+ json: boolean;
4
+ }
5
+ export declare function runMcpList(options: McpListOptions): Promise<void>;
@@ -0,0 +1,34 @@
1
+ import path from 'node:path';
2
+ import { listMcpEntries, loadMcpState } from '../core/mcpCrud.js';
3
+ export async function runMcpList(options) {
4
+ const state = await loadMcpState(options.projectRoot);
5
+ const entries = listMcpEntries(state);
6
+ const payload = {
7
+ projectRoot: path.resolve(options.projectRoot),
8
+ count: entries.length,
9
+ servers: entries.map((entry) => ({
10
+ name: entry.name,
11
+ transport: entry.server.transport,
12
+ enabled: entry.server.enabled !== false,
13
+ targets: entry.server.targets ?? [],
14
+ hasLocalOverride: entry.hasLocalOverride,
15
+ description: entry.server.description ?? null
16
+ }))
17
+ };
18
+ if (options.json) {
19
+ process.stdout.write(`${JSON.stringify(payload, null, 2)}\n`);
20
+ return;
21
+ }
22
+ process.stdout.write(`Project: ${payload.projectRoot}\n`);
23
+ process.stdout.write(`MCP servers: ${String(payload.count)}\n`);
24
+ if (payload.count === 0) {
25
+ process.stdout.write('No MCP servers configured.\n');
26
+ return;
27
+ }
28
+ for (const server of payload.servers) {
29
+ const status = server.enabled ? 'enabled' : 'disabled';
30
+ const targets = server.targets.length > 0 ? server.targets.join(', ') : 'all';
31
+ process.stdout.write(`- ${server.name}: ${server.transport} (${status}), targets: ${targets}${server.hasLocalOverride ? ', local override' : ''}\n`);
32
+ }
33
+ }
34
+ //# sourceMappingURL=mcp-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-list.js","sourceRoot":"","sources":["../../src/commands/mcp-list.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAOjE,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAuB;IACtD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACrD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IAErC,MAAM,OAAO,GAAG;QACd,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC;QAC9C,KAAK,EAAE,OAAO,CAAC,MAAM;QACrB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC/B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS;YACjC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK;YACvC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;YACnC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,IAAI,IAAI;SAC9C,CAAC,CAAC;KACJ,CAAA;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;QAC7D,OAAM;IACR,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,OAAO,CAAC,WAAW,IAAI,CAAC,CAAA;IACzD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC/D,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;QACpD,OAAM;IACR,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAA;QACtD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QAC7E,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,SAAS,KAAK,MAAM,eAAe,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,IAAI,CAC/H,CAAA;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface McpRemoveOptions {
2
+ projectRoot: string;
3
+ name: string;
4
+ ignoreMissing: boolean;
5
+ noSync: boolean;
6
+ }
7
+ export declare function runMcpRemove(options: McpRemoveOptions): Promise<void>;
@@ -0,0 +1,34 @@
1
+ import { validateServerName } from '../core/mcpValidation.js';
2
+ import { removeMcpServer } from '../core/mcpCrud.js';
3
+ import { performSync } from '../core/sync.js';
4
+ import { formatWarnings } from '../core/warnings.js';
5
+ export async function runMcpRemove(options) {
6
+ validateServerName(options.name);
7
+ const removed = await removeMcpServer({
8
+ projectRoot: options.projectRoot,
9
+ name: options.name,
10
+ ignoreMissing: options.ignoreMissing
11
+ });
12
+ if (!removed) {
13
+ process.stdout.write(`MCP server "${options.name}" not found (ignored).\n`);
14
+ return;
15
+ }
16
+ const warnings = [];
17
+ if (!options.noSync) {
18
+ const sync = await performSync({
19
+ projectRoot: options.projectRoot,
20
+ check: false,
21
+ verbose: false
22
+ });
23
+ warnings.push(...sync.warnings);
24
+ }
25
+ process.stdout.write(`Removed MCP server: ${options.name}\n`);
26
+ if (options.noSync) {
27
+ process.stdout.write('Skipped sync (--no-sync).\n');
28
+ }
29
+ const warningBlock = formatWarnings(warnings, 4);
30
+ if (warningBlock) {
31
+ process.stdout.write(warningBlock);
32
+ }
33
+ }
34
+ //# sourceMappingURL=mcp-remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-remove.js","sourceRoot":"","sources":["../../src/commands/mcp-remove.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AASpD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAyB;IAC1D,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAChC,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC;QACpC,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC,CAAA;IAEF,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,OAAO,CAAC,IAAI,0BAA0B,CAAC,CAAA;QAC3E,OAAM;IACR,CAAC;IAED,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC;YAC7B,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,KAAK;SACf,CAAC,CAAA;QACF,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAA;IACjC,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,OAAO,CAAC,IAAI,IAAI,CAAC,CAAA;IAC7D,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAA;IACrD,CAAC;IACD,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IAChD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;IACpC,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface McpTestOptions {
2
+ projectRoot: string;
3
+ name?: string;
4
+ json: boolean;
5
+ runtime?: boolean;
6
+ runtimeTimeoutMs?: number;
7
+ }
8
+ export declare function runMcpTest(options: McpTestOptions): Promise<void>;