@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,218 @@
1
+ import chalk from "chalk";
2
+ import { type Command, Option } from "commander";
3
+ import { getExpertisePath, readConfig } from "../utils/config.ts";
4
+ import {
5
+ filterByClassification,
6
+ filterByFile,
7
+ filterByType,
8
+ getFileModTime,
9
+ readExpertiseFile,
10
+ } from "../utils/expertise.ts";
11
+ import {
12
+ formatDomainExpertise,
13
+ formatDomainExpertiseCompact,
14
+ formatDomainExpertisePlain,
15
+ formatDomainExpertiseXml,
16
+ type PrimeFormat,
17
+ } from "../utils/format.ts";
18
+ import { outputJson, outputJsonError } from "../utils/json-output.ts";
19
+ import { type ScoredRecord, sortByConfirmationScore } from "../utils/scoring.ts";
20
+
21
+ export function registerQueryCommand(program: Command): void {
22
+ program
23
+ .command("query")
24
+ .argument("[domain]", "expertise domain to query")
25
+ .description("Query expertise records")
26
+ .option("--type <type>", "filter by record type")
27
+ .addOption(
28
+ new Option("--classification <classification>", "filter by classification").choices([
29
+ "foundational",
30
+ "tactical",
31
+ "observational",
32
+ ]),
33
+ )
34
+ .option("--file <file>", "filter by associated file path (substring match)")
35
+ .addOption(
36
+ new Option("--outcome-status <status>", "filter by outcome status").choices([
37
+ "success",
38
+ "failure",
39
+ ]),
40
+ )
41
+ .option("--sort-by-score", "sort results by confirmation-frequency score (highest first)")
42
+ .option("--all", "show all domains")
43
+ .addOption(
44
+ new Option("--format <format>", "output format for records").choices([
45
+ "markdown",
46
+ "compact",
47
+ "xml",
48
+ "plain",
49
+ "ids",
50
+ ]),
51
+ )
52
+ .action(async (domain: string | undefined, options: Record<string, unknown>) => {
53
+ const jsonMode = program.opts().json === true;
54
+ try {
55
+ const config = await readConfig();
56
+
57
+ const domainsToQuery: string[] = [];
58
+
59
+ if (options.all) {
60
+ domainsToQuery.push(...Object.keys(config.domains));
61
+ if (domainsToQuery.length === 0) {
62
+ if (jsonMode) {
63
+ outputJson({ success: true, command: "query", domains: [] });
64
+ } else {
65
+ console.log("No domains configured. Run `lm add <domain>` to get started.");
66
+ }
67
+ return;
68
+ }
69
+ } else if (domain) {
70
+ if (!(domain in config.domains)) {
71
+ if (jsonMode) {
72
+ outputJsonError(
73
+ "query",
74
+ `Domain "${domain}" not found in config. Available domains: ${Object.keys(config.domains).join(", ") || "(none)"}`,
75
+ );
76
+ } else {
77
+ console.error(
78
+ `Error: Domain "${domain}" not found in config. Available domains: ${Object.keys(config.domains).join(", ") || "(none)"}`,
79
+ );
80
+ console.error(
81
+ `Hint: Run \`lm add ${domain}\` to create this domain, or check .loam/loam.config.yaml`,
82
+ );
83
+ }
84
+ process.exitCode = 1;
85
+ return;
86
+ }
87
+ domainsToQuery.push(domain);
88
+ } else {
89
+ if (jsonMode) {
90
+ outputJsonError("query", "Please specify a domain or use --all to query all domains.");
91
+ } else {
92
+ console.error(
93
+ chalk.red("Error: Please specify a domain or use --all to query all domains."),
94
+ );
95
+ }
96
+ process.exitCode = 1;
97
+ return;
98
+ }
99
+
100
+ if (jsonMode) {
101
+ const result: Array<{ domain: string; records: unknown[] }> = [];
102
+ for (const d of domainsToQuery) {
103
+ const filePath = getExpertisePath(d);
104
+ let records = await readExpertiseFile(filePath);
105
+ if (options.type) {
106
+ records = filterByType(records, options.type as string);
107
+ }
108
+ if (options.classification) {
109
+ records = filterByClassification(records, options.classification as string);
110
+ }
111
+ if (options.file) {
112
+ records = filterByFile(records, options.file as string);
113
+ }
114
+ if (options.outcomeStatus) {
115
+ records = records.filter((r) =>
116
+ r.outcomes?.some((o) => o.status === (options.outcomeStatus as string)),
117
+ );
118
+ }
119
+ if (options.sortByScore) {
120
+ records = sortByConfirmationScore(records as ScoredRecord[]);
121
+ }
122
+ result.push({ domain: d, records });
123
+ }
124
+ outputJson({ success: true, command: "query", domains: result });
125
+ } else {
126
+ const globalFormat = program.opts().format as PrimeFormat | undefined;
127
+ const fmt =
128
+ (options.format as string | undefined) ??
129
+ (globalFormat as string | undefined) ??
130
+ "markdown";
131
+ if (fmt === "ids") {
132
+ const ids: string[] = [];
133
+ for (const d of domainsToQuery) {
134
+ const filePath = getExpertisePath(d);
135
+ let records = await readExpertiseFile(filePath);
136
+ if (options.type) {
137
+ records = filterByType(records, options.type as string);
138
+ }
139
+ if (options.classification) {
140
+ records = filterByClassification(records, options.classification as string);
141
+ }
142
+ if (options.file) {
143
+ records = filterByFile(records, options.file as string);
144
+ }
145
+ if (options.outcomeStatus) {
146
+ records = records.filter((r) =>
147
+ r.outcomes?.some((o) => o.status === (options.outcomeStatus as string)),
148
+ );
149
+ }
150
+ if (options.sortByScore) {
151
+ records = sortByConfirmationScore(records as ScoredRecord[]);
152
+ }
153
+ for (const r of records) {
154
+ if (r.id) ids.push(r.id);
155
+ }
156
+ }
157
+ if (ids.length > 0) {
158
+ console.log(ids.join("\n"));
159
+ }
160
+ } else {
161
+ const sections: string[] = [];
162
+ for (const d of domainsToQuery) {
163
+ const filePath = getExpertisePath(d);
164
+ let records = await readExpertiseFile(filePath);
165
+ const lastUpdated = await getFileModTime(filePath);
166
+ if (options.type) {
167
+ records = filterByType(records, options.type as string);
168
+ }
169
+ if (options.classification) {
170
+ records = filterByClassification(records, options.classification as string);
171
+ }
172
+ if (options.file) {
173
+ records = filterByFile(records, options.file as string);
174
+ }
175
+ if (options.outcomeStatus) {
176
+ records = records.filter((r) =>
177
+ r.outcomes?.some((o) => o.status === (options.outcomeStatus as string)),
178
+ );
179
+ }
180
+ if (options.sortByScore) {
181
+ records = sortByConfirmationScore(records as ScoredRecord[]);
182
+ }
183
+ switch (fmt) {
184
+ case "compact":
185
+ sections.push(formatDomainExpertiseCompact(d, records, lastUpdated));
186
+ break;
187
+ case "xml":
188
+ sections.push(formatDomainExpertiseXml(d, records, lastUpdated));
189
+ break;
190
+ case "plain":
191
+ sections.push(formatDomainExpertisePlain(d, records, lastUpdated));
192
+ break;
193
+ default:
194
+ sections.push(formatDomainExpertise(d, records, lastUpdated));
195
+ break;
196
+ }
197
+ }
198
+ console.log(sections.join("\n\n"));
199
+ }
200
+ }
201
+ } catch (err) {
202
+ if ((err as NodeJS.ErrnoException).code === "ENOENT") {
203
+ if (jsonMode) {
204
+ outputJsonError("query", "No .loam/ directory found. Run `lm init` first.");
205
+ } else {
206
+ console.error(chalk.red("Error: No .loam/ directory found. Run `lm init` first."));
207
+ }
208
+ } else {
209
+ if (jsonMode) {
210
+ outputJsonError("query", (err as Error).message);
211
+ } else {
212
+ console.error(chalk.red(`Error: ${(err as Error).message}`));
213
+ }
214
+ }
215
+ process.exitCode = 1;
216
+ }
217
+ });
218
+ }
@@ -0,0 +1,180 @@
1
+ import chalk from "chalk";
2
+ import { type Command, Option } from "commander";
3
+ import { getRegistry } from "../registry/type-registry.ts";
4
+ import type { ExpertiseRecord } from "../schemas/record.ts";
5
+ import { getExpertisePath, readConfig } from "../utils/config.ts";
6
+ import { filterByType, readExpertiseFile } from "../utils/expertise.ts";
7
+ import { getRecordSummary } from "../utils/format.ts";
8
+ import { outputJson, outputJsonError } from "../utils/json-output.ts";
9
+ import { accent } from "../utils/palette.ts";
10
+ import { computeConfirmationScore, type ScoredRecord } from "../utils/scoring.ts";
11
+
12
+ interface RankedRecord {
13
+ domain: string;
14
+ record: ExpertiseRecord;
15
+ score: number;
16
+ }
17
+
18
+ function formatScore(score: number): string {
19
+ return Number.isInteger(score) ? String(score) : score.toFixed(1);
20
+ }
21
+
22
+ const POSITIVE_INT_RE = /^\d+$/;
23
+ const NON_NEGATIVE_NUMBER_RE = /^\d+(\.\d+)?$/;
24
+
25
+ function parseStrictPositiveInt(raw: string): number | null {
26
+ if (!POSITIVE_INT_RE.test(raw)) return null;
27
+ const n = Number(raw);
28
+ return Number.isFinite(n) && n >= 1 ? n : null;
29
+ }
30
+
31
+ function parseStrictNonNegativeNumber(raw: string): number | null {
32
+ if (!NON_NEGATIVE_NUMBER_RE.test(raw)) return null;
33
+ const n = Number(raw);
34
+ return Number.isFinite(n) && n >= 0 ? n : null;
35
+ }
36
+
37
+ export function registerRankCommand(program: Command): void {
38
+ program
39
+ .command("rank")
40
+ .argument("[domain]", "limit ranking to a specific domain")
41
+ .description("Rank records by confirmation-frequency score (highest first)")
42
+ .addOption(new Option("--type <type>", "filter by record type").choices(getRegistry().names()))
43
+ .option("--limit <n>", "return at most N records", "10")
44
+ .option(
45
+ "--min-score <n>",
46
+ "exclude records whose confirmation score is below N (default: 0, i.e. include all)",
47
+ "0",
48
+ )
49
+ .action(
50
+ async (
51
+ domain: string | undefined,
52
+ options: { type?: string; limit: string; minScore: string },
53
+ ) => {
54
+ const jsonMode = program.opts().json === true;
55
+ try {
56
+ // `Number.parseInt("10abc", 10)` silently strips trailing garbage and
57
+ // returns 10 — accept the typo as success. Use a regex + Number()
58
+ // pair so `--limit 10abc` / `--limit 3.7` are rejected.
59
+ const limit = parseStrictPositiveInt(options.limit);
60
+ if (limit === null) {
61
+ const msg = `--limit must be a positive integer (got "${options.limit}").`;
62
+ if (jsonMode) {
63
+ outputJsonError("rank", msg);
64
+ } else {
65
+ console.error(chalk.red(`Error: ${msg}`));
66
+ }
67
+ process.exitCode = 1;
68
+ return;
69
+ }
70
+
71
+ const minScore = parseStrictNonNegativeNumber(options.minScore);
72
+ if (minScore === null) {
73
+ const msg = `--min-score must be a non-negative number (got "${options.minScore}").`;
74
+ if (jsonMode) {
75
+ outputJsonError("rank", msg);
76
+ } else {
77
+ console.error(chalk.red(`Error: ${msg}`));
78
+ }
79
+ process.exitCode = 1;
80
+ return;
81
+ }
82
+
83
+ const config = await readConfig();
84
+
85
+ let domainsToRank: string[];
86
+ if (domain) {
87
+ if (!(domain in config.domains)) {
88
+ const available = Object.keys(config.domains).join(", ") || "(none)";
89
+ const msg = `Domain "${domain}" not found in config. Available domains: ${available}`;
90
+ if (jsonMode) {
91
+ outputJsonError("rank", msg);
92
+ } else {
93
+ console.error(chalk.red(`Error: ${msg}`));
94
+ console.error(
95
+ `Hint: Run \`lm add ${domain}\` to create this domain, or check .loam/loam.config.yaml`,
96
+ );
97
+ }
98
+ process.exitCode = 1;
99
+ return;
100
+ }
101
+ domainsToRank = [domain];
102
+ } else {
103
+ domainsToRank = Object.keys(config.domains);
104
+ }
105
+
106
+ const ranked: RankedRecord[] = [];
107
+ for (const d of domainsToRank) {
108
+ const filePath = getExpertisePath(d);
109
+ let records = await readExpertiseFile(filePath);
110
+ if (options.type) {
111
+ records = filterByType(records, options.type);
112
+ }
113
+ for (const record of records) {
114
+ const score = computeConfirmationScore(record as ScoredRecord);
115
+ if (score < minScore) continue;
116
+ ranked.push({ domain: d, record, score });
117
+ }
118
+ }
119
+
120
+ ranked.sort((a, b) => b.score - a.score);
121
+
122
+ const top = ranked.slice(0, limit);
123
+
124
+ if (jsonMode) {
125
+ outputJson({
126
+ success: true,
127
+ command: "rank",
128
+ count: top.length,
129
+ records: top.map((e) => ({
130
+ domain: e.domain,
131
+ id: e.record.id ?? null,
132
+ type: e.record.type,
133
+ score: e.score,
134
+ summary: getRecordSummary(e.record),
135
+ record: e.record,
136
+ })),
137
+ });
138
+ return;
139
+ }
140
+
141
+ if (top.length === 0) {
142
+ console.log("No records match the ranking criteria.");
143
+ return;
144
+ }
145
+
146
+ const scope = domain ?? "all domains";
147
+ console.log(
148
+ `Top ${top.length} record${top.length === 1 ? "" : "s"} by confirmation score (${scope})`,
149
+ );
150
+ console.log("");
151
+
152
+ for (const entry of top) {
153
+ const id = entry.record.id ? `${accent(entry.record.id)} ` : "";
154
+ const score = chalk.green(`★${formatScore(entry.score)}`.padEnd(6));
155
+ const domainCol = chalk.cyan(entry.domain.padEnd(14));
156
+ const type = chalk.yellow(`[${entry.record.type}]`.padEnd(14));
157
+ const summary = getRecordSummary(entry.record);
158
+ console.log(` ${id}${score}${domainCol}${type}${summary}`);
159
+ }
160
+ } catch (err) {
161
+ if ((err as NodeJS.ErrnoException).code === "ENOENT") {
162
+ const msg = "No .loam/ directory found. Run `lm init` first.";
163
+ if (jsonMode) {
164
+ outputJsonError("rank", msg);
165
+ } else {
166
+ console.error(chalk.red(`Error: ${msg}`));
167
+ }
168
+ } else {
169
+ const msg = (err as Error).message;
170
+ if (jsonMode) {
171
+ outputJsonError("rank", msg);
172
+ } else {
173
+ console.error(chalk.red(`Error: ${msg}`));
174
+ }
175
+ }
176
+ process.exitCode = 1;
177
+ }
178
+ },
179
+ );
180
+ }
@@ -0,0 +1,189 @@
1
+ import chalk from "chalk";
2
+ import type { Command } from "commander";
3
+ import type { ExpertiseRecord } from "../schemas/record.ts";
4
+ import { getExpertisePath, readConfig } from "../utils/config.ts";
5
+ import { readExpertiseFile } from "../utils/expertise.ts";
6
+ import { formatTimeAgo, getRecordSummary } from "../utils/format.ts";
7
+ import { outputJson, outputJsonError } from "../utils/json-output.ts";
8
+ import { accent } from "../utils/palette.ts";
9
+
10
+ interface AnnotatedRecord {
11
+ domain: string;
12
+ record: ExpertiseRecord;
13
+ }
14
+
15
+ // Strict numeric flag parsing — see mx-5b9578 / src/commands/rank.ts.
16
+ // `Number.parseInt("10abc", 10)` silently returns 10; use regex + Number() so
17
+ // typos like `--limit 10abc` or `--limit 3.7` are rejected.
18
+ const POSITIVE_INT_RE = /^\d+$/;
19
+
20
+ function parseStrictPositiveInt(raw: string): number | null {
21
+ if (!POSITIVE_INT_RE.test(raw)) return null;
22
+ const n = Number(raw);
23
+ return Number.isFinite(n) && n >= 1 ? n : null;
24
+ }
25
+
26
+ function parseDuration(input: string): number {
27
+ const match = input.match(/^(\d+)(h|d|w)$/);
28
+ if (!match) {
29
+ throw new Error(`Invalid duration: "${input}". Use format like "24h", "7d", "2w".`);
30
+ }
31
+ const value = Number.parseInt(match[1] ?? "", 10);
32
+ const unit = match[2] ?? "";
33
+ switch (unit) {
34
+ case "h":
35
+ return value * 3600000;
36
+ case "d":
37
+ return value * 86400000;
38
+ case "w":
39
+ return value * 7 * 86400000;
40
+ default:
41
+ throw new Error(`Unknown unit: ${unit}`);
42
+ }
43
+ }
44
+
45
+ export function registerReadyCommand(program: Command): void {
46
+ program
47
+ .command("ready")
48
+ .description("Show recently added or updated expertise records")
49
+ .option("--limit <n>", "maximum number of records to show", "10")
50
+ .option("--domain <domain>", "limit to a specific domain")
51
+ .option("--since <duration>", "show records from the last duration (e.g. 24h, 7d, 2w)")
52
+ .action(async (options: { limit: string; domain?: string; since?: string }) => {
53
+ const jsonMode = program.opts().json === true;
54
+
55
+ try {
56
+ const config = await readConfig();
57
+ const limit = parseStrictPositiveInt(options.limit);
58
+
59
+ if (limit === null) {
60
+ const msg = `--limit must be a positive integer (got "${options.limit}").`;
61
+ if (jsonMode) {
62
+ outputJsonError("ready", msg);
63
+ } else {
64
+ console.error(chalk.red(`Error: ${msg}`));
65
+ }
66
+ process.exitCode = 1;
67
+ return;
68
+ }
69
+
70
+ let domainsToCheck: string[];
71
+ if (options.domain) {
72
+ if (!(options.domain in config.domains)) {
73
+ if (jsonMode) {
74
+ outputJsonError(
75
+ "ready",
76
+ `Domain "${options.domain}" not found in config. Available domains: ${Object.keys(config.domains).join(", ")}`,
77
+ );
78
+ } else {
79
+ console.error(
80
+ chalk.red(
81
+ `Error: domain "${options.domain}" not found. Available: ${Object.keys(config.domains).join(", ")}`,
82
+ ),
83
+ );
84
+ }
85
+ process.exitCode = 1;
86
+ return;
87
+ }
88
+ domainsToCheck = [options.domain];
89
+ } else {
90
+ domainsToCheck = Object.keys(config.domains);
91
+ }
92
+
93
+ let sinceMs: number | undefined;
94
+ if (options.since) {
95
+ try {
96
+ sinceMs = parseDuration(options.since);
97
+ } catch (err) {
98
+ if (jsonMode) {
99
+ outputJsonError("ready", (err as Error).message);
100
+ } else {
101
+ console.error(chalk.red(`Error: ${(err as Error).message}`));
102
+ }
103
+ process.exitCode = 1;
104
+ return;
105
+ }
106
+ }
107
+
108
+ // Collect all records with domain annotation
109
+ const all: AnnotatedRecord[] = [];
110
+ for (const domain of domainsToCheck) {
111
+ const filePath = getExpertisePath(domain);
112
+ const records = await readExpertiseFile(filePath);
113
+ for (const record of records) {
114
+ all.push({ domain, record });
115
+ }
116
+ }
117
+
118
+ // Sort by recorded_at descending
119
+ all.sort((a, b) => {
120
+ const aTime = new Date(a.record.recorded_at).getTime();
121
+ const bTime = new Date(b.record.recorded_at).getTime();
122
+ return bTime - aTime;
123
+ });
124
+
125
+ // Apply --since filter
126
+ let filtered = all;
127
+ if (sinceMs !== undefined) {
128
+ const cutoff = Date.now() - sinceMs;
129
+ filtered = all.filter((entry) => {
130
+ return new Date(entry.record.recorded_at).getTime() >= cutoff;
131
+ });
132
+ }
133
+
134
+ // Apply limit
135
+ const entries = filtered.slice(0, limit);
136
+
137
+ if (jsonMode) {
138
+ outputJson({
139
+ success: true,
140
+ command: "ready",
141
+ count: entries.length,
142
+ entries: entries.map((e) => ({
143
+ domain: e.domain,
144
+ id: e.record.id ?? null,
145
+ type: e.record.type,
146
+ recorded_at: e.record.recorded_at,
147
+ summary: getRecordSummary(e.record),
148
+ record: e.record,
149
+ })),
150
+ });
151
+ } else {
152
+ if (entries.length === 0) {
153
+ console.log("No recent expertise records found.");
154
+ return;
155
+ }
156
+
157
+ const header = options.since
158
+ ? `Recent Expertise (last ${options.since})`
159
+ : `Recent Expertise (last ${entries.length} records)`;
160
+ console.log(header);
161
+ console.log("");
162
+
163
+ for (const entry of entries) {
164
+ const age = formatTimeAgo(new Date(entry.record.recorded_at));
165
+ const id = entry.record.id ? `${accent(entry.record.id)} ` : "";
166
+ const domain = chalk.cyan(entry.domain.padEnd(14));
167
+ const type = chalk.yellow(`[${entry.record.type}]`.padEnd(14));
168
+ const summary = getRecordSummary(entry.record);
169
+ console.log(` ${id}${chalk.dim(age.padEnd(10))}${domain}${type}${summary}`);
170
+ }
171
+ }
172
+ } catch (err) {
173
+ if ((err as NodeJS.ErrnoException).code === "ENOENT") {
174
+ if (jsonMode) {
175
+ outputJsonError("ready", "No .loam/ directory found. Run `loam init` first.");
176
+ } else {
177
+ console.error(chalk.red("Error: No .loam/ directory found. Run `loam init` first."));
178
+ }
179
+ } else {
180
+ if (jsonMode) {
181
+ outputJsonError("ready", (err as Error).message);
182
+ } else {
183
+ console.error(chalk.red(`Error: ${(err as Error).message}`));
184
+ }
185
+ }
186
+ process.exitCode = 1;
187
+ }
188
+ });
189
+ }