@duyquangnvx/agent-cli 0.26.0 → 0.28.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 +34 -0
- package/dist/agent-cli.js +9 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/built-ins/agents-md.d.ts +3 -2
- package/dist/built-ins/agents-md.js +8 -9
- package/dist/built-ins/agents-md.js.map +1 -1
- package/dist/built-ins/commands.d.ts +2 -1
- package/dist/built-ins/commands.js.map +1 -1
- package/dist/built-ins/doctor-rows.js +1 -1
- package/dist/built-ins/doctor-rows.js.map +1 -1
- package/dist/built-ins/doctor.d.ts +0 -1
- package/dist/built-ins/doctor.js +21 -8
- package/dist/built-ins/doctor.js.map +1 -1
- package/dist/built-ins/install/dependency.js +23 -23
- package/dist/built-ins/install/dependency.js.map +1 -1
- package/dist/built-ins/install/global-npm.d.ts +6 -3
- package/dist/built-ins/install/global-npm.js +19 -14
- package/dist/built-ins/install/global-npm.js.map +1 -1
- package/dist/built-ins/install/global.js +6 -7
- package/dist/built-ins/install/global.js.map +1 -1
- package/dist/built-ins/install/install.d.ts +0 -3
- package/dist/built-ins/install/install.js +0 -1
- package/dist/built-ins/install/install.js.map +1 -1
- package/dist/built-ins/install/release-check.js +10 -17
- package/dist/built-ins/install/release-check.js.map +1 -1
- package/dist/built-ins/npm.d.ts +8 -7
- package/dist/built-ins/npm.js +20 -12
- package/dist/built-ins/npm.js.map +1 -1
- package/dist/built-ins/project-root.d.ts +4 -4
- package/dist/built-ins/project-root.js +12 -22
- package/dist/built-ins/project-root.js.map +1 -1
- package/dist/built-ins/read.d.ts +5 -0
- package/dist/built-ins/read.js +29 -0
- package/dist/built-ins/read.js.map +1 -0
- package/dist/built-ins/setup.d.ts +1 -2
- package/dist/built-ins/setup.js +32 -26
- package/dist/built-ins/setup.js.map +1 -1
- package/dist/built-ins/skill/home.d.ts +2 -1
- package/dist/built-ins/skill/home.js +19 -17
- package/dist/built-ins/skill/home.js.map +1 -1
- package/dist/built-ins/skill/install-command.d.ts +2 -1
- package/dist/built-ins/skill/install-command.js +13 -11
- package/dist/built-ins/skill/install-command.js.map +1 -1
- package/dist/built-ins/skill/project.js +6 -7
- package/dist/built-ins/skill/project.js.map +1 -1
- package/dist/built-ins/skill/sync.d.ts +4 -3
- package/dist/built-ins/skill/sync.js +24 -17
- package/dist/built-ins/skill/sync.js.map +1 -1
- package/dist/built-ins/update.d.ts +1 -1
- package/dist/built-ins/update.js +9 -7
- package/dist/built-ins/update.js.map +1 -1
- package/dist/built-ins/upgrades.d.ts +2 -1
- package/dist/built-ins/upgrades.js +5 -12
- package/dist/built-ins/upgrades.js.map +1 -1
- package/dist/check-examples.js +5 -23
- package/dist/check-examples.js.map +1 -1
- package/dist/check-next-steps.d.ts +3 -9
- package/dist/check-next-steps.js +20 -32
- package/dist/check-next-steps.js.map +1 -1
- package/dist/command-line/line-problem.d.ts +14 -0
- package/dist/command-line/line-problem.js +41 -0
- package/dist/command-line/line-problem.js.map +1 -0
- package/dist/context/files.d.ts +3 -0
- package/dist/context/files.js +17 -2
- package/dist/context/files.js.map +1 -1
- package/dist/context/outputs.d.ts +13 -24
- package/dist/context/outputs.js +37 -37
- package/dist/context/outputs.js.map +1 -1
- package/dist/context/secrets.d.ts +5 -1
- package/dist/context/secrets.js +18 -5
- package/dist/context/secrets.js.map +1 -1
- package/dist/context/spawn.js +3 -1
- package/dist/context/spawn.js.map +1 -1
- package/dist/context/tools.d.ts +9 -4
- package/dist/context/tools.js +12 -12
- package/dist/context/tools.js.map +1 -1
- package/dist/context.d.ts +12 -8
- package/dist/define-command.d.ts +29 -13
- package/dist/define-command.js +5 -3
- package/dist/define-command.js.map +1 -1
- package/dist/define.d.ts +19 -6
- package/dist/define.js.map +1 -1
- package/dist/errors.d.ts +3 -6
- package/dist/errors.js +17 -28
- package/dist/errors.js.map +1 -1
- package/dist/execute.d.ts +7 -16
- package/dist/execute.js +11 -14
- package/dist/execute.js.map +1 -1
- package/dist/exit-classes.d.ts +7 -10
- package/dist/exit-classes.js +20 -81
- package/dist/exit-classes.js.map +1 -1
- package/dist/failure.d.ts +36 -0
- package/dist/failure.js +65 -0
- package/dist/failure.js.map +1 -0
- package/dist/help-json.js +5 -3
- package/dist/help-json.js.map +1 -1
- package/dist/help.js +9 -3
- package/dist/help.js.map +1 -1
- package/dist/output.d.ts +3 -10
- package/dist/output.js +14 -24
- package/dist/output.js.map +1 -1
- package/dist/run-cli.js +7 -5
- package/dist/run-cli.js.map +1 -1
- package/dist/run-command.d.ts +6 -1
- package/dist/run-command.js +31 -155
- package/dist/run-command.js.map +1 -1
- package/dist/run-options.d.ts +5 -2
- package/dist/run-scope.d.ts +35 -0
- package/dist/run-scope.js +138 -0
- package/dist/run-scope.js.map +1 -0
- package/dist/runtime-codes.d.ts +140 -1
- package/dist/runtime-codes.js +60 -4
- package/dist/runtime-codes.js.map +1 -1
- package/docs/README.md +2 -2
- package/docs/example/cli.test.ts +9 -2
- package/docs/example/cli.ts +1 -0
- package/docs/example/folder.ts +1 -0
- package/docs/guides/commands.md +2 -2
- package/docs/guides/doctor.md +3 -2
- package/docs/guides/errors.md +1 -1
- package/docs/guides/testing.md +2 -1
- package/package.json +1 -1
- package/dist/command-errors.d.ts +0 -8
- package/dist/command-errors.js +0 -25
- package/dist/command-errors.js.map +0 -1
- package/dist/command-line/route-line.d.ts +0 -15
- package/dist/command-line/route-line.js +0 -18
- package/dist/command-line/route-line.js.map +0 -1
package/dist/built-ins/setup.js
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { lstat, readFile, realpath } from "node:fs/promises";
|
|
2
1
|
import { delimiter, join, normalize } from "node:path";
|
|
3
2
|
import * as z from "zod";
|
|
4
3
|
import { DISK_FULL, PERMISSION_DENIED } from "../context/errno.js";
|
|
5
4
|
import { INTERRUPTED } from "../context/interrupts.js";
|
|
6
5
|
import { pathOf } from "../context/tools.js";
|
|
7
6
|
import { defineCommand } from "../define-command.js";
|
|
8
|
-
import { CliError,
|
|
7
|
+
import { CliError, errnoOf, runtimeError } from "../errors.js";
|
|
9
8
|
import { wholeLine } from "../next-step.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
9
|
+
import { INSTALL_FAILED, NOT_GLOBAL_INSTALL, NOT_ON_PATH } from "../runtime-codes.js";
|
|
10
|
+
import { globalModulesDir, globalNpm, isLink, setupLineOf } from "./install/global-npm.js";
|
|
11
|
+
import { globalPrefix, installGlobally, latestVersion, NPM_ERRORS, } from "./npm.js";
|
|
12
|
+
import { readIfAny } from "./read.js";
|
|
12
13
|
import { standingOf } from "./semver.js";
|
|
13
14
|
import { homeCopiesOf, homeSyncSchema, renderHomeSync, renderPlannedSync, syncHome, } from "./skill/home.js";
|
|
14
15
|
import { renderUpgrade, upgradeSchema, upgradesOf } from "./upgrades.js";
|
|
15
|
-
export const NOT_ON_PATH = "NOT_ON_PATH";
|
|
16
16
|
const setupSchema = z.object({
|
|
17
17
|
version: z.string(),
|
|
18
18
|
prefix: z.string(),
|
|
@@ -22,8 +22,8 @@ const setupSchema = z.object({
|
|
|
22
22
|
docs: z.string().nullable(),
|
|
23
23
|
});
|
|
24
24
|
const installedManifest = z.object({ version: z.string() });
|
|
25
|
-
async function versionAt(packageDir) {
|
|
26
|
-
const text = await
|
|
25
|
+
async function versionAt(files, packageDir) {
|
|
26
|
+
const text = await readIfAny(files, join(packageDir, "package.json"));
|
|
27
27
|
if (text === undefined)
|
|
28
28
|
return null;
|
|
29
29
|
try {
|
|
@@ -38,25 +38,30 @@ async function versionAt(packageDir) {
|
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
// The Run-as would not run yet, so every Next step is the line that started this.
|
|
41
|
-
function npmOfSetup(cli, install, ctx,
|
|
42
|
-
return { ...globalNpm(cli, install, ctx,
|
|
41
|
+
function npmOfSetup(cli, install, ctx, launch) {
|
|
42
|
+
return { ...globalNpm(cli, install, ctx, launch), rerun: wholeLine(setupLineOf(install)) };
|
|
43
43
|
}
|
|
44
44
|
function needsInstall({ from, latest }) {
|
|
45
45
|
return from === null || standingOf(from, latest) === "behind";
|
|
46
46
|
}
|
|
47
|
-
function binDirOf(prefix) {
|
|
48
|
-
return
|
|
47
|
+
function binDirOf(prefix, platform) {
|
|
48
|
+
return platform === "win32" ? prefix : join(prefix, "bin");
|
|
49
49
|
}
|
|
50
50
|
// A PATH entry that cannot be resolved still compares as written, so it only fails to match.
|
|
51
|
-
async function canonical(path) {
|
|
52
|
-
|
|
51
|
+
async function canonical(files, path) {
|
|
52
|
+
const real = await files.realPath(path).catch((error) => {
|
|
53
|
+
if (!(error instanceof CliError) && errnoOf(error) === undefined)
|
|
54
|
+
throw error;
|
|
55
|
+
return undefined;
|
|
56
|
+
});
|
|
57
|
+
return normalize(real ?? path);
|
|
53
58
|
}
|
|
54
59
|
// npx puts its own copy's bin on PATH, so only the global folder's place there tells a later shell finds it.
|
|
55
|
-
async function assertOnPath(cli, prefix, node, ctx) {
|
|
56
|
-
const binDir = binDirOf(prefix);
|
|
57
|
-
const wanted = await canonical(binDir);
|
|
60
|
+
async function assertOnPath(cli, prefix, { node, platform }, ctx) {
|
|
61
|
+
const binDir = binDirOf(prefix, platform);
|
|
62
|
+
const wanted = await canonical(ctx.files, binDir);
|
|
58
63
|
const entries = pathOf(ctx.env).split(delimiter).filter(Boolean);
|
|
59
|
-
const found = await Promise.all(entries.map(canonical));
|
|
64
|
+
const found = await Promise.all(entries.map((entry) => canonical(ctx.files, entry)));
|
|
60
65
|
if (found.includes(wanted))
|
|
61
66
|
return;
|
|
62
67
|
throw runtimeError({
|
|
@@ -92,7 +97,7 @@ function renderSetup(cli, install, setup) {
|
|
|
92
97
|
].join("\n");
|
|
93
98
|
}
|
|
94
99
|
/** The built-in `setup`, which runs from any copy, such as npx's, so it never asks to be the global one. */
|
|
95
|
-
export function setupCommand(cli, install,
|
|
100
|
+
export function setupCommand(cli, install, launch) {
|
|
96
101
|
return defineCommand({
|
|
97
102
|
description: "install this CLI and its skill on this machine",
|
|
98
103
|
examples: [
|
|
@@ -100,13 +105,14 @@ export function setupCommand(cli, install, { node }) {
|
|
|
100
105
|
{ command: `${cli.name} setup --dry-run`, note: "show what it would change" },
|
|
101
106
|
],
|
|
102
107
|
effect: "write",
|
|
108
|
+
errors: [NOT_GLOBAL_INSTALL, NOT_ON_PATH, ...NPM_ERRORS],
|
|
103
109
|
output: setupSchema,
|
|
104
110
|
plan: async (_input, ctx) => {
|
|
105
|
-
const npm = npmOfSetup(cli, install, ctx,
|
|
111
|
+
const npm = npmOfSetup(cli, install, ctx, launch);
|
|
106
112
|
const prefix = await globalPrefix(npm);
|
|
107
|
-
const packageDir = join(globalModulesDir(prefix), install.package);
|
|
113
|
+
const packageDir = join(globalModulesDir(prefix, launch.platform), install.package);
|
|
108
114
|
// `npm link` puts a symlink to a source checkout where the install would be.
|
|
109
|
-
if (
|
|
115
|
+
if (await isLink(ctx.files, packageDir)) {
|
|
110
116
|
throw runtimeError({
|
|
111
117
|
code: NOT_GLOBAL_INSTALL,
|
|
112
118
|
message: `${packageDir} is a link (npm link), which an install would replace`,
|
|
@@ -116,11 +122,11 @@ export function setupCommand(cli, install, { node }) {
|
|
|
116
122
|
}
|
|
117
123
|
return {
|
|
118
124
|
package: install.package,
|
|
119
|
-
from: await versionAt(packageDir),
|
|
125
|
+
from: await versionAt(ctx.files, packageDir),
|
|
120
126
|
latest: await latestVersion(npm),
|
|
121
127
|
prefix,
|
|
122
128
|
packageDir,
|
|
123
|
-
copies: cli.skill === undefined ? [] : await homeCopiesOf(cli.name, ctx.env),
|
|
129
|
+
copies: cli.skill === undefined ? [] : await homeCopiesOf(ctx.files, cli.name, ctx.env),
|
|
124
130
|
};
|
|
125
131
|
},
|
|
126
132
|
apply: async (plan, ctx) => {
|
|
@@ -130,7 +136,7 @@ export function setupCommand(cli, install, { node }) {
|
|
|
130
136
|
.runToEnd(`installing ${plan.package}@${latest}`, async () => {
|
|
131
137
|
if (installs) {
|
|
132
138
|
ctx.progress(`installing ${plan.package}@${latest} with the npm under ${prefix}…`);
|
|
133
|
-
await installGlobally(latest, npmOfSetup(cli, install, ctx,
|
|
139
|
+
await installGlobally(latest, npmOfSetup(cli, install, ctx, launch));
|
|
134
140
|
}
|
|
135
141
|
return syncHome(cli, packageDir, ctx);
|
|
136
142
|
})
|
|
@@ -142,7 +148,7 @@ export function setupCommand(cli, install, { node }) {
|
|
|
142
148
|
prefix,
|
|
143
149
|
installed: installs,
|
|
144
150
|
skill,
|
|
145
|
-
upgrades: installs && from !== null ? await upgradesOf(packageDir, from, latest) : [],
|
|
151
|
+
upgrades: installs && from !== null ? await upgradesOf(ctx.files, packageDir, from, latest) : [],
|
|
146
152
|
docs: cli.docs === undefined ? null : join(packageDir, cli.docs),
|
|
147
153
|
};
|
|
148
154
|
ctx.deliver(setup);
|
|
@@ -153,7 +159,7 @@ export function setupCommand(cli, install, { node }) {
|
|
|
153
159
|
hint: "nothing to run again",
|
|
154
160
|
});
|
|
155
161
|
}
|
|
156
|
-
await assertOnPath(cli, prefix,
|
|
162
|
+
await assertOnPath(cli, prefix, launch, ctx);
|
|
157
163
|
return setup;
|
|
158
164
|
},
|
|
159
165
|
render: (setup) => renderSetup(cli, install, setup),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/built-ins/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/built-ins/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as z from "zod";
|
|
2
|
+
import type { Files } from "../../context/files.js";
|
|
2
3
|
import type { Context, Env } from "../../context.js";
|
|
3
4
|
import type { SkillSource } from "../../define.js";
|
|
4
5
|
import type { Install } from "../install/install.js";
|
|
@@ -9,7 +10,7 @@ export declare function skillVersionIn(skill: string): string | undefined;
|
|
|
9
10
|
export declare function statedVersionNote(version: string): string;
|
|
10
11
|
export declare function homeOf(env: Env): string;
|
|
11
12
|
/** 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 function homeCopiesOf(files: Files, name: string, env: Env): Promise<string[]>;
|
|
13
14
|
export declare const homeSyncSchema: z.ZodObject<{
|
|
14
15
|
copies: z.ZodArray<z.ZodString>;
|
|
15
16
|
written: z.ZodArray<z.ZodString>;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { readFile, realpath } from "node:fs/promises";
|
|
2
1
|
import { homedir } from "node:os";
|
|
3
2
|
import { join } from "node:path";
|
|
4
3
|
import * as z from "zod";
|
|
5
|
-
import {
|
|
4
|
+
import { CliError } from "../../errors.js";
|
|
5
|
+
import { readIfAny } from "../read.js";
|
|
6
6
|
import { applySync, filesIn, syncOf } from "./sync.js";
|
|
7
7
|
// The folders of Claude Code and Codex (ADR 0016).
|
|
8
8
|
const SKILL_DIRS = [
|
|
@@ -24,9 +24,9 @@ export function homeOf(env) {
|
|
|
24
24
|
return env.HOME ?? env.USERPROFILE ?? homedir();
|
|
25
25
|
}
|
|
26
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) {
|
|
27
|
+
export async function homeCopiesOf(files, name, env) {
|
|
28
28
|
const paths = SKILL_DIRS.map((dir) => join(homeOf(env), ...dir, name));
|
|
29
|
-
const reals = await Promise.all(paths.map(
|
|
29
|
+
const reals = await Promise.all(paths.map((path) => files.realPath(path)));
|
|
30
30
|
return paths.filter((_path, index) => {
|
|
31
31
|
const real = reals[index];
|
|
32
32
|
return real === undefined || reals.indexOf(real) === index;
|
|
@@ -45,10 +45,10 @@ export async function syncHome(cli, packageDir, ctx) {
|
|
|
45
45
|
if (cli.skill === undefined)
|
|
46
46
|
return null;
|
|
47
47
|
const source = join(packageDir, cli.skill.folder);
|
|
48
|
-
if ((await filesIn(source)).length === 0)
|
|
48
|
+
if ((await filesIn(ctx.files, source)).length === 0)
|
|
49
49
|
return null;
|
|
50
|
-
const copies = await homeCopiesOf(cli.name, ctx.env);
|
|
51
|
-
const syncs = await Promise.all(copies.map((copy) => syncOf(source, copy)));
|
|
50
|
+
const copies = await homeCopiesOf(ctx.files, cli.name, ctx.env);
|
|
51
|
+
const syncs = await Promise.all(copies.map((copy) => syncOf(ctx.files, source, copy)));
|
|
52
52
|
for (const sync of syncs)
|
|
53
53
|
await applySync(sync, ctx);
|
|
54
54
|
return {
|
|
@@ -73,17 +73,19 @@ export function renderHomeSync(name, sync) {
|
|
|
73
73
|
`copied the ${name} skill to ${at}: wrote ${sync.written.length} files, removed ${sync.removed.length}`,
|
|
74
74
|
];
|
|
75
75
|
}
|
|
76
|
-
async function homeCopyAt(path) {
|
|
76
|
+
async function homeCopyAt(files, path) {
|
|
77
|
+
let text;
|
|
77
78
|
try {
|
|
78
|
-
|
|
79
|
-
path,
|
|
80
|
-
state: "readable",
|
|
81
|
-
stated: skillVersionIn(await readFile(join(path, "SKILL.md"), "utf8")),
|
|
82
|
-
};
|
|
79
|
+
text = await readIfAny(files, join(path, "SKILL.md"));
|
|
83
80
|
}
|
|
84
81
|
catch (error) {
|
|
85
|
-
|
|
82
|
+
if (!(error instanceof CliError))
|
|
83
|
+
throw error;
|
|
84
|
+
return { path, state: "unreadable" };
|
|
86
85
|
}
|
|
86
|
+
return text === undefined
|
|
87
|
+
? { path, state: "missing" }
|
|
88
|
+
: { path, state: "readable", stated: skillVersionIn(text) };
|
|
87
89
|
}
|
|
88
90
|
function describeCopy(copy) {
|
|
89
91
|
if (copy.state === "missing")
|
|
@@ -93,10 +95,10 @@ function describeCopy(copy) {
|
|
|
93
95
|
return copy.stated === undefined ? copy.path : `${copy.path} (${statedVersionNote(copy.stated)})`;
|
|
94
96
|
}
|
|
95
97
|
async function findingOf(cli, folder, install, ctx) {
|
|
96
|
-
const paths = await homeCopiesOf(cli.name, ctx.env);
|
|
98
|
+
const paths = await homeCopiesOf(ctx.files, cli.name, ctx.env);
|
|
97
99
|
const [copies, shipped] = await Promise.all([
|
|
98
|
-
Promise.all(paths.map(homeCopyAt)),
|
|
99
|
-
|
|
100
|
+
Promise.all(paths.map((path) => homeCopyAt(ctx.files, path))),
|
|
101
|
+
readIfAny(ctx.files, join(ctx.packageRoot, folder, "SKILL.md")),
|
|
100
102
|
]);
|
|
101
103
|
const message = copies.map(describeCopy).join("; ");
|
|
102
104
|
// A package whose own skill states a version would rewrite it, so a fix would never clear the row.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../../src/built-ins/skill/home.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"home.js","sourceRoot":"","sources":["../../../src/built-ins/skill/home.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import type { Files } from "../../context/files.js";
|
|
1
2
|
import type { Command } from "../../define.js";
|
|
2
3
|
import { type AgentsSection } from "../agents-md.js";
|
|
3
4
|
import type { SkillCli } from "./skill.js";
|
|
4
5
|
/** 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
|
+
export declare function skillCopyOf(files: Files, cli: Pick<SkillCli, "name">, cwd: string): Promise<{
|
|
6
7
|
readonly root: string;
|
|
7
8
|
readonly copy: string;
|
|
8
9
|
}>;
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import { readFile } from "node:fs/promises";
|
|
2
1
|
import { join } from "node:path";
|
|
3
2
|
import * as z from "zod";
|
|
4
3
|
import { defineCommand } from "../../define-command.js";
|
|
5
|
-
import { orMissing } from "../../errors.js";
|
|
6
4
|
import { agentsMdAt, handEditsAt, withSection, } from "../agents-md.js";
|
|
7
5
|
import { projectRootOf } from "../project-root.js";
|
|
6
|
+
import { readIfAny, readRequired } from "../read.js";
|
|
8
7
|
import { applySync, syncOf } from "./sync.js";
|
|
9
8
|
/** The project root and the Skill copy under it, as `skill install` writes it. */
|
|
10
|
-
export async function skillCopyOf(cli, cwd) {
|
|
11
|
-
const root = await projectRootOf(cwd);
|
|
9
|
+
export async function skillCopyOf(files, cli, cwd) {
|
|
10
|
+
const root = await projectRootOf(files, cwd);
|
|
12
11
|
return { root, copy: join(root, ".claude", "skills", cli.name) };
|
|
13
12
|
}
|
|
14
13
|
const installSchema = z.object({
|
|
@@ -18,12 +17,15 @@ const installSchema = z.object({
|
|
|
18
17
|
agentsMd: z.object({ path: z.string(), changed: z.boolean() }).nullable(),
|
|
19
18
|
handEdits: z.array(z.string()),
|
|
20
19
|
});
|
|
21
|
-
async function planOf(cli, folder, agents, cwd, packageRoot) {
|
|
22
|
-
const
|
|
20
|
+
async function planOf(cli, folder, agents, { files, cwd, packageRoot }) {
|
|
21
|
+
const source = join(packageRoot, folder);
|
|
22
|
+
// Syncing from a package that lost its skill would empty the copy.
|
|
23
|
+
await readRequired(files, join(source, "SKILL.md"));
|
|
24
|
+
const { root, copy } = await skillCopyOf(files, cli, cwd);
|
|
23
25
|
return {
|
|
24
|
-
...(await syncOf(
|
|
25
|
-
agentsMd: agents === undefined ? null : await agentsMdAt(agents, root),
|
|
26
|
-
handEdits: agents === undefined ? [] : await handEditsAt(root),
|
|
26
|
+
...(await syncOf(files, source, copy)),
|
|
27
|
+
agentsMd: agents === undefined ? null : await agentsMdAt(files, agents, root),
|
|
28
|
+
handEdits: agents === undefined ? [] : await handEditsAt(files, root),
|
|
27
29
|
};
|
|
28
30
|
}
|
|
29
31
|
const SECTION_VERBS = {
|
|
@@ -81,13 +83,13 @@ export function skillInstallCommand(cli, folder, agents) {
|
|
|
81
83
|
],
|
|
82
84
|
effect: "write",
|
|
83
85
|
output: installSchema,
|
|
84
|
-
plan: (_input, ctx) => planOf(cli, folder, agents, ctx
|
|
86
|
+
plan: (_input, ctx) => planOf(cli, folder, agents, ctx),
|
|
85
87
|
// The copy lives in the project repo, so git keeps an edit this replaces.
|
|
86
88
|
apply: async (plan, ctx) => {
|
|
87
89
|
await applySync(plan, ctx);
|
|
88
90
|
const { agentsMd } = plan;
|
|
89
91
|
if (agentsMd !== null && agentsMd.change !== null) {
|
|
90
|
-
const existing = (await
|
|
92
|
+
const existing = (await readIfAny(ctx.files, agentsMd.path)) ?? "";
|
|
91
93
|
await ctx.files.write(agentsMd.path, withSection(agentsMd.agents, existing));
|
|
92
94
|
}
|
|
93
95
|
return {
|
|
@@ -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":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAIzB,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAGL,UAAU,EACV,WAAW,EAEX,WAAW,GACZ,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,SAAS,EAAkB,MAAM,EAAE,MAAM,WAAW,CAAC;AAE9D,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAY,EACZ,GAA2B,EAC3B,GAAW;IAEX,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC7C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;IACzE,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC/B,CAAC,CAAC;AAUH,KAAK,UAAU,MAAM,CACnB,GAAa,EACb,MAAc,EACd,MAAiC,EACjC,EAAE,KAAK,EAAE,GAAG,EAAE,WAAW,EAAW;IAEpC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACzC,mEAAmE;IACnE,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IACpD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1D,OAAO;QACL,GAAG,CAAC,MAAM,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACtC,QAAQ,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC;QAC7E,SAAS,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC;KACtE,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAAkC;IACnD,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,2BAA2B;IAChC,OAAO,EAAE,+BAA+B;CACzC,CAAC;AAEF,SAAS,UAAU,CAAC,GAAa,EAAE,IAAiB;IAClD,MAAM,KAAK,GAAG;QACZ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC;QAC9C,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,IAAI,EAAE,CAAC;QAClD,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC;KACjD,CAAC;IACF,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC1B,OAAO;QACL,KAAK,CAAC,MAAM,KAAK,CAAC;YAChB,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,aAAa,IAAI,CAAC,IAAI,8BAA8B;YACrE,CAAC,CAAC,kBAAkB,GAAG,CAAC,IAAI,aAAa,IAAI,CAAC,IAAI,GAAG;QACvD,GAAG,KAAK;QACR,GAAG,CAAC,QAAQ,KAAK,IAAI;YACnB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,QAAQ,CAAC,MAAM,KAAK,IAAI;oBACtB,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,sBAAsB,GAAG,CAAC,IAAI,iBAAiB;oBACjE,CAAC,CAAC,SAAS,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,IAAI,MAAM,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE;aACzF,CAAC;QACN,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC;KACpD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,GAAa,EAAE,IAAe;IACrD,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC5C,OAAO;QACL,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC;YACnC,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,aAAa,IAAI,CAAC,IAAI,8BAA8B;YACrE,CAAC,CAAC,cAAc,GAAG,CAAC,IAAI,aAAa,IAAI,CAAC,IAAI,WAAW,OAAO,CAAC,MAAM,mBAAmB,OAAO,CAAC,MAAM,EAAE;QAC5G,GAAG,CAAC,QAAQ,KAAK,IAAI;YACnB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,QAAQ,CAAC,OAAO;oBACd,CAAC,CAAC,aAAa,GAAG,CAAC,IAAI,sBAAsB,QAAQ,CAAC,IAAI,EAAE;oBAC5D,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,sBAAsB,GAAG,CAAC,IAAI,iBAAiB;aACpE,CAAC;QACN,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,IAAI,EAAE,CAAC;KACpD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,mBAAmB,CACjC,GAAa,EACb,MAAc,EACd,MAAiC;IAEjC,OAAO,aAAa,CAAC;QACnB,WAAW,EACT,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC,wCAAwC;YAC1C,CAAC,CAAC,qEAAqE;QAC3E,QAAQ,EAAE;YACR,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,gBAAgB,EAAE,IAAI,EAAE,sCAAsC,EAAE;YACtF,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,0BAA0B,EAAE,IAAI,EAAE,2BAA2B,EAAE;SACtF;QACD,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,aAAa;QACrB,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC;QACvD,0EAA0E;QAC1E,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAsB,EAAE;YAC7C,MAAM,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC3B,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;YAC1B,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBAClD,MAAM,QAAQ,GAAG,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;gBACnE,MAAM,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE;gBAChD,OAAO,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;gBACzB,QAAQ,EACN,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE;gBACvF,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;aAC/B,CAAC;QACJ,CAAC;QACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC;QAC5C,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC;KAC5C,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,21 +1,20 @@
|
|
|
1
|
-
import { readFile, realpath } from "node:fs/promises";
|
|
2
1
|
import { join } from "node:path";
|
|
3
|
-
import { orMissing } from "../../errors.js";
|
|
4
2
|
import { agentsRow } from "../agents-md.js";
|
|
3
|
+
import { readIfAny, readRequired } from "../read.js";
|
|
5
4
|
import { homeOf, skillVersionIn, statedVersionNote } from "./home.js";
|
|
6
5
|
import { skillCopyOf, skillInstallCommand } from "./install-command.js";
|
|
7
6
|
// A project that is home itself has its copy under home, which shadows nothing.
|
|
8
7
|
async function personalCopyOf(name, copy, ctx) {
|
|
9
8
|
const home = join(homeOf(ctx.env), ".claude", "skills", name);
|
|
10
|
-
const real = await
|
|
11
|
-
return real === undefined || real === (await
|
|
9
|
+
const real = await ctx.files.realPath(home);
|
|
10
|
+
return real === undefined || real === (await ctx.files.realPath(copy)) ? undefined : home;
|
|
12
11
|
}
|
|
13
12
|
/** The project root's copy against the package's, and any under home. */
|
|
14
13
|
async function findingOf(cli, folder, install, ctx) {
|
|
15
|
-
const { copy } = await skillCopyOf(cli, ctx.cwd);
|
|
14
|
+
const { copy } = await skillCopyOf(ctx.files, cli, ctx.cwd);
|
|
16
15
|
const [installed, shipped] = await Promise.all([
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
readIfAny(ctx.files, join(copy, "SKILL.md")),
|
|
17
|
+
readRequired(ctx.files, join(ctx.packageRoot, folder, "SKILL.md")),
|
|
19
18
|
]);
|
|
20
19
|
const stated = installed === undefined ? undefined : skillVersionIn(installed);
|
|
21
20
|
// A package whose own skill states a version would rewrite it, so a fix would never clear the row.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/built-ins/skill/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../../src/built-ins/skill/project.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { Files } from "../../context/files.js";
|
|
1
2
|
import type { Context } from "../../context.js";
|
|
2
3
|
/** What makes a Skill copy match the package's folder. */
|
|
3
4
|
export interface SkillSync {
|
|
@@ -10,7 +11,7 @@ export interface SkillSync {
|
|
|
10
11
|
/** Files of the copy the package no longer has. */
|
|
11
12
|
readonly remove: readonly string[];
|
|
12
13
|
}
|
|
13
|
-
/** Every file under `dir`, relative to it and sorted; none when `dir` is
|
|
14
|
-
export declare function filesIn(dir: string): Promise<string[]>;
|
|
15
|
-
export declare function syncOf(source: string, copy: string): Promise<SkillSync>;
|
|
14
|
+
/** Every file under `dir`, relative to it and sorted; none when `dir` is no folder. */
|
|
15
|
+
export declare function filesIn(files: Files, dir: string): Promise<string[]>;
|
|
16
|
+
export declare function syncOf(files: Files, source: string, copy: string): Promise<SkillSync>;
|
|
16
17
|
export declare function applySync(sync: SkillSync, ctx: Context): Promise<void>;
|
|
@@ -1,21 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
.
|
|
10
|
-
|
|
1
|
+
import { join } from "node:path";
|
|
2
|
+
async function walk(files, dir, inner) {
|
|
3
|
+
const names = await files.list(join(dir, inner));
|
|
4
|
+
const nested = await Promise.all(names.map(async (name) => {
|
|
5
|
+
const path = join(inner, name);
|
|
6
|
+
const found = await files.stat(join(dir, path));
|
|
7
|
+
if (found === undefined)
|
|
8
|
+
return [];
|
|
9
|
+
return found.folder ? walk(files, dir, path) : [path];
|
|
10
|
+
}));
|
|
11
|
+
return nested.flat();
|
|
11
12
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
/** Every file under `dir`, relative to it and sorted; none when `dir` is no folder. */
|
|
14
|
+
export async function filesIn(files, dir) {
|
|
15
|
+
if ((await files.stat(dir))?.folder !== true)
|
|
16
|
+
return [];
|
|
17
|
+
return (await walk(files, dir, "")).sort();
|
|
15
18
|
}
|
|
16
|
-
|
|
17
|
-
const [
|
|
18
|
-
|
|
19
|
+
async function sameContent(files, left, right) {
|
|
20
|
+
const [a, b] = await Promise.all([files.read(left), files.read(right)]);
|
|
21
|
+
return Buffer.from(a).equals(b);
|
|
22
|
+
}
|
|
23
|
+
export async function syncOf(files, source, copy) {
|
|
24
|
+
const [shipped, present] = await Promise.all([filesIn(files, source), filesIn(files, copy)]);
|
|
25
|
+
const differs = await Promise.all(shipped.map(async (file) => present.includes(file) && !(await sameContent(files, join(source, file), join(copy, file)))));
|
|
19
26
|
return {
|
|
20
27
|
source,
|
|
21
28
|
copy,
|
|
@@ -26,7 +33,7 @@ export async function syncOf(source, copy) {
|
|
|
26
33
|
}
|
|
27
34
|
export async function applySync(sync, ctx) {
|
|
28
35
|
for (const file of [...sync.write, ...sync.replace]) {
|
|
29
|
-
await ctx.files.write(join(sync.copy, file), await
|
|
36
|
+
await ctx.files.write(join(sync.copy, file), await ctx.files.read(join(sync.source, file)));
|
|
30
37
|
}
|
|
31
38
|
for (const file of sync.remove) {
|
|
32
39
|
await ctx.files.remove(join(sync.copy, file));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/built-ins/skill/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/built-ins/skill/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,4 +2,4 @@ import type { Command, GlobalInstall } from "../define.js";
|
|
|
2
2
|
import type { Launch } from "./commands.js";
|
|
3
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, launch: Launch): Command;
|
package/dist/built-ins/update.js
CHANGED
|
@@ -2,8 +2,9 @@ import * as z from "zod";
|
|
|
2
2
|
import { INTERRUPTED } from "../context/interrupts.js";
|
|
3
3
|
import { defineCommand } from "../define-command.js";
|
|
4
4
|
import { CliError } from "../errors.js";
|
|
5
|
+
import { NOT_GLOBAL_INSTALL } from "../runtime-codes.js";
|
|
5
6
|
import { globalInstallOf, globalNpm } from "./install/global-npm.js";
|
|
6
|
-
import { installGlobally, latestVersion } from "./npm.js";
|
|
7
|
+
import { installGlobally, latestVersion, NPM_ERRORS } from "./npm.js";
|
|
7
8
|
import { standingOf } from "./semver.js";
|
|
8
9
|
import { homeCopiesOf, homeSyncSchema, renderHomeSync, renderPlannedSync, syncHome, } from "./skill/home.js";
|
|
9
10
|
import { renderUpgrade, upgradeSchema, upgradesOf } from "./upgrades.js";
|
|
@@ -39,7 +40,7 @@ function interruptedAfterInstall(plan) {
|
|
|
39
40
|
});
|
|
40
41
|
}
|
|
41
42
|
/** The built-in `update`, for a CLI installed globally with npm. */
|
|
42
|
-
export function updateCommand(cli, install,
|
|
43
|
+
export function updateCommand(cli, install, launch) {
|
|
43
44
|
return defineCommand({
|
|
44
45
|
description: "install the latest version of this CLI from its registry",
|
|
45
46
|
examples: [
|
|
@@ -47,17 +48,18 @@ export function updateCommand(cli, install, { bin, node }) {
|
|
|
47
48
|
{ command: `${cli.name} update --dry-run`, note: "show the version it would install" },
|
|
48
49
|
],
|
|
49
50
|
effect: "write",
|
|
51
|
+
errors: [NOT_GLOBAL_INSTALL, ...NPM_ERRORS],
|
|
50
52
|
output: updateSchema,
|
|
51
53
|
plan: async (_input, ctx) => {
|
|
52
|
-
const npm = globalNpm(cli, install, ctx,
|
|
53
|
-
const copy = await globalInstallOf(bin, npm);
|
|
54
|
+
const npm = globalNpm(cli, install, ctx, launch);
|
|
55
|
+
const copy = await globalInstallOf(launch.bin, npm);
|
|
54
56
|
return {
|
|
55
57
|
package: install.package,
|
|
56
58
|
from: cli.version,
|
|
57
59
|
latest: await latestVersion(npm),
|
|
58
60
|
prefix: copy.prefix,
|
|
59
61
|
packageDir: copy.packageDir,
|
|
60
|
-
copies: cli.skill === undefined ? [] : await homeCopiesOf(cli.name, ctx.env),
|
|
62
|
+
copies: cli.skill === undefined ? [] : await homeCopiesOf(ctx.files, cli.name, ctx.env),
|
|
61
63
|
};
|
|
62
64
|
},
|
|
63
65
|
apply: async (plan, ctx) => {
|
|
@@ -74,7 +76,7 @@ export function updateCommand(cli, install, { bin, node }) {
|
|
|
74
76
|
ctx.signal.throwIfAborted();
|
|
75
77
|
ctx.progress(`installing ${plan.package}@${latest} with the npm under ${prefix}…`);
|
|
76
78
|
const skill = await ctx.runToEnd(`installing ${plan.package}@${latest}`, async () => {
|
|
77
|
-
await installGlobally(latest, globalNpm(cli, install, ctx,
|
|
79
|
+
await installGlobally(latest, globalNpm(cli, install, ctx, launch));
|
|
78
80
|
return syncHome(cli, plan.packageDir, ctx);
|
|
79
81
|
});
|
|
80
82
|
const update = {
|
|
@@ -82,7 +84,7 @@ export function updateCommand(cli, install, { bin, node }) {
|
|
|
82
84
|
latest,
|
|
83
85
|
installed: { version: latest, prefix },
|
|
84
86
|
skill,
|
|
85
|
-
upgrades: await upgradesOf(plan.packageDir, from, latest),
|
|
87
|
+
upgrades: await upgradesOf(ctx.files, plan.packageDir, from, latest),
|
|
86
88
|
};
|
|
87
89
|
if (ctx.signal.aborted) {
|
|
88
90
|
ctx.deliver(update);
|