@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,245 @@
1
+ export type PrimeMode = "manifest" | "full";
2
+
3
+ // Session-close footer styles. Audit (V1_PLAN §3) found 70-80% of conventions
4
+ // were ritual restatements driven by an earlier "you MUST run this checklist"
5
+ // prose; the v0.10.0 reframing dropped it for `conditional`. `directive` ships
6
+ // a numbered imperative + type glossary + anti-filler guardrails for projects
7
+ // that need a louder voice. `minimal` is a one-line nudge. `none` suppresses
8
+ // the footer entirely. `custom` (via SessionCloseConfig.custom) wins over
9
+ // style and ships the raw string verbatim.
10
+ export type SessionCloseStyleName = "directive" | "conditional" | "minimal" | "none";
11
+
12
+ export const DEFAULT_SESSION_CLOSE_STYLE: SessionCloseStyleName = "conditional";
13
+
14
+ export interface SessionCloseConfig {
15
+ style?: SessionCloseStyleName;
16
+ custom?: string;
17
+ }
18
+
19
+ export const DEFAULT_SEARCH_BOOST_FACTOR = 0.1;
20
+
21
+ // Trust-tier ranking weights for `lm prime` full-mode output (v0.10 slice 3).
22
+ // Sort score = stars * star_weight + classification_weight. Higher scores are
23
+ // surfaced first; ties preserve insertion order so within-tier output stays
24
+ // stable across runs.
25
+ export interface PrimeTierWeights {
26
+ star?: number;
27
+ foundational?: number;
28
+ tactical?: number;
29
+ observational?: number;
30
+ }
31
+
32
+ export const DEFAULT_PRIME_TIER_WEIGHTS: Required<PrimeTierWeights> = {
33
+ star: 100,
34
+ foundational: 50,
35
+ tactical: 20,
36
+ observational: 10,
37
+ };
38
+
39
+ export const DEFAULT_HOOK_TIMEOUT_MS = 5_000;
40
+
41
+ // Lifecycle events. `pre-*` hooks block on non-zero exit. `pre-record`,
42
+ // `pre-prime`, and `pre-compact` may mutate the payload via stdout JSON;
43
+ // `pre-prune` is block-or-allow only (its stdout is ignored, so a hook cannot
44
+ // reshape the candidate set). `post-*` hooks are observation-only: a non-zero
45
+ // exit emits a warning but never fails the parent command.
46
+ export type HookEvent = "pre-record" | "post-record" | "pre-prime" | "pre-prune" | "pre-compact";
47
+
48
+ export const HOOK_EVENTS: readonly HookEvent[] = [
49
+ "pre-record",
50
+ "post-record",
51
+ "pre-prime",
52
+ "pre-prune",
53
+ "pre-compact",
54
+ ];
55
+
56
+ export type HooksConfig = Partial<Record<HookEvent, string[]>>;
57
+
58
+ export type CustomCompactStrategy = "concat" | "merge_outcomes" | "keep_latest" | "manual";
59
+
60
+ export interface CustomTypeConfig {
61
+ // Inherit required/optional/dedup_key/id_key/summary/compact/section_title/
62
+ // extracts_files/files_field from a built-in type. Custom-from-custom is not
63
+ // supported in v1. When set, all other fields override only what differs;
64
+ // arrays merge as a union.
65
+ extends?: string;
66
+ required?: string[];
67
+ optional?: string[];
68
+ dedup_key?: string;
69
+ id_key?: string;
70
+ summary?: string;
71
+ extracts_files?: boolean;
72
+ files_field?: string;
73
+ compact?: CustomCompactStrategy;
74
+ section_title?: string;
75
+ // Map canonical (current) field name to legacy aliases. Records on disk that
76
+ // carry a legacy field are rewritten to the canonical name at read time.
77
+ aliases?: Record<string, string[]>;
78
+ }
79
+
80
+ // Per-domain configuration. `allowed_types` gates which registered record
81
+ // types may be written into the domain — empty/missing means all registered
82
+ // types are allowed (back-compat). `required_fields` lists additional
83
+ // top-level fields a record must carry on top of its per-type requirements;
84
+ // empty/missing means no extra requirements.
85
+ export interface DomainConfig {
86
+ allowed_types?: string[];
87
+ required_fields?: string[];
88
+ }
89
+
90
+ export interface AnchorValidityConfig {
91
+ threshold?: number;
92
+ grace_days?: number;
93
+ weight?: number;
94
+ }
95
+
96
+ export interface DecayConfig {
97
+ anchor_validity?: AnchorValidityConfig;
98
+ }
99
+
100
+ export const DEFAULT_ANCHOR_VALIDITY_THRESHOLD = 0.5;
101
+ export const DEFAULT_ANCHOR_VALIDITY_GRACE_DAYS = 7;
102
+
103
+ // `lm audit` thresholds. PASS/WARN/FAIL bands for the three primary corpus
104
+ // health metrics. Defaults relaxed from the Python prototype per V1_PLAN §4.2
105
+ // ("0.7 evidence coverage is empirically unreachable today"). All knobs are
106
+ // overridable globally under `audit.thresholds` and per-domain under
107
+ // `audit.per_domain.<name>` — partial overrides are merged on top of defaults.
108
+ export interface AuditThresholds {
109
+ evidence_coverage?: number; // PASS ≥, default 0.5
110
+ evidence_coverage_warn?: number; // WARN ≥, default 0.3 (below = FAIL)
111
+ floater_max?: number; // PASS ≤ (fraction of records), default 0.2
112
+ rule_density_min?: number; // PASS ≥, default 0.25
113
+ rule_density_warn?: number; // WARN ≥, default 0.15 (below = FAIL)
114
+ max_records_per_domain?: number; // PASS ≤, default 200 (matches governance.hard_limit)
115
+ max_stale?: number; // PASS ≤ stale-record count, default 0
116
+ }
117
+
118
+ export interface AuditConfig {
119
+ thresholds?: AuditThresholds;
120
+ // Domains excluded from audit metrics entirely (e.g. reference-doc domains
121
+ // that are legitimately convention-heavy and evidence-light).
122
+ ignore_domains?: string[];
123
+ // Per-domain threshold overrides. Each value is merged on top of the global
124
+ // thresholds for that domain only — keys not declared fall back to the global.
125
+ per_domain?: Record<string, AuditThresholds>;
126
+ }
127
+
128
+ export const DEFAULT_AUDIT_THRESHOLDS: Required<AuditThresholds> = {
129
+ evidence_coverage: 0.5,
130
+ evidence_coverage_warn: 0.3,
131
+ floater_max: 0.2,
132
+ rule_density_min: 0.25,
133
+ rule_density_warn: 0.15,
134
+ max_records_per_domain: 200,
135
+ max_stale: 0,
136
+ };
137
+
138
+ export function resolveAuditThresholds(
139
+ cfg: AuditConfig | undefined,
140
+ domain?: string,
141
+ ): Required<AuditThresholds> {
142
+ const global = { ...DEFAULT_AUDIT_THRESHOLDS, ...(cfg?.thresholds ?? {}) };
143
+ if (!domain) return global;
144
+ const override = cfg?.per_domain?.[domain];
145
+ if (!override) return global;
146
+ return { ...global, ...override };
147
+ }
148
+
149
+ /**
150
+ * Range-check decay.anchor_validity knobs. Returns a list of human-readable
151
+ * error strings (empty when valid). Caught at command-time (e.g. `lm prune
152
+ * --check-anchors`) so a misconfigured threshold/grace doesn't silently produce
153
+ * wrong demotion decisions:
154
+ * - threshold < 0 or > 1: validFraction is in [0, 1], so out-of-range values
155
+ * either always-decay (threshold > 1) or never-decay (threshold < 0).
156
+ * - grace_days < 0: every record passes the grace check, so brand-new records
157
+ * can decay before their anchors stabilize.
158
+ * - non-finite numbers (NaN/Infinity): YAML accepts `.nan` / `.inf` literals
159
+ * that bypass the type check.
160
+ */
161
+ export function validateAnchorValidityConfig(cfg: AnchorValidityConfig): string[] {
162
+ const errors: string[] = [];
163
+ const t = cfg.threshold;
164
+ if (t !== undefined) {
165
+ if (typeof t !== "number" || !Number.isFinite(t)) {
166
+ errors.push(`threshold must be a finite number (got ${JSON.stringify(t)})`);
167
+ } else if (t < 0 || t > 1) {
168
+ errors.push(`threshold must be between 0 and 1 (got ${t})`);
169
+ }
170
+ }
171
+ const g = cfg.grace_days;
172
+ if (g !== undefined) {
173
+ if (typeof g !== "number" || !Number.isFinite(g)) {
174
+ errors.push(`grace_days must be a finite number (got ${JSON.stringify(g)})`);
175
+ } else if (g < 0) {
176
+ errors.push(`grace_days must be >= 0 (got ${g})`);
177
+ }
178
+ }
179
+ return errors;
180
+ }
181
+
182
+ export interface LoamConfig {
183
+ version: string;
184
+ domains: Record<string, DomainConfig>;
185
+ governance: {
186
+ max_entries: number;
187
+ warn_entries: number;
188
+ hard_limit: number;
189
+ };
190
+ classification_defaults: {
191
+ shelf_life: {
192
+ tactical: number;
193
+ observational: number;
194
+ };
195
+ };
196
+ prime?: {
197
+ default_mode?: PrimeMode;
198
+ // Trust-tier ranking weights. Each knob is optional; unset fields fall
199
+ // back to DEFAULT_PRIME_TIER_WEIGHTS so projects can tune one dimension
200
+ // (e.g. observational only) without redeclaring the whole block.
201
+ tier_weights?: PrimeTierWeights;
202
+ // Session-close footer customization. `style` selects a built-in preset
203
+ // (directive / conditional / minimal / none); `custom` overrides the
204
+ // preset entirely with verbatim prose. Both are optional — unset means
205
+ // DEFAULT_SESSION_CLOSE_STYLE ("conditional", v0.10.0 back-compat).
206
+ session_close?: SessionCloseConfig;
207
+ };
208
+ search?: {
209
+ // Multiplier applied to BM25 scores via applyConfirmationBoost. 0 disables.
210
+ boost_factor: number;
211
+ };
212
+ custom_types?: Record<string, CustomTypeConfig>;
213
+ // Decay knobs. R-05f wires `anchor_validity` into `lm prune --check-anchors`;
214
+ // `weight` is reserved for the future R-05g fitness blend and otherwise unused.
215
+ decay?: DecayConfig;
216
+ // `lm audit` thresholds and ignore-list. See AuditConfig.
217
+ audit?: AuditConfig;
218
+ // Names of registered types (built-in or custom) that emit a deprecation
219
+ // warning on write. Reads still succeed; the type stays in CLI choices.
220
+ disabled_types?: string[];
221
+ // Lifecycle hook scripts. Each event maps to an ordered array of shell
222
+ // commands. Loam invokes each script with the relevant payload as JSON on
223
+ // stdin. See HookEvent for semantics.
224
+ hooks?: HooksConfig;
225
+ // Per-hook execution settings. `timeout_ms` defaults to DEFAULT_HOOK_TIMEOUT_MS.
226
+ hook_settings?: {
227
+ timeout_ms?: number;
228
+ };
229
+ }
230
+
231
+ export const DEFAULT_CONFIG: LoamConfig = {
232
+ version: "1",
233
+ domains: {},
234
+ governance: {
235
+ max_entries: 100,
236
+ warn_entries: 150,
237
+ hard_limit: 200,
238
+ },
239
+ classification_defaults: {
240
+ shelf_life: {
241
+ tactical: 14,
242
+ observational: 30,
243
+ },
244
+ },
245
+ };
@@ -0,0 +1,18 @@
1
+ export type { LoamConfig } from "./config.ts";
2
+ export { DEFAULT_CONFIG } from "./config.ts";
3
+ export { configSchema } from "./config-schema.ts";
4
+ export type {
5
+ BuiltinRecordType,
6
+ Classification,
7
+ ConventionRecord,
8
+ DecisionRecord,
9
+ Evidence,
10
+ ExpertiseRecord,
11
+ FailureRecord,
12
+ GuideRecord,
13
+ Outcome,
14
+ PatternRecord,
15
+ RecordType,
16
+ ReferenceRecord,
17
+ } from "./record.ts";
18
+ export { recordSchema } from "./record-schema.ts";
@@ -0,0 +1,191 @@
1
+ const linkArray = {
2
+ type: "array",
3
+ items: { type: "string", pattern: "^([a-z0-9-]+:)?mx-[0-9a-f]{4,8}$" },
4
+ } as const;
5
+
6
+ const dirAnchorArray = {
7
+ type: "array",
8
+ items: { type: "string" },
9
+ } as const;
10
+
11
+ export const recordSchema = {
12
+ $schema: "http://json-schema.org/draft-07/schema#",
13
+ title: "Loam Expertise Record",
14
+ description: "A single expertise record in a Loam domain file",
15
+ type: "object",
16
+ definitions: {
17
+ classification: {
18
+ type: "string",
19
+ enum: ["foundational", "tactical", "observational"],
20
+ },
21
+ evidence: {
22
+ type: "object",
23
+ properties: {
24
+ commit: { type: "string" },
25
+ date: { type: "string" },
26
+ issue: { type: "string" },
27
+ file: { type: "string" },
28
+ bead: { type: "string" },
29
+ sprout: { type: "string" },
30
+ gh: { type: "string" },
31
+ linear: { type: "string" },
32
+ },
33
+ additionalProperties: false,
34
+ },
35
+ outcome: {
36
+ type: "object",
37
+ properties: {
38
+ status: { type: "string", enum: ["success", "failure", "partial"] },
39
+ duration: { type: "number" },
40
+ test_results: { type: "string" },
41
+ agent: { type: "string" },
42
+ notes: { type: "string" },
43
+ recorded_at: { type: "string" },
44
+ },
45
+ required: ["status"],
46
+ additionalProperties: false,
47
+ },
48
+ },
49
+ oneOf: [
50
+ {
51
+ type: "object",
52
+ properties: {
53
+ id: { type: "string", pattern: "^mx-[0-9a-f]{4,8}$" },
54
+ type: { type: "string", const: "convention" },
55
+ content: { type: "string" },
56
+ classification: { $ref: "#/definitions/classification" },
57
+ recorded_at: { type: "string" },
58
+ evidence: { $ref: "#/definitions/evidence" },
59
+ tags: { type: "array", items: { type: "string" } },
60
+ relates_to: linkArray,
61
+ supersedes: linkArray,
62
+ outcomes: { type: "array", items: { $ref: "#/definitions/outcome" } },
63
+ dir_anchors: dirAnchorArray,
64
+ supersession_demoted_at: { type: "string" },
65
+ anchor_decay_demoted_at: { type: "string" },
66
+ owner: { type: "string" },
67
+ status: { type: "string", enum: ["draft", "active", "deprecated"] },
68
+ },
69
+ required: ["type", "content", "classification", "recorded_at"],
70
+ additionalProperties: false,
71
+ },
72
+ {
73
+ type: "object",
74
+ properties: {
75
+ id: { type: "string", pattern: "^mx-[0-9a-f]{4,8}$" },
76
+ type: { type: "string", const: "pattern" },
77
+ name: { type: "string" },
78
+ description: { type: "string" },
79
+ files: { type: "array", items: { type: "string" } },
80
+ classification: { $ref: "#/definitions/classification" },
81
+ recorded_at: { type: "string" },
82
+ evidence: { $ref: "#/definitions/evidence" },
83
+ tags: { type: "array", items: { type: "string" } },
84
+ relates_to: linkArray,
85
+ supersedes: linkArray,
86
+ outcomes: { type: "array", items: { $ref: "#/definitions/outcome" } },
87
+ dir_anchors: dirAnchorArray,
88
+ supersession_demoted_at: { type: "string" },
89
+ anchor_decay_demoted_at: { type: "string" },
90
+ owner: { type: "string" },
91
+ status: { type: "string", enum: ["draft", "active", "deprecated"] },
92
+ },
93
+ required: ["type", "name", "description", "classification", "recorded_at"],
94
+ additionalProperties: false,
95
+ },
96
+ {
97
+ type: "object",
98
+ properties: {
99
+ id: { type: "string", pattern: "^mx-[0-9a-f]{4,8}$" },
100
+ type: { type: "string", const: "failure" },
101
+ description: { type: "string" },
102
+ resolution: { type: "string" },
103
+ classification: { $ref: "#/definitions/classification" },
104
+ recorded_at: { type: "string" },
105
+ evidence: { $ref: "#/definitions/evidence" },
106
+ tags: { type: "array", items: { type: "string" } },
107
+ relates_to: linkArray,
108
+ supersedes: linkArray,
109
+ outcomes: { type: "array", items: { $ref: "#/definitions/outcome" } },
110
+ dir_anchors: dirAnchorArray,
111
+ supersession_demoted_at: { type: "string" },
112
+ anchor_decay_demoted_at: { type: "string" },
113
+ owner: { type: "string" },
114
+ status: { type: "string", enum: ["draft", "active", "deprecated"] },
115
+ },
116
+ required: ["type", "description", "resolution", "classification", "recorded_at"],
117
+ additionalProperties: false,
118
+ },
119
+ {
120
+ type: "object",
121
+ properties: {
122
+ id: { type: "string", pattern: "^mx-[0-9a-f]{4,8}$" },
123
+ type: { type: "string", const: "decision" },
124
+ title: { type: "string" },
125
+ rationale: { type: "string" },
126
+ date: { type: "string" },
127
+ classification: { $ref: "#/definitions/classification" },
128
+ recorded_at: { type: "string" },
129
+ evidence: { $ref: "#/definitions/evidence" },
130
+ tags: { type: "array", items: { type: "string" } },
131
+ relates_to: linkArray,
132
+ supersedes: linkArray,
133
+ outcomes: { type: "array", items: { $ref: "#/definitions/outcome" } },
134
+ dir_anchors: dirAnchorArray,
135
+ supersession_demoted_at: { type: "string" },
136
+ anchor_decay_demoted_at: { type: "string" },
137
+ owner: { type: "string" },
138
+ status: { type: "string", enum: ["draft", "active", "deprecated"] },
139
+ },
140
+ required: ["type", "title", "rationale", "classification", "recorded_at"],
141
+ additionalProperties: false,
142
+ },
143
+ {
144
+ type: "object",
145
+ properties: {
146
+ id: { type: "string", pattern: "^mx-[0-9a-f]{4,8}$" },
147
+ type: { type: "string", const: "reference" },
148
+ name: { type: "string" },
149
+ description: { type: "string" },
150
+ files: { type: "array", items: { type: "string" } },
151
+ classification: { $ref: "#/definitions/classification" },
152
+ recorded_at: { type: "string" },
153
+ evidence: { $ref: "#/definitions/evidence" },
154
+ tags: { type: "array", items: { type: "string" } },
155
+ relates_to: linkArray,
156
+ supersedes: linkArray,
157
+ outcomes: { type: "array", items: { $ref: "#/definitions/outcome" } },
158
+ dir_anchors: dirAnchorArray,
159
+ supersession_demoted_at: { type: "string" },
160
+ anchor_decay_demoted_at: { type: "string" },
161
+ owner: { type: "string" },
162
+ status: { type: "string", enum: ["draft", "active", "deprecated"] },
163
+ },
164
+ required: ["type", "name", "description", "classification", "recorded_at"],
165
+ additionalProperties: false,
166
+ },
167
+ {
168
+ type: "object",
169
+ properties: {
170
+ id: { type: "string", pattern: "^mx-[0-9a-f]{4,8}$" },
171
+ type: { type: "string", const: "guide" },
172
+ name: { type: "string" },
173
+ description: { type: "string" },
174
+ classification: { $ref: "#/definitions/classification" },
175
+ recorded_at: { type: "string" },
176
+ evidence: { $ref: "#/definitions/evidence" },
177
+ tags: { type: "array", items: { type: "string" } },
178
+ relates_to: linkArray,
179
+ supersedes: linkArray,
180
+ outcomes: { type: "array", items: { $ref: "#/definitions/outcome" } },
181
+ dir_anchors: dirAnchorArray,
182
+ supersession_demoted_at: { type: "string" },
183
+ anchor_decay_demoted_at: { type: "string" },
184
+ owner: { type: "string" },
185
+ status: { type: "string", enum: ["draft", "active", "deprecated"] },
186
+ },
187
+ required: ["type", "name", "description", "classification", "recorded_at"],
188
+ additionalProperties: false,
189
+ },
190
+ ],
191
+ } as const;
@@ -0,0 +1,115 @@
1
+ export type BuiltinRecordType =
2
+ | "convention"
3
+ | "pattern"
4
+ | "failure"
5
+ | "decision"
6
+ | "reference"
7
+ | "guide";
8
+
9
+ // Phase 2: widened to string so config-declared custom types are first-class.
10
+ // Use `BuiltinRecordType` for narrowing back to the six known shapes (e.g.,
11
+ // `registry.get(r.type)?.kind === "builtin"` then cast to a builtin record).
12
+ export type RecordType = string;
13
+
14
+ export type Classification = "foundational" | "tactical" | "observational";
15
+
16
+ export interface Evidence {
17
+ commit?: string;
18
+ date?: string;
19
+ issue?: string;
20
+ file?: string;
21
+ bead?: string;
22
+ sprout?: string;
23
+ gh?: string;
24
+ linear?: string;
25
+ }
26
+
27
+ export interface Outcome {
28
+ status: "success" | "failure" | "partial";
29
+ duration?: number;
30
+ test_results?: string;
31
+ agent?: string;
32
+ notes?: string;
33
+ recorded_at?: string;
34
+ }
35
+
36
+ interface BaseRecord {
37
+ id?: string;
38
+ classification: Classification;
39
+ recorded_at: string;
40
+ evidence?: Evidence;
41
+ tags?: string[];
42
+ relates_to?: string[];
43
+ supersedes?: string[];
44
+ outcomes?: Outcome[];
45
+ dir_anchors?: string[];
46
+ // R-06 ownership: opaque handle (e.g. "@user" or "@team"). Stamped by the
47
+ // owner-resolution chain at write time (loam-41e1) and consumed by
48
+ // `lm review` (loam-8cce). No internal validation in v1.
49
+ owner?: string;
50
+ // Lifecycle status. "draft" / "active" / "deprecated" are author-set on
51
+ // live records; "archived" is set by `lm prune` soft-archive (lives only
52
+ // under .loam/archive/<domain>.jsonl) and the live AJV schemas reject it.
53
+ status?: "draft" | "active" | "deprecated" | "archived";
54
+ archived_at?: string;
55
+ // Set by `archiveRecords` on every code path that moves a record to
56
+ // .loam/archive/. Convention values: "stale" | "superseded" |
57
+ // "anchor_decay" | "manual" | "compacted"; a free-text suffix is permitted
58
+ // (e.g. "manual: wrong domain"). Optional for back-compat with archives
59
+ // written before loam-b41a landed; lives only on archived records.
60
+ archive_reason?: string;
61
+ // Set by `lm prune` when supersession decay (R-05e) demotes a record one
62
+ // classification tier. Lives on the record across the demotion until
63
+ // archive; bumped each pass that re-demotes.
64
+ supersession_demoted_at?: string;
65
+ // Set by `lm prune --check-anchors` when anchor-validity decay (R-05f)
66
+ // demotes a record one tier because too many of its file/dir anchors no
67
+ // longer resolve. Bumped each pass that re-demotes.
68
+ anchor_decay_demoted_at?: string;
69
+ }
70
+
71
+ export interface ConventionRecord extends BaseRecord {
72
+ type: "convention";
73
+ content: string;
74
+ }
75
+
76
+ export interface PatternRecord extends BaseRecord {
77
+ type: "pattern";
78
+ name: string;
79
+ description: string;
80
+ files?: string[];
81
+ }
82
+
83
+ export interface FailureRecord extends BaseRecord {
84
+ type: "failure";
85
+ description: string;
86
+ resolution: string;
87
+ }
88
+
89
+ export interface DecisionRecord extends BaseRecord {
90
+ type: "decision";
91
+ title: string;
92
+ rationale: string;
93
+ date?: string;
94
+ }
95
+
96
+ export interface ReferenceRecord extends BaseRecord {
97
+ type: "reference";
98
+ name: string;
99
+ description: string;
100
+ files?: string[];
101
+ }
102
+
103
+ export interface GuideRecord extends BaseRecord {
104
+ type: "guide";
105
+ name: string;
106
+ description: string;
107
+ }
108
+
109
+ export type ExpertiseRecord =
110
+ | ConventionRecord
111
+ | PatternRecord
112
+ | FailureRecord
113
+ | DecisionRecord
114
+ | ReferenceRecord
115
+ | GuideRecord;