@duyquangnvx/agent-cli 0.15.0 → 0.16.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 +12 -0
- package/dist/agent-cli.js +3 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/built-ins/agents-md.d.ts +10 -5
- package/dist/built-ins/agents-md.js +17 -27
- package/dist/built-ins/agents-md.js.map +1 -1
- 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 -94
- 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} +38 -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 +43 -0
- package/dist/built-ins/install/global.js.map +1 -0
- package/dist/built-ins/install/install.d.ts +37 -0
- package/dist/built-ins/install/install.js +25 -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 +24 -0
- package/dist/built-ins/{skill-install.js → skill/install-command.js} +63 -30
- package/dist/built-ins/skill/install-command.js.map +1 -0
- package/dist/built-ins/skill/packaged.d.ts +13 -0
- package/dist/built-ins/{packaged-skill.js → skill/packaged.js} +28 -44
- 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 +13 -10
- package/dist/define.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 +5 -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 -45
- 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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency.js","sourceRoot":"","sources":["../../../src/built-ins/install/dependency.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Context } from "../../context.js";
|
|
2
|
+
import type { GlobalInstall } from "../../define.js";
|
|
3
|
+
import { type NpmContext } from "../npm.js";
|
|
4
|
+
import type { InstallCli } from "./install.js";
|
|
2
5
|
export declare const NOT_GLOBAL_INSTALL = "NOT_GLOBAL_INSTALL";
|
|
3
6
|
/** Where npm installed this copy of the CLI globally. */
|
|
4
7
|
export interface InstalledCopy {
|
|
@@ -7,10 +10,10 @@ export interface InstalledCopy {
|
|
|
7
10
|
}
|
|
8
11
|
/** Where npm puts global packages under its global prefix. */
|
|
9
12
|
export declare function globalModulesDir(prefix: string): string;
|
|
10
|
-
/** Whether `path` lies strictly inside `dir`. */
|
|
11
|
-
export declare function isInside(dir: string, path: string): boolean;
|
|
12
13
|
/**
|
|
13
14
|
* The global npm install this copy runs from, found by asking npm for its global prefix.
|
|
14
15
|
* `bin` is the script that started the CLI; throws `NOT_GLOBAL_INSTALL` when it is not inside that install.
|
|
15
16
|
*/
|
|
16
17
|
export declare function globalInstallOf(bin: string | undefined, ctx: NpmContext): Promise<InstalledCopy>;
|
|
18
|
+
/** npm for a Global install, run in the working directory. */
|
|
19
|
+
export declare function globalNpm(cli: InstallCli, install: GlobalInstall, ctx: Context, node: string | undefined): NpmContext;
|
|
@@ -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,43 @@
|
|
|
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
|
+
check: (launch) => checkOf(cli, install, launch),
|
|
40
|
+
};
|
|
41
|
+
return adapter;
|
|
42
|
+
}
|
|
43
|
+
//# 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,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,37 @@
|
|
|
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
|
+
/** Called once per `doctor` run. */
|
|
34
|
+
readonly check: (launch: Launch) => InstallCheck;
|
|
35
|
+
}
|
|
36
|
+
export declare function installOf(cli: InstallCli): Install;
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
check: () => ({
|
|
14
|
+
install: skipped,
|
|
15
|
+
release: async () => ({ skipped: await skipped() }),
|
|
16
|
+
}),
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export function installOf(cli) {
|
|
20
|
+
const { install } = cli;
|
|
21
|
+
if (install === undefined)
|
|
22
|
+
return noInstall(cli);
|
|
23
|
+
return install.mode === "global" ? globalInstall(cli, install) : dependencyInstall(cli, install);
|
|
24
|
+
}
|
|
25
|
+
//# 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;AA8BtC,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,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,24 @@
|
|
|
1
|
+
import { type Command } from "../../define.js";
|
|
2
|
+
import { type AgentsBlock } from "../agents-md.js";
|
|
3
|
+
import type { Install } from "../install/install.js";
|
|
4
|
+
import type { SkillCli } from "./skill.js";
|
|
5
|
+
/** The project root and the Skill copy under it, as `skill install` writes it. */
|
|
6
|
+
export declare function skillCopyOf(cli: Pick<SkillCli, "name">, cwd: string): Promise<{
|
|
7
|
+
readonly root: string;
|
|
8
|
+
readonly copy: string;
|
|
9
|
+
}>;
|
|
10
|
+
/** The `metadata.version` each SKILL.md states, null for none; `copyVersion` is undefined with no copy. */
|
|
11
|
+
interface SkillVersions {
|
|
12
|
+
readonly packageVersion: string | null;
|
|
13
|
+
readonly copyVersion: string | null | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* The copy states the package's version, so a file of it that differs was edited by hand; a copy
|
|
16
|
+
* of another version, or none, is an older install.
|
|
17
|
+
*/
|
|
18
|
+
readonly same: boolean;
|
|
19
|
+
}
|
|
20
|
+
/** The versions of the package's skill in `source` and of its copy in `copy`. */
|
|
21
|
+
export declare function skillVersionsOf(source: string, copy: string): Promise<SkillVersions>;
|
|
22
|
+
/** The built-in `skill install`, for a CLI whose skill ships in its package. */
|
|
23
|
+
export declare function skillInstallCommand(cli: SkillCli, folder: string, install: Install, agents: AgentsBlock | undefined): Command;
|
|
24
|
+
export {};
|
|
@@ -1,25 +1,48 @@
|
|
|
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 { agentsMdAt, handEditsAt, withBlock, } from "
|
|
10
|
-
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
|
+
}
|
|
11
34
|
const installSchema = z.object({
|
|
12
35
|
copy: z.string(),
|
|
13
36
|
written: z.array(z.string()),
|
|
14
37
|
removed: z.array(z.string()),
|
|
15
|
-
agentsMd: z.object({ path: z.string(), changed: z.boolean() }),
|
|
38
|
+
agentsMd: z.object({ path: z.string(), changed: z.boolean() }).nullable(),
|
|
16
39
|
handEdits: z.array(z.string()),
|
|
17
40
|
});
|
|
18
41
|
async function sameContent(left, right) {
|
|
19
42
|
const [a, b] = await Promise.all([readFile(left), readFile(right)]);
|
|
20
43
|
return a.equals(b);
|
|
21
44
|
}
|
|
22
|
-
async function planOf(cli, folder, cwd, packageRoot) {
|
|
45
|
+
async function planOf(cli, folder, agents, cwd, packageRoot) {
|
|
23
46
|
const source = join(packageRoot, folder);
|
|
24
47
|
const { root, copy } = await skillCopyOf(cli, cwd);
|
|
25
48
|
const [shipped, present] = await Promise.all([filesIn(source), filesIn(copy)]);
|
|
@@ -31,8 +54,8 @@ async function planOf(cli, folder, cwd, packageRoot) {
|
|
|
31
54
|
replace: shipped.filter((_file, index) => differs[index]),
|
|
32
55
|
remove: present.filter((file) => !shipped.includes(file)),
|
|
33
56
|
sameVersion: (await skillVersionsOf(source, copy)).same,
|
|
34
|
-
agentsMd: await agentsMdAt(
|
|
35
|
-
handEdits: await handEditsAt(root),
|
|
57
|
+
agentsMd: agents === undefined ? null : await agentsMdAt(agents, root),
|
|
58
|
+
handEdits: agents === undefined ? [] : await handEditsAt(root),
|
|
36
59
|
};
|
|
37
60
|
}
|
|
38
61
|
const BLOCK_VERBS = {
|
|
@@ -46,15 +69,19 @@ function renderPlan(cli, plan) {
|
|
|
46
69
|
...plan.replace.map((file) => ` replace ${file}`),
|
|
47
70
|
...plan.remove.map((file) => ` remove ${file}`),
|
|
48
71
|
];
|
|
49
|
-
const {
|
|
72
|
+
const { agentsMd } = plan;
|
|
50
73
|
return [
|
|
51
74
|
files.length === 0
|
|
52
75
|
? `the ${cli.name} skill at ${plan.copy} already matches the package`
|
|
53
76
|
: `would copy the ${cli.name} skill to ${plan.copy}:`,
|
|
54
77
|
...files,
|
|
55
|
-
|
|
56
|
-
?
|
|
57
|
-
:
|
|
78
|
+
...(agentsMd === null
|
|
79
|
+
? []
|
|
80
|
+
: [
|
|
81
|
+
agentsMd.change === null
|
|
82
|
+
? `${agentsMd.path} already holds the ${cli.name} block`
|
|
83
|
+
: `would ${BLOCK_VERBS[agentsMd.change]} ${agentsMd.path}:\n${agentsMd.agents.text}`,
|
|
84
|
+
]),
|
|
58
85
|
...plan.handEdits.map((edit) => `by hand: ${edit}`),
|
|
59
86
|
].join("\n");
|
|
60
87
|
}
|
|
@@ -64,9 +91,13 @@ function renderInstalled(cli, data) {
|
|
|
64
91
|
written.length + removed.length === 0
|
|
65
92
|
? `the ${cli.name} skill at ${data.copy} already matches the package`
|
|
66
93
|
: `copied the ${cli.name} skill to ${data.copy}: wrote ${written.length} files, removed ${removed.length}`,
|
|
67
|
-
agentsMd
|
|
68
|
-
?
|
|
69
|
-
:
|
|
94
|
+
...(agentsMd === null
|
|
95
|
+
? []
|
|
96
|
+
: [
|
|
97
|
+
agentsMd.changed
|
|
98
|
+
? `wrote the ${cli.name} block in ${agentsMd.path}`
|
|
99
|
+
: `${agentsMd.path} already holds the ${cli.name} block`,
|
|
100
|
+
]),
|
|
70
101
|
...data.handEdits.map((edit) => `by hand: ${edit}`),
|
|
71
102
|
].join("\n");
|
|
72
103
|
}
|
|
@@ -80,11 +111,13 @@ function editedRemovals(plan, ctx) {
|
|
|
80
111
|
});
|
|
81
112
|
}
|
|
82
113
|
/** The built-in `skill install`, for a CLI whose skill ships in its package. */
|
|
83
|
-
export function skillInstallCommand(cli, folder) {
|
|
84
|
-
const runAs =
|
|
114
|
+
export function skillInstallCommand(cli, folder, install, agents) {
|
|
115
|
+
const { runAs } = install;
|
|
85
116
|
return defineCommand({
|
|
86
117
|
name: "install",
|
|
87
|
-
description:
|
|
118
|
+
description: agents === undefined
|
|
119
|
+
? "copy this CLI's skill into the project"
|
|
120
|
+
: "copy this CLI's skill into the project and write its AGENTS.md block",
|
|
88
121
|
examples: [
|
|
89
122
|
{ command: `${runAs} skill install`, note: "install the skill this version ships" },
|
|
90
123
|
{ command: `${runAs} skill install --dry-run`, note: "show what it would change" },
|
|
@@ -92,7 +125,7 @@ export function skillInstallCommand(cli, folder) {
|
|
|
92
125
|
effect: "write",
|
|
93
126
|
output: installSchema,
|
|
94
127
|
force: "replace or remove hand-edited files of a skill copy at the package's version",
|
|
95
|
-
plan: (_input, ctx) => planOf(cli, folder, ctx.cwd, ctx.packageRoot),
|
|
128
|
+
plan: (_input, ctx) => planOf(cli, folder, agents, ctx.cwd, ctx.packageRoot),
|
|
96
129
|
// The copy lives in the project repo, so git keeps an edit that an upgrade replaces.
|
|
97
130
|
outputs: (plan) => plan.sameVersion ? [...plan.write, ...plan.replace].map((file) => join(plan.copy, file)) : [],
|
|
98
131
|
apply: async (plan, ctx) => {
|
|
@@ -104,16 +137,16 @@ export function skillInstallCommand(cli, folder) {
|
|
|
104
137
|
for (const file of plan.remove) {
|
|
105
138
|
await ctx.files.remove(join(plan.copy, file));
|
|
106
139
|
}
|
|
107
|
-
const {
|
|
108
|
-
if (change !== null) {
|
|
109
|
-
const existing = (await orMissing(readFile(path, "utf8"))) ?? "";
|
|
110
|
-
await ctx.files.write(path, withBlock(
|
|
140
|
+
const { agentsMd } = plan;
|
|
141
|
+
if (agentsMd !== null && agentsMd.change !== null) {
|
|
142
|
+
const existing = (await orMissing(readFile(agentsMd.path, "utf8"))) ?? "";
|
|
143
|
+
await ctx.files.write(agentsMd.path, withBlock(agentsMd.agents, existing));
|
|
111
144
|
}
|
|
112
145
|
return {
|
|
113
146
|
copy: plan.copy,
|
|
114
147
|
written: [...plan.write, ...plan.replace].sort(),
|
|
115
148
|
removed: [...plan.remove],
|
|
116
|
-
agentsMd: { path, changed: change !== null },
|
|
149
|
+
agentsMd: agentsMd === null ? null : { path: agentsMd.path, changed: agentsMd.change !== null },
|
|
117
150
|
handEdits: [...plan.handEdits],
|
|
118
151
|
};
|
|
119
152
|
},
|
|
@@ -121,4 +154,4 @@ export function skillInstallCommand(cli, folder) {
|
|
|
121
154
|
renderPlan: (plan) => renderPlan(cli, plan),
|
|
122
155
|
});
|
|
123
156
|
}
|
|
124
|
-
//# sourceMappingURL=
|
|
157
|
+
//# sourceMappingURL=install-command.js.map
|