@duyquangnvx/agent-cli 0.23.0 → 0.24.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 +31 -0
- package/dist/agent-cli.js +16 -12
- package/dist/agent-cli.js.map +1 -1
- package/dist/built-ins/commands.d.ts +2 -2
- package/dist/built-ins/commands.js +2 -2
- package/dist/built-ins/doctor.js +0 -2
- package/dist/built-ins/doctor.js.map +1 -1
- package/dist/built-ins/install/global-npm.d.ts +2 -0
- package/dist/built-ins/install/global-npm.js +7 -3
- package/dist/built-ins/install/global-npm.js.map +1 -1
- package/dist/built-ins/install/global.d.ts +1 -1
- package/dist/built-ins/install/global.js +9 -7
- package/dist/built-ins/install/global.js.map +1 -1
- package/dist/built-ins/install/install.d.ts +4 -2
- package/dist/built-ins/install/install.js.map +1 -1
- package/dist/built-ins/npm.d.ts +5 -3
- package/dist/built-ins/npm.js +7 -3
- package/dist/built-ins/npm.js.map +1 -1
- package/dist/built-ins/setup.d.ts +6 -0
- package/dist/built-ins/setup.js +168 -0
- package/dist/built-ins/setup.js.map +1 -0
- package/dist/built-ins/skill/home.d.ts +28 -0
- package/dist/built-ins/skill/home.js +116 -0
- package/dist/built-ins/skill/home.js.map +1 -0
- package/dist/built-ins/skill/install-command.d.ts +0 -13
- package/dist/built-ins/skill/install-command.js +7 -58
- package/dist/built-ins/skill/install-command.js.map +1 -1
- package/dist/built-ins/skill/project.d.ts +5 -0
- package/dist/built-ins/skill/project.js +46 -0
- package/dist/built-ins/skill/project.js.map +1 -0
- package/dist/built-ins/skill/skill.d.ts +7 -31
- package/dist/built-ins/skill/skill.js +18 -6
- package/dist/built-ins/skill/skill.js.map +1 -1
- package/dist/built-ins/skill/sync.d.ts +16 -0
- package/dist/built-ins/skill/sync.js +35 -0
- package/dist/built-ins/skill/sync.js.map +1 -0
- package/dist/built-ins/update.d.ts +2 -2
- package/dist/built-ins/update.js +23 -20
- package/dist/built-ins/update.js.map +1 -1
- package/dist/built-ins/upgrades.d.ts +1 -0
- package/dist/built-ins/upgrades.js +5 -0
- package/dist/built-ins/upgrades.js.map +1 -1
- package/dist/context/tools.d.ts +1 -0
- package/dist/context/tools.js +1 -1
- package/dist/context/tools.js.map +1 -1
- package/dist/define.d.ts +28 -34
- package/dist/define.js.map +1 -1
- package/dist/exit-classes.js +1 -0
- package/dist/exit-classes.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/output.js +5 -3
- package/dist/output.js.map +1 -1
- package/dist/run-cli.js +2 -6
- package/dist/run-cli.js.map +1 -1
- package/dist/run-command.js +2 -7
- package/dist/run-command.js.map +1 -1
- package/dist/runtime-codes.d.ts +1 -0
- package/dist/runtime-codes.js +2 -0
- package/dist/runtime-codes.js.map +1 -1
- package/docs/README.md +1 -1
- package/docs/getting-started.md +6 -6
- package/docs/guides/doctor.md +3 -4
- package/docs/guides/errors.md +2 -0
- package/docs/guides/shipping.md +32 -24
- package/docs/principles.md +1 -1
- package/docs/reference.md +1 -0
- package/package.json +1 -1
- package/dist/built-ins/skill/hub.d.ts +0 -8
- package/dist/built-ins/skill/hub.js +0 -114
- package/dist/built-ins/skill/hub.js.map +0 -1
- package/dist/built-ins/skill/packaged.d.ts +0 -13
- package/dist/built-ins/skill/packaged.js +0 -97
- package/dist/built-ins/skill/packaged.js.map +0 -1
- package/dist/built-ins/skill/usage-hint.d.ts +0 -4
- package/dist/built-ins/skill/usage-hint.js +0 -28
- package/dist/built-ins/skill/usage-hint.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/built-ins/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import type { Context, Env } from "../../context.js";
|
|
3
|
+
import type { SkillSource } from "../../define.js";
|
|
4
|
+
import type { Install } from "../install/install.js";
|
|
5
|
+
import type { Skill, SkillCli } from "./skill.js";
|
|
6
|
+
/** The version a SKILL.md's frontmatter `metadata.version` states. */
|
|
7
|
+
export declare function skillVersionIn(skill: string): string | undefined;
|
|
8
|
+
/** How the row words a copy that states a version, which only a skill from before CLI docs does. */
|
|
9
|
+
export declare function statedVersionNote(version: string): string;
|
|
10
|
+
export declare function homeOf(env: Env): string;
|
|
11
|
+
/** The home folders of the Skill copy; the skills installer may have made one a link to the other. */
|
|
12
|
+
export declare function homeCopiesOf(name: string, env: Env): Promise<string[]>;
|
|
13
|
+
export declare const homeSyncSchema: z.ZodObject<{
|
|
14
|
+
copies: z.ZodArray<z.ZodString>;
|
|
15
|
+
written: z.ZodArray<z.ZodString>;
|
|
16
|
+
removed: z.ZodArray<z.ZodString>;
|
|
17
|
+
}, z.core.$strip>;
|
|
18
|
+
export type HomeSync = z.infer<typeof homeSyncSchema>;
|
|
19
|
+
/**
|
|
20
|
+
* Makes each home Skill copy match the folder in the package at `packageDir`. Null when the CLI
|
|
21
|
+
* declares no skill, or that package ships none, which must not empty a copy.
|
|
22
|
+
*/
|
|
23
|
+
export declare function syncHome(cli: Pick<SkillCli, "name" | "skill">, packageDir: string, ctx: Context): Promise<HomeSync | null>;
|
|
24
|
+
/** What a dry run says of the copies, since the release's files may not be on disk yet. */
|
|
25
|
+
export declare function renderPlannedSync(name: string, copies: readonly string[]): readonly string[];
|
|
26
|
+
export declare function renderHomeSync(name: string, sync: HomeSync | null): readonly string[];
|
|
27
|
+
/** A skill the package ships, which `setup` and `update` copy under home. */
|
|
28
|
+
export declare function homeSkill(cli: SkillCli, { folder }: SkillSource, install: Install): Skill;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { readFile, realpath } from "node:fs/promises";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import * as z from "zod";
|
|
5
|
+
import { isMissingFile, orMissing } from "../../errors.js";
|
|
6
|
+
import { applySync, filesIn, syncOf } from "./sync.js";
|
|
7
|
+
// The folders of Claude Code and Codex (ADR 0016).
|
|
8
|
+
const SKILL_DIRS = [
|
|
9
|
+
[".claude", "skills"],
|
|
10
|
+
[".agents", "skills"],
|
|
11
|
+
];
|
|
12
|
+
const FRONTMATTER = /^---\r?\n([\s\S]*?)\r?\n---/;
|
|
13
|
+
const METADATA_VERSION = /^metadata:[ \t]*\r?\n(?:[ \t]+.*\r?\n)*?[ \t]+version:[ \t]*["']?([^"'\s]+)["']?[ \t]*$/m;
|
|
14
|
+
/** The version a SKILL.md's frontmatter `metadata.version` states. */
|
|
15
|
+
export function skillVersionIn(skill) {
|
|
16
|
+
const frontmatter = FRONTMATTER.exec(skill)?.[1];
|
|
17
|
+
return frontmatter === undefined ? undefined : METADATA_VERSION.exec(`${frontmatter}\n`)?.[1];
|
|
18
|
+
}
|
|
19
|
+
/** How the row words a copy that states a version, which only a skill from before CLI docs does. */
|
|
20
|
+
export function statedVersionNote(version) {
|
|
21
|
+
return `states metadata.version ${version}: an older skill that CLI docs replace`;
|
|
22
|
+
}
|
|
23
|
+
export function homeOf(env) {
|
|
24
|
+
return env.HOME ?? env.USERPROFILE ?? homedir();
|
|
25
|
+
}
|
|
26
|
+
/** The home folders of the Skill copy; the skills installer may have made one a link to the other. */
|
|
27
|
+
export async function homeCopiesOf(name, env) {
|
|
28
|
+
const paths = SKILL_DIRS.map((dir) => join(homeOf(env), ...dir, name));
|
|
29
|
+
const reals = await Promise.all(paths.map(async (path) => orMissing(realpath(path))));
|
|
30
|
+
return paths.filter((_path, index) => {
|
|
31
|
+
const real = reals[index];
|
|
32
|
+
return real === undefined || reals.indexOf(real) === index;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
export const homeSyncSchema = z.object({
|
|
36
|
+
copies: z.array(z.string()),
|
|
37
|
+
written: z.array(z.string()),
|
|
38
|
+
removed: z.array(z.string()),
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* Makes each home Skill copy match the folder in the package at `packageDir`. Null when the CLI
|
|
42
|
+
* declares no skill, or that package ships none, which must not empty a copy.
|
|
43
|
+
*/
|
|
44
|
+
export async function syncHome(cli, packageDir, ctx) {
|
|
45
|
+
if (cli.skill === undefined)
|
|
46
|
+
return null;
|
|
47
|
+
const source = join(packageDir, cli.skill.folder);
|
|
48
|
+
if ((await filesIn(source)).length === 0)
|
|
49
|
+
return null;
|
|
50
|
+
const copies = await homeCopiesOf(cli.name, ctx.env);
|
|
51
|
+
const syncs = await Promise.all(copies.map((copy) => syncOf(source, copy)));
|
|
52
|
+
for (const sync of syncs)
|
|
53
|
+
await applySync(sync, ctx);
|
|
54
|
+
return {
|
|
55
|
+
copies,
|
|
56
|
+
written: syncs.flatMap((sync) => [...sync.write, ...sync.replace]),
|
|
57
|
+
removed: syncs.flatMap((sync) => sync.remove),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** What a dry run says of the copies, since the release's files may not be on disk yet. */
|
|
61
|
+
export function renderPlannedSync(name, copies) {
|
|
62
|
+
return copies.length === 0
|
|
63
|
+
? []
|
|
64
|
+
: [`would make the ${name} skill at ${copies.join(", ")} match the release`];
|
|
65
|
+
}
|
|
66
|
+
export function renderHomeSync(name, sync) {
|
|
67
|
+
if (sync === null)
|
|
68
|
+
return [];
|
|
69
|
+
const at = sync.copies.join(", ");
|
|
70
|
+
return sync.written.length + sync.removed.length === 0
|
|
71
|
+
? [`the ${name} skill at ${at} already matches the package`]
|
|
72
|
+
: [
|
|
73
|
+
`copied the ${name} skill to ${at}: wrote ${sync.written.length} files, removed ${sync.removed.length}`,
|
|
74
|
+
];
|
|
75
|
+
}
|
|
76
|
+
async function homeCopyAt(path) {
|
|
77
|
+
try {
|
|
78
|
+
return {
|
|
79
|
+
path,
|
|
80
|
+
state: "readable",
|
|
81
|
+
stated: skillVersionIn(await readFile(join(path, "SKILL.md"), "utf8")),
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
return { path, state: isMissingFile(error) ? "missing" : "unreadable" };
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function describeCopy(copy) {
|
|
89
|
+
if (copy.state === "missing")
|
|
90
|
+
return `no copy at ${copy.path}`;
|
|
91
|
+
if (copy.state !== "readable")
|
|
92
|
+
return `${copy.path} (could not be read)`;
|
|
93
|
+
return copy.stated === undefined ? copy.path : `${copy.path} (${statedVersionNote(copy.stated)})`;
|
|
94
|
+
}
|
|
95
|
+
async function findingOf(cli, folder, install, ctx) {
|
|
96
|
+
const paths = await homeCopiesOf(cli.name, ctx.env);
|
|
97
|
+
const [copies, shipped] = await Promise.all([
|
|
98
|
+
Promise.all(paths.map(homeCopyAt)),
|
|
99
|
+
orMissing(readFile(join(ctx.packageRoot, folder, "SKILL.md"), "utf8")),
|
|
100
|
+
]);
|
|
101
|
+
const message = copies.map(describeCopy).join("; ");
|
|
102
|
+
// A package whose own skill states a version would rewrite it, so a fix would never clear the row.
|
|
103
|
+
const shipsStated = shipped !== undefined && skillVersionIn(shipped) !== undefined;
|
|
104
|
+
const healthy = copies.every((copy) => copy.state === "readable" && (copy.stated === undefined || shipsStated));
|
|
105
|
+
return healthy
|
|
106
|
+
? { state: "ok", message }
|
|
107
|
+
: { state: "problem", message, fix: `${install.runAs} setup` };
|
|
108
|
+
}
|
|
109
|
+
/** A skill the package ships, which `setup` and `update` copy under home. */
|
|
110
|
+
export function homeSkill(cli, { folder }, install) {
|
|
111
|
+
return {
|
|
112
|
+
builtIns: {},
|
|
113
|
+
rows: [{ name: "skill", advisory: true, run: (ctx) => findingOf(cli, folder, install, ctx) }],
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=home.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../../src/built-ins/skill/home.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,18 +6,5 @@ export declare function skillCopyOf(cli: Pick<SkillCli, "name">, cwd: string): P
|
|
|
6
6
|
readonly root: string;
|
|
7
7
|
readonly copy: string;
|
|
8
8
|
}>;
|
|
9
|
-
/** The `metadata.version` each SKILL.md states, null for none; `copyVersion` is undefined with no copy. */
|
|
10
|
-
interface SkillVersions {
|
|
11
|
-
readonly packageVersion: string | null;
|
|
12
|
-
readonly copyVersion: string | null | undefined;
|
|
13
|
-
/**
|
|
14
|
-
* The copy states the package's version, so a file of it that differs was edited by hand; a copy
|
|
15
|
-
* of another version, or none, is an older install.
|
|
16
|
-
*/
|
|
17
|
-
readonly same: boolean;
|
|
18
|
-
}
|
|
19
|
-
/** The versions of the package's skill in `source` and of its copy in `copy`. */
|
|
20
|
-
export declare function skillVersionsOf(source: string, copy: string): Promise<SkillVersions>;
|
|
21
9
|
/** The built-in `skill install`, for a CLI whose skill ships in its package. */
|
|
22
10
|
export declare function skillInstallCommand(cli: SkillCli, folder: string, agents: AgentsSection | undefined): Command;
|
|
23
|
-
export {};
|
|
@@ -1,36 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { join
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
3
|
import * as z from "zod";
|
|
4
|
-
import { FORCE_FLAG } from "../../command-line/flags.js";
|
|
5
|
-
import { OUTPUT_EXISTS } from "../../context/outputs.js";
|
|
6
4
|
import { defineCommand } from "../../define-command.js";
|
|
7
|
-
import {
|
|
5
|
+
import { orMissing } from "../../errors.js";
|
|
8
6
|
import { agentsMdAt, handEditsAt, withSection, } from "../agents-md.js";
|
|
9
7
|
import { projectRootOf } from "../project-root.js";
|
|
10
|
-
import {
|
|
8
|
+
import { applySync, syncOf } from "./sync.js";
|
|
11
9
|
/** The project root and the Skill copy under it, as `skill install` writes it. */
|
|
12
10
|
export async function skillCopyOf(cli, cwd) {
|
|
13
11
|
const root = await projectRootOf(cwd);
|
|
14
12
|
return { root, copy: join(root, ".claude", "skills", cli.name) };
|
|
15
13
|
}
|
|
16
|
-
/** Every file under `dir`, relative to it and sorted; none when `dir` is missing. */
|
|
17
|
-
async function filesIn(dir) {
|
|
18
|
-
const entries = await orMissing(readdir(dir, { recursive: true, withFileTypes: true }));
|
|
19
|
-
return (entries ?? [])
|
|
20
|
-
.filter((entry) => entry.isFile())
|
|
21
|
-
.map((entry) => relative(dir, join(entry.parentPath, entry.name)))
|
|
22
|
-
.sort();
|
|
23
|
-
}
|
|
24
|
-
/** The versions of the package's skill in `source` and of its copy in `copy`. */
|
|
25
|
-
export async function skillVersionsOf(source, copy) {
|
|
26
|
-
const [shipped, installed] = await Promise.all([
|
|
27
|
-
readFile(join(source, "SKILL.md"), "utf8"),
|
|
28
|
-
orMissing(readFile(join(copy, "SKILL.md"), "utf8")),
|
|
29
|
-
]);
|
|
30
|
-
const packageVersion = skillVersionIn(shipped) ?? null;
|
|
31
|
-
const copyVersion = installed === undefined ? undefined : (skillVersionIn(installed) ?? null);
|
|
32
|
-
return { packageVersion, copyVersion, same: copyVersion === packageVersion };
|
|
33
|
-
}
|
|
34
14
|
const installSchema = z.object({
|
|
35
15
|
copy: z.string(),
|
|
36
16
|
written: z.array(z.string()),
|
|
@@ -38,22 +18,10 @@ const installSchema = z.object({
|
|
|
38
18
|
agentsMd: z.object({ path: z.string(), changed: z.boolean() }).nullable(),
|
|
39
19
|
handEdits: z.array(z.string()),
|
|
40
20
|
});
|
|
41
|
-
async function sameContent(left, right) {
|
|
42
|
-
const [a, b] = await Promise.all([readFile(left), readFile(right)]);
|
|
43
|
-
return a.equals(b);
|
|
44
|
-
}
|
|
45
21
|
async function planOf(cli, folder, agents, cwd, packageRoot) {
|
|
46
|
-
const source = join(packageRoot, folder);
|
|
47
22
|
const { root, copy } = await skillCopyOf(cli, cwd);
|
|
48
|
-
const [shipped, present] = await Promise.all([filesIn(source), filesIn(copy)]);
|
|
49
|
-
const differs = await Promise.all(shipped.map(async (file) => present.includes(file) && !(await sameContent(join(source, file), join(copy, file)))));
|
|
50
23
|
return {
|
|
51
|
-
|
|
52
|
-
copy,
|
|
53
|
-
write: shipped.filter((file) => !present.includes(file)),
|
|
54
|
-
replace: shipped.filter((_file, index) => differs[index]),
|
|
55
|
-
remove: present.filter((file) => !shipped.includes(file)),
|
|
56
|
-
sameVersion: (await skillVersionsOf(source, copy)).same,
|
|
24
|
+
...(await syncOf(join(packageRoot, folder), copy)),
|
|
57
25
|
agentsMd: agents === undefined ? null : await agentsMdAt(agents, root),
|
|
58
26
|
handEdits: agents === undefined ? [] : await handEditsAt(root),
|
|
59
27
|
};
|
|
@@ -101,16 +69,6 @@ function renderInstalled(cli, data) {
|
|
|
101
69
|
...data.handEdits.map((edit) => `by hand: ${edit}`),
|
|
102
70
|
].join("\n");
|
|
103
71
|
}
|
|
104
|
-
// The Runtime's `outputs` refusal says "overwrite", so a removal is refused here, before any write.
|
|
105
|
-
function editedRemovals(plan, ctx) {
|
|
106
|
-
const them = plan.remove.length === 1 ? "it" : "them";
|
|
107
|
-
return new CliError({
|
|
108
|
-
code: OUTPUT_EXISTS,
|
|
109
|
-
message: `skill install would remove ${plan.remove.map((file) => join(plan.copy, file)).join(", ")}`,
|
|
110
|
-
hint: `once the user agrees to remove ${them}, run the Next step`,
|
|
111
|
-
next: [ctx.rerun({ add: [FORCE_FLAG.flag] })],
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
72
|
/** The built-in `skill install`, for a CLI whose skill ships in its package. */
|
|
115
73
|
export function skillInstallCommand(cli, folder, agents) {
|
|
116
74
|
return defineCommand({
|
|
@@ -123,19 +81,10 @@ export function skillInstallCommand(cli, folder, agents) {
|
|
|
123
81
|
],
|
|
124
82
|
effect: "write",
|
|
125
83
|
output: installSchema,
|
|
126
|
-
force: "replace or remove hand-edited files of a skill copy at the package's version",
|
|
127
84
|
plan: (_input, ctx) => planOf(cli, folder, agents, ctx.cwd, ctx.packageRoot),
|
|
128
|
-
// The copy lives in the project repo, so git keeps an edit
|
|
129
|
-
outputs: (plan) => plan.sameVersion ? [...plan.write, ...plan.replace].map((file) => join(plan.copy, file)) : [],
|
|
85
|
+
// The copy lives in the project repo, so git keeps an edit this replaces.
|
|
130
86
|
apply: async (plan, ctx) => {
|
|
131
|
-
|
|
132
|
-
throw editedRemovals(plan, ctx);
|
|
133
|
-
for (const file of [...plan.write, ...plan.replace]) {
|
|
134
|
-
await ctx.files.write(join(plan.copy, file), await readFile(join(plan.source, file)));
|
|
135
|
-
}
|
|
136
|
-
for (const file of plan.remove) {
|
|
137
|
-
await ctx.files.remove(join(plan.copy, file));
|
|
138
|
-
}
|
|
87
|
+
await applySync(plan, ctx);
|
|
139
88
|
const { agentsMd } = plan;
|
|
140
89
|
if (agentsMd !== null && agentsMd.change !== null) {
|
|
141
90
|
const existing = (await orMissing(readFile(agentsMd.path, "utf8"))) ?? "";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-command.js","sourceRoot":"","sources":["../../../src/built-ins/skill/install-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"install-command.js","sourceRoot":"","sources":["../../../src/built-ins/skill/install-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { SkillSource } from "../../define.js";
|
|
2
|
+
import type { Install } from "../install/install.js";
|
|
3
|
+
import type { Skill, SkillCli } from "./skill.js";
|
|
4
|
+
/** A skill the package ships in `folder`, which `skill install` copies to the project root. */
|
|
5
|
+
export declare function projectSkill(cli: SkillCli, { folder, agents: text }: SkillSource, install: Install): Skill;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { readFile, realpath } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { orMissing } from "../../errors.js";
|
|
4
|
+
import { agentsRow } from "../agents-md.js";
|
|
5
|
+
import { homeOf, skillVersionIn, statedVersionNote } from "./home.js";
|
|
6
|
+
import { skillCopyOf, skillInstallCommand } from "./install-command.js";
|
|
7
|
+
// A project that is home itself has its copy under home, which shadows nothing.
|
|
8
|
+
async function personalCopyOf(name, copy, ctx) {
|
|
9
|
+
const home = join(homeOf(ctx.env), ".claude", "skills", name);
|
|
10
|
+
const real = await orMissing(realpath(home));
|
|
11
|
+
return real === undefined || real === (await orMissing(realpath(copy))) ? undefined : home;
|
|
12
|
+
}
|
|
13
|
+
/** The project root's copy against the package's, and any under home. */
|
|
14
|
+
async function findingOf(cli, folder, install, ctx) {
|
|
15
|
+
const { copy } = await skillCopyOf(cli, ctx.cwd);
|
|
16
|
+
const [installed, shipped] = await Promise.all([
|
|
17
|
+
orMissing(readFile(join(copy, "SKILL.md"), "utf8")),
|
|
18
|
+
readFile(join(ctx.packageRoot, folder, "SKILL.md"), "utf8"),
|
|
19
|
+
]);
|
|
20
|
+
const stated = installed === undefined ? undefined : skillVersionIn(installed);
|
|
21
|
+
// A package whose own skill states a version would rewrite it, so a fix would never clear the row.
|
|
22
|
+
const left = stated !== undefined && skillVersionIn(shipped) === undefined;
|
|
23
|
+
const found = left ? `${copy} (${statedVersionNote(stated)})` : copy;
|
|
24
|
+
const head = installed === undefined ? `no copy of the ${cli.name} skill at ${copy}` : found;
|
|
25
|
+
const home = await personalCopyOf(cli.name, copy, ctx);
|
|
26
|
+
// Other projects may use the personal copy, so the row names it and gives no line removing it.
|
|
27
|
+
const message = home === undefined
|
|
28
|
+
? head
|
|
29
|
+
: `${head}; remove ${home}: Claude Code prefers a personal skill over the project's`;
|
|
30
|
+
if (installed === undefined || left) {
|
|
31
|
+
return { state: "problem", message, fix: `${install.runAs} skill install` };
|
|
32
|
+
}
|
|
33
|
+
return home === undefined ? { state: "ok", message } : { state: "problem", message };
|
|
34
|
+
}
|
|
35
|
+
/** A skill the package ships in `folder`, which `skill install` copies to the project root. */
|
|
36
|
+
export function projectSkill(cli, { folder, agents: text }, install) {
|
|
37
|
+
const agents = text === undefined ? undefined : { name: cli.name, text };
|
|
38
|
+
return {
|
|
39
|
+
builtIns: { skill: { install: skillInstallCommand(cli, folder, agents) } },
|
|
40
|
+
rows: [
|
|
41
|
+
{ name: "skill", advisory: true, run: (ctx) => findingOf(cli, folder, install, ctx) },
|
|
42
|
+
...(agents === undefined ? [] : [agentsRow(agents, install)]),
|
|
43
|
+
],
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/built-ins/skill/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +1,11 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
/** What the CLI's skill copies were found to be; the fix brings them to the version asked about. */
|
|
6
|
-
export type SkillFinding = Exclude<DoctorFinding, {
|
|
7
|
-
readonly state: "skipped";
|
|
8
|
-
}>;
|
|
9
|
-
/** Where the Skill copies and the package's own skill are found. */
|
|
10
|
-
export type SkillPlace = Pick<Context, "cwd" | "env" | "packageRoot">;
|
|
11
|
-
export interface SkillNoticeLaunch {
|
|
12
|
-
readonly builtIn: boolean;
|
|
13
|
-
readonly bin: string | undefined;
|
|
14
|
-
}
|
|
15
|
-
/** Where the CLI's skill comes from, and everything that differs by it. */
|
|
1
|
+
import type { Cli, Commands, DoctorCheck } from "../../define.js";
|
|
2
|
+
import type { Install, InstallCli } from "../install/install.js";
|
|
3
|
+
export type SkillCli = Pick<Cli, "name" | "description" | "version" | "skill" | "docs" | "commands">;
|
|
4
|
+
/** Where the Skill copy goes, and everything that differs by it. */
|
|
16
5
|
export interface Skill {
|
|
17
|
-
readonly kind: "hub" | "packaged";
|
|
18
6
|
readonly builtIns: Commands;
|
|
19
|
-
/**
|
|
20
|
-
* Its `doctor` rows. A skill describes the CLI but never stops it working: a Skill Hub's row is
|
|
21
|
-
* always ok, and a Packaged skill's problems are advisory.
|
|
22
|
-
*/
|
|
7
|
+
/** Its `doctor` rows, advisory: a skill never stops the CLI working. */
|
|
23
8
|
readonly rows: readonly DoctorCheck[];
|
|
24
|
-
/** Run before a Command, so an agent that rarely runs `doctor` still hears of a misleading copy. */
|
|
25
|
-
readonly notice: (launch: SkillNoticeLaunch, ctx: Context) => Promise<void>;
|
|
26
|
-
/** Each Skill copy whose version differs from this build's, described; none when all match. */
|
|
27
|
-
readonly differing: (place: SkillPlace) => Promise<string[]>;
|
|
28
|
-
/**
|
|
29
|
-
* `update`'s Next steps for the copies against the latest release `version`; what no line fixes,
|
|
30
|
-
* it tells as a Notice.
|
|
31
|
-
*/
|
|
32
|
-
readonly nextAt: (version: string, ctx: Context) => Promise<string[]>;
|
|
33
9
|
}
|
|
34
|
-
/** A
|
|
35
|
-
export declare function skillOf(cli:
|
|
10
|
+
/** A Global install's Skill copy goes under home; any other goes under the project. */
|
|
11
|
+
export declare function skillOf(cli: InstallCli, install: Install): Skill;
|
|
@@ -1,10 +1,22 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import { homeSkill } from "./home.js";
|
|
2
|
+
import { projectSkill } from "./project.js";
|
|
3
|
+
const noSkill = ({ name }) => ({
|
|
4
|
+
builtIns: {},
|
|
5
|
+
rows: [
|
|
6
|
+
{
|
|
7
|
+
name: "skill",
|
|
8
|
+
advisory: true,
|
|
9
|
+
run: async () => ({ state: "skipped", message: `not checked: ${name} declares no skill` }),
|
|
10
|
+
},
|
|
11
|
+
],
|
|
12
|
+
});
|
|
13
|
+
/** A Global install's Skill copy goes under home; any other goes under the project. */
|
|
4
14
|
export function skillOf(cli, install) {
|
|
5
15
|
const { skill } = cli;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
16
|
+
if (skill === undefined)
|
|
17
|
+
return noSkill(cli);
|
|
18
|
+
return cli.install?.mode === "global"
|
|
19
|
+
? homeSkill(cli, skill, install)
|
|
20
|
+
: projectSkill(cli, skill, install);
|
|
9
21
|
}
|
|
10
22
|
//# sourceMappingURL=skill.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/built-ins/skill/skill.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"skill.js","sourceRoot":"","sources":["../../../src/built-ins/skill/skill.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAc5C,MAAM,OAAO,GAAG,CAAC,EAAE,IAAI,EAAqB,EAAS,EAAE,CAAC,CAAC;IACvD,QAAQ,EAAE,EAAE;IACZ,IAAI,EAAE;QACJ;YACE,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,IAAI;YACd,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,CAAC;SAC3F;KACF;CACF,CAAC,CAAC;AAEH,uFAAuF;AACvF,MAAM,UAAU,OAAO,CAAC,GAAe,EAAE,OAAgB;IACvD,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IACtB,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7C,OAAO,GAAG,CAAC,OAAO,EAAE,IAAI,KAAK,QAAQ;QACnC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC;QAChC,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { Context } from "../../context.js";
|
|
2
|
+
/** What makes a Skill copy match the package's folder. */
|
|
3
|
+
export interface SkillSync {
|
|
4
|
+
readonly source: string;
|
|
5
|
+
readonly copy: string;
|
|
6
|
+
/** Files of the package the copy lacks, relative to both folders. */
|
|
7
|
+
readonly write: readonly string[];
|
|
8
|
+
/** Files whose content differs from the package's. */
|
|
9
|
+
readonly replace: readonly string[];
|
|
10
|
+
/** Files of the copy the package no longer has. */
|
|
11
|
+
readonly remove: readonly string[];
|
|
12
|
+
}
|
|
13
|
+
/** Every file under `dir`, relative to it and sorted; none when `dir` is missing. */
|
|
14
|
+
export declare function filesIn(dir: string): Promise<string[]>;
|
|
15
|
+
export declare function syncOf(source: string, copy: string): Promise<SkillSync>;
|
|
16
|
+
export declare function applySync(sync: SkillSync, ctx: Context): Promise<void>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
import { orMissing } from "../../errors.js";
|
|
4
|
+
/** Every file under `dir`, relative to it and sorted; none when `dir` is missing. */
|
|
5
|
+
export async function filesIn(dir) {
|
|
6
|
+
const entries = await orMissing(readdir(dir, { recursive: true, withFileTypes: true }));
|
|
7
|
+
return (entries ?? [])
|
|
8
|
+
.filter((entry) => entry.isFile())
|
|
9
|
+
.map((entry) => relative(dir, join(entry.parentPath, entry.name)))
|
|
10
|
+
.sort();
|
|
11
|
+
}
|
|
12
|
+
async function sameContent(left, right) {
|
|
13
|
+
const [a, b] = await Promise.all([readFile(left), readFile(right)]);
|
|
14
|
+
return a.equals(b);
|
|
15
|
+
}
|
|
16
|
+
export async function syncOf(source, copy) {
|
|
17
|
+
const [shipped, present] = await Promise.all([filesIn(source), filesIn(copy)]);
|
|
18
|
+
const differs = await Promise.all(shipped.map(async (file) => present.includes(file) && !(await sameContent(join(source, file), join(copy, file)))));
|
|
19
|
+
return {
|
|
20
|
+
source,
|
|
21
|
+
copy,
|
|
22
|
+
write: shipped.filter((file) => !present.includes(file)),
|
|
23
|
+
replace: shipped.filter((_file, index) => differs[index]),
|
|
24
|
+
remove: present.filter((file) => !shipped.includes(file)),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
export async function applySync(sync, ctx) {
|
|
28
|
+
for (const file of [...sync.write, ...sync.replace]) {
|
|
29
|
+
await ctx.files.write(join(sync.copy, file), await readFile(join(sync.source, file)));
|
|
30
|
+
}
|
|
31
|
+
for (const file of sync.remove) {
|
|
32
|
+
await ctx.files.remove(join(sync.copy, file));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/built-ins/skill/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Command, GlobalInstall } from "../define.js";
|
|
2
2
|
import type { Launch } from "./commands.js";
|
|
3
|
-
import type {
|
|
3
|
+
import type { SkillCli } from "./skill/skill.js";
|
|
4
4
|
/** The built-in `update`, for a CLI installed globally with npm. */
|
|
5
|
-
export declare function updateCommand(cli: SkillCli, install: GlobalInstall,
|
|
5
|
+
export declare function updateCommand(cli: SkillCli, install: GlobalInstall, { bin, node }: Launch): Command;
|