@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,252 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { dirname, join } from "node:path";
3
+
4
+ // Resolve the project root from this file's location (src/logging/ -> project root)
5
+ const projectRoot = join(dirname(import.meta.dir), "..");
6
+
7
+ describe("color module", () => {
8
+ test("color.red is a function that wraps text", async () => {
9
+ const { color } = await import("./color.ts");
10
+ const result = color.red("hello");
11
+ expect(result).toContain("hello");
12
+ expect(typeof result).toBe("string");
13
+ });
14
+
15
+ test("color functions all exist", async () => {
16
+ const { color } = await import("./color.ts");
17
+ const expectedKeys = [
18
+ "bold",
19
+ "dim",
20
+ "red",
21
+ "green",
22
+ "yellow",
23
+ "blue",
24
+ "magenta",
25
+ "cyan",
26
+ "white",
27
+ "gray",
28
+ ];
29
+ for (const key of expectedKeys) {
30
+ expect(key in color).toBe(true);
31
+ expect(typeof (color as Record<string, unknown>)[key]).toBe("function");
32
+ }
33
+ });
34
+
35
+ test("brand palette functions wrap text", async () => {
36
+ const { brand, accent, muted } = await import("./color.ts");
37
+ const result = brand("Agentplate");
38
+ expect(result).toContain("Agentplate");
39
+ expect(typeof accent("test")).toBe("string");
40
+ expect(typeof muted("test")).toBe("string");
41
+ });
42
+
43
+ test("noColor is an identity function", async () => {
44
+ const { noColor } = await import("./color.ts");
45
+ expect(noColor("hello")).toBe("hello");
46
+ expect(noColor("")).toBe("");
47
+ });
48
+
49
+ test("stripAnsi removes escape codes", async () => {
50
+ const { stripAnsi } = await import("./color.ts");
51
+ expect(stripAnsi("\x1b[31mhello\x1b[39m")).toBe("hello");
52
+ expect(stripAnsi("plain")).toBe("plain");
53
+ expect(stripAnsi("\x1b[1m\x1b[31mbold red\x1b[39m\x1b[22m")).toBe("bold red");
54
+ });
55
+
56
+ test("visibleLength excludes ANSI codes", async () => {
57
+ const { visibleLength } = await import("./color.ts");
58
+ expect(visibleLength("\x1b[31mhello\x1b[39m")).toBe(5);
59
+ expect(visibleLength("hello")).toBe(5);
60
+ expect(visibleLength("")).toBe(0);
61
+ });
62
+
63
+ test("setQuiet/isQuiet controls quiet mode", async () => {
64
+ const { isQuiet, setQuiet } = await import("./color.ts");
65
+ expect(isQuiet()).toBe(false);
66
+ setQuiet(true);
67
+ expect(isQuiet()).toBe(true);
68
+ setQuiet(false);
69
+ expect(isQuiet()).toBe(false);
70
+ });
71
+
72
+ test("NO_COLOR env causes chalk.level to be 0", async () => {
73
+ const proc = Bun.spawn(
74
+ [
75
+ "bun",
76
+ "-e",
77
+ 'import chalk from "chalk"; console.log(JSON.stringify({ level: chalk.level }))',
78
+ ],
79
+ {
80
+ cwd: projectRoot,
81
+ stdout: "pipe",
82
+ stderr: "pipe",
83
+ env: { ...process.env, NO_COLOR: "1", FORCE_COLOR: undefined },
84
+ },
85
+ );
86
+ await proc.exited;
87
+ const output = await new Response(proc.stdout).text();
88
+ const result = JSON.parse(output.trim());
89
+ expect(result.level).toBe(0);
90
+ });
91
+
92
+ test("FORCE_COLOR overrides NO_COLOR", async () => {
93
+ const proc = Bun.spawn(
94
+ [
95
+ "bun",
96
+ "-e",
97
+ 'import chalk from "chalk"; console.log(JSON.stringify({ level: chalk.level }))',
98
+ ],
99
+ {
100
+ cwd: projectRoot,
101
+ stdout: "pipe",
102
+ stderr: "pipe",
103
+ env: { ...process.env, NO_COLOR: "1", FORCE_COLOR: "1" },
104
+ },
105
+ );
106
+ await proc.exited;
107
+ const output = await new Response(proc.stdout).text();
108
+ const result = JSON.parse(output.trim());
109
+ expect(result.level).toBeGreaterThan(0);
110
+ });
111
+
112
+ test("chalk re-export is available", async () => {
113
+ const { chalk } = await import("./color.ts");
114
+ expect(typeof chalk.red).toBe("function");
115
+ expect(chalk.red("test")).toContain("test");
116
+ });
117
+
118
+ test("ColorFn type: color functions accept strings and return strings", async () => {
119
+ const { color } = await import("./color.ts");
120
+ // Each color function should accept a string and return a string
121
+ const result = color.bold(color.red("nested"));
122
+ expect(result).toContain("nested");
123
+ expect(typeof result).toBe("string");
124
+ });
125
+
126
+ test("printSuccess outputs to stdout with checkmark and message", async () => {
127
+ const { printSuccess, setQuiet } = await import("./color.ts");
128
+ setQuiet(false);
129
+ const logged: string[] = [];
130
+ const originalWrite = process.stdout.write;
131
+ process.stdout.write = ((chunk: string | Uint8Array) => {
132
+ logged.push(String(chunk));
133
+ return true;
134
+ }) as typeof process.stdout.write;
135
+ try {
136
+ printSuccess("Created issue");
137
+ expect(logged.length).toBe(1);
138
+ expect(logged[0]).toContain("\u2713");
139
+ expect(logged[0]).toContain("Created issue");
140
+ } finally {
141
+ process.stdout.write = originalWrite;
142
+ }
143
+ });
144
+
145
+ test("printSuccess includes accent-colored ID when provided", async () => {
146
+ const { printSuccess, setQuiet } = await import("./color.ts");
147
+ setQuiet(false);
148
+ const logged: string[] = [];
149
+ const originalWrite = process.stdout.write;
150
+ process.stdout.write = ((chunk: string | Uint8Array) => {
151
+ logged.push(String(chunk));
152
+ return true;
153
+ }) as typeof process.stdout.write;
154
+ try {
155
+ printSuccess("Created issue", "sprout-a1b2");
156
+ expect(logged.length).toBe(1);
157
+ expect(logged[0]).toContain("Created issue");
158
+ expect(logged[0]).toContain("sprout-a1b2");
159
+ } finally {
160
+ process.stdout.write = originalWrite;
161
+ }
162
+ });
163
+
164
+ test("printWarning outputs to stdout with ! and message and dim hint", async () => {
165
+ const { printWarning, setQuiet } = await import("./color.ts");
166
+ setQuiet(false);
167
+ const logged: string[] = [];
168
+ const originalWrite = process.stdout.write;
169
+ process.stdout.write = ((chunk: string | Uint8Array) => {
170
+ logged.push(String(chunk));
171
+ return true;
172
+ }) as typeof process.stdout.write;
173
+ try {
174
+ printWarning("3 prompts stale", "run tl emit --all");
175
+ expect(logged.length).toBe(1);
176
+ expect(logged[0]).toContain("!");
177
+ expect(logged[0]).toContain("3 prompts stale");
178
+ expect(logged[0]).toContain("run tl emit --all");
179
+ } finally {
180
+ process.stdout.write = originalWrite;
181
+ }
182
+ });
183
+
184
+ test("printError outputs to stderr with cross, message, and dim hint", async () => {
185
+ const { printError } = await import("./color.ts");
186
+ const errored: string[] = [];
187
+ const originalWrite = process.stderr.write;
188
+ process.stderr.write = ((chunk: string | Uint8Array) => {
189
+ errored.push(String(chunk));
190
+ return true;
191
+ }) as typeof process.stderr.write;
192
+ try {
193
+ printError("Config not found", "run sr init");
194
+ expect(errored.length).toBe(1);
195
+ expect(errored[0]).toContain("\u2717");
196
+ expect(errored[0]).toContain("Config not found");
197
+ expect(errored[0]).toContain("run sr init");
198
+ } finally {
199
+ process.stderr.write = originalWrite;
200
+ }
201
+ });
202
+
203
+ test("printHint outputs dim indented text to stdout", async () => {
204
+ const { printHint, setQuiet } = await import("./color.ts");
205
+ setQuiet(false);
206
+ const logged: string[] = [];
207
+ const originalWrite = process.stdout.write;
208
+ process.stdout.write = ((chunk: string | Uint8Array) => {
209
+ logged.push(String(chunk));
210
+ return true;
211
+ }) as typeof process.stdout.write;
212
+ try {
213
+ printHint("Run without --dry-run");
214
+ expect(logged.length).toBe(1);
215
+ expect(logged[0]).toContain("Run without --dry-run");
216
+ } finally {
217
+ process.stdout.write = originalWrite;
218
+ }
219
+ });
220
+
221
+ test("quiet mode suppresses printSuccess, printWarning, printHint but not printError", async () => {
222
+ const { printSuccess, printWarning, printHint, printError, setQuiet } = await import(
223
+ "./color.ts"
224
+ );
225
+ setQuiet(true);
226
+ const logged: string[] = [];
227
+ const errored: string[] = [];
228
+ const originalStdoutWrite = process.stdout.write;
229
+ const originalStderrWrite = process.stderr.write;
230
+ process.stdout.write = ((chunk: string | Uint8Array) => {
231
+ logged.push(String(chunk));
232
+ return true;
233
+ }) as typeof process.stdout.write;
234
+ process.stderr.write = ((chunk: string | Uint8Array) => {
235
+ errored.push(String(chunk));
236
+ return true;
237
+ }) as typeof process.stderr.write;
238
+ try {
239
+ printSuccess("suppressed success");
240
+ printWarning("suppressed warning");
241
+ printHint("suppressed hint");
242
+ printError("visible error");
243
+ expect(logged.length).toBe(0);
244
+ expect(errored.length).toBe(1);
245
+ expect(errored[0]).toContain("visible error");
246
+ } finally {
247
+ process.stdout.write = originalStdoutWrite;
248
+ process.stderr.write = originalStderrWrite;
249
+ setQuiet(false);
250
+ }
251
+ });
252
+ });
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Central color and output control using Chalk.
3
+ *
4
+ * Chalk natively handles NO_COLOR, FORCE_COLOR, and TERM=dumb.
5
+ * See https://github.com/chalk/chalk#supportscolor for detection logic.
6
+ */
7
+
8
+ import chalk from "chalk";
9
+
10
+ // --- Brand palette (ag-eco brand colors) ---
11
+
12
+ /** Forest green — Agentplate primary brand color. */
13
+ export const brand = chalk.rgb(46, 125, 50);
14
+
15
+ /** Amber — highlights, warnings. */
16
+ export const accent = chalk.rgb(255, 183, 77);
17
+
18
+ /** Stone gray — secondary text, muted content. */
19
+ export const muted = chalk.rgb(120, 120, 110);
20
+
21
+ // --- Standard color functions ---
22
+
23
+ /**
24
+ * Color functions that wrap text with ANSI codes.
25
+ * Each value is a function: color.red("text") returns "\x1b[31mtext\x1b[39m".
26
+ * Chalk auto-resets when wrapping, so color.reset is not needed.
27
+ */
28
+ export const color = {
29
+ bold: chalk.bold,
30
+ dim: chalk.dim,
31
+ red: chalk.red,
32
+ green: chalk.green,
33
+ yellow: chalk.yellow,
34
+ blue: chalk.blue,
35
+ magenta: chalk.magenta,
36
+ cyan: chalk.cyan,
37
+ white: chalk.white,
38
+ gray: chalk.gray,
39
+ } as const;
40
+
41
+ // Re-export chalk for direct use (chaining, custom RGB, etc.)
42
+ export { chalk };
43
+
44
+ /** Type for color function values (for consumers that store colors in variables). */
45
+ export type ColorFn = (text: string) => string;
46
+
47
+ /** Identity function for "no color" cases (replaces old color.white as default). */
48
+ export const noColor: ColorFn = (text: string) => text;
49
+
50
+ // --- ANSI strip utilities (for visible-width calculations in dashboard) ---
51
+
52
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: ESC (0x1B) is required to match ANSI escape sequences
53
+ const ANSI_REGEX = /\x1b\[[0-9;]*m/g;
54
+
55
+ /** Strip ANSI escape codes from a string. */
56
+ export function stripAnsi(str: string): string {
57
+ return str.replace(ANSI_REGEX, "");
58
+ }
59
+
60
+ /** Visible string length (excluding ANSI escape codes). */
61
+ export function visibleLength(str: string): number {
62
+ return stripAnsi(str).length;
63
+ }
64
+
65
+ // --- Quiet mode ---
66
+
67
+ let quietMode = false;
68
+
69
+ /** Enable quiet mode (suppress non-error output). */
70
+ export function setQuiet(enabled: boolean): void {
71
+ quietMode = enabled;
72
+ }
73
+
74
+ /** Check if quiet mode is active. */
75
+ export function isQuiet(): boolean {
76
+ return quietMode;
77
+ }
78
+
79
+ // --- Standardized message formatters (visual-spec.md Message Formats) ---
80
+
81
+ /** Success: brand checkmark + brand message. Optional accent-colored ID. */
82
+ export function printSuccess(msg: string, id?: string): void {
83
+ if (isQuiet()) return;
84
+ const idPart = id ? ` ${accent(id)}` : "";
85
+ process.stdout.write(`${brand.bold("\u2713")} ${brand(msg)}${idPart}\n`);
86
+ }
87
+
88
+ /** Warning: yellow ! + yellow message. Optional dim hint. */
89
+ export function printWarning(msg: string, hint?: string): void {
90
+ if (isQuiet()) return;
91
+ const hintPart = hint ? ` ${chalk.dim(`\u2014 ${hint}`)}` : "";
92
+ process.stdout.write(`${chalk.yellow.bold("!")} ${chalk.yellow(msg)}${hintPart}\n`);
93
+ }
94
+
95
+ /** Error: red cross + red message. Optional dim hint. Always to stderr. */
96
+ export function printError(msg: string, hint?: string): void {
97
+ const hintPart = hint ? ` ${chalk.dim(`\u2014 ${hint}`)}` : "";
98
+ process.stderr.write(`${chalk.red.bold("\u2717")} ${chalk.red(msg)}${hintPart}\n`);
99
+ }
100
+
101
+ /** Hint/info: dim indented text. */
102
+ export function printHint(msg: string): void {
103
+ if (isQuiet()) return;
104
+ process.stdout.write(`${chalk.dim(` ${msg}`)}\n`);
105
+ }
@@ -0,0 +1,110 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import type { StoredEvent } from "../types.ts";
3
+ import { stripAnsi } from "./color.ts";
4
+ import { formatEventLine, numericPriorityColor } from "./format.ts";
5
+
6
+ // Minimal StoredEvent fixture for testing formatEventLine
7
+ const BASE_EVENT: StoredEvent = {
8
+ id: 1,
9
+ runId: "run-001",
10
+ agentName: "agent1",
11
+ sessionId: null,
12
+ eventType: "tool_start",
13
+ level: "info",
14
+ toolName: "bash",
15
+ toolArgs: null,
16
+ toolDurationMs: null,
17
+ data: null,
18
+ createdAt: "2024-01-15T10:30:45.000Z",
19
+ };
20
+
21
+ describe("numericPriorityColor", () => {
22
+ test("returns a function for priority 1", () => {
23
+ const fn = numericPriorityColor(1);
24
+ expect(typeof fn).toBe("function");
25
+ // Function must accept a string and return a string
26
+ expect(typeof fn("x")).toBe("string");
27
+ });
28
+
29
+ test("returns a function for priority 2", () => {
30
+ const fn = numericPriorityColor(2);
31
+ expect(typeof fn).toBe("function");
32
+ expect(typeof fn("x")).toBe("string");
33
+ });
34
+
35
+ test("priority 3 is identity (returns input unchanged)", () => {
36
+ const fn = numericPriorityColor(3);
37
+ // Priority 3 = normal = (text) => text, always identity regardless of chalk level
38
+ expect(fn("x")).toBe("x");
39
+ expect(fn("hello world")).toBe("hello world");
40
+ });
41
+
42
+ test("returns a function for priority 4", () => {
43
+ const fn = numericPriorityColor(4);
44
+ expect(typeof fn).toBe("function");
45
+ expect(typeof fn("x")).toBe("string");
46
+ });
47
+
48
+ test("unknown priority returns identity function", () => {
49
+ const fn = numericPriorityColor(99);
50
+ expect(typeof fn).toBe("function");
51
+ expect(fn("x")).toBe("x");
52
+ });
53
+
54
+ test("all priority functions preserve input text (visible content after strip)", () => {
55
+ for (const p of [1, 2, 3, 4]) {
56
+ const fn = numericPriorityColor(p);
57
+ expect(stripAnsi(fn("hello"))).toBe("hello");
58
+ }
59
+ });
60
+ });
61
+
62
+ describe("formatEventLine", () => {
63
+ test("returns a non-empty string", () => {
64
+ const colorMap = new Map<string, (t: string) => string>();
65
+ const result = formatEventLine(BASE_EVENT, colorMap);
66
+ expect(result.length).toBeGreaterThan(0);
67
+ });
68
+
69
+ test("includes agent name in the result", () => {
70
+ const colorMap = new Map<string, (t: string) => string>();
71
+ const result = formatEventLine(BASE_EVENT, colorMap);
72
+ // Strip ANSI so we can do plain text comparison
73
+ expect(stripAnsi(result)).toContain("agent1");
74
+ });
75
+
76
+ test("includes time portion (10:30:45) in the result", () => {
77
+ const colorMap = new Map<string, (t: string) => string>();
78
+ const result = formatEventLine(BASE_EVENT, colorMap);
79
+ expect(stripAnsi(result)).toContain("10:30:45");
80
+ });
81
+
82
+ test("result does NOT end with a newline", () => {
83
+ const colorMap = new Map<string, (t: string) => string>();
84
+ const result = formatEventLine(BASE_EVENT, colorMap);
85
+ expect(result.endsWith("\n")).toBe(false);
86
+ });
87
+
88
+ test("error level result is a non-empty string", () => {
89
+ const colorMap = new Map<string, (t: string) => string>();
90
+ const errorEvent: StoredEvent = { ...BASE_EVENT, level: "error" };
91
+ const result = formatEventLine(errorEvent, colorMap);
92
+ expect(result.length).toBeGreaterThan(0);
93
+ expect(result.endsWith("\n")).toBe(false);
94
+ });
95
+
96
+ test("uses color from colorMap when agent is registered", () => {
97
+ const blueColor = (t: string) => `\x1b[34m${t}\x1b[39m`;
98
+ const colorMap = new Map<string, (t: string) => string>([["agent1", blueColor]]);
99
+ const result = formatEventLine(BASE_EVENT, colorMap);
100
+ // The colored agent name should appear in the output
101
+ expect(result).toContain("\x1b[34m");
102
+ });
103
+
104
+ test("falls back to gray when agent is not in colorMap", () => {
105
+ const colorMap = new Map<string, (t: string) => string>();
106
+ // Should not throw — gray fallback is used
107
+ const result = formatEventLine(BASE_EVENT, colorMap);
108
+ expect(result.length).toBeGreaterThan(0);
109
+ });
110
+ });