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,324 +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 { todoCommand } from "./todo.js";
|
|
6
|
-
import { VaultFS } from "../lib/vault-fs.js";
|
|
7
|
-
function createCommandContext(vaultFs, overrides) {
|
|
8
|
-
return {
|
|
9
|
-
vaultFs,
|
|
10
|
-
vaultPath: vaultFs.root,
|
|
11
|
-
sessionRegistry: {},
|
|
12
|
-
config: {},
|
|
13
|
-
log: { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() },
|
|
14
|
-
...overrides,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
describe("todoCommand", () => {
|
|
18
|
-
let vaultRoot;
|
|
19
|
-
let vaultFs;
|
|
20
|
-
let ctx;
|
|
21
|
-
beforeEach(async () => {
|
|
22
|
-
vaultRoot = join(homedir(), `.vault-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
23
|
-
await mkdir(vaultRoot, { recursive: true });
|
|
24
|
-
vaultFs = new VaultFS(vaultRoot);
|
|
25
|
-
ctx = createCommandContext(vaultFs);
|
|
26
|
-
});
|
|
27
|
-
afterEach(async () => {
|
|
28
|
-
await rm(vaultRoot, { recursive: true, force: true });
|
|
29
|
-
});
|
|
30
|
-
describe("list todos", () => {
|
|
31
|
-
it("returns empty array when no todos file", async () => {
|
|
32
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
33
|
-
const result = await todoCommand({
|
|
34
|
-
action: "list",
|
|
35
|
-
project: "test-project",
|
|
36
|
-
}, ctx);
|
|
37
|
-
expect(result.todos).toEqual([]);
|
|
38
|
-
});
|
|
39
|
-
it("lists pending todos", async () => {
|
|
40
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
41
|
-
await mkdir(join(vaultRoot, "projects/test-project"), { recursive: true });
|
|
42
|
-
await vaultFs.write("projects/test-project/todos.md", `---
|
|
43
|
-
type: todo
|
|
44
|
-
project: test-project
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
# Todos
|
|
48
|
-
|
|
49
|
-
- [ ] First task
|
|
50
|
-
- [x] Completed task
|
|
51
|
-
- [ ] 🔴 High priority task
|
|
52
|
-
`);
|
|
53
|
-
const result = await todoCommand({
|
|
54
|
-
action: "list",
|
|
55
|
-
project: "test-project",
|
|
56
|
-
}, ctx);
|
|
57
|
-
expect(result.todos).toHaveLength(2);
|
|
58
|
-
expect(result.todos[0].text).toBe("First task");
|
|
59
|
-
expect(result.todos[1].text).toBe("High priority task");
|
|
60
|
-
});
|
|
61
|
-
it("filters to blockers only when requested", async () => {
|
|
62
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
63
|
-
await mkdir(join(vaultRoot, "projects/test-project"), { recursive: true });
|
|
64
|
-
await vaultFs.write("projects/test-project/todos.md", `---
|
|
65
|
-
type: todo
|
|
66
|
-
project: test-project
|
|
67
|
-
---
|
|
68
|
-
|
|
69
|
-
# Todos
|
|
70
|
-
|
|
71
|
-
- [ ] 🟡 Medium priority
|
|
72
|
-
- [ ] 🔴 High priority blocker
|
|
73
|
-
- [ ] 🟢 Low priority
|
|
74
|
-
`);
|
|
75
|
-
const result = await todoCommand({
|
|
76
|
-
action: "list",
|
|
77
|
-
blockersOnly: true,
|
|
78
|
-
project: "test-project",
|
|
79
|
-
}, ctx);
|
|
80
|
-
expect(result.todos).toHaveLength(1);
|
|
81
|
-
expect(result.todos[0].text).toBe("High priority blocker");
|
|
82
|
-
expect(result.todos[0].priority).toBe("high");
|
|
83
|
-
});
|
|
84
|
-
it("parses priority from emojis", async () => {
|
|
85
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
86
|
-
await mkdir(join(vaultRoot, "projects/test-project"), { recursive: true });
|
|
87
|
-
await vaultFs.write("projects/test-project/todos.md", `---
|
|
88
|
-
type: todo
|
|
89
|
-
---
|
|
90
|
-
|
|
91
|
-
# Todos
|
|
92
|
-
|
|
93
|
-
- [ ] 🔴 High
|
|
94
|
-
- [ ] 🟡 Medium
|
|
95
|
-
- [ ] 🟢 Low
|
|
96
|
-
- [ ] No emoji (medium default)
|
|
97
|
-
`);
|
|
98
|
-
const result = await todoCommand({
|
|
99
|
-
action: "list",
|
|
100
|
-
project: "test-project",
|
|
101
|
-
}, ctx);
|
|
102
|
-
expect(result.todos[0].priority).toBe("high");
|
|
103
|
-
expect(result.todos[1].priority).toBe("medium");
|
|
104
|
-
expect(result.todos[2].priority).toBe("low");
|
|
105
|
-
expect(result.todos[3].priority).toBe("medium");
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
describe("add todo", () => {
|
|
109
|
-
it("creates todos file if it does not exist", async () => {
|
|
110
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
111
|
-
const result = await todoCommand({
|
|
112
|
-
action: "add",
|
|
113
|
-
item: "New task",
|
|
114
|
-
project: "test-project",
|
|
115
|
-
}, ctx);
|
|
116
|
-
expect(result.todos).toHaveLength(1);
|
|
117
|
-
expect(result.todos[0].text).toBe("New task");
|
|
118
|
-
const content = await vaultFs.read("projects/test-project/todos.md");
|
|
119
|
-
expect(content).toContain("type: todo");
|
|
120
|
-
expect(content).toContain("# Todos");
|
|
121
|
-
});
|
|
122
|
-
it("appends to existing todos file", async () => {
|
|
123
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
124
|
-
await mkdir(join(vaultRoot, "projects/test-project"), { recursive: true });
|
|
125
|
-
await vaultFs.write("projects/test-project/todos.md", `---
|
|
126
|
-
type: todo
|
|
127
|
-
---
|
|
128
|
-
|
|
129
|
-
# Todos
|
|
130
|
-
|
|
131
|
-
- [ ] Existing task
|
|
132
|
-
`);
|
|
133
|
-
const result = await todoCommand({
|
|
134
|
-
action: "add",
|
|
135
|
-
item: "New task",
|
|
136
|
-
project: "test-project",
|
|
137
|
-
}, ctx);
|
|
138
|
-
expect(result.todos).toHaveLength(2);
|
|
139
|
-
const content = await vaultFs.read("projects/test-project/todos.md");
|
|
140
|
-
expect(content).toContain("Existing task");
|
|
141
|
-
expect(content).toContain("New task");
|
|
142
|
-
});
|
|
143
|
-
it("adds with high priority emoji", async () => {
|
|
144
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
145
|
-
await todoCommand({
|
|
146
|
-
action: "add",
|
|
147
|
-
item: "Urgent task",
|
|
148
|
-
priority: "high",
|
|
149
|
-
project: "test-project",
|
|
150
|
-
}, ctx);
|
|
151
|
-
const content = await vaultFs.read("projects/test-project/todos.md");
|
|
152
|
-
expect(content).toContain("🔴 Urgent task");
|
|
153
|
-
});
|
|
154
|
-
it("adds with low priority emoji", async () => {
|
|
155
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
156
|
-
await todoCommand({
|
|
157
|
-
action: "add",
|
|
158
|
-
item: "Low priority task",
|
|
159
|
-
priority: "low",
|
|
160
|
-
project: "test-project",
|
|
161
|
-
}, ctx);
|
|
162
|
-
const content = await vaultFs.read("projects/test-project/todos.md");
|
|
163
|
-
expect(content).toContain("🟢 Low priority task");
|
|
164
|
-
});
|
|
165
|
-
it("adds with medium priority emoji by default", async () => {
|
|
166
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
167
|
-
await todoCommand({
|
|
168
|
-
action: "add",
|
|
169
|
-
item: "Normal task",
|
|
170
|
-
project: "test-project",
|
|
171
|
-
}, ctx);
|
|
172
|
-
const content = await vaultFs.read("projects/test-project/todos.md");
|
|
173
|
-
expect(content).toContain("🟡 Normal task");
|
|
174
|
-
});
|
|
175
|
-
it("requires item text for add", async () => {
|
|
176
|
-
await expect(todoCommand({
|
|
177
|
-
action: "add",
|
|
178
|
-
project: "test-project",
|
|
179
|
-
}, ctx)).rejects.toThrow("Item text required for add");
|
|
180
|
-
});
|
|
181
|
-
});
|
|
182
|
-
describe("complete todo", () => {
|
|
183
|
-
it("marks todo as completed", async () => {
|
|
184
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
185
|
-
await mkdir(join(vaultRoot, "projects/test-project"), { recursive: true });
|
|
186
|
-
await vaultFs.write("projects/test-project/todos.md", `---
|
|
187
|
-
type: todo
|
|
188
|
-
---
|
|
189
|
-
|
|
190
|
-
# Todos
|
|
191
|
-
|
|
192
|
-
- [ ] Task to complete
|
|
193
|
-
- [ ] Another task
|
|
194
|
-
`);
|
|
195
|
-
const result = await todoCommand({
|
|
196
|
-
action: "complete",
|
|
197
|
-
item: "Task to complete",
|
|
198
|
-
project: "test-project",
|
|
199
|
-
}, ctx);
|
|
200
|
-
const content = await vaultFs.read("projects/test-project/todos.md");
|
|
201
|
-
expect(content).toContain("- [x] Task to complete");
|
|
202
|
-
expect(content).toContain("- [ ] Another task");
|
|
203
|
-
});
|
|
204
|
-
it("works with priority emoji", async () => {
|
|
205
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
206
|
-
await mkdir(join(vaultRoot, "projects/test-project"), { recursive: true });
|
|
207
|
-
await vaultFs.write("projects/test-project/todos.md", `---
|
|
208
|
-
type: todo
|
|
209
|
-
---
|
|
210
|
-
|
|
211
|
-
# Todos
|
|
212
|
-
|
|
213
|
-
- [ ] 🔴 Priority task
|
|
214
|
-
`);
|
|
215
|
-
await todoCommand({
|
|
216
|
-
action: "complete",
|
|
217
|
-
item: "Priority task",
|
|
218
|
-
project: "test-project",
|
|
219
|
-
}, ctx);
|
|
220
|
-
const content = await vaultFs.read("projects/test-project/todos.md");
|
|
221
|
-
expect(content).toContain("- [x] 🔴 Priority task");
|
|
222
|
-
});
|
|
223
|
-
it("requires item text for complete", async () => {
|
|
224
|
-
await expect(todoCommand({
|
|
225
|
-
action: "complete",
|
|
226
|
-
project: "test-project",
|
|
227
|
-
}, ctx)).rejects.toThrow("Item text required for complete");
|
|
228
|
-
});
|
|
229
|
-
it("throws if todos file does not exist", async () => {
|
|
230
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
231
|
-
await expect(todoCommand({
|
|
232
|
-
action: "complete",
|
|
233
|
-
item: "Task",
|
|
234
|
-
project: "test-project",
|
|
235
|
-
}, ctx)).rejects.toThrow("No todos file found");
|
|
236
|
-
});
|
|
237
|
-
});
|
|
238
|
-
describe("remove todo", () => {
|
|
239
|
-
it("removes a pending todo", async () => {
|
|
240
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
241
|
-
await mkdir(join(vaultRoot, "projects/test-project"), { recursive: true });
|
|
242
|
-
await vaultFs.write("projects/test-project/todos.md", `---
|
|
243
|
-
type: todo
|
|
244
|
-
---
|
|
245
|
-
|
|
246
|
-
# Todos
|
|
247
|
-
|
|
248
|
-
- [ ] Task to remove
|
|
249
|
-
- [ ] Task to keep
|
|
250
|
-
`);
|
|
251
|
-
const result = await todoCommand({
|
|
252
|
-
action: "remove",
|
|
253
|
-
item: "Task to remove",
|
|
254
|
-
project: "test-project",
|
|
255
|
-
}, ctx);
|
|
256
|
-
const content = await vaultFs.read("projects/test-project/todos.md");
|
|
257
|
-
expect(content).not.toContain("Task to remove");
|
|
258
|
-
expect(content).toContain("Task to keep");
|
|
259
|
-
});
|
|
260
|
-
it("removes a completed todo", async () => {
|
|
261
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
262
|
-
await mkdir(join(vaultRoot, "projects/test-project"), { recursive: true });
|
|
263
|
-
await vaultFs.write("projects/test-project/todos.md", `---
|
|
264
|
-
type: todo
|
|
265
|
-
---
|
|
266
|
-
|
|
267
|
-
# Todos
|
|
268
|
-
|
|
269
|
-
- [x] Completed task to remove
|
|
270
|
-
- [ ] Pending task
|
|
271
|
-
`);
|
|
272
|
-
await todoCommand({
|
|
273
|
-
action: "remove",
|
|
274
|
-
item: "Completed task to remove",
|
|
275
|
-
project: "test-project",
|
|
276
|
-
}, ctx);
|
|
277
|
-
const content = await vaultFs.read("projects/test-project/todos.md");
|
|
278
|
-
expect(content).not.toContain("Completed task to remove");
|
|
279
|
-
expect(content).toContain("Pending task");
|
|
280
|
-
});
|
|
281
|
-
it("removes todo with priority emoji", async () => {
|
|
282
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
283
|
-
await mkdir(join(vaultRoot, "projects/test-project"), { recursive: true });
|
|
284
|
-
await vaultFs.write("projects/test-project/todos.md", `---
|
|
285
|
-
type: todo
|
|
286
|
-
---
|
|
287
|
-
|
|
288
|
-
# Todos
|
|
289
|
-
|
|
290
|
-
- [ ] 🔴 Priority task to remove
|
|
291
|
-
`);
|
|
292
|
-
await todoCommand({
|
|
293
|
-
action: "remove",
|
|
294
|
-
item: "Priority task to remove",
|
|
295
|
-
project: "test-project",
|
|
296
|
-
}, ctx);
|
|
297
|
-
const content = await vaultFs.read("projects/test-project/todos.md");
|
|
298
|
-
expect(content).not.toContain("Priority task to remove");
|
|
299
|
-
});
|
|
300
|
-
it("requires item text for remove", async () => {
|
|
301
|
-
await expect(todoCommand({
|
|
302
|
-
action: "remove",
|
|
303
|
-
project: "test-project",
|
|
304
|
-
}, ctx)).rejects.toThrow("Item text required for remove");
|
|
305
|
-
});
|
|
306
|
-
it("throws if todos file does not exist for remove", async () => {
|
|
307
|
-
await vaultFs.write("project-map.json", JSON.stringify({ projects: { "test-project": "/tmp/test" } }));
|
|
308
|
-
await expect(todoCommand({
|
|
309
|
-
action: "remove",
|
|
310
|
-
item: "Task",
|
|
311
|
-
project: "test-project",
|
|
312
|
-
}, ctx)).rejects.toThrow("No todos file found");
|
|
313
|
-
});
|
|
314
|
-
});
|
|
315
|
-
describe("unknown action", () => {
|
|
316
|
-
it("throws error for unknown action", async () => {
|
|
317
|
-
await expect(todoCommand({
|
|
318
|
-
action: "unknown",
|
|
319
|
-
project: "test-project",
|
|
320
|
-
}, ctx)).rejects.toThrow("Unknown action: unknown");
|
|
321
|
-
});
|
|
322
|
-
});
|
|
323
|
-
});
|
|
324
|
-
//# sourceMappingURL=todo.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"todo.test.js","sourceRoot":"","sources":["../../src/commands/todo.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,79 +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 { writeCommand } from "./write.js";
|
|
6
|
-
import { VaultFS } from "../lib/vault-fs.js";
|
|
7
|
-
function createCommandContext(vaultFs, overrides) {
|
|
8
|
-
return {
|
|
9
|
-
vaultFs,
|
|
10
|
-
vaultPath: vaultFs.root,
|
|
11
|
-
sessionRegistry: {},
|
|
12
|
-
config: {},
|
|
13
|
-
log: { debug: vi.fn(), info: vi.fn(), warn: vi.fn(), error: vi.fn() },
|
|
14
|
-
...overrides,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
describe("writeCommand", () => {
|
|
18
|
-
let vaultRoot;
|
|
19
|
-
let vaultFs;
|
|
20
|
-
let ctx;
|
|
21
|
-
beforeEach(async () => {
|
|
22
|
-
vaultRoot = join(homedir(), `.vault-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
|
|
23
|
-
await mkdir(vaultRoot, { recursive: true });
|
|
24
|
-
vaultFs = new VaultFS(vaultRoot);
|
|
25
|
-
ctx = createCommandContext(vaultFs);
|
|
26
|
-
});
|
|
27
|
-
afterEach(async () => {
|
|
28
|
-
await rm(vaultRoot, { recursive: true, force: true });
|
|
29
|
-
});
|
|
30
|
-
describe("append mode (default)", () => {
|
|
31
|
-
it("creates new file with frontmatter", async () => {
|
|
32
|
-
const result = await writeCommand({ path: "new.md", content: "content", mode: "append" }, ctx);
|
|
33
|
-
expect(result.written).toBe(true);
|
|
34
|
-
expect(result.path).toBe("new.md");
|
|
35
|
-
const content = await vaultFs.read("new.md");
|
|
36
|
-
expect(content).toContain("content");
|
|
37
|
-
});
|
|
38
|
-
it("appends to existing file", async () => {
|
|
39
|
-
await vaultFs.write("existing.md", "---\ncreated: 2024-01-01\n---\n\nInitial content");
|
|
40
|
-
const result = await writeCommand({ path: "existing.md", content: "appended", mode: "append" }, ctx);
|
|
41
|
-
expect(result.written).toBe(true);
|
|
42
|
-
const content = await vaultFs.read("existing.md");
|
|
43
|
-
expect(content).toContain("Initial content");
|
|
44
|
-
expect(content).toContain("appended");
|
|
45
|
-
});
|
|
46
|
-
it("merges frontmatter on append", async () => {
|
|
47
|
-
await vaultFs.write("fm.md", "---\ntags: [a]\n---\n\nBody");
|
|
48
|
-
const result = await writeCommand({ path: "fm.md", content: "new content", mode: "append", frontmatter: { status: "new-status" } }, ctx);
|
|
49
|
-
const content = await vaultFs.read("fm.md");
|
|
50
|
-
expect(content).toContain("status: new-status");
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
describe("prepend mode", () => {
|
|
54
|
-
it("prepends content to existing file", async () => {
|
|
55
|
-
await vaultFs.write("prepend.md", "---\ntitle: Test\n---\n\nOriginal body");
|
|
56
|
-
const result = await writeCommand({ path: "prepend.md", content: "New top content", mode: "prepend" }, ctx);
|
|
57
|
-
expect(result.written).toBe(true);
|
|
58
|
-
const content = await vaultFs.read("prepend.md");
|
|
59
|
-
expect(content).toContain("New top content");
|
|
60
|
-
expect(content).toContain("Original body");
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
describe("overwrite mode", () => {
|
|
64
|
-
it("creates file with frontmatter", async () => {
|
|
65
|
-
const result = await writeCommand({ path: "overwrite.md", content: "content", mode: "overwrite" }, ctx);
|
|
66
|
-
expect(result.written).toBe(true);
|
|
67
|
-
const content = await vaultFs.read("overwrite.md");
|
|
68
|
-
expect(content).toContain("content");
|
|
69
|
-
});
|
|
70
|
-
it("creates file with custom frontmatter", async () => {
|
|
71
|
-
const result = await writeCommand({ path: "custom.md", content: "content", mode: "overwrite", frontmatter: { priority: "high", tags: ["test"] } }, ctx);
|
|
72
|
-
expect(result.written).toBe(true);
|
|
73
|
-
const content = await vaultFs.read("custom.md");
|
|
74
|
-
expect(content).toContain("priority: high");
|
|
75
|
-
expect(content).toContain("tags:");
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
//# sourceMappingURL=write.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"write.test.js","sourceRoot":"","sources":["../../src/commands/write.test.ts"],"names":[],"mappings":"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"}
|
package/dist/config.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/config.test.js
DELETED
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
|
-
import { homedir } from "os";
|
|
3
|
-
import { validateProjectSlug, loadConfig, resolveProject } from "./config.js";
|
|
4
|
-
describe("validateProjectSlug", () => {
|
|
5
|
-
const validSlugs = [
|
|
6
|
-
"my-project",
|
|
7
|
-
"my_project",
|
|
8
|
-
"my.project",
|
|
9
|
-
"a",
|
|
10
|
-
"A1",
|
|
11
|
-
"project-123_test.example",
|
|
12
|
-
"UPPERCASE",
|
|
13
|
-
"MixedCase",
|
|
14
|
-
];
|
|
15
|
-
for (const slug of validSlugs) {
|
|
16
|
-
it(`accepts "${slug}"`, () => {
|
|
17
|
-
expect(validateProjectSlug(slug)).toBe(slug);
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
const invalidSlugs = [
|
|
21
|
-
{ slug: "", reason: "empty string" },
|
|
22
|
-
{ slug: "-starts-with-dash", reason: "starts with dash" },
|
|
23
|
-
{ slug: ".starts-with-dot", reason: "starts with dot" },
|
|
24
|
-
{ slug: "has spaces", reason: "contains spaces" },
|
|
25
|
-
{ slug: "has/slash", reason: "contains slash" },
|
|
26
|
-
{ slug: "has\\backslash", reason: "contains backslash" },
|
|
27
|
-
{ slug: "has..traversal", reason: "contains traversal" },
|
|
28
|
-
{ slug: "has!special", reason: "contains special char" },
|
|
29
|
-
{ slug: "has@at", reason: "contains @" },
|
|
30
|
-
{ slug: "has:colon", reason: "contains colon" },
|
|
31
|
-
{ slug: "has()parens", reason: "contains parens" },
|
|
32
|
-
{ slug: "has#hash", reason: "contains hash" },
|
|
33
|
-
];
|
|
34
|
-
for (const { slug, reason } of invalidSlugs) {
|
|
35
|
-
it(`rejects "${slug}" (${reason})`, () => {
|
|
36
|
-
expect(() => validateProjectSlug(slug)).toThrow();
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
it("throws with descriptive message for invalid slug", () => {
|
|
40
|
-
try {
|
|
41
|
-
validateProjectSlug("invalid slug!");
|
|
42
|
-
expect.unreachable("Should have thrown");
|
|
43
|
-
}
|
|
44
|
-
catch (e) {
|
|
45
|
-
expect(e.message).toContain("Invalid project slug");
|
|
46
|
-
}
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
describe("loadConfig", () => {
|
|
50
|
-
const originalEnv = process.env;
|
|
51
|
-
beforeEach(() => {
|
|
52
|
-
vi.resetModules();
|
|
53
|
-
process.env = { ...originalEnv };
|
|
54
|
-
delete process.env.VAULT_PATH;
|
|
55
|
-
delete process.env.MAX_INJECT_TOKENS;
|
|
56
|
-
delete process.env.SESSION_TTL_HOURS;
|
|
57
|
-
});
|
|
58
|
-
afterEach(() => {
|
|
59
|
-
process.env = originalEnv;
|
|
60
|
-
});
|
|
61
|
-
it("loads default config", () => {
|
|
62
|
-
const config = loadConfig();
|
|
63
|
-
expect(config).toBeDefined();
|
|
64
|
-
expect(config.vaultPath).toBeTruthy();
|
|
65
|
-
expect(config.maxInjectTokens).toBe(1500);
|
|
66
|
-
expect(config.sessionTtlHours).toBe(2);
|
|
67
|
-
});
|
|
68
|
-
it("expands tilde in VAULT_PATH", () => {
|
|
69
|
-
process.env.VAULT_PATH = "~/custom-vault";
|
|
70
|
-
const config = loadConfig();
|
|
71
|
-
expect(config.vaultPath).not.toContain("~");
|
|
72
|
-
expect(config.vaultPath).toContain("custom-vault");
|
|
73
|
-
});
|
|
74
|
-
it("resolves absolute VAULT_PATH under home", () => {
|
|
75
|
-
process.env.VAULT_PATH = `${homedir()}/custom-vault`;
|
|
76
|
-
const config = loadConfig();
|
|
77
|
-
expect(config.vaultPath).toContain("custom-vault");
|
|
78
|
-
});
|
|
79
|
-
it("throws when VAULT_PATH is outside home directory", () => {
|
|
80
|
-
process.env.VAULT_PATH = "/outside/home/vault";
|
|
81
|
-
expect(() => loadConfig()).toThrow("must be under home directory");
|
|
82
|
-
});
|
|
83
|
-
it("parses MAX_INJECT_TOKENS", () => {
|
|
84
|
-
process.env.MAX_INJECT_TOKENS = "3000";
|
|
85
|
-
const config = loadConfig();
|
|
86
|
-
expect(config.maxInjectTokens).toBe(3000);
|
|
87
|
-
});
|
|
88
|
-
it("clamps MAX_INJECT_TOKENS to max 50000", () => {
|
|
89
|
-
process.env.MAX_INJECT_TOKENS = "100000";
|
|
90
|
-
const config = loadConfig();
|
|
91
|
-
expect(config.maxInjectTokens).toBe(50000);
|
|
92
|
-
});
|
|
93
|
-
it("clamps MAX_INJECT_TOKENS to min 100", () => {
|
|
94
|
-
process.env.MAX_INJECT_TOKENS = "50";
|
|
95
|
-
const config = loadConfig();
|
|
96
|
-
expect(config.maxInjectTokens).toBe(100);
|
|
97
|
-
});
|
|
98
|
-
it("handles NaN for MAX_INJECT_TOKENS", () => {
|
|
99
|
-
process.env.MAX_INJECT_TOKENS = "not-a-number";
|
|
100
|
-
const config = loadConfig();
|
|
101
|
-
expect(config.maxInjectTokens).toBe(1500);
|
|
102
|
-
});
|
|
103
|
-
it("parses SESSION_TTL_HOURS", () => {
|
|
104
|
-
process.env.SESSION_TTL_HOURS = "8";
|
|
105
|
-
const config = loadConfig();
|
|
106
|
-
expect(config.sessionTtlHours).toBe(8);
|
|
107
|
-
});
|
|
108
|
-
it("clamps SESSION_TTL_HOURS to max 168", () => {
|
|
109
|
-
process.env.SESSION_TTL_HOURS = "200";
|
|
110
|
-
const config = loadConfig();
|
|
111
|
-
expect(config.sessionTtlHours).toBe(168);
|
|
112
|
-
});
|
|
113
|
-
it("clamps SESSION_TTL_HOURS to min 1", () => {
|
|
114
|
-
process.env.SESSION_TTL_HOURS = "0";
|
|
115
|
-
const config = loadConfig();
|
|
116
|
-
expect(config.sessionTtlHours).toBe(1);
|
|
117
|
-
});
|
|
118
|
-
it("handles NaN for SESSION_TTL_HOURS", () => {
|
|
119
|
-
process.env.SESSION_TTL_HOURS = "invalid";
|
|
120
|
-
const config = loadConfig();
|
|
121
|
-
expect(config.sessionTtlHours).toBe(2);
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
describe("resolveProject", () => {
|
|
125
|
-
it("returns validated explicit slug", async () => {
|
|
126
|
-
const vaultPath = "/tmp/test-vault";
|
|
127
|
-
const slug = await resolveProject(vaultPath, "my-project");
|
|
128
|
-
expect(slug).toBe("my-project");
|
|
129
|
-
});
|
|
130
|
-
it("throws for invalid explicit slug", async () => {
|
|
131
|
-
const vaultPath = "/tmp/test-vault";
|
|
132
|
-
await expect(resolveProject(vaultPath, "invalid slug!")).rejects.toThrow("Invalid project slug");
|
|
133
|
-
});
|
|
134
|
-
it("throws when no slug provided and detection fails", async () => {
|
|
135
|
-
const vaultPath = "/tmp/nonexistent-vault";
|
|
136
|
-
await expect(resolveProject(vaultPath, null)).rejects.toThrow("Could not detect project");
|
|
137
|
-
});
|
|
138
|
-
it("throws when no slug provided and detection returns undefined", async () => {
|
|
139
|
-
const vaultPath = "/tmp/nonexistent-vault";
|
|
140
|
-
await expect(resolveProject(vaultPath, undefined)).rejects.toThrow("Could not detect project");
|
|
141
|
-
});
|
|
142
|
-
it("passes undefined slug to detection", async () => {
|
|
143
|
-
const vaultPath = "/tmp/nonexistent-vault";
|
|
144
|
-
await expect(resolveProject(vaultPath)).rejects.toThrow("Could not detect project");
|
|
145
|
-
});
|
|
146
|
-
});
|
|
147
|
-
//# sourceMappingURL=config.test.js.map
|
package/dist/config.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"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"}
|
package/dist/core/executor.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { CommandContext, CommandHandler, Middleware, MCPToolDefinition } from "./types.js";
|
|
2
|
-
export declare class CommandExecutor {
|
|
3
|
-
private handlers;
|
|
4
|
-
private toolDefinitions;
|
|
5
|
-
private middlewares;
|
|
6
|
-
register(name: string, handler: CommandHandler, toolDef?: MCPToolDefinition): void;
|
|
7
|
-
use(middleware: Middleware): void;
|
|
8
|
-
execute(name: string, args: unknown, ctx: CommandContext): Promise<unknown>;
|
|
9
|
-
getToolDefinitions(): MCPToolDefinition[];
|
|
10
|
-
private buildChain;
|
|
11
|
-
}
|
package/dist/core/executor.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
export class CommandExecutor {
|
|
2
|
-
handlers = new Map();
|
|
3
|
-
toolDefinitions = new Map();
|
|
4
|
-
middlewares = [];
|
|
5
|
-
register(name, handler, toolDef) {
|
|
6
|
-
this.handlers.set(name, handler);
|
|
7
|
-
if (toolDef) {
|
|
8
|
-
this.toolDefinitions.set(name, toolDef);
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
use(middleware) {
|
|
12
|
-
this.middlewares.push(middleware);
|
|
13
|
-
}
|
|
14
|
-
async execute(name, args, ctx) {
|
|
15
|
-
const handler = this.handlers.get(name);
|
|
16
|
-
if (!handler) {
|
|
17
|
-
throw new Error(`Unknown command: ${name}`);
|
|
18
|
-
}
|
|
19
|
-
const chain = this.buildChain(handler);
|
|
20
|
-
return chain(ctx, args);
|
|
21
|
-
}
|
|
22
|
-
getToolDefinitions() {
|
|
23
|
-
const defs = [];
|
|
24
|
-
for (const def of this.toolDefinitions.values()) {
|
|
25
|
-
defs.push(def);
|
|
26
|
-
}
|
|
27
|
-
return defs;
|
|
28
|
-
}
|
|
29
|
-
buildChain(handler) {
|
|
30
|
-
let chain = async (ctx, args) => handler(args, ctx);
|
|
31
|
-
for (let i = this.middlewares.length - 1; i >= 0; i--) {
|
|
32
|
-
const mw = this.middlewares[i];
|
|
33
|
-
const next = chain;
|
|
34
|
-
chain = async (ctx, args) => {
|
|
35
|
-
const boundNext = () => next(ctx, args);
|
|
36
|
-
return mw(ctx, boundNext);
|
|
37
|
-
};
|
|
38
|
-
}
|
|
39
|
-
return chain;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=executor.js.map
|