botanary 0.2.1 → 0.3.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 (37) hide show
  1. package/README.md +7 -1
  2. package/dist/package.json +15 -8
  3. package/dist/src/cli.js +25 -4
  4. package/dist/src/cli.js.map +1 -1
  5. package/dist/src/commands/agent.js +9 -41
  6. package/dist/src/commands/agent.js.map +1 -1
  7. package/dist/src/commands/mcp.js +17 -4
  8. package/dist/src/commands/mcp.js.map +1 -1
  9. package/dist/src/commands/tokens.js +36 -0
  10. package/dist/src/commands/tokens.js.map +1 -0
  11. package/dist/src/commands/utilities.js +76 -1
  12. package/dist/src/commands/utilities.js.map +1 -1
  13. package/dist/src/commands/wallet.js +53 -25
  14. package/dist/src/commands/wallet.js.map +1 -1
  15. package/dist/src/help/examples.js +33 -14
  16. package/dist/src/help/examples.js.map +1 -1
  17. package/dist/src/install-method.js +50 -0
  18. package/dist/src/install-method.js.map +1 -0
  19. package/dist/src/progress.js +19 -0
  20. package/dist/src/progress.js.map +1 -1
  21. package/dist/src/render/balance.js +19 -2
  22. package/dist/src/render/balance.js.map +1 -1
  23. package/dist/src/render/chains.js +1 -1
  24. package/dist/src/render/chains.js.map +1 -1
  25. package/dist/src/review.js +2 -5
  26. package/dist/src/review.js.map +1 -1
  27. package/dist/src/run-installer.js +30 -0
  28. package/dist/src/run-installer.js.map +1 -0
  29. package/dist/src/update-check.js +8 -2
  30. package/dist/src/update-check.js.map +1 -1
  31. package/dist/src/validate.js +55 -9
  32. package/dist/src/validate.js.map +1 -1
  33. package/package.json +15 -8
  34. package/dist/src/render/apis.js +0 -44
  35. package/dist/src/render/apis.js.map +0 -1
  36. package/dist/src/render/json-mode.js +0 -10
  37. package/dist/src/render/json-mode.js.map +0 -1
@@ -27,10 +27,6 @@ export function dryRunPayload(title, rows, warnings) {
27
27
  * proceeds on an assumption. `--yes` is an explicit yes; an interactive terminal is asked; and anything
28
28
  * else - a script, a pipe, `--json`, `--no-interactive` - is exit 2 naming the flag it needed, rather than
29
29
  * a prompt that cannot render or a silent self-confirmation.
30
- *
31
- * Under `--quiet`, the review panel is still printed: this is the essential output for a funds-moving
32
- * command, not decoration. `--quiet` mutes progress spinners and update checks, not the record of what
33
- * is being approved.
34
30
  */
35
31
  export async function confirmOrThrow(ctx, title, rows, warnings, opts) {
36
32
  // When yes came from the config file (confirm: never), still print the review panel so the user sees
@@ -46,7 +42,8 @@ export async function confirmOrThrow(ctx, title, rows, warnings, opts) {
46
42
  if (ctx.json || !ctx.interactive) {
47
43
  throw invalidArgs(`${opts?.because ?? 'This command moves funds and needs a confirmation it cannot ask for here.'} Pass --yes to confirm non-interactively, or --dry-run to preflight it instead.`);
48
44
  }
49
- console.log(renderReview(title, rows, warnings));
45
+ if (!ctx.quiet)
46
+ console.log(renderReview(title, rows, warnings));
50
47
  const answer = await clack.confirm({ message: opts?.question ?? 'Send it?', initialValue: false });
51
48
  if (answer !== true) {
52
49
  throw new CliError('Cancelled - nothing was signed and nothing was sent.', 'cancelled', EXIT.error);
@@ -1 +1 @@
1
- {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAiB1D,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,IAAiB,EAAE,QAAkB;IAC/E,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAqB,CAAC,CAAC,CAAC,CAAC;IACnG,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,MAAM,OAAO,IAAI,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,IAAiB,EAAE,QAAkB;IAChF,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,KAAK;QACL,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAc,EACd,KAAa,EACb,IAAiB,EACjB,QAAkB,EAClB,IAA8C;IAE9C,qGAAqG;IACrG,uEAAuE;IACvE,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,KAAK,MAAM,CAAC;IAC1E,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,GAAG;QAAE,OAAO;IACpB,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,WAAW,CACf,GAAG,IAAI,EAAE,OAAO,IAAI,2EAA2E,iFAAiF,CACjL,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IACnG,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,sDAAsD,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACtG,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAiB1D,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,IAAiB,EAAE,QAAkB;IAC/E,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAqB,CAAC,CAAC,CAAC,CAAC;IACnG,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,MAAM,OAAO,IAAI,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,IAAiB,EAAE,QAAkB;IAChF,OAAO;QACL,MAAM,EAAE,IAAI;QACZ,KAAK;QACL,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;QACrE,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAc,EACd,KAAa,EACb,IAAiB,EACjB,QAAkB,EAClB,IAA8C;IAE9C,qGAAqG;IACrG,uEAAuE;IACvE,MAAM,aAAa,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,KAAK,MAAM,CAAC;IAC1E,IAAI,aAAa,EAAE,CAAC;QAClB,IAAI,CAAC,GAAG,CAAC,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IACD,IAAI,GAAG,CAAC,GAAG;QAAE,OAAO;IACpB,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,WAAW,CACf,GAAG,IAAI,EAAE,OAAO,IAAI,2EAA2E,iFAAiF,CACjL,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,KAAK;QAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjE,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;IACnG,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,QAAQ,CAAC,sDAAsD,EAAE,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACtG,CAAC;AACH,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { spawn } from 'node:child_process';
2
+ /**
3
+ * Run a package manager and report its exit code.
4
+ *
5
+ * stdio is inherited (or partly silenced - see `RunInstallerOptions`) so npm's own progress, prompts and
6
+ * errors reach the user unfiltered - an installer failure explains itself far better than anything this
7
+ * CLI could re-author, and an EACCES on a global directory is exactly the kind of message that must not be
8
+ * swallowed.
9
+ *
10
+ * Never throws. A binary that is missing resolves non-zero like any other failure, because the caller
11
+ * does the same thing either way: report that nothing changed.
12
+ */
13
+ export function runInstaller(command, options = {}) {
14
+ const [bin, ...args] = command;
15
+ if (!bin)
16
+ return Promise.resolve(1);
17
+ return new Promise((resolve) => {
18
+ const child = spawn(bin, args, {
19
+ stdio: options.silent ? ['ignore', 'ignore', 'inherit'] : 'inherit',
20
+ // npm, pnpm and yarn are `.cmd` shims on Windows. `spawn` does not apply PATHEXT, and since the fix
21
+ // for CVE-2024-27980 Node refuses to run a `.cmd` at all without `shell: true`. There is no
22
+ // injection surface here: `command` is always one of classifyInstall's constant-literal argv
23
+ // arrays, never user input.
24
+ shell: process.platform === 'win32',
25
+ });
26
+ child.on('error', () => resolve(1));
27
+ child.on('close', (code) => resolve(code ?? 1));
28
+ });
29
+ }
30
+ //# sourceMappingURL=run-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-installer.js","sourceRoot":"","sources":["../../src/run-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAY3C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,OAAiB,EAAE,UAA+B,EAAE;IAC/E,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC;IAC/B,IAAI,CAAC,GAAG;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;YAC7B,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;YACnE,oGAAoG;YACpG,4FAA4F;YAC5F,6FAA6F;YAC7F,4BAA4B;YAC5B,KAAK,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACpC,CAAC,CAAC;QACH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -75,8 +75,14 @@ export async function checkForUpdate(current, deps) {
75
75
  await writeCache({ checkedAt: deps.now(), latest });
76
76
  return { current, latest, newer: latest ? isNewer(latest, current) : false, fromCache: false };
77
77
  }
78
- export function nagLine(latest, current) {
79
- return `Update available: ${current} to ${latest}. Run \`npm i -g botanary\` (or use \`npx botanary\`).`;
78
+ /**
79
+ * The courtesy line. It leads with `botanary update`, which knows how to do the work, and names the
80
+ * manager-specific command only as the fallback for someone who would rather run it themselves. A copy
81
+ * with nothing to run - npx - gets no parenthetical, because there is no command to offer.
82
+ */
83
+ export function nagLine(latest, current, method) {
84
+ const fallback = method.command ? ` (or \`${method.command.join(' ')}\`)` : '';
85
+ return `Update available: ${current} to ${latest}. Run \`botanary update\`${fallback}.`;
80
86
  }
81
87
  /** CI is included because a nag in a build log is noise nobody can act on from there. */
82
88
  export function nagSuppressed(env) {
@@ -1 +1 @@
1
- {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/update-check.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update-check.js","sourceRoot":"","sources":["../../src/update-check.ts"],"names":[],"mappings":"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"}
@@ -78,15 +78,61 @@ export function assertTierAllows(chain, need) {
78
78
  throw new CliError(`${chain.name} (${chain.key}) carries no AgentGuard, so authority actions are unavailable there.`, 'chain_capability_unavailable', EXIT.declined, 'Authority actions need a botanary-tier chain - see `botanary chains`.');
79
79
  }
80
80
  }
81
- /** Tokens actually held on one chain, largest holding first, for a `select` prompt. Never a catalog: a
82
- * token the account does not hold is not a sendable choice. */
83
- export function tokenChoicesFor(balance, chainRef) {
84
- const holdings = balance?.holdings;
85
- const list = Array.isArray(holdings) ? holdings : [];
81
+ /** Every token this account displays on one chain, largest balance first. Reads `/v1/balance`'s
82
+ * deprecated-but-still-populated `tokens` array (`TokenBalance[]`) rather than `holdings`
83
+ * (`ValuedHolding[]`), because only `tokens` carries `tokenAddress` and `source` - the two fields a
84
+ * symbol refusal needs to name a candidate unambiguously. Deliberately not filtered to a positive
85
+ * balance: `TokenBalance.displayable = registry ∪ discovered ∪ imported` (see backend `types.ts`), and a
86
+ * zero-balance registry or imported row is still a real, addressable token - it just has nothing in it
87
+ * right now. Never a catalog beyond that: a token neither registered, discovered nor imported for this
88
+ * account is not in `tokens` at all. */
89
+ export function tokenChoicesFor(balance, chainId) {
90
+ const tokens = balance?.tokens;
91
+ const list = Array.isArray(tokens) ? tokens : [];
86
92
  return list
87
- .filter((h) => typeof h.assetRef === 'string' && h.assetRef.split('/')[0] === chainRef)
88
- .filter((h) => typeof h.symbol === 'string' && typeof h.amount === 'number' && h.amount > 0)
89
- .map((h) => ({ symbol: h.symbol, amount: h.amount }))
90
- .sort((a, b) => b.amount - a.amount);
93
+ .filter((t) => t.chainId === chainId)
94
+ .filter((t) => typeof t.assetRef === 'string' && typeof t.decimals === 'number')
95
+ .map((t) => ({
96
+ assetRef: String(t.assetRef),
97
+ address: String(t.tokenAddress ?? ''),
98
+ symbol: String(t.symbol ?? ''),
99
+ name: t.name === undefined ? undefined : String(t.name),
100
+ decimals: Number(t.decimals),
101
+ amount: typeof t.amount === 'number' ? t.amount : undefined,
102
+ source: t.source === undefined ? undefined : String(t.source),
103
+ spendable: t.spendable === undefined ? undefined : Boolean(t.spendable),
104
+ }))
105
+ .sort((a, b) => (b.amount ?? 0) - (a.amount ?? 0));
106
+ }
107
+ const EVM_ADDRESS_RE = /^0x[0-9a-fA-F]{40}$/;
108
+ /** Namespace:reference/assetNamespace: - loose on purpose (CAIP-19 has no public grammar doc this repo
109
+ * pins to); it only needs to distinguish a real asset ref from a bare symbol like "USDC". */
110
+ const CAIP19_PREFIX_RE = /^[-a-z0-9]{3,8}:[-_a-zA-Z0-9]{1,32}\/[-a-z0-9]{3,8}:/;
111
+ /** True for something this CLI will pass through to `resolveAsset` as a token identifier - a contract
112
+ * address or a CAIP-19 asset ref. False for anything else, symbols included: `--token` is address-only
113
+ * (Task 9), because a symbol is a label a contract picks for itself and two contracts on one chain can
114
+ * legally share one. */
115
+ export function isTokenRef(value) {
116
+ const v = value.trim();
117
+ return EVM_ADDRESS_RE.test(v) || CAIP19_PREFIX_RE.test(v);
118
+ }
119
+ /**
120
+ * The refusal a symbol earns - which does the lookup for the user rather than merely complaining. "Pass
121
+ * the contract address instead" is an instruction to go and find one somewhere else unless the CLI ships
122
+ * the thing that finds it, so this reads the account's own holdings and prints every match as a
123
+ * ready-to-paste `--token` flag. A usage error that leaves someone hunting through a block explorer for
124
+ * an address is a worse experience than the symbol ambiguity it is protecting them from.
125
+ */
126
+ export function symbolRefusalMessage(symbol, chainName, matches) {
127
+ if (matches.length === 0) {
128
+ return (`"${symbol}" is a symbol, not a token - and this account holds no token called "${symbol}" on ` +
129
+ `${chainName}. Run \`botanary tokens --chain-id <id>\` to see what it does hold.`);
130
+ }
131
+ const lines = matches.map((m) => ` --token ${m.address} ${m.symbol} ${m.decimals}dp ${m.source ?? 'unknown source'}`);
132
+ const count = matches.length === 1 ? 'One token' : `${matches.length} tokens`;
133
+ return (`"${symbol}" is a symbol, not a token. A symbol is a label a contract picks for itself, so Botanary ` +
134
+ `will not guess which you meant. ${count} you hold on ${chainName} answer${matches.length === 1 ? 's' : ''} to it:\n` +
135
+ lines.join('\n') +
136
+ `\n Pass one of those. \`botanary tokens\` lists them all.`);
91
137
  }
92
138
  //# sourceMappingURL=validate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,15 +1,22 @@
1
1
  {
2
2
  "name": "botanary",
3
3
  "type": "module",
4
- "version": "0.2.1",
4
+ "version": "0.3.0",
5
5
  "description": "Botanary from your terminal - a guided CLI over the same wallet and agent lanes botanary-mcp exposes to a coding agent.",
6
6
  "license": "UNLICENSED",
7
7
  "homepage": "https://docs.botanary.xyz",
8
- "keywords": ["botanary", "cli", "wallet"],
8
+ "keywords": [
9
+ "botanary",
10
+ "cli",
11
+ "wallet"
12
+ ],
9
13
  "bin": {
10
14
  "botanary": "dist/bin/botanary.js"
11
15
  },
12
- "files": ["dist", "README.md"],
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
13
20
  "engines": {
14
21
  "node": ">=22.0.0"
15
22
  },
@@ -23,13 +30,13 @@
23
30
  "test:watch": "vitest"
24
31
  },
25
32
  "dependencies": {
26
- "botanary-mcp": "^0.6.1",
27
- "commander": "^13.1.0",
28
33
  "@clack/prompts": "^0.9.1",
29
- "picocolors": "^1.1.1",
30
- "gradient-string": "^3.0.0",
34
+ "botanary-mcp": "^0.7.0",
35
+ "cli-table3": "^0.6.5",
36
+ "commander": "^13.1.0",
31
37
  "figlet": "^1.7.0",
32
- "cli-table3": "^0.6.5"
38
+ "gradient-string": "^3.0.0",
39
+ "picocolors": "^1.1.1"
33
40
  },
34
41
  "devDependencies": {
35
42
  "@swc-node/register": "^1.10.9",
@@ -1,44 +0,0 @@
1
- import { columns, dash, section } from './kv.js';
2
- const HEADERS = ['ID', 'NAME', 'CATEGORY', 'ENDPOINTS', 'VERIFIED', 'MIN PRICE (ATOMIC)', 'MAX PRICE (ATOMIC)'];
3
- /**
4
- * Render atomic price units honestly: null renders as a dash, strings render as-is.
5
- * Never converts to decimals or adds currency symbols.
6
- */
7
- function priceAtomicCell(priceUnits) {
8
- if (priceUnits === null || priceUnits === undefined)
9
- return '-';
10
- return String(priceUnits);
11
- }
12
- export function providerRows(providers) {
13
- const list = Array.isArray(providers) ? providers : [];
14
- return list
15
- .filter((provider) => provider !== null && typeof provider === 'object')
16
- .map((provider) => [
17
- dash(provider.id),
18
- dash(provider.name),
19
- dash(provider.category),
20
- dash(provider.endpointCount),
21
- dash(provider.verifiedCount),
22
- priceAtomicCell(provider.minPriceUnits),
23
- priceAtomicCell(provider.maxPriceUnits),
24
- ]);
25
- }
26
- export function renderApis(response) {
27
- const data = response;
28
- const providers = data?.providers;
29
- const rows = providerRows(providers);
30
- if (!rows.length)
31
- return `${section('API Providers')}\n No providers available.`;
32
- const output = [section('API Providers'), columns(HEADERS, rows)];
33
- // Surface filtering info if providers were hidden
34
- if (data?.hidden && data.hidden > 0) {
35
- output.push('');
36
- output.push(section('Hidden'));
37
- output.push(` ${data.hidden} provider(s) have no endpoints on this chain.`);
38
- if (data.reasonsTruncated) {
39
- output.push(' (Reasons truncated at 50 entries)');
40
- }
41
- }
42
- return output.join('\n');
43
- }
44
- //# sourceMappingURL=apis.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"apis.js","sourceRoot":"","sources":["../../../src/render/apis.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAmBjD,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;AAEhH;;;GAGG;AACH,SAAS,eAAe,CAAC,UAAmB;IAC1C,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC;IAChE,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,SAAkB;IAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,SAA2B,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1E,OAAO,IAAI;SACR,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,QAAQ,KAAK,QAAQ,CAAC;SACvE,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC5B,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC;QACvC,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC;KACxC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAiB;IAC1C,MAAM,IAAI,GAAG,QAA2B,CAAC;IACzC,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,CAAC;IAElC,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IACrC,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,6BAA6B,CAAC;IAElF,MAAM,MAAM,GAAa,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAE5E,kDAAkD;IAClD,IAAI,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,+CAA+C,CAAC,CAAC;QAC7E,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
@@ -1,10 +0,0 @@
1
- /** --json forces it on. Otherwise: a non-TTY stdout (piped, redirected, or run from another program)
2
- * auto-enables it, matching the Alchemy CLI reference exactly. --no-interactive alone does NOT force
3
- * JSON - it only disables prompts; a human running --no-interactive in a real terminal still wants
4
- * human-readable output unless they also asked for --json or piped it. */
5
- export function isJsonMode(opts, stdout = process.stdout) {
6
- if (opts.json)
7
- return true;
8
- return !stdout.isTTY;
9
- }
10
- //# sourceMappingURL=json-mode.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"json-mode.js","sourceRoot":"","sources":["../../../src/render/json-mode.ts"],"names":[],"mappings":"AAKA;;;2EAG2E;AAC3E,MAAM,UAAU,UAAU,CAAC,IAAkB,EAAE,SAA8B,OAAO,CAAC,MAAM;IACzF,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AACvB,CAAC"}