superskill 0.2.2 → 0.2.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/.claude-plugin/marketplace.json +23 -0
- package/.claude-plugin/plugin.json +12 -0
- package/.mcp.json +9 -0
- package/CHANGELOG.md +28 -0
- package/LICENSE-COMMERCIAL.md +46 -0
- package/dist/cli.js +0 -0
- package/dist/commands/skill/marketplace.d.ts +1 -0
- package/dist/commands/skill/marketplace.js +79 -35
- package/dist/commands/skill/marketplace.js.map +1 -1
- package/dist/commands/skill/web-discovery.d.ts +36 -0
- package/dist/commands/skill/web-discovery.js +196 -0
- package/dist/commands/skill/web-discovery.js.map +1 -0
- package/dist/core/registry.js +8 -16
- package/dist/core/registry.js.map +1 -1
- package/dist/mcp-server.js +0 -0
- package/dist/setup/configure.js +21 -1
- package/dist/setup/configure.js.map +1 -1
- package/dist/setup/teardown.js +13 -5
- package/dist/setup/teardown.js.map +1 -1
- package/package.json +7 -1
- package/dist/commands/brainstorm.test.d.ts +0 -1
- package/dist/commands/brainstorm.test.js +0 -110
- package/dist/commands/brainstorm.test.js.map +0 -1
- package/dist/commands/context.test.d.ts +0 -1
- package/dist/commands/context.test.js +0 -230
- package/dist/commands/context.test.js.map +0 -1
- package/dist/commands/decide.test.d.ts +0 -1
- package/dist/commands/decide.test.js +0 -109
- package/dist/commands/decide.test.js.map +0 -1
- package/dist/commands/graph.test.d.ts +0 -1
- package/dist/commands/graph.test.js +0 -215
- package/dist/commands/graph.test.js.map +0 -1
- package/dist/commands/learn.test.d.ts +0 -1
- package/dist/commands/learn.test.js +0 -241
- package/dist/commands/learn.test.js.map +0 -1
- package/dist/commands/read.test.d.ts +0 -1
- package/dist/commands/read.test.js +0 -48
- package/dist/commands/read.test.js.map +0 -1
- package/dist/commands/resume.test.d.ts +0 -1
- package/dist/commands/resume.test.js +0 -243
- package/dist/commands/resume.test.js.map +0 -1
- package/dist/commands/search.test.d.ts +0 -1
- package/dist/commands/search.test.js +0 -61
- package/dist/commands/search.test.js.map +0 -1
- package/dist/commands/session.test.d.ts +0 -1
- package/dist/commands/session.test.js +0 -231
- package/dist/commands/session.test.js.map +0 -1
- package/dist/commands/skill/index.test.d.ts +0 -1
- package/dist/commands/skill/index.test.js +0 -137
- package/dist/commands/skill/index.test.js.map +0 -1
- package/dist/commands/skill/install.test.d.ts +0 -1
- package/dist/commands/skill/install.test.js +0 -225
- package/dist/commands/skill/install.test.js.map +0 -1
- package/dist/commands/skill/list.test.d.ts +0 -1
- package/dist/commands/skill/list.test.js +0 -101
- package/dist/commands/skill/list.test.js.map +0 -1
- package/dist/commands/skill/schema.test.d.ts +0 -1
- package/dist/commands/skill/schema.test.js +0 -142
- package/dist/commands/skill/schema.test.js.map +0 -1
- package/dist/commands/skill/validate.test.d.ts +0 -1
- package/dist/commands/skill/validate.test.js +0 -171
- package/dist/commands/skill/validate.test.js.map +0 -1
- package/dist/commands/task.test.d.ts +0 -1
- package/dist/commands/task.test.js +0 -395
- package/dist/commands/task.test.js.map +0 -1
- package/dist/commands/todo.test.d.ts +0 -1
- package/dist/commands/todo.test.js +0 -324
- package/dist/commands/todo.test.js.map +0 -1
- package/dist/commands/write.test.d.ts +0 -1
- package/dist/commands/write.test.js +0 -79
- package/dist/commands/write.test.js.map +0 -1
- package/dist/config.test.d.ts +0 -1
- package/dist/config.test.js +0 -147
- package/dist/config.test.js.map +0 -1
- package/dist/core/executor.d.ts +0 -11
- package/dist/core/executor.js +0 -42
- package/dist/core/executor.js.map +0 -1
- package/dist/core/executor.test.d.ts +0 -1
- package/dist/core/executor.test.js +0 -206
- package/dist/core/executor.test.js.map +0 -1
- package/dist/core/middleware/error-handler.d.ts +0 -2
- package/dist/core/middleware/error-handler.js +0 -29
- package/dist/core/middleware/error-handler.js.map +0 -1
- package/dist/core/middleware/index.d.ts +0 -2
- package/dist/core/middleware/index.js +0 -3
- package/dist/core/middleware/index.js.map +0 -1
- package/dist/core/middleware/logging.d.ts +0 -2
- package/dist/core/middleware/logging.js +0 -18
- package/dist/core/middleware/logging.js.map +0 -1
- package/dist/core/registry.test.d.ts +0 -1
- package/dist/core/registry.test.js +0 -213
- package/dist/core/registry.test.js.map +0 -1
- package/dist/integration/coordination.test.d.ts +0 -1
- package/dist/integration/coordination.test.js +0 -286
- package/dist/integration/coordination.test.js.map +0 -1
- package/dist/integration/project-artifacts.test.d.ts +0 -1
- package/dist/integration/project-artifacts.test.js +0 -275
- package/dist/integration/project-artifacts.test.js.map +0 -1
- package/dist/integration/registry-graph.test.d.ts +0 -1
- package/dist/integration/registry-graph.test.js +0 -157
- package/dist/integration/registry-graph.test.js.map +0 -1
- package/dist/integration/vault-lifecycle.test.d.ts +0 -1
- package/dist/integration/vault-lifecycle.test.js +0 -183
- package/dist/integration/vault-lifecycle.test.js.map +0 -1
- package/dist/lib/auto-number.test.d.ts +0 -1
- package/dist/lib/auto-number.test.js +0 -88
- package/dist/lib/auto-number.test.js.map +0 -1
- package/dist/lib/auto-profile.test.d.ts +0 -1
- package/dist/lib/auto-profile.test.js +0 -227
- package/dist/lib/auto-profile.test.js.map +0 -1
- package/dist/lib/escape-regex.test.d.ts +0 -1
- package/dist/lib/escape-regex.test.js +0 -27
- package/dist/lib/escape-regex.test.js.map +0 -1
- package/dist/lib/frontmatter.test.d.ts +0 -1
- package/dist/lib/frontmatter.test.js +0 -192
- package/dist/lib/frontmatter.test.js.map +0 -1
- package/dist/lib/project-detector.test.d.ts +0 -1
- package/dist/lib/project-detector.test.js +0 -117
- package/dist/lib/project-detector.test.js.map +0 -1
- package/dist/lib/safe-external-path.test.d.ts +0 -1
- package/dist/lib/safe-external-path.test.js +0 -99
- package/dist/lib/safe-external-path.test.js.map +0 -1
- package/dist/lib/search-engine.test.d.ts +0 -1
- package/dist/lib/search-engine.test.js +0 -120
- package/dist/lib/search-engine.test.js.map +0 -1
- package/dist/lib/session-registry.test.d.ts +0 -1
- package/dist/lib/session-registry.test.js +0 -199
- package/dist/lib/session-registry.test.js.map +0 -1
- package/dist/lib/stack-detector.test.d.ts +0 -1
- package/dist/lib/stack-detector.test.js +0 -110
- package/dist/lib/stack-detector.test.js.map +0 -1
- package/dist/lib/token-estimator.test.d.ts +0 -1
- package/dist/lib/token-estimator.test.js +0 -65
- package/dist/lib/token-estimator.test.js.map +0 -1
- package/dist/lib/tool-detector.test.d.ts +0 -1
- package/dist/lib/tool-detector.test.js +0 -170
- package/dist/lib/tool-detector.test.js.map +0 -1
- package/dist/lib/vault-fs.test.d.ts +0 -1
- package/dist/lib/vault-fs.test.js +0 -210
- package/dist/lib/vault-fs.test.js.map +0 -1
- package/dist/setup/configure.test.d.ts +0 -1
- package/dist/setup/configure.test.js +0 -112
- package/dist/setup/configure.test.js.map +0 -1
- package/dist/setup/detect.test.d.ts +0 -1
- package/dist/setup/detect.test.js +0 -44
- package/dist/setup/detect.test.js.map +0 -1
- package/dist/setup/instructions.test.d.ts +0 -1
- package/dist/setup/instructions.test.js +0 -84
- package/dist/setup/instructions.test.js.map +0 -1
- package/dist/setup/json-config.test.d.ts +0 -1
- package/dist/setup/json-config.test.js +0 -92
- package/dist/setup/json-config.test.js.map +0 -1
- package/dist/setup/setup-integration.test.d.ts +0 -1
- package/dist/setup/setup-integration.test.js +0 -72
- package/dist/setup/setup-integration.test.js.map +0 -1
- package/dist/setup/teardown.test.d.ts +0 -1
- package/dist/setup/teardown.test.js +0 -105
- package/dist/setup/teardown.test.js.map +0 -1
- package/dist/setup/toml-config.test.d.ts +0 -1
- package/dist/setup/toml-config.test.js +0 -49
- package/dist/setup/toml-config.test.js.map +0 -1
- package/dist/test-helpers.test.d.ts +0 -1
- package/dist/test-helpers.test.js +0 -90
- package/dist/test-helpers.test.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search.test.js","sourceRoot":"","sources":["../../src/commands/search.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,231 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
2
|
-
import { mkdir, rm } from "fs/promises";
|
|
3
|
-
import { homedir } from "os";
|
|
4
|
-
import { join } from "path";
|
|
5
|
-
import { sessionCommand } from "./session.js";
|
|
6
|
-
import { SessionRegistryManager } from "../lib/session-registry.js";
|
|
7
|
-
import { VaultFS } from "../lib/vault-fs.js";
|
|
8
|
-
function createCommandContext(vaultFs, overrides) {
|
|
9
|
-
return {
|
|
10
|
-
vaultFs,
|
|
11
|
-
vaultPath: vaultFs.root,
|
|
12
|
-
sessionRegistry: {},
|
|
13
|
-
config: {},
|
|
14
|
-
log: { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() },
|
|
15
|
-
...overrides,
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
describe("sessionCommand", () => {
|
|
19
|
-
let vaultRoot;
|
|
20
|
-
let vaultFs;
|
|
21
|
-
let registry;
|
|
22
|
-
let ctx;
|
|
23
|
-
beforeEach(async () => {
|
|
24
|
-
vaultRoot = join(homedir(), `.vault-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
25
|
-
await mkdir(vaultRoot, { recursive: true });
|
|
26
|
-
await mkdir(join(vaultRoot, "coordination/locks"), { recursive: true });
|
|
27
|
-
vaultFs = new VaultFS(vaultRoot);
|
|
28
|
-
registry = new SessionRegistryManager(vaultRoot, 24);
|
|
29
|
-
ctx = createCommandContext(vaultFs, { sessionRegistry: registry });
|
|
30
|
-
});
|
|
31
|
-
afterEach(async () => {
|
|
32
|
-
await rm(vaultRoot, { recursive: true, force: true });
|
|
33
|
-
});
|
|
34
|
-
describe("register", () => {
|
|
35
|
-
it("registers a new session", async () => {
|
|
36
|
-
const result = await sessionCommand({
|
|
37
|
-
action: "register",
|
|
38
|
-
tool: "claude",
|
|
39
|
-
project: "test-project",
|
|
40
|
-
taskSummary: "Implement feature X",
|
|
41
|
-
filesTouched: ["src/index.ts"],
|
|
42
|
-
}, ctx);
|
|
43
|
-
expect(result.session_id).toBeDefined();
|
|
44
|
-
expect(result.session_id).toMatch(/^claude-/);
|
|
45
|
-
expect(result.conflicts).toEqual([]);
|
|
46
|
-
});
|
|
47
|
-
it("detects conflicts when touching same files", async () => {
|
|
48
|
-
await sessionCommand({
|
|
49
|
-
action: "register",
|
|
50
|
-
tool: "cursor",
|
|
51
|
-
project: "test-project",
|
|
52
|
-
taskSummary: "Working on Y",
|
|
53
|
-
filesTouched: ["src/shared.ts"],
|
|
54
|
-
}, ctx);
|
|
55
|
-
const result = await sessionCommand({
|
|
56
|
-
action: "register",
|
|
57
|
-
tool: "claude",
|
|
58
|
-
project: "test-project",
|
|
59
|
-
taskSummary: "Working on X",
|
|
60
|
-
filesTouched: ["src/shared.ts", "src/other.ts"],
|
|
61
|
-
}, ctx);
|
|
62
|
-
expect(result.conflicts).toBeDefined();
|
|
63
|
-
expect(result.conflicts.length).toBeGreaterThan(0);
|
|
64
|
-
expect(result.conflicts[0].overlapping_files).toContain("src/shared.ts");
|
|
65
|
-
});
|
|
66
|
-
it("requires tool name for register", async () => {
|
|
67
|
-
await expect(sessionCommand({
|
|
68
|
-
action: "register",
|
|
69
|
-
}, ctx)).rejects.toThrow("Tool name required for register");
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
describe("heartbeat", () => {
|
|
73
|
-
it("updates session timestamp", async () => {
|
|
74
|
-
const { session_id } = await sessionCommand({
|
|
75
|
-
action: "register",
|
|
76
|
-
tool: "claude",
|
|
77
|
-
project: "test-project",
|
|
78
|
-
}, ctx);
|
|
79
|
-
const result = await sessionCommand({
|
|
80
|
-
action: "heartbeat",
|
|
81
|
-
sessionId: session_id,
|
|
82
|
-
}, ctx);
|
|
83
|
-
expect(result).toEqual({});
|
|
84
|
-
});
|
|
85
|
-
it("requires session ID for heartbeat", async () => {
|
|
86
|
-
await expect(sessionCommand({
|
|
87
|
-
action: "heartbeat",
|
|
88
|
-
}, ctx)).rejects.toThrow("Session ID required for heartbeat");
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
describe("complete", () => {
|
|
92
|
-
it("marks session as completed", async () => {
|
|
93
|
-
const { session_id } = await sessionCommand({
|
|
94
|
-
action: "register",
|
|
95
|
-
tool: "claude",
|
|
96
|
-
project: "test-project",
|
|
97
|
-
taskSummary: "Task summary",
|
|
98
|
-
}, ctx);
|
|
99
|
-
const result = await sessionCommand({
|
|
100
|
-
action: "complete",
|
|
101
|
-
sessionId: session_id,
|
|
102
|
-
taskSummary: "Completed task",
|
|
103
|
-
}, ctx);
|
|
104
|
-
expect(result).toEqual({});
|
|
105
|
-
});
|
|
106
|
-
it("persists session note when vault and project provided", async () => {
|
|
107
|
-
const { session_id } = await sessionCommand({
|
|
108
|
-
action: "register",
|
|
109
|
-
tool: "claude",
|
|
110
|
-
project: "test-project",
|
|
111
|
-
}, ctx);
|
|
112
|
-
await mkdir(join(vaultRoot, "projects/test-project/sessions"), { recursive: true });
|
|
113
|
-
const result = await sessionCommand({
|
|
114
|
-
action: "complete",
|
|
115
|
-
sessionId: session_id,
|
|
116
|
-
project: "test-project",
|
|
117
|
-
tool: "claude",
|
|
118
|
-
outcome: "Feature implemented",
|
|
119
|
-
filesTouched: ["src/index.ts"],
|
|
120
|
-
tasksCompleted: ["task-001"],
|
|
121
|
-
}, ctx);
|
|
122
|
-
expect(result.session_note_path).toBeDefined();
|
|
123
|
-
expect(result.session_note_path).toMatch(/projects\/test-project\/sessions\/\d{4}-\d{2}-\d{2}-claude-/);
|
|
124
|
-
const content = await vaultFs.read(result.session_note_path);
|
|
125
|
-
expect(content).toContain("type: session");
|
|
126
|
-
expect(content).toContain("tool: claude");
|
|
127
|
-
expect(content).toContain("Feature implemented");
|
|
128
|
-
});
|
|
129
|
-
it("requires session ID for complete", async () => {
|
|
130
|
-
await expect(sessionCommand({
|
|
131
|
-
action: "complete",
|
|
132
|
-
}, ctx)).rejects.toThrow("Session ID required for complete");
|
|
133
|
-
});
|
|
134
|
-
});
|
|
135
|
-
describe("list_active", () => {
|
|
136
|
-
it("lists active sessions", async () => {
|
|
137
|
-
await sessionCommand({
|
|
138
|
-
action: "register",
|
|
139
|
-
tool: "claude",
|
|
140
|
-
project: "test-project",
|
|
141
|
-
taskSummary: "Task 1",
|
|
142
|
-
}, ctx);
|
|
143
|
-
await sessionCommand({
|
|
144
|
-
action: "register",
|
|
145
|
-
tool: "cursor",
|
|
146
|
-
project: "other-project",
|
|
147
|
-
taskSummary: "Task 2",
|
|
148
|
-
}, ctx);
|
|
149
|
-
const result = await sessionCommand({
|
|
150
|
-
action: "list_active",
|
|
151
|
-
}, ctx);
|
|
152
|
-
expect(result.active_sessions).toBeDefined();
|
|
153
|
-
expect(result.active_sessions.length).toBeGreaterThanOrEqual(2);
|
|
154
|
-
});
|
|
155
|
-
it("excludes completed sessions", async () => {
|
|
156
|
-
const { session_id } = await sessionCommand({
|
|
157
|
-
action: "register",
|
|
158
|
-
tool: "claude",
|
|
159
|
-
project: "test-project",
|
|
160
|
-
}, ctx);
|
|
161
|
-
await sessionCommand({
|
|
162
|
-
action: "register",
|
|
163
|
-
tool: "cursor",
|
|
164
|
-
project: "test-project",
|
|
165
|
-
}, ctx);
|
|
166
|
-
await sessionCommand({
|
|
167
|
-
action: "complete",
|
|
168
|
-
sessionId: session_id,
|
|
169
|
-
}, ctx);
|
|
170
|
-
const result = await sessionCommand({
|
|
171
|
-
action: "list_active",
|
|
172
|
-
}, ctx);
|
|
173
|
-
const activeIds = result.active_sessions.map((s) => s.id);
|
|
174
|
-
expect(activeIds).not.toContain(session_id);
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
describe("persist session note", () => {
|
|
178
|
-
it("creates session note when completing with project and vaultFs", async () => {
|
|
179
|
-
await mkdir(join(vaultRoot, "projects/test-project/sessions"), { recursive: true });
|
|
180
|
-
const { session_id } = await sessionCommand({
|
|
181
|
-
action: "register",
|
|
182
|
-
tool: "claude-code",
|
|
183
|
-
project: "test-project",
|
|
184
|
-
taskSummary: "Build feature X",
|
|
185
|
-
filesTouched: ["src/index.ts"],
|
|
186
|
-
}, ctx);
|
|
187
|
-
await sessionCommand({
|
|
188
|
-
action: "complete",
|
|
189
|
-
sessionId: session_id,
|
|
190
|
-
project: "test-project",
|
|
191
|
-
outcome: "Completed successfully",
|
|
192
|
-
filesTouched: ["src/index.ts"],
|
|
193
|
-
tasksCompleted: ["task-001"],
|
|
194
|
-
}, ctx);
|
|
195
|
-
const files = await vaultFs.list("projects/test-project/sessions");
|
|
196
|
-
expect(files.length).toBeGreaterThanOrEqual(1);
|
|
197
|
-
const notePath = files.find((f) => f.endsWith(".md"));
|
|
198
|
-
expect(notePath).toBeDefined();
|
|
199
|
-
const content = await vaultFs.read(notePath);
|
|
200
|
-
expect(content).toContain("claude-code");
|
|
201
|
-
expect(content).toContain("Completed successfully");
|
|
202
|
-
expect(content).toContain("src/index.ts");
|
|
203
|
-
});
|
|
204
|
-
it("extracts tool name from session ID for note heading", async () => {
|
|
205
|
-
await mkdir(join(vaultRoot, "projects/test-project/sessions"), { recursive: true });
|
|
206
|
-
const { session_id } = await sessionCommand({
|
|
207
|
-
action: "register",
|
|
208
|
-
tool: "my-custom-tool",
|
|
209
|
-
project: "test-project",
|
|
210
|
-
}, ctx);
|
|
211
|
-
await sessionCommand({
|
|
212
|
-
action: "complete",
|
|
213
|
-
sessionId: session_id,
|
|
214
|
-
project: "test-project",
|
|
215
|
-
outcome: "Done",
|
|
216
|
-
}, ctx);
|
|
217
|
-
const files = await vaultFs.list("projects/test-project/sessions");
|
|
218
|
-
const notePath = files.find((f) => f.endsWith(".md"));
|
|
219
|
-
const content = await vaultFs.read(notePath);
|
|
220
|
-
expect(content).toContain("my-custom-tool");
|
|
221
|
-
});
|
|
222
|
-
});
|
|
223
|
-
describe("unknown action", () => {
|
|
224
|
-
it("throws error for unknown action", async () => {
|
|
225
|
-
await expect(sessionCommand({
|
|
226
|
-
action: "unknown",
|
|
227
|
-
}, ctx)).rejects.toThrow("Unknown action: unknown");
|
|
228
|
-
});
|
|
229
|
-
});
|
|
230
|
-
});
|
|
231
|
-
//# sourceMappingURL=session.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session.test.js","sourceRoot":"","sources":["../../src/commands/session.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import { mkdir, writeFile, rm } from "fs/promises";
|
|
3
|
-
import { homedir } from "os";
|
|
4
|
-
import { join } from "path";
|
|
5
|
-
import { skillCommand } from "./index.js";
|
|
6
|
-
import { VaultFS } from "../../lib/vault-fs.js";
|
|
7
|
-
const validSkillContent = `---
|
|
8
|
-
name: test-skill
|
|
9
|
-
description: A test skill
|
|
10
|
-
version: "1.0.0"
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
# Test Skill
|
|
14
|
-
`;
|
|
15
|
-
describe("skillCommand", () => {
|
|
16
|
-
let vaultRoot;
|
|
17
|
-
let vaultFs;
|
|
18
|
-
beforeEach(async () => {
|
|
19
|
-
vaultRoot = join(homedir(), `.vault-skill-cmd-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
20
|
-
await mkdir(vaultRoot, { recursive: true });
|
|
21
|
-
vaultFs = new VaultFS(vaultRoot);
|
|
22
|
-
});
|
|
23
|
-
afterEach(async () => {
|
|
24
|
-
await rm(vaultRoot, { recursive: true, force: true });
|
|
25
|
-
});
|
|
26
|
-
describe("install action", () => {
|
|
27
|
-
it("requires source option", async () => {
|
|
28
|
-
const result = await skillCommand(vaultFs, vaultRoot, { action: "install" });
|
|
29
|
-
expect(result.action).toBe("install");
|
|
30
|
-
const r = result.result;
|
|
31
|
-
expect(r.success).toBe(false);
|
|
32
|
-
expect(r.error).toContain("Source is required");
|
|
33
|
-
});
|
|
34
|
-
it("installs from local file path", async () => {
|
|
35
|
-
const skillPath = join(vaultRoot, "src", "skill.md");
|
|
36
|
-
await mkdir(join(vaultRoot, "src"), { recursive: true });
|
|
37
|
-
await writeFile(skillPath, validSkillContent);
|
|
38
|
-
const result = await skillCommand(vaultFs, vaultRoot, {
|
|
39
|
-
action: "install",
|
|
40
|
-
source: skillPath,
|
|
41
|
-
});
|
|
42
|
-
expect(result.action).toBe("install");
|
|
43
|
-
const r = result.result;
|
|
44
|
-
expect(r.success).toBe(true);
|
|
45
|
-
expect(r.skill?.name).toBe("test-skill");
|
|
46
|
-
});
|
|
47
|
-
it("passes force flag to install", async () => {
|
|
48
|
-
const skillPath = join(vaultRoot, "src", "skill.md");
|
|
49
|
-
await mkdir(join(vaultRoot, "src"), { recursive: true });
|
|
50
|
-
await writeFile(skillPath, validSkillContent);
|
|
51
|
-
const result1 = await skillCommand(vaultFs, vaultRoot, { action: "install", source: skillPath });
|
|
52
|
-
expect(result1.result.success).toBe(true);
|
|
53
|
-
const result2 = await skillCommand(vaultFs, vaultRoot, { action: "install", source: skillPath, force: true });
|
|
54
|
-
expect(result2.result.success).toBe(true);
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
describe("list action", () => {
|
|
58
|
-
it("returns empty list when no skills installed", async () => {
|
|
59
|
-
const result = await skillCommand(vaultFs, vaultRoot, { action: "list" });
|
|
60
|
-
expect(result.action).toBe("list");
|
|
61
|
-
expect(result.result.skills).toEqual([]);
|
|
62
|
-
});
|
|
63
|
-
it("returns installed skills", async () => {
|
|
64
|
-
const skillPath = join(vaultRoot, "src", "skill.md");
|
|
65
|
-
await mkdir(join(vaultRoot, "src"), { recursive: true });
|
|
66
|
-
await writeFile(skillPath, validSkillContent);
|
|
67
|
-
await skillCommand(vaultFs, vaultRoot, { action: "install", source: skillPath });
|
|
68
|
-
const result = await skillCommand(vaultFs, vaultRoot, { action: "list" });
|
|
69
|
-
expect(result.action).toBe("list");
|
|
70
|
-
const r = result.result;
|
|
71
|
-
expect(r.skills).toHaveLength(1);
|
|
72
|
-
expect(r.skills[0].name).toBe("test-skill");
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
describe("validate action", () => {
|
|
76
|
-
it("requires skillPath option", async () => {
|
|
77
|
-
const result = await skillCommand(vaultFs, vaultRoot, { action: "validate" });
|
|
78
|
-
expect(result.action).toBe("validate");
|
|
79
|
-
const r = result.result;
|
|
80
|
-
expect(r.valid).toBe(false);
|
|
81
|
-
expect(r.errors[0]).toContain("Skill path is required");
|
|
82
|
-
});
|
|
83
|
-
it("validates a valid local skill file", async () => {
|
|
84
|
-
const skillPath = join(vaultRoot, "src", "valid.md");
|
|
85
|
-
await mkdir(join(vaultRoot, "src"), { recursive: true });
|
|
86
|
-
await writeFile(skillPath, validSkillContent);
|
|
87
|
-
const result = await skillCommand(vaultFs, vaultRoot, { action: "validate", skillPath });
|
|
88
|
-
expect(result.action).toBe("validate");
|
|
89
|
-
const r = result.result;
|
|
90
|
-
expect(r.valid).toBe(true);
|
|
91
|
-
expect(r.frontmatter?.name).toBe("test-skill");
|
|
92
|
-
});
|
|
93
|
-
it("reports errors for invalid skill file", async () => {
|
|
94
|
-
const skillPath = join(vaultRoot, "src", "invalid.md");
|
|
95
|
-
await mkdir(join(vaultRoot, "src"), { recursive: true });
|
|
96
|
-
await writeFile(skillPath, "---\n---\n\n# No frontmatter");
|
|
97
|
-
const result = await skillCommand(vaultFs, vaultRoot, { action: "validate", skillPath });
|
|
98
|
-
expect(result.action).toBe("validate");
|
|
99
|
-
const r = result.result;
|
|
100
|
-
expect(r.valid).toBe(false);
|
|
101
|
-
expect(r.errors.length).toBeGreaterThan(0);
|
|
102
|
-
});
|
|
103
|
-
it("reports error for nonexistent file", async () => {
|
|
104
|
-
const result = await skillCommand(vaultFs, vaultRoot, { action: "validate", skillPath: "/nonexistent/skill.md" });
|
|
105
|
-
expect(result.action).toBe("validate");
|
|
106
|
-
const r = result.result;
|
|
107
|
-
expect(r.valid).toBe(false);
|
|
108
|
-
expect(r.errors[0]).toContain("Failed to read file");
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
describe("delete action", () => {
|
|
112
|
-
it("requires skillName option", async () => {
|
|
113
|
-
const result = await skillCommand(vaultFs, vaultRoot, { action: "delete" });
|
|
114
|
-
expect(result.action).toBe("delete");
|
|
115
|
-
const r = result.result;
|
|
116
|
-
expect(r.success).toBe(false);
|
|
117
|
-
expect(r.error).toContain("Skill name is required");
|
|
118
|
-
});
|
|
119
|
-
it("fails when skill not found", async () => {
|
|
120
|
-
const result = await skillCommand(vaultFs, vaultRoot, { action: "delete", skillName: "nonexistent" });
|
|
121
|
-
expect(result.action).toBe("delete");
|
|
122
|
-
const r = result.result;
|
|
123
|
-
expect(r.success).toBe(false);
|
|
124
|
-
expect(r.error).toContain("not found");
|
|
125
|
-
});
|
|
126
|
-
it("deletes an installed skill", async () => {
|
|
127
|
-
const skillPath = join(vaultRoot, "src", "skill.md");
|
|
128
|
-
await mkdir(join(vaultRoot, "src"), { recursive: true });
|
|
129
|
-
await writeFile(skillPath, validSkillContent);
|
|
130
|
-
await skillCommand(vaultFs, vaultRoot, { action: "install", source: skillPath });
|
|
131
|
-
const result = await skillCommand(vaultFs, vaultRoot, { action: "delete", skillName: "test-skill" });
|
|
132
|
-
expect(result.action).toBe("delete");
|
|
133
|
-
expect(result.result.success).toBe(true);
|
|
134
|
-
});
|
|
135
|
-
});
|
|
136
|
-
});
|
|
137
|
-
//# sourceMappingURL=index.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../../src/commands/skill/index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import { mkdir, writeFile, rm } from "fs/promises";
|
|
3
|
-
import { homedir } from "os";
|
|
4
|
-
import { join } from "path";
|
|
5
|
-
import { VaultFS } from "../../lib/vault-fs.js";
|
|
6
|
-
import { SkillRegistryManager } from "../../lib/skill-registry.js";
|
|
7
|
-
import { installSkill, deleteSkill } from "./install.js";
|
|
8
|
-
describe("installSkill", () => {
|
|
9
|
-
let vaultRoot;
|
|
10
|
-
let vaultFs;
|
|
11
|
-
let registryManager;
|
|
12
|
-
const validSkillContent = `---
|
|
13
|
-
name: test-skill
|
|
14
|
-
description: A test skill for unit tests
|
|
15
|
-
version: "1.0.0"
|
|
16
|
-
author: test-author
|
|
17
|
-
tags:
|
|
18
|
-
- test
|
|
19
|
-
- example
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
# Test Skill
|
|
23
|
-
|
|
24
|
-
This is the body of the test skill.
|
|
25
|
-
`;
|
|
26
|
-
const missingNameContent = `---
|
|
27
|
-
description: Missing name field
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
# Skill without name
|
|
31
|
-
`;
|
|
32
|
-
const missingDescContent = `---
|
|
33
|
-
name: no-desc-skill
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
# Skill without description
|
|
37
|
-
`;
|
|
38
|
-
const emptyFrontmatter = `---
|
|
39
|
-
---
|
|
40
|
-
|
|
41
|
-
# Empty frontmatter
|
|
42
|
-
`;
|
|
43
|
-
beforeEach(async () => {
|
|
44
|
-
vaultRoot = join(homedir(), `.vault-skill-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
45
|
-
await mkdir(vaultRoot, { recursive: true });
|
|
46
|
-
vaultFs = new VaultFS(vaultRoot);
|
|
47
|
-
registryManager = new SkillRegistryManager(vaultRoot);
|
|
48
|
-
});
|
|
49
|
-
afterEach(async () => {
|
|
50
|
-
await rm(vaultRoot, { recursive: true, force: true });
|
|
51
|
-
});
|
|
52
|
-
describe("install from local file", () => {
|
|
53
|
-
it("installs a valid skill from local file", async () => {
|
|
54
|
-
const skillPath = join(vaultRoot, "source", "test-skill.md");
|
|
55
|
-
await mkdir(join(vaultRoot, "source"), { recursive: true });
|
|
56
|
-
await writeFile(skillPath, validSkillContent);
|
|
57
|
-
const result = await installSkill(vaultFs, registryManager, {
|
|
58
|
-
source: skillPath,
|
|
59
|
-
});
|
|
60
|
-
expect(result.success).toBe(true);
|
|
61
|
-
expect(result.skill).toBeDefined();
|
|
62
|
-
expect(result.skill?.name).toBe("test-skill");
|
|
63
|
-
expect(result.skill?.source).toBe("local");
|
|
64
|
-
expect(result.skill?.source_path).toBe(skillPath);
|
|
65
|
-
expect(result.skill?.version).toBe("1.0.0");
|
|
66
|
-
expect(result.skill?.status).toBe("active");
|
|
67
|
-
expect(result.skill?.auto_update).toBe(false);
|
|
68
|
-
});
|
|
69
|
-
it("fails when source file does not exist", async () => {
|
|
70
|
-
const result = await installSkill(vaultFs, registryManager, {
|
|
71
|
-
source: "/nonexistent/path/skill.md",
|
|
72
|
-
});
|
|
73
|
-
expect(result.success).toBe(false);
|
|
74
|
-
expect(result.error).toContain("Failed to read source");
|
|
75
|
-
});
|
|
76
|
-
it("fails when frontmatter is missing required name field", async () => {
|
|
77
|
-
const skillPath = join(vaultRoot, "source", "invalid.md");
|
|
78
|
-
await mkdir(join(vaultRoot, "source"), { recursive: true });
|
|
79
|
-
await writeFile(skillPath, missingNameContent);
|
|
80
|
-
const result = await installSkill(vaultFs, registryManager, {
|
|
81
|
-
source: skillPath,
|
|
82
|
-
});
|
|
83
|
-
expect(result.success).toBe(false);
|
|
84
|
-
expect(result.error).toContain("Invalid skill frontmatter");
|
|
85
|
-
});
|
|
86
|
-
it("fails when frontmatter is missing required description field", async () => {
|
|
87
|
-
const skillPath = join(vaultRoot, "source", "no-desc.md");
|
|
88
|
-
await mkdir(join(vaultRoot, "source"), { recursive: true });
|
|
89
|
-
await writeFile(skillPath, missingDescContent);
|
|
90
|
-
const result = await installSkill(vaultFs, registryManager, {
|
|
91
|
-
source: skillPath,
|
|
92
|
-
});
|
|
93
|
-
expect(result.success).toBe(false);
|
|
94
|
-
expect(result.error).toContain("Invalid skill frontmatter");
|
|
95
|
-
});
|
|
96
|
-
it("fails when frontmatter is empty", async () => {
|
|
97
|
-
const skillPath = join(vaultRoot, "source", "empty.md");
|
|
98
|
-
await mkdir(join(vaultRoot, "source"), { recursive: true });
|
|
99
|
-
await writeFile(skillPath, emptyFrontmatter);
|
|
100
|
-
const result = await installSkill(vaultFs, registryManager, {
|
|
101
|
-
source: skillPath,
|
|
102
|
-
});
|
|
103
|
-
expect(result.success).toBe(false);
|
|
104
|
-
expect(result.error).toContain("Invalid skill frontmatter");
|
|
105
|
-
});
|
|
106
|
-
it("fails when skill already installed without force", async () => {
|
|
107
|
-
const skillPath = join(vaultRoot, "source", "test-skill.md");
|
|
108
|
-
await mkdir(join(vaultRoot, "source"), { recursive: true });
|
|
109
|
-
await writeFile(skillPath, validSkillContent);
|
|
110
|
-
const result1 = await installSkill(vaultFs, registryManager, {
|
|
111
|
-
source: skillPath,
|
|
112
|
-
});
|
|
113
|
-
expect(result1.success).toBe(true);
|
|
114
|
-
const result2 = await installSkill(vaultFs, registryManager, {
|
|
115
|
-
source: skillPath,
|
|
116
|
-
});
|
|
117
|
-
expect(result2.success).toBe(false);
|
|
118
|
-
expect(result2.error).toContain("already installed");
|
|
119
|
-
});
|
|
120
|
-
it("overwrites existing skill with force flag", async () => {
|
|
121
|
-
const skillPath = join(vaultRoot, "source", "test-skill.md");
|
|
122
|
-
await mkdir(join(vaultRoot, "source"), { recursive: true });
|
|
123
|
-
await writeFile(skillPath, validSkillContent);
|
|
124
|
-
const result1 = await installSkill(vaultFs, registryManager, {
|
|
125
|
-
source: skillPath,
|
|
126
|
-
});
|
|
127
|
-
expect(result1.success).toBe(true);
|
|
128
|
-
const result2 = await installSkill(vaultFs, registryManager, {
|
|
129
|
-
source: skillPath,
|
|
130
|
-
force: true,
|
|
131
|
-
});
|
|
132
|
-
expect(result2.success).toBe(true);
|
|
133
|
-
expect(result2.skill?.updated_at).not.toBe(result1.skill?.updated_at);
|
|
134
|
-
});
|
|
135
|
-
it("uses default version when not specified", async () => {
|
|
136
|
-
const noVersionContent = `---
|
|
137
|
-
name: no-version-skill
|
|
138
|
-
description: Skill without version
|
|
139
|
-
---
|
|
140
|
-
# Content
|
|
141
|
-
`;
|
|
142
|
-
const skillPath = join(vaultRoot, "source", "no-version.md");
|
|
143
|
-
await mkdir(join(vaultRoot, "source"), { recursive: true });
|
|
144
|
-
await writeFile(skillPath, noVersionContent);
|
|
145
|
-
const result = await installSkill(vaultFs, registryManager, {
|
|
146
|
-
source: skillPath,
|
|
147
|
-
});
|
|
148
|
-
expect(result.success).toBe(true);
|
|
149
|
-
expect(result.skill?.version).toBe("0.0.0");
|
|
150
|
-
});
|
|
151
|
-
it("preserves depends_on from frontmatter", async () => {
|
|
152
|
-
const withDepsContent = `---
|
|
153
|
-
name: skill-with-deps
|
|
154
|
-
description: Skill with dependencies
|
|
155
|
-
depends_on:
|
|
156
|
-
- base-skill
|
|
157
|
-
- utils-skill
|
|
158
|
-
---
|
|
159
|
-
# Content
|
|
160
|
-
`;
|
|
161
|
-
const skillPath = join(vaultRoot, "source", "with-deps.md");
|
|
162
|
-
await mkdir(join(vaultRoot, "source"), { recursive: true });
|
|
163
|
-
await writeFile(skillPath, withDepsContent);
|
|
164
|
-
const result = await installSkill(vaultFs, registryManager, {
|
|
165
|
-
source: skillPath,
|
|
166
|
-
});
|
|
167
|
-
expect(result.success).toBe(true);
|
|
168
|
-
expect(result.skill?.depends_on).toEqual(["base-skill", "utils-skill"]);
|
|
169
|
-
});
|
|
170
|
-
});
|
|
171
|
-
describe("deleteSkill", () => {
|
|
172
|
-
it("deletes an installed skill", async () => {
|
|
173
|
-
const skillPath = join(vaultRoot, "source", "test-skill.md");
|
|
174
|
-
await mkdir(join(vaultRoot, "source"), { recursive: true });
|
|
175
|
-
await writeFile(skillPath, validSkillContent);
|
|
176
|
-
const installResult = await installSkill(vaultFs, registryManager, {
|
|
177
|
-
source: skillPath,
|
|
178
|
-
});
|
|
179
|
-
expect(installResult.success).toBe(true);
|
|
180
|
-
const deleteResult = await deleteSkill(vaultFs, registryManager, "test-skill");
|
|
181
|
-
expect(deleteResult.success).toBe(true);
|
|
182
|
-
expect(deleteResult.skill?.name).toBe("test-skill");
|
|
183
|
-
const registry = await registryManager.read();
|
|
184
|
-
expect(registry.skills.find(s => s.name === "test-skill")).toBeUndefined();
|
|
185
|
-
});
|
|
186
|
-
it("fails when skill not found", async () => {
|
|
187
|
-
const result = await deleteSkill(vaultFs, registryManager, "nonexistent-skill");
|
|
188
|
-
expect(result.success).toBe(false);
|
|
189
|
-
expect(result.error).toContain("not found in registry");
|
|
190
|
-
});
|
|
191
|
-
it("returns the deleted skill info", async () => {
|
|
192
|
-
const skillPath = join(vaultRoot, "source", "test-skill.md");
|
|
193
|
-
await mkdir(join(vaultRoot, "source"), { recursive: true });
|
|
194
|
-
await writeFile(skillPath, validSkillContent);
|
|
195
|
-
await installSkill(vaultFs, registryManager, { source: skillPath });
|
|
196
|
-
const result = await deleteSkill(vaultFs, registryManager, "test-skill");
|
|
197
|
-
expect(result.success).toBe(true);
|
|
198
|
-
expect(result.skill?.name).toBe("test-skill");
|
|
199
|
-
expect(result.skill?.version).toBe("1.0.0");
|
|
200
|
-
});
|
|
201
|
-
});
|
|
202
|
-
describe("registry operations", () => {
|
|
203
|
-
it("lists installed skills", async () => {
|
|
204
|
-
const skillPath = join(vaultRoot, "source", "test-skill.md");
|
|
205
|
-
await mkdir(join(vaultRoot, "source"), { recursive: true });
|
|
206
|
-
await writeFile(skillPath, validSkillContent);
|
|
207
|
-
await installSkill(vaultFs, registryManager, { source: skillPath });
|
|
208
|
-
const skills = await registryManager.list();
|
|
209
|
-
expect(skills).toHaveLength(1);
|
|
210
|
-
expect(skills[0].name).toBe("test-skill");
|
|
211
|
-
});
|
|
212
|
-
it("gets specific skill by name", async () => {
|
|
213
|
-
const skillPath = join(vaultRoot, "source", "test-skill.md");
|
|
214
|
-
await mkdir(join(vaultRoot, "source"), { recursive: true });
|
|
215
|
-
await writeFile(skillPath, validSkillContent);
|
|
216
|
-
await installSkill(vaultFs, registryManager, { source: skillPath });
|
|
217
|
-
const skill = await registryManager.get("test-skill");
|
|
218
|
-
expect(skill).toBeDefined();
|
|
219
|
-
expect(skill?.name).toBe("test-skill");
|
|
220
|
-
const missing = await registryManager.get("nonexistent");
|
|
221
|
-
expect(missing).toBeUndefined();
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
//# sourceMappingURL=install.test.js.map
|