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.
- package/README.md +186 -9
- package/dist/bin/botanary.js +13 -3
- package/dist/bin/botanary.js.map +1 -1
- package/dist/package.json +2 -2
- package/dist/src/app-url.js +32 -0
- package/dist/src/app-url.js.map +1 -0
- package/dist/src/cli.js +113 -23
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/agent.js +190 -49
- package/dist/src/commands/agent.js.map +1 -1
- package/dist/src/commands/mcp.js +136 -5
- package/dist/src/commands/mcp.js.map +1 -1
- package/dist/src/commands/system.js +109 -12
- package/dist/src/commands/system.js.map +1 -1
- package/dist/src/commands/utilities.js +44 -0
- package/dist/src/commands/utilities.js.map +1 -0
- package/dist/src/commands/wallet.js +332 -94
- package/dist/src/commands/wallet.js.map +1 -1
- package/dist/src/completion.js +69 -0
- package/dist/src/completion.js.map +1 -0
- package/dist/src/config-store.js +52 -0
- package/dist/src/config-store.js.map +1 -0
- package/dist/src/context.js +14 -4
- package/dist/src/context.js.map +1 -1
- package/dist/src/errors.js +116 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/help/examples.js +357 -0
- package/dist/src/help/examples.js.map +1 -0
- package/dist/src/help/format.js +144 -0
- package/dist/src/help/format.js.map +1 -0
- package/dist/src/help/groups.js +39 -0
- package/dist/src/help/groups.js.map +1 -0
- package/dist/src/mcp-snippets.js +6 -0
- package/dist/src/mcp-snippets.js.map +1 -1
- package/dist/src/outcome.js +63 -0
- package/dist/src/outcome.js.map +1 -0
- package/dist/src/parser.js +18 -39
- package/dist/src/parser.js.map +1 -1
- package/dist/src/progress.js +37 -0
- package/dist/src/progress.js.map +1 -0
- package/dist/src/prompt-doc.js +92 -0
- package/dist/src/prompt-doc.js.map +1 -0
- package/dist/src/render/accounts.js +21 -0
- package/dist/src/render/accounts.js.map +1 -0
- package/dist/src/render/activity.js +34 -0
- package/dist/src/render/activity.js.map +1 -0
- package/dist/src/render/agents.js +42 -0
- package/dist/src/render/agents.js.map +1 -0
- package/dist/src/render/balance.js +68 -0
- package/dist/src/render/balance.js.map +1 -0
- package/dist/src/render/chains.js +52 -0
- package/dist/src/render/chains.js.map +1 -0
- package/dist/src/render/gas.js +34 -0
- package/dist/src/render/gas.js.map +1 -0
- package/dist/src/render/grant.js +34 -0
- package/dist/src/render/grant.js.map +1 -0
- package/dist/src/render/kv.js +60 -0
- package/dist/src/render/kv.js.map +1 -0
- package/dist/src/render/mandates.js +111 -0
- package/dist/src/render/mandates.js.map +1 -0
- package/dist/src/render/print.js +18 -0
- package/dist/src/render/print.js.map +1 -0
- package/dist/src/repl.js +114 -10
- package/dist/src/repl.js.map +1 -1
- package/dist/src/review.js +52 -0
- package/dist/src/review.js.map +1 -0
- package/dist/src/settings.js +88 -0
- package/dist/src/settings.js.map +1 -0
- package/dist/src/update-check.js +85 -0
- package/dist/src/update-check.js.map +1 -0
- package/dist/src/validate.js +92 -0
- package/dist/src/validate.js.map +1 -0
- package/package.json +2 -2
|
@@ -1,15 +1,26 @@
|
|
|
1
|
-
import { runDiagnose, botanaryMcpHome } from 'botanary-mcp';
|
|
1
|
+
import { runDiagnose, botanaryMcpHome, openBrowser } from 'botanary-mcp';
|
|
2
2
|
import { renderTable } from '../render/table.js';
|
|
3
|
-
import { glyphs } from '../render/colors.js';
|
|
3
|
+
import { colors, glyphs } from '../render/colors.js';
|
|
4
|
+
import { columns, section } from '../render/kv.js';
|
|
5
|
+
import { group, DOCS_URL } from '../help/groups.js';
|
|
6
|
+
import { CONFIG_KEYS, assertKnownKey, configPath, readConfig, validateEntry, writeConfig } from '../config-store.js';
|
|
7
|
+
import { step } from '../progress.js';
|
|
8
|
+
import { printResult } from '../render/print.js';
|
|
9
|
+
/** Which resolved setting each config key feeds, so `config list` can show the value actually in force. */
|
|
10
|
+
const KEY_TO_SETTING = {
|
|
11
|
+
chainId: 'chain',
|
|
12
|
+
accountId: 'account',
|
|
13
|
+
apiUrl: 'apiUrl',
|
|
14
|
+
output: 'json',
|
|
15
|
+
color: 'color',
|
|
16
|
+
confirm: 'yes',
|
|
17
|
+
};
|
|
4
18
|
export function registerSystemCommands(program, cliVersion) {
|
|
5
|
-
|
|
6
|
-
.command('diagnose')
|
|
7
|
-
.description('START HERE when anything is unclear or an action failed - one call answers what is blocking the next step')
|
|
8
|
-
.action(async () => {
|
|
19
|
+
const diagnoseAction = async () => {
|
|
9
20
|
const ctx = program.opts().__ctx;
|
|
10
|
-
const report = await runDiagnose(ctx.runtime);
|
|
11
|
-
if (ctx.json) {
|
|
12
|
-
console.log(JSON.stringify(report));
|
|
21
|
+
const report = await step(ctx, 'Checking what is blocking the next step', () => runDiagnose(ctx.runtime));
|
|
22
|
+
if (ctx.json || ctx.raw) {
|
|
23
|
+
console.log(ctx.json ? JSON.stringify(report) : JSON.stringify(report, null, 2));
|
|
13
24
|
return;
|
|
14
25
|
}
|
|
15
26
|
console.log(report.summary);
|
|
@@ -17,15 +28,24 @@ export function registerSystemCommands(program, cliVersion) {
|
|
|
17
28
|
console.log(blocker.severity === 'blocking' ? glyphs.danger(blocker.detail) : glyphs.warning(blocker.detail));
|
|
18
29
|
console.log(` ${blocker.nextAction}`);
|
|
19
30
|
}
|
|
20
|
-
}
|
|
21
|
-
program
|
|
31
|
+
};
|
|
32
|
+
group(program
|
|
33
|
+
.command('diagnose')
|
|
34
|
+
.description('Start here when anything is unclear or an action failed')
|
|
35
|
+
.action(diagnoseAction), 'System');
|
|
36
|
+
// Every CLI in this space calls it `doctor`, so that is what people type. Same action, not a wrapper
|
|
37
|
+
// that could drift.
|
|
38
|
+
group(program.command('doctor').description('The same readiness check as diagnose').action(diagnoseAction), 'System');
|
|
39
|
+
const config = group(program
|
|
22
40
|
.command('config')
|
|
23
|
-
.description('Where identity
|
|
41
|
+
.description('Where identity and session live, and this machine\'s CLI defaults')
|
|
24
42
|
.action(() => {
|
|
25
43
|
const ctx = program.opts().__ctx;
|
|
26
44
|
const rows = [
|
|
27
45
|
['home', botanaryMcpHome()],
|
|
46
|
+
['config file', configPath()],
|
|
28
47
|
['BOTANARY_API_URL', process.env.BOTANARY_API_URL ?? '(not set, defaults to https://api.app.botanary.xyz)'],
|
|
48
|
+
['api url in use', ctx.settings.apiUrl ?? 'https://api.app.botanary.xyz'],
|
|
29
49
|
['cli-version', cliVersion],
|
|
30
50
|
];
|
|
31
51
|
if (ctx.json) {
|
|
@@ -33,6 +53,83 @@ export function registerSystemCommands(program, cliVersion) {
|
|
|
33
53
|
return;
|
|
34
54
|
}
|
|
35
55
|
console.log(renderTable(rows));
|
|
56
|
+
}), 'System');
|
|
57
|
+
config
|
|
58
|
+
.command('list')
|
|
59
|
+
.description('Every setting, its value, and where that value came from')
|
|
60
|
+
.action(async () => {
|
|
61
|
+
const ctx = program.opts().__ctx;
|
|
62
|
+
const file = await readConfig();
|
|
63
|
+
const settings = ctx.settings;
|
|
64
|
+
const rows = CONFIG_KEYS.map((key) => {
|
|
65
|
+
const settingName = KEY_TO_SETTING[key];
|
|
66
|
+
return [
|
|
67
|
+
key,
|
|
68
|
+
String(file[key] ?? '-'),
|
|
69
|
+
String(settings[settingName] ?? '-'),
|
|
70
|
+
// The whole point of this command: a stored value that overrides nothing looks identical to one
|
|
71
|
+
// silently retargeting every command, unless the source is shown.
|
|
72
|
+
ctx.settings.provenance[settingName] ?? 'default',
|
|
73
|
+
];
|
|
74
|
+
});
|
|
75
|
+
if (ctx.json) {
|
|
76
|
+
console.log(JSON.stringify(rows.map(([k, stored, inForce, from]) => ({ key: k, stored, inForce, from }))));
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
console.log([section('Config'), columns(['KEY', 'STORED', 'IN FORCE', 'FROM'], rows), colors.dim(` ${configPath()}`)].join('\n'));
|
|
80
|
+
});
|
|
81
|
+
config
|
|
82
|
+
.command('get <key>')
|
|
83
|
+
.description('Print one stored config value')
|
|
84
|
+
.action(async (key) => {
|
|
85
|
+
const ctx = program.opts().__ctx;
|
|
86
|
+
const narrowed = assertKnownKey(key);
|
|
87
|
+
const file = await readConfig();
|
|
88
|
+
const value = file[narrowed];
|
|
89
|
+
console.log(ctx.json ? JSON.stringify({ key: narrowed, value: value ?? null }) : (value ?? '(unset)'));
|
|
90
|
+
});
|
|
91
|
+
config
|
|
92
|
+
.command('set <key> <value>')
|
|
93
|
+
.description('Store a default for one setting')
|
|
94
|
+
.action(async (key, value) => {
|
|
95
|
+
const ctx = program.opts().__ctx;
|
|
96
|
+
const entry = validateEntry(key, value);
|
|
97
|
+
const next = { ...(await readConfig()), [entry.key]: entry.value };
|
|
98
|
+
await writeConfig(next);
|
|
99
|
+
console.log(ctx.json ? JSON.stringify({ key: entry.key, value: entry.value }) : glyphs.success(`${entry.key} = ${entry.value}`));
|
|
36
100
|
});
|
|
101
|
+
config
|
|
102
|
+
.command('unset <key>')
|
|
103
|
+
.description('Remove one stored default')
|
|
104
|
+
.action(async (key) => {
|
|
105
|
+
const ctx = program.opts().__ctx;
|
|
106
|
+
const narrowed = assertKnownKey(key);
|
|
107
|
+
const next = { ...(await readConfig()) };
|
|
108
|
+
delete next[narrowed];
|
|
109
|
+
await writeConfig(next);
|
|
110
|
+
console.log(ctx.json ? JSON.stringify({ key: narrowed, value: null }) : glyphs.success(`${narrowed} unset`));
|
|
111
|
+
});
|
|
112
|
+
group(program
|
|
113
|
+
.command('version')
|
|
114
|
+
.description('Print the installed botanary CLI version')
|
|
115
|
+
.action(() => {
|
|
116
|
+
const ctx = program.opts().__ctx;
|
|
117
|
+
printResult(ctx, { version: cliVersion }, () => cliVersion);
|
|
118
|
+
}), 'Utilities');
|
|
119
|
+
group(program
|
|
120
|
+
.command('docs [topic]')
|
|
121
|
+
.description('Open the Botanary documentation in your browser')
|
|
122
|
+
.action(async (topic) => {
|
|
123
|
+
const ctx = program.opts().__ctx;
|
|
124
|
+
// A topic becomes a docs path directly. No invented topic map: an unrecognised one lands on the
|
|
125
|
+
// docs site's own 404, which is a truthful answer rather than a guess at where it moved.
|
|
126
|
+
const url = topic ? `${DOCS_URL}/docs/${encodeURIComponent(topic)}` : DOCS_URL;
|
|
127
|
+
const opened = await openBrowser(url);
|
|
128
|
+
if (ctx.json) {
|
|
129
|
+
console.log(JSON.stringify({ url, opened }));
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
console.log(opened ? glyphs.success(`Opened ${url}`) : glyphs.info(`Docs: ${url}`));
|
|
133
|
+
}), 'Utilities');
|
|
37
134
|
}
|
|
38
135
|
//# sourceMappingURL=system.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/commands/system.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"system.js","sourceRoot":"","sources":["../../../src/commands/system.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { group } from '../help/groups.js';
|
|
2
|
+
import { SHELLS, completionScript } from '../completion.js';
|
|
3
|
+
import { promptDoc } from '../prompt-doc.js';
|
|
4
|
+
import { step } from '../progress.js';
|
|
5
|
+
import { glyphs } from '../render/colors.js';
|
|
6
|
+
import { checkForUpdate, nagLine } from '../update-check.js';
|
|
7
|
+
export function registerUtilityCommands(program, cliVersion) {
|
|
8
|
+
group(program
|
|
9
|
+
.command('completion <shell>')
|
|
10
|
+
.description(`Print a shell completion script (${SHELLS.join(', ')})`)
|
|
11
|
+
.action((shell) => {
|
|
12
|
+
// Written to stdout raw, with no glyphs or color: its destination is a shell profile.
|
|
13
|
+
process.stdout.write(completionScript(shell, program));
|
|
14
|
+
}), 'Utilities');
|
|
15
|
+
group(program
|
|
16
|
+
.command('prompt')
|
|
17
|
+
.description('Print the full operating manual for an automation driving this CLI')
|
|
18
|
+
.action(() => {
|
|
19
|
+
const ctx = program.opts().__ctx;
|
|
20
|
+
const doc = promptDoc(program, cliVersion);
|
|
21
|
+
if (ctx.json) {
|
|
22
|
+
console.log(JSON.stringify({ prompt: doc }));
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
process.stdout.write(doc);
|
|
26
|
+
}), 'Utilities');
|
|
27
|
+
group(program
|
|
28
|
+
.command('update-check')
|
|
29
|
+
.description('Check whether a newer botanary is published')
|
|
30
|
+
.action(async () => {
|
|
31
|
+
const ctx = program.opts().__ctx;
|
|
32
|
+
const result = await step(ctx, 'Asking npm', () => checkForUpdate(cliVersion, { fetchImpl: fetch, now: () => Date.now(), force: true }));
|
|
33
|
+
if (ctx.json) {
|
|
34
|
+
console.log(JSON.stringify(result));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (result.latest === null) {
|
|
38
|
+
console.log(glyphs.info('Could not reach the npm registry. Nothing changed.'));
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
console.log(result.newer ? glyphs.warning(nagLine(result.latest, cliVersion)) : glyphs.success(`Up to date (${cliVersion}).`));
|
|
42
|
+
}), 'Utilities');
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=utilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utilities.js","sourceRoot":"","sources":["../../../src/commands/utilities.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7D,MAAM,UAAU,uBAAuB,CAAC,OAAgB,EAAE,UAAkB;IAC1E,KAAK,CACH,OAAO;SACJ,OAAO,CAAC,oBAAoB,CAAC;SAC7B,WAAW,CAAC,oCAAoC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;SACrE,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE;QACxB,sFAAsF;QACtF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IACzD,CAAC,CAAC,EACJ,WAAW,CACZ,CAAC;IAEF,KAAK,CACH,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,oEAAoE,CAAC;SACjF,MAAM,CAAC,GAAG,EAAE;QACX,MAAM,GAAG,GAAe,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QAC3C,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YAC7C,OAAO;QACT,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC,CAAC,EACJ,WAAW,CACZ,CAAC;IAEF,KAAK,CACH,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,6CAA6C,CAAC;SAC1D,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,GAAG,GAAe,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;QAC7C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,CAChD,cAAc,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CACrF,CAAC;QACF,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YACpC,OAAO;QACT,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC,CAAC;YAC/E,OAAO;QACT,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,UAAU,IAAI,CAAC,CAAC,CAAC;IACjI,CAAC,CAAC,EACJ,WAAW,CACZ,CAAC;AACJ,CAAC"}
|