@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,372 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import {
3
+ DANGEROUS_BASH_PATTERNS,
4
+ INTERACTIVE_TOOLS,
5
+ NATIVE_TEAM_TOOLS,
6
+ SAFE_BASH_PREFIXES,
7
+ WRITE_TOOLS,
8
+ } from "./guard-rules.ts";
9
+
10
+ // ─── NATIVE_TEAM_TOOLS ───────────────────────────────────────────────────────
11
+
12
+ describe("NATIVE_TEAM_TOOLS", () => {
13
+ test("is a non-empty array", () => {
14
+ expect(Array.isArray(NATIVE_TEAM_TOOLS)).toBe(true);
15
+ expect(NATIVE_TEAM_TOOLS.length).toBeGreaterThan(0);
16
+ });
17
+
18
+ test("contains all expected Claude Code team/task tools", () => {
19
+ const expected = [
20
+ "Task",
21
+ "TeamCreate",
22
+ "TeamDelete",
23
+ "SendMessage",
24
+ "TaskCreate",
25
+ "TaskUpdate",
26
+ "TaskList",
27
+ "TaskGet",
28
+ "TaskOutput",
29
+ "TaskStop",
30
+ ];
31
+ for (const tool of expected) {
32
+ expect(NATIVE_TEAM_TOOLS).toContain(tool);
33
+ }
34
+ });
35
+
36
+ test("has exactly 10 entries", () => {
37
+ expect(NATIVE_TEAM_TOOLS.length).toBe(10);
38
+ });
39
+
40
+ test("has no duplicate entries", () => {
41
+ const unique = new Set(NATIVE_TEAM_TOOLS);
42
+ expect(unique.size).toBe(NATIVE_TEAM_TOOLS.length);
43
+ });
44
+
45
+ test("all entries are non-empty strings", () => {
46
+ for (const tool of NATIVE_TEAM_TOOLS) {
47
+ expect(typeof tool).toBe("string");
48
+ expect(tool.length).toBeGreaterThan(0);
49
+ }
50
+ });
51
+ });
52
+
53
+ // ─── INTERACTIVE_TOOLS ───────────────────────────────────────────────────────
54
+
55
+ describe("INTERACTIVE_TOOLS", () => {
56
+ test("is a non-empty array", () => {
57
+ expect(Array.isArray(INTERACTIVE_TOOLS)).toBe(true);
58
+ expect(INTERACTIVE_TOOLS.length).toBeGreaterThan(0);
59
+ });
60
+
61
+ test("contains AskUserQuestion", () => {
62
+ expect(INTERACTIVE_TOOLS).toContain("AskUserQuestion");
63
+ });
64
+
65
+ test("contains EnterPlanMode", () => {
66
+ expect(INTERACTIVE_TOOLS).toContain("EnterPlanMode");
67
+ });
68
+
69
+ test("contains EnterWorktree", () => {
70
+ expect(INTERACTIVE_TOOLS).toContain("EnterWorktree");
71
+ });
72
+
73
+ test("has no duplicate entries", () => {
74
+ const unique = new Set(INTERACTIVE_TOOLS);
75
+ expect(unique.size).toBe(INTERACTIVE_TOOLS.length);
76
+ });
77
+
78
+ test("all entries are non-empty strings", () => {
79
+ for (const tool of INTERACTIVE_TOOLS) {
80
+ expect(typeof tool).toBe("string");
81
+ expect(tool.length).toBeGreaterThan(0);
82
+ }
83
+ });
84
+
85
+ test("does not contain any NATIVE_TEAM_TOOLS (no overlap)", () => {
86
+ const nativeSet = new Set(NATIVE_TEAM_TOOLS);
87
+ for (const tool of INTERACTIVE_TOOLS) {
88
+ expect(nativeSet.has(tool)).toBe(false);
89
+ }
90
+ });
91
+ });
92
+
93
+ // ─── WRITE_TOOLS ─────────────────────────────────────────────────────────────
94
+
95
+ describe("WRITE_TOOLS", () => {
96
+ test("is a non-empty array", () => {
97
+ expect(Array.isArray(WRITE_TOOLS)).toBe(true);
98
+ expect(WRITE_TOOLS.length).toBeGreaterThan(0);
99
+ });
100
+
101
+ test("contains Write", () => {
102
+ expect(WRITE_TOOLS).toContain("Write");
103
+ });
104
+
105
+ test("contains Edit", () => {
106
+ expect(WRITE_TOOLS).toContain("Edit");
107
+ });
108
+
109
+ test("contains NotebookEdit", () => {
110
+ expect(WRITE_TOOLS).toContain("NotebookEdit");
111
+ });
112
+
113
+ test("has no duplicate entries", () => {
114
+ const unique = new Set(WRITE_TOOLS);
115
+ expect(unique.size).toBe(WRITE_TOOLS.length);
116
+ });
117
+
118
+ test("all entries are non-empty strings", () => {
119
+ for (const tool of WRITE_TOOLS) {
120
+ expect(typeof tool).toBe("string");
121
+ expect(tool.length).toBeGreaterThan(0);
122
+ }
123
+ });
124
+
125
+ test("does not overlap with NATIVE_TEAM_TOOLS", () => {
126
+ const nativeSet = new Set(NATIVE_TEAM_TOOLS);
127
+ for (const tool of WRITE_TOOLS) {
128
+ expect(nativeSet.has(tool)).toBe(false);
129
+ }
130
+ });
131
+
132
+ test("does not overlap with INTERACTIVE_TOOLS", () => {
133
+ const interactiveSet = new Set(INTERACTIVE_TOOLS);
134
+ for (const tool of WRITE_TOOLS) {
135
+ expect(interactiveSet.has(tool)).toBe(false);
136
+ }
137
+ });
138
+ });
139
+
140
+ // ─── DANGEROUS_BASH_PATTERNS ─────────────────────────────────────────────────
141
+
142
+ describe("DANGEROUS_BASH_PATTERNS", () => {
143
+ test("is a non-empty array", () => {
144
+ expect(Array.isArray(DANGEROUS_BASH_PATTERNS)).toBe(true);
145
+ expect(DANGEROUS_BASH_PATTERNS.length).toBeGreaterThan(0);
146
+ });
147
+
148
+ test("all entries are non-empty strings", () => {
149
+ for (const pattern of DANGEROUS_BASH_PATTERNS) {
150
+ expect(typeof pattern).toBe("string");
151
+ expect(pattern.length).toBeGreaterThan(0);
152
+ }
153
+ });
154
+
155
+ test("all entries are valid regex patterns", () => {
156
+ for (const pattern of DANGEROUS_BASH_PATTERNS) {
157
+ expect(() => new RegExp(pattern)).not.toThrow();
158
+ }
159
+ });
160
+
161
+ test("has no duplicate entries", () => {
162
+ const unique = new Set(DANGEROUS_BASH_PATTERNS);
163
+ expect(unique.size).toBe(DANGEROUS_BASH_PATTERNS.length);
164
+ });
165
+
166
+ // Verify key dangerous operations are covered
167
+ test("contains sed -i pattern", () => {
168
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("sed") && p.includes("-i"));
169
+ expect(pattern).toBeDefined();
170
+ });
171
+
172
+ test("contains echo redirect pattern", () => {
173
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("echo") && p.includes(">"));
174
+ expect(pattern).toBeDefined();
175
+ });
176
+
177
+ test("contains printf redirect pattern", () => {
178
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("printf") && p.includes(">"));
179
+ expect(pattern).toBeDefined();
180
+ });
181
+
182
+ test("contains cat redirect pattern", () => {
183
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("cat") && p.includes(">"));
184
+ expect(pattern).toBeDefined();
185
+ });
186
+
187
+ test("contains tee pattern", () => {
188
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("tee"));
189
+ expect(pattern).toBeDefined();
190
+ });
191
+
192
+ test("contains rm pattern", () => {
193
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("rm"));
194
+ expect(pattern).toBeDefined();
195
+ });
196
+
197
+ test("contains mv pattern", () => {
198
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("mv"));
199
+ expect(pattern).toBeDefined();
200
+ });
201
+
202
+ test("contains cp pattern", () => {
203
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("cp"));
204
+ expect(pattern).toBeDefined();
205
+ });
206
+
207
+ test("contains mkdir pattern", () => {
208
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("mkdir"));
209
+ expect(pattern).toBeDefined();
210
+ });
211
+
212
+ test("contains git add pattern", () => {
213
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("git") && p.includes("add"));
214
+ expect(pattern).toBeDefined();
215
+ });
216
+
217
+ test("contains git commit pattern", () => {
218
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("git") && p.includes("commit"));
219
+ expect(pattern).toBeDefined();
220
+ });
221
+
222
+ test("contains git push pattern", () => {
223
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("git") && p.includes("push"));
224
+ expect(pattern).toBeDefined();
225
+ });
226
+
227
+ test("contains git reset pattern", () => {
228
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("git") && p.includes("reset"));
229
+ expect(pattern).toBeDefined();
230
+ });
231
+
232
+ test("contains npm install pattern", () => {
233
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("npm") && p.includes("install"));
234
+ expect(pattern).toBeDefined();
235
+ });
236
+
237
+ test("contains bun install pattern", () => {
238
+ const pattern = DANGEROUS_BASH_PATTERNS.find((p) => p.includes("bun") && p.includes("install"));
239
+ expect(pattern).toBeDefined();
240
+ });
241
+
242
+ // Runtime eval bypass patterns
243
+ test("contains bun -e / --eval pattern (runtime eval bypass)", () => {
244
+ const hasEval = DANGEROUS_BASH_PATTERNS.some(
245
+ (p) => p.includes("bun") && (p.includes("-e") || p.includes("eval")),
246
+ );
247
+ expect(hasEval).toBe(true);
248
+ });
249
+
250
+ test("contains node -e / --eval pattern (runtime eval bypass)", () => {
251
+ const hasEval = DANGEROUS_BASH_PATTERNS.some(
252
+ (p) => p.includes("node") && (p.includes("-e") || p.includes("eval")),
253
+ );
254
+ expect(hasEval).toBe(true);
255
+ });
256
+
257
+ test("contains python -c pattern (runtime eval bypass)", () => {
258
+ const hasEval = DANGEROUS_BASH_PATTERNS.some((p) => p.includes("python") && p.includes("-c"));
259
+ expect(hasEval).toBe(true);
260
+ });
261
+
262
+ // Functional: combined pattern matches dangerous commands
263
+ test("combined pattern matches 'sed -i' command", () => {
264
+ const combined = new RegExp(DANGEROUS_BASH_PATTERNS.join("|"));
265
+ expect(combined.test("sed -i 's/foo/bar/' file.txt")).toBe(true);
266
+ });
267
+
268
+ test("combined pattern matches 'echo foo > file' command", () => {
269
+ const combined = new RegExp(DANGEROUS_BASH_PATTERNS.join("|"));
270
+ expect(combined.test("echo foo > file.txt")).toBe(true);
271
+ });
272
+
273
+ test("combined pattern matches 'rm -rf' command", () => {
274
+ const combined = new RegExp(DANGEROUS_BASH_PATTERNS.join("|"));
275
+ expect(combined.test("rm -rf /tmp/foo")).toBe(true);
276
+ });
277
+
278
+ test("combined pattern matches 'git commit' command", () => {
279
+ const combined = new RegExp(DANGEROUS_BASH_PATTERNS.join("|"));
280
+ expect(combined.test("git commit -m 'message'")).toBe(true);
281
+ });
282
+
283
+ test("combined pattern matches 'git push' command", () => {
284
+ const combined = new RegExp(DANGEROUS_BASH_PATTERNS.join("|"));
285
+ expect(combined.test("git push origin main")).toBe(true);
286
+ });
287
+
288
+ test("combined pattern matches 'bun --eval' command", () => {
289
+ const combined = new RegExp(DANGEROUS_BASH_PATTERNS.join("|"));
290
+ expect(combined.test("bun --eval 'console.log(1)'")).toBe(true);
291
+ });
292
+
293
+ test("combined pattern matches 'node -e' command", () => {
294
+ const combined = new RegExp(DANGEROUS_BASH_PATTERNS.join("|"));
295
+ expect(combined.test("node -e 'process.exit(1)'")).toBe(true);
296
+ });
297
+
298
+ test("combined pattern does NOT match safe read commands", () => {
299
+ const combined = new RegExp(DANGEROUS_BASH_PATTERNS.join("|"));
300
+ expect(combined.test("cat README.md")).toBe(false);
301
+ expect(combined.test("grep -r 'foo' src/")).toBe(false);
302
+ expect(combined.test("ls -la")).toBe(false);
303
+ });
304
+ });
305
+
306
+ // ─── SAFE_BASH_PREFIXES ──────────────────────────────────────────────────────
307
+
308
+ describe("SAFE_BASH_PREFIXES", () => {
309
+ test("is a non-empty array", () => {
310
+ expect(Array.isArray(SAFE_BASH_PREFIXES)).toBe(true);
311
+ expect(SAFE_BASH_PREFIXES.length).toBeGreaterThan(0);
312
+ });
313
+
314
+ test("all entries are non-empty strings", () => {
315
+ for (const prefix of SAFE_BASH_PREFIXES) {
316
+ expect(typeof prefix).toBe("string");
317
+ expect(prefix.length).toBeGreaterThan(0);
318
+ }
319
+ });
320
+
321
+ test("has no duplicate entries", () => {
322
+ const unique = new Set(SAFE_BASH_PREFIXES);
323
+ expect(unique.size).toBe(SAFE_BASH_PREFIXES.length);
324
+ });
325
+
326
+ test("includes agentplate CLI shorthand 'ap '", () => {
327
+ expect(SAFE_BASH_PREFIXES).toContain("ap ");
328
+ });
329
+
330
+ test("includes agentplate CLI full name 'agentplate '", () => {
331
+ expect(SAFE_BASH_PREFIXES).toContain("agentplate ");
332
+ });
333
+
334
+ test("includes beads CLI 'bd '", () => {
335
+ expect(SAFE_BASH_PREFIXES).toContain("bd ");
336
+ });
337
+
338
+ test("includes sprout CLI 'sr '", () => {
339
+ expect(SAFE_BASH_PREFIXES).toContain("sr ");
340
+ });
341
+
342
+ test("includes loam CLI 'loam '", () => {
343
+ expect(SAFE_BASH_PREFIXES).toContain("loam ");
344
+ });
345
+
346
+ test("includes read-only git commands", () => {
347
+ expect(SAFE_BASH_PREFIXES).toContain("git status");
348
+ expect(SAFE_BASH_PREFIXES).toContain("git log");
349
+ expect(SAFE_BASH_PREFIXES).toContain("git diff");
350
+ });
351
+
352
+ test("does not include destructive git commands as safe prefixes", () => {
353
+ // git push, git reset, git commit should NOT be safe (builders can commit
354
+ // but non-implementation agents should not)
355
+ expect(SAFE_BASH_PREFIXES).not.toContain("git push");
356
+ expect(SAFE_BASH_PREFIXES).not.toContain("git reset");
357
+ });
358
+
359
+ test("safe prefixes match expected commands via startsWith", () => {
360
+ const isSafe = (cmd: string) =>
361
+ SAFE_BASH_PREFIXES.some((prefix) => cmd.trimStart().startsWith(prefix));
362
+
363
+ expect(isSafe("ap mail send --to parent --subject test")).toBe(true);
364
+ expect(isSafe("agentplate status")).toBe(true);
365
+ expect(isSafe("sr close agentplate-1234")).toBe(true);
366
+ expect(isSafe("bd ready")).toBe(true);
367
+ expect(isSafe("loam record cli --type convention")).toBe(true);
368
+ expect(isSafe("git status")).toBe(true);
369
+ expect(isSafe("git log --oneline")).toBe(true);
370
+ expect(isSafe("git diff HEAD")).toBe(true);
371
+ });
372
+ });
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Shared guard rule constants for agentplate agent hook generation.
3
+ *
4
+ * Pure data module — named exports only, no logic. These constants are the
5
+ * single source of truth for tool names, bash patterns, and safe prefixes
6
+ * used when generating PreToolUse guards in hooks-deployer.ts.
7
+ */
8
+
9
+ /**
10
+ * Claude Code native team/task tools that bypass agentplate orchestration.
11
+ * All agentplate agents must use `agentplate sling` for delegation, not these.
12
+ */
13
+ export const NATIVE_TEAM_TOOLS = [
14
+ "Task",
15
+ "TeamCreate",
16
+ "TeamDelete",
17
+ "SendMessage",
18
+ "TaskCreate",
19
+ "TaskUpdate",
20
+ "TaskList",
21
+ "TaskGet",
22
+ "TaskOutput",
23
+ "TaskStop",
24
+ ];
25
+
26
+ /**
27
+ * Tools that require human interaction and block indefinitely in non-interactive
28
+ * tmux sessions. Agents run non-interactively and must never call these tools.
29
+ * Use agentplate mail (--type question) to escalate to the orchestrator instead.
30
+ */
31
+ export const INTERACTIVE_TOOLS = ["AskUserQuestion", "EnterPlanMode", "EnterWorktree"];
32
+
33
+ /** Tools that non-implementation agents must not use. */
34
+ export const WRITE_TOOLS = ["Write", "Edit", "NotebookEdit"];
35
+
36
+ /**
37
+ * Bash commands that modify files and must be blocked for non-implementation agents.
38
+ * Each pattern is a regex fragment used inside a grep -qE check.
39
+ */
40
+ export const DANGEROUS_BASH_PATTERNS = [
41
+ "sed\\s+-i",
42
+ "sed\\s+--in-place",
43
+ "echo\\s+.*>",
44
+ "printf\\s+.*>",
45
+ "cat\\s+.*>",
46
+ "tee\\s",
47
+ "\\bvim\\b",
48
+ "\\bnano\\b",
49
+ "\\bvi\\b",
50
+ "\\bmv\\s",
51
+ "\\bcp\\s",
52
+ "\\brm\\s",
53
+ "\\bmkdir\\s",
54
+ "\\btouch\\s",
55
+ "\\bchmod\\s",
56
+ "\\bchown\\s",
57
+ ">>",
58
+ "\\bgit\\s+add\\b",
59
+ "\\bgit\\s+commit\\b",
60
+ "\\bgit\\s+merge\\b",
61
+ "\\bgit\\s+push\\b",
62
+ "\\bgit\\s+reset\\b",
63
+ "\\bgit\\s+checkout\\b",
64
+ "\\bgit\\s+rebase\\b",
65
+ "\\bgit\\s+stash\\b",
66
+ "\\bnpm\\s+install\\b",
67
+ "\\bbun\\s+install\\b",
68
+ "\\bbun\\s+add\\b",
69
+ // Runtime eval flags — bypass shell pattern guards by executing JS/Python directly
70
+ "\\bbun\\s+-e\\b",
71
+ "\\bbun\\s+--eval\\b",
72
+ "\\bnode\\s+-e\\b",
73
+ "\\bnode\\s+--eval\\b",
74
+ "\\bdeno\\s+eval\\b",
75
+ "\\bpython3?\\s+-c\\b",
76
+ "\\bperl\\s+-e\\b",
77
+ "\\bruby\\s+-e\\b",
78
+ ];
79
+
80
+ /**
81
+ * Bash commands that are always safe for non-implementation agents.
82
+ * If a command starts with any of these prefixes, it bypasses the dangerous command check.
83
+ * This whitelist is checked BEFORE the blocklist.
84
+ */
85
+ export const SAFE_BASH_PREFIXES = [
86
+ "ap ",
87
+ "agentplate ",
88
+ "bd ",
89
+ "sr ",
90
+ "git status",
91
+ "git log",
92
+ "git diff",
93
+ "git show",
94
+ "git blame",
95
+ "git branch",
96
+ "loam ",
97
+ ];