@duyquangnvx/agent-cli 0.2.1 → 0.4.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 +71 -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 +12 -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 +145 -32
- package/dist/define.js +9 -2
- package/dist/define.js.map +1 -1
- package/dist/doctor-rows.d.ts +2 -2
- package/dist/doctor-rows.js +45 -5
- package/dist/doctor-rows.js.map +1 -1
- package/dist/doctor.d.ts +2 -1
- package/dist/doctor.js +31 -29
- package/dist/doctor.js.map +1 -1
- package/dist/errno.d.ts +15 -0
- package/dist/errno.js +50 -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 +7 -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 +108 -0
- package/dist/exit-classes.js.map +1 -0
- package/dist/files.d.ts +31 -0
- package/dist/files.js +95 -0
- package/dist/files.js.map +1 -0
- package/dist/flags.d.ts +21 -3
- package/dist/flags.js +41 -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 +11 -4
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/input.d.ts +4 -0
- package/dist/input.js +24 -2
- package/dist/input.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 +41 -8
- package/dist/parse-input.js.map +1 -1
- package/dist/planned.d.ts +6 -0
- package/dist/planned.js +5 -0
- package/dist/planned.js.map +1 -0
- 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 +126 -18
- 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 +19 -0
- package/dist/secrets.js +32 -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 +65 -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/interrupts.js
CHANGED
|
@@ -1,22 +1,23 @@
|
|
|
1
|
+
import { after } from "./clock.js";
|
|
1
2
|
import { CliError } from "./errors.js";
|
|
3
|
+
export const INTERRUPTED = "INTERRUPTED";
|
|
4
|
+
export const DEADLINE_EXCEEDED = "DEADLINE_EXCEEDED";
|
|
2
5
|
/** How long an interrupted Command may take to settle before the run ends without it. */
|
|
3
6
|
export const GRACE_MS = 3000;
|
|
4
7
|
const GRACE_OVER = Symbol("grace over");
|
|
5
|
-
export const INTERRUPTED = "INTERRUPTED";
|
|
6
8
|
function interruptedError() {
|
|
7
9
|
return new CliError({
|
|
8
10
|
code: INTERRUPTED,
|
|
9
11
|
message: "interrupted before it finished",
|
|
10
12
|
hint: "run the command again",
|
|
11
|
-
retryable: true,
|
|
12
13
|
});
|
|
13
14
|
}
|
|
14
|
-
|
|
15
|
+
const WAIT_HINT = "run it again later, when the service it waits on may answer faster";
|
|
16
|
+
function deadlineError(commandLine, ms, hint) {
|
|
15
17
|
return new CliError({
|
|
16
|
-
code:
|
|
18
|
+
code: DEADLINE_EXCEEDED,
|
|
17
19
|
message: `${commandLine} ran past its ${ms} ms deadline`,
|
|
18
|
-
hint
|
|
19
|
-
retryable: true,
|
|
20
|
+
hint,
|
|
20
21
|
});
|
|
21
22
|
}
|
|
22
23
|
/** One Command run's cancellation: its signal, its deadlines and the steps it must finish. */
|
|
@@ -26,41 +27,51 @@ export class RunControl {
|
|
|
26
27
|
#commandLine;
|
|
27
28
|
#outer;
|
|
28
29
|
#onOuterAbort = () => this.#controller.abort(interruptedError());
|
|
29
|
-
|
|
30
|
-
#
|
|
30
|
+
/** Each running must-finish step, tracked until it settles, with its name. */
|
|
31
|
+
#steps = new Map();
|
|
32
|
+
#progress;
|
|
33
|
+
#clock;
|
|
34
|
+
#disposed = new AbortController();
|
|
31
35
|
#deadlineHit;
|
|
32
|
-
#
|
|
36
|
+
#graceCancel = new AbortController();
|
|
33
37
|
#endGrace = () => { };
|
|
34
38
|
#graceOver = new Promise((resolve) => {
|
|
35
39
|
this.#endGrace = resolve;
|
|
36
40
|
});
|
|
37
|
-
constructor(commandLine, outer) {
|
|
41
|
+
constructor({ commandLine, outer, clock, progress, runDeadline }) {
|
|
38
42
|
this.#commandLine = commandLine;
|
|
39
43
|
this.#outer = outer;
|
|
44
|
+
this.#clock = clock;
|
|
45
|
+
this.#progress = progress;
|
|
40
46
|
this.signal = this.#controller.signal;
|
|
41
|
-
this.signal.addEventListener("abort", () => this.#
|
|
47
|
+
this.signal.addEventListener("abort", () => this.#onStop(), { once: true });
|
|
42
48
|
if (outer?.aborted === true) {
|
|
43
49
|
this.#onOuterAbort();
|
|
44
50
|
}
|
|
45
51
|
else {
|
|
46
52
|
outer?.addEventListener("abort", this.#onOuterAbort, { once: true });
|
|
47
53
|
}
|
|
54
|
+
if (runDeadline !== undefined) {
|
|
55
|
+
const { ms, hint } = runDeadline;
|
|
56
|
+
after(clock, ms, this.#disposed.signal, () => this.#controller.abort(deadlineError(commandLine, ms, hint)));
|
|
57
|
+
}
|
|
48
58
|
}
|
|
49
59
|
deadline(ms) {
|
|
50
60
|
const controller = new AbortController();
|
|
51
|
-
|
|
52
|
-
this.#deadlineHit ??= deadlineError(this.#commandLine, ms);
|
|
61
|
+
after(this.#clock, ms, this.#disposed.signal, () => {
|
|
62
|
+
this.#deadlineHit ??= deadlineError(this.#commandLine, ms, WAIT_HINT);
|
|
53
63
|
controller.abort(this.#deadlineHit);
|
|
54
|
-
}
|
|
55
|
-
this.#deadlineTimers.add(timer);
|
|
64
|
+
});
|
|
56
65
|
return AbortSignal.any([this.signal, controller.signal]);
|
|
57
66
|
}
|
|
58
|
-
async runToEnd(work) {
|
|
59
|
-
|
|
67
|
+
async runToEnd(name, work) {
|
|
68
|
+
this.#graceCancel.abort();
|
|
69
|
+
if (this.signal.aborted)
|
|
70
|
+
this.#finishing(name);
|
|
60
71
|
const step = work();
|
|
61
72
|
// Only tracks when the step settles; the step's own error reaches the caller below.
|
|
62
73
|
const settled = step.then(() => { }, () => { });
|
|
63
|
-
this.#steps.
|
|
74
|
+
this.#steps.set(settled, name);
|
|
64
75
|
try {
|
|
65
76
|
return await step;
|
|
66
77
|
}
|
|
@@ -96,22 +107,29 @@ export class RunControl {
|
|
|
96
107
|
}
|
|
97
108
|
return error;
|
|
98
109
|
}
|
|
110
|
+
#onStop() {
|
|
111
|
+
for (const name of this.#steps.values())
|
|
112
|
+
this.#finishing(name);
|
|
113
|
+
this.#startGrace();
|
|
114
|
+
}
|
|
115
|
+
#finishing(name) {
|
|
116
|
+
this.#progress(`finishing ${name}`);
|
|
117
|
+
}
|
|
99
118
|
#startGrace() {
|
|
100
119
|
if (this.signal.aborted && this.#steps.size === 0) {
|
|
101
|
-
|
|
102
|
-
this.#
|
|
120
|
+
this.#graceCancel.abort();
|
|
121
|
+
this.#graceCancel = new AbortController();
|
|
122
|
+
after(this.#clock, GRACE_MS, this.#graceCancel.signal, () => this.#endGrace(GRACE_OVER));
|
|
103
123
|
}
|
|
104
124
|
}
|
|
105
125
|
async #stepsDone() {
|
|
106
126
|
while (this.#steps.size > 0) {
|
|
107
|
-
await Promise.all(this.#steps);
|
|
127
|
+
await Promise.all(this.#steps.keys());
|
|
108
128
|
}
|
|
109
129
|
}
|
|
110
130
|
#dispose() {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
clearTimeout(timer);
|
|
114
|
-
}
|
|
131
|
+
this.#graceCancel.abort();
|
|
132
|
+
this.#disposed.abort();
|
|
115
133
|
this.#outer?.removeEventListener("abort", this.#onOuterAbort);
|
|
116
134
|
}
|
|
117
135
|
}
|
package/dist/interrupts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interrupts.js","sourceRoot":"","sources":["../src/interrupts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,yFAAyF;AACzF,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC;AAE7B,MAAM,UAAU,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;AAExC,
|
|
1
|
+
{"version":3,"file":"interrupts.js","sourceRoot":"","sources":["../src/interrupts.ts"],"names":[],"mappings":"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"}
|
package/dist/invocation.d.ts
CHANGED
|
@@ -3,7 +3,12 @@ export interface Invocation {
|
|
|
3
3
|
readonly cliName: string;
|
|
4
4
|
readonly argv: readonly string[];
|
|
5
5
|
}
|
|
6
|
-
/** The caller's command line, ready to paste
|
|
7
|
-
export declare function
|
|
6
|
+
/** The caller's command line as typed, ready to paste. */
|
|
7
|
+
export declare function commandLineOf({ cliName, argv }: Invocation): string;
|
|
8
|
+
/**
|
|
9
|
+
* The caller's command line, ready to paste, with `flag value` (or `flag` alone, for a flag that
|
|
10
|
+
* takes nothing) replacing any value they gave.
|
|
11
|
+
*/
|
|
12
|
+
export declare function commandLineWith({ cliName, argv }: Invocation, flag: string, value?: string): string;
|
|
8
13
|
/** The caller's command line, ready to paste, with each flag in `renames` typed as its new name. */
|
|
9
14
|
export declare function commandLineRenaming({ cliName, argv }: Invocation, renames: ReadonlyMap<string, string>): string;
|
package/dist/invocation.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
export const END_OF_OPTIONS = "--";
|
|
2
2
|
const SHELL_SAFE = /^[\w@%+=:,./-]+$/;
|
|
3
|
-
// POSIX quoting:
|
|
3
|
+
// POSIX quoting: Coding agents run commands in a POSIX shell, Git Bash included on Windows.
|
|
4
4
|
function quoted(token) {
|
|
5
5
|
return SHELL_SAFE.test(token) ? token : `'${token.replaceAll("'", `'\\''`)}'`;
|
|
6
6
|
}
|
|
7
7
|
function pasteable(cliName, tokens) {
|
|
8
8
|
return [cliName, ...tokens].map(quoted).join(" ");
|
|
9
9
|
}
|
|
10
|
+
/** The caller's command line as typed, ready to paste. */
|
|
11
|
+
export function commandLineOf({ cliName, argv }) {
|
|
12
|
+
return pasteable(cliName, argv);
|
|
13
|
+
}
|
|
10
14
|
function split(argv) {
|
|
11
15
|
const end = argv.indexOf(END_OF_OPTIONS);
|
|
12
16
|
return end === -1
|
|
@@ -16,10 +20,14 @@ function split(argv) {
|
|
|
16
20
|
function without(flag, tokens) {
|
|
17
21
|
return tokens.filter((token, index) => token !== flag && !token.startsWith(`${flag}=`) && tokens[index - 1] !== flag);
|
|
18
22
|
}
|
|
19
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* The caller's command line, ready to paste, with `flag value` (or `flag` alone, for a flag that
|
|
25
|
+
* takes nothing) replacing any value they gave.
|
|
26
|
+
*/
|
|
20
27
|
export function commandLineWith({ cliName, argv }, flag, value) {
|
|
21
28
|
const { options, operands } = split(argv);
|
|
22
|
-
|
|
29
|
+
const added = value === undefined ? [flag] : [flag, value];
|
|
30
|
+
return pasteable(cliName, [...without(flag, options), ...added, ...operands]);
|
|
23
31
|
}
|
|
24
32
|
function renamed(token, renames) {
|
|
25
33
|
const [flag = token, ...value] = token.split("=");
|
package/dist/invocation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invocation.js","sourceRoot":"","sources":["../src/invocation.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AACnC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAOtC,
|
|
1
|
+
{"version":3,"file":"invocation.js","sourceRoot":"","sources":["../src/invocation.ts"],"names":[],"mappings":"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"}
|
package/dist/list.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import * as z from "zod";
|
|
|
2
2
|
import type { NameOf, StandardFlag } from "./flags.js";
|
|
3
3
|
import { type InputField } from "./input.js";
|
|
4
4
|
import { type Invocation } from "./invocation.js";
|
|
5
|
+
export declare const UNKNOWN_FIELD = "UNKNOWN_FIELD";
|
|
5
6
|
declare const FIELDS_FLAG = "--fields";
|
|
6
7
|
export declare const PAGE_INPUT: z.ZodObject<{
|
|
7
8
|
limit: z.ZodDefault<z.ZodNumber>;
|
package/dist/list.js
CHANGED
|
@@ -2,6 +2,8 @@ import * as z from "zod";
|
|
|
2
2
|
import { UsageError } from "./errors.js";
|
|
3
3
|
import { optionField, optionFields } from "./input.js";
|
|
4
4
|
import { commandLineWith } from "./invocation.js";
|
|
5
|
+
import { INVALID_INPUT } from "./usage.js";
|
|
6
|
+
export const UNKNOWN_FIELD = "UNKNOWN_FIELD";
|
|
5
7
|
const DEFAULT_PAGE_LIMIT = 20;
|
|
6
8
|
const FIELDS_FLAG = "--fields";
|
|
7
9
|
const SEPARATOR = ",";
|
|
@@ -78,7 +80,7 @@ export function selectedFields(values, rowFields, commandLine) {
|
|
|
78
80
|
const names = typeof raw === "string" ? raw.split(SEPARATOR).filter((name) => name !== "") : [];
|
|
79
81
|
if (names.length === 0) {
|
|
80
82
|
throw new UsageError({
|
|
81
|
-
code:
|
|
83
|
+
code: INVALID_INPUT,
|
|
82
84
|
message: `${FIELDS_FLAG}: missing value for \`${commandLine}\``,
|
|
83
85
|
hint,
|
|
84
86
|
});
|
|
@@ -86,7 +88,7 @@ export function selectedFields(values, rowFields, commandLine) {
|
|
|
86
88
|
const unknown = names.filter((name) => !rowFields.includes(name));
|
|
87
89
|
if (unknown.length > 0) {
|
|
88
90
|
throw new UsageError({
|
|
89
|
-
code:
|
|
91
|
+
code: UNKNOWN_FIELD,
|
|
90
92
|
message: `unknown field ${quoted(unknown)} for \`${commandLine}\``,
|
|
91
93
|
hint,
|
|
92
94
|
});
|
package/dist/list.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAmB,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,eAAe,EAAmB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":"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"}
|
package/dist/npm.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import type { CommandTreeCli, Context, Env, GlobalInstall } from "./define.js";
|
|
2
|
+
export declare const REGISTRY_UNREACHABLE = "REGISTRY_UNREACHABLE";
|
|
3
|
+
export declare const REGISTRY_AUTH = "REGISTRY_AUTH";
|
|
4
|
+
export declare const INSTALL_FAILED = "INSTALL_FAILED";
|
|
5
|
+
export declare const NPM_FAILED = "NPM_FAILED";
|
|
6
|
+
export declare const NO_LATEST = "NO_LATEST";
|
|
2
7
|
/** What every npm call needs: the CLI it serves, its package, and the caller's env and signal. */
|
|
3
8
|
export interface NpmContext {
|
|
4
9
|
readonly cliName: string;
|
package/dist/npm.js
CHANGED
|
@@ -4,6 +4,12 @@ import { tmpdir } from "node:os";
|
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import { CliError, messageOf } from "./errors.js";
|
|
6
6
|
import { isVersion } from "./semver.js";
|
|
7
|
+
import { lastLines } from "./tail.js";
|
|
8
|
+
export const REGISTRY_UNREACHABLE = "REGISTRY_UNREACHABLE";
|
|
9
|
+
export const REGISTRY_AUTH = "REGISTRY_AUTH";
|
|
10
|
+
export const INSTALL_FAILED = "INSTALL_FAILED";
|
|
11
|
+
export const NPM_FAILED = "NPM_FAILED";
|
|
12
|
+
export const NO_LATEST = "NO_LATEST";
|
|
7
13
|
export function npmContext(cli, install, ctx) {
|
|
8
14
|
return { cliName: cli.name, install, env: ctx.env, signal: ctx.signal };
|
|
9
15
|
}
|
|
@@ -39,12 +45,14 @@ export function installCommandLine(install, version = "latest") {
|
|
|
39
45
|
...registryFlags(install),
|
|
40
46
|
].join(" ");
|
|
41
47
|
}
|
|
42
|
-
// npm.cmd needs cmd.exe on Windows, so there the arguments go through a shell, quoted
|
|
43
|
-
//
|
|
48
|
+
// npm.cmd needs cmd.exe on Windows, so there the arguments go through a shell, quoted; npm itself
|
|
49
|
+
// stays unquoted, because cmd.exe resolves %~dp0 against the working directory for a quoted batch
|
|
50
|
+
// name found on PATH. A step without a signal must finish, so on POSIX it leaves the terminal's
|
|
51
|
+
// process group and its Ctrl-C.
|
|
44
52
|
function spawnNpm(args, ctx, signal) {
|
|
45
53
|
const windows = process.platform === "win32";
|
|
46
54
|
const command = windows
|
|
47
|
-
? ["npm", ...args
|
|
55
|
+
? ["npm", ...args.map((arg) => `"${arg.replaceAll('"', '""')}"`)].join(" ")
|
|
48
56
|
: "npm";
|
|
49
57
|
return new Promise((resolve, reject) => {
|
|
50
58
|
const child = spawn(command, windows ? [] : args, {
|
|
@@ -68,8 +76,8 @@ function spawnNpm(args, ctx, signal) {
|
|
|
68
76
|
});
|
|
69
77
|
}
|
|
70
78
|
function tail(stderr) {
|
|
71
|
-
const lines = stderr
|
|
72
|
-
return lines
|
|
79
|
+
const lines = lastLines(stderr, STDERR_TAIL_LINES);
|
|
80
|
+
return lines === "" ? "" : `\n${lines}`;
|
|
73
81
|
}
|
|
74
82
|
function failureOf(call, answer, ctx) {
|
|
75
83
|
const { registry, package: name } = ctx.install;
|
|
@@ -77,18 +85,16 @@ function failureOf(call, answer, ctx) {
|
|
|
77
85
|
const output = tail(answer.stderr);
|
|
78
86
|
if (code !== undefined && NETWORK_CODES.has(code)) {
|
|
79
87
|
return new CliError({
|
|
80
|
-
code:
|
|
88
|
+
code: REGISTRY_UNREACHABLE,
|
|
81
89
|
message: `npm could not reach ${registry} (${code})${output}`,
|
|
82
90
|
hint: "check the network or VPN, then run it again",
|
|
83
|
-
retryable: true,
|
|
84
91
|
});
|
|
85
92
|
}
|
|
86
93
|
if (code !== undefined && AUTH_CODES.has(code)) {
|
|
87
94
|
return new CliError({
|
|
88
|
-
code:
|
|
95
|
+
code: REGISTRY_AUTH,
|
|
89
96
|
message: `${registry} refused npm's credentials (${code})${output}`,
|
|
90
97
|
hint: `log in to ${registry} (npm login --registry=${registry}) or set its token in ~/.npmrc, then run it again`,
|
|
91
|
-
retryable: false,
|
|
92
98
|
});
|
|
93
99
|
}
|
|
94
100
|
if (call === "view" && code === "E404") {
|
|
@@ -96,25 +102,22 @@ function failureOf(call, answer, ctx) {
|
|
|
96
102
|
}
|
|
97
103
|
if (call === "install") {
|
|
98
104
|
return new CliError({
|
|
99
|
-
code:
|
|
105
|
+
code: INSTALL_FAILED,
|
|
100
106
|
message: `npm could not install ${name}${code === undefined ? "" : ` (${code})`}${output}`,
|
|
101
107
|
hint: `fix what npm reports, then run it again, or install it yourself: ${installCommandLine(ctx.install)}`,
|
|
102
|
-
retryable: false,
|
|
103
108
|
});
|
|
104
109
|
}
|
|
105
110
|
return new CliError({
|
|
106
|
-
code:
|
|
111
|
+
code: NPM_FAILED,
|
|
107
112
|
message: `npm ${call} failed with exit code ${answer.exitCode}${output}`,
|
|
108
113
|
hint: "fix what npm reports, then run it again",
|
|
109
|
-
retryable: false,
|
|
110
114
|
});
|
|
111
115
|
}
|
|
112
116
|
function noLatest(ctx, message) {
|
|
113
117
|
return new CliError({
|
|
114
|
-
code:
|
|
118
|
+
code: NO_LATEST,
|
|
115
119
|
message,
|
|
116
120
|
hint: `check that ${ctx.install.package} is published on ${ctx.install.registry}`,
|
|
117
|
-
retryable: false,
|
|
118
121
|
});
|
|
119
122
|
}
|
|
120
123
|
/**
|
|
@@ -128,10 +131,9 @@ export async function runNpm(call, args, ctx, signal = ctx.signal) {
|
|
|
128
131
|
if (signal?.aborted === true)
|
|
129
132
|
throw signal.reason;
|
|
130
133
|
throw new CliError({
|
|
131
|
-
code:
|
|
134
|
+
code: NPM_FAILED,
|
|
132
135
|
message: `npm could not be started: ${messageOf(error)}`,
|
|
133
136
|
hint: "install Node with npm, or put npm on PATH",
|
|
134
|
-
retryable: false,
|
|
135
137
|
}, { cause: error });
|
|
136
138
|
});
|
|
137
139
|
if (answer.exitCode !== 0) {
|
package/dist/npm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm.js","sourceRoot":"","sources":["../src/npm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"npm.js","sourceRoot":"","sources":["../src/npm.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { SpecNode } from "./command-spec.js";
|
|
2
2
|
import type { Cli, Env } from "./define.js";
|
|
3
|
+
import type { ErrorTable } from "./error-table.js";
|
|
3
4
|
import type { Outcome } from "./execute.js";
|
|
4
5
|
import type { Invocation } from "./invocation.js";
|
|
6
|
+
import type { Spill } from "./spill.js";
|
|
5
7
|
import type { Style } from "./style.js";
|
|
6
8
|
export interface RunResult {
|
|
7
9
|
readonly stdout: string;
|
|
@@ -14,20 +16,32 @@ export interface OutputFormat {
|
|
|
14
16
|
readonly style: Style;
|
|
15
17
|
readonly invocation: Invocation;
|
|
16
18
|
readonly json: boolean;
|
|
19
|
+
readonly errors: ErrorTable;
|
|
20
|
+
/** The signal that interrupts the run, whose abort reason names the stop signal. */
|
|
21
|
+
readonly stop: AbortSignal | undefined;
|
|
22
|
+
/** The text help a usage error ends with; set only under an agent, which reads it in one go. */
|
|
23
|
+
readonly usageHelp?: string;
|
|
17
24
|
}
|
|
18
25
|
export interface DataFormat extends OutputFormat {
|
|
19
26
|
readonly fields: readonly string[] | undefined;
|
|
20
27
|
}
|
|
21
|
-
/** How a Command's run ended; a
|
|
28
|
+
/** How a Command's run ended; a failed run keeps the data the Command last delivered, if any. */
|
|
22
29
|
export type Settled = {
|
|
23
30
|
readonly ok: true;
|
|
24
31
|
readonly outcome: Outcome;
|
|
25
32
|
} | {
|
|
26
33
|
readonly ok: false;
|
|
27
34
|
readonly error: unknown;
|
|
28
|
-
readonly
|
|
35
|
+
readonly delivered: Outcome | undefined;
|
|
29
36
|
};
|
|
37
|
+
/** What a serve Command prints the moment it starts. */
|
|
38
|
+
export declare function startedOutput(outcome: Outcome, format: OutputFormat, spill: Spill): Promise<string> | string;
|
|
39
|
+
/** A serve Command stopped after it started: stopping it is how it is meant to end. */
|
|
40
|
+
export declare const STOPPED_RESULT: RunResult;
|
|
30
41
|
export declare function errorResult(error: unknown, format: OutputFormat): RunResult;
|
|
31
|
-
export declare function commandResult(settled: Settled, format: DataFormat): RunResult
|
|
42
|
+
export declare function commandResult(settled: Settled, format: DataFormat, spill: Spill): Promise<RunResult>;
|
|
43
|
+
export declare function textHelp(node: SpecNode, root: SpecNode, cli: Cli, style: Style): string;
|
|
32
44
|
export declare function helpResult(node: SpecNode, root: SpecNode, cli: Cli, { style, json }: OutputFormat): RunResult;
|
|
33
|
-
|
|
45
|
+
/** The first line of `--version`: the version, and the commit and time of a stamped build. */
|
|
46
|
+
export declare function versionLine({ version, build }: Cli): string;
|
|
47
|
+
export declare function versionResult(cli: Cli, packageRoot: string): RunResult;
|
package/dist/output.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
import { errorsOf, formatRuntimeError, UsageError } from "./errors.js";
|
|
3
|
+
import { exitCodeOf, isBug } from "./exit-classes.js";
|
|
2
4
|
import { cliHelp, commandHelp, groupHelp } from "./help.js";
|
|
3
5
|
import { cliHelpJson, commandHelpJson, groupHelpJson } from "./help-json.js";
|
|
4
6
|
import { Page, pageFooter, printedPage, projected, renderRows } from "./list.js";
|
|
5
7
|
const SUCCESS_EXIT_CODE = 0;
|
|
6
|
-
const FAILURE_EXIT_CODE = 1;
|
|
7
|
-
const USAGE_EXIT_CODE = 2;
|
|
8
8
|
function withTrailingNewline(text) {
|
|
9
9
|
return text === "" || text.endsWith("\n") ? text : `${text}\n`;
|
|
10
10
|
}
|
|
@@ -24,42 +24,84 @@ function printed(value, render, { json, invocation, style, fields }) {
|
|
|
24
24
|
? `${JSON.stringify({ ...page, items: rows })}\n`
|
|
25
25
|
: `${renderRows(rows, fields)}${pageFooter(page)}`;
|
|
26
26
|
}
|
|
27
|
+
function errorText(error, format) {
|
|
28
|
+
const text = formatRuntimeError(error, {
|
|
29
|
+
...format,
|
|
30
|
+
isBug: (each) => isBug(each, format.errors),
|
|
31
|
+
});
|
|
32
|
+
const { usageHelp, json } = format;
|
|
33
|
+
return usageHelp !== undefined && !json && error instanceof UsageError
|
|
34
|
+
? `${text}\n${usageHelp}`
|
|
35
|
+
: text;
|
|
36
|
+
}
|
|
37
|
+
// A List Command keeps paging instead: `--limit` is how its caller sizes the output.
|
|
38
|
+
function stdoutOf({ value, render }, format, spill) {
|
|
39
|
+
const text = printed(value, render, format);
|
|
40
|
+
return value instanceof Page ? text : spill(text, format.json);
|
|
41
|
+
}
|
|
42
|
+
/** What a serve Command prints the moment it starts. */
|
|
43
|
+
export function startedOutput(outcome, format, spill) {
|
|
44
|
+
return stdoutOf(outcome, { ...format, fields: undefined }, spill);
|
|
45
|
+
}
|
|
46
|
+
/** A serve Command stopped after it started: stopping it is how it is meant to end. */
|
|
47
|
+
export const STOPPED_RESULT = { stdout: "", stderr: "", exitCode: SUCCESS_EXIT_CODE };
|
|
27
48
|
export function errorResult(error, format) {
|
|
28
49
|
return {
|
|
29
50
|
stdout: "",
|
|
30
|
-
stderr:
|
|
31
|
-
exitCode: error
|
|
51
|
+
stderr: errorText(error, format),
|
|
52
|
+
exitCode: exitCodeOf(error, format.errors, format.stop),
|
|
32
53
|
};
|
|
33
54
|
}
|
|
34
|
-
export function commandResult(settled, format) {
|
|
55
|
+
export async function commandResult(settled, format, spill) {
|
|
35
56
|
if (settled.ok) {
|
|
36
|
-
|
|
37
|
-
|
|
57
|
+
try {
|
|
58
|
+
const stdout = await stdoutOf(settled.outcome, format, spill);
|
|
59
|
+
return { stdout, stderr: "", exitCode: SUCCESS_EXIT_CODE };
|
|
60
|
+
}
|
|
61
|
+
catch (spillError) {
|
|
62
|
+
return errorResult(spillError, format);
|
|
63
|
+
}
|
|
38
64
|
}
|
|
39
|
-
const { error,
|
|
65
|
+
const { error, delivered } = settled;
|
|
40
66
|
const result = errorResult(error, format);
|
|
41
|
-
if (
|
|
67
|
+
if (delivered === undefined) {
|
|
42
68
|
return result;
|
|
43
69
|
}
|
|
44
|
-
|
|
45
|
-
|
|
70
|
+
try {
|
|
71
|
+
return { ...result, stdout: await stdoutOf(delivered, format, spill) };
|
|
72
|
+
}
|
|
73
|
+
catch (spillError) {
|
|
74
|
+
// The run's own error decides the exit code; the lost data is reported after it.
|
|
75
|
+
const both = new AggregateError([...errorsOf(error), spillError]);
|
|
76
|
+
return { ...result, stderr: errorText(both, format) };
|
|
77
|
+
}
|
|
46
78
|
}
|
|
47
79
|
// The root's help names the CLI and its version; a single Command is its CLI's root.
|
|
80
|
+
export function textHelp(node, root, cli, style) {
|
|
81
|
+
if (node === root)
|
|
82
|
+
return cliHelp(cli, node, style);
|
|
83
|
+
return node.kind === "command" ? commandHelp(node, style) : groupHelp(node, style);
|
|
84
|
+
}
|
|
48
85
|
function helpOf(node, root, cli, style, json) {
|
|
49
|
-
if (json)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return
|
|
53
|
-
|
|
54
|
-
if (node.kind === "command")
|
|
55
|
-
return commandHelp(node, style);
|
|
56
|
-
return node === root ? cliHelp(cli.version, node, style) : groupHelp(node, style);
|
|
86
|
+
if (!json)
|
|
87
|
+
return textHelp(node, root, cli, style);
|
|
88
|
+
if (node === root)
|
|
89
|
+
return cliHelpJson(cli, node);
|
|
90
|
+
return node.kind === "command" ? commandHelpJson(node) : groupHelpJson(node);
|
|
57
91
|
}
|
|
58
92
|
export function helpResult(node, root, cli, { style, json }) {
|
|
59
93
|
return { stdout: helpOf(node, root, cli, style, json), stderr: "", exitCode: SUCCESS_EXIT_CODE };
|
|
60
94
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
return
|
|
95
|
+
/** The first line of `--version`: the version, and the commit and time of a stamped build. */
|
|
96
|
+
export function versionLine({ version, build }) {
|
|
97
|
+
return build === undefined
|
|
98
|
+
? version
|
|
99
|
+
: `${version} (${build.sha}${build.dirty ? "+dirty" : ""}) built ${build.builtAt}`;
|
|
100
|
+
}
|
|
101
|
+
export function versionResult(cli, packageRoot) {
|
|
102
|
+
const lines = cli.build === undefined
|
|
103
|
+
? [versionLine(cli)]
|
|
104
|
+
: [versionLine(cli), `changelog ${join(packageRoot, "CHANGELOG.md")}`];
|
|
105
|
+
return { stdout: `${lines.join("\n")}\n`, stderr: "", exitCode: SUCCESS_EXIT_CODE };
|
|
64
106
|
}
|
|
65
107
|
//# sourceMappingURL=output.js.map
|
package/dist/output.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|