superskill 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/LICENSE +21 -0
  3. package/README.md +235 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.js +1158 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/brainstorm.d.ts +9 -0
  8. package/dist/commands/brainstorm.js +37 -0
  9. package/dist/commands/brainstorm.js.map +1 -0
  10. package/dist/commands/brainstorm.test.d.ts +1 -0
  11. package/dist/commands/brainstorm.test.js +110 -0
  12. package/dist/commands/brainstorm.test.js.map +1 -0
  13. package/dist/commands/context.d.ts +18 -0
  14. package/dist/commands/context.js +88 -0
  15. package/dist/commands/context.js.map +1 -0
  16. package/dist/commands/context.test.d.ts +1 -0
  17. package/dist/commands/context.test.js +230 -0
  18. package/dist/commands/context.test.js.map +1 -0
  19. package/dist/commands/decide.d.ts +12 -0
  20. package/dist/commands/decide.js +40 -0
  21. package/dist/commands/decide.js.map +1 -0
  22. package/dist/commands/decide.test.d.ts +1 -0
  23. package/dist/commands/decide.test.js +109 -0
  24. package/dist/commands/decide.test.js.map +1 -0
  25. package/dist/commands/graph.d.ts +15 -0
  26. package/dist/commands/graph.js +89 -0
  27. package/dist/commands/graph.js.map +1 -0
  28. package/dist/commands/graph.test.d.ts +1 -0
  29. package/dist/commands/graph.test.js +215 -0
  30. package/dist/commands/graph.test.js.map +1 -0
  31. package/dist/commands/init.d.ts +11 -0
  32. package/dist/commands/init.js +257 -0
  33. package/dist/commands/init.js.map +1 -0
  34. package/dist/commands/learn.d.ts +25 -0
  35. package/dist/commands/learn.js +92 -0
  36. package/dist/commands/learn.js.map +1 -0
  37. package/dist/commands/learn.test.d.ts +1 -0
  38. package/dist/commands/learn.test.js +241 -0
  39. package/dist/commands/learn.test.js.map +1 -0
  40. package/dist/commands/prune.d.ts +58 -0
  41. package/dist/commands/prune.js +246 -0
  42. package/dist/commands/prune.js.map +1 -0
  43. package/dist/commands/read.d.ts +8 -0
  44. package/dist/commands/read.js +7 -0
  45. package/dist/commands/read.js.map +1 -0
  46. package/dist/commands/read.test.d.ts +1 -0
  47. package/dist/commands/read.test.js +48 -0
  48. package/dist/commands/read.test.js.map +1 -0
  49. package/dist/commands/resume.d.ts +20 -0
  50. package/dist/commands/resume.js +141 -0
  51. package/dist/commands/resume.js.map +1 -0
  52. package/dist/commands/resume.test.d.ts +1 -0
  53. package/dist/commands/resume.test.js +243 -0
  54. package/dist/commands/resume.test.js.map +1 -0
  55. package/dist/commands/search.d.ts +8 -0
  56. package/dist/commands/search.js +25 -0
  57. package/dist/commands/search.js.map +1 -0
  58. package/dist/commands/search.test.d.ts +1 -0
  59. package/dist/commands/search.test.js +61 -0
  60. package/dist/commands/search.test.js.map +1 -0
  61. package/dist/commands/session.d.ts +22 -0
  62. package/dist/commands/session.js +79 -0
  63. package/dist/commands/session.js.map +1 -0
  64. package/dist/commands/session.test.d.ts +1 -0
  65. package/dist/commands/session.test.js +231 -0
  66. package/dist/commands/session.test.js.map +1 -0
  67. package/dist/commands/skill/catalog.d.ts +39 -0
  68. package/dist/commands/skill/catalog.js +260 -0
  69. package/dist/commands/skill/catalog.js.map +1 -0
  70. package/dist/commands/skill/index.d.ts +55 -0
  71. package/dist/commands/skill/index.js +82 -0
  72. package/dist/commands/skill/index.js.map +1 -0
  73. package/dist/commands/skill/index.test.d.ts +1 -0
  74. package/dist/commands/skill/index.test.js +137 -0
  75. package/dist/commands/skill/index.test.js.map +1 -0
  76. package/dist/commands/skill/install.d.ts +14 -0
  77. package/dist/commands/skill/install.js +108 -0
  78. package/dist/commands/skill/install.js.map +1 -0
  79. package/dist/commands/skill/install.test.d.ts +1 -0
  80. package/dist/commands/skill/install.test.js +225 -0
  81. package/dist/commands/skill/install.test.js.map +1 -0
  82. package/dist/commands/skill/list.d.ts +6 -0
  83. package/dist/commands/skill/list.js +5 -0
  84. package/dist/commands/skill/list.js.map +1 -0
  85. package/dist/commands/skill/list.test.d.ts +1 -0
  86. package/dist/commands/skill/list.test.js +101 -0
  87. package/dist/commands/skill/list.test.js.map +1 -0
  88. package/dist/commands/skill/marketplace.d.ts +121 -0
  89. package/dist/commands/skill/marketplace.js +548 -0
  90. package/dist/commands/skill/marketplace.js.map +1 -0
  91. package/dist/commands/skill/schema.d.ts +27 -0
  92. package/dist/commands/skill/schema.js +55 -0
  93. package/dist/commands/skill/schema.js.map +1 -0
  94. package/dist/commands/skill/schema.test.d.ts +1 -0
  95. package/dist/commands/skill/schema.test.js +142 -0
  96. package/dist/commands/skill/schema.test.js.map +1 -0
  97. package/dist/commands/skill/validate.d.ts +10 -0
  98. package/dist/commands/skill/validate.js +40 -0
  99. package/dist/commands/skill/validate.js.map +1 -0
  100. package/dist/commands/skill/validate.test.d.ts +1 -0
  101. package/dist/commands/skill/validate.test.js +171 -0
  102. package/dist/commands/skill/validate.test.js.map +1 -0
  103. package/dist/commands/task.d.ts +34 -0
  104. package/dist/commands/task.js +160 -0
  105. package/dist/commands/task.js.map +1 -0
  106. package/dist/commands/task.test.d.ts +1 -0
  107. package/dist/commands/task.test.js +395 -0
  108. package/dist/commands/task.test.js.map +1 -0
  109. package/dist/commands/todo.d.ts +15 -0
  110. package/dist/commands/todo.js +99 -0
  111. package/dist/commands/todo.js.map +1 -0
  112. package/dist/commands/todo.test.d.ts +1 -0
  113. package/dist/commands/todo.test.js +324 -0
  114. package/dist/commands/todo.test.js.map +1 -0
  115. package/dist/commands/write.d.ts +12 -0
  116. package/dist/commands/write.js +40 -0
  117. package/dist/commands/write.js.map +1 -0
  118. package/dist/commands/write.test.d.ts +1 -0
  119. package/dist/commands/write.test.js +79 -0
  120. package/dist/commands/write.test.js.map +1 -0
  121. package/dist/config.d.ts +15 -0
  122. package/dist/config.js +49 -0
  123. package/dist/config.js.map +1 -0
  124. package/dist/config.test.d.ts +1 -0
  125. package/dist/config.test.js +147 -0
  126. package/dist/config.test.js.map +1 -0
  127. package/dist/core/executor.d.ts +11 -0
  128. package/dist/core/executor.js +42 -0
  129. package/dist/core/executor.js.map +1 -0
  130. package/dist/core/executor.test.d.ts +1 -0
  131. package/dist/core/executor.test.js +206 -0
  132. package/dist/core/executor.test.js.map +1 -0
  133. package/dist/core/middleware/error-handler.d.ts +2 -0
  134. package/dist/core/middleware/error-handler.js +29 -0
  135. package/dist/core/middleware/error-handler.js.map +1 -0
  136. package/dist/core/middleware/index.d.ts +2 -0
  137. package/dist/core/middleware/index.js +3 -0
  138. package/dist/core/middleware/index.js.map +1 -0
  139. package/dist/core/middleware/logging.d.ts +2 -0
  140. package/dist/core/middleware/logging.js +18 -0
  141. package/dist/core/middleware/logging.js.map +1 -0
  142. package/dist/core/registry.d.ts +12 -0
  143. package/dist/core/registry.js +552 -0
  144. package/dist/core/registry.js.map +1 -0
  145. package/dist/core/registry.test.d.ts +1 -0
  146. package/dist/core/registry.test.js +213 -0
  147. package/dist/core/registry.test.js.map +1 -0
  148. package/dist/core/types.d.ts +38 -0
  149. package/dist/core/types.js +2 -0
  150. package/dist/core/types.js.map +1 -0
  151. package/dist/integration/coordination.test.d.ts +1 -0
  152. package/dist/integration/coordination.test.js +286 -0
  153. package/dist/integration/coordination.test.js.map +1 -0
  154. package/dist/integration/project-artifacts.test.d.ts +1 -0
  155. package/dist/integration/project-artifacts.test.js +275 -0
  156. package/dist/integration/project-artifacts.test.js.map +1 -0
  157. package/dist/integration/registry-graph.test.d.ts +1 -0
  158. package/dist/integration/registry-graph.test.js +157 -0
  159. package/dist/integration/registry-graph.test.js.map +1 -0
  160. package/dist/integration/vault-lifecycle.test.d.ts +1 -0
  161. package/dist/integration/vault-lifecycle.test.js +183 -0
  162. package/dist/integration/vault-lifecycle.test.js.map +1 -0
  163. package/dist/lib/auto-number.d.ts +10 -0
  164. package/dist/lib/auto-number.js +33 -0
  165. package/dist/lib/auto-number.js.map +1 -0
  166. package/dist/lib/auto-number.test.d.ts +1 -0
  167. package/dist/lib/auto-number.test.js +88 -0
  168. package/dist/lib/auto-number.test.js.map +1 -0
  169. package/dist/lib/auto-profile.d.ts +11 -0
  170. package/dist/lib/auto-profile.js +123 -0
  171. package/dist/lib/auto-profile.js.map +1 -0
  172. package/dist/lib/auto-profile.test.d.ts +1 -0
  173. package/dist/lib/auto-profile.test.js +227 -0
  174. package/dist/lib/auto-profile.test.js.map +1 -0
  175. package/dist/lib/escape-regex.d.ts +4 -0
  176. package/dist/lib/escape-regex.js +8 -0
  177. package/dist/lib/escape-regex.js.map +1 -0
  178. package/dist/lib/escape-regex.test.d.ts +1 -0
  179. package/dist/lib/escape-regex.test.js +27 -0
  180. package/dist/lib/escape-regex.test.js.map +1 -0
  181. package/dist/lib/frontmatter.d.ts +34 -0
  182. package/dist/lib/frontmatter.js +75 -0
  183. package/dist/lib/frontmatter.js.map +1 -0
  184. package/dist/lib/frontmatter.test.d.ts +1 -0
  185. package/dist/lib/frontmatter.test.js +192 -0
  186. package/dist/lib/frontmatter.test.js.map +1 -0
  187. package/dist/lib/project-detector.d.ts +12 -0
  188. package/dist/lib/project-detector.js +124 -0
  189. package/dist/lib/project-detector.js.map +1 -0
  190. package/dist/lib/project-detector.test.d.ts +1 -0
  191. package/dist/lib/project-detector.test.js +117 -0
  192. package/dist/lib/project-detector.test.js.map +1 -0
  193. package/dist/lib/safe-external-path.d.ts +10 -0
  194. package/dist/lib/safe-external-path.js +47 -0
  195. package/dist/lib/safe-external-path.js.map +1 -0
  196. package/dist/lib/safe-external-path.test.d.ts +1 -0
  197. package/dist/lib/safe-external-path.test.js +99 -0
  198. package/dist/lib/safe-external-path.test.js.map +1 -0
  199. package/dist/lib/search-engine.d.ts +19 -0
  200. package/dist/lib/search-engine.js +164 -0
  201. package/dist/lib/search-engine.js.map +1 -0
  202. package/dist/lib/search-engine.test.d.ts +1 -0
  203. package/dist/lib/search-engine.test.js +120 -0
  204. package/dist/lib/search-engine.test.js.map +1 -0
  205. package/dist/lib/session-registry.d.ts +59 -0
  206. package/dist/lib/session-registry.js +231 -0
  207. package/dist/lib/session-registry.js.map +1 -0
  208. package/dist/lib/session-registry.test.d.ts +1 -0
  209. package/dist/lib/session-registry.test.js +199 -0
  210. package/dist/lib/session-registry.test.js.map +1 -0
  211. package/dist/lib/skill-registry.d.ts +13 -0
  212. package/dist/lib/skill-registry.js +77 -0
  213. package/dist/lib/skill-registry.js.map +1 -0
  214. package/dist/lib/stack-detector.d.ts +7 -0
  215. package/dist/lib/stack-detector.js +184 -0
  216. package/dist/lib/stack-detector.js.map +1 -0
  217. package/dist/lib/stack-detector.test.d.ts +1 -0
  218. package/dist/lib/stack-detector.test.js +110 -0
  219. package/dist/lib/stack-detector.test.js.map +1 -0
  220. package/dist/lib/token-estimator.d.ts +19 -0
  221. package/dist/lib/token-estimator.js +59 -0
  222. package/dist/lib/token-estimator.js.map +1 -0
  223. package/dist/lib/token-estimator.test.d.ts +1 -0
  224. package/dist/lib/token-estimator.test.js +65 -0
  225. package/dist/lib/token-estimator.test.js.map +1 -0
  226. package/dist/lib/tool-detector.d.ts +8 -0
  227. package/dist/lib/tool-detector.js +76 -0
  228. package/dist/lib/tool-detector.js.map +1 -0
  229. package/dist/lib/tool-detector.test.d.ts +1 -0
  230. package/dist/lib/tool-detector.test.js +170 -0
  231. package/dist/lib/tool-detector.test.js.map +1 -0
  232. package/dist/lib/vault-fs.d.ts +39 -0
  233. package/dist/lib/vault-fs.js +184 -0
  234. package/dist/lib/vault-fs.js.map +1 -0
  235. package/dist/lib/vault-fs.test.d.ts +1 -0
  236. package/dist/lib/vault-fs.test.js +210 -0
  237. package/dist/lib/vault-fs.test.js.map +1 -0
  238. package/dist/mcp-server.d.ts +2 -0
  239. package/dist/mcp-server.js +387 -0
  240. package/dist/mcp-server.js.map +1 -0
  241. package/dist/setup/clients.d.ts +2 -0
  242. package/dist/setup/clients.js +109 -0
  243. package/dist/setup/clients.js.map +1 -0
  244. package/dist/setup/configure.d.ts +6 -0
  245. package/dist/setup/configure.js +126 -0
  246. package/dist/setup/configure.js.map +1 -0
  247. package/dist/setup/configure.test.d.ts +1 -0
  248. package/dist/setup/configure.test.js +112 -0
  249. package/dist/setup/configure.test.js.map +1 -0
  250. package/dist/setup/detect.d.ts +3 -0
  251. package/dist/setup/detect.js +24 -0
  252. package/dist/setup/detect.js.map +1 -0
  253. package/dist/setup/detect.test.d.ts +1 -0
  254. package/dist/setup/detect.test.js +44 -0
  255. package/dist/setup/detect.test.js.map +1 -0
  256. package/dist/setup/index.d.ts +2 -0
  257. package/dist/setup/index.js +147 -0
  258. package/dist/setup/index.js.map +1 -0
  259. package/dist/setup/instructions.d.ts +4 -0
  260. package/dist/setup/instructions.js +62 -0
  261. package/dist/setup/instructions.js.map +1 -0
  262. package/dist/setup/instructions.test.d.ts +1 -0
  263. package/dist/setup/instructions.test.js +84 -0
  264. package/dist/setup/instructions.test.js.map +1 -0
  265. package/dist/setup/json-config.d.ts +10 -0
  266. package/dist/setup/json-config.js +43 -0
  267. package/dist/setup/json-config.js.map +1 -0
  268. package/dist/setup/json-config.test.d.ts +1 -0
  269. package/dist/setup/json-config.test.js +92 -0
  270. package/dist/setup/json-config.test.js.map +1 -0
  271. package/dist/setup/postinstall.d.ts +2 -0
  272. package/dist/setup/postinstall.js +22 -0
  273. package/dist/setup/postinstall.js.map +1 -0
  274. package/dist/setup/preuninstall.d.ts +2 -0
  275. package/dist/setup/preuninstall.js +12 -0
  276. package/dist/setup/preuninstall.js.map +1 -0
  277. package/dist/setup/setup-integration.test.d.ts +1 -0
  278. package/dist/setup/setup-integration.test.js +72 -0
  279. package/dist/setup/setup-integration.test.js.map +1 -0
  280. package/dist/setup/teardown.d.ts +5 -0
  281. package/dist/setup/teardown.js +94 -0
  282. package/dist/setup/teardown.js.map +1 -0
  283. package/dist/setup/teardown.test.d.ts +1 -0
  284. package/dist/setup/teardown.test.js +105 -0
  285. package/dist/setup/teardown.test.js.map +1 -0
  286. package/dist/setup/toml-config.d.ts +5 -0
  287. package/dist/setup/toml-config.js +26 -0
  288. package/dist/setup/toml-config.js.map +1 -0
  289. package/dist/setup/toml-config.test.d.ts +1 -0
  290. package/dist/setup/toml-config.test.js +49 -0
  291. package/dist/setup/toml-config.test.js.map +1 -0
  292. package/dist/setup/types.d.ts +52 -0
  293. package/dist/setup/types.js +23 -0
  294. package/dist/setup/types.js.map +1 -0
  295. package/dist/test-helpers.d.ts +20 -0
  296. package/dist/test-helpers.js +47 -0
  297. package/dist/test-helpers.js.map +1 -0
  298. package/dist/test-helpers.test.d.ts +1 -0
  299. package/dist/test-helpers.test.js +90 -0
  300. package/dist/test-helpers.test.js.map +1 -0
  301. package/package.json +74 -0
@@ -0,0 +1,210 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdir, writeFile, rm, symlink } from "fs/promises";
3
+ import { homedir } from "os";
4
+ import { join } from "path";
5
+ import { VaultFS, VaultError } from "./vault-fs.js";
6
+ describe("VaultFS", () => {
7
+ let vaultRoot;
8
+ let vaultFs;
9
+ beforeEach(async () => {
10
+ vaultRoot = join(homedir(), `.vault-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
11
+ await mkdir(vaultRoot, { recursive: true });
12
+ vaultFs = new VaultFS(vaultRoot);
13
+ });
14
+ afterEach(async () => {
15
+ await rm(vaultRoot, { recursive: true, force: true });
16
+ });
17
+ describe("read", () => {
18
+ it("reads existing file", async () => {
19
+ await writeFile(join(vaultRoot, "test.md"), "content");
20
+ const result = await vaultFs.read("test.md");
21
+ expect(result).toBe("content");
22
+ });
23
+ it("throws FILE_NOT_FOUND for missing file", async () => {
24
+ await expect(vaultFs.read("missing.md")).rejects.toThrow(VaultError);
25
+ await expect(vaultFs.read("missing.md")).rejects.toMatchObject({ code: "FILE_NOT_FOUND" });
26
+ });
27
+ it("rejects traversal attack with ..", async () => {
28
+ await expect(vaultFs.read("../outside.md")).rejects.toThrow(VaultError);
29
+ await expect(vaultFs.read("../outside.md")).rejects.toMatchObject({ code: "PERMISSION_DENIED" });
30
+ });
31
+ it("rejects absolute path starting with /", async () => {
32
+ await expect(vaultFs.read("/etc/passwd")).rejects.toThrow(VaultError);
33
+ await expect(vaultFs.read("/etc/passwd")).rejects.toMatchObject({ code: "PERMISSION_DENIED" });
34
+ });
35
+ it("rejects absolute path starting with ~", async () => {
36
+ await expect(vaultFs.read("~/secret")).rejects.toThrow(VaultError);
37
+ await expect(vaultFs.read("~/secret")).rejects.toMatchObject({ code: "PERMISSION_DENIED" });
38
+ });
39
+ it("rejects personal vault segment", async () => {
40
+ await expect(vaultFs.read("personal/notes.md")).rejects.toThrow(VaultError);
41
+ await expect(vaultFs.read("personal/notes.md")).rejects.toMatchObject({ code: "PERMISSION_DENIED" });
42
+ });
43
+ it("rejects personal vault segment case-insensitive", async () => {
44
+ await expect(vaultFs.read("Personal/notes.md")).rejects.toThrow(VaultError);
45
+ await expect(vaultFs.read("PERSONAL/notes.md")).rejects.toMatchObject({ code: "PERMISSION_DENIED" });
46
+ });
47
+ it("rejects non-ASCII characters", async () => {
48
+ await expect(vaultFs.read("test-日本語.md")).rejects.toThrow(VaultError);
49
+ await expect(vaultFs.read("test-日本語.md")).rejects.toMatchObject({ code: "PERMISSION_DENIED" });
50
+ });
51
+ it("reads from nested directory", async () => {
52
+ await mkdir(join(vaultRoot, "subdir"), { recursive: true });
53
+ await writeFile(join(vaultRoot, "subdir/nested.md"), "nested content");
54
+ const result = await vaultFs.read("subdir/nested.md");
55
+ expect(result).toBe("nested content");
56
+ });
57
+ });
58
+ describe("write", () => {
59
+ it("creates new file", async () => {
60
+ const result = await vaultFs.write("new.md", "content");
61
+ expect(result.path).toBe("new.md");
62
+ expect(result.bytes).toBe(7);
63
+ const content = await vaultFs.read("new.md");
64
+ expect(content).toBe("content");
65
+ });
66
+ it("creates nested directories", async () => {
67
+ await vaultFs.write("deep/nested/path/file.md", "deep content");
68
+ const content = await vaultFs.read("deep/nested/path/file.md");
69
+ expect(content).toBe("deep content");
70
+ });
71
+ it("overwrites existing file", async () => {
72
+ await vaultFs.write("existing.md", "old");
73
+ await vaultFs.write("existing.md", "new content");
74
+ const content = await vaultFs.read("existing.md");
75
+ expect(content).toBe("new content");
76
+ });
77
+ it("reports correct byte count for UTF-8", async () => {
78
+ const result = await vaultFs.write("utf8.md", "hello");
79
+ expect(result.bytes).toBe(5);
80
+ });
81
+ });
82
+ describe("append", () => {
83
+ it("appends to existing file", async () => {
84
+ await vaultFs.write("append.md", "line1\n");
85
+ const result = await vaultFs.append("append.md", "line2\n");
86
+ expect(result.bytes).toBe(6);
87
+ const content = await vaultFs.read("append.md");
88
+ expect(content).toBe("line1\nline2\n");
89
+ });
90
+ it("throws FILE_NOT_FOUND when appending to missing file", async () => {
91
+ await expect(vaultFs.append("missing.md", "content")).rejects.toMatchObject({ code: "FILE_NOT_FOUND" });
92
+ });
93
+ });
94
+ describe("list", () => {
95
+ beforeEach(async () => {
96
+ await vaultFs.write("file1.md", "1");
97
+ await vaultFs.write("file2.md", "2");
98
+ await vaultFs.write("subdir/file3.md", "3");
99
+ await vaultFs.write("subdir/deep/file4.md", "4");
100
+ await writeFile(join(vaultRoot, ".hidden"), "hidden");
101
+ });
102
+ it("lists files at depth 1", async () => {
103
+ const result = await vaultFs.list(".", 1);
104
+ expect(result).toContain("./file1.md");
105
+ expect(result).toContain("./file2.md");
106
+ expect(result).toContain("./subdir/");
107
+ expect(result).not.toContain("./subdir/file3.md");
108
+ });
109
+ it("lists files at depth 2", async () => {
110
+ const result = await vaultFs.list(".", 2);
111
+ expect(result).toContain("./file1.md");
112
+ expect(result).toContain("./subdir/file3.md");
113
+ expect(result).toContain("./subdir/deep/");
114
+ expect(result).not.toContain("./subdir/deep/file4.md");
115
+ });
116
+ it("excludes hidden files", async () => {
117
+ const result = await vaultFs.list(".", 1);
118
+ expect(result).not.toContain(".hidden");
119
+ });
120
+ it("excludes .obsidian directory", async () => {
121
+ await mkdir(join(vaultRoot, ".obsidian"));
122
+ await writeFile(join(vaultRoot, ".obsidian/config"), "config");
123
+ const result = await vaultFs.list(".", 2);
124
+ expect(result.some(p => p.includes(".obsidian"))).toBe(false);
125
+ });
126
+ it("skips symlinks", async () => {
127
+ await symlink(join(vaultRoot, "file1.md"), join(vaultRoot, "link.md"));
128
+ const result = await vaultFs.list(".", 1);
129
+ expect(result).toContain("./file1.md");
130
+ expect(result).not.toContain("./link.md");
131
+ });
132
+ it("throws FILE_NOT_FOUND for missing directory", async () => {
133
+ await expect(vaultFs.list("missing-dir", 1)).rejects.toThrow(VaultError);
134
+ await expect(vaultFs.list("missing-dir", 1)).rejects.toMatchObject({ code: "FILE_NOT_FOUND" });
135
+ });
136
+ });
137
+ describe("delete", () => {
138
+ it("deletes existing file", async () => {
139
+ await vaultFs.write("to-delete.md", "content");
140
+ await vaultFs.delete("to-delete.md");
141
+ expect(await vaultFs.exists("to-delete.md")).toBe(false);
142
+ });
143
+ it("throws FILE_NOT_FOUND for missing file", async () => {
144
+ await expect(vaultFs.delete("missing.md")).rejects.toThrow(VaultError);
145
+ await expect(vaultFs.delete("missing.md")).rejects.toMatchObject({ code: "FILE_NOT_FOUND" });
146
+ });
147
+ });
148
+ describe("move", () => {
149
+ it("moves existing file", async () => {
150
+ await vaultFs.write("old.md", "content");
151
+ const result = await vaultFs.move("old.md", "new.md");
152
+ expect(result.from).toBe("old.md");
153
+ expect(result.to).toBe("new.md");
154
+ expect(await vaultFs.exists("old.md")).toBe(false);
155
+ const content = await vaultFs.read("new.md");
156
+ expect(content).toBe("content");
157
+ });
158
+ it("moves to nested path creating directories", async () => {
159
+ await vaultFs.write("move-me.md", "content");
160
+ await vaultFs.move("move-me.md", "deep/nested/moved.md");
161
+ expect(await vaultFs.exists("move-me.md")).toBe(false);
162
+ const content = await vaultFs.read("deep/nested/moved.md");
163
+ expect(content).toBe("content");
164
+ });
165
+ it("throws FILE_NOT_FOUND for missing source", async () => {
166
+ await expect(vaultFs.move("missing.md", "target.md")).rejects.toThrow(VaultError);
167
+ await expect(vaultFs.move("missing.md", "target.md")).rejects.toMatchObject({ code: "FILE_NOT_FOUND" });
168
+ });
169
+ });
170
+ describe("exists", () => {
171
+ it("returns true for existing file", async () => {
172
+ await vaultFs.write("exists.md", "content");
173
+ expect(await vaultFs.exists("exists.md")).toBe(true);
174
+ });
175
+ it("returns false for missing file", async () => {
176
+ expect(await vaultFs.exists("missing.md")).toBe(false);
177
+ });
178
+ it("returns true for directory", async () => {
179
+ await mkdir(join(vaultRoot, "mydir"));
180
+ expect(await vaultFs.exists("mydir")).toBe(true);
181
+ });
182
+ });
183
+ describe("verifyNoSymlinkEscape", () => {
184
+ it("allows regular file", async () => {
185
+ await writeFile(join(vaultRoot, "regular.md"), "content");
186
+ await expect(vaultFs.verifyNoSymlinkEscape("regular.md")).resolves.toBeUndefined();
187
+ });
188
+ it("allows symlink inside vault", async () => {
189
+ await writeFile(join(vaultRoot, "target.md"), "content");
190
+ await symlink(join(vaultRoot, "target.md"), join(vaultRoot, "link.md"));
191
+ await expect(vaultFs.verifyNoSymlinkEscape("link.md")).resolves.toBeUndefined();
192
+ });
193
+ it("rejects symlink escaping vault", async () => {
194
+ const outsideDir = join(homedir(), `.outside-${Date.now()}`);
195
+ await mkdir(outsideDir, { recursive: true });
196
+ await writeFile(join(outsideDir, "outside.md"), "outside");
197
+ await symlink(join(outsideDir, "outside.md"), join(vaultRoot, "escape.md"));
198
+ try {
199
+ await vaultFs.read("escape.md");
200
+ expect.fail("Should have thrown");
201
+ }
202
+ catch (e) {
203
+ expect(e).toBeInstanceOf(VaultError);
204
+ expect(e.code).toBe("PERMISSION_DENIED");
205
+ }
206
+ await rm(outsideDir, { recursive: true, force: true });
207
+ });
208
+ });
209
+ });
210
+ //# sourceMappingURL=vault-fs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-fs.test.js","sourceRoot":"","sources":["../../src/lib/vault-fs.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,387 @@
1
+ #!/usr/bin/env node
2
+ // SPDX-License-Identifier: AGPL-3.0-or-later OR Commercial
3
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
4
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
5
+ import { CallToolRequestSchema, ListToolsRequestSchema, ListResourcesRequestSchema, ReadResourceRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
6
+ import { loadConfig } from "./config.js";
7
+ import { VaultFS, VaultError } from "./lib/vault-fs.js";
8
+ import { SessionRegistryManager } from "./lib/session-registry.js";
9
+ import { createRegistry } from "./core/registry.js";
10
+ import { readCommand, listCommand } from "./commands/read.js";
11
+ import { taskCommand } from "./commands/task.js";
12
+ import { searchText, searchStructured } from "./lib/search-engine.js";
13
+ import { formatResumeContext } from "./commands/resume.js";
14
+ import { getSkillAwarenessBlock } from "./commands/skill/marketplace.js";
15
+ const registry = createRegistry();
16
+ let _config = null;
17
+ let _vaultFs = null;
18
+ let _sessionRegistry = null;
19
+ function getConfig() {
20
+ if (!_config)
21
+ _config = loadConfig();
22
+ return _config;
23
+ }
24
+ function getVaultFs() {
25
+ if (!_vaultFs)
26
+ _vaultFs = new VaultFS(getConfig().vaultPath);
27
+ return _vaultFs;
28
+ }
29
+ function getSessionRegistry() {
30
+ if (!_sessionRegistry)
31
+ _sessionRegistry = new SessionRegistryManager(getConfig().vaultPath, getConfig().sessionTtlHours);
32
+ return _sessionRegistry;
33
+ }
34
+ const noopLog = {
35
+ debug() { }, info() { }, warn() { }, error() { },
36
+ };
37
+ function createCtx() {
38
+ return {
39
+ vaultFs: getVaultFs(),
40
+ vaultPath: getConfig().vaultPath,
41
+ sessionRegistry: getSessionRegistry(),
42
+ config: getConfig(),
43
+ log: noopLog,
44
+ };
45
+ }
46
+ const server = new Server({ name: "superskill", version: "0.2.0" }, { capabilities: { tools: {}, resources: {}, prompts: {} } });
47
+ // ── Tools ─────────────────────────────────────────────
48
+ server.setRequestHandler(ListToolsRequestSchema, async () => ({
49
+ tools: registry.getToolDefinitions(),
50
+ }));
51
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
52
+ const { name, arguments: args } = request.params;
53
+ const ctx = createCtx();
54
+ const raw = args;
55
+ try {
56
+ if (name === "vault_read") {
57
+ const { path, depth } = raw;
58
+ if (!path || typeof path !== "string")
59
+ throw new Error("Missing required field: path (string)");
60
+ try {
61
+ const content = await readCommand({ path }, ctx);
62
+ return { content: [{ type: "text", text: content }] };
63
+ }
64
+ catch (readErr) {
65
+ const code = readErr instanceof VaultError ? readErr.code : undefined;
66
+ const isDir = readErr instanceof Error && "code" in readErr && readErr.code === "EISDIR";
67
+ if (code === "FILE_NOT_FOUND" || isDir) {
68
+ const entries = await listCommand({ path, depth: typeof depth === "number" ? depth : 1 }, ctx);
69
+ return { content: [{ type: "text", text: JSON.stringify(entries, null, 2) }] };
70
+ }
71
+ throw readErr;
72
+ }
73
+ }
74
+ if (name === "vault_search" && raw.path_filter) {
75
+ const { query, path_filter, mode, limit } = raw;
76
+ if (!query || typeof query !== "string")
77
+ throw new Error("Missing required field: query (string)");
78
+ if (mode === "structured") {
79
+ const filters = {};
80
+ for (const part of query.split(/\s+/)) {
81
+ const idx = part.indexOf(":");
82
+ if (idx > 0)
83
+ filters[part.slice(0, idx)] = part.slice(idx + 1);
84
+ }
85
+ const results = await searchStructured(ctx.vaultPath, filters, { limit: typeof limit === "number" ? limit : undefined });
86
+ return { content: [{ type: "text", text: JSON.stringify(results, null, 2) }] };
87
+ }
88
+ const results = await searchText(ctx.vaultPath, query, {
89
+ pathFilter: typeof path_filter === "string" ? path_filter : undefined,
90
+ limit: typeof limit === "number" ? limit : undefined,
91
+ });
92
+ return { content: [{ type: "text", text: JSON.stringify(results, null, 2) }] };
93
+ }
94
+ if (name === "vault_todo") {
95
+ const { action, item, priority, project } = raw;
96
+ if (!action || typeof action !== "string") {
97
+ throw new Error("Missing required field: action (string)");
98
+ }
99
+ const validTodoActions = ["list", "add", "complete", "remove"];
100
+ if (!validTodoActions.includes(action)) {
101
+ throw new Error(`Invalid action: ${action}. Must be one of: ${validTodoActions.join(", ")}`);
102
+ }
103
+ const priorityMap = { high: "p0", medium: "p1", low: "p2" };
104
+ const taskPriority = priority && typeof priority === "string" && priority in priorityMap
105
+ ? priorityMap[priority]
106
+ : "p1";
107
+ let result;
108
+ switch (action) {
109
+ case "list": {
110
+ const tasks = await taskCommand({
111
+ action: "list",
112
+ project: typeof project === "string" ? project : undefined,
113
+ }, ctx);
114
+ const todos = (tasks.tasks ?? []).map((t) => ({
115
+ text: t.title,
116
+ priority: t.priority,
117
+ completed: t.status === "done" || t.status === "cancelled",
118
+ task_id: t.id,
119
+ }));
120
+ result = { todos };
121
+ break;
122
+ }
123
+ case "add": {
124
+ if (!item || typeof item !== "string") {
125
+ throw new Error("Missing required field: item (string)");
126
+ }
127
+ const addResult = await taskCommand({
128
+ action: "add",
129
+ title: item,
130
+ priority: taskPriority,
131
+ project: typeof project === "string" ? project : undefined,
132
+ }, ctx);
133
+ result = { added: true, task_id: addResult.task_id, path: addResult.path };
134
+ break;
135
+ }
136
+ case "complete": {
137
+ if (!item || typeof item !== "string") {
138
+ throw new Error("Missing required field: item (string)");
139
+ }
140
+ const listResult = await taskCommand({
141
+ action: "list",
142
+ project: typeof project === "string" ? project : undefined,
143
+ }, ctx);
144
+ const match = (listResult.tasks ?? []).find((t) => t.title === item);
145
+ if (!match) {
146
+ throw new Error(`Todo not found: ${item}`);
147
+ }
148
+ await taskCommand({
149
+ action: "update",
150
+ taskId: match.id,
151
+ status: "done",
152
+ project: typeof project === "string" ? project : undefined,
153
+ }, ctx);
154
+ result = { completed: true, task_id: match.id };
155
+ break;
156
+ }
157
+ case "remove": {
158
+ if (!item || typeof item !== "string") {
159
+ throw new Error("Missing required field: item (string)");
160
+ }
161
+ const listRes = await taskCommand({
162
+ action: "list",
163
+ project: typeof project === "string" ? project : undefined,
164
+ }, ctx);
165
+ const removeMatch = (listRes.tasks ?? []).find((t) => t.title === item);
166
+ if (!removeMatch) {
167
+ throw new Error(`Todo not found: ${item}`);
168
+ }
169
+ await taskCommand({
170
+ action: "update",
171
+ taskId: removeMatch.id,
172
+ status: "cancelled",
173
+ project: typeof project === "string" ? project : undefined,
174
+ }, ctx);
175
+ result = { removed: true, task_id: removeMatch.id };
176
+ break;
177
+ }
178
+ }
179
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
180
+ }
181
+ if (name === "vault_resume") {
182
+ const result = await registry.execute(name, raw, ctx);
183
+ if (raw.format === "json") {
184
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
185
+ }
186
+ return { content: [{ type: "text", text: formatResumeContext(result) }] };
187
+ }
188
+ const result = await registry.execute(name, raw, ctx);
189
+ return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
190
+ }
191
+ catch (e) {
192
+ const code = e instanceof VaultError ? e.code : "INTERNAL_ERROR";
193
+ const msg = e instanceof Error ? e.message : String(e);
194
+ return {
195
+ content: [{ type: "text", text: JSON.stringify({ error: code, message: msg }) }],
196
+ isError: true,
197
+ };
198
+ }
199
+ });
200
+ // ── Resources ─────────────────────────────────────────
201
+ server.setRequestHandler(ListResourcesRequestSchema, async () => ({
202
+ resources: [
203
+ {
204
+ uri: "vault://coordination/active-sessions",
205
+ name: "Active Sessions",
206
+ description: "Currently active agent sessions across all tools",
207
+ mimeType: "application/json",
208
+ },
209
+ ],
210
+ }));
211
+ server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
212
+ const { uri } = request.params;
213
+ try {
214
+ if (uri === "vault://coordination/active-sessions") {
215
+ const sessions = await getSessionRegistry().listActive();
216
+ return {
217
+ contents: [{ uri, mimeType: "application/json", text: JSON.stringify(sessions, null, 2) }],
218
+ };
219
+ }
220
+ const projectMatch = uri.match(/^vault:\/\/project\/([^/]+)\/context$/);
221
+ if (projectMatch) {
222
+ const slug = projectMatch[1];
223
+ const ctx = createCtx();
224
+ const result = await registry.execute("vault_project_context", { project: slug, detail_level: "summary" }, ctx);
225
+ return {
226
+ contents: [{ uri, mimeType: "text/markdown", text: result.context_md }],
227
+ };
228
+ }
229
+ return {
230
+ contents: [{ uri, mimeType: "text/plain", text: `Unknown resource: ${uri}` }],
231
+ isError: true,
232
+ };
233
+ }
234
+ catch (e) {
235
+ const msg = e instanceof Error ? e.message : String(e);
236
+ return {
237
+ contents: [{ uri, mimeType: "text/plain", text: JSON.stringify({ error: "INTERNAL_ERROR", message: msg }) }],
238
+ isError: true,
239
+ };
240
+ }
241
+ });
242
+ // ── Prompts ───────────────────────────────────────────
243
+ server.setRequestHandler(ListPromptsRequestSchema, async () => ({
244
+ prompts: [
245
+ {
246
+ name: "inject-project-context",
247
+ description: "Returns a system prompt fragment with project context, recent decisions, and active todos.",
248
+ arguments: [
249
+ { name: "project", description: "Project slug (auto-detected if omitted)", required: false },
250
+ ],
251
+ },
252
+ {
253
+ name: "summarize-session",
254
+ description: "Returns a prompt guiding the agent to produce a structured session summary.",
255
+ arguments: [
256
+ { name: "project", description: "Project slug", required: false },
257
+ ],
258
+ },
259
+ ],
260
+ }));
261
+ server.setRequestHandler(GetPromptRequestSchema, async (request) => {
262
+ const { name, arguments: args } = request.params;
263
+ try {
264
+ if (name === "inject-project-context") {
265
+ const project = args?.project;
266
+ const ctx = createCtx();
267
+ const result = await registry.execute("vault_project_context", {
268
+ project,
269
+ detail_level: "summary",
270
+ }, ctx);
271
+ let todoSection = "";
272
+ try {
273
+ const tasks = await taskCommand({
274
+ action: "list",
275
+ project: result.project_slug,
276
+ status: "blocked",
277
+ }, ctx);
278
+ if (tasks.tasks && tasks.tasks.length > 0) {
279
+ todoSection = "\n\n## Active Blockers\n" +
280
+ tasks.tasks.map((t) => `- [${t.priority.toUpperCase()}] ${t.title} (${t.id})`).join("\n");
281
+ }
282
+ }
283
+ catch {
284
+ }
285
+ let learningSection = "";
286
+ if (result.learning_count > 0) {
287
+ learningSection = `\n\n## Learnings: ${result.learning_count} available (use vault_learn list)`;
288
+ }
289
+ let sessionSection = "";
290
+ if (result.last_session) {
291
+ const ago = getTimeAgo(result.last_session.completed_at);
292
+ sessionSection = `\n\n## Last Session (${ago}): ${result.last_session.outcome}`;
293
+ }
294
+ return {
295
+ messages: [
296
+ {
297
+ role: "user",
298
+ content: {
299
+ type: "text",
300
+ text: `## Project Context: ${result.project_slug}\n\n${result.context_md}${todoSection}${learningSection}${sessionSection}${getSkillAwarenessBlock()}`,
301
+ },
302
+ },
303
+ ],
304
+ };
305
+ }
306
+ if (name === "summarize-session") {
307
+ return {
308
+ messages: [
309
+ {
310
+ role: "user",
311
+ content: {
312
+ type: "text",
313
+ text: `Please summarize this session in the following format for the knowledge vault:
314
+
315
+ ## Session Summary
316
+
317
+ **Project**: ${args?.project ?? "[auto-detect]"}
318
+ **Date**: ${new Date().toISOString().slice(0, 10)}
319
+ **Tool**: [which AI tool was used]
320
+
321
+ ### What was done
322
+ - [bullet points of completed work]
323
+
324
+ ### Decisions made
325
+ - [any architectural or design decisions, with reasoning]
326
+
327
+ ### Open items
328
+ - [anything left incomplete or requiring follow-up]
329
+
330
+ ### Files modified
331
+ - [list of files changed]`,
332
+ },
333
+ },
334
+ ],
335
+ };
336
+ }
337
+ return {
338
+ messages: [
339
+ {
340
+ role: "user",
341
+ content: {
342
+ type: "text",
343
+ text: `Unknown prompt: ${name}`,
344
+ },
345
+ },
346
+ ],
347
+ };
348
+ }
349
+ catch (e) {
350
+ const msg = e instanceof Error ? e.message : String(e);
351
+ return {
352
+ messages: [
353
+ {
354
+ role: "user",
355
+ content: {
356
+ type: "text",
357
+ text: `Error loading prompt "${name}": ${msg}`,
358
+ },
359
+ },
360
+ ],
361
+ };
362
+ }
363
+ });
364
+ function getTimeAgo(isoDate) {
365
+ const diff = Date.now() - new Date(isoDate).getTime();
366
+ const hours = Math.floor(diff / (1000 * 60 * 60));
367
+ if (hours < 1)
368
+ return "just now";
369
+ if (hours === 1)
370
+ return "1h ago";
371
+ if (hours < 24)
372
+ return `${hours}h ago`;
373
+ const days = Math.floor(hours / 24);
374
+ if (days === 1)
375
+ return "1d ago";
376
+ return `${days}d ago`;
377
+ }
378
+ // ── Start ─────────────────────────────────────────────
379
+ async function main() {
380
+ const transport = new StdioServerTransport();
381
+ await server.connect(transport);
382
+ }
383
+ main().catch((e) => {
384
+ console.error("MCP server failed to start:", e);
385
+ process.exit(1);
386
+ });
387
+ //# sourceMappingURL=mcp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../src/mcp-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ClientConfig } from "./types.js";
2
+ export declare const CLIENT_REGISTRY: ClientConfig[];