@duyquangnvx/agent-cli 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.
- package/CHANGELOG.md +49 -0
- package/dist/abort.d.ts +2 -0
- package/dist/abort.js +11 -0
- package/dist/abort.js.map +1 -0
- package/dist/agent-cli.d.ts +17 -0
- package/dist/agent-cli.js +28 -0
- package/dist/agent-cli.js.map +1 -0
- package/dist/agent.d.ts +4 -0
- package/dist/agent.js +14 -0
- package/dist/agent.js.map +1 -0
- package/dist/built-ins.d.ts +1 -2
- package/dist/built-ins.js +0 -10
- package/dist/built-ins.js.map +1 -1
- package/dist/clock.d.ts +10 -0
- package/dist/clock.js +35 -0
- package/dist/clock.js.map +1 -0
- package/dist/command-spec.js +8 -1
- package/dist/command-spec.js.map +1 -1
- package/dist/confirm.d.ts +2 -0
- package/dist/confirm.js +4 -2
- package/dist/confirm.js.map +1 -1
- package/dist/cost.d.ts +9 -0
- package/dist/cost.js +16 -0
- package/dist/cost.js.map +1 -0
- package/dist/define.d.ts +133 -32
- package/dist/define.js +5 -1
- package/dist/define.js.map +1 -1
- package/dist/doctor-rows.d.ts +2 -2
- package/dist/doctor-rows.js +42 -5
- package/dist/doctor-rows.js.map +1 -1
- package/dist/doctor.d.ts +2 -1
- package/dist/doctor.js +26 -28
- package/dist/doctor.js.map +1 -1
- package/dist/errno.d.ts +12 -0
- package/dist/errno.js +40 -0
- package/dist/errno.js.map +1 -0
- package/dist/error-table.d.ts +34 -0
- package/dist/error-table.js +10 -0
- package/dist/error-table.js.map +1 -0
- package/dist/errors.d.ts +17 -12
- package/dist/errors.js +59 -38
- package/dist/errors.js.map +1 -1
- package/dist/execute.d.ts +9 -3
- package/dist/execute.js +38 -5
- package/dist/execute.js.map +1 -1
- package/dist/exit-classes.d.ts +31 -0
- package/dist/exit-classes.js +107 -0
- package/dist/exit-classes.js.map +1 -0
- package/dist/files.d.ts +9 -0
- package/dist/files.js +59 -0
- package/dist/files.js.map +1 -0
- package/dist/flags.d.ts +17 -3
- package/dist/flags.js +26 -4
- package/dist/flags.js.map +1 -1
- package/dist/global-install.d.ts +1 -0
- package/dist/global-install.js +2 -2
- package/dist/global-install.js.map +1 -1
- package/dist/help-json.d.ts +2 -1
- package/dist/help-json.js +18 -2
- package/dist/help-json.js.map +1 -1
- package/dist/help.d.ts +4 -2
- package/dist/help.js +62 -6
- package/dist/help.js.map +1 -1
- package/dist/index.d.ts +10 -4
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/interrupts.d.ts +17 -3
- package/dist/interrupts.js +43 -25
- package/dist/interrupts.js.map +1 -1
- package/dist/invocation.d.ts +7 -2
- package/dist/invocation.js +11 -3
- package/dist/invocation.js.map +1 -1
- package/dist/list.d.ts +1 -0
- package/dist/list.js +4 -2
- package/dist/list.js.map +1 -1
- package/dist/npm.d.ts +5 -0
- package/dist/npm.js +19 -17
- package/dist/npm.js.map +1 -1
- package/dist/output.d.ts +18 -4
- package/dist/output.js +65 -23
- package/dist/output.js.map +1 -1
- package/dist/outputs.d.ts +11 -0
- package/dist/outputs.js +22 -0
- package/dist/outputs.js.map +1 -0
- package/dist/package-root.d.ts +6 -0
- package/dist/package-root.js +17 -0
- package/dist/package-root.js.map +1 -0
- package/dist/parse-input.d.ts +2 -0
- package/dist/parse-input.js +5 -3
- package/dist/parse-input.js.map +1 -1
- package/dist/project.d.ts +4 -0
- package/dist/project.js +48 -0
- package/dist/project.js.map +1 -0
- package/dist/route.d.ts +2 -0
- package/dist/route.js +2 -1
- package/dist/route.js.map +1 -1
- package/dist/run-cli.d.ts +24 -5
- package/dist/run-cli.js +122 -17
- package/dist/run-cli.js.map +1 -1
- package/dist/run-process.js +6 -3
- package/dist/run-process.js.map +1 -1
- package/dist/secrets.d.ts +13 -0
- package/dist/secrets.js +29 -0
- package/dist/secrets.js.map +1 -0
- package/dist/spawn.d.ts +29 -0
- package/dist/spawn.js +79 -0
- package/dist/spawn.js.map +1 -0
- package/dist/spill.d.ts +16 -0
- package/dist/spill.js +60 -0
- package/dist/spill.js.map +1 -0
- package/dist/style.js +5 -12
- package/dist/style.js.map +1 -1
- package/dist/tail.d.ts +2 -0
- package/dist/tail.js +5 -0
- package/dist/tail.js.map +1 -0
- package/dist/tools.d.ts +6 -0
- package/dist/tools.js +69 -0
- package/dist/tools.js.map +1 -0
- package/dist/update.js +7 -7
- package/dist/update.js.map +1 -1
- package/dist/usage.d.ts +3 -0
- package/dist/usage.js +6 -3
- package/dist/usage.js.map +1 -1
- package/package.json +1 -1
package/dist/run-cli.d.ts
CHANGED
|
@@ -1,16 +1,35 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type Clock } from "./clock.js";
|
|
2
|
+
import type { Cli, Env, NoPorts } from "./define.js";
|
|
3
|
+
import { type Files } from "./files.js";
|
|
2
4
|
import { type RunResult } from "./output.js";
|
|
3
|
-
|
|
5
|
+
import { type Spawn } from "./spawn.js";
|
|
6
|
+
export interface RunOptions<Ports = NoPorts> {
|
|
4
7
|
readonly env: Env;
|
|
5
8
|
readonly cwd: string;
|
|
6
9
|
readonly stdoutIsTTY?: boolean;
|
|
7
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* Aborting it interrupts the running Command, which then ends with `INTERRUPTED`: exit 143 when
|
|
12
|
+
* the abort reason is `"SIGTERM"`, else 130, as for Ctrl-C.
|
|
13
|
+
*/
|
|
8
14
|
readonly signal?: AbortSignal;
|
|
9
15
|
/**
|
|
10
16
|
* The script that started the CLI, as `process.argv[1]`; `doctor` checks it is inside npm's
|
|
11
17
|
* global install. Absent, the CLI counts as run from source.
|
|
12
18
|
*/
|
|
13
19
|
readonly bin?: string;
|
|
20
|
+
/** Replaces the ports the CLI's factory builds, for a test. */
|
|
21
|
+
readonly ports?: Ports;
|
|
22
|
+
/** Replaces the real clock, for a test that runs deadlines and waits instantly. */
|
|
23
|
+
readonly clock?: Clock;
|
|
24
|
+
/** Replaces the real file system, for a test of a write that fails. */
|
|
25
|
+
readonly files?: Files;
|
|
26
|
+
/** Replaces the real child processes, for a test of a tool that fails. */
|
|
27
|
+
readonly spawn?: Spawn;
|
|
28
|
+
}
|
|
29
|
+
/** Where output that cannot wait for the run's end is written as it happens. */
|
|
30
|
+
export interface Writers {
|
|
31
|
+
stdout(text: string): void;
|
|
32
|
+
stderr(text: string): void;
|
|
14
33
|
}
|
|
15
|
-
export declare function runCli(cli: Cli, argv: readonly string[], options: RunOptions): Promise<RunResult>;
|
|
16
|
-
export declare function runWithProgress(cli: Cli, argv: readonly string[], options: RunOptions
|
|
34
|
+
export declare function runCli<Ports, Settings>(cli: Cli<Ports, Settings>, argv: readonly string[], options: RunOptions<NoInfer<Ports>>): Promise<RunResult>;
|
|
35
|
+
export declare function runWithProgress(cli: Cli, argv: readonly string[], options: RunOptions<unknown>, write: Writers): Promise<RunResult>;
|
package/dist/run-cli.js
CHANGED
|
@@ -1,84 +1,189 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { isAgent } from "./agent.js";
|
|
1
3
|
import { builtInCommands } from "./built-ins.js";
|
|
4
|
+
import { poll, realClock } from "./clock.js";
|
|
2
5
|
import { commandSpec, groupSpec } from "./command-spec.js";
|
|
3
|
-
import {
|
|
6
|
+
import { classifyErrno } from "./errno.js";
|
|
7
|
+
import { deliveredOutcome, execute } from "./execute.js";
|
|
8
|
+
import { realFiles } from "./files.js";
|
|
4
9
|
import { RunControl } from "./interrupts.js";
|
|
5
|
-
import {
|
|
10
|
+
import { commandLineOf } from "./invocation.js";
|
|
11
|
+
import { commandResult, errorResult, helpResult, STOPPED_RESULT, startedOutput, textHelp, versionResult, } from "./output.js";
|
|
12
|
+
import { packageRootOf } from "./package-root.js";
|
|
6
13
|
import { parseCommand } from "./parse-input.js";
|
|
14
|
+
import { projectOf } from "./project.js";
|
|
7
15
|
import { route } from "./route.js";
|
|
16
|
+
import { secretOf } from "./secrets.js";
|
|
17
|
+
import { contextSpawn, realSpawn } from "./spawn.js";
|
|
18
|
+
import { spillTo } from "./spill.js";
|
|
8
19
|
import { styleFor } from "./style.js";
|
|
9
|
-
|
|
20
|
+
/** `files` resolving paths against `cwd`, its failures classified by errno. */
|
|
21
|
+
function classifiedFiles(files, base, callerLine) {
|
|
22
|
+
return {
|
|
23
|
+
exists: async (path) => {
|
|
24
|
+
const target = resolve(base.cwd, path);
|
|
25
|
+
try {
|
|
26
|
+
return await files.exists(target);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
throw classifyErrno(error, { path: target, callerLine, env: base.env });
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
write: async (path, data) => {
|
|
33
|
+
const target = resolve(base.cwd, path);
|
|
34
|
+
try {
|
|
35
|
+
await files.write(target, data);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
throw classifyErrno(error, { path: target, callerLine, env: base.env });
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async function runCommand(routed, { base, writeStdout, signal, format: baseFormat, ports, clock, files, spawn, projectFile }) {
|
|
10
44
|
const { command, commandLine } = routed.spec;
|
|
11
45
|
const format = { ...baseFormat, json: routed.json };
|
|
12
46
|
const { invocation } = format;
|
|
13
47
|
let parsed;
|
|
48
|
+
let project;
|
|
14
49
|
try {
|
|
15
50
|
parsed = parseCommand(routed, invocation);
|
|
51
|
+
project = projectFile === undefined ? undefined : projectOf(projectFile, base.cwd);
|
|
16
52
|
}
|
|
17
53
|
catch (error) {
|
|
18
54
|
return errorResult(error, format);
|
|
19
55
|
}
|
|
20
56
|
const { input, flags } = parsed;
|
|
21
|
-
const control = new RunControl(
|
|
57
|
+
const control = new RunControl({
|
|
58
|
+
commandLine,
|
|
59
|
+
outer: signal,
|
|
60
|
+
clock,
|
|
61
|
+
progress: base.progress,
|
|
62
|
+
runDeadline: command.deadline === undefined
|
|
63
|
+
? undefined
|
|
64
|
+
: { ms: command.deadline.ms, hint: command.deadline.resume(input) },
|
|
65
|
+
});
|
|
66
|
+
let delivered;
|
|
67
|
+
const callerLine = commandLineOf(invocation);
|
|
68
|
+
const classified = classifiedFiles(files, base, callerLine);
|
|
69
|
+
const spill = spillTo({
|
|
70
|
+
cliName: format.cliName,
|
|
71
|
+
commandName: command.name,
|
|
72
|
+
env: base.env,
|
|
73
|
+
clock,
|
|
74
|
+
files: classified,
|
|
75
|
+
callerLine,
|
|
76
|
+
});
|
|
22
77
|
const ctx = {
|
|
23
78
|
...base,
|
|
24
79
|
signal: control.signal,
|
|
25
80
|
deadline: (ms) => control.deadline(ms),
|
|
26
|
-
runToEnd: (work) => control.runToEnd(work),
|
|
81
|
+
runToEnd: (name, work) => control.runToEnd(name, work),
|
|
82
|
+
ports: ports(),
|
|
83
|
+
clock,
|
|
84
|
+
files: classified,
|
|
85
|
+
spawn: contextSpawn(spawn, { cwd: base.cwd, env: base.env, signal: control.signal }, callerLine),
|
|
86
|
+
project,
|
|
87
|
+
poll: (check, { intervalMs }) => poll(clock, check, intervalMs, control.signal),
|
|
88
|
+
deliver: (data) => {
|
|
89
|
+
delivered = deliveredOutcome(command, data);
|
|
90
|
+
},
|
|
27
91
|
};
|
|
92
|
+
let served = false;
|
|
28
93
|
let settled;
|
|
29
94
|
try {
|
|
30
95
|
const outcome = await control.settle(execute(command, input, ctx, {
|
|
31
96
|
dryRun: flags.dryRun,
|
|
32
97
|
confirm: flags.confirm,
|
|
98
|
+
yes: flags.yes,
|
|
99
|
+
force: flags.force,
|
|
33
100
|
page: flags.page,
|
|
34
101
|
invocation,
|
|
35
102
|
commandLine,
|
|
103
|
+
started: async (outcome) => {
|
|
104
|
+
writeStdout(await startedOutput(outcome, format, spill));
|
|
105
|
+
served = true;
|
|
106
|
+
},
|
|
36
107
|
}));
|
|
37
108
|
settled = { ok: true, outcome };
|
|
38
109
|
}
|
|
39
110
|
catch (error) {
|
|
111
|
+
if (served && control.signal.aborted) {
|
|
112
|
+
return STOPPED_RESULT;
|
|
113
|
+
}
|
|
40
114
|
settled = {
|
|
41
115
|
ok: false,
|
|
42
116
|
error: control.errorAfter(error),
|
|
43
|
-
|
|
117
|
+
delivered,
|
|
44
118
|
};
|
|
45
119
|
}
|
|
46
|
-
return commandResult(settled, { ...format, fields: flags.fields });
|
|
120
|
+
return commandResult(settled, { ...format, fields: flags.fields }, spill);
|
|
47
121
|
}
|
|
48
122
|
export async function runCli(cli, argv, options) {
|
|
49
|
-
const
|
|
50
|
-
const
|
|
51
|
-
|
|
123
|
+
const stdout = [];
|
|
124
|
+
const stderr = [];
|
|
125
|
+
const result = await runWithProgress(cli, argv, options, {
|
|
126
|
+
stdout: (text) => stdout.push(text),
|
|
127
|
+
stderr: (text) => stderr.push(text),
|
|
128
|
+
});
|
|
129
|
+
return {
|
|
130
|
+
...result,
|
|
131
|
+
stdout: stdout.join("") + result.stdout,
|
|
132
|
+
stderr: stderr.join("") + result.stderr,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function portsOf(cli, replacement) {
|
|
136
|
+
if (replacement !== undefined)
|
|
137
|
+
return () => replacement;
|
|
138
|
+
return cli.ports ?? (() => ({}));
|
|
52
139
|
}
|
|
53
|
-
// Progress is written as it happens:
|
|
54
|
-
|
|
140
|
+
// Progress is written as it happens: a Coding agent kills a process that stays silent too long.
|
|
141
|
+
// A serve Command's data is too, since the caller uses it while the Command runs.
|
|
142
|
+
export async function runWithProgress(cli, argv, options, write) {
|
|
55
143
|
const format = {
|
|
56
144
|
cliName: cli.name,
|
|
57
145
|
env: options.env,
|
|
58
146
|
style: styleFor(options.env, options.stdoutIsTTY === true),
|
|
59
147
|
invocation: { cliName: cli.name, argv },
|
|
60
148
|
json: false,
|
|
149
|
+
errors: cli.errors ?? {},
|
|
150
|
+
stop: options.signal,
|
|
61
151
|
};
|
|
152
|
+
const builtIns = cli.commands === undefined ? {} : builtInCommands(cli, options.bin);
|
|
62
153
|
const root = cli.commands === undefined
|
|
63
154
|
? commandSpec(cli.name, cli.command)
|
|
64
|
-
: groupSpec(cli.name, { ...cli.commands, ...
|
|
155
|
+
: groupSpec(cli.name, { ...cli.commands, ...builtIns });
|
|
65
156
|
const routed = route(root, format.invocation);
|
|
157
|
+
const misused = (node) => isAgent(options.env)
|
|
158
|
+
? { ...format, usageHelp: textHelp(node, root, cli, format.style) }
|
|
159
|
+
: format;
|
|
66
160
|
switch (routed.kind) {
|
|
67
161
|
case "version":
|
|
68
|
-
return versionResult(cli);
|
|
162
|
+
return versionResult(cli, packageRootOf(options.bin, options.cwd));
|
|
69
163
|
case "help":
|
|
70
164
|
return helpResult(routed.node, root, cli, { ...format, json: routed.json });
|
|
71
165
|
case "usage error":
|
|
72
|
-
return errorResult(routed.error, { ...
|
|
166
|
+
return errorResult(routed.error, { ...misused(routed.node), json: routed.json });
|
|
73
167
|
case "command":
|
|
74
168
|
return runCommand(routed, {
|
|
75
169
|
base: {
|
|
76
170
|
cwd: options.cwd,
|
|
77
171
|
env: options.env,
|
|
78
|
-
|
|
172
|
+
packageRoot: packageRootOf(options.bin, options.cwd),
|
|
173
|
+
progress: (message) => write.stderr(`${message}\n`),
|
|
174
|
+
secret: (name) => secretOf(cli.name, options.env, name),
|
|
79
175
|
},
|
|
176
|
+
writeStdout: (text) => write.stdout(text),
|
|
80
177
|
signal: options.signal,
|
|
81
|
-
format,
|
|
178
|
+
format: misused(routed.spec),
|
|
179
|
+
ports: portsOf(cli, options.ports),
|
|
180
|
+
clock: options.clock ?? realClock,
|
|
181
|
+
files: options.files ?? realFiles(),
|
|
182
|
+
spawn: options.spawn ?? realSpawn,
|
|
183
|
+
// A built-in reads no Project file, so an invalid one never keeps `doctor` from reporting it.
|
|
184
|
+
projectFile: Object.values(builtIns).includes(routed.spec.command)
|
|
185
|
+
? undefined
|
|
186
|
+
: cli.project,
|
|
82
187
|
});
|
|
83
188
|
}
|
|
84
189
|
}
|
package/dist/run-cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-cli.js","sourceRoot":"","sources":["../src/run-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,SAAS,
|
|
1
|
+
{"version":3,"file":"run-cli.js","sourceRoot":"","sources":["../src/run-cli.ts"],"names":[],"mappings":"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"}
|
package/dist/run-process.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { SIGNAL_EXIT_CODES } from "./exit-classes.js";
|
|
1
2
|
import { runWithProgress } from "./run-cli.js";
|
|
2
|
-
const SIGNAL_EXIT_CODES = { SIGINT: 130, SIGTERM: 143 };
|
|
3
3
|
function written(stream, text) {
|
|
4
4
|
return new Promise((resolve) => stream.write(text, () => resolve()));
|
|
5
5
|
}
|
|
@@ -11,7 +11,7 @@ export async function runProcess(cli) {
|
|
|
11
11
|
process.exit(SIGNAL_EXIT_CODES[signal]);
|
|
12
12
|
}
|
|
13
13
|
process.stderr.write("\nstopping… (Ctrl-C again to quit now)\n");
|
|
14
|
-
stop.abort();
|
|
14
|
+
stop.abort(signal);
|
|
15
15
|
};
|
|
16
16
|
process.on("SIGINT", onSignal);
|
|
17
17
|
process.on("SIGTERM", onSignal);
|
|
@@ -22,7 +22,10 @@ export async function runProcess(cli) {
|
|
|
22
22
|
stdoutIsTTY: process.stdout.isTTY === true,
|
|
23
23
|
signal: stop.signal,
|
|
24
24
|
bin: process.argv[1],
|
|
25
|
-
},
|
|
25
|
+
}, {
|
|
26
|
+
stdout: (text) => process.stdout.write(text),
|
|
27
|
+
stderr: (text) => process.stderr.write(text),
|
|
28
|
+
});
|
|
26
29
|
await written(process.stdout, result.stdout);
|
|
27
30
|
await written(process.stderr, result.stderr);
|
|
28
31
|
process.exitCode = result.exitCode;
|
package/dist/run-process.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-process.js","sourceRoot":"","sources":["../src/run-process.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"run-process.js","sourceRoot":"","sources":["../src/run-process.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAmB,MAAM,mBAAmB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,SAAS,OAAO,CAAC,MAA0B,EAAE,IAAY;IACvD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAQ;IACvC,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,iGAAiG;IACjG,MAAM,QAAQ,GAAG,CAAC,MAAkB,EAAQ,EAAE;QAC5C,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QACjE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAClC,GAAG,EACH,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EACrB;YACE,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI;YAC1C,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;SACrB,EACD;YACE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YAC5C,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;SAC7C,CACF,CAAC;QACF,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;QAC7C,OAAO,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACrC,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnC,CAAC;IACD,mGAAmG;IACnG,OAAO,CAAC,IAAI,EAAE,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Env } from "./define.js";
|
|
2
|
+
export type SecretOrigin = {
|
|
3
|
+
readonly kind: "env";
|
|
4
|
+
} | {
|
|
5
|
+
readonly kind: "file";
|
|
6
|
+
readonly path: string;
|
|
7
|
+
};
|
|
8
|
+
export interface Secret {
|
|
9
|
+
readonly value: string;
|
|
10
|
+
readonly origin: SecretOrigin;
|
|
11
|
+
}
|
|
12
|
+
/** Looks `name` up in the env, then in `$XDG_CONFIG_HOME/<cli>/.env`; an empty value counts as unset. */
|
|
13
|
+
export declare function secretOf(cliName: string, env: Env, name: string): Secret | undefined;
|
package/dist/secrets.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { parseEnv } from "node:util";
|
|
5
|
+
import { isMissingFile } from "./errors.js";
|
|
6
|
+
function dotenvPath(cliName, env) {
|
|
7
|
+
const config = env.XDG_CONFIG_HOME || join(env.HOME || homedir(), ".config");
|
|
8
|
+
return join(config, cliName, ".env");
|
|
9
|
+
}
|
|
10
|
+
function readDotenv(path) {
|
|
11
|
+
try {
|
|
12
|
+
return parseEnv(readFileSync(path, "utf8"));
|
|
13
|
+
}
|
|
14
|
+
catch (error) {
|
|
15
|
+
if (isMissingFile(error))
|
|
16
|
+
return {};
|
|
17
|
+
throw error;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Looks `name` up in the env, then in `$XDG_CONFIG_HOME/<cli>/.env`; an empty value counts as unset. */
|
|
21
|
+
export function secretOf(cliName, env, name) {
|
|
22
|
+
const fromEnv = env[name];
|
|
23
|
+
if (fromEnv)
|
|
24
|
+
return { value: fromEnv, origin: { kind: "env" } };
|
|
25
|
+
const path = dotenvPath(cliName, env);
|
|
26
|
+
const fromFile = readDotenv(path)[name];
|
|
27
|
+
return fromFile ? { value: fromFile, origin: { kind: "file", path } } : undefined;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../src/secrets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAW5C,SAAS,UAAU,CAAC,OAAe,EAAE,GAAQ;IAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAC7E,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,aAAa,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,QAAQ,CAAC,OAAe,EAAE,GAAQ,EAAE,IAAY;IAC9D,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;IAChE,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACpF,CAAC"}
|
package/dist/spawn.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Env } from "./define.js";
|
|
2
|
+
export declare const TOOL_FAILED = "TOOL_FAILED";
|
|
3
|
+
export interface SpawnResult {
|
|
4
|
+
readonly stdout: string;
|
|
5
|
+
readonly stderr: string;
|
|
6
|
+
readonly exitCode: number;
|
|
7
|
+
}
|
|
8
|
+
/** Runs a child process to its end; a test replaces it through `runCli`. */
|
|
9
|
+
export type Spawn = (command: string, args: readonly string[], options: {
|
|
10
|
+
readonly cwd: string;
|
|
11
|
+
readonly env: Env;
|
|
12
|
+
readonly signal: AbortSignal;
|
|
13
|
+
}) => Promise<SpawnResult>;
|
|
14
|
+
export interface SpawnOptions {
|
|
15
|
+
/** `ctx.cwd` when absent. */
|
|
16
|
+
readonly cwd?: string;
|
|
17
|
+
/** `ctx.env` when absent. */
|
|
18
|
+
readonly env?: Env;
|
|
19
|
+
/** Fails the run with `TOOL_FAILED` and the tail of the child's stderr when it exits non-zero. */
|
|
20
|
+
readonly check?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export type ContextSpawn = (command: string, args?: readonly string[], options?: SpawnOptions) => Promise<SpawnResult>;
|
|
23
|
+
export declare const realSpawn: Spawn;
|
|
24
|
+
/** `ctx.spawn`: `spawn` bound to the run, its start failures classified by errno. */
|
|
25
|
+
export declare function contextSpawn(run: Spawn, defaults: {
|
|
26
|
+
readonly cwd: string;
|
|
27
|
+
readonly env: Env;
|
|
28
|
+
readonly signal: AbortSignal;
|
|
29
|
+
}, callerLine: string): ContextSpawn;
|
package/dist/spawn.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { constants } from "node:os";
|
|
3
|
+
import { classifyErrno } from "./errno.js";
|
|
4
|
+
import { CliError, isMissingFile } from "./errors.js";
|
|
5
|
+
import { lastLines } from "./tail.js";
|
|
6
|
+
import { TOOL_MISSING } from "./tools.js";
|
|
7
|
+
export const TOOL_FAILED = "TOOL_FAILED";
|
|
8
|
+
const STDERR_TAIL_LINES = 20;
|
|
9
|
+
// A shell reports a child killed by a signal as 128 plus the signal's number.
|
|
10
|
+
const SIGNAL_EXIT_BASE = 128;
|
|
11
|
+
// The child is killed on abort, and the promise settles only once it has exited.
|
|
12
|
+
export const realSpawn = (command, args, { cwd, env, signal }) => new Promise((resolve, reject) => {
|
|
13
|
+
signal.throwIfAborted();
|
|
14
|
+
const child = spawn(command, args, { cwd, env, stdio: ["ignore", "pipe", "pipe"] });
|
|
15
|
+
const stdout = [];
|
|
16
|
+
const stderr = [];
|
|
17
|
+
child.stdout.on("data", (chunk) => stdout.push(chunk));
|
|
18
|
+
child.stderr.on("data", (chunk) => stderr.push(chunk));
|
|
19
|
+
const kill = () => {
|
|
20
|
+
child.kill();
|
|
21
|
+
};
|
|
22
|
+
signal.addEventListener("abort", kill, { once: true });
|
|
23
|
+
child.on("error", (error) => {
|
|
24
|
+
signal.removeEventListener("abort", kill);
|
|
25
|
+
reject(error);
|
|
26
|
+
});
|
|
27
|
+
child.on("close", (code, killedBy) => {
|
|
28
|
+
signal.removeEventListener("abort", kill);
|
|
29
|
+
if (signal.aborted) {
|
|
30
|
+
reject(signal.reason);
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
resolve({
|
|
34
|
+
stdout: Buffer.concat(stdout).toString(),
|
|
35
|
+
stderr: Buffer.concat(stderr).toString(),
|
|
36
|
+
exitCode: code ?? SIGNAL_EXIT_BASE + (killedBy === null ? 0 : constants.signals[killedBy]),
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
function failedError(command, { exitCode, stderr }) {
|
|
41
|
+
const tail = lastLines(stderr, STDERR_TAIL_LINES);
|
|
42
|
+
return new CliError({
|
|
43
|
+
code: TOOL_FAILED,
|
|
44
|
+
message: tail === ""
|
|
45
|
+
? `${command} exited with ${exitCode} and wrote nothing to stderr`
|
|
46
|
+
: `${command} exited with ${exitCode}; its stderr ends:\n${tail}`,
|
|
47
|
+
hint: `the output of ${command} above says why it failed`,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function missingError(command, cause) {
|
|
51
|
+
return new CliError({
|
|
52
|
+
code: TOOL_MISSING,
|
|
53
|
+
message: `${command} could not be started: it is not on PATH`,
|
|
54
|
+
hint: `install ${command}, then run the same command again`,
|
|
55
|
+
}, { cause });
|
|
56
|
+
}
|
|
57
|
+
/** `ctx.spawn`: `spawn` bound to the run, its start failures classified by errno. */
|
|
58
|
+
export function contextSpawn(run, defaults, callerLine) {
|
|
59
|
+
return async (command, args = [], options = {}) => {
|
|
60
|
+
let result;
|
|
61
|
+
try {
|
|
62
|
+
result = await run(command, args, {
|
|
63
|
+
cwd: options.cwd ?? defaults.cwd,
|
|
64
|
+
env: options.env ?? defaults.env,
|
|
65
|
+
signal: defaults.signal,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
if (isMissingFile(error))
|
|
70
|
+
throw missingError(command, error);
|
|
71
|
+
throw classifyErrno(error, { path: command, callerLine, env: defaults.env });
|
|
72
|
+
}
|
|
73
|
+
if (options.check === true && result.exitCode !== 0) {
|
|
74
|
+
throw failedError(command, result);
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=spawn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spawn.js","sourceRoot":"","sources":["../src/spawn.ts"],"names":[],"mappings":"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"}
|
package/dist/spill.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Clock } from "./clock.js";
|
|
2
|
+
import type { Env } from "./define.js";
|
|
3
|
+
import type { Files } from "./files.js";
|
|
4
|
+
export interface SpillTarget {
|
|
5
|
+
readonly cliName: string;
|
|
6
|
+
readonly commandName: string;
|
|
7
|
+
readonly env: Env;
|
|
8
|
+
readonly clock: Clock;
|
|
9
|
+
/** Writes the spill file; its failures are already classified. */
|
|
10
|
+
readonly files: Files;
|
|
11
|
+
/** The caller's command line, for the hint of a file system error. */
|
|
12
|
+
readonly callerLine: string;
|
|
13
|
+
}
|
|
14
|
+
/** Turns printed data into what stdout carries: the data itself, or where it was spilled. */
|
|
15
|
+
export type Spill = (printed: string, json: boolean) => Promise<string>;
|
|
16
|
+
export declare function spillTo(target: SpillTarget): Spill;
|
package/dist/spill.js
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { mkdir, readdir, rm, stat } from "node:fs/promises";
|
|
2
|
+
import { tmpdir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { classifyErrno } from "./errno.js";
|
|
5
|
+
import { isMissingFile } from "./errors.js";
|
|
6
|
+
const STDOUT_BUDGET_CHARS = 30_000;
|
|
7
|
+
const SPILL_RETENTION_MS = 7 * 24 * 60 * 60 * 1000;
|
|
8
|
+
const PREVIEW_CHARS = 2_000;
|
|
9
|
+
// The time's colons become dashes: Windows forbids a colon in a file name.
|
|
10
|
+
const SPILL_FILE = /^\d{4}-\d\d-\d\dT\d\d-\d\d-\d\d\.\d{3}Z-.+\.(json|txt)$/;
|
|
11
|
+
function spillName(now, commandName, json) {
|
|
12
|
+
const time = new Date(now).toISOString().replaceAll(":", "-");
|
|
13
|
+
return `${time}-${commandName}.${json ? "json" : "txt"}`;
|
|
14
|
+
}
|
|
15
|
+
// Another run pruning the same folder may remove a file between readdir and stat.
|
|
16
|
+
async function pruneOne(path, cutoff) {
|
|
17
|
+
try {
|
|
18
|
+
if ((await stat(path)).mtimeMs < cutoff)
|
|
19
|
+
await rm(path, { force: true });
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (!isMissingFile(error))
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async function pruneOld(folder, cutoff) {
|
|
27
|
+
const names = (await readdir(folder)).filter((name) => SPILL_FILE.test(name));
|
|
28
|
+
await Promise.all(names.map((name) => pruneOne(join(folder, name), cutoff)));
|
|
29
|
+
}
|
|
30
|
+
async function prepare(folder, cutoff, target) {
|
|
31
|
+
try {
|
|
32
|
+
await mkdir(folder, { recursive: true });
|
|
33
|
+
await pruneOld(folder, cutoff);
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
throw classifyErrno(error, { path: folder, callerLine: target.callerLine, env: target.env });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// An empty TMPDIR means unset, as it does to the shell.
|
|
40
|
+
function tempRoot(env) {
|
|
41
|
+
const { TMPDIR } = env;
|
|
42
|
+
return TMPDIR === undefined || TMPDIR === "" ? tmpdir() : TMPDIR;
|
|
43
|
+
}
|
|
44
|
+
export function spillTo(target) {
|
|
45
|
+
return async (printed, json) => {
|
|
46
|
+
if (printed.length <= STDOUT_BUDGET_CHARS)
|
|
47
|
+
return printed;
|
|
48
|
+
const now = target.clock.now();
|
|
49
|
+
const folder = join(tempRoot(target.env), target.cliName);
|
|
50
|
+
await prepare(folder, now - SPILL_RETENTION_MS, target);
|
|
51
|
+
const file = join(folder, spillName(now, target.commandName, json));
|
|
52
|
+
await target.files.write(file, printed);
|
|
53
|
+
const bytes = Buffer.byteLength(printed);
|
|
54
|
+
const preview = printed.slice(0, PREVIEW_CHARS);
|
|
55
|
+
return json
|
|
56
|
+
? `${JSON.stringify({ file, bytes, preview })}\n`
|
|
57
|
+
: `file: ${file}\nbytes: ${bytes}\npreview:\n${preview}\n`;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=spill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spill.js","sourceRoot":"","sources":["../src/spill.ts"],"names":[],"mappings":"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"}
|
package/dist/style.js
CHANGED
|
@@ -1,16 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
const AGENT_VARIABLES = [
|
|
3
|
-
"CLAUDECODE",
|
|
4
|
-
"CODEX_CI",
|
|
5
|
-
"CODEX_SANDBOX",
|
|
6
|
-
"GEMINI_CLI",
|
|
7
|
-
"CURSOR_AGENT",
|
|
8
|
-
"CI",
|
|
9
|
-
];
|
|
1
|
+
import { isAgent } from "./agent.js";
|
|
10
2
|
function colourEnabled(env, stdoutIsTTY) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
3
|
+
if (env.NO_COLOR !== undefined && env.NO_COLOR !== "")
|
|
4
|
+
return false;
|
|
5
|
+
const forced = env.FORCE_COLOR !== undefined && env.FORCE_COLOR !== "" && env.FORCE_COLOR !== "0";
|
|
6
|
+
return forced || (stdoutIsTTY && !isAgent(env));
|
|
14
7
|
}
|
|
15
8
|
function sgr(open, close) {
|
|
16
9
|
return (text) => `\u001b[${open}m${text}\u001b[${close}m`;
|
package/dist/style.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"style.js","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAerC,SAAS,aAAa,CAAC,GAAQ,EAAE,WAAoB;IACnD,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IACpE,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,GAAG,CAAC,WAAW,KAAK,EAAE,IAAI,GAAG,CAAC,WAAW,KAAK,GAAG,CAAC;IAClG,OAAO,MAAM,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,GAAG,CAAC,IAAY,EAAE,KAAa;IACtC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,IAAI,IAAI,IAAI,UAAU,KAAK,GAAG,CAAC;AAC5D,CAAC;AAED,MAAM,QAAQ,GAAU;IACtB,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;IAChB,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC;IACf,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,KAAK,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;IAClB,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;IACnB,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;CAClB,CAAC;AAEF,MAAM,KAAK,GAAU,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;AAEpC,MAAM,KAAK,GAAU;IACnB,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,KAAK;IACb,IAAI,EAAE,KAAK;CACZ,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,GAAQ,EAAE,WAAoB;IACrD,OAAO,aAAa,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;AAC5D,CAAC"}
|
package/dist/tail.d.ts
ADDED
package/dist/tail.js
ADDED
package/dist/tail.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tail.js","sourceRoot":"","sources":["../src/tail.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,MAAM,UAAU,SAAS,CAAC,MAAc,EAAE,KAAa;IACrD,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5D,CAAC"}
|
package/dist/tools.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type Commands, type DoctorCheck, type Env, type Tool } from "./define.js";
|
|
2
|
+
export declare const TOOL_MISSING = "TOOL_MISSING";
|
|
3
|
+
/** Fails with `TOOL_MISSING`, naming every missing tool at once, unless all are on `PATH`. */
|
|
4
|
+
export declare function checkTools(tools: readonly Tool[], env: Env): Promise<void>;
|
|
5
|
+
/** One `doctor` row per distinct tool the Commands declare, with its install command as the fix. */
|
|
6
|
+
export declare function toolRows(commands: Commands): DoctorCheck[];
|