@codemcp/agentskills-cli 0.0.5
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/LICENSE +19 -0
- package/dist/__tests__/cli.test.d.ts +2 -0
- package/dist/__tests__/cli.test.d.ts.map +1 -0
- package/dist/__tests__/cli.test.js +210 -0
- package/dist/__tests__/cli.test.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +66 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/__tests__/add.test.d.ts +2 -0
- package/dist/commands/__tests__/add.test.d.ts.map +1 -0
- package/dist/commands/__tests__/add.test.js +363 -0
- package/dist/commands/__tests__/add.test.js.map +1 -0
- package/dist/commands/__tests__/install.test.d.ts +2 -0
- package/dist/commands/__tests__/install.test.d.ts.map +1 -0
- package/dist/commands/__tests__/install.test.js +587 -0
- package/dist/commands/__tests__/install.test.js.map +1 -0
- package/dist/commands/__tests__/list.test.d.ts +2 -0
- package/dist/commands/__tests__/list.test.d.ts.map +1 -0
- package/dist/commands/__tests__/list.test.js +69 -0
- package/dist/commands/__tests__/list.test.js.map +1 -0
- package/dist/commands/__tests__/validate.test.d.ts +2 -0
- package/dist/commands/__tests__/validate.test.d.ts.map +1 -0
- package/dist/commands/__tests__/validate.test.js +858 -0
- package/dist/commands/__tests__/validate.test.js.map +1 -0
- package/dist/commands/add.d.ts +28 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +65 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/install.d.ts +16 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +125 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +4 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +41 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/validate.d.ts +26 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +244 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,587 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
2
|
+
import { promises as fs } from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { tmpdir } from "os";
|
|
5
|
+
import { installCommand } from "../install.js";
|
|
6
|
+
import { SkillInstaller } from "@codemcp/agentskills-core";
|
|
7
|
+
/**
|
|
8
|
+
* Comprehensive test suite for install command
|
|
9
|
+
*
|
|
10
|
+
* Following TDD RED phase:
|
|
11
|
+
* - Write tests first to define the command interface and behavior
|
|
12
|
+
* - Tests define expected user experience before implementation
|
|
13
|
+
* - Clear test structure with arrange-act-assert
|
|
14
|
+
* - Mock SkillInstaller to avoid real downloads
|
|
15
|
+
* - Use real file system with temp directories
|
|
16
|
+
*
|
|
17
|
+
* Coverage:
|
|
18
|
+
* 1. Basic Installation (install skills, create directory, parallel install, lock file, success message)
|
|
19
|
+
* 2. Error Handling (no package.json, no agentskills field, empty agentskills, installation failures)
|
|
20
|
+
* 3. Configuration (custom skillsDirectory, default directory, create parent dirs)
|
|
21
|
+
* 4. Output (spinner, checkmarks, summary)
|
|
22
|
+
* 5. Options (custom cwd, default cwd)
|
|
23
|
+
*/
|
|
24
|
+
describe("install command", () => {
|
|
25
|
+
let testDir;
|
|
26
|
+
let consoleLogSpy;
|
|
27
|
+
let consoleErrorSpy;
|
|
28
|
+
let processExitSpy;
|
|
29
|
+
let skillInstallerInstallSpy;
|
|
30
|
+
let skillInstallerGenerateLockFileSpy;
|
|
31
|
+
beforeEach(async () => {
|
|
32
|
+
// Create unique temp directory for each test
|
|
33
|
+
testDir = join(tmpdir(), `agentskills-test-${Date.now()}-${Math.random()}`);
|
|
34
|
+
await fs.mkdir(testDir, { recursive: true });
|
|
35
|
+
// Mock console and process.exit
|
|
36
|
+
consoleLogSpy = vi.spyOn(console, "log").mockImplementation(() => { });
|
|
37
|
+
consoleErrorSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
38
|
+
processExitSpy = vi
|
|
39
|
+
.spyOn(process, "exit")
|
|
40
|
+
.mockImplementation((() => { }));
|
|
41
|
+
// Mock SkillInstaller methods
|
|
42
|
+
skillInstallerInstallSpy = vi.spyOn(SkillInstaller.prototype, "install");
|
|
43
|
+
skillInstallerGenerateLockFileSpy = vi.spyOn(SkillInstaller.prototype, "generateLockFile");
|
|
44
|
+
});
|
|
45
|
+
afterEach(async () => {
|
|
46
|
+
// Clean up temp directory
|
|
47
|
+
try {
|
|
48
|
+
await fs.rm(testDir, { recursive: true, force: true });
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
// Ignore cleanup errors
|
|
52
|
+
}
|
|
53
|
+
// Restore mocks
|
|
54
|
+
consoleLogSpy.mockRestore();
|
|
55
|
+
consoleErrorSpy.mockRestore();
|
|
56
|
+
processExitSpy.mockRestore();
|
|
57
|
+
skillInstallerInstallSpy.mockRestore();
|
|
58
|
+
skillInstallerGenerateLockFileSpy.mockRestore();
|
|
59
|
+
});
|
|
60
|
+
// Helper function to create package.json with agentskills
|
|
61
|
+
async function createPackageJson(skills, config) {
|
|
62
|
+
const packageJson = {
|
|
63
|
+
name: "test-project",
|
|
64
|
+
version: "1.0.0",
|
|
65
|
+
agentskills: skills
|
|
66
|
+
};
|
|
67
|
+
if (config) {
|
|
68
|
+
packageJson.agentskillsConfig = config;
|
|
69
|
+
}
|
|
70
|
+
await fs.writeFile(join(testDir, "package.json"), JSON.stringify(packageJson, null, 2), "utf-8");
|
|
71
|
+
}
|
|
72
|
+
// Helper function to create successful install result
|
|
73
|
+
function createSuccessResult(name, spec) {
|
|
74
|
+
return {
|
|
75
|
+
success: true,
|
|
76
|
+
name,
|
|
77
|
+
spec,
|
|
78
|
+
resolvedVersion: "1.0.0",
|
|
79
|
+
integrity: "sha512-test",
|
|
80
|
+
installPath: join(testDir, ".agentskills/skills", name),
|
|
81
|
+
manifest: {
|
|
82
|
+
name,
|
|
83
|
+
description: "Test skill"
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
// Helper function to create failed install result
|
|
88
|
+
function createFailureResult(name, spec, message) {
|
|
89
|
+
return {
|
|
90
|
+
success: false,
|
|
91
|
+
name,
|
|
92
|
+
spec,
|
|
93
|
+
error: {
|
|
94
|
+
code: "INSTALL_FAILED",
|
|
95
|
+
message
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
describe("Basic Installation", () => {
|
|
100
|
+
it("should install skills from package.json", async () => {
|
|
101
|
+
// Arrange
|
|
102
|
+
await createPackageJson({
|
|
103
|
+
"skill-one": "github:user/skill-one",
|
|
104
|
+
"skill-two": "github:user/skill-two"
|
|
105
|
+
});
|
|
106
|
+
skillInstallerInstallSpy.mockImplementation(async (name, spec) => {
|
|
107
|
+
return createSuccessResult(name, spec);
|
|
108
|
+
});
|
|
109
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
110
|
+
// Act
|
|
111
|
+
await installCommand({ cwd: testDir });
|
|
112
|
+
// Assert
|
|
113
|
+
expect(skillInstallerInstallSpy).toHaveBeenCalledWith("skill-one", "github:user/skill-one");
|
|
114
|
+
expect(skillInstallerInstallSpy).toHaveBeenCalledWith("skill-two", "github:user/skill-two");
|
|
115
|
+
expect(processExitSpy).toHaveBeenCalledWith(0);
|
|
116
|
+
});
|
|
117
|
+
it("should create .agentskills/skills/ directory", async () => {
|
|
118
|
+
// Arrange
|
|
119
|
+
await createPackageJson({
|
|
120
|
+
"test-skill": "github:user/test-skill"
|
|
121
|
+
});
|
|
122
|
+
skillInstallerInstallSpy.mockResolvedValue(createSuccessResult("test-skill", "github:user/test-skill"));
|
|
123
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
124
|
+
// Act
|
|
125
|
+
await installCommand({ cwd: testDir });
|
|
126
|
+
// Assert
|
|
127
|
+
const skillsDir = join(testDir, ".agentskills/skills");
|
|
128
|
+
const exists = await fs
|
|
129
|
+
.access(skillsDir)
|
|
130
|
+
.then(() => true)
|
|
131
|
+
.catch(() => false);
|
|
132
|
+
expect(exists).toBe(true);
|
|
133
|
+
});
|
|
134
|
+
it("should install multiple skills in parallel", async () => {
|
|
135
|
+
// Arrange
|
|
136
|
+
await createPackageJson({
|
|
137
|
+
"skill-one": "github:user/skill-one",
|
|
138
|
+
"skill-two": "github:user/skill-two",
|
|
139
|
+
"skill-three": "github:user/skill-three"
|
|
140
|
+
});
|
|
141
|
+
const installPromises = [];
|
|
142
|
+
skillInstallerInstallSpy.mockImplementation(async (name, spec) => {
|
|
143
|
+
const promise = new Promise((resolve) => {
|
|
144
|
+
setTimeout(() => resolve(createSuccessResult(name, spec)), 10);
|
|
145
|
+
});
|
|
146
|
+
installPromises.push(promise);
|
|
147
|
+
return promise;
|
|
148
|
+
});
|
|
149
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
150
|
+
// Act
|
|
151
|
+
const startTime = Date.now();
|
|
152
|
+
await installCommand({ cwd: testDir });
|
|
153
|
+
const duration = Date.now() - startTime;
|
|
154
|
+
// Assert - should complete in parallel (< 50ms total, not 30ms sequential)
|
|
155
|
+
expect(installPromises.length).toBe(3);
|
|
156
|
+
expect(duration).toBeLessThan(50); // If sequential, would take 30ms
|
|
157
|
+
expect(processExitSpy).toHaveBeenCalledWith(0);
|
|
158
|
+
});
|
|
159
|
+
it("should generate lock file after installation", async () => {
|
|
160
|
+
// Arrange
|
|
161
|
+
await createPackageJson({
|
|
162
|
+
"skill-one": "github:user/skill-one"
|
|
163
|
+
});
|
|
164
|
+
const result = createSuccessResult("skill-one", "github:user/skill-one");
|
|
165
|
+
skillInstallerInstallSpy.mockResolvedValue(result);
|
|
166
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
167
|
+
// Act
|
|
168
|
+
await installCommand({ cwd: testDir });
|
|
169
|
+
// Assert
|
|
170
|
+
expect(skillInstallerGenerateLockFileSpy).toHaveBeenCalledWith({
|
|
171
|
+
"skill-one": result
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
it("should display success message", async () => {
|
|
175
|
+
// Arrange
|
|
176
|
+
await createPackageJson({
|
|
177
|
+
"skill-one": "github:user/skill-one",
|
|
178
|
+
"skill-two": "github:user/skill-two"
|
|
179
|
+
});
|
|
180
|
+
skillInstallerInstallSpy.mockImplementation(async (name, spec) => {
|
|
181
|
+
return createSuccessResult(name, spec);
|
|
182
|
+
});
|
|
183
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
184
|
+
// Act
|
|
185
|
+
await installCommand({ cwd: testDir });
|
|
186
|
+
// Assert
|
|
187
|
+
const output = consoleLogSpy.mock.calls
|
|
188
|
+
.map((call) => call.join(" "))
|
|
189
|
+
.join("\n");
|
|
190
|
+
expect(output).toMatch(/installed.*2.*skills?/i);
|
|
191
|
+
expect(output).toMatch(/\.agentskills\/skills/i);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
194
|
+
describe("Error Handling", () => {
|
|
195
|
+
it("should error when no package.json found", async () => {
|
|
196
|
+
// Arrange - no package.json created
|
|
197
|
+
// Act
|
|
198
|
+
await installCommand({ cwd: testDir });
|
|
199
|
+
// Assert
|
|
200
|
+
expect(consoleErrorSpy).toHaveBeenCalled();
|
|
201
|
+
const output = consoleErrorSpy.mock.calls
|
|
202
|
+
.map((call) => call.join(" "))
|
|
203
|
+
.join("\n");
|
|
204
|
+
expect(output).toMatch(/package\.json.*not found/i);
|
|
205
|
+
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
206
|
+
});
|
|
207
|
+
it("should warn and exit 0 when no agentskills field", async () => {
|
|
208
|
+
// Arrange
|
|
209
|
+
await fs.writeFile(join(testDir, "package.json"), JSON.stringify({ name: "test-project", version: "1.0.0" }, null, 2), "utf-8");
|
|
210
|
+
// Act
|
|
211
|
+
await installCommand({ cwd: testDir });
|
|
212
|
+
// Assert
|
|
213
|
+
expect(consoleLogSpy).toHaveBeenCalled();
|
|
214
|
+
const output = consoleLogSpy.mock.calls
|
|
215
|
+
.map((call) => call.join(" "))
|
|
216
|
+
.join("\n");
|
|
217
|
+
expect(output).toMatch(/no.*skills.*install|agentskills.*field.*empty/i);
|
|
218
|
+
expect(processExitSpy).toHaveBeenCalledWith(0);
|
|
219
|
+
});
|
|
220
|
+
it("should warn and exit 0 when empty agentskills object", async () => {
|
|
221
|
+
// Arrange
|
|
222
|
+
await createPackageJson({});
|
|
223
|
+
// Act
|
|
224
|
+
await installCommand({ cwd: testDir });
|
|
225
|
+
// Assert
|
|
226
|
+
expect(consoleLogSpy).toHaveBeenCalled();
|
|
227
|
+
const output = consoleLogSpy.mock.calls
|
|
228
|
+
.map((call) => call.join(" "))
|
|
229
|
+
.join("\n");
|
|
230
|
+
expect(output).toMatch(/no.*skills.*install|agentskills.*empty/i);
|
|
231
|
+
expect(processExitSpy).toHaveBeenCalledWith(0);
|
|
232
|
+
});
|
|
233
|
+
it("should show error for failed skill but continue installing others", async () => {
|
|
234
|
+
// Arrange
|
|
235
|
+
await createPackageJson({
|
|
236
|
+
"skill-one": "github:user/skill-one",
|
|
237
|
+
"skill-two": "github:user/invalid-skill",
|
|
238
|
+
"skill-three": "github:user/skill-three"
|
|
239
|
+
});
|
|
240
|
+
skillInstallerInstallSpy.mockImplementation(async (name, spec) => {
|
|
241
|
+
if (name === "skill-two") {
|
|
242
|
+
return createFailureResult(name, spec, "Package not found");
|
|
243
|
+
}
|
|
244
|
+
return createSuccessResult(name, spec);
|
|
245
|
+
});
|
|
246
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
247
|
+
// Act
|
|
248
|
+
await installCommand({ cwd: testDir });
|
|
249
|
+
// Assert
|
|
250
|
+
expect(skillInstallerInstallSpy).toHaveBeenCalledTimes(3);
|
|
251
|
+
expect(consoleErrorSpy).toHaveBeenCalled();
|
|
252
|
+
const errorOutput = consoleErrorSpy.mock.calls
|
|
253
|
+
.map((call) => call.join(" "))
|
|
254
|
+
.join("\n");
|
|
255
|
+
expect(errorOutput).toMatch(/skill-two.*failed/i);
|
|
256
|
+
expect(errorOutput).toMatch(/package not found/i);
|
|
257
|
+
const logOutput = consoleLogSpy.mock.calls
|
|
258
|
+
.map((call) => call.join(" "))
|
|
259
|
+
.join("\n");
|
|
260
|
+
expect(logOutput).toMatch(/2.*installed/i);
|
|
261
|
+
expect(logOutput).toMatch(/1.*failed/i);
|
|
262
|
+
});
|
|
263
|
+
it("should exit with code 1 when all skills fail to install", async () => {
|
|
264
|
+
// Arrange
|
|
265
|
+
await createPackageJson({
|
|
266
|
+
"skill-one": "github:user/invalid-one",
|
|
267
|
+
"skill-two": "github:user/invalid-two"
|
|
268
|
+
});
|
|
269
|
+
skillInstallerInstallSpy.mockImplementation(async (name, spec) => {
|
|
270
|
+
return createFailureResult(name, spec, "Network error");
|
|
271
|
+
});
|
|
272
|
+
// Act
|
|
273
|
+
await installCommand({ cwd: testDir });
|
|
274
|
+
// Assert
|
|
275
|
+
expect(consoleErrorSpy).toHaveBeenCalled();
|
|
276
|
+
const output = consoleErrorSpy.mock.calls
|
|
277
|
+
.map((call) => call.join(" "))
|
|
278
|
+
.join("\n");
|
|
279
|
+
expect(output).toMatch(/skill-one.*failed/i);
|
|
280
|
+
expect(output).toMatch(/skill-two.*failed/i);
|
|
281
|
+
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
282
|
+
});
|
|
283
|
+
it("should error when package.json is invalid JSON", async () => {
|
|
284
|
+
// Arrange
|
|
285
|
+
await fs.writeFile(join(testDir, "package.json"), "{ invalid json }", "utf-8");
|
|
286
|
+
// Act
|
|
287
|
+
await installCommand({ cwd: testDir });
|
|
288
|
+
// Assert
|
|
289
|
+
expect(consoleErrorSpy).toHaveBeenCalled();
|
|
290
|
+
const output = consoleErrorSpy.mock.calls
|
|
291
|
+
.map((call) => call.join(" "))
|
|
292
|
+
.join("\n");
|
|
293
|
+
expect(output).toMatch(/failed.*parse|invalid.*json/i);
|
|
294
|
+
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
295
|
+
});
|
|
296
|
+
it("should error when permission error creating directory", async () => {
|
|
297
|
+
// Arrange
|
|
298
|
+
await createPackageJson({
|
|
299
|
+
"test-skill": "github:user/test-skill"
|
|
300
|
+
});
|
|
301
|
+
// Create a file where the directory should be to cause EEXIST error
|
|
302
|
+
const skillsDir = join(testDir, ".agentskills");
|
|
303
|
+
await fs.mkdir(skillsDir, { recursive: true });
|
|
304
|
+
await fs.writeFile(join(skillsDir, "skills"), "blocking file", "utf-8");
|
|
305
|
+
skillInstallerInstallSpy.mockResolvedValue(createSuccessResult("test-skill", "github:user/test-skill"));
|
|
306
|
+
// Act
|
|
307
|
+
await installCommand({ cwd: testDir });
|
|
308
|
+
// Assert
|
|
309
|
+
expect(consoleErrorSpy).toHaveBeenCalled();
|
|
310
|
+
const output = consoleErrorSpy.mock.calls
|
|
311
|
+
.map((call) => call.join(" "))
|
|
312
|
+
.join("\n");
|
|
313
|
+
expect(output).toMatch(/failed.*create.*directory|permission|error/i);
|
|
314
|
+
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
315
|
+
});
|
|
316
|
+
});
|
|
317
|
+
describe("Configuration", () => {
|
|
318
|
+
it("should use agentskillsConfig.skillsDirectory if specified", async () => {
|
|
319
|
+
// Arrange
|
|
320
|
+
await createPackageJson({
|
|
321
|
+
"test-skill": "github:user/test-skill"
|
|
322
|
+
}, {
|
|
323
|
+
skillsDirectory: "custom-skills-dir"
|
|
324
|
+
});
|
|
325
|
+
skillInstallerInstallSpy.mockResolvedValue(createSuccessResult("test-skill", "github:user/test-skill"));
|
|
326
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
327
|
+
// Act
|
|
328
|
+
await installCommand({ cwd: testDir });
|
|
329
|
+
// Assert
|
|
330
|
+
// SkillInstaller should be created with custom directory
|
|
331
|
+
const customDir = join(testDir, "custom-skills-dir");
|
|
332
|
+
const exists = await fs
|
|
333
|
+
.access(customDir)
|
|
334
|
+
.then(() => true)
|
|
335
|
+
.catch(() => false);
|
|
336
|
+
expect(exists).toBe(true);
|
|
337
|
+
});
|
|
338
|
+
it("should default to .agentskills/skills/ if not specified", async () => {
|
|
339
|
+
// Arrange
|
|
340
|
+
await createPackageJson({
|
|
341
|
+
"test-skill": "github:user/test-skill"
|
|
342
|
+
});
|
|
343
|
+
skillInstallerInstallSpy.mockResolvedValue(createSuccessResult("test-skill", "github:user/test-skill"));
|
|
344
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
345
|
+
// Act
|
|
346
|
+
await installCommand({ cwd: testDir });
|
|
347
|
+
// Assert
|
|
348
|
+
const defaultDir = join(testDir, ".agentskills/skills");
|
|
349
|
+
const exists = await fs
|
|
350
|
+
.access(defaultDir)
|
|
351
|
+
.then(() => true)
|
|
352
|
+
.catch(() => false);
|
|
353
|
+
expect(exists).toBe(true);
|
|
354
|
+
});
|
|
355
|
+
it("should create parent directories if needed", async () => {
|
|
356
|
+
// Arrange
|
|
357
|
+
await createPackageJson({
|
|
358
|
+
"test-skill": "github:user/test-skill"
|
|
359
|
+
}, {
|
|
360
|
+
skillsDirectory: "deeply/nested/skills/directory"
|
|
361
|
+
});
|
|
362
|
+
skillInstallerInstallSpy.mockResolvedValue(createSuccessResult("test-skill", "github:user/test-skill"));
|
|
363
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
364
|
+
// Act
|
|
365
|
+
await installCommand({ cwd: testDir });
|
|
366
|
+
// Assert
|
|
367
|
+
const nestedDir = join(testDir, "deeply/nested/skills/directory");
|
|
368
|
+
const exists = await fs
|
|
369
|
+
.access(nestedDir)
|
|
370
|
+
.then(() => true)
|
|
371
|
+
.catch(() => false);
|
|
372
|
+
expect(exists).toBe(true);
|
|
373
|
+
});
|
|
374
|
+
});
|
|
375
|
+
describe("Output", () => {
|
|
376
|
+
it("should show spinner during installation", async () => {
|
|
377
|
+
// Arrange
|
|
378
|
+
await createPackageJson({
|
|
379
|
+
"test-skill": "github:user/test-skill"
|
|
380
|
+
});
|
|
381
|
+
skillInstallerInstallSpy.mockImplementation(async (name, spec) => {
|
|
382
|
+
// Simulate some delay
|
|
383
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
384
|
+
return createSuccessResult(name, spec);
|
|
385
|
+
});
|
|
386
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
387
|
+
// Act
|
|
388
|
+
await installCommand({ cwd: testDir });
|
|
389
|
+
// Assert
|
|
390
|
+
const output = consoleLogSpy.mock.calls
|
|
391
|
+
.map((call) => call.join(" "))
|
|
392
|
+
.join("\n");
|
|
393
|
+
// Output should contain some indication of progress (spinner messages)
|
|
394
|
+
// The actual implementation will use ora for spinners
|
|
395
|
+
expect(output.length).toBeGreaterThan(0);
|
|
396
|
+
});
|
|
397
|
+
it("should show success checkmarks for each skill", async () => {
|
|
398
|
+
// Arrange
|
|
399
|
+
await createPackageJson({
|
|
400
|
+
"skill-one": "github:user/skill-one",
|
|
401
|
+
"skill-two": "github:user/skill-two"
|
|
402
|
+
});
|
|
403
|
+
skillInstallerInstallSpy.mockImplementation(async (name, spec) => {
|
|
404
|
+
return createSuccessResult(name, spec);
|
|
405
|
+
});
|
|
406
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
407
|
+
// Act
|
|
408
|
+
await installCommand({ cwd: testDir });
|
|
409
|
+
// Assert
|
|
410
|
+
const output = consoleLogSpy.mock.calls
|
|
411
|
+
.map((call) => call.join(" "))
|
|
412
|
+
.join("\n");
|
|
413
|
+
expect(output).toMatch(/✓.*skill-one/i);
|
|
414
|
+
expect(output).toMatch(/✓.*skill-two/i);
|
|
415
|
+
});
|
|
416
|
+
it("should show final summary with count and location", async () => {
|
|
417
|
+
// Arrange
|
|
418
|
+
await createPackageJson({
|
|
419
|
+
"skill-one": "github:user/skill-one",
|
|
420
|
+
"skill-two": "github:user/skill-two",
|
|
421
|
+
"skill-three": "github:user/skill-three"
|
|
422
|
+
});
|
|
423
|
+
skillInstallerInstallSpy.mockImplementation(async (name, spec) => {
|
|
424
|
+
return createSuccessResult(name, spec);
|
|
425
|
+
});
|
|
426
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
427
|
+
// Act
|
|
428
|
+
await installCommand({ cwd: testDir });
|
|
429
|
+
// Assert
|
|
430
|
+
const output = consoleLogSpy.mock.calls
|
|
431
|
+
.map((call) => call.join(" "))
|
|
432
|
+
.join("\n");
|
|
433
|
+
expect(output).toMatch(/3.*skills?.*installed/i);
|
|
434
|
+
expect(output).toMatch(/\.agentskills\/skills/i);
|
|
435
|
+
});
|
|
436
|
+
});
|
|
437
|
+
describe("Options", () => {
|
|
438
|
+
it("should use custom cwd option", async () => {
|
|
439
|
+
// Arrange
|
|
440
|
+
const customDir = join(testDir, "custom-project");
|
|
441
|
+
await fs.mkdir(customDir, { recursive: true });
|
|
442
|
+
await fs.writeFile(join(customDir, "package.json"), JSON.stringify({
|
|
443
|
+
name: "custom-project",
|
|
444
|
+
agentskills: {
|
|
445
|
+
"test-skill": "github:user/test-skill"
|
|
446
|
+
}
|
|
447
|
+
}, null, 2), "utf-8");
|
|
448
|
+
skillInstallerInstallSpy.mockResolvedValue(createSuccessResult("test-skill", "github:user/test-skill"));
|
|
449
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
450
|
+
// Act
|
|
451
|
+
await installCommand({ cwd: customDir });
|
|
452
|
+
// Assert
|
|
453
|
+
const skillsDir = join(customDir, ".agentskills/skills");
|
|
454
|
+
const exists = await fs
|
|
455
|
+
.access(skillsDir)
|
|
456
|
+
.then(() => true)
|
|
457
|
+
.catch(() => false);
|
|
458
|
+
expect(exists).toBe(true);
|
|
459
|
+
expect(processExitSpy).toHaveBeenCalledWith(0);
|
|
460
|
+
});
|
|
461
|
+
it("should default cwd to process.cwd()", async () => {
|
|
462
|
+
// Arrange
|
|
463
|
+
const originalCwd = process.cwd();
|
|
464
|
+
// Change to test directory
|
|
465
|
+
process.chdir(testDir);
|
|
466
|
+
await createPackageJson({
|
|
467
|
+
"test-skill": "github:user/test-skill"
|
|
468
|
+
});
|
|
469
|
+
skillInstallerInstallSpy.mockResolvedValue(createSuccessResult("test-skill", "github:user/test-skill"));
|
|
470
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
471
|
+
try {
|
|
472
|
+
// Act
|
|
473
|
+
await installCommand(); // No cwd option
|
|
474
|
+
// Assert
|
|
475
|
+
const skillsDir = join(testDir, ".agentskills/skills");
|
|
476
|
+
const exists = await fs
|
|
477
|
+
.access(skillsDir)
|
|
478
|
+
.then(() => true)
|
|
479
|
+
.catch(() => false);
|
|
480
|
+
expect(exists).toBe(true);
|
|
481
|
+
expect(processExitSpy).toHaveBeenCalledWith(0);
|
|
482
|
+
}
|
|
483
|
+
finally {
|
|
484
|
+
// Restore original cwd
|
|
485
|
+
process.chdir(originalCwd);
|
|
486
|
+
}
|
|
487
|
+
});
|
|
488
|
+
});
|
|
489
|
+
describe("Lock File Generation", () => {
|
|
490
|
+
it("should generate lock file only with successful installs", async () => {
|
|
491
|
+
// Arrange
|
|
492
|
+
await createPackageJson({
|
|
493
|
+
"skill-one": "github:user/skill-one",
|
|
494
|
+
"skill-two": "github:user/invalid-skill",
|
|
495
|
+
"skill-three": "github:user/skill-three"
|
|
496
|
+
});
|
|
497
|
+
skillInstallerInstallSpy.mockImplementation(async (name, spec) => {
|
|
498
|
+
if (name === "skill-two") {
|
|
499
|
+
return createFailureResult(name, spec, "Package not found");
|
|
500
|
+
}
|
|
501
|
+
return createSuccessResult(name, spec);
|
|
502
|
+
});
|
|
503
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
504
|
+
// Act
|
|
505
|
+
await installCommand({ cwd: testDir });
|
|
506
|
+
// Assert
|
|
507
|
+
expect(skillInstallerGenerateLockFileSpy).toHaveBeenCalledTimes(1);
|
|
508
|
+
const lockFileArg = skillInstallerGenerateLockFileSpy.mock
|
|
509
|
+
.calls[0][0];
|
|
510
|
+
expect(Object.keys(lockFileArg)).toHaveLength(2);
|
|
511
|
+
expect(lockFileArg["skill-one"]).toBeDefined();
|
|
512
|
+
expect(lockFileArg["skill-three"]).toBeDefined();
|
|
513
|
+
expect(lockFileArg["skill-two"]).toBeUndefined();
|
|
514
|
+
});
|
|
515
|
+
it("should not generate lock file when all installs fail", async () => {
|
|
516
|
+
// Arrange
|
|
517
|
+
await createPackageJson({
|
|
518
|
+
"skill-one": "github:user/invalid-one",
|
|
519
|
+
"skill-two": "github:user/invalid-two"
|
|
520
|
+
});
|
|
521
|
+
skillInstallerInstallSpy.mockImplementation(async (name, spec) => {
|
|
522
|
+
return createFailureResult(name, spec, "Network error");
|
|
523
|
+
});
|
|
524
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
525
|
+
// Act
|
|
526
|
+
await installCommand({ cwd: testDir });
|
|
527
|
+
// Assert
|
|
528
|
+
expect(skillInstallerGenerateLockFileSpy).not.toHaveBeenCalled();
|
|
529
|
+
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
530
|
+
});
|
|
531
|
+
});
|
|
532
|
+
describe("Edge Cases", () => {
|
|
533
|
+
it("should handle skills with special characters in names", async () => {
|
|
534
|
+
// Arrange
|
|
535
|
+
await createPackageJson({
|
|
536
|
+
"skill-with-dashes": "github:user/skill-with-dashes",
|
|
537
|
+
"@scoped/skill": "github:org/scoped-skill"
|
|
538
|
+
});
|
|
539
|
+
skillInstallerInstallSpy.mockImplementation(async (name, spec) => {
|
|
540
|
+
return createSuccessResult(name, spec);
|
|
541
|
+
});
|
|
542
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
543
|
+
// Act
|
|
544
|
+
await installCommand({ cwd: testDir });
|
|
545
|
+
// Assert
|
|
546
|
+
expect(skillInstallerInstallSpy).toHaveBeenCalledWith("skill-with-dashes", "github:user/skill-with-dashes");
|
|
547
|
+
expect(skillInstallerInstallSpy).toHaveBeenCalledWith("@scoped/skill", "github:org/scoped-skill");
|
|
548
|
+
expect(processExitSpy).toHaveBeenCalledWith(0);
|
|
549
|
+
});
|
|
550
|
+
it("should handle large number of skills", async () => {
|
|
551
|
+
// Arrange
|
|
552
|
+
const skills = {};
|
|
553
|
+
for (let i = 0; i < 50; i++) {
|
|
554
|
+
skills[`skill-${i}`] = `github:user/skill-${i}`;
|
|
555
|
+
}
|
|
556
|
+
await createPackageJson(skills);
|
|
557
|
+
skillInstallerInstallSpy.mockImplementation(async (name, spec) => {
|
|
558
|
+
return createSuccessResult(name, spec);
|
|
559
|
+
});
|
|
560
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
561
|
+
// Act
|
|
562
|
+
await installCommand({ cwd: testDir });
|
|
563
|
+
// Assert
|
|
564
|
+
expect(skillInstallerInstallSpy).toHaveBeenCalledTimes(50);
|
|
565
|
+
const output = consoleLogSpy.mock.calls
|
|
566
|
+
.map((call) => call.join(" "))
|
|
567
|
+
.join("\n");
|
|
568
|
+
expect(output).toMatch(/50.*skills?.*installed/i);
|
|
569
|
+
expect(processExitSpy).toHaveBeenCalledWith(0);
|
|
570
|
+
});
|
|
571
|
+
it("should handle installation with no output captured", async () => {
|
|
572
|
+
// Arrange
|
|
573
|
+
await createPackageJson({
|
|
574
|
+
"test-skill": "github:user/test-skill"
|
|
575
|
+
});
|
|
576
|
+
skillInstallerInstallSpy.mockResolvedValue(createSuccessResult("test-skill", "github:user/test-skill"));
|
|
577
|
+
skillInstallerGenerateLockFileSpy.mockResolvedValue(undefined);
|
|
578
|
+
// Remove console spies to ensure command works without them
|
|
579
|
+
consoleLogSpy.mockRestore();
|
|
580
|
+
consoleErrorSpy.mockRestore();
|
|
581
|
+
// Act & Assert - should not throw
|
|
582
|
+
await installCommand({ cwd: testDir });
|
|
583
|
+
expect(processExitSpy).toHaveBeenCalledWith(0);
|
|
584
|
+
});
|
|
585
|
+
});
|
|
586
|
+
});
|
|
587
|
+
//# sourceMappingURL=install.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.test.js","sourceRoot":"","sources":["../../../src/commands/__tests__/install.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["../../../src/commands/__tests__/list.test.ts"],"names":[],"mappings":""}
|