@duyquangnvx/agent-cli 0.13.0 → 0.14.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 +23 -0
- package/dist/agent-cli.js +6 -1
- package/dist/agent-cli.js.map +1 -1
- package/dist/built-ins/commands.d.ts +4 -1
- package/dist/built-ins/commands.js +8 -1
- package/dist/built-ins/commands.js.map +1 -1
- package/dist/built-ins/dependency-install.d.ts +5 -0
- package/dist/built-ins/dependency-install.js +49 -18
- package/dist/built-ins/dependency-install.js.map +1 -1
- package/dist/built-ins/doctor-rows.js +13 -2
- package/dist/built-ins/doctor-rows.js.map +1 -1
- package/dist/built-ins/doctor.js +13 -5
- package/dist/built-ins/doctor.js.map +1 -1
- package/dist/built-ins/npm.d.ts +4 -2
- package/dist/built-ins/npm.js +16 -7
- package/dist/built-ins/npm.js.map +1 -1
- package/dist/built-ins/packaged-skill.d.ts +38 -0
- package/dist/built-ins/packaged-skill.js +80 -0
- package/dist/built-ins/packaged-skill.js.map +1 -0
- package/dist/built-ins/skill-install.d.ts +3 -0
- package/dist/built-ins/skill-install.js +168 -0
- package/dist/built-ins/skill-install.js.map +1 -0
- package/dist/built-ins/skills.d.ts +4 -1
- package/dist/built-ins/skills.js +4 -3
- package/dist/built-ins/skills.js.map +1 -1
- package/dist/built-ins/update.js +8 -3
- package/dist/built-ins/update.js.map +1 -1
- package/dist/context.d.ts +24 -3
- package/dist/define.d.ts +22 -6
- package/dist/define.js.map +1 -1
- package/dist/errno.js +2 -2
- package/dist/errno.js.map +1 -1
- package/dist/errors.d.ts +2 -0
- package/dist/errors.js +11 -0
- package/dist/errors.js.map +1 -1
- package/dist/execute.js +14 -4
- package/dist/execute.js.map +1 -1
- package/dist/help-json.d.ts +1 -1
- package/dist/help-json.js +4 -8
- package/dist/help-json.js.map +1 -1
- package/dist/help.js +1 -1
- package/dist/help.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/interrupts.d.ts +3 -1
- package/dist/interrupts.js +14 -6
- package/dist/interrupts.js.map +1 -1
- package/dist/invocation.d.ts +4 -3
- package/dist/invocation.js +6 -6
- package/dist/invocation.js.map +1 -1
- package/dist/output.d.ts +3 -1
- package/dist/output.js +9 -2
- package/dist/output.js.map +1 -1
- package/dist/project.d.ts +6 -1
- package/dist/project.js +11 -11
- package/dist/project.js.map +1 -1
- package/dist/run-as.d.ts +6 -0
- package/dist/run-as.js +8 -0
- package/dist/run-as.js.map +1 -0
- package/dist/run-cli.js +5 -3
- package/dist/run-cli.js.map +1 -1
- package/dist/run-command.js +31 -11
- package/dist/run-command.js.map +1 -1
- package/dist/run-options.d.ts +6 -1
- package/dist/spawn.d.ts +28 -1
- package/dist/spawn.js +54 -10
- package/dist/spawn.js.map +1 -1
- package/dist/tools.d.ts +1 -1
- package/dist/tools.js +2 -2
- package/dist/tools.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import type { Context } from "../context.js";
|
|
3
|
+
import type { CommandTreeCli, DoctorFinding } from "../define.js";
|
|
4
|
+
/** The folder, relative to the package root, of a CLI's Packaged skill, if it declares one. */
|
|
5
|
+
export declare function packagedFolderOf(cli: Pick<CommandTreeCli, "skill">): string | undefined;
|
|
6
|
+
/** The project root and the Skill copy under it, as `skill install` writes it. */
|
|
7
|
+
export declare function skillCopyOf(cli: Pick<CommandTreeCli, "name">, cwd: string): Promise<{
|
|
8
|
+
readonly root: string;
|
|
9
|
+
readonly copy: string;
|
|
10
|
+
}>;
|
|
11
|
+
/** Every file under `dir`, relative to it and sorted; none when `dir` is missing. */
|
|
12
|
+
export declare function filesIn(dir: string): Promise<string[]>;
|
|
13
|
+
/** The `metadata.version` each SKILL.md states, null for none; `copyVersion` is undefined with no copy. */
|
|
14
|
+
export interface SkillVersions {
|
|
15
|
+
readonly packageVersion: string | null;
|
|
16
|
+
readonly copyVersion: string | null | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* The copy states the package's version, so a file of it that differs was edited by hand; a copy
|
|
19
|
+
* of another version, or none, is an older install.
|
|
20
|
+
*/
|
|
21
|
+
readonly same: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** The versions of the package's skill in `source` and of its copy in `copy`. */
|
|
24
|
+
export declare function skillVersionsOf(source: string, copy: string): Promise<SkillVersions>;
|
|
25
|
+
/** What the `skill` row of a Packaged skill carries under `--json` beside its message. */
|
|
26
|
+
export declare const packagedSkillDetailsSchema: z.ZodObject<{
|
|
27
|
+
copy: z.ZodString;
|
|
28
|
+
copyVersion: z.ZodNullable<z.ZodString>;
|
|
29
|
+
packageVersion: z.ZodNullable<z.ZodString>;
|
|
30
|
+
home: z.ZodOptional<z.ZodString>;
|
|
31
|
+
}, z.core.$strip>;
|
|
32
|
+
type PackagedSkillDetails = z.infer<typeof packagedSkillDetailsSchema>;
|
|
33
|
+
export type PackagedSkillFinding = DoctorFinding & {
|
|
34
|
+
readonly skill: PackagedSkillDetails;
|
|
35
|
+
};
|
|
36
|
+
/** The `skill` row of a Packaged skill: the project root's copy against the package's, and any under home. */
|
|
37
|
+
export declare function packagedSkillFinding(cli: CommandTreeCli, folder: string, ctx: Context): Promise<PackagedSkillFinding>;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { readdir, readFile, realpath } from "node:fs/promises";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
import * as z from "zod";
|
|
4
|
+
import { orMissing } from "../errors.js";
|
|
5
|
+
import { runAsOf } from "../run-as.js";
|
|
6
|
+
import { projectRootOf } from "./dependency-install.js";
|
|
7
|
+
import { homeOf, skillVersionIn } from "./skills.js";
|
|
8
|
+
/** The folder, relative to the package root, of a CLI's Packaged skill, if it declares one. */
|
|
9
|
+
export function packagedFolderOf(cli) {
|
|
10
|
+
return cli.skill !== undefined && "packaged" in cli.skill ? cli.skill.packaged : undefined;
|
|
11
|
+
}
|
|
12
|
+
/** The project root and the Skill copy under it, as `skill install` writes it. */
|
|
13
|
+
export async function skillCopyOf(cli, cwd) {
|
|
14
|
+
const root = await projectRootOf(cwd);
|
|
15
|
+
return { root, copy: join(root, ".claude", "skills", cli.name) };
|
|
16
|
+
}
|
|
17
|
+
/** Every file under `dir`, relative to it and sorted; none when `dir` is missing. */
|
|
18
|
+
export async function filesIn(dir) {
|
|
19
|
+
const entries = await orMissing(readdir(dir, { recursive: true, withFileTypes: true }));
|
|
20
|
+
return (entries ?? [])
|
|
21
|
+
.filter((entry) => entry.isFile())
|
|
22
|
+
.map((entry) => relative(dir, join(entry.parentPath, entry.name)))
|
|
23
|
+
.sort();
|
|
24
|
+
}
|
|
25
|
+
/** The versions of the package's skill in `source` and of its copy in `copy`. */
|
|
26
|
+
export async function skillVersionsOf(source, copy) {
|
|
27
|
+
const [shipped, installed] = await Promise.all([
|
|
28
|
+
readFile(join(source, "SKILL.md"), "utf8"),
|
|
29
|
+
orMissing(readFile(join(copy, "SKILL.md"), "utf8")),
|
|
30
|
+
]);
|
|
31
|
+
const packageVersion = skillVersionIn(shipped) ?? null;
|
|
32
|
+
const copyVersion = installed === undefined ? undefined : (skillVersionIn(installed) ?? null);
|
|
33
|
+
return { packageVersion, copyVersion, same: copyVersion === packageVersion };
|
|
34
|
+
}
|
|
35
|
+
// A project that is home itself has its copy under home, which shadows nothing.
|
|
36
|
+
async function personalCopyOf(name, copy, ctx) {
|
|
37
|
+
const home = join(homeOf(ctx.env), ".claude", "skills", name);
|
|
38
|
+
const real = await orMissing(realpath(home));
|
|
39
|
+
return real === undefined || real === (await orMissing(realpath(copy))) ? undefined : home;
|
|
40
|
+
}
|
|
41
|
+
/** What the `skill` row of a Packaged skill carries under `--json` beside its message. */
|
|
42
|
+
export const packagedSkillDetailsSchema = z.object({
|
|
43
|
+
copy: z.string(),
|
|
44
|
+
copyVersion: z.string().nullable(),
|
|
45
|
+
packageVersion: z.string().nullable(),
|
|
46
|
+
/** A personal copy, which Claude Code prefers over the project's. */
|
|
47
|
+
home: z.string().optional(),
|
|
48
|
+
});
|
|
49
|
+
function versionLabel(version) {
|
|
50
|
+
return version ?? "(no metadata.version)";
|
|
51
|
+
}
|
|
52
|
+
function compared(name, { copy, copyVersion, packageVersion }, same) {
|
|
53
|
+
const stated = `${copy} ${versionLabel(copyVersion)}`;
|
|
54
|
+
return same
|
|
55
|
+
? `${stated}, the version ${name} ships`
|
|
56
|
+
: `${stated} differs from the ${versionLabel(packageVersion)} that ${name} ships`;
|
|
57
|
+
}
|
|
58
|
+
/** The `skill` row of a Packaged skill: the project root's copy against the package's, and any under home. */
|
|
59
|
+
export async function packagedSkillFinding(cli, folder, ctx) {
|
|
60
|
+
const { copy } = await skillCopyOf(cli, ctx.cwd);
|
|
61
|
+
const versions = await skillVersionsOf(join(ctx.packageRoot, folder), copy);
|
|
62
|
+
const { packageVersion } = versions;
|
|
63
|
+
const copyVersion = versions.copyVersion ?? null;
|
|
64
|
+
const home = await personalCopyOf(cli.name, copy, ctx);
|
|
65
|
+
const skill = { copy, copyVersion, packageVersion, ...(home === undefined ? {} : { home }) };
|
|
66
|
+
const head = versions.copyVersion === undefined
|
|
67
|
+
? `no copy of the ${cli.name} skill at ${copy}`
|
|
68
|
+
: compared(cli.name, skill, versions.same);
|
|
69
|
+
// Other projects may use the personal copy, so the row names it and gives no line removing it.
|
|
70
|
+
const message = home === undefined
|
|
71
|
+
? head
|
|
72
|
+
: `${head}; remove ${home}: Claude Code prefers a personal skill over the project's`;
|
|
73
|
+
if (!versions.same) {
|
|
74
|
+
return { state: "problem", message, fix: `${runAsOf(cli)} skill install`, skill };
|
|
75
|
+
}
|
|
76
|
+
return home === undefined
|
|
77
|
+
? { state: "ok", message, skill }
|
|
78
|
+
: { state: "problem", message, skill };
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=packaged-skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packaged-skill.js","sourceRoot":"","sources":["../../src/built-ins/packaged-skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import * as z from "zod";
|
|
4
|
+
import { defineCommand } from "../define.js";
|
|
5
|
+
import { CliError, orMissing } from "../errors.js";
|
|
6
|
+
import { FORCE_FLAG } from "../flags.js";
|
|
7
|
+
import { OUTPUT_EXISTS } from "../outputs.js";
|
|
8
|
+
import { runAsOf } from "../run-as.js";
|
|
9
|
+
import { filesIn, skillCopyOf, skillVersionsOf } from "./packaged-skill.js";
|
|
10
|
+
const installSchema = z.object({
|
|
11
|
+
copy: z.string(),
|
|
12
|
+
written: z.array(z.string()),
|
|
13
|
+
removed: z.array(z.string()),
|
|
14
|
+
agentsMd: z.object({ path: z.string(), changed: z.boolean() }),
|
|
15
|
+
handEdits: z.array(z.string()),
|
|
16
|
+
});
|
|
17
|
+
async function sameContent(left, right) {
|
|
18
|
+
const [a, b] = await Promise.all([readFile(left), readFile(right)]);
|
|
19
|
+
return a.equals(b);
|
|
20
|
+
}
|
|
21
|
+
/** One paragraph telling every session that the CLI exists, how to run it and which skill to load. */
|
|
22
|
+
function agentsBlock(cli) {
|
|
23
|
+
const { install } = cli;
|
|
24
|
+
const where = install?.mode === "dependency"
|
|
25
|
+
? `, and only from a package that has \`${install.package}\` in its dependencies; from anywhere else npx reports the package missing`
|
|
26
|
+
: "";
|
|
27
|
+
const what = cli.description.replace(/\.$/, "");
|
|
28
|
+
return `\`${cli.name}\`: ${what}. Run it as \`${runAsOf(cli)}\`${where}. Load the \`${cli.name}\` skill before using it.`;
|
|
29
|
+
}
|
|
30
|
+
function markersOf(name) {
|
|
31
|
+
return { begin: `<!-- BEGIN:${name} -->`, end: `<!-- END:${name} -->` };
|
|
32
|
+
}
|
|
33
|
+
/** `text` with the block between its markers, appended when they are missing; nothing else changes. */
|
|
34
|
+
function withBlock(text, block, { begin, end }) {
|
|
35
|
+
const whole = `${begin}\n${block}\n${end}`;
|
|
36
|
+
const start = text.indexOf(begin);
|
|
37
|
+
const stop = start === -1 ? -1 : text.indexOf(end, start);
|
|
38
|
+
if (stop !== -1)
|
|
39
|
+
return `${text.slice(0, start)}${whole}${text.slice(stop + end.length)}`;
|
|
40
|
+
if (text === "")
|
|
41
|
+
return `${whole}\n`;
|
|
42
|
+
return `${text}${text.endsWith("\n") ? "" : "\n"}\n${whole}\n`;
|
|
43
|
+
}
|
|
44
|
+
function blockChangeOf(existing, block, markers) {
|
|
45
|
+
if (existing === undefined)
|
|
46
|
+
return "create";
|
|
47
|
+
if (withBlock(existing, block, markers) === existing)
|
|
48
|
+
return null;
|
|
49
|
+
return existing.includes(markers.begin) ? "rewrite" : "add";
|
|
50
|
+
}
|
|
51
|
+
// Claude Code reads AGENTS.md only through an `@AGENTS.md` line, and no CLI edits CLAUDE.md.
|
|
52
|
+
async function handEditsAt(root) {
|
|
53
|
+
const claudeMd = join(root, "CLAUDE.md");
|
|
54
|
+
const text = await orMissing(readFile(claudeMd, "utf8"));
|
|
55
|
+
if (text === undefined || text.split(/\r?\n/).some((line) => line.trim() === "@AGENTS.md")) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
return [`add a line \`@AGENTS.md\` to ${claudeMd}, so Claude Code reads AGENTS.md`];
|
|
59
|
+
}
|
|
60
|
+
async function planOf(cli, folder, cwd, packageRoot) {
|
|
61
|
+
const source = join(packageRoot, folder);
|
|
62
|
+
const { root, copy } = await skillCopyOf(cli, cwd);
|
|
63
|
+
const [shipped, present] = await Promise.all([filesIn(source), filesIn(copy)]);
|
|
64
|
+
const differs = await Promise.all(shipped.map(async (file) => present.includes(file) && !(await sameContent(join(source, file), join(copy, file)))));
|
|
65
|
+
const agentsPath = join(root, "AGENTS.md");
|
|
66
|
+
const block = agentsBlock(cli);
|
|
67
|
+
return {
|
|
68
|
+
source,
|
|
69
|
+
copy,
|
|
70
|
+
write: shipped.filter((file) => !present.includes(file)),
|
|
71
|
+
replace: shipped.filter((_file, index) => differs[index]),
|
|
72
|
+
remove: present.filter((file) => !shipped.includes(file)),
|
|
73
|
+
sameVersion: (await skillVersionsOf(source, copy)).same,
|
|
74
|
+
agentsMd: {
|
|
75
|
+
path: agentsPath,
|
|
76
|
+
block,
|
|
77
|
+
change: blockChangeOf(await orMissing(readFile(agentsPath, "utf8")), block, markersOf(cli.name)),
|
|
78
|
+
},
|
|
79
|
+
handEdits: await handEditsAt(root),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const BLOCK_VERBS = {
|
|
83
|
+
create: "create",
|
|
84
|
+
add: "add the block to",
|
|
85
|
+
rewrite: "rewrite the block in",
|
|
86
|
+
};
|
|
87
|
+
function renderPlan(cli, plan) {
|
|
88
|
+
const files = [
|
|
89
|
+
...plan.write.map((file) => ` write ${file}`),
|
|
90
|
+
...plan.replace.map((file) => ` replace ${file}`),
|
|
91
|
+
...plan.remove.map((file) => ` remove ${file}`),
|
|
92
|
+
];
|
|
93
|
+
const { path, block, change } = plan.agentsMd;
|
|
94
|
+
return [
|
|
95
|
+
files.length === 0
|
|
96
|
+
? `the ${cli.name} skill at ${plan.copy} already matches the package`
|
|
97
|
+
: `would copy the ${cli.name} skill to ${plan.copy}:`,
|
|
98
|
+
...files,
|
|
99
|
+
change === null
|
|
100
|
+
? `${path} already holds the ${cli.name} block`
|
|
101
|
+
: `would ${BLOCK_VERBS[change]} ${path}:\n${block}`,
|
|
102
|
+
...plan.handEdits.map((edit) => `by hand: ${edit}`),
|
|
103
|
+
].join("\n");
|
|
104
|
+
}
|
|
105
|
+
function renderInstalled(cli, data) {
|
|
106
|
+
const { written, removed, agentsMd } = data;
|
|
107
|
+
return [
|
|
108
|
+
written.length + removed.length === 0
|
|
109
|
+
? `the ${cli.name} skill at ${data.copy} already matches the package`
|
|
110
|
+
: `copied the ${cli.name} skill to ${data.copy}: wrote ${written.length} files, removed ${removed.length}`,
|
|
111
|
+
agentsMd.changed
|
|
112
|
+
? `wrote the ${cli.name} block in ${agentsMd.path}`
|
|
113
|
+
: `${agentsMd.path} already holds the ${cli.name} block`,
|
|
114
|
+
...data.handEdits.map((edit) => `by hand: ${edit}`),
|
|
115
|
+
].join("\n");
|
|
116
|
+
}
|
|
117
|
+
// The Runtime's `outputs` refusal says "overwrite", so a removal is refused here, before any write.
|
|
118
|
+
function editedRemovals(plan, ctx) {
|
|
119
|
+
const them = plan.remove.length === 1 ? "it" : "them";
|
|
120
|
+
return new CliError({
|
|
121
|
+
code: OUTPUT_EXISTS,
|
|
122
|
+
message: `\`${ctx.commandLine()}\` would remove ${plan.remove.map((file) => join(plan.copy, file)).join(", ")}`,
|
|
123
|
+
hint: `to remove ${them}, run \`${ctx.commandLine({ add: [FORCE_FLAG.flag] })}\``,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/** The built-in `skill install`, for a CLI whose skill ships in its package. */
|
|
127
|
+
export function skillInstallCommand(cli, folder) {
|
|
128
|
+
const runAs = runAsOf(cli);
|
|
129
|
+
return defineCommand({
|
|
130
|
+
name: "install",
|
|
131
|
+
description: "copy this CLI's skill into the project and write its AGENTS.md block",
|
|
132
|
+
examples: [
|
|
133
|
+
{ command: `${runAs} skill install`, note: "install the skill this version ships" },
|
|
134
|
+
{ command: `${runAs} skill install --dry-run`, note: "show what it would change" },
|
|
135
|
+
],
|
|
136
|
+
effect: "write",
|
|
137
|
+
output: installSchema,
|
|
138
|
+
force: "replace or remove hand-edited files of a skill copy at the package's version",
|
|
139
|
+
plan: (_input, ctx) => planOf(cli, folder, ctx.cwd, ctx.packageRoot),
|
|
140
|
+
// The copy lives in the project repo, so git keeps an edit that an upgrade replaces.
|
|
141
|
+
outputs: (plan) => plan.sameVersion ? [...plan.write, ...plan.replace].map((file) => join(plan.copy, file)) : [],
|
|
142
|
+
apply: async (plan, ctx) => {
|
|
143
|
+
if (plan.sameVersion && plan.remove.length > 0 && !ctx.force)
|
|
144
|
+
throw editedRemovals(plan, ctx);
|
|
145
|
+
for (const file of [...plan.write, ...plan.replace]) {
|
|
146
|
+
await ctx.files.write(join(plan.copy, file), await readFile(join(plan.source, file)));
|
|
147
|
+
}
|
|
148
|
+
for (const file of plan.remove) {
|
|
149
|
+
await ctx.files.remove(join(plan.copy, file));
|
|
150
|
+
}
|
|
151
|
+
const { path, block, change } = plan.agentsMd;
|
|
152
|
+
if (change !== null) {
|
|
153
|
+
const existing = (await orMissing(readFile(path, "utf8"))) ?? "";
|
|
154
|
+
await ctx.files.write(path, withBlock(existing, block, markersOf(cli.name)));
|
|
155
|
+
}
|
|
156
|
+
return {
|
|
157
|
+
copy: plan.copy,
|
|
158
|
+
written: [...plan.write, ...plan.replace].sort(),
|
|
159
|
+
removed: [...plan.remove],
|
|
160
|
+
agentsMd: { path, changed: change !== null },
|
|
161
|
+
handEdits: [...plan.handEdits],
|
|
162
|
+
};
|
|
163
|
+
},
|
|
164
|
+
render: (data) => renderInstalled(cli, data),
|
|
165
|
+
renderPlan: (plan) => renderPlan(cli, plan),
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=skill-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-install.js","sourceRoot":"","sources":["../../src/built-ins/skill-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Context } from "../context.js";
|
|
1
|
+
import type { Context, Env } from "../context.js";
|
|
2
2
|
import type { CommandTreeCli } from "../define.js";
|
|
3
3
|
import { type Standing } from "./semver.js";
|
|
4
4
|
export type SkillState = Standing | "unversioned" | "unreadable";
|
|
@@ -14,5 +14,8 @@ export interface SkillReport {
|
|
|
14
14
|
/** The command line that brings every copy to the version, when one can. */
|
|
15
15
|
readonly fix: string | undefined;
|
|
16
16
|
}
|
|
17
|
+
/** The version a SKILL.md's frontmatter `metadata.version` states. */
|
|
18
|
+
export declare function skillVersionIn(skill: string): string | undefined;
|
|
19
|
+
export declare function homeOf(env: Env): string;
|
|
17
20
|
export declare function skillReport(cli: SkillCli, version: string, ctx: SkillPlace): Promise<SkillReport>;
|
|
18
21
|
export {};
|
package/dist/built-ins/skills.js
CHANGED
|
@@ -11,11 +11,11 @@ const SKILL_DIRS = [
|
|
|
11
11
|
const FRONTMATTER = /^---\r?\n([\s\S]*?)\r?\n---/;
|
|
12
12
|
const METADATA_VERSION = /^metadata:[ \t]*\r?\n(?:[ \t]+.*\r?\n)*?[ \t]+version:[ \t]*["']?([^"'\s]+)["']?[ \t]*$/m;
|
|
13
13
|
/** The version a SKILL.md's frontmatter `metadata.version` states. */
|
|
14
|
-
function skillVersionIn(skill) {
|
|
14
|
+
export function skillVersionIn(skill) {
|
|
15
15
|
const frontmatter = FRONTMATTER.exec(skill)?.[1];
|
|
16
16
|
return frontmatter === undefined ? undefined : METADATA_VERSION.exec(`${frontmatter}\n`)?.[1];
|
|
17
17
|
}
|
|
18
|
-
function homeOf(env) {
|
|
18
|
+
export function homeOf(env) {
|
|
19
19
|
return env.HOME ?? env.USERPROFILE ?? homedir();
|
|
20
20
|
}
|
|
21
21
|
async function copyAt(path, version) {
|
|
@@ -68,6 +68,7 @@ function fixFor(cliName, copies, source) {
|
|
|
68
68
|
}
|
|
69
69
|
export async function skillReport(cli, version, ctx) {
|
|
70
70
|
const copies = await skillCopies(cli.name, version, ctx);
|
|
71
|
-
|
|
71
|
+
const source = cli.skill !== undefined && "source" in cli.skill ? cli.skill.source : undefined;
|
|
72
|
+
return { copies, fix: fixFor(cli.name, copies, source) };
|
|
72
73
|
}
|
|
73
74
|
//# sourceMappingURL=skills.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/built-ins/skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAiB,UAAU,EAAE,MAAM,aAAa,CAAC;AAEnE,iFAAiF;AAEjF,MAAM,UAAU,GAAG;IACjB,CAAC,SAAS,EAAE,QAAQ,CAAC;IACrB,CAAC,SAAS,EAAE,QAAQ,CAAC;CACb,CAAC;AAmBX,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAClD,MAAM,gBAAgB,GACpB,0FAA0F,CAAC;AAE7F,sEAAsE;AACtE,
|
|
1
|
+
{"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/built-ins/skills.ts"],"names":[],"mappings":"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"}
|
package/dist/built-ins/update.js
CHANGED
|
@@ -4,6 +4,7 @@ import { CliError } from "../errors.js";
|
|
|
4
4
|
import { INTERRUPTED } from "../interrupts.js";
|
|
5
5
|
import { globalInstallOf } from "./global-install.js";
|
|
6
6
|
import { globalNpm, installGlobally, latestVersion } from "./npm.js";
|
|
7
|
+
import { packagedFolderOf, packagedSkillFinding } from "./packaged-skill.js";
|
|
7
8
|
import { standingOf } from "./semver.js";
|
|
8
9
|
import { skillReport } from "./skills.js";
|
|
9
10
|
import { upgradeSchema, upgradesOf } from "./upgrades.js";
|
|
@@ -35,10 +36,14 @@ function renderUpdate(cli, install, update) {
|
|
|
35
36
|
const next = update.next.map((command) => `next: ${command}, so the ${cli.name} skill describes ${update.latest}`);
|
|
36
37
|
return (next.length === 0 ? head : [...head, "", ...next]).join("\n");
|
|
37
38
|
}
|
|
38
|
-
//
|
|
39
|
+
// A Skill Hub copy is compared with the latest release even when nothing was installed: its skill is
|
|
40
|
+
// what the installer gives. A Packaged skill's copy is compared with the package now on disk.
|
|
39
41
|
async function skillNext(cli, latest, ctx) {
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
+
const packaged = packagedFolderOf(cli);
|
|
43
|
+
const finding = packaged === undefined
|
|
44
|
+
? await skillReport(cli, latest, ctx)
|
|
45
|
+
: await packagedSkillFinding(cli, packaged, ctx);
|
|
46
|
+
return "fix" in finding && finding.fix !== undefined ? [finding.fix] : [];
|
|
42
47
|
}
|
|
43
48
|
// The install ran to its end, so the run reports it rather than asking for a rerun.
|
|
44
49
|
function interruptedAfterInstall(plan) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/built-ins/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,EAAqC,aAAa,EAAsB,MAAM,cAAc,CAAC;AACpG,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAgB,aAAa,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAExE,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC3E,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;IAChC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC1B,CAAC,CAAC;AAYH,SAAS,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAoC;IAC1E,OAAO,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,SAAS;QAC3C,CAAC,CAAC,cAAc,IAAI,0CAA0C;QAC9D,CAAC,CAAC,GAAG,IAAI,qCAAqC,MAAM,sBAAsB,CAAC;AAC/E,CAAC;AAED,SAAS,aAAa,CAAC,OAAgB;IACrC,OAAO,OAAO,IAAI,OAAO;QACvB,CAAC,CAAC,CAAC,uBAAuB,OAAO,CAAC,OAAO,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAC3F,IAAI,CACL;QACH,CAAC,CAAC,gBAAgB,OAAO,CAAC,OAAO,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,YAAY,CAAC,GAAmB,EAAE,OAAsB,EAAE,MAAc;IAC/E,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAC7B,MAAM,IAAI,GACR,SAAS,KAAK,IAAI;QAChB,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC;YACE,aAAa,OAAO,CAAC,OAAO,IAAI,SAAS,CAAC,OAAO,uBAAuB,SAAS,CAAC,MAAM,eAAe,MAAM,CAAC,IAAI,EAAE;YACpH,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC;SACtC,CAAC;IACR,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAC1B,CAAC,OAAO,EAAE,EAAE,CAAC,SAAS,OAAO,YAAY,GAAG,CAAC,IAAI,oBAAoB,MAAM,CAAC,MAAM,EAAE,CACrF,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/built-ins/update.ts"],"names":[],"mappings":"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"}
|
package/dist/context.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import type { FileAccess } from "./errno.js";
|
|
|
4
4
|
import type { Files } from "./files.js";
|
|
5
5
|
import type { CommandLineChange } from "./invocation.js";
|
|
6
6
|
import type { Secret } from "./secrets.js";
|
|
7
|
-
import type { ContextSpawn } from "./spawn.js";
|
|
7
|
+
import type { ContextSpawn, ContextSpawnDetached } from "./spawn.js";
|
|
8
8
|
export type Env = Readonly<Record<string, string | undefined>>;
|
|
9
9
|
export interface PollOptions {
|
|
10
10
|
readonly intervalMs: number;
|
|
@@ -27,7 +27,7 @@ export interface Context<Ports = unknown, Settings = unknown> {
|
|
|
27
27
|
/**
|
|
28
28
|
* The command line that reruns this CLI, to spawn one of its hidden Commands: Node, its flags and
|
|
29
29
|
* the bin, or the CLI's name, found on PATH, when run without a bin. Spawn it as
|
|
30
|
-
* `ctx.spawn(self[0], [...self.slice(1), "daemon"])
|
|
30
|
+
* `ctx.spawn(self[0], [...self.slice(1), "daemon"])`, or with `ctx.spawnDetached` for a Daemon.
|
|
31
31
|
*/
|
|
32
32
|
readonly self: readonly string[];
|
|
33
33
|
/**
|
|
@@ -40,6 +40,12 @@ export interface Context<Ports = unknown, Settings = unknown> {
|
|
|
40
40
|
* `{"progress":"..."}`.
|
|
41
41
|
*/
|
|
42
42
|
progress(message: string): void;
|
|
43
|
+
/**
|
|
44
|
+
* Tells the caller something beside the data, such as that a copy is behind: a plain line on
|
|
45
|
+
* stderr, or `{"notice":"..."}` under `--json`, written when called and in order with progress. It
|
|
46
|
+
* never changes stdout or the exit code.
|
|
47
|
+
*/
|
|
48
|
+
notice(text: string): void;
|
|
43
49
|
/**
|
|
44
50
|
* Aborts when the run is interrupted (Ctrl-C, SIGTERM, or `runCli`'s `signal`) or hits the
|
|
45
51
|
* Command's run deadline; pass it to `fetch` and the ports. An interrupt fails the run with
|
|
@@ -84,6 +90,13 @@ export interface Context<Ports = unknown, Settings = unknown> {
|
|
|
84
90
|
* process it started is killed too. A program not found fails the run with `TOOL_MISSING` (exit 2).
|
|
85
91
|
*/
|
|
86
92
|
readonly spawn: ContextSpawn;
|
|
93
|
+
/**
|
|
94
|
+
* Starts a child process in `cwd` with `env` that outlives the run, such as a Daemon, and resolves
|
|
95
|
+
* with its `pid` once it has started. It gets no stdin, stdout or stderr, the run neither waits
|
|
96
|
+
* for it nor stops it on an interrupt, and on POSIX it leaves the terminal's process group, so
|
|
97
|
+
* Ctrl-C does not reach it. A program not found fails the run with `TOOL_MISSING` (exit 2).
|
|
98
|
+
*/
|
|
99
|
+
readonly spawnDetached: ContextSpawnDetached;
|
|
87
100
|
/** Deadlines, `poll` and the grace period after an interrupt run on it. */
|
|
88
101
|
readonly clock: Clock;
|
|
89
102
|
/**
|
|
@@ -123,11 +136,19 @@ export interface Context<Ports = unknown, Settings = unknown> {
|
|
|
123
136
|
*/
|
|
124
137
|
commandLine(change?: CommandLineChange): string;
|
|
125
138
|
}
|
|
139
|
+
/** A serve Command's `Context`, whose run it may end itself. */
|
|
140
|
+
export interface ServeContext<Ports = unknown, Settings = unknown> extends Context<Ports, Settings> {
|
|
141
|
+
/**
|
|
142
|
+
* Ends the run with exit 0, printing nothing more, as a stop does; for a Daemon that a newer one
|
|
143
|
+
* replaces. Stop the work before calling it: `ctx.signal` does not abort.
|
|
144
|
+
*/
|
|
145
|
+
end(): void;
|
|
146
|
+
}
|
|
126
147
|
/**
|
|
127
148
|
* The slice of `Context` the ports factory receives, which exists before the ports do; a test that
|
|
128
149
|
* keeps the real factory gives it the test's env and fakes.
|
|
129
150
|
*/
|
|
130
|
-
export type PortsBase = Pick<Context, "env" | "cwd" | "packageRoot" | "secret" | "envFile" | "spawn" | "files" | "clock" | "signal" | "progress" | "version" | "build" | "self" | "fileError">;
|
|
151
|
+
export type PortsBase = Pick<Context, "env" | "cwd" | "packageRoot" | "secret" | "envFile" | "spawn" | "spawnDetached" | "files" | "clock" | "signal" | "progress" | "version" | "build" | "self" | "fileError">;
|
|
131
152
|
export interface Project<Settings = unknown> {
|
|
132
153
|
/** The folder holding the Project file. */
|
|
133
154
|
readonly root: string;
|
package/dist/define.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type * as z from "zod";
|
|
2
|
-
import type { BuildStamp, Context, PortsBase, ProjectFile } from "./context.js";
|
|
2
|
+
import type { BuildStamp, Context, PortsBase, ProjectFile, ServeContext } from "./context.js";
|
|
3
3
|
import type { ErrorTable } from "./error-table.js";
|
|
4
4
|
import { type StandardFlagName } from "./flags.js";
|
|
5
5
|
import type { Page, PageInput, RowSchema } from "./list.js";
|
|
@@ -145,13 +145,13 @@ export interface DestructiveCommand<Args extends InputSchema, Options extends In
|
|
|
145
145
|
confirm(plan: Plan): string;
|
|
146
146
|
}
|
|
147
147
|
/**
|
|
148
|
-
* A Command that keeps running, such as a preview server, until Ctrl-C or SIGTERM stops it
|
|
149
|
-
* exit 0. Of the Standard flags it gets only `--json`.
|
|
148
|
+
* A Command that keeps running, such as a preview server, until Ctrl-C or SIGTERM stops it or it
|
|
149
|
+
* calls `ctx.end()`, either with exit 0. Of the Standard flags it gets only `--json`.
|
|
150
150
|
*/
|
|
151
151
|
export interface ServeCommand<Args extends InputSchema, Options extends InputSchema, Data, Ports = unknown, Settings = unknown> extends UnpagedCommand<Args, Options> {
|
|
152
152
|
readonly effect: "serve";
|
|
153
153
|
/** Starts the work and returns its data, which prints at once; stop the work on `ctx.signal`. */
|
|
154
|
-
start(input: Input<Args, Options>, ctx:
|
|
154
|
+
start(input: Input<Args, Options>, ctx: ServeContext<Ports, Settings>): Data | Promise<Data>;
|
|
155
155
|
render(data: Data, style: Style): string;
|
|
156
156
|
}
|
|
157
157
|
export type Command<Ports = unknown, Settings = unknown> = ReadCommand<InputSchema, InputSchema, unknown, Ports, Settings> | ListCommand<InputSchema, InputSchema, RowSchema, Ports, Settings> | WriteCommand<InputSchema, InputSchema, unknown, unknown, Ports, Settings> | DestructiveCommand<InputSchema, InputSchema, unknown, unknown, Ports, Settings> | ServeCommand<InputSchema, InputSchema, unknown, Ports, Settings>;
|
|
@@ -171,11 +171,27 @@ interface CliBase<Ports, Settings> {
|
|
|
171
171
|
readonly ports?: (base: PortsBase) => Ports;
|
|
172
172
|
readonly project?: ProjectFile<Settings>;
|
|
173
173
|
/**
|
|
174
|
-
* Where
|
|
175
|
-
*
|
|
174
|
+
* Where the CLI's skill comes from. `{ source }` is where `npx skills add` installs it from,
|
|
175
|
+
* typically the git URL of the Skill Hub its release commits the skill to; without `skill`,
|
|
176
|
+
* `doctor` and `update` give no line that installs it.
|
|
177
|
+
*
|
|
178
|
+
* `{ packaged }` is a Packaged skill: a folder, relative to the package root, holding `SKILL.md`
|
|
179
|
+
* and its files. The Runtime then adds the Built-in `skill install`, which copies that folder to
|
|
180
|
+
* `.claude/skills/<name>` at the package manager's project root (removing files the package no
|
|
181
|
+
* longer has), writes the CLI's `AGENTS.md` block there and names the `@AGENTS.md` line
|
|
182
|
+
* `CLAUDE.md` lacks. A copy of another `metadata.version` refreshes at once; in a copy at the
|
|
183
|
+
* package's version, a file that differs was edited, and replacing or removing it needs
|
|
184
|
+
* `--force`. `doctor`'s `skill` row reports, as advisory problems, a missing copy or one whose
|
|
185
|
+
* `metadata.version` differs from the package's, whose fix is `<run-as> skill install`, and a
|
|
186
|
+
* copy under `~/.claude/skills`, which Claude Code prefers: the row names that folder to remove
|
|
187
|
+
* and gives no line, since other projects may use it. Under `--json` the row also carries
|
|
188
|
+
* `skill: { copy, copyVersion, packageVersion, home? }`, `home` naming that folder. Only a CLI
|
|
189
|
+
* with several Commands may declare it: `defineCli` throws otherwise.
|
|
176
190
|
*/
|
|
177
191
|
readonly skill?: {
|
|
178
192
|
readonly source: string;
|
|
193
|
+
} | {
|
|
194
|
+
readonly packaged: string;
|
|
179
195
|
};
|
|
180
196
|
/**
|
|
181
197
|
* Work that runs beside every Command run, such as a usage count; return `undefined` to decline.
|
package/dist/define.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAyB,MAAM,YAAY,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"define.js","sourceRoot":"","sources":["../src/define.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAyB,MAAM,YAAY,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAkY5F,SAAS,cAAc,CAA2B,OAAiB;IACjE,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,UAAU,CAAC,OAAO,CAAC,CAAC;IACpB,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC9D,yBAAyB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAA2B,gBAAgB,EAAE,CAAC;AAExE,0FAA0F;AAC1F,MAAM,UAAU,SAAS,CAAC,IAAwB;IAChD,OAAO,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC;AACzC,CAAC"}
|
package/dist/errno.js
CHANGED
|
@@ -9,7 +9,7 @@ export const NOT_A_FILE = "NOT_A_FILE";
|
|
|
9
9
|
// pointed at its sandbox. Native Windows has no such sandbox: there a program holding the file denies it.
|
|
10
10
|
function permissionHint({ path, access, callerLine, env, platform }) {
|
|
11
11
|
if (platform === "win32") {
|
|
12
|
-
return `a program may hold ${path} open: close it, then run
|
|
12
|
+
return `a program may hold ${path} open: close it, then run \`${callerLine}\` again`;
|
|
13
13
|
}
|
|
14
14
|
if (!isAgent(env))
|
|
15
15
|
return `check the permissions of ${path} and its folder`;
|
|
@@ -38,7 +38,7 @@ function classifyErrno(error, context) {
|
|
|
38
38
|
return new CliError({
|
|
39
39
|
code: DISK_FULL,
|
|
40
40
|
message: `no space left on the disk holding ${path}`,
|
|
41
|
-
hint:
|
|
41
|
+
hint: `free space on that disk, then run \`${context.callerLine}\` again`,
|
|
42
42
|
}, { cause: error });
|
|
43
43
|
case "ENOENT":
|
|
44
44
|
case "ENOTDIR":
|
package/dist/errno.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errno.js","sourceRoot":"","sources":["../src/errno.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEhD,MAAM,CAAC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;AACrD,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;AACrC,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;AACrC,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAC/C,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;AAmBvC,mGAAmG;AACnG,0GAA0G;AAC1G,SAAS,cAAc,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,EAAgB;IAC/E,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,sBAAsB,IAAI,
|
|
1
|
+
{"version":3,"file":"errno.js","sourceRoot":"","sources":["../src/errno.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -34,6 +34,8 @@ export interface ErrorFormat {
|
|
|
34
34
|
}
|
|
35
35
|
export declare function errnoOf(error: unknown): string | undefined;
|
|
36
36
|
export declare function isMissingFile(error: unknown): boolean;
|
|
37
|
+
/** What `pending` resolves with, or undefined when it fails because a file is missing. */
|
|
38
|
+
export declare function orMissing<T>(pending: Promise<T>): Promise<T | undefined>;
|
|
37
39
|
export declare function isNothingThere(error: unknown): boolean;
|
|
38
40
|
export declare function debugVariable(cliName: string): string;
|
|
39
41
|
export declare function messageOf(error: unknown): string;
|
package/dist/errors.js
CHANGED
|
@@ -28,6 +28,17 @@ export function errnoOf(error) {
|
|
|
28
28
|
export function isMissingFile(error) {
|
|
29
29
|
return errnoOf(error) === "ENOENT";
|
|
30
30
|
}
|
|
31
|
+
/** What `pending` resolves with, or undefined when it fails because a file is missing. */
|
|
32
|
+
export async function orMissing(pending) {
|
|
33
|
+
try {
|
|
34
|
+
return await pending;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (isMissingFile(error))
|
|
38
|
+
return undefined;
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
31
42
|
// ENOTDIR: a part of the path is a file, so nothing can exist under it.
|
|
32
43
|
export function isNothingThere(error) {
|
|
33
44
|
return isMissingFile(error) || errnoOf(error) === "ENOTDIR";
|