@duyquangnvx/agent-cli 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/built-ins.d.ts +4 -0
  3. package/dist/built-ins.js +20 -0
  4. package/dist/built-ins.js.map +1 -0
  5. package/dist/confirm.d.ts +8 -0
  6. package/dist/confirm.js +22 -0
  7. package/dist/confirm.js.map +1 -0
  8. package/dist/define.d.ts +108 -0
  9. package/dist/define.js +8 -0
  10. package/dist/define.js.map +1 -0
  11. package/dist/doctor-rows.d.ts +3 -0
  12. package/dist/doctor-rows.js +115 -0
  13. package/dist/doctor-rows.js.map +1 -0
  14. package/dist/doctor.d.ts +3 -0
  15. package/dist/doctor.js +100 -0
  16. package/dist/doctor.js.map +1 -0
  17. package/dist/errors.d.ts +34 -0
  18. package/dist/errors.js +72 -0
  19. package/dist/errors.js.map +1 -0
  20. package/dist/execute.d.ts +12 -0
  21. package/dist/execute.js +18 -0
  22. package/dist/execute.js.map +1 -0
  23. package/dist/fields.d.ts +14 -0
  24. package/dist/fields.js +71 -0
  25. package/dist/fields.js.map +1 -0
  26. package/dist/flags.d.ts +12 -0
  27. package/dist/flags.js +22 -0
  28. package/dist/flags.js.map +1 -0
  29. package/dist/global-install.d.ts +11 -0
  30. package/dist/global-install.js +50 -0
  31. package/dist/global-install.js.map +1 -0
  32. package/dist/help-json.d.ts +4 -0
  33. package/dist/help-json.js +60 -0
  34. package/dist/help-json.js.map +1 -0
  35. package/dist/help.d.ts +6 -0
  36. package/dist/help.js +61 -0
  37. package/dist/help.js.map +1 -0
  38. package/dist/index.d.ts +11 -0
  39. package/dist/index.js +7 -0
  40. package/dist/index.js.map +1 -0
  41. package/dist/input.d.ts +22 -0
  42. package/dist/input.js +70 -0
  43. package/dist/input.js.map +1 -0
  44. package/dist/interrupts.d.ts +18 -0
  45. package/dist/interrupts.js +118 -0
  46. package/dist/interrupts.js.map +1 -0
  47. package/dist/invocation.d.ts +9 -0
  48. package/dist/invocation.js +37 -0
  49. package/dist/invocation.js.map +1 -0
  50. package/dist/npm.d.ts +24 -0
  51. package/dist/npm.js +181 -0
  52. package/dist/npm.js.map +1 -0
  53. package/dist/page.d.ts +26 -0
  54. package/dist/page.js +49 -0
  55. package/dist/page.js.map +1 -0
  56. package/dist/parse-input.d.ts +5 -0
  57. package/dist/parse-input.js +114 -0
  58. package/dist/parse-input.js.map +1 -0
  59. package/dist/run-cli.d.ts +20 -0
  60. package/dist/run-cli.js +211 -0
  61. package/dist/run-cli.js.map +1 -0
  62. package/dist/run-process.d.ts +2 -0
  63. package/dist/run-process.js +37 -0
  64. package/dist/run-process.js.map +1 -0
  65. package/dist/semver.d.ts +9 -0
  66. package/dist/semver.js +70 -0
  67. package/dist/semver.js.map +1 -0
  68. package/dist/skills.d.ts +11 -0
  69. package/dist/skills.js +58 -0
  70. package/dist/skills.js.map +1 -0
  71. package/dist/style.d.ts +13 -0
  72. package/dist/style.js +38 -0
  73. package/dist/style.js.map +1 -0
  74. package/dist/suggest.d.ts +2 -0
  75. package/dist/suggest.js +41 -0
  76. package/dist/suggest.js.map +1 -0
  77. package/dist/update.d.ts +3 -0
  78. package/dist/update.js +91 -0
  79. package/dist/update.js.map +1 -0
  80. package/dist/upgrade-notes.d.ts +9 -0
  81. package/dist/upgrade-notes.js +41 -0
  82. package/dist/upgrade-notes.js.map +1 -0
  83. package/dist/usage.d.ts +13 -0
  84. package/dist/usage.js +72 -0
  85. package/dist/usage.js.map +1 -0
  86. package/package.json +32 -3
  87. package/README.md +0 -3
@@ -0,0 +1,211 @@
1
+ import { Command as Commander } from "commander";
2
+ import { builtInCommands } from "./built-ins.js";
3
+ import { isCommand, } from "./define.js";
4
+ import { FailureWithData, formatRuntimeError, UsageError } from "./errors.js";
5
+ import { execute } from "./execute.js";
6
+ import { fieldsOption, projected, renderRows, rowFieldsOf, selectedFields } from "./fields.js";
7
+ import { JSON_FLAG, runtimeFlagsFor } from "./flags.js";
8
+ import { cliHelp, commandHelp, groupHelp } from "./help.js";
9
+ import { cliHelpJson, commandHelpJson, groupHelpJson } from "./help-json.js";
10
+ import { inputFields, registerInput } from "./input.js";
11
+ import { RunControl } from "./interrupts.js";
12
+ import { Page, pageFooter, printedPage } from "./page.js";
13
+ import { parseInput } from "./parse-input.js";
14
+ import { styleFor } from "./style.js";
15
+ import { commandLine, ParseStop, stopAt, usageErrorOf } from "./usage.js";
16
+ const RUNTIME_EXIT_CODE = 1;
17
+ const USAGE_EXIT_CODE = 2;
18
+ function withTrailingNewline(text) {
19
+ return text === "" || text.endsWith("\n") ? text : `${text}\n`;
20
+ }
21
+ function isJson(cmd) {
22
+ return cmd.optsWithGlobals().json === true;
23
+ }
24
+ function isDryRun(cmd) {
25
+ return cmd.opts().dryRun === true;
26
+ }
27
+ function confirmOf(cmd) {
28
+ return cmd.opts().confirm;
29
+ }
30
+ function printed(outcome, { json, invocation, style, fields }) {
31
+ if (!(outcome.value instanceof Page)) {
32
+ return json ? `${JSON.stringify(outcome.value)}\n` : withTrailingNewline(outcome.render(style));
33
+ }
34
+ const page = printedPage(outcome.value, invocation);
35
+ if (fields === undefined) {
36
+ return json
37
+ ? `${JSON.stringify(page)}\n`
38
+ : `${withTrailingNewline(outcome.render(style))}${pageFooter(page)}`;
39
+ }
40
+ const rows = projected(page.items, fields);
41
+ // The author's render may read any field, so selected rows are rendered by the Runtime.
42
+ return json
43
+ ? `${JSON.stringify({ ...page, items: rows })}\n`
44
+ : `${renderRows(rows, fields)}${pageFooter(page)}`;
45
+ }
46
+ function failure(error, format) {
47
+ return {
48
+ stdout: "",
49
+ stderr: formatRuntimeError(error, format),
50
+ exitCode: error instanceof UsageError ? USAGE_EXIT_CODE : RUNTIME_EXIT_CODE,
51
+ };
52
+ }
53
+ async function runCommand(sub, command, fields, { base, signal, style, invocation, errorFormat }) {
54
+ const json = isJson(sub);
55
+ let input;
56
+ let selected;
57
+ try {
58
+ input = parseInput(command, sub, fields, invocation);
59
+ const rowFields = rowFieldsOf(command);
60
+ selected =
61
+ rowFields === undefined
62
+ ? undefined
63
+ : selectedFields(sub.opts().fields, rowFields, commandLine(sub));
64
+ }
65
+ catch (error) {
66
+ return failure(error, { ...errorFormat, json });
67
+ }
68
+ const control = new RunControl(commandLine(sub), signal);
69
+ const ctx = {
70
+ ...base,
71
+ signal: control.signal,
72
+ deadline: (ms) => control.deadline(ms),
73
+ runToEnd: (work) => control.runToEnd(work),
74
+ };
75
+ try {
76
+ const outcome = await control.settle(execute(command, input, ctx, {
77
+ dryRun: isDryRun(sub),
78
+ confirmation: { invocation, commandLine: commandLine(sub), given: confirmOf(sub) },
79
+ }));
80
+ return {
81
+ stdout: printed(outcome, { json, invocation, style, fields: selected }),
82
+ stderr: "",
83
+ exitCode: 0,
84
+ };
85
+ }
86
+ catch (error) {
87
+ const reported = control.errorAfter(error);
88
+ const result = failure(reported, { ...errorFormat, json });
89
+ if (!(reported instanceof FailureWithData)) {
90
+ return result;
91
+ }
92
+ const outcome = {
93
+ value: reported.data,
94
+ render: (renderStyle) => command.render(reported.data, renderStyle),
95
+ };
96
+ return { ...result, stdout: printed(outcome, { json, invocation, style, fields: selected }) };
97
+ }
98
+ }
99
+ // Commander parses every option before it prints help, so `--json` counts on either side of `--help`.
100
+ function helpFor(cmd, text, json) {
101
+ cmd.configureHelp({ formatHelp: () => (isJson(cmd) ? json() : text()) });
102
+ }
103
+ function configureCommand(sub, command, setup, json = () => commandHelpJson(commandLine(sub), command)) {
104
+ const fields = inputFields(command);
105
+ const rowFields = rowFieldsOf(command);
106
+ const helpFields = rowFields === undefined
107
+ ? fields
108
+ : { ...fields, options: [...fields.options, fieldsOption(rowFields)] };
109
+ helpFor(sub, () => commandHelp(commandLine(sub), command, helpFields, setup.style), json);
110
+ registerInput(sub, helpFields.options);
111
+ // The root already carries --json, for every Command.
112
+ for (const flag of runtimeFlagsFor(command.effect).filter((flag) => flag !== JSON_FLAG)) {
113
+ sub.option(flag.usage, flag.description);
114
+ }
115
+ sub.action(async () => {
116
+ setup.finish(await runCommand(sub, command, fields, setup));
117
+ });
118
+ }
119
+ function addCommand(parent, command, setup) {
120
+ const sub = stopAt(parent.command(command.name).description(command.description));
121
+ configureCommand(sub, command, setup);
122
+ }
123
+ function addCommands(parent, commands, setup) {
124
+ for (const [key, node] of Object.entries(commands)) {
125
+ if (isCommand(node)) {
126
+ addCommand(parent, node, setup);
127
+ }
128
+ else {
129
+ const group = stopAt(parent.command(key));
130
+ helpFor(group, () => groupHelp(commandLine(group), node, setup.style), () => groupHelpJson(commandLine(group), node));
131
+ addCommands(group, node, setup);
132
+ }
133
+ }
134
+ }
135
+ function stopped(error, { commanderOut, invocation, errorFormat }) {
136
+ if (!(error instanceof ParseStop)) {
137
+ return failure(error, errorFormat);
138
+ }
139
+ if (error.reason.exitCode === 0) {
140
+ return { stdout: commanderOut, stderr: "", exitCode: 0 };
141
+ }
142
+ // A group called without a Command answers with its help, the same as its --help.
143
+ if (error.reason.code === "commander.help") {
144
+ return { stdout: error.command.helpInformation(), stderr: "", exitCode: 0 };
145
+ }
146
+ return failure(usageErrorOf(error, invocation), { ...errorFormat, json: isJson(error.command) });
147
+ }
148
+ function versionLine({ version, build }) {
149
+ if (build === undefined)
150
+ return version;
151
+ return `${version} (${build.sha}${build.dirty ? "+dirty" : ""})`;
152
+ }
153
+ export async function runCli(cli, argv, options) {
154
+ const progress = [];
155
+ const result = await runWithProgress(cli, argv, options, (line) => progress.push(line));
156
+ return { ...result, stderr: progress.join("") + result.stderr };
157
+ }
158
+ // Progress is written as it happens: an Agent harness kills a process that stays silent too long.
159
+ export async function runWithProgress(cli, argv, options, writeProgress) {
160
+ const style = styleFor(options.env, options.stdoutIsTTY === true);
161
+ const errorFormat = { cliName: cli.name, json: false, env: options.env, style };
162
+ const commanderOut = [];
163
+ // Settings must be on the root before .command(): children copy them at creation.
164
+ const root = stopAt(new Commander(cli.name))
165
+ .configureOutput({
166
+ writeOut: (text) => commanderOut.push(text),
167
+ // Commander writes here only the help for a group called without a Command, answered below.
168
+ writeErr: () => { },
169
+ outputError: () => { },
170
+ // The Runtime decides colour itself, so commander must not strip it by reading `process`.
171
+ stripColor: (text) => text,
172
+ })
173
+ .helpCommand(false)
174
+ .version(versionLine(cli), "--version")
175
+ .option(JSON_FLAG.usage, JSON_FLAG.description);
176
+ const invocation = { cliName: cli.name, argv };
177
+ let commandResult;
178
+ const setup = {
179
+ base: {
180
+ cwd: options.cwd,
181
+ env: options.env,
182
+ progress: (message) => writeProgress(`${message}\n`),
183
+ },
184
+ signal: options.signal,
185
+ style,
186
+ invocation,
187
+ errorFormat,
188
+ finish: (result) => {
189
+ commandResult = result;
190
+ },
191
+ };
192
+ if (cli.commands === undefined) {
193
+ configureCommand(root, cli.command, setup, () => cliHelpJson(cli.name, cli.version, cli.command));
194
+ }
195
+ else {
196
+ const commands = { ...cli.commands, ...builtInCommands(cli, options.bin) };
197
+ helpFor(root, () => cliHelp(cli.name, cli.version, commands, style), () => cliHelpJson(cli.name, cli.version, commands));
198
+ addCommands(root, commands, setup);
199
+ }
200
+ try {
201
+ await root.parseAsync([...argv], { from: "user" });
202
+ }
203
+ catch (error) {
204
+ return stopped(error, { commanderOut: commanderOut.join(""), invocation, errorFormat });
205
+ }
206
+ if (commandResult === undefined) {
207
+ throw new Error("commander finished parsing without running a Command");
208
+ }
209
+ return commandResult;
210
+ }
211
+ //# sourceMappingURL=run-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-cli.js","sourceRoot":"","sources":["../src/run-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Cli } from "./define.js";
2
+ export declare function runProcess(cli: Cli): Promise<void>;
@@ -0,0 +1,37 @@
1
+ import { runWithProgress } from "./run-cli.js";
2
+ const SIGNAL_EXIT_CODES = { SIGINT: 130, SIGTERM: 143 };
3
+ function written(stream, text) {
4
+ return new Promise((resolve) => stream.write(text, () => resolve()));
5
+ }
6
+ export async function runProcess(cli) {
7
+ const stop = new AbortController();
8
+ // A second signal quits at once, accepting lost output, so a stuck Command never traps a person.
9
+ const onSignal = (signal) => {
10
+ if (stop.signal.aborted) {
11
+ process.exit(SIGNAL_EXIT_CODES[signal]);
12
+ }
13
+ process.stderr.write("\nstopping… (Ctrl-C again to quit now)\n");
14
+ stop.abort();
15
+ };
16
+ process.on("SIGINT", onSignal);
17
+ process.on("SIGTERM", onSignal);
18
+ try {
19
+ const result = await runWithProgress(cli, process.argv.slice(2), {
20
+ env: process.env,
21
+ cwd: process.cwd(),
22
+ stdoutIsTTY: process.stdout.isTTY === true,
23
+ signal: stop.signal,
24
+ bin: process.argv[1],
25
+ }, (line) => process.stderr.write(line));
26
+ await written(process.stdout, result.stdout);
27
+ await written(process.stderr, result.stderr);
28
+ process.exitCode = result.exitCode;
29
+ }
30
+ finally {
31
+ process.off("SIGINT", onSignal);
32
+ process.off("SIGTERM", onSignal);
33
+ }
34
+ // A Command may leave a timer or socket holding the event loop open; its output is written by now.
35
+ process.exit();
36
+ }
37
+ //# sourceMappingURL=run-process.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-process.js","sourceRoot":"","sources":["../src/run-process.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,MAAM,iBAAiB,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAW,CAAC;AAIjE,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,EAAE,CAAC;IACf,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,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CACrC,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,9 @@
1
+ export declare function isVersion(text: string): boolean;
2
+ /** Negative when `a` is older than `b`, positive when newer, 0 when the same release. */
3
+ export declare function compareVersions(a: string, b: string): number;
4
+ export type Standing = "behind" | "current" | "ahead";
5
+ /** Where `version` stands against `latest`. */
6
+ export declare function standingOf(version: string, latest: string): Standing;
7
+ /** The minimum an `engines.node` range asks for, or undefined when it is not `>=X[.Y[.Z]]`. */
8
+ export declare function engineMinimum(range: string): readonly number[] | undefined;
9
+ export declare function meetsMinimum(version: string, minimum: readonly number[]): boolean;
package/dist/semver.js ADDED
@@ -0,0 +1,70 @@
1
+ const VERSION = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/;
2
+ const ENGINE = /^>=\s*(\d+)(?:\.(\d+))?(?:\.(\d+))?$/;
3
+ export function isVersion(text) {
4
+ return VERSION.test(text);
5
+ }
6
+ // Numeric identifiers compare as numbers and rank below alphanumeric ones.
7
+ function compareIdentifiers(x, y) {
8
+ const xNumeric = /^\d+$/.test(x);
9
+ const yNumeric = /^\d+$/.test(y);
10
+ if (xNumeric && yNumeric)
11
+ return Number(x) - Number(y);
12
+ if (xNumeric !== yNumeric)
13
+ return xNumeric ? -1 : 1;
14
+ if (x === y)
15
+ return 0;
16
+ return x < y ? -1 : 1;
17
+ }
18
+ function comparePrerelease(a, b) {
19
+ if (a === b)
20
+ return 0;
21
+ // A release outranks its prereleases: 1.0.0 > 1.0.0-rc.1.
22
+ if (a === undefined)
23
+ return 1;
24
+ if (b === undefined)
25
+ return -1;
26
+ const left = a.split(".");
27
+ const right = b.split(".");
28
+ for (let i = 0; i < Math.min(left.length, right.length); i += 1) {
29
+ const difference = compareIdentifiers(left[i] ?? "", right[i] ?? "");
30
+ if (difference !== 0)
31
+ return difference;
32
+ }
33
+ return left.length - right.length;
34
+ }
35
+ /** Negative when `a` is older than `b`, positive when newer, 0 when the same release. */
36
+ export function compareVersions(a, b) {
37
+ const left = VERSION.exec(a);
38
+ const right = VERSION.exec(b);
39
+ if (left === null || right === null) {
40
+ throw new Error(`cannot compare ${a} with ${b}: both must be X.Y.Z versions`);
41
+ }
42
+ for (const part of [1, 2, 3]) {
43
+ const difference = Number(left[part]) - Number(right[part]);
44
+ if (difference !== 0)
45
+ return difference;
46
+ }
47
+ return comparePrerelease(left[4], right[4]);
48
+ }
49
+ /** Where `version` stands against `latest`. */
50
+ export function standingOf(version, latest) {
51
+ const difference = compareVersions(version, latest);
52
+ if (difference < 0)
53
+ return "behind";
54
+ return difference > 0 ? "ahead" : "current";
55
+ }
56
+ /** The minimum an `engines.node` range asks for, or undefined when it is not `>=X[.Y[.Z]]`. */
57
+ export function engineMinimum(range) {
58
+ const match = ENGINE.exec(range.trim());
59
+ return match === null ? undefined : match.slice(1).map((part) => Number(part ?? 0));
60
+ }
61
+ export function meetsMinimum(version, minimum) {
62
+ const parts = version.split(".").map(Number);
63
+ for (const [i, wanted] of minimum.entries()) {
64
+ const found = parts[i] ?? 0;
65
+ if (found !== wanted)
66
+ return found > wanted;
67
+ }
68
+ return true;
69
+ }
70
+ //# sourceMappingURL=semver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.js","sourceRoot":"","sources":["../src/semver.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAG,kEAAkE,CAAC;AACnF,MAAM,MAAM,GAAG,sCAAsC,CAAC;AAEtD,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,2EAA2E;AAC3E,SAAS,kBAAkB,CAAC,CAAS,EAAE,CAAS;IAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,QAAQ,IAAI,QAAQ;QAAE,OAAO,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,iBAAiB,CAAC,CAAqB,EAAE,CAAqB;IACrE,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACtB,0DAA0D;IAC1D,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAChE,MAAM,UAAU,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACrE,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;AACpC,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;IAChF,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5D,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC;IAC1C,CAAC;IACD,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9C,CAAC;AAID,+CAA+C;AAC/C,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,MAAc;IACxD,MAAM,UAAU,GAAG,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACpD,IAAI,UAAU,GAAG,CAAC;QAAE,OAAO,QAAQ,CAAC;IACpC,OAAO,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC9C,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACxC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,OAA0B;IACtE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7C,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,KAAK,KAAK,MAAM;YAAE,OAAO,KAAK,GAAG,MAAM,CAAC;IAC9C,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Env } from "./define.js";
2
+ import { type Standing } from "./semver.js";
3
+ export declare function skillUpdateCommand(cliName: string): string;
4
+ export type SkillState = Standing | "unversioned" | "unreadable";
5
+ export interface SkillCopy {
6
+ readonly path: string;
7
+ readonly version: string | undefined;
8
+ readonly state: SkillState;
9
+ }
10
+ /** Every installed copy of the skill named after the CLI, in the project first, then under home. */
11
+ export declare function skillCopies(skillName: string, cliVersion: string, cwd: string, env: Env): Promise<SkillCopy[]>;
package/dist/skills.js ADDED
@@ -0,0 +1,58 @@
1
+ import { readFile, realpath } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { isMissingFile } from "./errors.js";
5
+ import { isVersion, standingOf } from "./semver.js";
6
+ /** Where the skills CLI (`npx skills add`) puts a skill, under a project and under home. */
7
+ const SKILL_DIRS = [
8
+ [".claude", "skills"],
9
+ [".agents", "skills"],
10
+ ];
11
+ export function skillUpdateCommand(cliName) {
12
+ return `npx -y skills update ${cliName}`;
13
+ }
14
+ const FRONTMATTER = /^---\r?\n([\s\S]*?)\r?\n---/;
15
+ const METADATA_VERSION = /^metadata:[ \t]*\r?\n(?:[ \t]+.*\r?\n)*?[ \t]+version:[ \t]*["']?([^"'\s]+)["']?[ \t]*$/m;
16
+ /** The version a SKILL.md's frontmatter `metadata.version` states. */
17
+ function skillVersionIn(skill) {
18
+ const frontmatter = FRONTMATTER.exec(skill)?.[1];
19
+ return frontmatter === undefined ? undefined : METADATA_VERSION.exec(`${frontmatter}\n`)?.[1];
20
+ }
21
+ function homeOf(env) {
22
+ return env.HOME ?? env.USERPROFILE ?? homedir();
23
+ }
24
+ async function copyAt(path, cliVersion) {
25
+ let skill;
26
+ try {
27
+ skill = await readFile(join(path, "SKILL.md"), "utf8");
28
+ }
29
+ catch (error) {
30
+ if (isMissingFile(error)) {
31
+ return undefined;
32
+ }
33
+ return { path, version: undefined, state: "unreadable" };
34
+ }
35
+ const version = skillVersionIn(skill);
36
+ if (version === undefined || !isVersion(version) || !isVersion(cliVersion)) {
37
+ return { path, version, state: "unversioned" };
38
+ }
39
+ return { path, version, state: standingOf(version, cliVersion) };
40
+ }
41
+ /** Every installed copy of the skill named after the CLI, in the project first, then under home. */
42
+ export async function skillCopies(skillName, cliVersion, cwd, env) {
43
+ const roots = [cwd, homeOf(env)];
44
+ const paths = roots.flatMap((root) => SKILL_DIRS.map((dir) => join(root, ...dir, skillName)));
45
+ const seen = new Set();
46
+ const copies = [];
47
+ for (const path of paths) {
48
+ const copy = await copyAt(path, cliVersion);
49
+ // The project may be home itself, or one skill dir a link to the other.
50
+ const real = copy === undefined ? undefined : await realpath(path);
51
+ if (copy !== undefined && real !== undefined && !seen.has(real)) {
52
+ seen.add(real);
53
+ copies.push(copy);
54
+ }
55
+ }
56
+ return copies;
57
+ }
58
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../src/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { Env } from "./define.js";
2
+ type Paint = (text: string) => string;
3
+ /** Colours text when colour is on; every method returns the text unchanged when it is off. */
4
+ export interface Style {
5
+ readonly bold: Paint;
6
+ readonly dim: Paint;
7
+ readonly red: Paint;
8
+ readonly green: Paint;
9
+ readonly yellow: Paint;
10
+ readonly cyan: Paint;
11
+ }
12
+ export declare function styleFor(env: Env, stdoutIsTTY: boolean): Style;
13
+ export {};
package/dist/style.js ADDED
@@ -0,0 +1,38 @@
1
+ // Some Agent harnesses run commands in a PTY, so a TTY alone doesn't mean a person is watching.
2
+ const AGENT_VARIABLES = [
3
+ "CLAUDECODE",
4
+ "CODEX_CI",
5
+ "CODEX_SANDBOX",
6
+ "GEMINI_CLI",
7
+ "CURSOR_AGENT",
8
+ "CI",
9
+ ];
10
+ function colourEnabled(env, stdoutIsTTY) {
11
+ const noColor = env.NO_COLOR !== undefined && env.NO_COLOR !== "";
12
+ const agent = AGENT_VARIABLES.some((name) => env[name] !== undefined);
13
+ return stdoutIsTTY && !noColor && !agent;
14
+ }
15
+ function sgr(open, close) {
16
+ return (text) => `\u001b[${open}m${text}\u001b[${close}m`;
17
+ }
18
+ const COLOURED = {
19
+ bold: sgr(1, 22),
20
+ dim: sgr(2, 22),
21
+ red: sgr(31, 39),
22
+ green: sgr(32, 39),
23
+ yellow: sgr(33, 39),
24
+ cyan: sgr(36, 39),
25
+ };
26
+ const plain = (text) => text;
27
+ const PLAIN = {
28
+ bold: plain,
29
+ dim: plain,
30
+ red: plain,
31
+ green: plain,
32
+ yellow: plain,
33
+ cyan: plain,
34
+ };
35
+ export function styleFor(env, stdoutIsTTY) {
36
+ return colourEnabled(env, stdoutIsTTY) ? COLOURED : PLAIN;
37
+ }
38
+ //# sourceMappingURL=style.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"AAcA,gGAAgG;AAChG,MAAM,eAAe,GAAG;IACtB,YAAY;IACZ,UAAU;IACV,eAAe;IACf,YAAY;IACZ,cAAc;IACd,IAAI;CACI,CAAC;AAEX,SAAS,aAAa,CAAC,GAAQ,EAAE,WAAoB;IACnD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAC;IAClE,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC;IACtE,OAAO,WAAW,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC;AAC3C,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"}
@@ -0,0 +1,2 @@
1
+ /** The one long flag closest to `flag`, or none when nothing is close or several tie. */
2
+ export declare function closestFlag(flag: string, flags: readonly string[]): string | undefined;
@@ -0,0 +1,41 @@
1
+ const MAX_DISTANCE = 3;
2
+ const MIN_SIMILARITY = 0.4;
3
+ // Optimal string alignment distance, the measure commander uses for its own suggestions.
4
+ function distance(a, b) {
5
+ const width = b.length + 1;
6
+ const d = Array.from({ length: (a.length + 1) * width }, (_, k) => {
7
+ const i = Math.floor(k / width);
8
+ const j = k % width;
9
+ // The first row and column count the edits from an empty string.
10
+ return i === 0 || j === 0 ? i + j : 0;
11
+ });
12
+ const at = (i, j) => d[i * width + j] ?? 0;
13
+ for (let i = 1; i <= a.length; i++) {
14
+ for (let j = 1; j <= b.length; j++) {
15
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
16
+ const edit = Math.min(at(i - 1, j) + 1, at(i, j - 1) + 1, at(i - 1, j - 1) + cost);
17
+ const transposed = i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1];
18
+ d[i * width + j] = transposed ? Math.min(edit, at(i - 2, j - 2) + 1) : edit;
19
+ }
20
+ }
21
+ return at(a.length, b.length);
22
+ }
23
+ function isClose(word, candidate) {
24
+ const length = Math.max(word.length, candidate.length);
25
+ const edits = distance(word, candidate);
26
+ return candidate.length > 1 && edits < MAX_DISTANCE && (length - edits) / length > MIN_SIMILARITY;
27
+ }
28
+ /** The one long flag closest to `flag`, or none when nothing is close or several tie. */
29
+ export function closestFlag(flag, flags) {
30
+ if (!flag.startsWith("--")) {
31
+ return undefined;
32
+ }
33
+ const word = flag.slice(2);
34
+ const close = [...new Set(flags)]
35
+ .map((candidate) => candidate.slice(2))
36
+ .filter((candidate) => isClose(word, candidate));
37
+ const best = Math.min(...close.map((candidate) => distance(word, candidate)));
38
+ const closest = close.filter((candidate) => distance(word, candidate) === best);
39
+ return closest.length === 1 ? `--${closest[0]}` : undefined;
40
+ }
41
+ //# sourceMappingURL=suggest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../src/suggest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type Command, type CommandTreeCli, type GlobalInstall } from "./define.js";
2
+ /** The built-in `update`, for a CLI installed globally with npm. */
3
+ export declare function updateCommand(cli: CommandTreeCli, install: GlobalInstall, bin: string | undefined): Command;