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.
Files changed (164) hide show
  1. package/.claude-plugin/marketplace.json +23 -0
  2. package/.claude-plugin/plugin.json +12 -0
  3. package/.mcp.json +9 -0
  4. package/CHANGELOG.md +28 -0
  5. package/LICENSE-COMMERCIAL.md +46 -0
  6. package/dist/cli.js +0 -0
  7. package/dist/commands/skill/marketplace.d.ts +1 -0
  8. package/dist/commands/skill/marketplace.js +79 -35
  9. package/dist/commands/skill/marketplace.js.map +1 -1
  10. package/dist/commands/skill/web-discovery.d.ts +36 -0
  11. package/dist/commands/skill/web-discovery.js +196 -0
  12. package/dist/commands/skill/web-discovery.js.map +1 -0
  13. package/dist/core/registry.js +8 -16
  14. package/dist/core/registry.js.map +1 -1
  15. package/dist/mcp-server.js +0 -0
  16. package/dist/setup/configure.js +21 -1
  17. package/dist/setup/configure.js.map +1 -1
  18. package/dist/setup/teardown.js +13 -5
  19. package/dist/setup/teardown.js.map +1 -1
  20. package/package.json +7 -1
  21. package/dist/commands/brainstorm.test.d.ts +0 -1
  22. package/dist/commands/brainstorm.test.js +0 -110
  23. package/dist/commands/brainstorm.test.js.map +0 -1
  24. package/dist/commands/context.test.d.ts +0 -1
  25. package/dist/commands/context.test.js +0 -230
  26. package/dist/commands/context.test.js.map +0 -1
  27. package/dist/commands/decide.test.d.ts +0 -1
  28. package/dist/commands/decide.test.js +0 -109
  29. package/dist/commands/decide.test.js.map +0 -1
  30. package/dist/commands/graph.test.d.ts +0 -1
  31. package/dist/commands/graph.test.js +0 -215
  32. package/dist/commands/graph.test.js.map +0 -1
  33. package/dist/commands/learn.test.d.ts +0 -1
  34. package/dist/commands/learn.test.js +0 -241
  35. package/dist/commands/learn.test.js.map +0 -1
  36. package/dist/commands/read.test.d.ts +0 -1
  37. package/dist/commands/read.test.js +0 -48
  38. package/dist/commands/read.test.js.map +0 -1
  39. package/dist/commands/resume.test.d.ts +0 -1
  40. package/dist/commands/resume.test.js +0 -243
  41. package/dist/commands/resume.test.js.map +0 -1
  42. package/dist/commands/search.test.d.ts +0 -1
  43. package/dist/commands/search.test.js +0 -61
  44. package/dist/commands/search.test.js.map +0 -1
  45. package/dist/commands/session.test.d.ts +0 -1
  46. package/dist/commands/session.test.js +0 -231
  47. package/dist/commands/session.test.js.map +0 -1
  48. package/dist/commands/skill/index.test.d.ts +0 -1
  49. package/dist/commands/skill/index.test.js +0 -137
  50. package/dist/commands/skill/index.test.js.map +0 -1
  51. package/dist/commands/skill/install.test.d.ts +0 -1
  52. package/dist/commands/skill/install.test.js +0 -225
  53. package/dist/commands/skill/install.test.js.map +0 -1
  54. package/dist/commands/skill/list.test.d.ts +0 -1
  55. package/dist/commands/skill/list.test.js +0 -101
  56. package/dist/commands/skill/list.test.js.map +0 -1
  57. package/dist/commands/skill/schema.test.d.ts +0 -1
  58. package/dist/commands/skill/schema.test.js +0 -142
  59. package/dist/commands/skill/schema.test.js.map +0 -1
  60. package/dist/commands/skill/validate.test.d.ts +0 -1
  61. package/dist/commands/skill/validate.test.js +0 -171
  62. package/dist/commands/skill/validate.test.js.map +0 -1
  63. package/dist/commands/task.test.d.ts +0 -1
  64. package/dist/commands/task.test.js +0 -395
  65. package/dist/commands/task.test.js.map +0 -1
  66. package/dist/commands/todo.test.d.ts +0 -1
  67. package/dist/commands/todo.test.js +0 -324
  68. package/dist/commands/todo.test.js.map +0 -1
  69. package/dist/commands/write.test.d.ts +0 -1
  70. package/dist/commands/write.test.js +0 -79
  71. package/dist/commands/write.test.js.map +0 -1
  72. package/dist/config.test.d.ts +0 -1
  73. package/dist/config.test.js +0 -147
  74. package/dist/config.test.js.map +0 -1
  75. package/dist/core/executor.d.ts +0 -11
  76. package/dist/core/executor.js +0 -42
  77. package/dist/core/executor.js.map +0 -1
  78. package/dist/core/executor.test.d.ts +0 -1
  79. package/dist/core/executor.test.js +0 -206
  80. package/dist/core/executor.test.js.map +0 -1
  81. package/dist/core/middleware/error-handler.d.ts +0 -2
  82. package/dist/core/middleware/error-handler.js +0 -29
  83. package/dist/core/middleware/error-handler.js.map +0 -1
  84. package/dist/core/middleware/index.d.ts +0 -2
  85. package/dist/core/middleware/index.js +0 -3
  86. package/dist/core/middleware/index.js.map +0 -1
  87. package/dist/core/middleware/logging.d.ts +0 -2
  88. package/dist/core/middleware/logging.js +0 -18
  89. package/dist/core/middleware/logging.js.map +0 -1
  90. package/dist/core/registry.test.d.ts +0 -1
  91. package/dist/core/registry.test.js +0 -213
  92. package/dist/core/registry.test.js.map +0 -1
  93. package/dist/integration/coordination.test.d.ts +0 -1
  94. package/dist/integration/coordination.test.js +0 -286
  95. package/dist/integration/coordination.test.js.map +0 -1
  96. package/dist/integration/project-artifacts.test.d.ts +0 -1
  97. package/dist/integration/project-artifacts.test.js +0 -275
  98. package/dist/integration/project-artifacts.test.js.map +0 -1
  99. package/dist/integration/registry-graph.test.d.ts +0 -1
  100. package/dist/integration/registry-graph.test.js +0 -157
  101. package/dist/integration/registry-graph.test.js.map +0 -1
  102. package/dist/integration/vault-lifecycle.test.d.ts +0 -1
  103. package/dist/integration/vault-lifecycle.test.js +0 -183
  104. package/dist/integration/vault-lifecycle.test.js.map +0 -1
  105. package/dist/lib/auto-number.test.d.ts +0 -1
  106. package/dist/lib/auto-number.test.js +0 -88
  107. package/dist/lib/auto-number.test.js.map +0 -1
  108. package/dist/lib/auto-profile.test.d.ts +0 -1
  109. package/dist/lib/auto-profile.test.js +0 -227
  110. package/dist/lib/auto-profile.test.js.map +0 -1
  111. package/dist/lib/escape-regex.test.d.ts +0 -1
  112. package/dist/lib/escape-regex.test.js +0 -27
  113. package/dist/lib/escape-regex.test.js.map +0 -1
  114. package/dist/lib/frontmatter.test.d.ts +0 -1
  115. package/dist/lib/frontmatter.test.js +0 -192
  116. package/dist/lib/frontmatter.test.js.map +0 -1
  117. package/dist/lib/project-detector.test.d.ts +0 -1
  118. package/dist/lib/project-detector.test.js +0 -117
  119. package/dist/lib/project-detector.test.js.map +0 -1
  120. package/dist/lib/safe-external-path.test.d.ts +0 -1
  121. package/dist/lib/safe-external-path.test.js +0 -99
  122. package/dist/lib/safe-external-path.test.js.map +0 -1
  123. package/dist/lib/search-engine.test.d.ts +0 -1
  124. package/dist/lib/search-engine.test.js +0 -120
  125. package/dist/lib/search-engine.test.js.map +0 -1
  126. package/dist/lib/session-registry.test.d.ts +0 -1
  127. package/dist/lib/session-registry.test.js +0 -199
  128. package/dist/lib/session-registry.test.js.map +0 -1
  129. package/dist/lib/stack-detector.test.d.ts +0 -1
  130. package/dist/lib/stack-detector.test.js +0 -110
  131. package/dist/lib/stack-detector.test.js.map +0 -1
  132. package/dist/lib/token-estimator.test.d.ts +0 -1
  133. package/dist/lib/token-estimator.test.js +0 -65
  134. package/dist/lib/token-estimator.test.js.map +0 -1
  135. package/dist/lib/tool-detector.test.d.ts +0 -1
  136. package/dist/lib/tool-detector.test.js +0 -170
  137. package/dist/lib/tool-detector.test.js.map +0 -1
  138. package/dist/lib/vault-fs.test.d.ts +0 -1
  139. package/dist/lib/vault-fs.test.js +0 -210
  140. package/dist/lib/vault-fs.test.js.map +0 -1
  141. package/dist/setup/configure.test.d.ts +0 -1
  142. package/dist/setup/configure.test.js +0 -112
  143. package/dist/setup/configure.test.js.map +0 -1
  144. package/dist/setup/detect.test.d.ts +0 -1
  145. package/dist/setup/detect.test.js +0 -44
  146. package/dist/setup/detect.test.js.map +0 -1
  147. package/dist/setup/instructions.test.d.ts +0 -1
  148. package/dist/setup/instructions.test.js +0 -84
  149. package/dist/setup/instructions.test.js.map +0 -1
  150. package/dist/setup/json-config.test.d.ts +0 -1
  151. package/dist/setup/json-config.test.js +0 -92
  152. package/dist/setup/json-config.test.js.map +0 -1
  153. package/dist/setup/setup-integration.test.d.ts +0 -1
  154. package/dist/setup/setup-integration.test.js +0 -72
  155. package/dist/setup/setup-integration.test.js.map +0 -1
  156. package/dist/setup/teardown.test.d.ts +0 -1
  157. package/dist/setup/teardown.test.js +0 -105
  158. package/dist/setup/teardown.test.js.map +0 -1
  159. package/dist/setup/toml-config.test.d.ts +0 -1
  160. package/dist/setup/toml-config.test.js +0 -49
  161. package/dist/setup/toml-config.test.js.map +0 -1
  162. package/dist/test-helpers.test.d.ts +0 -1
  163. package/dist/test-helpers.test.js +0 -90
  164. 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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"}
@@ -1 +0,0 @@
1
- export {};
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.js","sourceRoot":"","sources":["../src/config.test.ts"],"names":[],"mappings":"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"}
@@ -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
- }
@@ -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