@uasyraf/helm 0.1.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 (263) hide show
  1. package/.claude-plugin/plugin.json +9 -0
  2. package/.mcp.json +8 -0
  3. package/LICENSE +21 -0
  4. package/README.md +114 -0
  5. package/dashboard/build/client/_app/immutable/assets/0.DPthOi2j.css +1 -0
  6. package/dashboard/build/client/_app/immutable/assets/0.DPthOi2j.css.br +0 -0
  7. package/dashboard/build/client/_app/immutable/assets/0.DPthOi2j.css.gz +0 -0
  8. package/dashboard/build/client/_app/immutable/chunks/B3NJzl7g.js +1 -0
  9. package/dashboard/build/client/_app/immutable/chunks/B3NJzl7g.js.br +0 -0
  10. package/dashboard/build/client/_app/immutable/chunks/B3NJzl7g.js.gz +0 -0
  11. package/dashboard/build/client/_app/immutable/chunks/Bvgn0Gys.js +1 -0
  12. package/dashboard/build/client/_app/immutable/chunks/Bvgn0Gys.js.br +0 -0
  13. package/dashboard/build/client/_app/immutable/chunks/Bvgn0Gys.js.gz +0 -0
  14. package/dashboard/build/client/_app/immutable/chunks/C72aErMY.js +3 -0
  15. package/dashboard/build/client/_app/immutable/chunks/C72aErMY.js.br +0 -0
  16. package/dashboard/build/client/_app/immutable/chunks/C72aErMY.js.gz +0 -0
  17. package/dashboard/build/client/_app/immutable/chunks/CjpPs8iz.js +1 -0
  18. package/dashboard/build/client/_app/immutable/chunks/CjpPs8iz.js.br +0 -0
  19. package/dashboard/build/client/_app/immutable/chunks/CjpPs8iz.js.gz +0 -0
  20. package/dashboard/build/client/_app/immutable/chunks/DNLp8810.js +1 -0
  21. package/dashboard/build/client/_app/immutable/chunks/DNLp8810.js.br +0 -0
  22. package/dashboard/build/client/_app/immutable/chunks/DNLp8810.js.gz +0 -0
  23. package/dashboard/build/client/_app/immutable/chunks/DYkFpqG7.js +1 -0
  24. package/dashboard/build/client/_app/immutable/chunks/DYkFpqG7.js.br +0 -0
  25. package/dashboard/build/client/_app/immutable/chunks/DYkFpqG7.js.gz +0 -0
  26. package/dashboard/build/client/_app/immutable/chunks/DsiL0ppy.js +2 -0
  27. package/dashboard/build/client/_app/immutable/chunks/DsiL0ppy.js.br +0 -0
  28. package/dashboard/build/client/_app/immutable/chunks/DsiL0ppy.js.gz +0 -0
  29. package/dashboard/build/client/_app/immutable/chunks/bJX5vhEj.js +1 -0
  30. package/dashboard/build/client/_app/immutable/chunks/bJX5vhEj.js.br +0 -0
  31. package/dashboard/build/client/_app/immutable/chunks/bJX5vhEj.js.gz +0 -0
  32. package/dashboard/build/client/_app/immutable/chunks/gQDp4_Ul.js +1 -0
  33. package/dashboard/build/client/_app/immutable/chunks/gQDp4_Ul.js.br +0 -0
  34. package/dashboard/build/client/_app/immutable/chunks/gQDp4_Ul.js.gz +0 -0
  35. package/dashboard/build/client/_app/immutable/entry/app.D4j9hUjJ.js +2 -0
  36. package/dashboard/build/client/_app/immutable/entry/app.D4j9hUjJ.js.br +0 -0
  37. package/dashboard/build/client/_app/immutable/entry/app.D4j9hUjJ.js.gz +0 -0
  38. package/dashboard/build/client/_app/immutable/entry/start.D59wIHuS.js +1 -0
  39. package/dashboard/build/client/_app/immutable/entry/start.D59wIHuS.js.br +2 -0
  40. package/dashboard/build/client/_app/immutable/entry/start.D59wIHuS.js.gz +0 -0
  41. package/dashboard/build/client/_app/immutable/nodes/0.HocD0HAQ.js +1 -0
  42. package/dashboard/build/client/_app/immutable/nodes/0.HocD0HAQ.js.br +0 -0
  43. package/dashboard/build/client/_app/immutable/nodes/0.HocD0HAQ.js.gz +0 -0
  44. package/dashboard/build/client/_app/immutable/nodes/1.xo_a-jPh.js +1 -0
  45. package/dashboard/build/client/_app/immutable/nodes/1.xo_a-jPh.js.br +0 -0
  46. package/dashboard/build/client/_app/immutable/nodes/1.xo_a-jPh.js.gz +0 -0
  47. package/dashboard/build/client/_app/immutable/nodes/2.BwywD4n3.js +1 -0
  48. package/dashboard/build/client/_app/immutable/nodes/2.BwywD4n3.js.br +0 -0
  49. package/dashboard/build/client/_app/immutable/nodes/2.BwywD4n3.js.gz +0 -0
  50. package/dashboard/build/client/_app/immutable/nodes/3.BGY0bNfC.js +1 -0
  51. package/dashboard/build/client/_app/immutable/nodes/3.BGY0bNfC.js.br +0 -0
  52. package/dashboard/build/client/_app/immutable/nodes/3.BGY0bNfC.js.gz +0 -0
  53. package/dashboard/build/client/_app/immutable/nodes/4.C7uIivCS.js +1 -0
  54. package/dashboard/build/client/_app/immutable/nodes/4.C7uIivCS.js.br +0 -0
  55. package/dashboard/build/client/_app/immutable/nodes/4.C7uIivCS.js.gz +0 -0
  56. package/dashboard/build/client/_app/immutable/nodes/5.YszfczJW.js +1 -0
  57. package/dashboard/build/client/_app/immutable/nodes/5.YszfczJW.js.br +0 -0
  58. package/dashboard/build/client/_app/immutable/nodes/5.YszfczJW.js.gz +0 -0
  59. package/dashboard/build/client/_app/immutable/nodes/6.7fhKcbBK.js +1 -0
  60. package/dashboard/build/client/_app/immutable/nodes/6.7fhKcbBK.js.br +0 -0
  61. package/dashboard/build/client/_app/immutable/nodes/6.7fhKcbBK.js.gz +0 -0
  62. package/dashboard/build/client/_app/version.json +1 -0
  63. package/dashboard/build/client/_app/version.json.br +0 -0
  64. package/dashboard/build/client/_app/version.json.gz +0 -0
  65. package/dashboard/build/env.js +94 -0
  66. package/dashboard/build/handler.js +1494 -0
  67. package/dashboard/build/index.js +345 -0
  68. package/dashboard/build/server/chunks/0-DUUsxI66.js +40 -0
  69. package/dashboard/build/server/chunks/0-DUUsxI66.js.map +1 -0
  70. package/dashboard/build/server/chunks/1-BDkdOGL6.js +9 -0
  71. package/dashboard/build/server/chunks/1-BDkdOGL6.js.map +1 -0
  72. package/dashboard/build/server/chunks/2-BLt1vNET.js +51 -0
  73. package/dashboard/build/server/chunks/2-BLt1vNET.js.map +1 -0
  74. package/dashboard/build/server/chunks/3-B-4sxMk4.js +41 -0
  75. package/dashboard/build/server/chunks/3-B-4sxMk4.js.map +1 -0
  76. package/dashboard/build/server/chunks/4-CRZIwHJO.js +39 -0
  77. package/dashboard/build/server/chunks/4-CRZIwHJO.js.map +1 -0
  78. package/dashboard/build/server/chunks/5-CwiVOtz6.js +30 -0
  79. package/dashboard/build/server/chunks/5-CwiVOtz6.js.map +1 -0
  80. package/dashboard/build/server/chunks/6-mID2_gX2.js +53 -0
  81. package/dashboard/build/server/chunks/6-mID2_gX2.js.map +1 -0
  82. package/dashboard/build/server/chunks/_layout.svelte-DeOKequ-.js +31 -0
  83. package/dashboard/build/server/chunks/_layout.svelte-DeOKequ-.js.map +1 -0
  84. package/dashboard/build/server/chunks/_page.svelte-BGS-bwra.js +65 -0
  85. package/dashboard/build/server/chunks/_page.svelte-BGS-bwra.js.map +1 -0
  86. package/dashboard/build/server/chunks/_page.svelte-BiRjdIbl.js +35 -0
  87. package/dashboard/build/server/chunks/_page.svelte-BiRjdIbl.js.map +1 -0
  88. package/dashboard/build/server/chunks/_page.svelte-C_NO0kPy.js +49 -0
  89. package/dashboard/build/server/chunks/_page.svelte-C_NO0kPy.js.map +1 -0
  90. package/dashboard/build/server/chunks/_page.svelte-DvSQBjcA.js +80 -0
  91. package/dashboard/build/server/chunks/_page.svelte-DvSQBjcA.js.map +1 -0
  92. package/dashboard/build/server/chunks/_page.svelte-ZUq8J-ew.js +33 -0
  93. package/dashboard/build/server/chunks/_page.svelte-ZUq8J-ew.js.map +1 -0
  94. package/dashboard/build/server/chunks/error.svelte-DJ3O9Tia.js +12 -0
  95. package/dashboard/build/server/chunks/error.svelte-DJ3O9Tia.js.map +1 -0
  96. package/dashboard/build/server/chunks/exports-BnaAAAnL.js +3262 -0
  97. package/dashboard/build/server/chunks/exports-BnaAAAnL.js.map +1 -0
  98. package/dashboard/build/server/chunks/index-DwR_KaNY.js +44 -0
  99. package/dashboard/build/server/chunks/index-DwR_KaNY.js.map +1 -0
  100. package/dashboard/build/server/chunks/index-lhTMmBNn.js +207 -0
  101. package/dashboard/build/server/chunks/index-lhTMmBNn.js.map +1 -0
  102. package/dashboard/build/server/chunks/queries-DGWi-KlP.js +198 -0
  103. package/dashboard/build/server/chunks/queries-DGWi-KlP.js.map +1 -0
  104. package/dashboard/build/server/chunks/renderer-DdMvhZZr.js +1930 -0
  105. package/dashboard/build/server/chunks/renderer-DdMvhZZr.js.map +1 -0
  106. package/dashboard/build/server/index.js +5911 -0
  107. package/dashboard/build/server/index.js.map +1 -0
  108. package/dashboard/build/server/manifest.js +78 -0
  109. package/dashboard/build/server/manifest.js.map +1 -0
  110. package/dashboard/build/shims.js +32 -0
  111. package/dashboard/package.json +29 -0
  112. package/dashboard/svelte.config.js +15 -0
  113. package/dist/bin/helm.d.ts +2 -0
  114. package/dist/bin/helm.js +167 -0
  115. package/dist/bin/helm.js.map +1 -0
  116. package/dist/server/src/banner.d.ts +1 -0
  117. package/dist/server/src/banner.js +34 -0
  118. package/dist/server/src/banner.js.map +1 -0
  119. package/dist/server/src/config/load.d.ts +14 -0
  120. package/dist/server/src/config/load.js +43 -0
  121. package/dist/server/src/config/load.js.map +1 -0
  122. package/dist/server/src/dashboard.d.ts +5 -0
  123. package/dist/server/src/dashboard.js +79 -0
  124. package/dist/server/src/dashboard.js.map +1 -0
  125. package/dist/server/src/db/bootstrap.d.ts +2 -0
  126. package/dist/server/src/db/bootstrap.js +106 -0
  127. package/dist/server/src/db/bootstrap.js.map +1 -0
  128. package/dist/server/src/db/client.d.ts +14 -0
  129. package/dist/server/src/db/client.js +32 -0
  130. package/dist/server/src/db/client.js.map +1 -0
  131. package/dist/server/src/db/open-project.d.ts +17 -0
  132. package/dist/server/src/db/open-project.js +27 -0
  133. package/dist/server/src/db/open-project.js.map +1 -0
  134. package/dist/server/src/db/open-repo.d.ts +8 -0
  135. package/dist/server/src/db/open-repo.js +45 -0
  136. package/dist/server/src/db/open-repo.js.map +1 -0
  137. package/dist/server/src/db/pg-bootstrap.d.ts +4 -0
  138. package/dist/server/src/db/pg-bootstrap.js +106 -0
  139. package/dist/server/src/db/pg-bootstrap.js.map +1 -0
  140. package/dist/server/src/db/pg-client.d.ts +10 -0
  141. package/dist/server/src/db/pg-client.js +42 -0
  142. package/dist/server/src/db/pg-client.js.map +1 -0
  143. package/dist/server/src/db/repo-pg.d.ts +3 -0
  144. package/dist/server/src/db/repo-pg.js +245 -0
  145. package/dist/server/src/db/repo-pg.js.map +1 -0
  146. package/dist/server/src/db/repo-sqlite.d.ts +3 -0
  147. package/dist/server/src/db/repo-sqlite.js +224 -0
  148. package/dist/server/src/db/repo-sqlite.js.map +1 -0
  149. package/dist/server/src/db/repo.d.ts +54 -0
  150. package/dist/server/src/db/repo.js +2 -0
  151. package/dist/server/src/db/repo.js.map +1 -0
  152. package/dist/server/src/db/schema-pg.d.ts +2712 -0
  153. package/dist/server/src/db/schema-pg.js +107 -0
  154. package/dist/server/src/db/schema-pg.js.map +1 -0
  155. package/dist/server/src/db/schema.d.ts +2721 -0
  156. package/dist/server/src/db/schema.js +107 -0
  157. package/dist/server/src/db/schema.js.map +1 -0
  158. package/dist/server/src/events/emit.d.ts +21 -0
  159. package/dist/server/src/events/emit.js +17 -0
  160. package/dist/server/src/events/emit.js.map +1 -0
  161. package/dist/server/src/http/server.d.ts +10 -0
  162. package/dist/server/src/http/server.js +119 -0
  163. package/dist/server/src/http/server.js.map +1 -0
  164. package/dist/server/src/index.d.ts +2 -0
  165. package/dist/server/src/index.js +13 -0
  166. package/dist/server/src/index.js.map +1 -0
  167. package/dist/server/src/init.d.ts +12 -0
  168. package/dist/server/src/init.js +59 -0
  169. package/dist/server/src/init.js.map +1 -0
  170. package/dist/server/src/install.d.ts +8 -0
  171. package/dist/server/src/install.js +100 -0
  172. package/dist/server/src/install.js.map +1 -0
  173. package/dist/server/src/project/bootstrap.d.ts +9 -0
  174. package/dist/server/src/project/bootstrap.js +83 -0
  175. package/dist/server/src/project/bootstrap.js.map +1 -0
  176. package/dist/server/src/project/detect.d.ts +10 -0
  177. package/dist/server/src/project/detect.js +82 -0
  178. package/dist/server/src/project/detect.js.map +1 -0
  179. package/dist/server/src/project/identity.d.ts +8 -0
  180. package/dist/server/src/project/identity.js +42 -0
  181. package/dist/server/src/project/identity.js.map +1 -0
  182. package/dist/server/src/server.d.ts +8 -0
  183. package/dist/server/src/server.js +22 -0
  184. package/dist/server/src/server.js.map +1 -0
  185. package/dist/server/src/tools/debt.d.ts +2 -0
  186. package/dist/server/src/tools/debt.js +88 -0
  187. package/dist/server/src/tools/debt.js.map +1 -0
  188. package/dist/server/src/tools/decision.d.ts +2 -0
  189. package/dist/server/src/tools/decision.js +39 -0
  190. package/dist/server/src/tools/decision.js.map +1 -0
  191. package/dist/server/src/tools/epic.d.ts +2 -0
  192. package/dist/server/src/tools/epic.js +95 -0
  193. package/dist/server/src/tools/epic.js.map +1 -0
  194. package/dist/server/src/tools/index.d.ts +3 -0
  195. package/dist/server/src/tools/index.js +21 -0
  196. package/dist/server/src/tools/index.js.map +1 -0
  197. package/dist/server/src/tools/nelson.d.ts +2 -0
  198. package/dist/server/src/tools/nelson.js +28 -0
  199. package/dist/server/src/tools/nelson.js.map +1 -0
  200. package/dist/server/src/tools/progress.d.ts +2 -0
  201. package/dist/server/src/tools/progress.js +45 -0
  202. package/dist/server/src/tools/progress.js.map +1 -0
  203. package/dist/server/src/tools/sprint.d.ts +2 -0
  204. package/dist/server/src/tools/sprint.js +98 -0
  205. package/dist/server/src/tools/sprint.js.map +1 -0
  206. package/dist/server/src/tools/status.d.ts +2 -0
  207. package/dist/server/src/tools/status.js +31 -0
  208. package/dist/server/src/tools/status.js.map +1 -0
  209. package/dist/server/src/tools/story.d.ts +2 -0
  210. package/dist/server/src/tools/story.js +155 -0
  211. package/dist/server/src/tools/story.js.map +1 -0
  212. package/dist/server/src/tools/task.d.ts +2 -0
  213. package/dist/server/src/tools/task.js +90 -0
  214. package/dist/server/src/tools/task.js.map +1 -0
  215. package/dist/server/src/tools/types.d.ts +15 -0
  216. package/dist/server/src/tools/types.js +11 -0
  217. package/dist/server/src/tools/types.js.map +1 -0
  218. package/dist/server/src/util/git.d.ts +8 -0
  219. package/dist/server/src/util/git.js +51 -0
  220. package/dist/server/src/util/git.js.map +1 -0
  221. package/dist/server/src/util/ids.d.ts +2 -0
  222. package/dist/server/src/util/ids.js +8 -0
  223. package/dist/server/src/util/ids.js.map +1 -0
  224. package/dist/server/src/util/paths.d.ts +2 -0
  225. package/dist/server/src/util/paths.js +9 -0
  226. package/dist/server/src/util/paths.js.map +1 -0
  227. package/dist/server/src/worker/client.d.ts +12 -0
  228. package/dist/server/src/worker/client.js +89 -0
  229. package/dist/server/src/worker/client.js.map +1 -0
  230. package/dist/server/src/worker/hook.d.ts +1 -0
  231. package/dist/server/src/worker/hook.js +36 -0
  232. package/dist/server/src/worker/hook.js.map +1 -0
  233. package/dist/server/src/worker/ingest.d.ts +14 -0
  234. package/dist/server/src/worker/ingest.js +86 -0
  235. package/dist/server/src/worker/ingest.js.map +1 -0
  236. package/dist/server/src/worker/markers/any-type.d.ts +6 -0
  237. package/dist/server/src/worker/markers/any-type.js +19 -0
  238. package/dist/server/src/worker/markers/any-type.js.map +1 -0
  239. package/dist/server/src/worker/markers/debt.d.ts +11 -0
  240. package/dist/server/src/worker/markers/debt.js +53 -0
  241. package/dist/server/src/worker/markers/debt.js.map +1 -0
  242. package/dist/server/src/worker/markers/file-size.d.ts +5 -0
  243. package/dist/server/src/worker/markers/file-size.js +32 -0
  244. package/dist/server/src/worker/markers/file-size.js.map +1 -0
  245. package/dist/server/src/worker/scanner.d.ts +23 -0
  246. package/dist/server/src/worker/scanner.js +23 -0
  247. package/dist/server/src/worker/scanner.js.map +1 -0
  248. package/dist/server/src/worker/server.d.ts +1 -0
  249. package/dist/server/src/worker/server.js +137 -0
  250. package/dist/server/src/worker/server.js.map +1 -0
  251. package/dist/server/src/worker/socket.d.ts +3 -0
  252. package/dist/server/src/worker/socket.js +12 -0
  253. package/dist/server/src/worker/socket.js.map +1 -0
  254. package/hooks/hooks.json +33 -0
  255. package/package.json +56 -0
  256. package/skills/backlog/SKILL.md +18 -0
  257. package/skills/debt/SKILL.md +39 -0
  258. package/skills/epic/SKILL.md +22 -0
  259. package/skills/nelson-integration/SKILL.md +44 -0
  260. package/skills/project-tracker/SKILL.md +60 -0
  261. package/skills/review/SKILL.md +27 -0
  262. package/skills/sprint/SKILL.md +23 -0
  263. package/skills/story/SKILL.md +29 -0
@@ -0,0 +1,98 @@
1
+ import { z } from "zod";
2
+ import { jsonResult } from "./types.js";
3
+ import { newId, now } from "../util/ids.js";
4
+ import { emitEvent } from "../events/emit.js";
5
+ export const registerSprintTools = (server, ctx) => {
6
+ server.registerTool("start_sprint", {
7
+ title: "Start a new sprint",
8
+ description: "Closes the current active sprint (if any) and opens a new one. Sprint length comes from project config.",
9
+ inputSchema: {
10
+ name: z.string().min(1).optional().describe("Optional sprint name. Defaults to sprint-N."),
11
+ goal: z.string().optional().describe("One-line sprint goal."),
12
+ wipLimit: z.number().int().positive().optional(),
13
+ },
14
+ }, async (args) => {
15
+ const { repo, session } = ctx;
16
+ await repo.closeActiveSprints(session.project.id, now());
17
+ const seq = (await repo.countSprintsByProject(session.project.id)) + 1;
18
+ const id = newId();
19
+ const name = args.name ?? `sprint-${seq}`;
20
+ await repo.insertSprint({
21
+ id,
22
+ projectId: session.project.id,
23
+ name,
24
+ goal: args.goal ?? null,
25
+ startedAt: now(),
26
+ endedAt: null,
27
+ status: "active",
28
+ wipLimit: args.wipLimit ?? null,
29
+ });
30
+ await emitEvent(repo, {
31
+ projectId: session.project.id,
32
+ developerId: session.developer.id,
33
+ sprintId: id,
34
+ kind: "sprint.started",
35
+ refId: id,
36
+ summary: `${name} started${args.goal ? `: ${args.goal}` : ""}`,
37
+ });
38
+ return jsonResult({ id, name, status: "active" });
39
+ });
40
+ server.registerTool("end_sprint", {
41
+ title: "End the active sprint",
42
+ description: "Closes the active sprint. Incomplete stories return to backlog (locked default — see PRD F2).",
43
+ inputSchema: {},
44
+ }, async () => {
45
+ const { repo, session } = ctx;
46
+ const row = await repo.findActiveSprint(session.project.id);
47
+ if (!row) {
48
+ return jsonResult({ error: "no active sprint" });
49
+ }
50
+ const incomplete = await repo.findStoriesInSprintNotDoneOrDropped(row.id);
51
+ if (incomplete.length > 0) {
52
+ await repo.rolloverIncompleteStoriesToBacklog(row.id);
53
+ for (const s of incomplete) {
54
+ await emitEvent(repo, {
55
+ projectId: session.project.id,
56
+ developerId: session.developer.id,
57
+ sprintId: row.id,
58
+ kind: "story.moved",
59
+ refId: s.id,
60
+ summary: `${s.title} → backlog (sprint rollover)`,
61
+ });
62
+ }
63
+ }
64
+ await repo.updateSprint(row.id, { status: "closed", endedAt: now() });
65
+ await emitEvent(repo, {
66
+ projectId: session.project.id,
67
+ developerId: session.developer.id,
68
+ sprintId: row.id,
69
+ kind: "sprint.ended",
70
+ refId: row.id,
71
+ summary: `${row.name} ended${incomplete.length > 0 ? ` (${incomplete.length} rolled to backlog)` : ""}`,
72
+ });
73
+ return jsonResult({ id: row.id, name: row.name, status: "closed", rolledToBacklog: incomplete.length });
74
+ });
75
+ server.registerTool("sprint_review", {
76
+ title: "Sprint review summary",
77
+ description: "Completed stories, velocity (sized stories closed), debt delta, top events for a sprint.",
78
+ inputSchema: {
79
+ sprintId: z.string().optional().describe("Defaults to active sprint."),
80
+ },
81
+ }, async (args) => {
82
+ const { repo, session } = ctx;
83
+ const sprintId = args.sprintId ?? session.activeSprint.id;
84
+ const inSprint = await repo.findStoriesInSprint(sprintId);
85
+ const completed = inSprint.filter((s) => s.status === "done");
86
+ const opened = await repo.countEventsByKindInSprint(sprintId, "debt.opened");
87
+ const closed = await repo.countEventsByKindInSprint(sprintId, "debt.closed");
88
+ const sized = completed.filter((s) => s.size).length;
89
+ return jsonResult({
90
+ sprintId,
91
+ completedStories: completed.length,
92
+ velocitySizedStories: sized,
93
+ debt: { opened, closed, delta: opened - closed },
94
+ stories: completed.map((s) => ({ id: s.id, title: s.title, size: s.size })),
95
+ });
96
+ });
97
+ };
98
+ //# sourceMappingURL=sprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sprint.js","sourceRoot":"","sources":["../../../../server/src/tools/sprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,CAAC,MAAM,mBAAmB,GAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;IAChE,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,yGAAyG;QACtH,WAAW,EAAE;YACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6CAA6C,CAAC;YAC1F,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;YAC7D,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;SACjD;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;QAC9B,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAEvE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,UAAU,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,CAAC,YAAY,CAAC;YACtB,EAAE;YACF,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;YAC7B,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;YACvB,SAAS,EAAE,GAAG,EAAE;YAChB,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,QAAQ;YAChB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI;SAChC,CAAC,CAAC;QAEH,MAAM,SAAS,CAAC,IAAI,EAAE;YACpB,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;YAC7B,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE;YACjC,QAAQ,EAAE,EAAE;YACZ,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,GAAG,IAAI,WAAW,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;SAC/D,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpD,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,+FAA+F;QAC5G,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,UAAU,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mCAAmC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC1E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,CAAC,kCAAkC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtD,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;gBAC3B,MAAM,SAAS,CAAC,IAAI,EAAE;oBACpB,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;oBAC7B,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE;oBACjC,QAAQ,EAAE,GAAG,CAAC,EAAE;oBAChB,IAAI,EAAE,aAAa;oBACnB,KAAK,EAAE,CAAC,CAAC,EAAE;oBACX,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,8BAA8B;iBAClD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACtE,MAAM,SAAS,CAAC,IAAI,EAAE;YACpB,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE;YAC7B,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE;YACjC,QAAQ,EAAE,GAAG,CAAC,EAAE;YAChB,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,GAAG,CAAC,EAAE;YACb,OAAO,EAAE,GAAG,GAAG,CAAC,IAAI,SAAS,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,MAAM,qBAAqB,CAAC,CAAC,CAAC,EAAE,EAAE;SACxG,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1G,CAAC,CACF,CAAC;IAEF,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EAAE,0FAA0F;QACvG,WAAW,EAAE;YACX,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;SACvE;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC7E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC7E,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACrD,OAAO,UAAU,CAAC;YAChB,QAAQ;YACR,gBAAgB,EAAE,SAAS,CAAC,MAAM;YAClC,oBAAoB,EAAE,KAAK;YAC3B,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;YAChD,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;SAC5E,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistrar } from "./types.js";
2
+ export declare const registerStatusTools: ToolRegistrar;
@@ -0,0 +1,31 @@
1
+ import { jsonResult } from "./types.js";
2
+ export const registerStatusTools = (server, ctx) => {
3
+ server.registerTool("get_status", {
4
+ title: "Project status",
5
+ description: "Active sprint, in-flight stories, open debt counts, killer metric (debt delta this sprint).",
6
+ inputSchema: {},
7
+ }, async () => {
8
+ const { repo, session } = ctx;
9
+ const sprintId = session.activeSprint.id;
10
+ const projectId = session.project.id;
11
+ const inSprintByStatus = await repo.countStoriesInSprintByStatus(sprintId);
12
+ const backlogCount = await repo.countBacklog(projectId);
13
+ const openDebt = await repo.countOpenDebtByProject(projectId);
14
+ const opened = await repo.countEventsByKindInSprint(sprintId, "debt.opened");
15
+ const closed = await repo.countEventsByKindInSprint(sprintId, "debt.closed");
16
+ return jsonResult({
17
+ project: { slug: session.project.slug, name: session.project.name },
18
+ sprint: {
19
+ id: session.activeSprint.id,
20
+ name: session.activeSprint.name,
21
+ goal: session.activeSprint.goal,
22
+ startedAt: session.activeSprint.startedAt,
23
+ status: session.activeSprint.status,
24
+ },
25
+ stories: { inSprintByStatus, backlogCount },
26
+ debt: { open: openDebt, openedThisSprint: opened, closedThisSprint: closed, delta: opened - closed },
27
+ warnings: session.warnings,
28
+ });
29
+ });
30
+ };
31
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../server/src/tools/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,MAAM,CAAC,MAAM,mBAAmB,GAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;IAChE,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,6FAA6F;QAC1G,WAAW,EAAE,EAAE;KAChB,EACD,KAAK,IAAI,EAAE;QACT,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;QAC9B,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACzC,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAErC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC,CAAC;QAC3E,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC7E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAE7E,OAAO,UAAU,CAAC;YAChB,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE;YACnE,MAAM,EAAE;gBACN,EAAE,EAAE,OAAO,CAAC,YAAY,CAAC,EAAE;gBAC3B,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,IAAI;gBAC/B,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,IAAI;gBAC/B,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,SAAS;gBACzC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM;aACpC;YACD,OAAO,EAAE,EAAE,gBAAgB,EAAE,YAAY,EAAE;YAC3C,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;YACpG,QAAQ,EAAE,OAAO,CAAC,QAAQ;SAC3B,CAAC,CAAC;IACL,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistrar } from "./types.js";
2
+ export declare const registerStoryTools: ToolRegistrar;
@@ -0,0 +1,155 @@
1
+ import { z } from "zod";
2
+ import { jsonResult } from "./types.js";
3
+ import { newId, now } from "../util/ids.js";
4
+ import { emitEvent } from "../events/emit.js";
5
+ const STORY_STATUS = z.enum(["backlog", "todo", "doing", "review", "done", "dropped"]);
6
+ const SIZE = z.enum(["XS", "S", "M", "L", "XL", "XXL"]);
7
+ export const registerStoryTools = (server, ctx) => {
8
+ server.registerTool("open_story", {
9
+ title: "Open a new story",
10
+ description: "Create a user-valued increment. Optionally attach to an epic or sprint; default lands in backlog.",
11
+ inputSchema: {
12
+ title: z.string().min(1),
13
+ description: z.string().optional(),
14
+ acceptance: z.string().optional(),
15
+ epicId: z.string().optional(),
16
+ sprintId: z.string().optional(),
17
+ size: SIZE.optional(),
18
+ priority: z.number().int().min(1).max(5).optional(),
19
+ assigneeId: z.string().optional(),
20
+ },
21
+ }, async (args) => {
22
+ const { repo, session } = ctx;
23
+ const id = newId();
24
+ const initialStatus = args.sprintId ? "todo" : "backlog";
25
+ await repo.insertStory({
26
+ id,
27
+ epicId: args.epicId ?? null,
28
+ sprintId: args.sprintId ?? null,
29
+ title: args.title,
30
+ description: args.description ?? null,
31
+ acceptance: args.acceptance ?? null,
32
+ status: initialStatus,
33
+ size: args.size ?? null,
34
+ assigneeId: args.assigneeId ?? null,
35
+ priority: args.priority ?? 3,
36
+ startedAt: null,
37
+ completedAt: null,
38
+ createdAt: now(),
39
+ });
40
+ await emitEvent(repo, {
41
+ projectId: session.project.id,
42
+ developerId: session.developer.id,
43
+ sprintId: args.sprintId ?? session.activeSprint.id,
44
+ kind: "story.opened",
45
+ refId: id,
46
+ summary: `story: ${args.title}`,
47
+ });
48
+ return jsonResult({ id, title: args.title, status: initialStatus, sprintId: args.sprintId ?? null });
49
+ });
50
+ server.registerTool("update_story", {
51
+ title: "Update a story",
52
+ description: "Edit any mutable field. Status transitions to doing/review/done emit timeline events.",
53
+ inputSchema: {
54
+ id: z.string(),
55
+ title: z.string().optional(),
56
+ description: z.string().optional(),
57
+ acceptance: z.string().optional(),
58
+ status: STORY_STATUS.optional(),
59
+ size: SIZE.optional(),
60
+ priority: z.number().int().min(1).max(5).optional(),
61
+ assigneeId: z.string().optional(),
62
+ epicId: z.string().optional(),
63
+ },
64
+ }, async (args) => {
65
+ const { repo, session } = ctx;
66
+ const updates = {};
67
+ if (args.title !== undefined)
68
+ updates.title = args.title;
69
+ if (args.description !== undefined)
70
+ updates.description = args.description;
71
+ if (args.acceptance !== undefined)
72
+ updates.acceptance = args.acceptance;
73
+ if (args.status !== undefined)
74
+ updates.status = args.status;
75
+ if (args.size !== undefined)
76
+ updates.size = args.size;
77
+ if (args.priority !== undefined)
78
+ updates.priority = args.priority;
79
+ if (args.assigneeId !== undefined)
80
+ updates.assigneeId = args.assigneeId;
81
+ if (args.epicId !== undefined)
82
+ updates.epicId = args.epicId;
83
+ if (args.status === "doing")
84
+ updates.startedAt = now();
85
+ if (Object.keys(updates).length === 0)
86
+ return jsonResult({ id: args.id, changed: false });
87
+ await repo.updateStory(args.id, updates);
88
+ await emitEvent(repo, {
89
+ projectId: session.project.id,
90
+ developerId: session.developer.id,
91
+ sprintId: session.activeSprint.id,
92
+ kind: "story.updated",
93
+ refId: args.id,
94
+ summary: `story updated: ${Object.keys(updates).join(", ")}`,
95
+ });
96
+ return jsonResult({ id: args.id, changed: true, updates });
97
+ });
98
+ server.registerTool("move_story", {
99
+ title: "Move a story to a sprint or back to backlog",
100
+ description: "Pass sprintId to move into a sprint, or null to send to backlog.",
101
+ inputSchema: {
102
+ id: z.string(),
103
+ sprintId: z.string().nullable().describe("null to send to backlog"),
104
+ },
105
+ }, async (args) => {
106
+ const { repo, session } = ctx;
107
+ const newStatus = args.sprintId ? "todo" : "backlog";
108
+ await repo.updateStory(args.id, { sprintId: args.sprintId, status: newStatus });
109
+ await emitEvent(repo, {
110
+ projectId: session.project.id,
111
+ developerId: session.developer.id,
112
+ sprintId: args.sprintId ?? session.activeSprint.id,
113
+ kind: "story.moved",
114
+ refId: args.id,
115
+ summary: args.sprintId ? `story moved to sprint ${args.sprintId}` : `story moved to backlog`,
116
+ });
117
+ return jsonResult({ id: args.id, sprintId: args.sprintId, status: newStatus });
118
+ });
119
+ server.registerTool("close_story", {
120
+ title: "Close a story",
121
+ description: "Marks done (or dropped). Sets completed_at.",
122
+ inputSchema: {
123
+ id: z.string(),
124
+ dropped: z.boolean().optional(),
125
+ },
126
+ }, async (args) => {
127
+ const { repo, session } = ctx;
128
+ const status = args.dropped ? "dropped" : "done";
129
+ await repo.updateStory(args.id, { status, completedAt: now() });
130
+ await emitEvent(repo, {
131
+ projectId: session.project.id,
132
+ developerId: session.developer.id,
133
+ sprintId: session.activeSprint.id,
134
+ kind: "story.closed",
135
+ refId: args.id,
136
+ summary: `story ${status}`,
137
+ });
138
+ return jsonResult({ id: args.id, status });
139
+ });
140
+ server.registerTool("list_backlog", {
141
+ title: "List backlog stories",
142
+ description: "Stories not assigned to a sprint, ordered by priority then creation time.",
143
+ inputSchema: {
144
+ limit: z.number().int().positive().max(200).optional(),
145
+ },
146
+ }, async (args) => {
147
+ const { repo, session } = ctx;
148
+ const rows = await repo.findBacklogStories(session.project.id, args.limit ?? 50);
149
+ return jsonResult({
150
+ count: rows.length,
151
+ stories: rows.map((r) => ({ id: r.id, title: r.title, priority: r.priority, size: r.size })),
152
+ });
153
+ });
154
+ };
155
+ //# sourceMappingURL=story.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"story.js","sourceRoot":"","sources":["../../../../server/src/tools/story.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { ToolRegistrar } from "./types.js";
2
+ export declare const registerTaskTools: ToolRegistrar;
@@ -0,0 +1,90 @@
1
+ import { z } from "zod";
2
+ import { jsonResult } from "./types.js";
3
+ import { newId, now } from "../util/ids.js";
4
+ import { emitEvent } from "../events/emit.js";
5
+ const TASK_STATUS = z.enum(["todo", "doing", "done"]);
6
+ export const registerTaskTools = (server, ctx) => {
7
+ server.registerTool("open_task", {
8
+ title: "Open a task under a story",
9
+ description: "Implementation step inside a story. Not a substitute for TodoWrite.",
10
+ inputSchema: {
11
+ storyId: z.string(),
12
+ title: z.string().min(1),
13
+ assigneeId: z.string().optional(),
14
+ blockedBy: z.string().optional().describe("ID of a blocking task, if any."),
15
+ },
16
+ }, async (args) => {
17
+ const { repo, session } = ctx;
18
+ const id = newId();
19
+ await repo.insertTask({
20
+ id,
21
+ storyId: args.storyId,
22
+ assigneeId: args.assigneeId ?? null,
23
+ title: args.title,
24
+ status: "todo",
25
+ blockedBy: args.blockedBy ?? null,
26
+ createdAt: now(),
27
+ });
28
+ await emitEvent(repo, {
29
+ projectId: session.project.id,
30
+ developerId: session.developer.id,
31
+ sprintId: session.activeSprint.id,
32
+ kind: "task.opened",
33
+ refId: id,
34
+ summary: `task: ${args.title}`,
35
+ });
36
+ return jsonResult({ id, title: args.title, status: "todo" });
37
+ });
38
+ server.registerTool("update_task", {
39
+ title: "Update a task",
40
+ description: "Edit title, status, assignee, or blocked_by.",
41
+ inputSchema: {
42
+ id: z.string(),
43
+ title: z.string().optional(),
44
+ status: TASK_STATUS.optional(),
45
+ assigneeId: z.string().optional(),
46
+ blockedBy: z.string().nullable().optional(),
47
+ },
48
+ }, async (args) => {
49
+ const { repo, session } = ctx;
50
+ const updates = {};
51
+ if (args.title !== undefined)
52
+ updates.title = args.title;
53
+ if (args.status !== undefined)
54
+ updates.status = args.status;
55
+ if (args.assigneeId !== undefined)
56
+ updates.assigneeId = args.assigneeId;
57
+ if (args.blockedBy !== undefined)
58
+ updates.blockedBy = args.blockedBy;
59
+ if (Object.keys(updates).length === 0)
60
+ return jsonResult({ id: args.id, changed: false });
61
+ await repo.updateTask(args.id, updates);
62
+ await emitEvent(repo, {
63
+ projectId: session.project.id,
64
+ developerId: session.developer.id,
65
+ sprintId: session.activeSprint.id,
66
+ kind: "task.updated",
67
+ refId: args.id,
68
+ summary: `task updated: ${Object.keys(updates).join(", ")}`,
69
+ });
70
+ return jsonResult({ id: args.id, changed: true, updates });
71
+ });
72
+ server.registerTool("close_task", {
73
+ title: "Close a task",
74
+ description: "Marks a task done.",
75
+ inputSchema: { id: z.string() },
76
+ }, async (args) => {
77
+ const { repo, session } = ctx;
78
+ await repo.updateTask(args.id, { status: "done" });
79
+ await emitEvent(repo, {
80
+ projectId: session.project.id,
81
+ developerId: session.developer.id,
82
+ sprintId: session.activeSprint.id,
83
+ kind: "task.closed",
84
+ refId: args.id,
85
+ summary: "task done",
86
+ });
87
+ return jsonResult({ id: args.id, status: "done" });
88
+ });
89
+ };
90
+ //# sourceMappingURL=task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.js","sourceRoot":"","sources":["../../../../server/src/tools/task.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { HelmRepo } from "../db/repo.js";
3
+ import type { SessionContext } from "../project/bootstrap.js";
4
+ export interface ToolContext {
5
+ repo: HelmRepo;
6
+ session: SessionContext;
7
+ cwd: string;
8
+ }
9
+ export type ToolRegistrar = (server: McpServer, ctx: ToolContext) => void;
10
+ export declare function jsonResult(payload: unknown): {
11
+ content: {
12
+ type: "text";
13
+ text: string;
14
+ }[];
15
+ };
@@ -0,0 +1,11 @@
1
+ export function jsonResult(payload) {
2
+ return {
3
+ content: [
4
+ {
5
+ type: "text",
6
+ text: JSON.stringify(payload, null, 2),
7
+ },
8
+ ],
9
+ };
10
+ }
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../server/src/tools/types.ts"],"names":[],"mappings":"AAYA,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;aACvC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface GitProbe {
2
+ isRepo: boolean;
3
+ remoteUrl: string | null;
4
+ userEmail: string | null;
5
+ }
6
+ export declare function probeGit(cwd: string): GitProbe;
7
+ export declare function repoRoot(cwd: string): string | null;
8
+ export declare function parseRemoteToSlug(remoteUrl: string): string | null;
@@ -0,0 +1,51 @@
1
+ import { execFileSync } from "node:child_process";
2
+ function tryGit(args, cwd) {
3
+ try {
4
+ const out = execFileSync("git", args, {
5
+ cwd,
6
+ encoding: "utf8",
7
+ stdio: ["ignore", "pipe", "ignore"],
8
+ });
9
+ return out.trim() || null;
10
+ }
11
+ catch {
12
+ return null;
13
+ }
14
+ }
15
+ export function probeGit(cwd) {
16
+ const insideRepo = tryGit(["rev-parse", "--is-inside-work-tree"], cwd) === "true";
17
+ return {
18
+ isRepo: insideRepo,
19
+ remoteUrl: insideRepo ? tryGit(["remote", "get-url", "origin"], cwd) : null,
20
+ userEmail: insideRepo ? tryGit(["config", "user.email"], cwd) : null,
21
+ };
22
+ }
23
+ export function repoRoot(cwd) {
24
+ return tryGit(["rev-parse", "--show-toplevel"], cwd);
25
+ }
26
+ export function parseRemoteToSlug(remoteUrl) {
27
+ let url = remoteUrl.trim();
28
+ if (url.endsWith(".git"))
29
+ url = url.slice(0, -4);
30
+ url = url.replace(/^git@([^:]+):/, "https://$1/");
31
+ try {
32
+ const parsed = new URL(url);
33
+ const parts = parsed.pathname.replace(/^\/+/, "").split("/").filter(Boolean);
34
+ if (parts.length < 2) {
35
+ const tail = parts[0];
36
+ return tail ? sanitize(tail) : null;
37
+ }
38
+ const org = parts[parts.length - 2];
39
+ const repo = parts[parts.length - 1];
40
+ if (!org || !repo)
41
+ return null;
42
+ return sanitize(`${org}-${repo}`);
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ }
48
+ function sanitize(raw) {
49
+ return raw.toLowerCase().replace(/[^a-z0-9._-]/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
50
+ }
51
+ //# sourceMappingURL=git.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git.js","sourceRoot":"","sources":["../../../../server/src/util/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD,SAAS,MAAM,CAAC,IAAc,EAAE,GAAW;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;YACpC,GAAG;YACH,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAAE,GAAG,CAAC,KAAK,MAAM,CAAC;IAClF,OAAO;QACL,MAAM,EAAE,UAAU;QAClB,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;QAC3E,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;KACrE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,OAAO,MAAM,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,SAAiB;IACjD,IAAI,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;IAClD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7E,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACtC,CAAC;QACD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,OAAO,QAAQ,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW;IAC3B,OAAO,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACnG,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function newId(): string;
2
+ export declare function now(): string;
@@ -0,0 +1,8 @@
1
+ import { randomUUID } from "node:crypto";
2
+ export function newId() {
3
+ return randomUUID();
4
+ }
5
+ export function now() {
6
+ return new Date().toISOString();
7
+ }
8
+ //# sourceMappingURL=ids.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ids.js","sourceRoot":"","sources":["../../../../server/src/util/ids.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,KAAK;IACnB,OAAO,UAAU,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,GAAG;IACjB,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAClC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function helmHome(): string;
2
+ export declare function dbPathFor(slug: string): string;
@@ -0,0 +1,9 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ export function helmHome() {
4
+ return process.env.HELM_HOME ?? join(homedir(), ".helm");
5
+ }
6
+ export function dbPathFor(slug) {
7
+ return join(helmHome(), `${slug}.db`);
8
+ }
9
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../../server/src/util/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,QAAQ;IACtB,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { HookPayload } from "./scanner.js";
2
+ interface ScanResponse {
3
+ ok: boolean;
4
+ summary?: {
5
+ inserted: number;
6
+ skipped: number;
7
+ filePath: string | null;
8
+ };
9
+ error?: string;
10
+ }
11
+ export declare function sendScan(cwd: string, payload: HookPayload): Promise<ScanResponse>;
12
+ export {};