@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,489 @@
1
+ // JSON Schema for LoamConfig (.loam/loam.config.yaml).
2
+ //
3
+ // Hand-authored to mirror the TypeScript LoamConfig interface in ./config.ts.
4
+ // Powers `lm config schema` for warren and any other tool that needs to render
5
+ // a generic configuration UI against loam's settings. Keep this in lockstep
6
+ // with the TS interface — when you add a knob, add it here too (a doctor /
7
+ // test-time check enforces parity).
8
+ //
9
+ // Conventions (matching record-schema.ts):
10
+ // - Every object literal includes `type: "object"` alongside `required` /
11
+ // `properties` so AJV strict mode accepts the schema.
12
+ // - Closed shapes use `additionalProperties: false`.
13
+ // - Open maps (domains, custom_types, aliases) use `additionalProperties` to
14
+ // describe the value shape.
15
+
16
+ const domainConfigSchema = {
17
+ type: "object",
18
+ title: "Domain configuration",
19
+ description:
20
+ "Per-domain rules. Empty/missing fields preserve back-compat (any registered type accepted, no extra required fields).",
21
+ properties: {
22
+ allowed_types: {
23
+ type: "array",
24
+ title: "Allowed record types",
25
+ description:
26
+ "Gates `--type` on write for this domain. Empty/missing means all registered types are allowed. `disabled_types` wins over `allowed_types` on overlap so retiring a type does not hard-fail peers.",
27
+ items: { type: "string" },
28
+ },
29
+ required_fields: {
30
+ type: "array",
31
+ title: "Required top-level fields",
32
+ description:
33
+ "Additional top-level fields every record in this domain must carry, on top of the per-type schema requirements.",
34
+ items: { type: "string" },
35
+ },
36
+ },
37
+ additionalProperties: false,
38
+ } as const;
39
+
40
+ const customTypeConfigSchema = {
41
+ type: "object",
42
+ title: "Custom record type",
43
+ description:
44
+ "Definition of a custom record type. May extend a built-in to inherit its required/optional fields, dedup_key, id_key, summary, compact strategy, section title, and file-extraction behavior — override only what differs; arrays merge as a union. Custom-from-custom is not supported.",
45
+ properties: {
46
+ extends: {
47
+ type: "string",
48
+ title: "Built-in to extend",
49
+ description:
50
+ "Name of a built-in type (convention, pattern, failure, decision, reference, guide). Custom-from-custom is rejected.",
51
+ enum: ["convention", "pattern", "failure", "decision", "reference", "guide"],
52
+ },
53
+ required: {
54
+ type: "array",
55
+ title: "Required fields",
56
+ description: "Top-level fields a record of this type must carry.",
57
+ items: { type: "string" },
58
+ },
59
+ optional: {
60
+ type: "array",
61
+ title: "Optional fields",
62
+ description: "Additional top-level fields a record of this type may carry.",
63
+ items: { type: "string" },
64
+ },
65
+ dedup_key: {
66
+ type: "string",
67
+ title: "Dedup key",
68
+ description: "Field used to detect duplicates on write (e.g. 'name' or 'content').",
69
+ },
70
+ id_key: {
71
+ type: "string",
72
+ title: "Display ID field",
73
+ description: "Field used to render a record's identifying label in compact output.",
74
+ },
75
+ summary: {
76
+ type: "string",
77
+ title: "Summary template",
78
+ description: "Compact-line summary template used by `lm prime`.",
79
+ },
80
+ extracts_files: {
81
+ type: "boolean",
82
+ title: "Extracts files",
83
+ description: "Whether records of this type carry a list of file anchors.",
84
+ },
85
+ files_field: {
86
+ type: "string",
87
+ title: "Files field name",
88
+ description: "Field name that holds file anchors when extracts_files is true (e.g. 'files').",
89
+ },
90
+ compact: {
91
+ type: "string",
92
+ title: "Compact strategy",
93
+ description: "How `lm compact` collapses duplicates of this type.",
94
+ enum: ["concat", "merge_outcomes", "keep_latest", "manual"],
95
+ },
96
+ section_title: {
97
+ type: "string",
98
+ title: "Section title",
99
+ description: "Heading used when grouping this type in `lm prime` output.",
100
+ },
101
+ aliases: {
102
+ type: "object",
103
+ title: "Field aliases",
104
+ description:
105
+ "Map canonical (current) field name to legacy aliases. Records on disk that carry a legacy field are rewritten to the canonical name at read time.",
106
+ additionalProperties: {
107
+ type: "array",
108
+ items: { type: "string" },
109
+ },
110
+ },
111
+ },
112
+ additionalProperties: false,
113
+ } as const;
114
+
115
+ const auditThresholdsSchema = {
116
+ type: "object",
117
+ title: "Audit thresholds",
118
+ description:
119
+ "PASS/WARN/FAIL bands for `lm audit`. Below `_warn` is FAIL; between `_warn` and the primary threshold is WARN; meeting the primary threshold is PASS. Floater and stale knobs use a single PASS ceiling.",
120
+ properties: {
121
+ evidence_coverage: {
122
+ type: "number",
123
+ title: "Evidence coverage (PASS)",
124
+ description:
125
+ "PASS when ≥ this fraction of records carry any tracker (sprout/gh/linear/bead) or commit evidence. Range: [0, 1].",
126
+ minimum: 0,
127
+ maximum: 1,
128
+ default: 0.5,
129
+ },
130
+ evidence_coverage_warn: {
131
+ type: "number",
132
+ title: "Evidence coverage (WARN)",
133
+ description:
134
+ "WARN when evidence coverage is between this value and `evidence_coverage`. Below this is FAIL. Range: [0, 1].",
135
+ minimum: 0,
136
+ maximum: 1,
137
+ default: 0.3,
138
+ },
139
+ floater_max: {
140
+ type: "number",
141
+ title: "Floater rate (PASS ceiling)",
142
+ description:
143
+ "PASS when the fraction of records without any tracker, relates_to, or commit evidence is ≤ this value. Above is WARN/FAIL.",
144
+ minimum: 0,
145
+ maximum: 1,
146
+ default: 0.2,
147
+ },
148
+ rule_density_min: {
149
+ type: "number",
150
+ title: "Convention rule-density (PASS)",
151
+ description:
152
+ "PASS when ≥ this fraction of convention records contain a rule-signal word (because, must not, avoid, always, never, …). Range: [0, 1].",
153
+ minimum: 0,
154
+ maximum: 1,
155
+ default: 0.25,
156
+ },
157
+ rule_density_warn: {
158
+ type: "number",
159
+ title: "Convention rule-density (WARN)",
160
+ description:
161
+ "WARN when rule-density is between this value and `rule_density_min`. Below this is FAIL. Range: [0, 1].",
162
+ minimum: 0,
163
+ maximum: 1,
164
+ default: 0.15,
165
+ },
166
+ max_records_per_domain: {
167
+ type: "integer",
168
+ title: "Records per domain (PASS ceiling)",
169
+ description:
170
+ "Informational ceiling on records per domain; auditors flag domains above this number. Distinct from `governance.hard_limit` which gates writes.",
171
+ minimum: 1,
172
+ default: 200,
173
+ },
174
+ max_stale: {
175
+ type: "integer",
176
+ title: "Stale records (PASS ceiling)",
177
+ description:
178
+ "Informational ceiling on stale (past-shelf-life) records per domain. PASS when ≤ this value.",
179
+ minimum: 0,
180
+ default: 0,
181
+ },
182
+ },
183
+ additionalProperties: false,
184
+ } as const;
185
+
186
+ const auditConfigSchema = {
187
+ type: "object",
188
+ title: "Audit configuration",
189
+ description:
190
+ "Knobs for `lm audit`. Global thresholds are merged on top of defaults; per-domain entries layer on top of the global thresholds for that domain only.",
191
+ properties: {
192
+ thresholds: auditThresholdsSchema,
193
+ ignore_domains: {
194
+ type: "array",
195
+ title: "Domains excluded from audit",
196
+ description:
197
+ "Domains skipped entirely by `lm audit` (e.g. reference-doc domains that are legitimately convention-heavy and evidence-light).",
198
+ items: { type: "string" },
199
+ },
200
+ per_domain: {
201
+ type: "object",
202
+ title: "Per-domain threshold overrides",
203
+ description:
204
+ "Threshold overrides keyed by domain name. Partial overrides are merged on top of the global thresholds; keys not declared inherit the global value.",
205
+ additionalProperties: auditThresholdsSchema,
206
+ },
207
+ },
208
+ additionalProperties: false,
209
+ } as const;
210
+
211
+ const anchorValidityConfigSchema = {
212
+ type: "object",
213
+ title: "Anchor-validity decay",
214
+ description:
215
+ "Tier-demotion knobs for `lm prune --check-anchors`. A record decays one tier per pass when its file/dir anchors stop resolving and `valid_fraction` drops below `threshold`, provided the record is older than `grace_days`. Records with zero anchors are exempt (absence means 'applies globally').",
216
+ properties: {
217
+ threshold: {
218
+ type: "number",
219
+ title: "Validity threshold",
220
+ description:
221
+ "Demote when the fraction of resolving anchors drops below this value. Range: [0, 1].",
222
+ minimum: 0,
223
+ maximum: 1,
224
+ default: 0.5,
225
+ },
226
+ grace_days: {
227
+ type: "integer",
228
+ title: "Grace period (days)",
229
+ description:
230
+ "Records younger than this many days are exempt from anchor-validity decay so brand-new records can stabilize.",
231
+ minimum: 0,
232
+ default: 7,
233
+ },
234
+ weight: {
235
+ type: "number",
236
+ title: "Fitness weight",
237
+ description:
238
+ "Reserved for the future fitness blend (R-05g). Currently unused; safe to leave unset.",
239
+ },
240
+ },
241
+ additionalProperties: false,
242
+ } as const;
243
+
244
+ const hookCommandList = {
245
+ type: "array",
246
+ description: "Ordered shell commands invoked for this lifecycle event.",
247
+ items: { type: "string" },
248
+ } as const;
249
+
250
+ export const configSchema = {
251
+ $schema: "http://json-schema.org/draft-07/schema#",
252
+ title: "Loam Configuration",
253
+ description:
254
+ "Schema for .loam/loam.config.yaml. Mirrors the LoamConfig TypeScript interface in src/schemas/config.ts. Consumers (e.g. warren) render generic configuration UIs against this schema via `lm config schema --json`.",
255
+ type: "object",
256
+ required: ["version", "domains", "governance", "classification_defaults"],
257
+ properties: {
258
+ version: {
259
+ type: "string",
260
+ title: "Config version",
261
+ description:
262
+ "Schema version of the on-disk config. Bumped only when the shape changes in a backwards-incompatible way.",
263
+ default: "1",
264
+ },
265
+ domains: {
266
+ type: "object",
267
+ title: "Domains",
268
+ description:
269
+ "Per-domain configuration keyed by domain name. Empty object is valid (a fresh project starts with no declared domains; `lm record` auto-creates them).",
270
+ additionalProperties: domainConfigSchema,
271
+ default: {},
272
+ },
273
+ governance: {
274
+ type: "object",
275
+ title: "Governance limits",
276
+ description:
277
+ "Per-domain record-count thresholds. Loam warns at `warn_entries` and refuses writes past `hard_limit` (configurable per project).",
278
+ properties: {
279
+ max_entries: {
280
+ type: "integer",
281
+ title: "Soft target",
282
+ description:
283
+ "Soft target for records per domain. Status reports flag domains above this number; writes are not blocked.",
284
+ minimum: 1,
285
+ default: 100,
286
+ },
287
+ warn_entries: {
288
+ type: "integer",
289
+ title: "Warn threshold",
290
+ description: "Threshold at which `lm record` prints a 'consider compacting' warning.",
291
+ minimum: 1,
292
+ default: 150,
293
+ },
294
+ hard_limit: {
295
+ type: "integer",
296
+ title: "Hard limit",
297
+ description: "Maximum records per domain. Writes past this number are refused.",
298
+ minimum: 1,
299
+ default: 200,
300
+ },
301
+ },
302
+ required: ["max_entries", "warn_entries", "hard_limit"],
303
+ additionalProperties: false,
304
+ },
305
+ classification_defaults: {
306
+ type: "object",
307
+ title: "Classification defaults",
308
+ description: "Shelf-life windows (in days) for time-bound record classifications.",
309
+ properties: {
310
+ shelf_life: {
311
+ type: "object",
312
+ title: "Shelf life (days)",
313
+ description:
314
+ "How long records of each classification remain in primary expertise before `lm prune` considers them stale. `foundational` records are permanent and are not listed here.",
315
+ properties: {
316
+ tactical: {
317
+ type: "integer",
318
+ title: "Tactical shelf life",
319
+ description: "Days a tactical record remains live before becoming prune-eligible.",
320
+ minimum: 1,
321
+ default: 14,
322
+ },
323
+ observational: {
324
+ type: "integer",
325
+ title: "Observational shelf life",
326
+ description:
327
+ "Days an observational record remains live before becoming prune-eligible.",
328
+ minimum: 1,
329
+ default: 30,
330
+ },
331
+ },
332
+ required: ["tactical", "observational"],
333
+ additionalProperties: false,
334
+ },
335
+ },
336
+ required: ["shelf_life"],
337
+ additionalProperties: false,
338
+ },
339
+ prime: {
340
+ type: "object",
341
+ title: "Prime defaults",
342
+ description: "Defaults applied when `lm prime` is invoked without overriding flags.",
343
+ properties: {
344
+ default_mode: {
345
+ type: "string",
346
+ title: "Default prime mode",
347
+ description:
348
+ "`full` dumps every record; `manifest` emits a quick reference + domain index for monolith projects where dumping every record wastes context.",
349
+ enum: ["manifest", "full"],
350
+ default: "full",
351
+ },
352
+ tier_weights: {
353
+ type: "object",
354
+ title: "Trust-tier ranking weights",
355
+ description:
356
+ "Per-record sort score = stars * `star` + classification weight. Override only the knobs you want to retune; unset fields keep their default. Higher scores surface first.",
357
+ properties: {
358
+ star: {
359
+ type: "number",
360
+ title: "Star weight",
361
+ description:
362
+ "Multiplier applied to a record's confirmation-score (★ count from outcomes).",
363
+ minimum: 0,
364
+ default: 100,
365
+ },
366
+ foundational: {
367
+ type: "number",
368
+ title: "Foundational weight",
369
+ description: "Base score added to every foundational record.",
370
+ minimum: 0,
371
+ default: 50,
372
+ },
373
+ tactical: {
374
+ type: "number",
375
+ title: "Tactical weight",
376
+ description: "Base score added to every tactical record.",
377
+ minimum: 0,
378
+ default: 20,
379
+ },
380
+ observational: {
381
+ type: "number",
382
+ title: "Observational weight",
383
+ description: "Base score added to every observational record.",
384
+ minimum: 0,
385
+ default: 10,
386
+ },
387
+ },
388
+ additionalProperties: false,
389
+ },
390
+ session_close: {
391
+ type: "object",
392
+ title: "Session-close footer",
393
+ description:
394
+ "Footer appended after `lm prime` (and the embedded snippet emitted by `lm setup` / `lm onboard`). `style` selects a built-in preset; `custom` overrides the preset with verbatim prose.",
395
+ properties: {
396
+ style: {
397
+ type: "string",
398
+ title: "Preset style",
399
+ description:
400
+ "`directive` = numbered imperative + type glossary + anti-filler guardrails. `conditional` = the v0.10.0 'if you discovered…' reframe (default). `minimal` = one-line nudge. `none` = suppress the footer entirely.",
401
+ enum: ["directive", "conditional", "minimal", "none"],
402
+ default: "conditional",
403
+ },
404
+ custom: {
405
+ type: "string",
406
+ title: "Custom override",
407
+ description:
408
+ "Verbatim prose to emit in place of the preset. Wins over `style` when both are set; the embedded variant (used by `lm setup` / `lm onboard`) is also overridden.",
409
+ },
410
+ },
411
+ additionalProperties: false,
412
+ },
413
+ },
414
+ additionalProperties: false,
415
+ },
416
+ search: {
417
+ type: "object",
418
+ title: "Search tuning",
419
+ description: "Knobs that tune `lm search` / `lm rank` ranking.",
420
+ properties: {
421
+ boost_factor: {
422
+ type: "number",
423
+ title: "Confirmation boost factor",
424
+ description:
425
+ "Multiplier applied to BM25 scores via `applyConfirmationBoost`. 0 disables the boost.",
426
+ minimum: 0,
427
+ default: 0.1,
428
+ },
429
+ },
430
+ required: ["boost_factor"],
431
+ additionalProperties: false,
432
+ },
433
+ custom_types: {
434
+ type: "object",
435
+ title: "Custom record types",
436
+ description:
437
+ "Project-defined record types keyed by type name. Treated identically to built-ins by the registry (CLI flags, validation, dedup, formatters).",
438
+ additionalProperties: customTypeConfigSchema,
439
+ },
440
+ decay: {
441
+ type: "object",
442
+ title: "Decay knobs",
443
+ description:
444
+ "Configuration for tier-demotion behavior in `lm prune`. Currently only `anchor_validity` is wired; `weight` is reserved for the future fitness blend.",
445
+ properties: {
446
+ anchor_validity: anchorValidityConfigSchema,
447
+ },
448
+ additionalProperties: false,
449
+ },
450
+ audit: auditConfigSchema,
451
+ disabled_types: {
452
+ type: "array",
453
+ title: "Disabled types",
454
+ description:
455
+ "Names of registered types (built-in or custom) that emit a deprecation warning on write. Reads still succeed; the type stays in CLI choices.",
456
+ items: { type: "string" },
457
+ },
458
+ hooks: {
459
+ type: "object",
460
+ title: "Lifecycle hooks",
461
+ description:
462
+ "Ordered shell scripts invoked at each lifecycle event. Scripts receive the payload as JSON on stdin (with LOAM_HOOK=1; cwd at project root). `pre-*` hooks block on non-zero exit; `post-*` hooks emit a warning. `pre-record`, `pre-prime`, and `pre-compact` may mutate the payload via stdout JSON; `pre-prune` is block-or-allow only.",
463
+ properties: {
464
+ "pre-record": hookCommandList,
465
+ "post-record": hookCommandList,
466
+ "pre-prime": hookCommandList,
467
+ "pre-prune": hookCommandList,
468
+ "pre-compact": hookCommandList,
469
+ },
470
+ additionalProperties: false,
471
+ },
472
+ hook_settings: {
473
+ type: "object",
474
+ title: "Hook execution settings",
475
+ description: "Per-hook execution settings.",
476
+ properties: {
477
+ timeout_ms: {
478
+ type: "integer",
479
+ title: "Hook timeout (ms)",
480
+ description: "Maximum runtime per hook script. SIGKILL on timeout. Default is 5000ms.",
481
+ minimum: 1,
482
+ default: 5000,
483
+ },
484
+ },
485
+ additionalProperties: false,
486
+ },
487
+ },
488
+ additionalProperties: false,
489
+ } as const;