@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.
- package/CHANGELOG.md +22 -0
- package/dist/built-ins.d.ts +4 -0
- package/dist/built-ins.js +20 -0
- package/dist/built-ins.js.map +1 -0
- package/dist/confirm.d.ts +8 -0
- package/dist/confirm.js +22 -0
- package/dist/confirm.js.map +1 -0
- package/dist/define.d.ts +108 -0
- package/dist/define.js +8 -0
- package/dist/define.js.map +1 -0
- package/dist/doctor-rows.d.ts +3 -0
- package/dist/doctor-rows.js +115 -0
- package/dist/doctor-rows.js.map +1 -0
- package/dist/doctor.d.ts +3 -0
- package/dist/doctor.js +100 -0
- package/dist/doctor.js.map +1 -0
- package/dist/errors.d.ts +34 -0
- package/dist/errors.js +72 -0
- package/dist/errors.js.map +1 -0
- package/dist/execute.d.ts +12 -0
- package/dist/execute.js +18 -0
- package/dist/execute.js.map +1 -0
- package/dist/fields.d.ts +14 -0
- package/dist/fields.js +71 -0
- package/dist/fields.js.map +1 -0
- package/dist/flags.d.ts +12 -0
- package/dist/flags.js +22 -0
- package/dist/flags.js.map +1 -0
- package/dist/global-install.d.ts +11 -0
- package/dist/global-install.js +50 -0
- package/dist/global-install.js.map +1 -0
- package/dist/help-json.d.ts +4 -0
- package/dist/help-json.js +60 -0
- package/dist/help-json.js.map +1 -0
- package/dist/help.d.ts +6 -0
- package/dist/help.js +61 -0
- package/dist/help.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/input.d.ts +22 -0
- package/dist/input.js +70 -0
- package/dist/input.js.map +1 -0
- package/dist/interrupts.d.ts +18 -0
- package/dist/interrupts.js +118 -0
- package/dist/interrupts.js.map +1 -0
- package/dist/invocation.d.ts +9 -0
- package/dist/invocation.js +37 -0
- package/dist/invocation.js.map +1 -0
- package/dist/npm.d.ts +24 -0
- package/dist/npm.js +181 -0
- package/dist/npm.js.map +1 -0
- package/dist/page.d.ts +26 -0
- package/dist/page.js +49 -0
- package/dist/page.js.map +1 -0
- package/dist/parse-input.d.ts +5 -0
- package/dist/parse-input.js +114 -0
- package/dist/parse-input.js.map +1 -0
- package/dist/run-cli.d.ts +20 -0
- package/dist/run-cli.js +211 -0
- package/dist/run-cli.js.map +1 -0
- package/dist/run-process.d.ts +2 -0
- package/dist/run-process.js +37 -0
- package/dist/run-process.js.map +1 -0
- package/dist/semver.d.ts +9 -0
- package/dist/semver.js +70 -0
- package/dist/semver.js.map +1 -0
- package/dist/skills.d.ts +11 -0
- package/dist/skills.js +58 -0
- package/dist/skills.js.map +1 -0
- package/dist/style.d.ts +13 -0
- package/dist/style.js +38 -0
- package/dist/style.js.map +1 -0
- package/dist/suggest.d.ts +2 -0
- package/dist/suggest.js +41 -0
- package/dist/suggest.js.map +1 -0
- package/dist/update.d.ts +3 -0
- package/dist/update.js +91 -0
- package/dist/update.js.map +1 -0
- package/dist/upgrade-notes.d.ts +9 -0
- package/dist/upgrade-notes.js +41 -0
- package/dist/upgrade-notes.js.map +1 -0
- package/dist/usage.d.ts +13 -0
- package/dist/usage.js +72 -0
- package/dist/usage.js.map +1 -0
- package/package.json +32 -3
- package/README.md +0 -3
package/dist/update.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import { defineCommand } from "./define.js";
|
|
3
|
+
import { FailureWithData } from "./errors.js";
|
|
4
|
+
import { globalInstallOf } from "./global-install.js";
|
|
5
|
+
import { INTERRUPTED } from "./interrupts.js";
|
|
6
|
+
import { installGlobally, latestVersion, npmContext } from "./npm.js";
|
|
7
|
+
import { standingOf } from "./semver.js";
|
|
8
|
+
import { skillUpdateCommand } from "./skills.js";
|
|
9
|
+
import { upgradeNotes } from "./upgrade-notes.js";
|
|
10
|
+
const updateSchema = z.object({
|
|
11
|
+
from: z.string(),
|
|
12
|
+
latest: z.string(),
|
|
13
|
+
installed: z.object({ version: z.string(), prefix: z.string() }).nullable(),
|
|
14
|
+
upgrades: z.array(z.object({ version: z.string(), notes: z.string() })),
|
|
15
|
+
next: z.array(z.string()),
|
|
16
|
+
});
|
|
17
|
+
function nothingToInstall({ from, latest }) {
|
|
18
|
+
return standingOf(from, latest) === "current"
|
|
19
|
+
? `already on ${from}, the latest release: nothing to install`
|
|
20
|
+
: `${from} is newer than the latest release ${latest}: nothing to install`;
|
|
21
|
+
}
|
|
22
|
+
function renderUpdate(cli, install, update) {
|
|
23
|
+
const { installed } = update;
|
|
24
|
+
if (installed === null) {
|
|
25
|
+
return nothingToInstall(update);
|
|
26
|
+
}
|
|
27
|
+
return [
|
|
28
|
+
`installed ${install.package}@${installed.version} with the npm under ${installed.prefix}, replacing ${update.from}`,
|
|
29
|
+
...update.upgrades.map(({ version, notes }) => `\nchanges in ${version}:\n${notes}`),
|
|
30
|
+
"",
|
|
31
|
+
...update.next.map((command) => `next: ${command}, so the ${cli.name} skill describes ${installed.version}`),
|
|
32
|
+
].join("\n");
|
|
33
|
+
}
|
|
34
|
+
// The install ran to its end, so the run reports it rather than asking for a rerun.
|
|
35
|
+
function interruptedAfterInstall(plan, update) {
|
|
36
|
+
return new FailureWithData({
|
|
37
|
+
code: INTERRUPTED,
|
|
38
|
+
message: `interrupted, but ${plan.package}@${plan.latest} had already been installed with the npm under ${plan.prefix}, replacing ${plan.from}`,
|
|
39
|
+
hint: "nothing to run again: run the commands under next",
|
|
40
|
+
retryable: false,
|
|
41
|
+
}, update);
|
|
42
|
+
}
|
|
43
|
+
/** The built-in `update`, for a CLI installed globally with npm. */
|
|
44
|
+
export function updateCommand(cli, install, bin) {
|
|
45
|
+
return defineCommand({
|
|
46
|
+
name: "update",
|
|
47
|
+
description: "install the latest version of this CLI from its registry",
|
|
48
|
+
examples: [
|
|
49
|
+
{ command: `${cli.name} update`, note: "install the latest version and show what changed" },
|
|
50
|
+
{ command: `${cli.name} update --dry-run`, note: "show the version it would install" },
|
|
51
|
+
],
|
|
52
|
+
effect: "write",
|
|
53
|
+
output: updateSchema,
|
|
54
|
+
plan: async (_input, ctx) => {
|
|
55
|
+
const npm = npmContext(cli, install, ctx);
|
|
56
|
+
const copy = await globalInstallOf(bin, npm);
|
|
57
|
+
return {
|
|
58
|
+
package: install.package,
|
|
59
|
+
from: cli.version,
|
|
60
|
+
latest: await latestVersion(npm),
|
|
61
|
+
prefix: copy.prefix,
|
|
62
|
+
packageDir: copy.packageDir,
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
apply: async (plan, ctx) => {
|
|
66
|
+
const { from, latest, prefix } = plan;
|
|
67
|
+
if (standingOf(from, latest) !== "behind") {
|
|
68
|
+
return { from, latest, installed: null, upgrades: [], next: [] };
|
|
69
|
+
}
|
|
70
|
+
ctx.signal.throwIfAborted();
|
|
71
|
+
ctx.progress(`installing ${plan.package}@${latest} with the npm under ${prefix}…`);
|
|
72
|
+
await ctx.runToEnd(() => installGlobally(latest, npmContext(cli, install, ctx)));
|
|
73
|
+
const update = {
|
|
74
|
+
from,
|
|
75
|
+
latest,
|
|
76
|
+
installed: { version: latest, prefix },
|
|
77
|
+
upgrades: await upgradeNotes(plan.packageDir, from, latest),
|
|
78
|
+
next: [skillUpdateCommand(cli.name)],
|
|
79
|
+
};
|
|
80
|
+
if (ctx.signal.aborted) {
|
|
81
|
+
throw interruptedAfterInstall(plan, update);
|
|
82
|
+
}
|
|
83
|
+
return update;
|
|
84
|
+
},
|
|
85
|
+
render: (update) => renderUpdate(cli, install, update),
|
|
86
|
+
renderPlan: (plan) => standingOf(plan.from, plan.latest) === "behind"
|
|
87
|
+
? `would install ${plan.package}@${plan.latest} with the npm under ${plan.prefix}, replacing ${plan.from}`
|
|
88
|
+
: nothingToInstall(plan),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface UpgradeNotes {
|
|
2
|
+
readonly version: string;
|
|
3
|
+
readonly notes: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* What changed in each release after `from` up to `to`, oldest first, from the CHANGELOG.md in
|
|
7
|
+
* `packageDir`; none when the package ships no CHANGELOG.
|
|
8
|
+
*/
|
|
9
|
+
export declare function upgradeNotes(packageDir: string, from: string, to: string): Promise<UpgradeNotes[]>;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { isMissingFile } from "./errors.js";
|
|
4
|
+
import { compareVersions, isVersion } from "./semver.js";
|
|
5
|
+
const RELEASE_HEADING = /^## v?(\S+)/;
|
|
6
|
+
function releasesIn(changelog) {
|
|
7
|
+
const releases = [];
|
|
8
|
+
let current;
|
|
9
|
+
for (const line of changelog.split(/\r?\n/)) {
|
|
10
|
+
const heading = RELEASE_HEADING.exec(line);
|
|
11
|
+
if (heading !== null) {
|
|
12
|
+
const version = heading[1] ?? "";
|
|
13
|
+
current = isVersion(version) ? { version, lines: [] } : undefined;
|
|
14
|
+
if (current !== undefined)
|
|
15
|
+
releases.push(current);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
current?.lines.push(line);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return releases.map(({ version, lines }) => ({ version, notes: lines.join("\n").trim() }));
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* What changed in each release after `from` up to `to`, oldest first, from the CHANGELOG.md in
|
|
25
|
+
* `packageDir`; none when the package ships no CHANGELOG.
|
|
26
|
+
*/
|
|
27
|
+
export async function upgradeNotes(packageDir, from, to) {
|
|
28
|
+
let changelog;
|
|
29
|
+
try {
|
|
30
|
+
changelog = await readFile(join(packageDir, "CHANGELOG.md"), "utf8");
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (isMissingFile(error))
|
|
34
|
+
return [];
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
return releasesIn(changelog)
|
|
38
|
+
.filter(({ version }) => compareVersions(version, from) > 0 && compareVersions(version, to) <= 0)
|
|
39
|
+
.sort((a, b) => compareVersions(a.version, b.version));
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=upgrade-notes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upgrade-notes.js","sourceRoot":"","sources":["../src/upgrade-notes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAOzD,MAAM,eAAe,GAAG,aAAa,CAAC;AAEtC,SAAS,UAAU,CAAC,SAAiB;IACnC,MAAM,QAAQ,GAA2C,EAAE,CAAC;IAC5D,IAAI,OAAyD,CAAC;IAC9D,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAClE,IAAI,OAAO,KAAK,SAAS;gBAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;AAC7F,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,UAAkB,EAClB,IAAY,EACZ,EAAU;IAEV,IAAI,SAAiB,CAAC;IACtB,IAAI,CAAC;QACH,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;IACvE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,aAAa,CAAC,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,UAAU,CAAC,SAAS,CAAC;SACzB,MAAM,CACL,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,eAAe,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,CACzF;SACA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAC3D,CAAC"}
|
package/dist/usage.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Command as Commander, CommanderError } from "commander";
|
|
2
|
+
import { UsageError } from "./errors.js";
|
|
3
|
+
import { type Invocation } from "./invocation.js";
|
|
4
|
+
export declare function commandLine(cmd: Commander): string;
|
|
5
|
+
/** Commander stopped parsing at `command`: help, version or a usage error. */
|
|
6
|
+
export declare class ParseStop extends Error {
|
|
7
|
+
readonly reason: CommanderError;
|
|
8
|
+
readonly command: Commander;
|
|
9
|
+
constructor(reason: CommanderError, command: Commander);
|
|
10
|
+
}
|
|
11
|
+
export declare function stopAt(cmd: Commander): Commander;
|
|
12
|
+
export declare function unknownOptionError(line: string, invocation: Invocation, flag: string, suggestions: readonly string[]): UsageError;
|
|
13
|
+
export declare function usageErrorOf({ reason, command }: ParseStop, invocation: Invocation): UsageError;
|
package/dist/usage.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { UsageError } from "./errors.js";
|
|
2
|
+
import { commandLineRenaming } from "./invocation.js";
|
|
3
|
+
export function commandLine(cmd) {
|
|
4
|
+
return cmd.parent === null ? cmd.name() : `${commandLine(cmd.parent)} ${cmd.name()}`;
|
|
5
|
+
}
|
|
6
|
+
/** Commander stopped parsing at `command`: help, version or a usage error. */
|
|
7
|
+
export class ParseStop extends Error {
|
|
8
|
+
reason;
|
|
9
|
+
command;
|
|
10
|
+
constructor(reason, command) {
|
|
11
|
+
super(reason.message);
|
|
12
|
+
this.name = "ParseStop";
|
|
13
|
+
this.reason = reason;
|
|
14
|
+
this.command = command;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// Commander's error carries no reference to the command that raised it, so each command throws
|
|
18
|
+
// its own ParseStop. Must be called after `.command()` creates `cmd`, which copies the parent's.
|
|
19
|
+
export function stopAt(cmd) {
|
|
20
|
+
return cmd.exitOverride((reason) => {
|
|
21
|
+
throw new ParseStop(reason, cmd);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function problemOf(reason) {
|
|
25
|
+
return (reason.message.split("\n")[0] ?? "").replace(/^error: /, "");
|
|
26
|
+
}
|
|
27
|
+
// Commander appends "(Did you mean X?)" or "(Did you mean one of X, Y?)" to unknown names.
|
|
28
|
+
function suggestionsOf(reason) {
|
|
29
|
+
const match = /\(Did you mean (?:one of )?(.+)\?\)/.exec(reason.message);
|
|
30
|
+
return match?.[1] === undefined ? [] : match[1].split(", ");
|
|
31
|
+
}
|
|
32
|
+
function unknownError({ code, problem, line, corrections, listed }) {
|
|
33
|
+
return new UsageError({
|
|
34
|
+
code,
|
|
35
|
+
message: `${problem} for \`${line}\``,
|
|
36
|
+
hint: corrections.length === 0
|
|
37
|
+
? `run \`${line} --help\` to see the ${listed}`
|
|
38
|
+
: `did you mean ${corrections.map((correction) => `\`${correction}\``).join(" or ")}?`,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
export function unknownOptionError(line, invocation, flag, suggestions) {
|
|
42
|
+
return unknownError({
|
|
43
|
+
code: "UNKNOWN_OPTION",
|
|
44
|
+
problem: `unknown option '${flag}'`,
|
|
45
|
+
line,
|
|
46
|
+
corrections: suggestions.map((name) => commandLineRenaming(invocation, new Map([[flag, name]]))),
|
|
47
|
+
listed: "options",
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
export function usageErrorOf({ reason, command }, invocation) {
|
|
51
|
+
const line = commandLine(command);
|
|
52
|
+
const suggestions = suggestionsOf(reason);
|
|
53
|
+
switch (reason.code) {
|
|
54
|
+
case "commander.unknownCommand":
|
|
55
|
+
return unknownError({
|
|
56
|
+
code: "UNKNOWN_COMMAND",
|
|
57
|
+
problem: problemOf(reason),
|
|
58
|
+
line,
|
|
59
|
+
corrections: suggestions.map((name) => `${line} ${name}`),
|
|
60
|
+
listed: "commands",
|
|
61
|
+
});
|
|
62
|
+
case "commander.unknownOption":
|
|
63
|
+
return unknownOptionError(line, invocation, /'(.+)'/.exec(problemOf(reason))?.[1] ?? "", suggestions);
|
|
64
|
+
default:
|
|
65
|
+
return new UsageError({
|
|
66
|
+
code: "INVALID_INPUT",
|
|
67
|
+
message: problemOf(reason),
|
|
68
|
+
hint: `run \`${line} --help\` to see the expected input`,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../src/usage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@duyquangnvx/agent-cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Runtime for agent-first command-line tools: owns parsing, output, errors and exit codes.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"engines": {
|
|
7
|
+
"node": ">=22.12.0"
|
|
8
|
+
},
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"CHANGELOG.md"
|
|
18
|
+
],
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"commander": "15.0.0"
|
|
21
|
+
},
|
|
22
|
+
"peerDependencies": {
|
|
23
|
+
"zod": "^4.6.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"zod": "4.6.7"
|
|
27
|
+
},
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"registry": "https://registry.npmjs.org/",
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsc -p tsconfig.build.json"
|
|
34
|
+
}
|
|
6
35
|
}
|
package/README.md
DELETED