@ag-eco/agentplate-cli 0.13.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 (455) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +462 -0
  3. package/agents/ap-co-creation.md +90 -0
  4. package/agents/builder.md +144 -0
  5. package/agents/coordinator.md +377 -0
  6. package/agents/lead.md +435 -0
  7. package/agents/merger.md +164 -0
  8. package/agents/monitor.md +214 -0
  9. package/agents/orchestrator.md +239 -0
  10. package/agents/reviewer.md +140 -0
  11. package/agents/scout.md +125 -0
  12. package/agents/supervisor.md +427 -0
  13. package/package.json +66 -0
  14. package/src/agents/capabilities.test.ts +85 -0
  15. package/src/agents/capabilities.ts +125 -0
  16. package/src/agents/checkpoint.test.ts +88 -0
  17. package/src/agents/checkpoint.ts +101 -0
  18. package/src/agents/copilot-hooks-deployer.test.ts +162 -0
  19. package/src/agents/copilot-hooks-deployer.ts +93 -0
  20. package/src/agents/guard-rules.test.ts +372 -0
  21. package/src/agents/guard-rules.ts +97 -0
  22. package/src/agents/headless-mail-injector.test.ts +709 -0
  23. package/src/agents/headless-mail-injector.ts +377 -0
  24. package/src/agents/headless-prompt.test.ts +102 -0
  25. package/src/agents/headless-prompt.ts +68 -0
  26. package/src/agents/hooks-deployer.test.ts +3119 -0
  27. package/src/agents/hooks-deployer.ts +804 -0
  28. package/src/agents/identity.test.ts +604 -0
  29. package/src/agents/identity.ts +384 -0
  30. package/src/agents/lifecycle.test.ts +196 -0
  31. package/src/agents/lifecycle.ts +183 -0
  32. package/src/agents/mail-poll-detect.test.ts +153 -0
  33. package/src/agents/mail-poll-detect.ts +73 -0
  34. package/src/agents/manifest.test.ts +1026 -0
  35. package/src/agents/manifest.ts +376 -0
  36. package/src/agents/overlay.test.ts +1058 -0
  37. package/src/agents/overlay.ts +490 -0
  38. package/src/agents/scope-detect.test.ts +190 -0
  39. package/src/agents/scope-detect.ts +146 -0
  40. package/src/agents/turn-lock.test.ts +181 -0
  41. package/src/agents/turn-lock.ts +235 -0
  42. package/src/agents/turn-runner-dispatch.test.ts +182 -0
  43. package/src/agents/turn-runner-dispatch.ts +105 -0
  44. package/src/agents/turn-runner.test.ts +2312 -0
  45. package/src/agents/turn-runner.ts +1383 -0
  46. package/src/beads/client.test.ts +217 -0
  47. package/src/beads/client.ts +230 -0
  48. package/src/beads/molecules.test.ts +338 -0
  49. package/src/beads/molecules.ts +198 -0
  50. package/src/commands/agents.test.ts +328 -0
  51. package/src/commands/agents.ts +299 -0
  52. package/src/commands/clean.test.ts +797 -0
  53. package/src/commands/clean.ts +791 -0
  54. package/src/commands/completions.test.ts +348 -0
  55. package/src/commands/completions.ts +981 -0
  56. package/src/commands/coordinator.test.ts +2975 -0
  57. package/src/commands/coordinator.ts +1841 -0
  58. package/src/commands/costs.test.ts +1183 -0
  59. package/src/commands/costs.ts +599 -0
  60. package/src/commands/dashboard.test.ts +954 -0
  61. package/src/commands/dashboard.ts +1212 -0
  62. package/src/commands/discover.test.ts +288 -0
  63. package/src/commands/discover.ts +202 -0
  64. package/src/commands/doctor.test.ts +303 -0
  65. package/src/commands/doctor.ts +311 -0
  66. package/src/commands/ecosystem.test.ts +226 -0
  67. package/src/commands/ecosystem.ts +248 -0
  68. package/src/commands/errors.test.ts +654 -0
  69. package/src/commands/errors.ts +197 -0
  70. package/src/commands/feed.test.ts +709 -0
  71. package/src/commands/feed.ts +260 -0
  72. package/src/commands/group.test.ts +475 -0
  73. package/src/commands/group.ts +546 -0
  74. package/src/commands/hooks.test.ts +458 -0
  75. package/src/commands/hooks.ts +263 -0
  76. package/src/commands/init.test.ts +1011 -0
  77. package/src/commands/init.ts +967 -0
  78. package/src/commands/inspect.test.ts +1239 -0
  79. package/src/commands/inspect.ts +648 -0
  80. package/src/commands/log.test.ts +1913 -0
  81. package/src/commands/log.ts +958 -0
  82. package/src/commands/logs.test.ts +801 -0
  83. package/src/commands/logs.ts +483 -0
  84. package/src/commands/mail.test.ts +1501 -0
  85. package/src/commands/mail.ts +848 -0
  86. package/src/commands/merge.test.ts +864 -0
  87. package/src/commands/merge.ts +381 -0
  88. package/src/commands/metrics.test.ts +458 -0
  89. package/src/commands/metrics.ts +129 -0
  90. package/src/commands/monitor.test.ts +191 -0
  91. package/src/commands/monitor.ts +409 -0
  92. package/src/commands/nudge.test.ts +579 -0
  93. package/src/commands/nudge.ts +646 -0
  94. package/src/commands/orchestrator.ts +42 -0
  95. package/src/commands/prime.test.ts +612 -0
  96. package/src/commands/prime.ts +359 -0
  97. package/src/commands/replay.test.ts +757 -0
  98. package/src/commands/replay.ts +231 -0
  99. package/src/commands/run.test.ts +469 -0
  100. package/src/commands/run.ts +353 -0
  101. package/src/commands/serve/agent-actions.test.ts +210 -0
  102. package/src/commands/serve/agent-actions.ts +192 -0
  103. package/src/commands/serve/build.test.ts +202 -0
  104. package/src/commands/serve/build.ts +206 -0
  105. package/src/commands/serve/coordinator-actions.test.ts +339 -0
  106. package/src/commands/serve/coordinator-actions.ts +410 -0
  107. package/src/commands/serve/dev.test.ts +168 -0
  108. package/src/commands/serve/dev.ts +117 -0
  109. package/src/commands/serve/mail-actions.test.ts +312 -0
  110. package/src/commands/serve/mail-actions.ts +167 -0
  111. package/src/commands/serve/rest.test.ts +1680 -0
  112. package/src/commands/serve/rest.ts +1130 -0
  113. package/src/commands/serve/static.ts +51 -0
  114. package/src/commands/serve/ws.test.ts +361 -0
  115. package/src/commands/serve/ws.ts +332 -0
  116. package/src/commands/serve.test.ts +459 -0
  117. package/src/commands/serve.ts +654 -0
  118. package/src/commands/sling.test.ts +1583 -0
  119. package/src/commands/sling.ts +1351 -0
  120. package/src/commands/spec.test.ts +179 -0
  121. package/src/commands/spec.ts +105 -0
  122. package/src/commands/status.test.ts +614 -0
  123. package/src/commands/status.ts +403 -0
  124. package/src/commands/stop.test.ts +964 -0
  125. package/src/commands/stop.ts +319 -0
  126. package/src/commands/supervisor.test.ts +185 -0
  127. package/src/commands/supervisor.ts +537 -0
  128. package/src/commands/trace.test.ts +762 -0
  129. package/src/commands/trace.ts +205 -0
  130. package/src/commands/update.test.ts +466 -0
  131. package/src/commands/update.ts +263 -0
  132. package/src/commands/upgrade.test.ts +48 -0
  133. package/src/commands/upgrade.ts +240 -0
  134. package/src/commands/watch.test.ts +257 -0
  135. package/src/commands/watch.ts +308 -0
  136. package/src/commands/worktree.test.ts +1297 -0
  137. package/src/commands/worktree.ts +451 -0
  138. package/src/config.test.ts +1535 -0
  139. package/src/config.ts +1064 -0
  140. package/src/doctor/agents.test.ts +523 -0
  141. package/src/doctor/agents.ts +399 -0
  142. package/src/doctor/config-check.test.ts +191 -0
  143. package/src/doctor/config-check.ts +183 -0
  144. package/src/doctor/consistency.test.ts +807 -0
  145. package/src/doctor/consistency.ts +347 -0
  146. package/src/doctor/databases.test.ts +350 -0
  147. package/src/doctor/databases.ts +243 -0
  148. package/src/doctor/dependencies.test.ts +296 -0
  149. package/src/doctor/dependencies.ts +272 -0
  150. package/src/doctor/ecosystem.test.ts +308 -0
  151. package/src/doctor/ecosystem.ts +156 -0
  152. package/src/doctor/logs.test.ts +253 -0
  153. package/src/doctor/logs.ts +295 -0
  154. package/src/doctor/merge-queue.test.ts +315 -0
  155. package/src/doctor/merge-queue.ts +167 -0
  156. package/src/doctor/providers.test.ts +409 -0
  157. package/src/doctor/providers.ts +250 -0
  158. package/src/doctor/serve.test.ts +95 -0
  159. package/src/doctor/serve.ts +86 -0
  160. package/src/doctor/structure.test.ts +423 -0
  161. package/src/doctor/structure.ts +285 -0
  162. package/src/doctor/types.ts +43 -0
  163. package/src/doctor/version.test.ts +241 -0
  164. package/src/doctor/version.ts +132 -0
  165. package/src/doctor/watchdog.test.ts +167 -0
  166. package/src/doctor/watchdog.ts +214 -0
  167. package/src/e2e/init-sling-lifecycle.test.ts +283 -0
  168. package/src/errors.test.ts +350 -0
  169. package/src/errors.ts +217 -0
  170. package/src/events/store.test.ts +660 -0
  171. package/src/events/store.ts +369 -0
  172. package/src/events/tailer.test.ts +719 -0
  173. package/src/events/tailer.ts +332 -0
  174. package/src/events/tool-filter.test.ts +330 -0
  175. package/src/events/tool-filter.ts +126 -0
  176. package/src/index.ts +533 -0
  177. package/src/insights/analyzer.test.ts +466 -0
  178. package/src/insights/analyzer.ts +203 -0
  179. package/src/insights/quality-gates.test.ts +141 -0
  180. package/src/insights/quality-gates.ts +156 -0
  181. package/src/json.test.ts +72 -0
  182. package/src/json.ts +53 -0
  183. package/src/loam/client.test.ts +752 -0
  184. package/src/loam/client.ts +664 -0
  185. package/src/logging/color.test.ts +252 -0
  186. package/src/logging/color.ts +105 -0
  187. package/src/logging/format.test.ts +110 -0
  188. package/src/logging/format.ts +255 -0
  189. package/src/logging/logger.test.ts +814 -0
  190. package/src/logging/logger.ts +266 -0
  191. package/src/logging/reporter.test.ts +259 -0
  192. package/src/logging/reporter.ts +110 -0
  193. package/src/logging/sanitizer.test.ts +190 -0
  194. package/src/logging/sanitizer.ts +57 -0
  195. package/src/logging/theme.ts +140 -0
  196. package/src/mail/broadcast.test.ts +204 -0
  197. package/src/mail/broadcast.ts +92 -0
  198. package/src/mail/client.test.ts +774 -0
  199. package/src/mail/client.ts +236 -0
  200. package/src/mail/store.test.ts +898 -0
  201. package/src/mail/store.ts +425 -0
  202. package/src/merge/lock.test.ts +149 -0
  203. package/src/merge/lock.ts +140 -0
  204. package/src/merge/predict.test.ts +387 -0
  205. package/src/merge/predict.ts +249 -0
  206. package/src/merge/queue.test.ts +426 -0
  207. package/src/merge/queue.ts +246 -0
  208. package/src/merge/resolver.test.ts +1993 -0
  209. package/src/merge/resolver.ts +926 -0
  210. package/src/metrics/pricing.test.ts +258 -0
  211. package/src/metrics/pricing.ts +135 -0
  212. package/src/metrics/store.test.ts +978 -0
  213. package/src/metrics/store.ts +501 -0
  214. package/src/metrics/summary.test.ts +398 -0
  215. package/src/metrics/summary.ts +178 -0
  216. package/src/metrics/transcript.test.ts +483 -0
  217. package/src/metrics/transcript.ts +114 -0
  218. package/src/runtimes/__fixtures__/claude-stream-fixture.ts +22 -0
  219. package/src/runtimes/aider.test.ts +124 -0
  220. package/src/runtimes/aider.ts +147 -0
  221. package/src/runtimes/amp.test.ts +164 -0
  222. package/src/runtimes/amp.ts +154 -0
  223. package/src/runtimes/claude.test.ts +1474 -0
  224. package/src/runtimes/claude.ts +579 -0
  225. package/src/runtimes/codex.test.ts +805 -0
  226. package/src/runtimes/codex.ts +273 -0
  227. package/src/runtimes/connections.test.ts +214 -0
  228. package/src/runtimes/connections.ts +103 -0
  229. package/src/runtimes/copilot.test.ts +707 -0
  230. package/src/runtimes/copilot.ts +316 -0
  231. package/src/runtimes/cursor.test.ts +497 -0
  232. package/src/runtimes/cursor.ts +205 -0
  233. package/src/runtimes/gemini.test.ts +537 -0
  234. package/src/runtimes/gemini.ts +243 -0
  235. package/src/runtimes/goose.test.ts +133 -0
  236. package/src/runtimes/goose.ts +157 -0
  237. package/src/runtimes/headless-connection.test.ts +264 -0
  238. package/src/runtimes/headless-connection.ts +158 -0
  239. package/src/runtimes/opencode.test.ts +325 -0
  240. package/src/runtimes/opencode.ts +188 -0
  241. package/src/runtimes/pi-guards.test.ts +486 -0
  242. package/src/runtimes/pi-guards.ts +367 -0
  243. package/src/runtimes/pi.test.ts +789 -0
  244. package/src/runtimes/pi.ts +305 -0
  245. package/src/runtimes/registry.test.ts +196 -0
  246. package/src/runtimes/registry.ts +99 -0
  247. package/src/runtimes/sapling.test.ts +1267 -0
  248. package/src/runtimes/sapling.ts +710 -0
  249. package/src/runtimes/types.ts +266 -0
  250. package/src/schema-consistency.test.ts +246 -0
  251. package/src/sessions/compat.test.ts +281 -0
  252. package/src/sessions/compat.ts +105 -0
  253. package/src/sessions/store.test.ts +1748 -0
  254. package/src/sessions/store.ts +858 -0
  255. package/src/test-helpers.test.ts +124 -0
  256. package/src/test-helpers.ts +145 -0
  257. package/src/test-setup.test.ts +31 -0
  258. package/src/test-setup.ts +28 -0
  259. package/src/tools/loam/api.ts +368 -0
  260. package/src/tools/loam/cli.ts +278 -0
  261. package/src/tools/loam/commands/add.ts +52 -0
  262. package/src/tools/loam/commands/archive.ts +214 -0
  263. package/src/tools/loam/commands/audit.ts +276 -0
  264. package/src/tools/loam/commands/compact.ts +1062 -0
  265. package/src/tools/loam/commands/completions.ts +79 -0
  266. package/src/tools/loam/commands/config.ts +381 -0
  267. package/src/tools/loam/commands/delete-domain.ts +121 -0
  268. package/src/tools/loam/commands/delete.ts +316 -0
  269. package/src/tools/loam/commands/diff.ts +200 -0
  270. package/src/tools/loam/commands/doctor.ts +1113 -0
  271. package/src/tools/loam/commands/edit.ts +226 -0
  272. package/src/tools/loam/commands/init.ts +31 -0
  273. package/src/tools/loam/commands/learn.ts +179 -0
  274. package/src/tools/loam/commands/move.ts +323 -0
  275. package/src/tools/loam/commands/onboard.ts +374 -0
  276. package/src/tools/loam/commands/outcome.ts +185 -0
  277. package/src/tools/loam/commands/prime.ts +688 -0
  278. package/src/tools/loam/commands/prune.ts +614 -0
  279. package/src/tools/loam/commands/query.ts +218 -0
  280. package/src/tools/loam/commands/rank.ts +180 -0
  281. package/src/tools/loam/commands/ready.ts +189 -0
  282. package/src/tools/loam/commands/record.ts +1210 -0
  283. package/src/tools/loam/commands/restore.ts +166 -0
  284. package/src/tools/loam/commands/search.ts +327 -0
  285. package/src/tools/loam/commands/setup.ts +887 -0
  286. package/src/tools/loam/commands/status.ts +103 -0
  287. package/src/tools/loam/commands/sync.ts +298 -0
  288. package/src/tools/loam/commands/update.ts +19 -0
  289. package/src/tools/loam/commands/upgrade.ts +93 -0
  290. package/src/tools/loam/commands/validate.ts +190 -0
  291. package/src/tools/loam/index.ts +62 -0
  292. package/src/tools/loam/log.ts +127 -0
  293. package/src/tools/loam/registry/builtins.ts +409 -0
  294. package/src/tools/loam/registry/custom.ts +431 -0
  295. package/src/tools/loam/registry/init.ts +55 -0
  296. package/src/tools/loam/registry/template.ts +40 -0
  297. package/src/tools/loam/registry/type-registry.ts +113 -0
  298. package/src/tools/loam/schemas/config-schema.ts +489 -0
  299. package/src/tools/loam/schemas/config.ts +245 -0
  300. package/src/tools/loam/schemas/index.ts +18 -0
  301. package/src/tools/loam/schemas/record-schema.ts +191 -0
  302. package/src/tools/loam/schemas/record.ts +115 -0
  303. package/src/tools/loam/utils/active-work.ts +205 -0
  304. package/src/tools/loam/utils/anchor-validity.ts +80 -0
  305. package/src/tools/loam/utils/archive.ts +146 -0
  306. package/src/tools/loam/utils/audit.ts +667 -0
  307. package/src/tools/loam/utils/bm25.ts +238 -0
  308. package/src/tools/loam/utils/budget.ts +142 -0
  309. package/src/tools/loam/utils/config.ts +344 -0
  310. package/src/tools/loam/utils/dir-anchors.ts +62 -0
  311. package/src/tools/loam/utils/domain-rules.ts +114 -0
  312. package/src/tools/loam/utils/expertise.ts +393 -0
  313. package/src/tools/loam/utils/format-helpers.ts +96 -0
  314. package/src/tools/loam/utils/format.ts +1234 -0
  315. package/src/tools/loam/utils/git-context.ts +50 -0
  316. package/src/tools/loam/utils/git.ts +183 -0
  317. package/src/tools/loam/utils/hooks.ts +299 -0
  318. package/src/tools/loam/utils/index.ts +52 -0
  319. package/src/tools/loam/utils/json-output.ts +13 -0
  320. package/src/tools/loam/utils/lock.ts +76 -0
  321. package/src/tools/loam/utils/markers.ts +48 -0
  322. package/src/tools/loam/utils/numeric-flags.ts +20 -0
  323. package/src/tools/loam/utils/palette.ts +44 -0
  324. package/src/tools/loam/utils/prime-ranking.ts +135 -0
  325. package/src/tools/loam/utils/recipe-discovery.ts +195 -0
  326. package/src/tools/loam/utils/runtime-flags.ts +28 -0
  327. package/src/tools/loam/utils/scoring.ts +94 -0
  328. package/src/tools/loam/utils/version.ts +116 -0
  329. package/src/tools/sprout/commands/block.ts +64 -0
  330. package/src/tools/sprout/commands/blocked.ts +86 -0
  331. package/src/tools/sprout/commands/close.ts +129 -0
  332. package/src/tools/sprout/commands/completions.ts +198 -0
  333. package/src/tools/sprout/commands/config.ts +238 -0
  334. package/src/tools/sprout/commands/create.ts +164 -0
  335. package/src/tools/sprout/commands/dep.ts +148 -0
  336. package/src/tools/sprout/commands/doctor.ts +979 -0
  337. package/src/tools/sprout/commands/init.ts +83 -0
  338. package/src/tools/sprout/commands/label.ts +178 -0
  339. package/src/tools/sprout/commands/list.ts +210 -0
  340. package/src/tools/sprout/commands/migrate.ts +133 -0
  341. package/src/tools/sprout/commands/onboard.ts +207 -0
  342. package/src/tools/sprout/commands/plan-show.ts +278 -0
  343. package/src/tools/sprout/commands/plan.ts +2526 -0
  344. package/src/tools/sprout/commands/prime.ts +399 -0
  345. package/src/tools/sprout/commands/ready.ts +245 -0
  346. package/src/tools/sprout/commands/search.ts +221 -0
  347. package/src/tools/sprout/commands/show.ts +277 -0
  348. package/src/tools/sprout/commands/stats.ts +146 -0
  349. package/src/tools/sprout/commands/sync.ts +134 -0
  350. package/src/tools/sprout/commands/tpl.ts +364 -0
  351. package/src/tools/sprout/commands/unblock.ts +115 -0
  352. package/src/tools/sprout/commands/update.ts +257 -0
  353. package/src/tools/sprout/commands/upgrade.ts +91 -0
  354. package/src/tools/sprout/config-schema.ts +152 -0
  355. package/src/tools/sprout/config.ts +355 -0
  356. package/src/tools/sprout/filter.ts +107 -0
  357. package/src/tools/sprout/format.ts +43 -0
  358. package/src/tools/sprout/id.ts +22 -0
  359. package/src/tools/sprout/index.ts +204 -0
  360. package/src/tools/sprout/log.ts +76 -0
  361. package/src/tools/sprout/markers.ts +22 -0
  362. package/src/tools/sprout/output.ts +121 -0
  363. package/src/tools/sprout/plan-backref.ts +93 -0
  364. package/src/tools/sprout/plan-context.ts +81 -0
  365. package/src/tools/sprout/plan-domain.ts +139 -0
  366. package/src/tools/sprout/plan-lifecycle.ts +65 -0
  367. package/src/tools/sprout/plan-loam.ts +207 -0
  368. package/src/tools/sprout/plan-schema.ts +209 -0
  369. package/src/tools/sprout/sort.ts +31 -0
  370. package/src/tools/sprout/store.ts +172 -0
  371. package/src/tools/sprout/types.ts +118 -0
  372. package/src/tools/sprout/validation.ts +119 -0
  373. package/src/tools/sprout/version.ts +1 -0
  374. package/src/tools/sprout/yaml.ts +387 -0
  375. package/src/tools/trellis/commands/archive.ts +87 -0
  376. package/src/tools/trellis/commands/completions.ts +610 -0
  377. package/src/tools/trellis/commands/config.ts +382 -0
  378. package/src/tools/trellis/commands/create.ts +252 -0
  379. package/src/tools/trellis/commands/diff.ts +150 -0
  380. package/src/tools/trellis/commands/doctor.ts +771 -0
  381. package/src/tools/trellis/commands/emit.ts +365 -0
  382. package/src/tools/trellis/commands/history.ts +83 -0
  383. package/src/tools/trellis/commands/import.ts +198 -0
  384. package/src/tools/trellis/commands/init.ts +81 -0
  385. package/src/tools/trellis/commands/list.ts +103 -0
  386. package/src/tools/trellis/commands/onboard.ts +156 -0
  387. package/src/tools/trellis/commands/pin.ts +172 -0
  388. package/src/tools/trellis/commands/prime.ts +193 -0
  389. package/src/tools/trellis/commands/render.ts +122 -0
  390. package/src/tools/trellis/commands/schema.ts +353 -0
  391. package/src/tools/trellis/commands/show.ts +115 -0
  392. package/src/tools/trellis/commands/stats.ts +65 -0
  393. package/src/tools/trellis/commands/sync.ts +112 -0
  394. package/src/tools/trellis/commands/tree.ts +123 -0
  395. package/src/tools/trellis/commands/update.ts +330 -0
  396. package/src/tools/trellis/commands/upgrade.ts +95 -0
  397. package/src/tools/trellis/commands/validate.ts +166 -0
  398. package/src/tools/trellis/config-schema.ts +81 -0
  399. package/src/tools/trellis/config.ts +108 -0
  400. package/src/tools/trellis/frontmatter.ts +348 -0
  401. package/src/tools/trellis/id.ts +24 -0
  402. package/src/tools/trellis/index.ts +209 -0
  403. package/src/tools/trellis/markers.ts +28 -0
  404. package/src/tools/trellis/output.ts +84 -0
  405. package/src/tools/trellis/render.ts +212 -0
  406. package/src/tools/trellis/store.ts +144 -0
  407. package/src/tools/trellis/types.ts +82 -0
  408. package/src/tools/trellis/validate.ts +199 -0
  409. package/src/tools/trellis/yaml.ts +309 -0
  410. package/src/tracker/beads.test.ts +454 -0
  411. package/src/tracker/beads.ts +56 -0
  412. package/src/tracker/factory.test.ts +90 -0
  413. package/src/tracker/factory.ts +65 -0
  414. package/src/tracker/sprout.test.ts +461 -0
  415. package/src/tracker/sprout.ts +182 -0
  416. package/src/tracker/types.ts +52 -0
  417. package/src/trellis/client.test.ts +107 -0
  418. package/src/trellis/client.ts +179 -0
  419. package/src/types.ts +970 -0
  420. package/src/utils/bin.test.ts +10 -0
  421. package/src/utils/bin.ts +37 -0
  422. package/src/utils/browser.test.ts +49 -0
  423. package/src/utils/browser.ts +48 -0
  424. package/src/utils/fs.test.ts +119 -0
  425. package/src/utils/fs.ts +62 -0
  426. package/src/utils/pid.test.ts +152 -0
  427. package/src/utils/pid.ts +130 -0
  428. package/src/utils/process-scan.test.ts +53 -0
  429. package/src/utils/process-scan.ts +76 -0
  430. package/src/utils/time.test.ts +43 -0
  431. package/src/utils/time.ts +37 -0
  432. package/src/utils/version.test.ts +33 -0
  433. package/src/utils/version.ts +70 -0
  434. package/src/version.ts +5 -0
  435. package/src/watchdog/daemon.test.ts +3721 -0
  436. package/src/watchdog/daemon.ts +1257 -0
  437. package/src/watchdog/health.test.ts +830 -0
  438. package/src/watchdog/health.ts +434 -0
  439. package/src/watchdog/triage.test.ts +205 -0
  440. package/src/watchdog/triage.ts +205 -0
  441. package/src/worktree/manager.test.ts +720 -0
  442. package/src/worktree/manager.ts +405 -0
  443. package/src/worktree/process.test.ts +172 -0
  444. package/src/worktree/process.ts +131 -0
  445. package/src/worktree/tmux.test.ts +1616 -0
  446. package/src/worktree/tmux.ts +721 -0
  447. package/templates/CLAUDE.md.tmpl +100 -0
  448. package/templates/copilot-hooks.json.tmpl +13 -0
  449. package/templates/hooks.json.tmpl +109 -0
  450. package/templates/overlay.md.tmpl +88 -0
  451. package/ui/dist/apple-touch-icon-bdy6teep.png +0 -0
  452. package/ui/dist/chunk-8s31f05k.css +1 -0
  453. package/ui/dist/chunk-vm5rz679.js +300 -0
  454. package/ui/dist/favicon-nzb39vza.svg +4 -0
  455. package/ui/dist/index.html +17 -0
@@ -0,0 +1,369 @@
1
+ /**
2
+ * SQLite-backed event store for agent activity observability.
3
+ *
4
+ * Tracks tool invocations, session lifecycle, mail events, and errors.
5
+ * Uses bun:sqlite for zero-dependency, synchronous database access.
6
+ * WAL mode enables concurrent reads from multiple agent processes.
7
+ */
8
+
9
+ import { Database } from "bun:sqlite";
10
+ import type {
11
+ EventLevel,
12
+ EventQueryOptions,
13
+ EventStore,
14
+ InsertEvent,
15
+ StoredEvent,
16
+ ToolStats,
17
+ } from "../types.ts";
18
+
19
+ /** Row shape as stored in SQLite (snake_case columns). */
20
+ interface EventRow {
21
+ id: number;
22
+ run_id: string | null;
23
+ agent_name: string;
24
+ session_id: string | null;
25
+ event_type: string;
26
+ tool_name: string | null;
27
+ tool_args: string | null;
28
+ tool_duration_ms: number | null;
29
+ level: string;
30
+ data: string | null;
31
+ created_at: string;
32
+ }
33
+
34
+ const CREATE_TABLE = `
35
+ CREATE TABLE IF NOT EXISTS events (
36
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
37
+ run_id TEXT,
38
+ agent_name TEXT NOT NULL,
39
+ session_id TEXT,
40
+ event_type TEXT NOT NULL,
41
+ tool_name TEXT,
42
+ tool_args TEXT,
43
+ tool_duration_ms INTEGER,
44
+ level TEXT NOT NULL DEFAULT 'info' CHECK(level IN ('debug','info','warn','error')),
45
+ data TEXT,
46
+ created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%f','now'))
47
+ )`;
48
+
49
+ const CREATE_INDEXES = `
50
+ CREATE INDEX IF NOT EXISTS idx_events_agent_time ON events(agent_name, created_at);
51
+ CREATE INDEX IF NOT EXISTS idx_events_run_time ON events(run_id, created_at);
52
+ CREATE INDEX IF NOT EXISTS idx_events_type_time ON events(event_type, created_at);
53
+ CREATE INDEX IF NOT EXISTS idx_events_tool_agent ON events(tool_name, agent_name);
54
+ CREATE INDEX IF NOT EXISTS idx_events_level_error ON events(level) WHERE level = 'error'`;
55
+
56
+ /** Convert a database row (snake_case) to a StoredEvent object (camelCase). */
57
+ function rowToEvent(row: EventRow): StoredEvent {
58
+ return {
59
+ id: row.id,
60
+ runId: row.run_id,
61
+ agentName: row.agent_name,
62
+ sessionId: row.session_id,
63
+ eventType: row.event_type as StoredEvent["eventType"],
64
+ toolName: row.tool_name,
65
+ toolArgs: row.tool_args,
66
+ toolDurationMs: row.tool_duration_ms,
67
+ level: row.level as EventLevel,
68
+ data: row.data,
69
+ createdAt: row.created_at,
70
+ };
71
+ }
72
+
73
+ /** Build WHERE clause fragments and params from EventQueryOptions. */
74
+ function buildFilterClauses(
75
+ opts: EventQueryOptions | undefined,
76
+ existingConditions: string[] = [],
77
+ existingParams: Record<string, string | number> = {},
78
+ ): { whereClause: string; params: Record<string, string | number>; limitClause: string } {
79
+ const conditions = [...existingConditions];
80
+ const params = { ...existingParams };
81
+
82
+ if (opts?.since !== undefined) {
83
+ conditions.push("created_at >= $since");
84
+ params.$since = opts.since;
85
+ }
86
+ if (opts?.until !== undefined) {
87
+ conditions.push("created_at <= $until");
88
+ params.$until = opts.until;
89
+ }
90
+ if (opts?.level !== undefined) {
91
+ conditions.push("level = $level");
92
+ params.$level = opts.level;
93
+ }
94
+
95
+ const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
96
+ const limitClause = opts?.limit !== undefined ? `LIMIT ${opts.limit}` : "";
97
+
98
+ return { whereClause, params, limitClause };
99
+ }
100
+
101
+ /**
102
+ * Create a new EventStore backed by a SQLite database at the given path.
103
+ *
104
+ * Initializes the database with WAL mode and a 5-second busy timeout.
105
+ * Creates the events table and indexes if they do not already exist.
106
+ */
107
+ export function createEventStore(dbPath: string): EventStore {
108
+ const db = new Database(dbPath);
109
+
110
+ // Configure for concurrent access from multiple agent processes.
111
+ db.exec("PRAGMA journal_mode = WAL");
112
+ db.exec("PRAGMA synchronous = NORMAL");
113
+ db.exec("PRAGMA busy_timeout = 5000");
114
+
115
+ // Create schema
116
+ db.exec(CREATE_TABLE);
117
+ db.exec(CREATE_INDEXES);
118
+
119
+ // Prepare the insert statement
120
+ const insertStmt = db.prepare<
121
+ { id: number },
122
+ {
123
+ $run_id: string | null;
124
+ $agent_name: string;
125
+ $session_id: string | null;
126
+ $event_type: string;
127
+ $tool_name: string | null;
128
+ $tool_args: string | null;
129
+ $tool_duration_ms: number | null;
130
+ $level: string;
131
+ $data: string | null;
132
+ }
133
+ >(`
134
+ INSERT INTO events
135
+ (run_id, agent_name, session_id, event_type, tool_name, tool_args, tool_duration_ms, level, data)
136
+ VALUES
137
+ ($run_id, $agent_name, $session_id, $event_type, $tool_name, $tool_args, $tool_duration_ms, $level, $data)
138
+ RETURNING id
139
+ `);
140
+
141
+ // Prepare correlateToolEnd: find the most recent tool_start for this agent+tool
142
+ // that has no corresponding tool_end yet (no tool_duration_ms set).
143
+ const correlateStmt = db.prepare<
144
+ { id: number; created_at: string },
145
+ { $agent_name: string; $tool_name: string }
146
+ >(`
147
+ SELECT id, created_at FROM events
148
+ WHERE agent_name = $agent_name
149
+ AND tool_name = $tool_name
150
+ AND event_type = 'tool_start'
151
+ AND tool_duration_ms IS NULL
152
+ ORDER BY created_at DESC
153
+ LIMIT 1
154
+ `);
155
+
156
+ const updateDurationStmt = db.prepare<void, { $id: number; $duration_ms: number }>(`
157
+ UPDATE events SET tool_duration_ms = $duration_ms WHERE id = $id
158
+ `);
159
+
160
+ // Prepare getByAgent
161
+ const byAgentStmt = db.prepare<EventRow, { $agent_name: string }>(`
162
+ SELECT * FROM events WHERE agent_name = $agent_name ORDER BY created_at ASC
163
+ `);
164
+
165
+ // Prepare getByRun
166
+ const byRunStmt = db.prepare<EventRow, { $run_id: string }>(`
167
+ SELECT * FROM events WHERE run_id = $run_id ORDER BY created_at ASC
168
+ `);
169
+
170
+ return {
171
+ insert(event: InsertEvent): number {
172
+ const row = insertStmt.get({
173
+ $run_id: event.runId,
174
+ $agent_name: event.agentName,
175
+ $session_id: event.sessionId,
176
+ $event_type: event.eventType,
177
+ $tool_name: event.toolName,
178
+ $tool_args: event.toolArgs,
179
+ $tool_duration_ms: event.toolDurationMs,
180
+ $level: event.level,
181
+ $data: event.data,
182
+ });
183
+ // RETURNING id always returns a row for INSERT; if somehow null, fallback to 0
184
+ if (!row) {
185
+ return 0;
186
+ }
187
+ return row.id;
188
+ },
189
+
190
+ correlateToolEnd(
191
+ agentName: string,
192
+ toolName: string,
193
+ ): { startId: number; durationMs: number } | null {
194
+ const startRow = correlateStmt.get({
195
+ $agent_name: agentName,
196
+ $tool_name: toolName,
197
+ });
198
+
199
+ if (!startRow) {
200
+ return null;
201
+ }
202
+
203
+ const startTime = new Date(startRow.created_at).getTime();
204
+ const durationMs = Date.now() - startTime;
205
+
206
+ // Mark the start event with the computed duration
207
+ updateDurationStmt.run({
208
+ $id: startRow.id,
209
+ $duration_ms: durationMs,
210
+ });
211
+
212
+ return { startId: startRow.id, durationMs };
213
+ },
214
+
215
+ getByAgent(agentName: string, opts?: EventQueryOptions): StoredEvent[] {
216
+ if (
217
+ opts !== undefined &&
218
+ (opts.since !== undefined ||
219
+ opts.until !== undefined ||
220
+ opts.level !== undefined ||
221
+ opts.limit !== undefined)
222
+ ) {
223
+ // Use dynamic query with filters
224
+ const { whereClause, params, limitClause } = buildFilterClauses(
225
+ opts,
226
+ ["agent_name = $agent_name"],
227
+ { $agent_name: agentName },
228
+ );
229
+ const query = `SELECT * FROM events ${whereClause} ORDER BY created_at ASC ${limitClause}`;
230
+ const rows = db.prepare<EventRow, Record<string, string | number>>(query).all(params);
231
+ return rows.map(rowToEvent);
232
+ }
233
+ const rows = byAgentStmt.all({ $agent_name: agentName });
234
+ return rows.map(rowToEvent);
235
+ },
236
+
237
+ getByRun(runId: string, opts?: EventQueryOptions): StoredEvent[] {
238
+ if (
239
+ opts !== undefined &&
240
+ (opts.since !== undefined ||
241
+ opts.until !== undefined ||
242
+ opts.level !== undefined ||
243
+ opts.limit !== undefined)
244
+ ) {
245
+ const { whereClause, params, limitClause } = buildFilterClauses(
246
+ opts,
247
+ ["run_id = $run_id"],
248
+ { $run_id: runId },
249
+ );
250
+ const query = `SELECT * FROM events ${whereClause} ORDER BY created_at ASC ${limitClause}`;
251
+ const rows = db.prepare<EventRow, Record<string, string | number>>(query).all(params);
252
+ return rows.map(rowToEvent);
253
+ }
254
+ const rows = byRunStmt.all({ $run_id: runId });
255
+ return rows.map(rowToEvent);
256
+ },
257
+
258
+ getErrors(opts?: EventQueryOptions): StoredEvent[] {
259
+ const { whereClause, params, limitClause } = buildFilterClauses(opts, ["level = 'error'"]);
260
+ const query = `SELECT * FROM events ${whereClause} ORDER BY created_at DESC ${limitClause}`;
261
+ const rows = db.prepare<EventRow, Record<string, string | number>>(query).all(params);
262
+ return rows.map(rowToEvent);
263
+ },
264
+
265
+ getTimeline(opts: EventQueryOptions & { since: string }): StoredEvent[] {
266
+ const { whereClause, params, limitClause } = buildFilterClauses(opts);
267
+ const query = `SELECT * FROM events ${whereClause} ORDER BY created_at ASC ${limitClause}`;
268
+ const rows = db.prepare<EventRow, Record<string, string | number>>(query).all(params);
269
+ return rows.map(rowToEvent);
270
+ },
271
+
272
+ getToolStats(opts?: { agentName?: string; since?: string }): ToolStats[] {
273
+ const conditions: string[] = ["tool_name IS NOT NULL", "event_type = 'tool_start'"];
274
+ const params: Record<string, string> = {};
275
+
276
+ if (opts?.agentName !== undefined) {
277
+ conditions.push("agent_name = $agent_name");
278
+ params.$agent_name = opts.agentName;
279
+ }
280
+ if (opts?.since !== undefined) {
281
+ conditions.push("created_at >= $since");
282
+ params.$since = opts.since;
283
+ }
284
+
285
+ const whereClause = `WHERE ${conditions.join(" AND ")}`;
286
+ const query = `
287
+ SELECT
288
+ tool_name,
289
+ COUNT(*) AS count,
290
+ COALESCE(AVG(tool_duration_ms), 0) AS avg_duration_ms,
291
+ COALESCE(MAX(tool_duration_ms), 0) AS max_duration_ms
292
+ FROM events
293
+ ${whereClause}
294
+ GROUP BY tool_name
295
+ ORDER BY count DESC
296
+ `;
297
+ const rows = db
298
+ .prepare<
299
+ {
300
+ tool_name: string;
301
+ count: number;
302
+ avg_duration_ms: number;
303
+ max_duration_ms: number;
304
+ },
305
+ Record<string, string>
306
+ >(query)
307
+ .all(params);
308
+
309
+ return rows.map((row) => ({
310
+ toolName: row.tool_name,
311
+ count: row.count,
312
+ avgDurationMs: row.avg_duration_ms,
313
+ maxDurationMs: row.max_duration_ms,
314
+ }));
315
+ },
316
+
317
+ purge(opts: { all?: boolean; olderThanMs?: number; agentName?: string }): number {
318
+ if (opts.all) {
319
+ const countRow = db
320
+ .prepare<{ cnt: number }, []>("SELECT COUNT(*) as cnt FROM events")
321
+ .get();
322
+ const count = countRow?.cnt ?? 0;
323
+ db.prepare("DELETE FROM events").run();
324
+ return count;
325
+ }
326
+
327
+ const conditions: string[] = [];
328
+ const params: Record<string, string> = {};
329
+
330
+ if (opts.olderThanMs !== undefined) {
331
+ const cutoff = new Date(Date.now() - opts.olderThanMs).toISOString();
332
+ conditions.push("created_at < $cutoff");
333
+ params.$cutoff = cutoff;
334
+ }
335
+
336
+ if (opts.agentName !== undefined) {
337
+ conditions.push("agent_name = $agent_name");
338
+ params.$agent_name = opts.agentName;
339
+ }
340
+
341
+ if (conditions.length === 0) {
342
+ return 0;
343
+ }
344
+
345
+ const whereClause = conditions.join(" AND ");
346
+ const countRow = db
347
+ .prepare<{ cnt: number }, Record<string, string>>(
348
+ `SELECT COUNT(*) as cnt FROM events WHERE ${whereClause}`,
349
+ )
350
+ .get(params);
351
+ const count = countRow?.cnt ?? 0;
352
+
353
+ db.prepare<void, Record<string, string>>(`DELETE FROM events WHERE ${whereClause}`).run(
354
+ params,
355
+ );
356
+
357
+ return count;
358
+ },
359
+
360
+ close(): void {
361
+ try {
362
+ db.exec("PRAGMA wal_checkpoint(PASSIVE)");
363
+ } catch {
364
+ // Best effort -- checkpoint failure is non-fatal
365
+ }
366
+ db.close();
367
+ },
368
+ };
369
+ }