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,275 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdir } from "fs/promises";
3
+ import { join } from "path";
4
+ import { createTestContext } from "../test-helpers.js";
5
+ import { taskCommand } from "../commands/task.js";
6
+ import { learnCommand } from "../commands/learn.js";
7
+ import { decideCommand } from "../commands/decide.js";
8
+ import { brainstormCommand } from "../commands/brainstorm.js";
9
+ import { todoCommand } from "../commands/todo.js";
10
+ import { pruneCommand } from "../commands/prune.js";
11
+ import { contextCommand } from "../commands/context.js";
12
+ import { searchCommand } from "../commands/search.js";
13
+ import { readCommand } from "../commands/read.js";
14
+ describe("integration > project artifacts", () => {
15
+ let ctx;
16
+ let vaultRoot;
17
+ let cleanup;
18
+ beforeEach(async () => {
19
+ const tc = await createTestContext({ project: "my-project" });
20
+ ctx = tc.ctx;
21
+ vaultRoot = tc.vaultRoot;
22
+ cleanup = tc.cleanup;
23
+ await mkdir(join(vaultRoot, "projects/my-project/decisions"), { recursive: true });
24
+ await mkdir(join(vaultRoot, "projects/my-project/tasks"), { recursive: true });
25
+ await mkdir(join(vaultRoot, "projects/my-project/learnings"), { recursive: true });
26
+ await mkdir(join(vaultRoot, "projects/my-project/brainstorms"), { recursive: true });
27
+ });
28
+ afterEach(async () => {
29
+ await cleanup();
30
+ });
31
+ describe("task + learn cross-commands", () => {
32
+ it("create task then list tasks returns it", async () => {
33
+ const added = await taskCommand({ action: "add", title: "Build auth system", project: "my-project" }, ctx);
34
+ expect(added.task_id).toBe("task-001");
35
+ expect(added.path).toBeDefined();
36
+ const listed = await taskCommand({ action: "list", project: "my-project" }, ctx);
37
+ expect(listed.tasks).toHaveLength(1);
38
+ expect(listed.tasks[0].title).toBe("Build auth system");
39
+ expect(listed.tasks[0].status).toBe("backlog");
40
+ });
41
+ it("create multiple tasks then board groups by status", async () => {
42
+ await taskCommand({ action: "add", title: "Task A", project: "my-project" }, ctx);
43
+ await taskCommand({ action: "add", title: "Task B", project: "my-project" }, ctx);
44
+ await taskCommand({ action: "update", taskId: "task-001", status: "in-progress", project: "my-project" }, ctx);
45
+ const result = await taskCommand({ action: "board", project: "my-project" }, ctx);
46
+ expect(result.board["backlog"]).toHaveLength(1);
47
+ expect(result.board["backlog"][0].id).toBe("task-002");
48
+ expect(result.board["in-progress"]).toHaveLength(1);
49
+ expect(result.board["in-progress"][0].id).toBe("task-001");
50
+ });
51
+ it("update task status from backlog to in-progress", async () => {
52
+ await taskCommand({ action: "add", title: "Migrate DB", project: "my-project" }, ctx);
53
+ const updated = await taskCommand({ action: "update", taskId: "task-001", status: "in-progress", project: "my-project" }, ctx);
54
+ expect(updated.updated_fields).toContain("status");
55
+ const listed = await taskCommand({ action: "list", status: "in-progress", project: "my-project" }, ctx);
56
+ expect(listed.tasks).toHaveLength(1);
57
+ expect(listed.tasks[0].id).toBe("task-001");
58
+ });
59
+ it("create learning then list learnings returns it", async () => {
60
+ const added = await learnCommand({
61
+ action: "add",
62
+ title: "Paging is fast",
63
+ discovery: "Cursor-based pagination outperforms offset for large datasets",
64
+ project: "my-project",
65
+ }, ctx);
66
+ expect(added.learning_id).toBeDefined();
67
+ expect(added.path).toBeDefined();
68
+ const listed = await learnCommand({ action: "list", project: "my-project" }, ctx);
69
+ expect(listed.learnings).toHaveLength(1);
70
+ expect(listed.learnings[0].title).toBe("Paging is fast");
71
+ });
72
+ it("create multiple learnings then filter by tag", async () => {
73
+ await learnCommand({
74
+ action: "add",
75
+ title: "Redis caching",
76
+ discovery: "Redis reduces DB load by 60%",
77
+ tags: ["performance"],
78
+ project: "my-project",
79
+ }, ctx);
80
+ await learnCommand({
81
+ action: "add",
82
+ title: "Type safety",
83
+ discovery: "Strict mode catches bugs at compile time",
84
+ tags: ["typescript"],
85
+ project: "my-project",
86
+ }, ctx);
87
+ await learnCommand({
88
+ action: "add",
89
+ title: "Connection pooling",
90
+ discovery: "PG pool with 10 connections handles 1000 RPS",
91
+ tags: ["performance"],
92
+ project: "my-project",
93
+ }, ctx);
94
+ const perfLearnings = await learnCommand({ action: "list", tag: "performance", project: "my-project" }, ctx);
95
+ expect(perfLearnings.learnings).toHaveLength(2);
96
+ for (const l of perfLearnings.learnings) {
97
+ expect(l.tags).toContain("performance");
98
+ }
99
+ });
100
+ it("create task with blockedBy then update resolves blockers", async () => {
101
+ await taskCommand({
102
+ action: "add",
103
+ title: "Set up CI",
104
+ blockedBy: ["task-999"],
105
+ project: "my-project",
106
+ }, ctx);
107
+ const listed = await taskCommand({ action: "list", project: "my-project" }, ctx);
108
+ expect(listed.tasks[0].blocked_by).toEqual(["task-999"]);
109
+ const updated = await taskCommand({
110
+ action: "update",
111
+ taskId: "task-001",
112
+ blockedBy: [],
113
+ project: "my-project",
114
+ }, ctx);
115
+ expect(updated.updated_fields).toContain("blocked_by");
116
+ const after = await taskCommand({ action: "list", project: "my-project" }, ctx);
117
+ expect(after.tasks[0].blocked_by).toEqual([]);
118
+ });
119
+ });
120
+ describe("decide + brainstorm", () => {
121
+ it("create ADR with all fields then read it back via readCommand", async () => {
122
+ const result = await decideCommand({
123
+ title: "Use PostgreSQL",
124
+ context: "Need relational DB for ACID compliance",
125
+ decision: "PostgreSQL chosen for JSON support and extensions",
126
+ alternatives: "MySQL, SQLite, MongoDB",
127
+ consequences: "Requires DB hosting, migrations needed",
128
+ project: "my-project",
129
+ }, ctx);
130
+ expect(result.decision_number).toBe(1);
131
+ const content = await readCommand({ path: result.path }, ctx);
132
+ expect(content).toContain("Use PostgreSQL");
133
+ expect(content).toContain("Need relational DB");
134
+ expect(content).toContain("PostgreSQL chosen");
135
+ expect(content).toContain("MySQL, SQLite");
136
+ expect(content).toContain("Requires DB hosting");
137
+ });
138
+ it("create ADR then second ADR has incremented number", async () => {
139
+ const first = await decideCommand({
140
+ title: "First decision",
141
+ context: "C1",
142
+ decision: "D1",
143
+ project: "my-project",
144
+ }, ctx);
145
+ const second = await decideCommand({
146
+ title: "Second decision",
147
+ context: "C2",
148
+ decision: "D2",
149
+ project: "my-project",
150
+ }, ctx);
151
+ expect(first.decision_number).toBe(1);
152
+ expect(second.decision_number).toBe(2);
153
+ expect(second.path).not.toBe(first.path);
154
+ });
155
+ it("create brainstorm then read it back, verify content", async () => {
156
+ const result = await brainstormCommand({
157
+ topic: "Feature flag system",
158
+ content: "Should support percentage-based rollouts and user targeting",
159
+ project: "my-project",
160
+ }, ctx);
161
+ expect(result.total_entries).toBe(1);
162
+ const content = await readCommand({ path: result.path }, ctx);
163
+ expect(content).toContain("Feature flag system");
164
+ expect(content).toContain("percentage-based rollouts");
165
+ });
166
+ it("create brainstorm to existing topic appends entry", async () => {
167
+ const first = await brainstormCommand({
168
+ topic: "API design",
169
+ content: "Consider REST vs GraphQL",
170
+ project: "my-project",
171
+ }, ctx);
172
+ expect(first.total_entries).toBe(1);
173
+ const second = await brainstormCommand({
174
+ topic: "API design",
175
+ content: "Versioning via URL path is simpler",
176
+ project: "my-project",
177
+ }, ctx);
178
+ expect(second.total_entries).toBe(2);
179
+ expect(second.path).toBe(first.path);
180
+ const content = await readCommand({ path: second.path }, ctx);
181
+ expect(content).toContain("REST vs GraphQL");
182
+ expect(content).toContain("Versioning via URL path");
183
+ });
184
+ });
185
+ describe("todo", () => {
186
+ it("add todo then list returns it", async () => {
187
+ await todoCommand({ action: "add", item: "Write unit tests", project: "my-project" }, ctx);
188
+ const result = await todoCommand({ action: "list", project: "my-project" }, ctx);
189
+ expect(result.todos).toHaveLength(1);
190
+ expect(result.todos[0].text).toBe("Write unit tests");
191
+ expect(result.todos[0].completed).toBe(false);
192
+ });
193
+ it("add multiple todos then complete one", async () => {
194
+ await todoCommand({ action: "add", item: "Setup CI", project: "my-project" }, ctx);
195
+ await todoCommand({ action: "add", item: "Deploy staging", project: "my-project" }, ctx);
196
+ await todoCommand({ action: "add", item: "Write docs", project: "my-project" }, ctx);
197
+ await todoCommand({ action: "complete", item: "Deploy staging", project: "my-project" }, ctx);
198
+ const result = await todoCommand({ action: "list", project: "my-project" }, ctx);
199
+ expect(result.todos).toHaveLength(2);
200
+ const texts = result.todos.map((t) => t.text);
201
+ expect(texts).toContain("Setup CI");
202
+ expect(texts).toContain("Write docs");
203
+ expect(texts).not.toContain("Deploy staging");
204
+ });
205
+ it("add todo with high priority then list with blockersOnly returns it", async () => {
206
+ await todoCommand({ action: "add", item: "Fix critical bug", priority: "high", project: "my-project" }, ctx);
207
+ await todoCommand({ action: "add", item: "Refactor module", priority: "medium", project: "my-project" }, ctx);
208
+ await todoCommand({ action: "add", item: "Update readme", priority: "low", project: "my-project" }, ctx);
209
+ const result = await todoCommand({ action: "list", blockersOnly: true, project: "my-project" }, ctx);
210
+ expect(result.todos).toHaveLength(1);
211
+ expect(result.todos[0].text).toBe("Fix critical bug");
212
+ expect(result.todos[0].priority).toBe("high");
213
+ });
214
+ it("add todo then remove it", async () => {
215
+ await todoCommand({ action: "add", item: "Temporary item", project: "my-project" }, ctx);
216
+ await todoCommand({ action: "add", item: "Keep this", project: "my-project" }, ctx);
217
+ await todoCommand({ action: "remove", item: "Temporary item", project: "my-project" }, ctx);
218
+ const result = await todoCommand({ action: "list", project: "my-project" }, ctx);
219
+ expect(result.todos).toHaveLength(1);
220
+ expect(result.todos[0].text).toBe("Keep this");
221
+ });
222
+ });
223
+ describe("multi-artifact flow", () => {
224
+ it("create ADR, task, and learning for same project then context includes learning count", async () => {
225
+ await decideCommand({
226
+ title: "Use monorepo",
227
+ context: "Need shared code",
228
+ decision: "Turborepo with npm workspaces",
229
+ project: "my-project",
230
+ }, ctx);
231
+ await taskCommand({ action: "add", title: "Setup turborepo", project: "my-project" }, ctx);
232
+ await learnCommand({
233
+ action: "add",
234
+ title: "Turborepo caching",
235
+ discovery: "Remote cache speeds up CI by 3x",
236
+ project: "my-project",
237
+ }, ctx);
238
+ await learnCommand({
239
+ action: "add",
240
+ title: "Workspaces limits",
241
+ discovery: "npm workspaces support up to 200 packages",
242
+ project: "my-project",
243
+ }, ctx);
244
+ const result = await contextCommand({ project: "my-project" }, ctx);
245
+ expect(result.learning_count).toBe(2);
246
+ expect(result.project_slug).toBe("my-project");
247
+ });
248
+ it("create tasks then prune in dry-run mode reports them (zero actual deletions)", async () => {
249
+ await taskCommand({ action: "add", title: "Old task", project: "my-project" }, ctx);
250
+ await taskCommand({ action: "add", title: "Another task", project: "my-project" }, ctx);
251
+ await taskCommand({ action: "update", taskId: "task-001", status: "done", project: "my-project" }, ctx);
252
+ await taskCommand({ action: "update", taskId: "task-002", status: "cancelled", project: "my-project" }, ctx);
253
+ const result = await pruneCommand({ mode: "dry-run", project: "my-project" }, ctx);
254
+ expect(result).toHaveLength(1);
255
+ expect(result[0].project).toBe("my-project");
256
+ expect(result[0].stats.total_deleted).toBe(0);
257
+ expect(result[0].stats.total_archived).toBe(0);
258
+ const tasks = await taskCommand({ action: "list", project: "my-project" }, ctx);
259
+ expect(tasks.tasks).toHaveLength(2);
260
+ });
261
+ it("create ADR then search finds it by title", async () => {
262
+ const adr = await decideCommand({
263
+ title: "Adopt Zero Trust Security",
264
+ context: "Traditional perimeter security is insufficient",
265
+ decision: "Implement zero-trust architecture with mTLS",
266
+ project: "my-project",
267
+ }, ctx);
268
+ const results = await searchCommand({ query: "Zero Trust Security", project: "my-project" }, ctx);
269
+ expect(results.length).toBeGreaterThanOrEqual(1);
270
+ const paths = results.map((r) => r.path);
271
+ expect(paths.some((p) => p === adr.path)).toBe(true);
272
+ });
273
+ });
274
+ });
275
+ //# sourceMappingURL=project-artifacts.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-artifacts.test.js","sourceRoot":"","sources":["../../src/integration/project-artifacts.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,157 @@
1
+ import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
+ import { mkdir } from "fs/promises";
3
+ import { join } from "path";
4
+ import { createTestContext } from "../test-helpers.js";
5
+ import { createRegistry } from "../core/registry.js";
6
+ import { graphRelatedCommand, graphCrossProjectCommand } from "../commands/graph.js";
7
+ describe("integration > command registry", () => {
8
+ let ctx;
9
+ let vaultRoot;
10
+ let cleanup;
11
+ beforeEach(async () => {
12
+ const tc = await createTestContext({ project: "my-project" });
13
+ ctx = tc.ctx;
14
+ vaultRoot = tc.vaultRoot;
15
+ cleanup = tc.cleanup;
16
+ await mkdir(join(vaultRoot, "projects/my-project/tasks"), { recursive: true });
17
+ await mkdir(join(vaultRoot, "projects/my-project/decisions"), { recursive: true });
18
+ });
19
+ afterEach(async () => {
20
+ await cleanup();
21
+ });
22
+ describe("registry dispatch", () => {
23
+ it("registry execute vault_read calls readCommand and returns content", async () => {
24
+ await ctx.vaultFs.write("test.md", "# Hello\n\nSome content");
25
+ const registry = createRegistry();
26
+ const result = await registry.execute("vault_read", { path: "test.md" }, ctx);
27
+ expect(typeof result).toBe("string");
28
+ expect(result).toContain("Hello");
29
+ });
30
+ it("registry execute vault_write calls writeCommand and writes file", async () => {
31
+ const registry = createRegistry();
32
+ await registry.execute("vault_write", { path: "new-file.md", content: "# Written", mode: "overwrite" }, ctx);
33
+ const content = await ctx.vaultFs.read("new-file.md");
34
+ expect(content).toContain("Written");
35
+ });
36
+ it("registry execute vault_task add creates a task via the registry", async () => {
37
+ const registry = createRegistry();
38
+ const result = await registry.execute("vault_task", { action: "add", title: "Test task", project: "my-project" }, ctx);
39
+ expect(result).toBeDefined();
40
+ const taskList = await registry.execute("vault_task", { action: "list", project: "my-project" }, ctx);
41
+ expect(JSON.stringify(taskList)).toContain("Test task");
42
+ });
43
+ it("registry execute vault_decide creates an ADR via the registry", async () => {
44
+ const registry = createRegistry();
45
+ const result = await registry.execute("vault_decide", { title: "Use TypeScript", context: "Need types", decision: "Use TS", project: "my-project" }, ctx);
46
+ expect(result).toBeDefined();
47
+ const files = await ctx.vaultFs.list("projects/my-project/decisions");
48
+ expect(files.length).toBe(1);
49
+ const content = await ctx.vaultFs.read(files[0]);
50
+ expect(content).toContain("Use TypeScript");
51
+ });
52
+ it("registry execute with adaptArgs converts snake_case to camelCase", async () => {
53
+ const registry = createRegistry();
54
+ const addResult = await registry.execute("vault_task", { action: "add", title: "Snake test", project: "my-project" }, ctx);
55
+ const taskId = addResult.task_id;
56
+ expect(taskId).toMatch(/^task-\d+$/);
57
+ await registry.execute("vault_task", { action: "update", task_id: taskId, status: "done", project: "my-project" }, ctx);
58
+ const listResult = await registry.execute("vault_task", { action: "list", project: "my-project" }, ctx);
59
+ expect(JSON.stringify(listResult)).toContain("done");
60
+ });
61
+ it("registry getToolDefinitions returns all tool definitions", () => {
62
+ const registry = createRegistry();
63
+ const defs = registry.getToolDefinitions();
64
+ expect(defs.length).toBeGreaterThanOrEqual(15);
65
+ const names = defs.map((d) => d.name);
66
+ expect(names).toContain("vault_read");
67
+ expect(names).toContain("vault_write");
68
+ expect(names).toContain("vault_search");
69
+ expect(names).toContain("vault_task");
70
+ expect(names).toContain("vault_decide");
71
+ expect(names).toContain("vault_learn");
72
+ expect(names).toContain("vault_session");
73
+ expect(names).toContain("vault_brainstorm");
74
+ expect(names).toContain("vault_prune");
75
+ expect(names).toContain("vault_stats");
76
+ expect(names).toContain("vault_resume");
77
+ expect(names).toContain("vault_deprecate");
78
+ expect(names).toContain("vault_project_context");
79
+ expect(names).toContain("vault_init");
80
+ expect(names).toContain("vault_todo");
81
+ });
82
+ });
83
+ });
84
+ describe("integration > graph commands", () => {
85
+ let ctx;
86
+ let vaultRoot;
87
+ let cleanup;
88
+ beforeEach(async () => {
89
+ const tc = await createTestContext({ project: "my-project" });
90
+ ctx = tc.ctx;
91
+ vaultRoot = tc.vaultRoot;
92
+ cleanup = tc.cleanup;
93
+ await mkdir(join(vaultRoot, "projects/my-project"), { recursive: true });
94
+ });
95
+ afterEach(async () => {
96
+ await cleanup();
97
+ });
98
+ describe("graph related", () => {
99
+ it("graphRelated finds outgoing wikilinks from a note", async () => {
100
+ await ctx.vaultFs.write("projects/my-project/note-a.md", "# Note A\n\nSee [[projects/my-project/note-b]] and [[projects/my-project/note-c|C Alias]]");
101
+ await ctx.vaultFs.write("projects/my-project/note-b.md", "# Note B");
102
+ await ctx.vaultFs.write("projects/my-project/note-c.md", "# Note C");
103
+ const result = await graphRelatedCommand({ path: "projects/my-project/note-a.md" }, ctx);
104
+ expect(result.outgoing).toContain("projects/my-project/note-b");
105
+ expect(result.outgoing).toContain("projects/my-project/note-c");
106
+ });
107
+ it("graphRelated finds backlinks to a note", async () => {
108
+ await ctx.vaultFs.write("projects/my-project/note-a.md", "# Note A\n\nSee [[projects/my-project/note-b]]");
109
+ await ctx.vaultFs.write("projects/my-project/note-b.md", "# Note B\n\nLinks to [[projects/my-project/note-a]]");
110
+ const result = await graphRelatedCommand({ path: "projects/my-project/note-a.md" }, ctx);
111
+ expect(result.backlinks).toContain("projects/my-project/note-b.md");
112
+ });
113
+ it("graphRelated with hops > 1 follows linked notes", async () => {
114
+ await ctx.vaultFs.write("projects/my-project/a.md", "# A\n\n[[projects/my-project/b]]");
115
+ await ctx.vaultFs.write("projects/my-project/b.md", "# B\n\n[[projects/my-project/c]]");
116
+ await ctx.vaultFs.write("projects/my-project/c.md", "# C");
117
+ const result = await graphRelatedCommand({ path: "projects/my-project/a.md", hops: 2 }, ctx);
118
+ expect(result.outgoing).toContain("projects/my-project/b");
119
+ expect(result.outgoing).toContain("projects/my-project/c");
120
+ });
121
+ it("graphRelated on note with no links returns empty arrays", async () => {
122
+ await ctx.vaultFs.write("projects/my-project/isolated.md", "# Isolated\n\nNo links here.");
123
+ const result = await graphRelatedCommand({ path: "projects/my-project/isolated.md" }, ctx);
124
+ expect(result.outgoing).toEqual([]);
125
+ expect(result.backlinks).toEqual([]);
126
+ });
127
+ });
128
+ describe("graph cross-project", () => {
129
+ it("graphCrossProject searches across multiple project directories", async () => {
130
+ const projectMap = { projects: { "proj-a": "/tmp/a", "proj-b": "/tmp/b" } };
131
+ await ctx.vaultFs.write("project-map.json", JSON.stringify(projectMap));
132
+ await mkdir(join(vaultRoot, "projects/proj-a"), { recursive: true });
133
+ await mkdir(join(vaultRoot, "projects/proj-b"), { recursive: true });
134
+ await ctx.vaultFs.write("projects/proj-a/note.md", "# Note A\n\nDatabase connection handling");
135
+ await ctx.vaultFs.write("projects/proj-b/note.md", "# Note B\n\nDatabase migration scripts");
136
+ const result = await graphCrossProjectCommand({ query: "Database" }, ctx);
137
+ expect(typeof result).toBe("object");
138
+ const projects = Object.keys(result);
139
+ expect(projects.length).toBeGreaterThanOrEqual(1);
140
+ });
141
+ it("graphCrossProject respects limit parameter", async () => {
142
+ for (let i = 0; i < 30; i++) {
143
+ await ctx.vaultFs.write(`projects/my-project/bulk-${i}.md`, `# Note ${i}\n\nSearchable content here`);
144
+ }
145
+ const result = await graphCrossProjectCommand({ query: "Searchable", limit: 5 }, ctx);
146
+ const totalResults = Object.values(result).flat().length;
147
+ expect(totalResults).toBeLessThanOrEqual(5);
148
+ });
149
+ it("graphCrossProject returns empty for no matches", async () => {
150
+ await ctx.vaultFs.write("projects/my-project/existing.md", "# Existing\n\nSome content");
151
+ const result = await graphCrossProjectCommand({ query: "xyznonexistent123" }, ctx);
152
+ expect(typeof result).toBe("object");
153
+ expect(Object.values(result).flat().length).toBe(0);
154
+ });
155
+ });
156
+ });
157
+ //# sourceMappingURL=registry-graph.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry-graph.test.js","sourceRoot":"","sources":["../../src/integration/registry-graph.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};