@duyquangnvx/agent-cli 0.3.0 → 0.5.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 +68 -0
- package/dist/agent-cli.d.ts +2 -2
- package/dist/agent-cli.js +1 -1
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent.d.ts +5 -3
- package/dist/agent.js +31 -10
- package/dist/agent.js.map +1 -1
- package/dist/built-ins.d.ts +6 -1
- package/dist/built-ins.js +3 -3
- package/dist/built-ins.js.map +1 -1
- package/dist/command-spec.d.ts +5 -0
- package/dist/command-spec.js +14 -3
- package/dist/command-spec.js.map +1 -1
- package/dist/confirm.js +6 -2
- package/dist/confirm.js.map +1 -1
- package/dist/context.d.ts +102 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/cost.js +2 -2
- package/dist/cost.js.map +1 -1
- package/dist/define.d.ts +42 -75
- package/dist/define.js +6 -1
- package/dist/define.js.map +1 -1
- package/dist/doctor-rows.d.ts +2 -1
- package/dist/doctor-rows.js +18 -10
- package/dist/doctor-rows.js.map +1 -1
- package/dist/doctor.d.ts +2 -1
- package/dist/doctor.js +29 -18
- package/dist/doctor.js.map +1 -1
- package/dist/errno.d.ts +11 -4
- package/dist/errno.js +34 -7
- package/dist/errno.js.map +1 -1
- package/dist/errors.d.ts +2 -1
- package/dist/errors.js +4 -0
- package/dist/errors.js.map +1 -1
- package/dist/execute.d.ts +9 -4
- package/dist/execute.js +10 -3
- package/dist/execute.js.map +1 -1
- package/dist/exit-classes.js +5 -1
- package/dist/exit-classes.js.map +1 -1
- package/dist/files.d.ts +42 -3
- package/dist/files.js +132 -10
- package/dist/files.js.map +1 -1
- package/dist/flags.d.ts +5 -1
- package/dist/flags.js +17 -2
- package/dist/flags.js.map +1 -1
- package/dist/help-json.d.ts +1 -1
- package/dist/help-json.js +4 -1
- package/dist/help-json.js.map +1 -1
- package/dist/help.d.ts +1 -1
- package/dist/help.js +11 -7
- package/dist/help.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/input.d.ts +10 -0
- package/dist/input.js +54 -3
- package/dist/input.js.map +1 -1
- package/dist/interrupts.d.ts +3 -1
- package/dist/interrupts.js +4 -3
- package/dist/interrupts.js.map +1 -1
- package/dist/invocation.d.ts +10 -5
- package/dist/invocation.js +24 -11
- package/dist/invocation.js.map +1 -1
- package/dist/list.js +5 -2
- package/dist/list.js.map +1 -1
- package/dist/npm.d.ts +5 -2
- package/dist/npm.js +23 -31
- package/dist/npm.js.map +1 -1
- package/dist/operator.d.ts +5 -0
- package/dist/operator.js +15 -0
- package/dist/operator.js.map +1 -0
- package/dist/output.d.ts +4 -1
- package/dist/output.js +4 -0
- package/dist/output.js.map +1 -1
- package/dist/outputs.d.ts +24 -1
- package/dist/outputs.js +58 -2
- package/dist/outputs.js.map +1 -1
- package/dist/parse-input.d.ts +11 -2
- package/dist/parse-input.js +92 -19
- 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 +1 -1
- package/dist/route.d.ts +1 -1
- package/dist/route.js +2 -1
- package/dist/route.js.map +1 -1
- package/dist/run-cli.d.ts +16 -2
- package/dist/run-cli.js +116 -58
- package/dist/run-cli.js.map +1 -1
- package/dist/run-process.js +3 -2
- package/dist/run-process.js.map +1 -1
- package/dist/secrets.d.ts +9 -2
- package/dist/secrets.js +7 -5
- package/dist/secrets.js.map +1 -1
- package/dist/skill-source.d.ts +4 -0
- package/dist/skill-source.js +42 -0
- package/dist/skill-source.js.map +1 -0
- package/dist/skills.d.ts +2 -1
- package/dist/skills.js +4 -0
- package/dist/skills.js.map +1 -1
- package/dist/spawn.d.ts +22 -5
- package/dist/spawn.js +126 -29
- package/dist/spawn.js.map +1 -1
- package/dist/spill.d.ts +4 -3
- package/dist/spill.js +1 -2
- package/dist/spill.js.map +1 -1
- package/dist/stdin.d.ts +13 -0
- package/dist/stdin.js +55 -0
- package/dist/stdin.js.map +1 -0
- package/dist/style.d.ts +1 -1
- package/dist/tokenize.d.ts +3 -0
- package/dist/tokenize.js +5 -4
- package/dist/tokenize.js.map +1 -1
- package/dist/tools.d.ts +6 -3
- package/dist/tools.js +18 -11
- package/dist/tools.js.map +1 -1
- package/dist/update.d.ts +2 -1
- package/dist/update.js +3 -3
- package/dist/update.js.map +1 -1
- package/package.json +1 -1
package/dist/files.d.ts
CHANGED
|
@@ -1,9 +1,48 @@
|
|
|
1
|
-
|
|
1
|
+
import type { FileError } from "./errno.js";
|
|
2
|
+
export interface MkdirOptions {
|
|
3
|
+
/** Fail with `ALREADY_EXISTS` when the folder itself exists. */
|
|
4
|
+
readonly exclusive?: boolean;
|
|
5
|
+
}
|
|
6
|
+
export interface WriteOptions {
|
|
7
|
+
/** Fail with `ALREADY_EXISTS` when anything exists at the path. */
|
|
8
|
+
readonly exclusive?: boolean;
|
|
9
|
+
/** The file's permission bits, whatever mode an older file had. */
|
|
10
|
+
readonly mode?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface FileStat {
|
|
13
|
+
readonly size: number;
|
|
14
|
+
/** The same for every link to one file: its device and inode. */
|
|
15
|
+
readonly id: string;
|
|
16
|
+
}
|
|
17
|
+
/** The file system as Commands use it; a test replaces it through `runCli`. */
|
|
2
18
|
export interface Files {
|
|
3
|
-
/**
|
|
4
|
-
|
|
19
|
+
/**
|
|
20
|
+
* Writes `data` to the absolute `path` whole or not at all, creating missing parent folders; a
|
|
21
|
+
* replacing write through a symlink replaces its target.
|
|
22
|
+
*/
|
|
23
|
+
write(path: string, data: string | Uint8Array, options?: WriteOptions): Promise<void>;
|
|
5
24
|
/** Whether anything exists at the absolute `path`. */
|
|
6
25
|
exists(path: string): Promise<boolean>;
|
|
26
|
+
read(path: string): Promise<Uint8Array>;
|
|
27
|
+
/** The names in the absolute `folder`. */
|
|
28
|
+
list(folder: string): Promise<string[]>;
|
|
29
|
+
/** Removes a file, or a folder and everything in it; a missing `path` is a success. */
|
|
30
|
+
remove(path: string): Promise<void>;
|
|
31
|
+
/** Creates the folder and its missing parents; an existing folder is a success unless `exclusive`. */
|
|
32
|
+
mkdir(path: string, options?: MkdirOptions): Promise<void>;
|
|
33
|
+
/** The file at the absolute `path`, or `undefined` when nothing is there or a part of it is a file. */
|
|
34
|
+
stat(path: string): Promise<FileStat | undefined>;
|
|
7
35
|
}
|
|
36
|
+
/** Where the Runtime writes `path` before moving it into place; a dead writer's is swept. */
|
|
37
|
+
export declare function tempPathOf(path: string): string;
|
|
8
38
|
/** Real files for one run: the first write to each folder sweeps the temp files of dead writers. */
|
|
9
39
|
export declare function realFiles(): Files;
|
|
40
|
+
export interface FilesScope {
|
|
41
|
+
readonly cwd: string;
|
|
42
|
+
readonly fileError: FileError;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* `files` resolving paths against `cwd`, its failures classified by errno; `list` drops the
|
|
46
|
+
* Runtime's temp files and sorts.
|
|
47
|
+
*/
|
|
48
|
+
export declare function classifiedFiles(files: Files, { cwd, fileError }: FilesScope): Files;
|
package/dist/files.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { access, readdir, rename, rm, writeFile } from "node:fs/promises";
|
|
2
|
-
import { basename, dirname, join } from "node:path";
|
|
3
|
-
import {
|
|
1
|
+
import { access, chmod, link, mkdir, open, readdir, readFile, realpath, rename, rm, stat, writeFile, } from "node:fs/promises";
|
|
2
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
3
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
4
|
+
import { errnoOf, isMissingFile, isNothingThere } from "./errors.js";
|
|
4
5
|
const TEMP_FILE = /^\..+\.agent-cli-(\d+)\.tmp$/;
|
|
5
|
-
|
|
6
|
+
/** Where the Runtime writes `path` before moving it into place; a dead writer's is swept. */
|
|
7
|
+
export function tempPathOf(path) {
|
|
6
8
|
return join(dirname(path), `.${basename(path)}.agent-cli-${process.pid}.tmp`);
|
|
7
9
|
}
|
|
8
10
|
function isAlive(pid) {
|
|
@@ -23,6 +25,72 @@ async function sweep(folder) {
|
|
|
23
25
|
});
|
|
24
26
|
await Promise.all(dead.map((name) => rm(join(folder, name), { force: true })));
|
|
25
27
|
}
|
|
28
|
+
/** The file a symlink at `path` points to, so a replacing write keeps the link. */
|
|
29
|
+
async function targetOf(path) {
|
|
30
|
+
try {
|
|
31
|
+
return await realpath(path);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (isMissingFile(error))
|
|
35
|
+
return path;
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// The chmod sets the exact mode, which the umask would otherwise narrow.
|
|
40
|
+
async function writeWithMode(path, data, mode) {
|
|
41
|
+
if (mode === undefined) {
|
|
42
|
+
await writeFile(path, data);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
await writeFile(path, data, { mode });
|
|
46
|
+
await chmod(path, mode);
|
|
47
|
+
}
|
|
48
|
+
/** What `link` answers on a file system without hard links, such as exFAT. */
|
|
49
|
+
const NO_HARD_LINKS = new Set(["EPERM", "ENOTSUP", "EXDEV"]);
|
|
50
|
+
/** A link fails atomically when `path` is taken, so no reader ever sees half a file there. */
|
|
51
|
+
async function linkNew(temp, path, data, mode) {
|
|
52
|
+
try {
|
|
53
|
+
await link(temp, path);
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
if (!NO_HARD_LINKS.has(errnoOf(error)))
|
|
57
|
+
throw error;
|
|
58
|
+
await createNew(path, data, mode);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/** A file this call created and could not finish is removed, so a rerun does not find half of it. */
|
|
62
|
+
async function createNew(path, data, mode) {
|
|
63
|
+
const handle = await open(path, "wx", mode);
|
|
64
|
+
try {
|
|
65
|
+
await handle.writeFile(data);
|
|
66
|
+
if (mode !== undefined)
|
|
67
|
+
await handle.chmod(mode);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
await handle.close();
|
|
71
|
+
await rm(path, { force: true });
|
|
72
|
+
throw error;
|
|
73
|
+
}
|
|
74
|
+
await handle.close();
|
|
75
|
+
}
|
|
76
|
+
const RENAME_ATTEMPTS = 10;
|
|
77
|
+
const RENAME_BACKOFF_MS = 10;
|
|
78
|
+
const HELD_BY_ANOTHER_PROGRAM = new Set(["EPERM", "EBUSY"]);
|
|
79
|
+
// Windows answers EPERM or EBUSY while another program, such as an antivirus scan, holds the file.
|
|
80
|
+
async function renameRetrying(from, to) {
|
|
81
|
+
for (let attempt = 1;; attempt++) {
|
|
82
|
+
try {
|
|
83
|
+
await rename(from, to);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
const transient = process.platform === "win32" && HELD_BY_ANOTHER_PROGRAM.has(errnoOf(error));
|
|
88
|
+
if (!transient || attempt === RENAME_ATTEMPTS)
|
|
89
|
+
throw error;
|
|
90
|
+
await sleep(attempt * RENAME_BACKOFF_MS);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
26
94
|
/** Real files for one run: the first write to each folder sweeps the temp files of dead writers. */
|
|
27
95
|
export function realFiles() {
|
|
28
96
|
const swept = new Set();
|
|
@@ -33,27 +101,81 @@ export function realFiles() {
|
|
|
33
101
|
return true;
|
|
34
102
|
}
|
|
35
103
|
catch (error) {
|
|
36
|
-
if (
|
|
104
|
+
if (isNothingThere(error))
|
|
37
105
|
return false;
|
|
38
106
|
throw error;
|
|
39
107
|
}
|
|
40
108
|
},
|
|
41
|
-
write: async (path, data) => {
|
|
42
|
-
|
|
109
|
+
write: async (path, data, options = {}) => {
|
|
110
|
+
await mkdir(dirname(path), { recursive: true });
|
|
111
|
+
const target = options.exclusive === true ? path : await targetOf(path);
|
|
112
|
+
const folder = dirname(target);
|
|
43
113
|
if (!swept.has(folder)) {
|
|
44
114
|
await sweep(folder);
|
|
45
115
|
swept.add(folder);
|
|
46
116
|
}
|
|
47
|
-
const temp = tempPathOf(
|
|
117
|
+
const temp = tempPathOf(target);
|
|
48
118
|
try {
|
|
49
|
-
await
|
|
50
|
-
|
|
119
|
+
await writeWithMode(temp, data, options.mode);
|
|
120
|
+
if (options.exclusive === true) {
|
|
121
|
+
await linkNew(temp, target, data, options.mode);
|
|
122
|
+
await rm(temp);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
await renameRetrying(temp, target);
|
|
126
|
+
}
|
|
51
127
|
}
|
|
52
128
|
catch (error) {
|
|
53
129
|
await rm(temp, { force: true });
|
|
54
130
|
throw error;
|
|
55
131
|
}
|
|
56
132
|
},
|
|
133
|
+
read: (path) => readFile(path),
|
|
134
|
+
list: (folder) => readdir(folder),
|
|
135
|
+
remove: (path) => rm(path, { recursive: true, force: true }),
|
|
136
|
+
mkdir: async (path, options) => {
|
|
137
|
+
if (options?.exclusive !== true) {
|
|
138
|
+
await mkdir(path, { recursive: true });
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
await mkdir(dirname(path), { recursive: true });
|
|
142
|
+
await mkdir(path);
|
|
143
|
+
},
|
|
144
|
+
stat: async (path) => {
|
|
145
|
+
try {
|
|
146
|
+
const { size, dev, ino } = await stat(path, { bigint: true });
|
|
147
|
+
return { size: Number(size), id: `${dev}:${ino}` };
|
|
148
|
+
}
|
|
149
|
+
catch (error) {
|
|
150
|
+
if (isNothingThere(error))
|
|
151
|
+
return undefined;
|
|
152
|
+
throw error;
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* `files` resolving paths against `cwd`, its failures classified by errno; `list` drops the
|
|
159
|
+
* Runtime's temp files and sorts.
|
|
160
|
+
*/
|
|
161
|
+
export function classifiedFiles(files, { cwd, fileError }) {
|
|
162
|
+
async function at(access, path, work) {
|
|
163
|
+
const target = resolve(cwd, path);
|
|
164
|
+
try {
|
|
165
|
+
return await work(target);
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
throw fileError(error, { path: target, access });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return {
|
|
172
|
+
exists: (path) => at("read", path, (target) => files.exists(target)),
|
|
173
|
+
write: (path, data, options) => at("write", path, (target) => files.write(target, data, options)),
|
|
174
|
+
read: (path) => at("read", path, (target) => files.read(target)),
|
|
175
|
+
list: (folder) => at("read", folder, async (target) => (await files.list(target)).filter((name) => !TEMP_FILE.test(name)).sort()),
|
|
176
|
+
remove: (path) => at("write", path, (target) => files.remove(target)),
|
|
177
|
+
mkdir: (path, options) => at("write", path, (target) => files.mkdir(target, options)),
|
|
178
|
+
stat: (path) => at("read", path, (target) => files.stat(target)),
|
|
57
179
|
};
|
|
58
180
|
}
|
|
59
181
|
//# sourceMappingURL=files.js.map
|
package/dist/files.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"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"}
|
package/dist/flags.d.ts
CHANGED
|
@@ -55,10 +55,14 @@ export type StandardFlagName = NameOf<(typeof ROUTING_FLAGS)[number]> | NameOf<(
|
|
|
55
55
|
/** What a Command declares beyond its Effect that adds Standard flags. */
|
|
56
56
|
export interface Declared {
|
|
57
57
|
readonly outputs: boolean;
|
|
58
|
+
/** The sentence describing what `--force` replaces, when the Command declares one. */
|
|
59
|
+
readonly force: string | undefined;
|
|
58
60
|
readonly cost: boolean;
|
|
59
61
|
}
|
|
60
62
|
/** The Standard flags of a Command with this Effect and declarations, and of a List Command. */
|
|
61
|
-
export declare function standardFlagsFor(effect: Effect, { outputs, cost }: Declared, list: ListSpec | undefined): readonly StandardFlag[];
|
|
63
|
+
export declare function standardFlagsFor(effect: Effect, { outputs, force, cost }: Declared, list: ListSpec | undefined): readonly StandardFlag[];
|
|
62
64
|
/** Throws when the Command declares an arg or option under a Standard flag's name. */
|
|
63
65
|
export declare function checkNoStandardFlags(command: Command): void;
|
|
66
|
+
/** Throws when `force` is declared on a Command with no Plan, or says nothing. */
|
|
67
|
+
export declare function checkForce(command: Command): void;
|
|
64
68
|
export {};
|
package/dist/flags.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as z from "zod";
|
|
2
2
|
import { argFields, kebab, optionFields } from "./input.js";
|
|
3
3
|
import { LIST_FLAGS } from "./list.js";
|
|
4
|
+
import { hasPlan } from "./planned.js";
|
|
4
5
|
export const HELP_FLAG = "--help";
|
|
5
6
|
export const HELP_SHORT = "-h";
|
|
6
7
|
export const VERSION_FLAG = "--version";
|
|
@@ -53,10 +54,11 @@ const RESERVED = new Map([
|
|
|
53
54
|
...LIST_FLAGS,
|
|
54
55
|
].map((flag) => [nameOf(flag), flag]));
|
|
55
56
|
/** The Standard flags of a Command with this Effect and declarations, and of a List Command. */
|
|
56
|
-
export function standardFlagsFor(effect, { outputs, cost }, list) {
|
|
57
|
+
export function standardFlagsFor(effect, { outputs, force, cost }, list) {
|
|
58
|
+
const forceFlag = force === undefined ? FORCE_FLAG : { ...FORCE_FLAG, description: force };
|
|
57
59
|
return [
|
|
58
60
|
...EFFECT_FLAGS[effect],
|
|
59
|
-
...(outputs ? [
|
|
61
|
+
...(outputs || force !== undefined ? [forceFlag] : []),
|
|
60
62
|
...(cost ? [YES_FLAG] : []),
|
|
61
63
|
...(list?.standardFlags ?? []),
|
|
62
64
|
];
|
|
@@ -78,4 +80,17 @@ export function checkNoStandardFlags(command) {
|
|
|
78
80
|
].join("\n"));
|
|
79
81
|
}
|
|
80
82
|
}
|
|
83
|
+
/** Throws when `force` is declared on a Command with no Plan, or says nothing. */
|
|
84
|
+
export function checkForce(command) {
|
|
85
|
+
const force = "force" in command ? command.force : undefined;
|
|
86
|
+
if (force === undefined) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
if (!hasPlan(command)) {
|
|
90
|
+
throw new Error(`Command '${command.name}' declares force, which only a write or destructive Command may`);
|
|
91
|
+
}
|
|
92
|
+
if (force.trim() === "") {
|
|
93
|
+
throw new Error(`Command '${command.name}' declares an empty force; say what ${FORCE_FLAG.flag} replaces`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
81
96
|
//# sourceMappingURL=flags.js.map
|
package/dist/flags.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAoC,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"flags.js","sourceRoot":"","sources":["../src/flags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAoC,MAAM,WAAW,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAKvC,MAAM,CAAC,MAAM,SAAS,GAAG,QAAQ,CAAC;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC;AAC/B,MAAM,CAAC,MAAM,YAAY,GAAG,WAAW,CAAC;AACxC,8FAA8F;AAC9F,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,YAAY,CAAU,CAAC;AAQrE,SAAS,MAAM,CAAC,IAAY;IAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAWD,SAAS,YAAY,CACnB,IAAU,EACV,EACE,WAAW,EACX,GAAG,IAAI,EACkE;IAE3E,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,WAAW,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC;AAC/F,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC,QAAQ,EAAE;IAC9C,WAAW,EAAE,0BAA0B;IACvC,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,EAAE;IACpD,WAAW,EAAE,0CAA0C;IACvD,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,YAAY,CAAC,WAAW,EAAE;IACpD,WAAW,EAAE,UAAU;IACvB,WAAW,EAAE,8EAA8E;IAC3F,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;CACnB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,EAAE;IAC5C,WAAW,EAAE,qDAAqD;IAClE,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC,SAAS,EAAE;IAChD,WAAW,EAAE,wEAAwE;IACrF,KAAK,EAAE,SAAS;IAChB,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;CACpB,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG;IACnB,IAAI,EAAE,CAAC,SAAS,CAAC;IACjB,KAAK,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC;IAChC,WAAW,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,YAAY,CAAC;IACpD,KAAK,EAAE,CAAC,SAAS,CAAC;CACwC,CAAC;AAS7D,8FAA8F;AAC9F,MAAM,QAAQ,GAAgC,IAAI,GAAG,CACnD;IACE,GAAG,aAAa;IAChB,GAAG,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC;IACnD,QAAQ,CAAC,IAAI;IACb,UAAU,CAAC,IAAI;IACf,GAAG,UAAU;CACd,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC,CACtC,CAAC;AAUF,gGAAgG;AAChG,MAAM,UAAU,gBAAgB,CAC9B,MAAc,EACd,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAY,EAClC,IAA0B;IAE1B,MAAM,SAAS,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAC3F,OAAO;QACL,GAAG,YAAY,CAAC,MAAM,CAAC;QACvB,GAAG,CAAC,OAAO,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,GAAG,CAAC,IAAI,EAAE,aAAa,IAAI,EAAE,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,QAAQ,GAAG;QACf,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACnE,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;KAC7E,CAAC;IACF,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;QAC/C,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;QACtC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,GAAG,0BAA0B,IAAI,EAAE,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IACH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb;YACE,YAAY,OAAO,CAAC,IAAI,0DAA0D;YAClF,GAAG,KAAK;SACT,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACJ,CAAC;AACH,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,MAAM,KAAK,GAAG,OAAO,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,YAAY,OAAO,CAAC,IAAI,iEAAiE,CAC1F,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,YAAY,OAAO,CAAC,IAAI,uCAAuC,UAAU,CAAC,IAAI,WAAW,CAC1F,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/help-json.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type CommandSpec, type GroupSpec, type SpecNode } from "./command-spec.js";
|
|
2
2
|
import type { Cli } from "./define.js";
|
|
3
3
|
export declare function cliHelpJson({ version, errors }: Cli, root: SpecNode): string;
|
|
4
4
|
export declare function groupHelpJson(group: GroupSpec): string;
|
package/dist/help-json.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as z from "zod";
|
|
2
|
+
import { visibleCommands, } from "./command-spec.js";
|
|
2
3
|
// Transforms and other unrepresentable parts become `{}` rather than failing the whole help.
|
|
3
4
|
function inputSchema(schema) {
|
|
4
5
|
return z.toJSONSchema(schema, { io: "input", unrepresentable: "any" });
|
|
@@ -11,7 +12,9 @@ function commandData(spec) {
|
|
|
11
12
|
return {
|
|
12
13
|
name: spec.commandLine,
|
|
13
14
|
description: spec.description,
|
|
15
|
+
help: spec.help ?? null,
|
|
14
16
|
effect: spec.effect,
|
|
17
|
+
operator: spec.operator,
|
|
15
18
|
examples: spec.examples,
|
|
16
19
|
args: inputSchema(spec.command.args ?? z.object({})),
|
|
17
20
|
options: optionsSchema(spec.options),
|
|
@@ -27,7 +30,7 @@ function nodeData(node) {
|
|
|
27
30
|
return node.kind === "command" ? commandData(node) : groupData(node);
|
|
28
31
|
}
|
|
29
32
|
function groupData(group) {
|
|
30
|
-
return { name: group.commandLine, commands: Object.values(group
|
|
33
|
+
return { name: group.commandLine, commands: Object.values(visibleCommands(group)).map(nodeData) };
|
|
31
34
|
}
|
|
32
35
|
function printed(data) {
|
|
33
36
|
return `${JSON.stringify(data)}\n`;
|
package/dist/help-json.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help-json.js","sourceRoot":"","sources":["../src/help-json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"help-json.js","sourceRoot":"","sources":["../src/help-json.ts"],"names":[],"mappings":"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"}
|
package/dist/help.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type CommandSpec, type GroupSpec, type SpecNode } from "./command-spec.js";
|
|
2
2
|
import type { Cli } from "./define.js";
|
|
3
3
|
import type { Style } from "./style.js";
|
|
4
4
|
/** The CLI's own help: a listing or its single Command's help, ending with exit codes and examples. */
|
package/dist/help.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { visibleCommands, } from "./command-spec.js";
|
|
1
2
|
import { EXIT_CODES, reachableExitClasses, SIGNAL_EXIT_CODES } from "./exit-classes.js";
|
|
2
3
|
function table(rows) {
|
|
3
4
|
const width = Math.max(...rows.map(([left]) => left.length));
|
|
@@ -7,12 +8,12 @@ function section(title, rows, style) {
|
|
|
7
8
|
return rows.length === 0 ? [] : ["", style.bold(`${title}:`), ...table(rows)];
|
|
8
9
|
}
|
|
9
10
|
function summaryOf(node) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
if (node.kind === "group")
|
|
12
|
+
return `group: ${Object.keys(visibleCommands(node)).join(", ")}`;
|
|
13
|
+
return node.operator ? `${node.description} (operator only)` : node.description;
|
|
13
14
|
}
|
|
14
|
-
function commandRows(
|
|
15
|
-
return Object.entries(
|
|
15
|
+
function commandRows(group) {
|
|
16
|
+
return Object.entries(visibleCommands(group)).map(([key, node]) => [key, summaryOf(node)]);
|
|
16
17
|
}
|
|
17
18
|
function lines(...parts) {
|
|
18
19
|
return `${parts.join("\n")}\n`;
|
|
@@ -46,13 +47,13 @@ function exitCodeRows(cli) {
|
|
|
46
47
|
function firstExample(node) {
|
|
47
48
|
if (node.kind === "command")
|
|
48
49
|
return node.examples.slice(0, 1);
|
|
49
|
-
return Object.values(node
|
|
50
|
+
return Object.values(visibleCommands(node)).flatMap(firstExample).slice(0, 1);
|
|
50
51
|
}
|
|
51
52
|
// ADR 0002 of repo-harness: the last example is `doctor`, where an agent goes when a run fails.
|
|
52
53
|
function rootExamples(root) {
|
|
53
54
|
if (root.kind === "command")
|
|
54
55
|
return [...root.examples];
|
|
55
|
-
const { doctor, ...others } = root
|
|
56
|
+
const { doctor, ...others } = visibleCommands(root);
|
|
56
57
|
return [...Object.values(others), ...(doctor === undefined ? [] : [doctor])].flatMap(firstExample);
|
|
57
58
|
}
|
|
58
59
|
function examplesSection(examples, style) {
|
|
@@ -74,6 +75,7 @@ const EFFECT_NOTES = {
|
|
|
74
75
|
destructive: "changes something hard to undo; show the Plan with --dry-run, run with --confirm",
|
|
75
76
|
serve: "changes nothing; prints its data at once, then runs until Ctrl-C, which exits 0",
|
|
76
77
|
};
|
|
78
|
+
const OPERATOR_NOTE = "only a person at a terminal runs it; a Coding agent asks the operator to type it after `!`";
|
|
77
79
|
function choicesOf(field) {
|
|
78
80
|
return field.choices === undefined ? [] : [`one of: ${field.choices.join(", ")}`];
|
|
79
81
|
}
|
|
@@ -109,8 +111,10 @@ function commandLines(spec, style, { examples }) {
|
|
|
109
111
|
...(examples ? examplesSection(spec.examples, style) : []),
|
|
110
112
|
...section("Arguments", spec.args.map(argRow), style),
|
|
111
113
|
...section("Options", spec.options.map(optionRow), style),
|
|
114
|
+
...(spec.help === undefined ? [] : ["", spec.help]),
|
|
112
115
|
"",
|
|
113
116
|
`${style.bold("Effect:")} ${spec.effect} (${EFFECT_NOTES[spec.effect]})`,
|
|
117
|
+
...(spec.operator ? [`${style.bold("Operator Command:")} ${OPERATOR_NOTE}`] : []),
|
|
114
118
|
...section("Standard flags", spec.standardFlags.map(flagRow), style),
|
|
115
119
|
];
|
|
116
120
|
}
|
package/dist/help.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"help.js","sourceRoot":"","sources":["../src/help.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
export type { AgentCli } from "./agent-cli.js";
|
|
2
2
|
export { agentCli } from "./agent-cli.js";
|
|
3
3
|
export type { Clock } from "./clock.js";
|
|
4
|
-
export type {
|
|
4
|
+
export type { BuildStamp, Context, Env, PollOptions, PortsBase, Project, ProjectFile, } from "./context.js";
|
|
5
|
+
export type { Cli, Command, Commands, DefineCommand, DestructiveCommand, DoctorCheck, DoctorFinding, Example, GlobalInstall, ListCommand, NoPorts, ReadCommand, RunDeadline, ServeCommand, Tool, WriteCommand, } from "./define.js";
|
|
6
|
+
export { ALREADY_EXISTS, DISK_FULL, type FileAccess, NOT_A_FILE, NOT_FOUND, PERMISSION_DENIED, } from "./errno.js";
|
|
5
7
|
export type { CliErrorInit, DeclaredExitClass, ErrorDeclaration, ErrorTable, } from "./error-table.js";
|
|
6
8
|
export { cliError, defineErrors } from "./error-table.js";
|
|
7
9
|
export type { CliErrorFields, UsageErrorFields } from "./errors.js";
|
|
8
10
|
export { CliError, debugVariable, UsageError } from "./errors.js";
|
|
9
|
-
export type { Files } from "./files.js";
|
|
11
|
+
export type { FileStat, Files, MkdirOptions, WriteOptions } from "./files.js";
|
|
12
|
+
export { DEADLINE_EXCEEDED, INTERRUPTED } from "./interrupts.js";
|
|
10
13
|
export type { Page, PageInput } from "./list.js";
|
|
11
14
|
export { paginate } from "./list.js";
|
|
15
|
+
export { NEEDS_OPERATOR } from "./operator.js";
|
|
12
16
|
export type { RunResult } from "./output.js";
|
|
13
17
|
export type { RunOptions } from "./run-cli.js";
|
|
14
18
|
export { runCli } from "./run-cli.js";
|
|
15
19
|
export { runProcess } from "./run-process.js";
|
|
16
20
|
export type { Secret, SecretOrigin } from "./secrets.js";
|
|
17
21
|
export type { Spawn, SpawnOptions, SpawnResult } from "./spawn.js";
|
|
22
|
+
export type { StdinSource } from "./stdin.js";
|
|
23
|
+
export { orStdin } from "./stdin.js";
|
|
18
24
|
export type { Style } from "./style.js";
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
export { agentCli } from "./agent-cli.js";
|
|
2
|
+
export { ALREADY_EXISTS, DISK_FULL, NOT_A_FILE, NOT_FOUND, PERMISSION_DENIED, } from "./errno.js";
|
|
2
3
|
export { cliError, defineErrors } from "./error-table.js";
|
|
3
4
|
export { CliError, debugVariable, UsageError } from "./errors.js";
|
|
5
|
+
export { DEADLINE_EXCEEDED, INTERRUPTED } from "./interrupts.js";
|
|
4
6
|
export { paginate } from "./list.js";
|
|
7
|
+
export { NEEDS_OPERATOR } from "./operator.js";
|
|
5
8
|
export { runCli } from "./run-cli.js";
|
|
6
9
|
export { runProcess } from "./run-process.js";
|
|
10
|
+
export { orStdin } from "./stdin.js";
|
|
7
11
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA6B1C,OAAO,EACL,cAAc,EACd,SAAS,EAET,UAAU,EACV,SAAS,EACT,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAOpB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEjE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/input.d.ts
CHANGED
|
@@ -11,6 +11,10 @@ export interface InputField {
|
|
|
11
11
|
readonly defaultValue: unknown;
|
|
12
12
|
readonly description: string | undefined;
|
|
13
13
|
readonly choices: readonly string[] | undefined;
|
|
14
|
+
/** A `z.array(...)` field: an arg taking every remaining operand, or an option taking every occurrence of its flag; `type` and `choices` are its element's. */
|
|
15
|
+
readonly variadic: boolean;
|
|
16
|
+
/** Marked with `orStdin`: the operand `-` stands for the text on stdin. */
|
|
17
|
+
readonly stdin: boolean;
|
|
14
18
|
/** How the caller names it: `<name>` for an arg, `--name` or `--no-name` for an option. */
|
|
15
19
|
readonly label: string;
|
|
16
20
|
/** How the caller passes it: the label plus a value placeholder such as `<value>` or `<a|b>`. */
|
|
@@ -19,4 +23,10 @@ export interface InputField {
|
|
|
19
23
|
export declare function kebab(key: string): string;
|
|
20
24
|
export declare function optionField(key: string, schema: z.ZodType): InputField;
|
|
21
25
|
export declare function argFields(schema: InputSchema | undefined): InputField[];
|
|
26
|
+
/** Throws when an arg that takes every remaining operand is not the last arg. */
|
|
27
|
+
export declare function checkArrayArgLast(name: string, args: InputSchema | undefined): void;
|
|
28
|
+
/** Throws unless at most one arg, and no option, is marked with `orStdin`. */
|
|
29
|
+
export declare function checkStdinFields(name: string, args: InputSchema | undefined, options: InputSchema | undefined): void;
|
|
22
30
|
export declare function optionFields(schema: InputSchema | undefined): InputField[];
|
|
31
|
+
/** Throws when an option is an array of booleans, which a switch cannot express. */
|
|
32
|
+
export declare function checkNoBooleanArrayOption(name: string, options: InputSchema | undefined): void;
|
package/dist/input.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as z from "zod";
|
|
2
|
+
import { isStdinSchema } from "./stdin.js";
|
|
2
3
|
function isWrapper(schema) {
|
|
3
4
|
return (schema instanceof z.ZodOptional ||
|
|
4
5
|
schema instanceof z.ZodNullable ||
|
|
@@ -20,6 +21,7 @@ function describe(schema) {
|
|
|
20
21
|
let description = current.description;
|
|
21
22
|
let required = true;
|
|
22
23
|
let defaultValue;
|
|
24
|
+
let stdin = isStdinSchema(current);
|
|
23
25
|
while (isWrapper(current)) {
|
|
24
26
|
if (current instanceof z.ZodDefault || current instanceof z.ZodPrefault) {
|
|
25
27
|
defaultValue = current.def.defaultValue;
|
|
@@ -27,6 +29,11 @@ function describe(schema) {
|
|
|
27
29
|
required = false;
|
|
28
30
|
current = current.unwrap();
|
|
29
31
|
description ??= current.description;
|
|
32
|
+
stdin ||= isStdinSchema(current);
|
|
33
|
+
}
|
|
34
|
+
const variadic = current instanceof z.ZodArray;
|
|
35
|
+
if (current instanceof z.ZodArray) {
|
|
36
|
+
current = current.element;
|
|
30
37
|
}
|
|
31
38
|
return {
|
|
32
39
|
type: typeOf(current),
|
|
@@ -34,11 +41,23 @@ function describe(schema) {
|
|
|
34
41
|
defaultValue,
|
|
35
42
|
description,
|
|
36
43
|
choices: current instanceof z.ZodEnum ? current.options.map(String) : undefined,
|
|
44
|
+
variadic,
|
|
45
|
+
stdin,
|
|
37
46
|
};
|
|
38
47
|
}
|
|
48
|
+
function argLabel(key, { variadic, required, stdin }) {
|
|
49
|
+
if (stdin) {
|
|
50
|
+
return required ? `<${key}|->` : `[${key}|-]`;
|
|
51
|
+
}
|
|
52
|
+
if (!variadic) {
|
|
53
|
+
return `<${key}>`;
|
|
54
|
+
}
|
|
55
|
+
return required ? `<${key}...>` : `[${key}...]`;
|
|
56
|
+
}
|
|
39
57
|
function argField(key, schema) {
|
|
40
|
-
const
|
|
41
|
-
|
|
58
|
+
const described = describe(schema);
|
|
59
|
+
const label = argLabel(key, described);
|
|
60
|
+
return { key, name: key, schema, ...described, label, usage: label };
|
|
42
61
|
}
|
|
43
62
|
export function optionField(key, schema) {
|
|
44
63
|
const described = describe(schema);
|
|
@@ -46,7 +65,8 @@ export function optionField(key, schema) {
|
|
|
46
65
|
const isBoolean = described.type === "boolean";
|
|
47
66
|
// A boolean that defaults to true can only be changed by turning it off.
|
|
48
67
|
const label = isBoolean && described.defaultValue === true ? `--no-${name}` : `--${name}`;
|
|
49
|
-
const
|
|
68
|
+
const value = `<${described.choices?.join("|") ?? "value"}>${described.variadic ? "..." : ""}`;
|
|
69
|
+
const usage = isBoolean ? label : `${label} ${value}`;
|
|
50
70
|
return { key, name, schema, ...described, label, usage };
|
|
51
71
|
}
|
|
52
72
|
function fieldsOf(schema, toField) {
|
|
@@ -57,7 +77,38 @@ function fieldsOf(schema, toField) {
|
|
|
57
77
|
export function argFields(schema) {
|
|
58
78
|
return fieldsOf(schema, argField);
|
|
59
79
|
}
|
|
80
|
+
function keysOf(fields) {
|
|
81
|
+
return fields.map(({ key }) => `'${key}'`).join(", ");
|
|
82
|
+
}
|
|
83
|
+
/** Throws when an arg that takes every remaining operand is not the last arg. */
|
|
84
|
+
export function checkArrayArgLast(name, args) {
|
|
85
|
+
const misplaced = argFields(args)
|
|
86
|
+
.slice(0, -1)
|
|
87
|
+
.filter((field) => field.variadic);
|
|
88
|
+
if (misplaced.length > 0) {
|
|
89
|
+
throw new Error(`Command '${name}' declares array arg ${keysOf(misplaced)} before its last arg; only the last arg may be an array`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Throws unless at most one arg, and no option, is marked with `orStdin`. */
|
|
93
|
+
export function checkStdinFields(name, args, options) {
|
|
94
|
+
const stdinArgs = argFields(args).filter((field) => field.stdin);
|
|
95
|
+
if (stdinArgs.length > 1) {
|
|
96
|
+
throw new Error(`Command '${name}' marks args ${keysOf(stdinArgs)} with orStdin; only one arg may read stdin`);
|
|
97
|
+
}
|
|
98
|
+
const stdinOptions = optionFields(options).filter((field) => field.stdin);
|
|
99
|
+
if (stdinOptions.length > 0) {
|
|
100
|
+
const noun = stdinOptions.length === 1 ? "option" : "options";
|
|
101
|
+
throw new Error(`Command '${name}' marks ${noun} ${keysOf(stdinOptions)} with orStdin; only an arg may read stdin`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
60
104
|
export function optionFields(schema) {
|
|
61
105
|
return fieldsOf(schema, optionField);
|
|
62
106
|
}
|
|
107
|
+
/** Throws when an option is an array of booleans, which a switch cannot express. */
|
|
108
|
+
export function checkNoBooleanArrayOption(name, options) {
|
|
109
|
+
const booleans = optionFields(options).filter((field) => field.variadic && field.type === "boolean");
|
|
110
|
+
if (booleans.length > 0) {
|
|
111
|
+
throw new Error(`Command '${name}' declares boolean array option ${keysOf(booleans)}; a switch cannot repeat, use a boolean`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
63
114
|
//# sourceMappingURL=input.js.map
|