botanary 0.1.0 → 0.2.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.
Files changed (73) hide show
  1. package/README.md +186 -9
  2. package/dist/bin/botanary.js +13 -3
  3. package/dist/bin/botanary.js.map +1 -1
  4. package/dist/package.json +2 -2
  5. package/dist/src/app-url.js +32 -0
  6. package/dist/src/app-url.js.map +1 -0
  7. package/dist/src/cli.js +113 -23
  8. package/dist/src/cli.js.map +1 -1
  9. package/dist/src/commands/agent.js +190 -49
  10. package/dist/src/commands/agent.js.map +1 -1
  11. package/dist/src/commands/mcp.js +136 -5
  12. package/dist/src/commands/mcp.js.map +1 -1
  13. package/dist/src/commands/system.js +109 -12
  14. package/dist/src/commands/system.js.map +1 -1
  15. package/dist/src/commands/utilities.js +44 -0
  16. package/dist/src/commands/utilities.js.map +1 -0
  17. package/dist/src/commands/wallet.js +332 -94
  18. package/dist/src/commands/wallet.js.map +1 -1
  19. package/dist/src/completion.js +69 -0
  20. package/dist/src/completion.js.map +1 -0
  21. package/dist/src/config-store.js +52 -0
  22. package/dist/src/config-store.js.map +1 -0
  23. package/dist/src/context.js +14 -4
  24. package/dist/src/context.js.map +1 -1
  25. package/dist/src/errors.js +116 -0
  26. package/dist/src/errors.js.map +1 -0
  27. package/dist/src/help/examples.js +357 -0
  28. package/dist/src/help/examples.js.map +1 -0
  29. package/dist/src/help/format.js +144 -0
  30. package/dist/src/help/format.js.map +1 -0
  31. package/dist/src/help/groups.js +39 -0
  32. package/dist/src/help/groups.js.map +1 -0
  33. package/dist/src/mcp-snippets.js +6 -0
  34. package/dist/src/mcp-snippets.js.map +1 -1
  35. package/dist/src/outcome.js +63 -0
  36. package/dist/src/outcome.js.map +1 -0
  37. package/dist/src/parser.js +18 -39
  38. package/dist/src/parser.js.map +1 -1
  39. package/dist/src/progress.js +37 -0
  40. package/dist/src/progress.js.map +1 -0
  41. package/dist/src/prompt-doc.js +92 -0
  42. package/dist/src/prompt-doc.js.map +1 -0
  43. package/dist/src/render/accounts.js +21 -0
  44. package/dist/src/render/accounts.js.map +1 -0
  45. package/dist/src/render/activity.js +34 -0
  46. package/dist/src/render/activity.js.map +1 -0
  47. package/dist/src/render/agents.js +42 -0
  48. package/dist/src/render/agents.js.map +1 -0
  49. package/dist/src/render/balance.js +68 -0
  50. package/dist/src/render/balance.js.map +1 -0
  51. package/dist/src/render/chains.js +52 -0
  52. package/dist/src/render/chains.js.map +1 -0
  53. package/dist/src/render/gas.js +34 -0
  54. package/dist/src/render/gas.js.map +1 -0
  55. package/dist/src/render/grant.js +34 -0
  56. package/dist/src/render/grant.js.map +1 -0
  57. package/dist/src/render/kv.js +60 -0
  58. package/dist/src/render/kv.js.map +1 -0
  59. package/dist/src/render/mandates.js +111 -0
  60. package/dist/src/render/mandates.js.map +1 -0
  61. package/dist/src/render/print.js +18 -0
  62. package/dist/src/render/print.js.map +1 -0
  63. package/dist/src/repl.js +114 -10
  64. package/dist/src/repl.js.map +1 -1
  65. package/dist/src/review.js +52 -0
  66. package/dist/src/review.js.map +1 -0
  67. package/dist/src/settings.js +88 -0
  68. package/dist/src/settings.js.map +1 -0
  69. package/dist/src/update-check.js +85 -0
  70. package/dist/src/update-check.js.map +1 -0
  71. package/dist/src/validate.js +92 -0
  72. package/dist/src/validate.js.map +1 -0
  73. package/package.json +2 -2
@@ -4,19 +4,82 @@ import { randomBytes } from 'node:crypto';
4
4
  import { mkdir, readFile, rm, writeFile } from 'node:fs/promises';
5
5
  import { join } from 'node:path';
6
6
  import { glyphs } from '../render/colors.js';
7
- function printResult(ctx, data) {
8
- console.log(ctx.json ? JSON.stringify(data) : JSON.stringify(data, null, 2));
9
- }
7
+ import { group } from '../help/groups.js';
8
+ import { printResult } from '../render/print.js';
9
+ import { renderGrant } from '../render/grant.js';
10
+ import { step } from '../progress.js';
11
+ import { confirmOrThrow, dryRunPayload, renderReview } from '../review.js';
12
+ import { classifyAgentAction } from '../outcome.js';
13
+ import { assertAddress, assertTierAllows, familyOf, findChain, parseAmount } from '../validate.js';
14
+ import { invalidArgs } from '../errors.js';
10
15
  export function registerAgentCommands(program) {
11
- const agent = program.command('agent').description('This machine\'s own agent identity, grant, and spend under it');
16
+ const agent = group(program.command('agent').description('This machine\'s own agent identity, grant, and spend under it'), 'Agent');
12
17
  agent
13
- .command('whoami')
14
- .description('This agent\'s address, public key, and fingerprint (get_identity)')
18
+ .command('identity')
19
+ .description("This machine's local agent key: address, public key, fingerprint")
15
20
  .action(async () => {
16
21
  const ctx = program.opts().__ctx;
17
22
  const identity = await ctx.runtime.identity();
18
23
  printResult(ctx, { address: identity.address, publicKey: identity.publicKey, fingerprint: identity.fingerprint, keyStorage: identity.backend });
19
24
  });
25
+ agent
26
+ .command('whoami')
27
+ .description('What Botanary says about this agent: claimed, live, which account')
28
+ .action(async () => {
29
+ const ctx = program.opts().__ctx;
30
+ // Deliberately NOT wrapped in a try/catch that softens the failure: GET /agents/me failing IS the
31
+ // answer when this agent was never claimed, and reporting a fabricated "connected" is the one thing
32
+ // this command must never do. `botanary whoami` is the forgiving both-lanes view.
33
+ const self = await step(ctx, 'Asking Botanary about this agent', () => ctx.runtime.me());
34
+ printResult(ctx, self, () => renderGrant(self, describeGrant(self)));
35
+ });
36
+ agent
37
+ .command('account')
38
+ .description('The one account this agent is bound to')
39
+ .option('--chain-id <chainId>', 'Return the account row for this chain')
40
+ .action(async (opts) => {
41
+ const ctx = program.opts().__ctx;
42
+ const chainId = opts.chainId === undefined ? undefined : Number(opts.chainId);
43
+ if (chainId !== undefined && !Number.isFinite(chainId)) {
44
+ throw invalidArgs(`--chain-id must be a number, got ${JSON.stringify(opts.chainId)}.`);
45
+ }
46
+ const account = await step(ctx, 'Reading the bound account', () => ctx.runtime.getAccount(chainId === undefined ? {} : { chainId }));
47
+ printResult(ctx, account);
48
+ });
49
+ agent
50
+ .command('balance')
51
+ .description("The bound account's balance, read as this agent")
52
+ .action(async () => {
53
+ const ctx = program.opts().__ctx;
54
+ const balance = await step(ctx, 'Reading balance', () => ctx.runtime.getBalance());
55
+ printResult(ctx, balance);
56
+ });
57
+ agent
58
+ .command('request')
59
+ .description('Ask the owner to approve something this grant cannot cover')
60
+ .requiredOption('--reason <reason>', 'What the owner will see, e.g. "Pay the September invoice"')
61
+ .requiredOption('--calls-file <path>', 'JSON file: an array of { to, data, value, chainId }')
62
+ .action(async (opts) => {
63
+ const ctx = program.opts().__ctx;
64
+ let calls;
65
+ try {
66
+ calls = JSON.parse(await readFile(opts.callsFile, 'utf8'));
67
+ }
68
+ catch (e) {
69
+ throw invalidArgs(`Could not read --calls-file "${opts.callsFile}": ${e instanceof Error ? e.message : String(e)}`, 'It must be a readable JSON file containing an array of calls.');
70
+ }
71
+ if (!Array.isArray(calls) || calls.length === 0) {
72
+ throw invalidArgs('--calls-file must contain a non-empty JSON array of calls.');
73
+ }
74
+ for (const [index, call] of calls.entries()) {
75
+ const c = call;
76
+ if (typeof c.to !== 'string' || typeof c.data !== 'string' || typeof c.value !== 'string' || typeof c.chainId !== 'number') {
77
+ throw invalidArgs(`Call ${index} is malformed.`, 'Each call needs a string `to`, a string `data`, a string `value` and a numeric `chainId`.');
78
+ }
79
+ }
80
+ const result = await step(ctx, 'Raising the request', () => ctx.runtime.raiseRequest(calls, opts.reason));
81
+ printResult(ctx, result);
82
+ });
20
83
  agent
21
84
  .command('pair')
22
85
  .description('Show (or rotate) the pairing code and register it with Botanary')
@@ -24,7 +87,7 @@ export function registerAgentCommands(program) {
24
87
  .action(async (opts) => {
25
88
  const ctx = program.opts().__ctx;
26
89
  const identity = await ctx.runtime.identity();
27
- const pairing = opts.regenerate ? await ctx.runtime.regeneratePairingCode() : await ctx.runtime.pair();
90
+ const pairing = await step(ctx, opts.regenerate ? 'Rotating the pairing code' : 'Generating the pairing code', () => opts.regenerate ? ctx.runtime.regeneratePairingCode() : ctx.runtime.pair());
28
91
  if (!ctx.json) {
29
92
  console.log(glyphs.info(`Pairing code: ${pairing.code}`));
30
93
  console.log('In Botanary, open Connected agents and enter this code.');
@@ -36,66 +99,118 @@ export function registerAgentCommands(program) {
36
99
  .description('This agent\'s current grant, rendered in plain terms (what_may_i_do)')
37
100
  .action(async () => {
38
101
  const ctx = program.opts().__ctx;
39
- const self = await ctx.runtime.me();
102
+ const self = await step(ctx, 'Reading this agent\'s grant', () => ctx.runtime.me());
40
103
  const description = describeGrant(self);
41
- if (!ctx.json)
42
- console.log(description);
43
- else
44
- printResult(ctx, { description, grant: self.grant });
104
+ printResult(ctx, { description, grant: self.grant }, () => renderGrant(self, description));
45
105
  });
46
106
  agent
47
107
  .command('requests')
48
108
  .description('Every approval request this agent has filed, and the owner\'s verdict on each (list_requests)')
49
109
  .action(async () => {
50
110
  const ctx = program.opts().__ctx;
51
- printResult(ctx, await ctx.runtime.listRequests());
111
+ printResult(ctx, await step(ctx, 'Reading requests', () => ctx.runtime.listRequests()));
52
112
  });
53
113
  agent
54
114
  .command('spend')
55
115
  .description('Spend under this agent\'s own grant, unattended (propose_payment)')
56
- .option('--recipient <address>')
57
- .option('--amount <amount>')
58
- .option('--token <symbol>')
59
- .option('--chain-id <chainId>')
116
+ .option('--recipient <address>', 'Destination address (0x... on EVM)')
117
+ .option('--amount <amount>', 'Amount in display units, e.g. 5')
118
+ .option('--token <symbol>', 'Token symbol the grant budgets, e.g. USDC')
119
+ .option('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
60
120
  .action(async (opts) => {
61
121
  const ctx = program.opts().__ctx;
62
- let { recipient, amount, token: tokenSymbol, chainId } = opts;
63
- if (!ctx.noInteractive && (!recipient || !amount || !tokenSymbol || !chainId)) {
122
+ // Validate required inputs before making network calls. If chain-id is not specified and we're
123
+ // not in interactive mode, fail immediately with missing input - do not fetch chains first.
124
+ let { amount: amountRaw, token: tokenSymbol, recipient } = opts;
125
+ const chainId = opts.chainId ?? ctx.chain;
126
+ if (!ctx.interactive && (!chainId || !amountRaw || !tokenSymbol || !recipient)) {
127
+ throw invalidArgs('Missing required input', 'Use --amount, --token, --recipient, and --chain-id, or run in an interactive terminal.');
128
+ }
129
+ const chains = await step(ctx, 'Reading chains', () => ctx.runtime.listChains());
130
+ const chain = findChain(chains, chainId);
131
+ assertTierAllows(chain, 'authority');
132
+ const family = familyOf(chain.namespace);
133
+ if (ctx.interactive && (!amountRaw || !tokenSymbol || !recipient)) {
64
134
  const answers = await clack.group({
65
- amount: () => clack.text({ message: 'Amount?', initialValue: amount }),
135
+ amount: () => clack.text({
136
+ message: 'Amount?',
137
+ initialValue: amountRaw,
138
+ validate: (value) => {
139
+ const parsed = Number(String(value).trim());
140
+ return Number.isFinite(parsed) && parsed > 0 ? undefined : 'A positive number, e.g. 5';
141
+ },
142
+ }),
66
143
  token: () => clack.text({ message: 'Token?', initialValue: tokenSymbol }),
67
144
  recipient: () => clack.text({ message: 'To?', initialValue: recipient }),
68
- chainId: () => clack.text({ message: 'Chain ID?', initialValue: chainId }),
69
145
  }, { onCancel: () => { clack.cancel('Cancelled.'); process.exit(0); } });
70
- ({ recipient, amount, token: tokenSymbol, chainId } = answers);
146
+ ({ amount: amountRaw, token: tokenSymbol, recipient } = answers);
71
147
  }
72
- if (!recipient || !amount || !tokenSymbol || !chainId) {
73
- throw new Error('Missing required input: --recipient, --amount, --token, --chain-id (or run interactively).');
148
+ const amount = parseAmount(amountRaw);
149
+ if (!tokenSymbol)
150
+ throw invalidArgs('--token is required.', 'A token this grant budgets - see `botanary agent grant`.');
151
+ const to = assertAddress(recipient, family);
152
+ const rows = [
153
+ { label: 'amount', value: `${amount} ${tokenSymbol}` },
154
+ { label: 'to', value: to },
155
+ { label: 'chain', value: `${chain.name} (${chain.key}, ${chain.tier})` },
156
+ { label: 'signed by', value: "this agent's own grant, unattended" },
157
+ ];
158
+ const warnings = ['This spends without asking the owner. The grant is the only bound.'];
159
+ if (ctx.dryRun) {
160
+ printResult(ctx, dryRunPayload('Review this spend', rows, warnings), () => renderReview('Dry run - nothing will be sent', rows, warnings));
161
+ return;
74
162
  }
75
- const result = await proposePayment(ctx.runtime, { recipient, amount: Number(amount), tokenSymbol, chainId: Number(chainId) });
163
+ await confirmOrThrow(ctx, 'Review this spend', rows, warnings);
164
+ const result = await step(ctx, 'Spending under the grant', () => proposePayment(ctx.runtime, { recipient: to, amount, tokenSymbol, chainId: chain.chainId ?? Number.NaN }));
165
+ const outcome = classifyAgentAction(result);
166
+ ctx.outcome.exit = outcome.exit;
76
167
  printResult(ctx, result);
77
168
  });
78
169
  agent
79
170
  .command('swap')
80
171
  .description('Swap under this agent\'s own grant, unattended (propose_swap)')
81
- .option('--token-in <symbol>')
82
- .option('--token-out <symbol>')
83
- .option('--amount-in <amount>')
84
- .option('--chain-id <chainId>')
85
- .option('--max-slippage-bps <bps>')
172
+ .option('--token-in <symbol>', 'Token to sell')
173
+ .option('--token-out <symbol>', 'Token to buy')
174
+ .option('--amount-in <amount>', 'Amount of --token-in to sell, in display units')
175
+ .option('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
176
+ .option('--max-slippage-bps <bps>', 'Maximum acceptable slippage, in basis points')
86
177
  .action(async (opts) => {
87
178
  const ctx = program.opts().__ctx;
88
- const { tokenIn, tokenOut, amountIn, chainId, maxSlippageBps } = opts;
89
- if (!tokenIn || !tokenOut || !amountIn || !chainId) {
90
- throw new Error('Missing required input: --token-in, --token-out, --amount-in, --chain-id.');
179
+ const { tokenIn, tokenOut, amountIn, maxSlippageBps } = opts;
180
+ const chainId = opts.chainId ?? ctx.chain;
181
+ if (!tokenIn)
182
+ throw invalidArgs('--token-in is required.', 'The token to sell.');
183
+ if (!tokenOut)
184
+ throw invalidArgs('--token-out is required.', 'The token to buy.');
185
+ if (!amountIn)
186
+ throw invalidArgs('--amount-in is required.', 'How much to sell, in display units.');
187
+ if (!chainId)
188
+ throw invalidArgs('--chain-id is required.', 'The chain the grant is on - see `botanary agent grant`.');
189
+ const chains = await step(ctx, 'Reading chains', () => ctx.runtime.listChains());
190
+ const chain = findChain(chains, chainId);
191
+ assertTierAllows(chain, 'authority');
192
+ const amount = parseAmount(amountIn, '--amount-in');
193
+ const rows = [
194
+ { label: 'sell', value: `${amount} ${tokenIn}` },
195
+ { label: 'buy', value: tokenOut },
196
+ { label: 'chain', value: `${chain.name} (${chain.key}, ${chain.tier})` },
197
+ { label: 'signed by', value: "this agent's own grant, unattended" },
198
+ ];
199
+ const warnings = ['This swaps without asking the owner. The grant is the only bound.'];
200
+ if (ctx.dryRun) {
201
+ printResult(ctx, dryRunPayload('Review this swap', rows, warnings), () => renderReview('Dry run - nothing will be sent', rows, warnings));
202
+ return;
91
203
  }
92
- const result = await proposeSwap(ctx.runtime, {
204
+ await confirmOrThrow(ctx, 'Review this swap', rows, warnings);
205
+ const result = await step(ctx, 'Swapping under the grant', () => proposeSwap(ctx.runtime, {
93
206
  tokenIn,
94
207
  tokenOut,
95
- amountIn: Number(amountIn),
96
- chainId: Number(chainId),
208
+ amountIn: amount,
209
+ chainId: chain.chainId ?? Number.NaN,
97
210
  ...(maxSlippageBps ? { maxSlippageBps: Number(maxSlippageBps) } : {}),
98
- });
211
+ }));
212
+ const outcome = classifyAgentAction(result);
213
+ ctx.outcome.exit = outcome.exit;
99
214
  printResult(ctx, result);
100
215
  });
101
216
  agent
@@ -103,33 +218,55 @@ export function registerAgentCommands(program) {
103
218
  .description('Check on a pending action this agent relayed (get_action_status)')
104
219
  .action(async (opId) => {
105
220
  const ctx = program.opts().__ctx;
106
- printResult(ctx, await ctx.runtime.getUserOp(opId));
221
+ printResult(ctx, await step(ctx, 'Checking action status', () => ctx.runtime.getUserOp(opId)));
107
222
  });
108
223
  agent
109
224
  .command('apis')
110
225
  .description('Paid (x402) third-party API endpoints this agent may call, with live price and remaining budget (list_apis)')
111
- .requiredOption('--chain-id <chainId>')
226
+ .requiredOption('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
112
227
  .action(async (opts) => {
113
228
  const ctx = program.opts().__ctx;
114
- printResult(ctx, await ctx.runtime.listApis(Number(opts.chainId)));
229
+ printResult(ctx, await step(ctx, 'Reading APIs', () => ctx.runtime.listApis(Number(opts.chainId))));
115
230
  });
116
231
  agent
117
232
  .command('pay <endpointId>')
118
233
  .description('Call a paid API endpoint and pay for it inside the owner-committed on-chain budget (call_api)')
119
- .requiredOption('--chain-id <chainId>')
120
- .requiredOption('--provider-id <providerId>')
121
- .requiredOption('--url <url>')
234
+ .requiredOption('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
235
+ .requiredOption('--provider-id <providerId>', 'Provider that owns the endpoint')
236
+ .requiredOption('--url <url>', 'The endpoint URL to call')
122
237
  .action(async (endpointId, opts) => {
123
238
  const ctx = program.opts().__ctx;
124
- printResult(ctx, await ctx.runtime.callApi({ chainId: Number(opts.chainId), providerId: opts.providerId, endpointId, url: opts.url }));
239
+ const chainId = Number(opts.chainId);
240
+ const providerId = String(opts.providerId);
241
+ const url = String(opts.url);
242
+ const chains = await step(ctx, 'Reading chains', () => ctx.runtime.listChains());
243
+ const chain = findChain(chains, chainId);
244
+ assertTierAllows(chain, 'authority');
245
+ const rows = [
246
+ { label: 'endpoint', value: endpointId },
247
+ { label: 'provider', value: providerId },
248
+ { label: 'url', value: url },
249
+ { label: 'chain', value: `${chain.name} (${chain.key}, ${chain.tier})` },
250
+ { label: 'signed by', value: "this agent's own budget, unattended" },
251
+ ];
252
+ const warnings = ['This calls an API and deducts from the on-chain budget without asking the owner.'];
253
+ if (ctx.dryRun) {
254
+ printResult(ctx, dryRunPayload('Review this API call', rows, warnings), () => renderReview('Dry run - nothing will be called', rows, warnings));
255
+ return;
256
+ }
257
+ await confirmOrThrow(ctx, 'Review this API call', rows, warnings);
258
+ const result = await step(ctx, 'Calling the API', () => ctx.runtime.callApi({ chainId, providerId, endpointId, url }));
259
+ const outcome = classifyAgentAction(result);
260
+ ctx.outcome.exit = outcome.exit;
261
+ printResult(ctx, result);
125
262
  });
126
263
  agent
127
264
  .command('budget')
128
265
  .description('Remaining authorizations, per-call max, expiry and epoch for this agent on a chain (get_api_budget)')
129
- .requiredOption('--chain-id <chainId>')
266
+ .requiredOption('--chain-id <chainId>', 'Chain the grant is on - see `botanary agent grant`')
130
267
  .action(async (opts) => {
131
268
  const ctx = program.opts().__ctx;
132
- printResult(ctx, await ctx.runtime.getApiBudget(Number(opts.chainId)));
269
+ printResult(ctx, await step(ctx, 'Reading budget', () => ctx.runtime.getApiBudget(Number(opts.chainId))));
133
270
  });
134
271
  const FORGET_TOKEN_TTL_MS = 5 * 60 * 1000;
135
272
  const pendingForgetPath = () => join(botanaryMcpHome(), '.cli-forget-pending.json');
@@ -166,13 +303,17 @@ export function registerAgentCommands(program) {
166
303
  }
167
304
  const valid = !!pending && pending.token === token && pending.expiresAt > Date.now();
168
305
  if (!valid) {
169
- throw new Error('No matching, unexpired confirmation token - run `botanary agent forget` first, then pass the ' +
170
- 'token it prints to `confirm-forget` within 5 minutes.');
306
+ throw invalidArgs('No matching, unexpired confirmation token.', 'Run `botanary agent forget` first, then pass the token it prints to `confirm-forget` within 5 minutes.');
171
307
  }
172
308
  await rm(pendingForgetPath(), { force: true });
173
309
  await ctx.runtime.store.forget();
174
310
  ctx.runtime.reset();
175
- console.log(glyphs.success('Deleted the agent key from this machine.'));
311
+ if (ctx.json) {
312
+ console.log(JSON.stringify({ status: 'deleted' }));
313
+ }
314
+ else {
315
+ console.log(glyphs.success('Deleted the agent key from this machine.'));
316
+ }
176
317
  });
177
318
  }
178
319
  //# sourceMappingURL=agent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/commands/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../../src/commands/agent.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,150 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { createRequire } from 'node:module';
3
+ import { readFileSync } from 'node:fs';
4
+ import { dirname, join } from 'node:path';
1
5
  import { MCP_SNIPPETS } from '../mcp-snippets.js';
6
+ import { group } from '../help/groups.js';
7
+ import { colors, glyphs } from '../render/colors.js';
8
+ import { confirmOrThrow, dryRunPayload, renderReview } from '../review.js';
9
+ import { printResult } from '../render/print.js';
10
+ import { CliError, EXIT, invalidArgs } from '../errors.js';
11
+ /**
12
+ * The installed botanary-mcp bin, found by walking up from its resolved entry to the package root.
13
+ *
14
+ * Deliberately NOT `require.resolve('botanary-mcp/package.json')`: that package's `exports` map declares
15
+ * only ".", so a subpath resolve throws ERR_PACKAGE_PATH_NOT_EXPORTED. Walking the filesystem sidesteps the
16
+ * exports map entirely and keeps working whether the dependency is a registry install or a local link.
17
+ */
18
+ export function resolveMcpBin() {
19
+ const require = createRequire(import.meta.url);
20
+ let dir = dirname(require.resolve('botanary-mcp'));
21
+ for (let depth = 0; depth < 6; depth += 1) {
22
+ try {
23
+ const manifest = JSON.parse(readFileSync(join(dir, 'package.json'), 'utf8'));
24
+ if (manifest.name === 'botanary-mcp') {
25
+ const bin = typeof manifest.bin === 'string' ? manifest.bin : manifest.bin?.['botanary-mcp'];
26
+ if (bin)
27
+ return join(dir, bin);
28
+ }
29
+ }
30
+ catch {
31
+ // Not a package root, or unreadable - keep walking.
32
+ }
33
+ const parent = dirname(dir);
34
+ if (parent === dir)
35
+ break;
36
+ dir = parent;
37
+ }
38
+ throw new CliError('Could not locate the botanary-mcp binary in this install.', 'mcp_bin_not_found', EXIT.error, 'Reinstall botanary, or run `npx -y botanary-mcp` directly.');
39
+ }
40
+ /**
41
+ * Helper to spawn a child process and wait for it to exit. The onError callback is invoked when
42
+ * the child emits an 'error' event (e.g. when the command is not found).
43
+ */
44
+ async function spawnAndWait(command, args, onError) {
45
+ return new Promise((resolve) => {
46
+ const child = spawn(command, args, { stdio: 'inherit' });
47
+ child.on('error', (error) => resolve(onError(error)));
48
+ child.on('close', (code) => resolve(code ?? 1));
49
+ });
50
+ }
2
51
  export function registerMcpCommands(program) {
3
- const mcp = program.command('mcp').description('Connect a coding agent to Botanary via botanary-mcp');
52
+ const mcp = group(program.command('mcp').description('Connect a coding agent to Botanary via botanary-mcp'), 'Connect');
4
53
  mcp
5
54
  .command('config [client]')
6
- .description('Print the install snippet for a client: claude, codex, cursor, claude-desktop')
55
+ .description('Print the install snippet for a client')
7
56
  .action((client) => {
57
+ const ctx = program.opts().__ctx;
8
58
  if (!client) {
9
- console.log('Usage: botanary mcp config <claude|codex|cursor|claude-desktop>');
59
+ const clients = Object.keys(MCP_SNIPPETS);
60
+ if (ctx.json) {
61
+ console.log(JSON.stringify({ clients }));
62
+ }
63
+ else {
64
+ console.log(`Usage: botanary mcp config <${clients.join('|')}>`);
65
+ }
10
66
  return;
11
67
  }
12
68
  const entry = MCP_SNIPPETS[client];
13
69
  if (!entry) {
14
- throw new Error(`Unknown client "${client}". Choose one of: ${Object.keys(MCP_SNIPPETS).join(', ')}.`);
70
+ throw invalidArgs(`Unknown client "${client}".`, `Choose one of: ${Object.keys(MCP_SNIPPETS).join(', ')}.`);
71
+ }
72
+ if (ctx.json) {
73
+ console.log(JSON.stringify({ client, label: entry.label, snippet: entry.snippet }));
74
+ }
75
+ else {
76
+ console.log(`${entry.label}:\n\n${entry.snippet}`);
77
+ }
78
+ });
79
+ mcp
80
+ .command('install <client>')
81
+ .description("Install botanary-mcp using that client's own CLI")
82
+ .action(async (client) => {
83
+ const ctx = program.opts().__ctx;
84
+ const entry = MCP_SNIPPETS[client];
85
+ if (!entry) {
86
+ throw invalidArgs(`Unknown client "${client}".`, `Choose one of: ${Object.keys(MCP_SNIPPETS).join(', ')}.`);
87
+ }
88
+ // No installCommand means this client is configured by editing a file we do not own. Print, explain,
89
+ // and stop - the design spec's deliberate blast-radius limit.
90
+ if (!entry.installCommand) {
91
+ if (ctx.dryRun) {
92
+ const rows = [
93
+ { label: 'client', value: entry.label },
94
+ { label: 'config file', value: entry.configPath ?? 'unknown' },
95
+ ];
96
+ const warnings = ['botanary does not edit another tool\'s config file on your behalf.'];
97
+ printResult(ctx, dryRunPayload(`Install botanary-mcp into ${entry.label}`, rows, warnings), () => `${renderReview(`Dry run - nothing will be edited`, rows, warnings)}\n\nAdd this to ${entry.configPath}:\n\n${entry.snippet}`);
98
+ }
99
+ else {
100
+ console.log([
101
+ glyphs.info(`${entry.label} is configured by editing ${entry.configPath}.`),
102
+ colors.dim(' botanary does not edit another tool\'s config file on your behalf.'),
103
+ '',
104
+ entry.snippet,
105
+ ].join('\n'));
106
+ }
107
+ return;
108
+ }
109
+ const printable = entry.installCommand.join(' ');
110
+ const rows = [
111
+ { label: 'runs', value: printable },
112
+ { label: 'changes', value: `${entry.label}'s own MCP server list` },
113
+ ];
114
+ const warnings = [];
115
+ if (ctx.dryRun) {
116
+ printResult(ctx, dryRunPayload(`Install botanary-mcp into ${entry.label}`, rows, warnings), () => renderReview('Dry run - nothing will be installed', rows, warnings));
117
+ return;
118
+ }
119
+ await confirmOrThrow(ctx, `Install botanary-mcp into ${entry.label}`, rows, warnings, {
120
+ question: 'Run it?',
121
+ because: `This runs \`${printable}\` and needs a confirmation it cannot ask for here.`,
122
+ });
123
+ const [command, ...args] = entry.installCommand;
124
+ const exitCode = await spawnAndWait(command, args, () => -1);
125
+ if (exitCode === -1) {
126
+ throw new CliError(`Could not run \`${command}\` - it does not appear to be installed.`, 'client_cli_missing', EXIT.error, `Install ${entry.label} first, or use \`botanary mcp config ${client}\` and add it yourself.`);
15
127
  }
16
- console.log(`${entry.label}:\n\n${entry.snippet}`);
128
+ if (exitCode !== 0) {
129
+ throw new CliError(`\`${printable}\` exited ${exitCode}.`, 'client_cli_failed', EXIT.error);
130
+ }
131
+ if (ctx.json) {
132
+ console.log(JSON.stringify({ status: 'installed', client: entry.label }));
133
+ }
134
+ else {
135
+ console.log(glyphs.success(`Installed into ${entry.label}.`));
136
+ }
137
+ });
138
+ mcp
139
+ .command('serve')
140
+ .description('Run the botanary-mcp server on stdio')
141
+ .action(async () => {
142
+ // Spawned with NO arguments deliberately: botanary-mcp's own bin treats a bare invocation as "serve
143
+ // and stay alive", and exits immediately after connecting when it is given any argument at all.
144
+ const bin = resolveMcpBin();
145
+ const exitCode = await spawnAndWait(process.execPath, [bin], () => 1);
146
+ if (exitCode !== 0)
147
+ throw new CliError(`botanary-mcp exited ${exitCode}.`, 'mcp_exited', EXIT.error);
17
148
  });
18
149
  }
19
150
  //# sourceMappingURL=mcp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/commands/mcp.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,qDAAqD,CAAC,CAAC;IACtG,GAAG;SACA,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,+EAA+E,CAAC;SAC5F,MAAM,CAAC,CAAC,MAAe,EAAE,EAAE;QAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;YAC/E,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,mBAAmB,MAAM,qBAAqB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzG,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,KAAK,QAAQ,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/commands/mcp.ts"],"names":[],"mappings":"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"}