@duyquangnvx/agent-cli 0.14.0 → 0.15.1
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 +18 -0
- package/dist/agent-cli.js +3 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/built-ins/agents-md.d.ts +16 -0
- package/dist/built-ins/agents-md.js +80 -0
- package/dist/built-ins/agents-md.js.map +1 -0
- package/dist/built-ins/commands.js +5 -6
- package/dist/built-ins/commands.js.map +1 -1
- package/dist/built-ins/doctor-rows.js +12 -92
- package/dist/built-ins/doctor-rows.js.map +1 -1
- package/dist/built-ins/doctor.js +2 -2
- package/dist/built-ins/doctor.js.map +1 -1
- package/dist/built-ins/install/dependency.d.ts +4 -0
- package/dist/built-ins/{dependency-install.js → install/dependency.js} +39 -88
- package/dist/built-ins/install/dependency.js.map +1 -0
- package/dist/built-ins/{global-install.d.ts → install/global-npm.d.ts} +6 -3
- package/dist/built-ins/{global-install.js → install/global-npm.js} +30 -18
- package/dist/built-ins/install/global-npm.js.map +1 -0
- package/dist/built-ins/install/global.d.ts +4 -0
- package/dist/built-ins/install/global.js +44 -0
- package/dist/built-ins/install/global.js.map +1 -0
- package/dist/built-ins/install/install.d.ts +39 -0
- package/dist/built-ins/install/install.js +26 -0
- package/dist/built-ins/install/install.js.map +1 -0
- package/dist/built-ins/install/run-as.d.ts +3 -0
- package/dist/built-ins/install/run-as.js +5 -0
- package/dist/built-ins/install/run-as.js.map +1 -0
- package/dist/built-ins/npm.d.ts +2 -6
- package/dist/built-ins/npm.js +0 -24
- package/dist/built-ins/npm.js.map +1 -1
- package/dist/built-ins/skill/hub.d.ts +7 -0
- package/dist/built-ins/{skills.js → skill/hub.js} +32 -7
- package/dist/built-ins/skill/hub.js.map +1 -0
- package/dist/built-ins/skill/install-command.d.ts +23 -0
- package/dist/built-ins/{skill-install.js → skill/install-command.js} +40 -61
- package/dist/built-ins/skill/install-command.js.map +1 -0
- package/dist/built-ins/skill/packaged.d.ts +12 -0
- package/dist/built-ins/skill/packaged.js +86 -0
- package/dist/built-ins/skill/packaged.js.map +1 -0
- package/dist/built-ins/skill/skill.d.ts +28 -0
- package/dist/built-ins/skill/skill.js +10 -0
- package/dist/built-ins/skill/skill.js.map +1 -0
- package/dist/built-ins/update.d.ts +3 -2
- package/dist/built-ins/update.js +8 -15
- package/dist/built-ins/update.js.map +1 -1
- package/dist/define.d.ts +6 -2
- package/dist/define.js.map +1 -1
- package/dist/error-table.d.ts +25 -2
- package/dist/error-table.js +4 -1
- package/dist/error-table.js.map +1 -1
- package/dist/errors.d.ts +2 -0
- package/dist/errors.js +14 -3
- package/dist/errors.js.map +1 -1
- package/dist/exit-classes.js +5 -4
- package/dist/exit-classes.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/project-root.d.ts +24 -0
- package/dist/project-root.js +69 -0
- package/dist/project-root.js.map +1 -0
- package/dist/run-cli.js +1 -1
- package/dist/run-cli.js.map +1 -1
- package/dist/run-command.js +8 -2
- package/dist/run-command.js.map +1 -1
- package/package.json +1 -1
- package/dist/built-ins/dependency-install.d.ts +0 -67
- package/dist/built-ins/dependency-install.js.map +0 -1
- package/dist/built-ins/global-install.js.map +0 -1
- package/dist/built-ins/packaged-skill.d.ts +0 -38
- package/dist/built-ins/packaged-skill.js +0 -80
- package/dist/built-ins/packaged-skill.js.map +0 -1
- package/dist/built-ins/skill-install.d.ts +0 -3
- package/dist/built-ins/skill-install.js.map +0 -1
- package/dist/built-ins/skills.d.ts +0 -21
- package/dist/built-ins/skills.js.map +0 -1
- package/dist/run-as.d.ts +0 -6
- package/dist/run-as.js +0 -8
- package/dist/run-as.js.map +0 -1
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { lstat, realpath } from "node:fs/promises";
|
|
2
|
-
import {
|
|
3
|
-
import { CliError,
|
|
4
|
-
import {
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { CliError, orMissing } from "../../errors.js";
|
|
4
|
+
import { isInside } from "../../project-root.js";
|
|
5
|
+
import { globalPrefix, installCommandLine, npmContext, scopeOf, } from "../npm.js";
|
|
5
6
|
export const NOT_GLOBAL_INSTALL = "NOT_GLOBAL_INSTALL";
|
|
6
7
|
/** Where npm puts global packages under its global prefix. */
|
|
7
8
|
export function globalModulesDir(prefix) {
|
|
@@ -16,18 +17,6 @@ function notGlobal(ctx, message) {
|
|
|
16
17
|
hint: `install it with npm, so \`${ctx.cliName} update\` can replace it: ${installCommandLine(ctx.registry)}`,
|
|
17
18
|
});
|
|
18
19
|
}
|
|
19
|
-
async function realpathOrUndefined(path) {
|
|
20
|
-
return realpath(path).catch((error) => {
|
|
21
|
-
if (isMissingFile(error))
|
|
22
|
-
return undefined;
|
|
23
|
-
throw error;
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
/** Whether `path` lies strictly inside `dir`. */
|
|
27
|
-
export function isInside(dir, path) {
|
|
28
|
-
const inner = relative(dir, path);
|
|
29
|
-
return inner !== "" && !inner.startsWith("..") && !isAbsolute(inner);
|
|
30
|
-
}
|
|
31
20
|
/**
|
|
32
21
|
* The global npm install this copy runs from, found by asking npm for its global prefix.
|
|
33
22
|
* `bin` is the script that started the CLI; throws `NOT_GLOBAL_INSTALL` when it is not inside that install.
|
|
@@ -38,8 +27,8 @@ export async function globalInstallOf(bin, ctx) {
|
|
|
38
27
|
}
|
|
39
28
|
const prefix = await globalPrefix(ctx);
|
|
40
29
|
const packageDir = join(globalModulesDir(prefix), ctx.registry.package);
|
|
41
|
-
const installed = await
|
|
42
|
-
const here = (await
|
|
30
|
+
const installed = await orMissing(realpath(packageDir));
|
|
31
|
+
const here = (await orMissing(realpath(bin))) ?? bin;
|
|
43
32
|
if (installed === undefined || !isInside(installed, here)) {
|
|
44
33
|
throw notGlobal(ctx, `${ctx.cliName} runs from ${here}, not from npm's global install at ${packageDir}`);
|
|
45
34
|
}
|
|
@@ -49,4 +38,27 @@ export async function globalInstallOf(bin, ctx) {
|
|
|
49
38
|
}
|
|
50
39
|
return { prefix, packageDir };
|
|
51
40
|
}
|
|
52
|
-
|
|
41
|
+
const NPMJS = "https://registry.npmjs.org/";
|
|
42
|
+
/** The flag that points npm at the CLI's registry; none for npmjs, npm's default. */
|
|
43
|
+
function registryFlags({ package: name, registry }) {
|
|
44
|
+
if (registry === NPMJS)
|
|
45
|
+
return [];
|
|
46
|
+
const scope = scopeOf(name);
|
|
47
|
+
return [scope === undefined ? `--registry=${registry}` : `--${scope}:registry=${registry}`];
|
|
48
|
+
}
|
|
49
|
+
function globalRegistry(install) {
|
|
50
|
+
const { package: name, registry } = install;
|
|
51
|
+
return {
|
|
52
|
+
package: name,
|
|
53
|
+
label: registry,
|
|
54
|
+
flags: registryFlags(install),
|
|
55
|
+
unreachableHint: "check the network or VPN",
|
|
56
|
+
loginHint: `log in to ${registry} (\`npm login --registry=${registry}\`) or set its token in ~/.npmrc`,
|
|
57
|
+
missingHint: `check that ${name} is published on ${registry}`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** npm for a Global install, run in the working directory. */
|
|
61
|
+
export function globalNpm(cli, install, ctx, node) {
|
|
62
|
+
return npmContext(cli, globalRegistry(install), ctx, node, ctx.cwd);
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=global-npm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global-npm.js","sourceRoot":"","sources":["../../../src/built-ins/install/global-npm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { GlobalInstall } from "../../define.js";
|
|
2
|
+
import type { Install, InstallCli } from "./install.js";
|
|
3
|
+
/** The Install of a CLI installed once per machine with npm, which `update` replaces. */
|
|
4
|
+
export declare function globalInstall(cli: InstallCli, install: GlobalInstall): Install;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { CliError } from "../../errors.js";
|
|
2
|
+
import { installCommandLine } from "../npm.js";
|
|
3
|
+
import { skillOf } from "../skill/skill.js";
|
|
4
|
+
import { updateCommand } from "../update.js";
|
|
5
|
+
import { globalInstallOf, globalNpm, NOT_GLOBAL_INSTALL } from "./global-npm.js";
|
|
6
|
+
import { runAsOf } from "./run-as.js";
|
|
7
|
+
function checkOf(cli, install, { bin, node }) {
|
|
8
|
+
return {
|
|
9
|
+
install: async (ctx) => {
|
|
10
|
+
const npm = globalNpm(cli, install, ctx, node);
|
|
11
|
+
try {
|
|
12
|
+
const copy = await globalInstallOf(bin, npm);
|
|
13
|
+
return { state: "ok", message: `a global npm install under ${copy.prefix}` };
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
if (error instanceof CliError && error.code === NOT_GLOBAL_INSTALL) {
|
|
17
|
+
return {
|
|
18
|
+
state: "problem",
|
|
19
|
+
message: error.message,
|
|
20
|
+
fix: installCommandLine(npm.registry),
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
release: async (ctx) => {
|
|
27
|
+
const fix = `${cli.name} update`;
|
|
28
|
+
return { npm: globalNpm(cli, install, ctx, node), advise: () => ({ fix }) };
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** The Install of a CLI installed once per machine with npm, which `update` replaces. */
|
|
33
|
+
export function globalInstall(cli, install) {
|
|
34
|
+
const adapter = {
|
|
35
|
+
runAs: runAsOf(cli),
|
|
36
|
+
builtIns: (launch) => ({ update: updateCommand(cli, install, skillOf(cli, adapter), launch) }),
|
|
37
|
+
// `update` fails as the source's when the registry has no release.
|
|
38
|
+
exitClasses: ["source"],
|
|
39
|
+
agentsCaveat: undefined,
|
|
40
|
+
check: (launch) => checkOf(cli, install, launch),
|
|
41
|
+
};
|
|
42
|
+
return adapter;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=global.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"global.js","sourceRoot":"","sources":["../../../src/built-ins/install/global.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEjF,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,SAAS,OAAO,CAAC,GAAe,EAAE,OAAsB,EAAE,EAAE,GAAG,EAAE,IAAI,EAAU;IAC7E,OAAO;QACL,OAAO,EAAE,KAAK,EAAE,GAAY,EAA0B,EAAE;YACtD,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAC/C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAC7C,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,8BAA8B,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;oBACnE,OAAO;wBACL,KAAK,EAAE,SAAS;wBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,GAAG,EAAE,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC;qBACtC,CAAC;gBACJ,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,OAAO,EAAE,KAAK,EAAE,GAAY,EAAE,EAAE;YAC9B,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,SAAS,CAAC;YACjC,OAAO,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QAC9E,CAAC;KACF,CAAC;AACJ,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,aAAa,CAAC,GAAe,EAAE,OAAsB;IACnE,MAAM,OAAO,GAAY;QACvB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC;QACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9F,mEAAmE;QACnE,WAAW,EAAE,CAAC,QAAQ,CAAC;QACvB,YAAY,EAAE,SAAS;QACvB,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC;KACjD,CAAC;IACF,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Context } from "../../context.js";
|
|
2
|
+
import type { Commands, CommandTreeCli, DoctorFinding } from "../../define.js";
|
|
3
|
+
import type { DeclaredExitClass } from "../../error-table.js";
|
|
4
|
+
import type { Launch } from "../commands.js";
|
|
5
|
+
import type { NpmContext } from "../npm.js";
|
|
6
|
+
import type { SkillCli } from "../skill/skill.js";
|
|
7
|
+
export type InstallCli = SkillCli & Pick<CommandTreeCli, "install">;
|
|
8
|
+
/** What tells the operator how to move a build behind the latest release. */
|
|
9
|
+
export type Advice = {
|
|
10
|
+
readonly fix: string;
|
|
11
|
+
} | {
|
|
12
|
+
readonly note: string;
|
|
13
|
+
};
|
|
14
|
+
/** The npm to ask for the latest release, and how to move a build behind it. */
|
|
15
|
+
interface ReleaseLookup {
|
|
16
|
+
readonly npm: NpmContext;
|
|
17
|
+
readonly advise: (latest: string) => Advice;
|
|
18
|
+
}
|
|
19
|
+
/** What one `doctor` run finds about the install: the `install` row, and where the `registry` row looks. */
|
|
20
|
+
export interface InstallCheck {
|
|
21
|
+
readonly install: (ctx: Context) => Promise<DoctorFinding>;
|
|
22
|
+
readonly release: (ctx: Context) => Promise<ReleaseLookup | {
|
|
23
|
+
readonly skipped: DoctorFinding;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
/** How the CLI is installed, and everything that differs by it. */
|
|
27
|
+
export interface Install {
|
|
28
|
+
/** How every command line the Runtime gives its caller starts (ADR 0011). */
|
|
29
|
+
readonly runAs: string;
|
|
30
|
+
readonly builtIns: (launch: Launch) => Commands;
|
|
31
|
+
/** The Exit classes its Built-ins can end in, besides those every CLI can. */
|
|
32
|
+
readonly exitClasses: readonly DeclaredExitClass[];
|
|
33
|
+
/** What the CLI's block in AGENTS.md adds after saying to run it as the Run-as. */
|
|
34
|
+
readonly agentsCaveat: string | undefined;
|
|
35
|
+
/** Called once per `doctor` run. */
|
|
36
|
+
readonly check: (launch: Launch) => InstallCheck;
|
|
37
|
+
}
|
|
38
|
+
export declare function installOf(cli: InstallCli): Install;
|
|
39
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { dependencyInstall } from "./dependency.js";
|
|
2
|
+
import { globalInstall } from "./global.js";
|
|
3
|
+
import { runAsOf } from "./run-as.js";
|
|
4
|
+
function noInstall(cli) {
|
|
5
|
+
const skipped = async () => ({
|
|
6
|
+
state: "skipped",
|
|
7
|
+
message: `not checked: ${cli.name} declares no install`,
|
|
8
|
+
});
|
|
9
|
+
return {
|
|
10
|
+
runAs: runAsOf(cli),
|
|
11
|
+
builtIns: () => ({}),
|
|
12
|
+
exitClasses: [],
|
|
13
|
+
agentsCaveat: undefined,
|
|
14
|
+
check: () => ({
|
|
15
|
+
install: skipped,
|
|
16
|
+
release: async () => ({ skipped: await skipped() }),
|
|
17
|
+
}),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function installOf(cli) {
|
|
21
|
+
const { install } = cli;
|
|
22
|
+
if (install === undefined)
|
|
23
|
+
return noInstall(cli);
|
|
24
|
+
return install.mode === "global" ? globalInstall(cli, install) : dependencyInstall(cli, install);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/built-ins/install/install.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAgCtC,SAAS,SAAS,CAAC,GAAe;IAChC,MAAM,OAAO,GAAG,KAAK,IAA4B,EAAE,CAAC,CAAC;QACnD,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,gBAAgB,GAAG,CAAC,IAAI,sBAAsB;KACxD,CAAC,CAAC;IACH,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC;QACnB,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;QACpB,WAAW,EAAE,EAAE;QACf,YAAY,EAAE,SAAS;QACvB,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;YACZ,OAAO,EAAE,OAAO;YAChB,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,OAAO,EAAE,EAAE,CAAC;SACpD,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAe;IACvC,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IACxB,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC;IACjD,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACnG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-as.js","sourceRoot":"","sources":["../../../src/built-ins/install/run-as.ts"],"names":[],"mappings":"AAEA,qGAAqG;AACrG,MAAM,UAAU,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAA4C;IACjF,OAAO,OAAO,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC"}
|
package/dist/built-ins/npm.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Context, Env } from "../context.js";
|
|
2
|
-
import type { CommandTreeCli
|
|
2
|
+
import type { CommandTreeCli } from "../define.js";
|
|
3
3
|
export declare const REGISTRY_UNREACHABLE = "REGISTRY_UNREACHABLE";
|
|
4
4
|
export declare const REGISTRY_AUTH = "REGISTRY_AUTH";
|
|
5
5
|
export declare const INSTALL_FAILED = "INSTALL_FAILED";
|
|
@@ -34,13 +34,9 @@ export interface NpmContext {
|
|
|
34
34
|
}
|
|
35
35
|
/** Which kind of npm call failed, since the same npm code means different things for each. */
|
|
36
36
|
export type NpmCall = "prefix" | "view" | "install";
|
|
37
|
-
export declare function npmContext(cli: CommandTreeCli, registry: Registry, ctx: Context, node: string | undefined, cwd: string): NpmContext;
|
|
37
|
+
export declare function npmContext(cli: Pick<CommandTreeCli, "name">, registry: Registry, ctx: Context, node: string | undefined, cwd: string): NpmContext;
|
|
38
38
|
/** The `@scope` of a scoped package name. */
|
|
39
39
|
export declare function scopeOf(name: string): string | undefined;
|
|
40
|
-
/** The registry a Global install declares. */
|
|
41
|
-
export declare function globalRegistry(install: GlobalInstall): Registry;
|
|
42
|
-
/** npm for a Global install, run where the CLI was started. */
|
|
43
|
-
export declare function globalNpm(cli: CommandTreeCli, install: GlobalInstall, ctx: Context, node: string | undefined): NpmContext;
|
|
44
40
|
/** The command a person runs to install the CLI globally from its registry. */
|
|
45
41
|
export declare function installCommandLine(registry: Registry, version?: string): string;
|
|
46
42
|
/**
|
package/dist/built-ins/npm.js
CHANGED
|
@@ -22,7 +22,6 @@ export function npmContext(cli, registry, ctx, node, cwd) {
|
|
|
22
22
|
node,
|
|
23
23
|
};
|
|
24
24
|
}
|
|
25
|
-
const NPMJS = "https://registry.npmjs.org/";
|
|
26
25
|
const STDERR_TAIL_LINES = 10;
|
|
27
26
|
const RM_RETRIES = 3;
|
|
28
27
|
const NETWORK_CODES = new Set([
|
|
@@ -41,29 +40,6 @@ const NPM_CODE = /^npm (?:error|ERR!) code (\S+)$/m;
|
|
|
41
40
|
export function scopeOf(name) {
|
|
42
41
|
return /^(@[^/]+)\//.exec(name)?.[1];
|
|
43
42
|
}
|
|
44
|
-
/** The flag that points npm at the CLI's registry; none for npmjs, npm's default. */
|
|
45
|
-
function registryFlags({ package: name, registry }) {
|
|
46
|
-
if (registry === NPMJS)
|
|
47
|
-
return [];
|
|
48
|
-
const scope = scopeOf(name);
|
|
49
|
-
return [scope === undefined ? `--registry=${registry}` : `--${scope}:registry=${registry}`];
|
|
50
|
-
}
|
|
51
|
-
/** The registry a Global install declares. */
|
|
52
|
-
export function globalRegistry(install) {
|
|
53
|
-
const { package: name, registry } = install;
|
|
54
|
-
return {
|
|
55
|
-
package: name,
|
|
56
|
-
label: registry,
|
|
57
|
-
flags: registryFlags(install),
|
|
58
|
-
unreachableHint: "check the network or VPN",
|
|
59
|
-
loginHint: `log in to ${registry} (\`npm login --registry=${registry}\`) or set its token in ~/.npmrc`,
|
|
60
|
-
missingHint: `check that ${name} is published on ${registry}`,
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
/** npm for a Global install, run where the CLI was started. */
|
|
64
|
-
export function globalNpm(cli, install, ctx, node) {
|
|
65
|
-
return npmContext(cli, globalRegistry(install), ctx, node, process.cwd());
|
|
66
|
-
}
|
|
67
43
|
/** The command a person runs to install the CLI globally from its registry. */
|
|
68
44
|
export function installCommandLine(registry, version = "latest") {
|
|
69
45
|
return ["npm", "install", "--global", `${registry.package}@${version}`, ...registry.flags].join(" ");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm.js","sourceRoot":"","sources":["../../src/built-ins/npm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGrD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAoB,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,CAAC,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;AAC3D,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAC/C,MAAM,CAAC,MAAM,UAAU,GAAG,YAAY,CAAC;AACvC,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;AAkCrC,MAAM,UAAU,UAAU,CACxB,
|
|
1
|
+
{"version":3,"file":"npm.js","sourceRoot":"","sources":["../../src/built-ins/npm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Env } from "../../context.js";
|
|
2
|
+
import type { Skill, SkillCli } from "./skill.js";
|
|
3
|
+
/** The version a SKILL.md's frontmatter `metadata.version` states. */
|
|
4
|
+
export declare function skillVersionIn(skill: string): string | undefined;
|
|
5
|
+
export declare function homeOf(env: Env): string;
|
|
6
|
+
/** A skill that `npx skills add` installs from `source`, the Skill Hub; with no `source`, no line adds it. */
|
|
7
|
+
export declare function hubSkill(cli: SkillCli, source: string | undefined): Skill;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { readFile, realpath } from "node:fs/promises";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { join } from "node:path";
|
|
4
|
-
import { isMissingFile } from "
|
|
5
|
-
import { isVersion, standingOf } from "
|
|
4
|
+
import { isMissingFile } from "../../errors.js";
|
|
5
|
+
import { isVersion, standingOf } from "../semver.js";
|
|
6
6
|
// Everything here mirrors how the skills@1.7.2 installer (`npx skills`) behaves.
|
|
7
7
|
const SKILL_DIRS = [
|
|
8
8
|
[".claude", "skills"],
|
|
@@ -66,9 +66,34 @@ function fixFor(cliName, copies, source) {
|
|
|
66
66
|
}
|
|
67
67
|
return has("behind") || has("unversioned") ? update : undefined;
|
|
68
68
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
69
|
+
const SKILL_STATE_NOTES = {
|
|
70
|
+
current: "the same as this build",
|
|
71
|
+
behind: "older than this build",
|
|
72
|
+
ahead: "newer than this build",
|
|
73
|
+
unversioned: "states no metadata.version",
|
|
74
|
+
unreadable: "could not be read",
|
|
75
|
+
};
|
|
76
|
+
function describeCopy({ path, version, state }) {
|
|
77
|
+
return `${path}${version === undefined ? "" : ` ${version}`} (${SKILL_STATE_NOTES[state]})`;
|
|
73
78
|
}
|
|
74
|
-
|
|
79
|
+
/** A skill that `npx skills add` installs from `source`, the Skill Hub; with no `source`, no line adds it. */
|
|
80
|
+
export function hubSkill(cli, source) {
|
|
81
|
+
// `update` compares the copies with the latest release even when it installed nothing: the
|
|
82
|
+
// installer gives that release's skill.
|
|
83
|
+
const findingAt = async (version, ctx) => {
|
|
84
|
+
const copies = await skillCopies(cli.name, version, ctx);
|
|
85
|
+
const fix = fixFor(cli.name, copies, source);
|
|
86
|
+
const message = copies.length === 0
|
|
87
|
+
? `no copy of the ${cli.name} skill is installed`
|
|
88
|
+
: copies.map(describeCopy).join("; ");
|
|
89
|
+
return fix === undefined ? { state: "ok", message } : { state: "ok", message, fix };
|
|
90
|
+
};
|
|
91
|
+
return {
|
|
92
|
+
kind: "hub",
|
|
93
|
+
builtIns: {},
|
|
94
|
+
rows: [{ name: "skill", advisory: true, run: (ctx) => findingAt(cli.version, ctx) }],
|
|
95
|
+
notice: async () => { },
|
|
96
|
+
findingAt,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=hub.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub.js","sourceRoot":"","sources":["../../../src/built-ins/skill/hub.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type Command } from "../../define.js";
|
|
2
|
+
import type { Install } from "../install/install.js";
|
|
3
|
+
import type { SkillCli } from "./skill.js";
|
|
4
|
+
/** The project root and the Skill copy under it, as `skill install` writes it. */
|
|
5
|
+
export declare function skillCopyOf(cli: Pick<SkillCli, "name">, cwd: string): Promise<{
|
|
6
|
+
readonly root: string;
|
|
7
|
+
readonly copy: string;
|
|
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
|
+
/** The built-in `skill install`, for a CLI whose skill ships in its package. */
|
|
22
|
+
export declare function skillInstallCommand(cli: SkillCli, folder: string, install: Install): Command;
|
|
23
|
+
export {};
|
|
@@ -1,12 +1,36 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
|
-
import { join } from "node:path";
|
|
1
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
3
|
import * as z from "zod";
|
|
4
|
-
import { defineCommand } from "
|
|
5
|
-
import { CliError, orMissing } from "
|
|
6
|
-
import { FORCE_FLAG } from "
|
|
7
|
-
import { OUTPUT_EXISTS } from "
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
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 { projectRootOf } from "../../project-root.js";
|
|
9
|
+
import { agentsMdAt, handEditsAt, withBlock, } from "../agents-md.js";
|
|
10
|
+
import { skillVersionIn } from "./hub.js";
|
|
11
|
+
/** The project root and the Skill copy under it, as `skill install` writes it. */
|
|
12
|
+
export async function skillCopyOf(cli, cwd) {
|
|
13
|
+
const root = await projectRootOf(cwd);
|
|
14
|
+
return { root, copy: join(root, ".claude", "skills", cli.name) };
|
|
15
|
+
}
|
|
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
|
+
}
|
|
10
34
|
const installSchema = z.object({
|
|
11
35
|
copy: z.string(),
|
|
12
36
|
written: z.array(z.string()),
|
|
@@ -18,52 +42,11 @@ async function sameContent(left, right) {
|
|
|
18
42
|
const [a, b] = await Promise.all([readFile(left), readFile(right)]);
|
|
19
43
|
return a.equals(b);
|
|
20
44
|
}
|
|
21
|
-
|
|
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) {
|
|
45
|
+
async function planOf(cli, folder, install, cwd, packageRoot) {
|
|
61
46
|
const source = join(packageRoot, folder);
|
|
62
47
|
const { root, copy } = await skillCopyOf(cli, cwd);
|
|
63
48
|
const [shipped, present] = await Promise.all([filesIn(source), filesIn(copy)]);
|
|
64
49
|
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
50
|
return {
|
|
68
51
|
source,
|
|
69
52
|
copy,
|
|
@@ -71,11 +54,7 @@ async function planOf(cli, folder, cwd, packageRoot) {
|
|
|
71
54
|
replace: shipped.filter((_file, index) => differs[index]),
|
|
72
55
|
remove: present.filter((file) => !shipped.includes(file)),
|
|
73
56
|
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
|
-
},
|
|
57
|
+
agentsMd: await agentsMdAt(cli, install, root),
|
|
79
58
|
handEdits: await handEditsAt(root),
|
|
80
59
|
};
|
|
81
60
|
}
|
|
@@ -124,8 +103,8 @@ function editedRemovals(plan, ctx) {
|
|
|
124
103
|
});
|
|
125
104
|
}
|
|
126
105
|
/** The built-in `skill install`, for a CLI whose skill ships in its package. */
|
|
127
|
-
export function skillInstallCommand(cli, folder) {
|
|
128
|
-
const runAs =
|
|
106
|
+
export function skillInstallCommand(cli, folder, install) {
|
|
107
|
+
const { runAs } = install;
|
|
129
108
|
return defineCommand({
|
|
130
109
|
name: "install",
|
|
131
110
|
description: "copy this CLI's skill into the project and write its AGENTS.md block",
|
|
@@ -136,7 +115,7 @@ export function skillInstallCommand(cli, folder) {
|
|
|
136
115
|
effect: "write",
|
|
137
116
|
output: installSchema,
|
|
138
117
|
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),
|
|
118
|
+
plan: (_input, ctx) => planOf(cli, folder, install, ctx.cwd, ctx.packageRoot),
|
|
140
119
|
// The copy lives in the project repo, so git keeps an edit that an upgrade replaces.
|
|
141
120
|
outputs: (plan) => plan.sameVersion ? [...plan.write, ...plan.replace].map((file) => join(plan.copy, file)) : [],
|
|
142
121
|
apply: async (plan, ctx) => {
|
|
@@ -148,10 +127,10 @@ export function skillInstallCommand(cli, folder) {
|
|
|
148
127
|
for (const file of plan.remove) {
|
|
149
128
|
await ctx.files.remove(join(plan.copy, file));
|
|
150
129
|
}
|
|
151
|
-
const { path,
|
|
130
|
+
const { path, change } = plan.agentsMd;
|
|
152
131
|
if (change !== null) {
|
|
153
132
|
const existing = (await orMissing(readFile(path, "utf8"))) ?? "";
|
|
154
|
-
await ctx.files.write(path, withBlock(
|
|
133
|
+
await ctx.files.write(path, withBlock(cli, install, existing));
|
|
155
134
|
}
|
|
156
135
|
return {
|
|
157
136
|
copy: plan.copy,
|
|
@@ -165,4 +144,4 @@ export function skillInstallCommand(cli, folder) {
|
|
|
165
144
|
renderPlan: (plan) => renderPlan(cli, plan),
|
|
166
145
|
});
|
|
167
146
|
}
|
|
168
|
-
//# sourceMappingURL=
|
|
147
|
+
//# sourceMappingURL=install-command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,12 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import type { Install } from "../install/install.js";
|
|
3
|
+
import type { Skill, SkillCli } from "./skill.js";
|
|
4
|
+
/** What the `skill` row of a Packaged skill carries under `--json` beside its message. */
|
|
5
|
+
export declare const packagedSkillDetailsSchema: z.ZodObject<{
|
|
6
|
+
copy: z.ZodString;
|
|
7
|
+
copyVersion: z.ZodNullable<z.ZodString>;
|
|
8
|
+
packageVersion: z.ZodNullable<z.ZodString>;
|
|
9
|
+
home: z.ZodOptional<z.ZodString>;
|
|
10
|
+
}, z.core.$strip>;
|
|
11
|
+
/** A skill shipped in the package at `folder`, which `skill install` copies to the project root. */
|
|
12
|
+
export declare function packagedSkill(cli: SkillCli, folder: string, install: Install): Skill;
|