@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,610 @@
1
+ /**
2
+ * Shell completion generation for trellis CLI.
3
+ *
4
+ * Generates completion scripts for bash, zsh, and fish shells.
5
+ */
6
+
7
+ import type { Command } from "commander";
8
+ import { errorOut, isQuiet, jsonOut } from "../output.ts";
9
+ import { ExitError } from "../types.ts";
10
+
11
+ interface FlagDef {
12
+ name: string;
13
+ desc: string;
14
+ takesValue?: boolean;
15
+ values?: readonly string[];
16
+ }
17
+
18
+ interface SubcommandDef {
19
+ name: string;
20
+ desc: string;
21
+ flags?: readonly FlagDef[];
22
+ }
23
+
24
+ interface CommandDef {
25
+ name: string;
26
+ desc: string;
27
+ flags?: readonly FlagDef[];
28
+ subcommands?: readonly SubcommandDef[];
29
+ }
30
+
31
+ export const COMMANDS: readonly CommandDef[] = [
32
+ {
33
+ name: "init",
34
+ desc: "Initialize .trellis/ in current directory",
35
+ flags: [
36
+ { name: "--json", desc: "JSON output" },
37
+ { name: "--help", desc: "Show help" },
38
+ ],
39
+ },
40
+ {
41
+ name: "show",
42
+ desc: "Show prompt record",
43
+ flags: [
44
+ { name: "--json", desc: "JSON output" },
45
+ { name: "--help", desc: "Show help" },
46
+ ],
47
+ },
48
+ {
49
+ name: "list",
50
+ desc: "List prompts",
51
+ flags: [
52
+ { name: "--tag", desc: "Filter by tag", takesValue: true },
53
+ {
54
+ name: "--status",
55
+ desc: "Filter by status",
56
+ takesValue: true,
57
+ values: ["draft", "active", "archived"],
58
+ },
59
+ { name: "--extends", desc: "Filter by parent prompt", takesValue: true },
60
+ { name: "--json", desc: "JSON output" },
61
+ { name: "--help", desc: "Show help" },
62
+ ],
63
+ },
64
+ {
65
+ name: "archive",
66
+ desc: "Archive a prompt",
67
+ flags: [
68
+ { name: "--json", desc: "JSON output" },
69
+ { name: "--help", desc: "Show help" },
70
+ ],
71
+ },
72
+ {
73
+ name: "history",
74
+ desc: "Show version timeline for a prompt",
75
+ flags: [
76
+ { name: "--limit", desc: "Max versions to show", takesValue: true },
77
+ { name: "--json", desc: "JSON output" },
78
+ { name: "--help", desc: "Show help" },
79
+ ],
80
+ },
81
+ {
82
+ name: "tree",
83
+ desc: "Show inheritance tree for a prompt",
84
+ flags: [
85
+ { name: "--json", desc: "JSON output" },
86
+ { name: "--help", desc: "Show help" },
87
+ ],
88
+ },
89
+ {
90
+ name: "stats",
91
+ desc: "Show prompt statistics",
92
+ flags: [
93
+ { name: "--json", desc: "JSON output" },
94
+ { name: "--help", desc: "Show help" },
95
+ ],
96
+ },
97
+ {
98
+ name: "sync",
99
+ desc: "Stage and commit .trellis/ changes",
100
+ flags: [
101
+ { name: "--status", desc: "Check sync status without committing" },
102
+ { name: "--json", desc: "JSON output" },
103
+ { name: "--help", desc: "Show help" },
104
+ ],
105
+ },
106
+ {
107
+ name: "diff",
108
+ desc: "Section-aware diff between prompt versions",
109
+ flags: [
110
+ { name: "--json", desc: "JSON output" },
111
+ { name: "--help", desc: "Show help" },
112
+ ],
113
+ },
114
+ {
115
+ name: "render",
116
+ desc: "Render full prompt (resolve inheritance)",
117
+ flags: [
118
+ {
119
+ name: "--format",
120
+ desc: "Output format",
121
+ takesValue: true,
122
+ values: ["md", "json"],
123
+ },
124
+ { name: "--json", desc: "JSON output" },
125
+ { name: "--help", desc: "Show help" },
126
+ ],
127
+ },
128
+ {
129
+ name: "create",
130
+ desc: "Create a new prompt",
131
+ flags: [
132
+ { name: "--name", desc: "Prompt name", takesValue: true },
133
+ { name: "--description", desc: "Short description", takesValue: true },
134
+ { name: "--extends", desc: "Inherit from parent prompt", takesValue: true },
135
+ { name: "--tag", desc: "Add tag", takesValue: true },
136
+ { name: "--schema", desc: "Assign validation schema", takesValue: true },
137
+ { name: "--emit-as", desc: "Custom emit filename", takesValue: true },
138
+ { name: "--emit-dir", desc: "Custom emit directory", takesValue: true },
139
+ {
140
+ name: "--status",
141
+ desc: "Initial status",
142
+ takesValue: true,
143
+ values: ["draft", "active"],
144
+ },
145
+ { name: "--section", desc: "Add section (name=body)", takesValue: true },
146
+ { name: "--json", desc: "JSON output" },
147
+ { name: "--help", desc: "Show help" },
148
+ ],
149
+ },
150
+ {
151
+ name: "update",
152
+ desc: "Update a prompt (creates new version)",
153
+ flags: [
154
+ { name: "--name", desc: "Rename prompt", takesValue: true },
155
+ { name: "--description", desc: "Update description", takesValue: true },
156
+ { name: "--section", desc: "Section to update", takesValue: true },
157
+ { name: "--body", desc: "New body for section", takesValue: true },
158
+ { name: "--add-section", desc: "Add a new section (name=body)", takesValue: true },
159
+ { name: "--remove-section", desc: "Remove a section", takesValue: true },
160
+ { name: "--tag", desc: "Add tag", takesValue: true },
161
+ { name: "--untag", desc: "Remove tag", takesValue: true },
162
+ { name: "--schema", desc: "Assign schema", takesValue: true },
163
+ { name: "--extends", desc: "Change parent prompt", takesValue: true },
164
+ { name: "--emit-as", desc: "Custom emit filename", takesValue: true },
165
+ { name: "--emit-dir", desc: "Custom emit directory", takesValue: true },
166
+ {
167
+ name: "--status",
168
+ desc: "Change status",
169
+ takesValue: true,
170
+ values: ["draft", "active", "archived"],
171
+ },
172
+ { name: "--json", desc: "JSON output" },
173
+ { name: "--help", desc: "Show help" },
174
+ ],
175
+ },
176
+ {
177
+ name: "emit",
178
+ desc: "Render and write prompt to a file",
179
+ flags: [
180
+ { name: "--all", desc: "Emit all active prompts" },
181
+ { name: "--check", desc: "Check if emitted files are up to date" },
182
+ { name: "--out", desc: "Custom output path", takesValue: true },
183
+ { name: "--out-dir", desc: "Custom output directory", takesValue: true },
184
+ { name: "--force", desc: "Overwrite even if unchanged" },
185
+ { name: "--dry-run", desc: "Show what would be emitted" },
186
+ { name: "--json", desc: "JSON output" },
187
+ { name: "--help", desc: "Show help" },
188
+ ],
189
+ },
190
+ {
191
+ name: "schema",
192
+ desc: "Schema management",
193
+ flags: [{ name: "--help", desc: "Show help" }],
194
+ subcommands: [
195
+ {
196
+ name: "create",
197
+ desc: "Create a validation schema",
198
+ flags: [
199
+ { name: "--name", desc: "Schema name", takesValue: true },
200
+ { name: "--required", desc: "Required sections (comma-separated)", takesValue: true },
201
+ { name: "--optional", desc: "Optional sections (comma-separated)", takesValue: true },
202
+ { name: "--json", desc: "JSON output" },
203
+ ],
204
+ },
205
+ {
206
+ name: "show",
207
+ desc: "Show schema details",
208
+ flags: [{ name: "--json", desc: "JSON output" }],
209
+ },
210
+ {
211
+ name: "list",
212
+ desc: "List all schemas",
213
+ flags: [{ name: "--json", desc: "JSON output" }],
214
+ },
215
+ {
216
+ name: "rule",
217
+ desc: "Manage schema rules",
218
+ flags: [
219
+ { name: "--section", desc: "Section to validate", takesValue: true },
220
+ { name: "--pattern", desc: "Regex pattern", takesValue: true },
221
+ { name: "--message", desc: "Error message", takesValue: true },
222
+ { name: "--json", desc: "JSON output" },
223
+ ],
224
+ },
225
+ ],
226
+ },
227
+ {
228
+ name: "validate",
229
+ desc: "Validate a prompt against its schema",
230
+ flags: [
231
+ { name: "--all", desc: "Validate all prompts with schemas" },
232
+ { name: "--json", desc: "JSON output" },
233
+ { name: "--help", desc: "Show help" },
234
+ ],
235
+ },
236
+ {
237
+ name: "import",
238
+ desc: "Import an existing .md file as a prompt",
239
+ flags: [
240
+ { name: "--name", desc: "Prompt name", takesValue: true },
241
+ { name: "--no-split", desc: "Import as single body section" },
242
+ { name: "--tag", desc: "Add tag", takesValue: true },
243
+ { name: "--json", desc: "JSON output" },
244
+ { name: "--help", desc: "Show help" },
245
+ ],
246
+ },
247
+ {
248
+ name: "prime",
249
+ desc: "Output workflow context for AI agents",
250
+ flags: [
251
+ { name: "--compact", desc: "Output minimal quick-reference" },
252
+ { name: "--export", desc: "Output default template" },
253
+ { name: "--json", desc: "JSON output" },
254
+ { name: "--help", desc: "Show help" },
255
+ ],
256
+ },
257
+ {
258
+ name: "onboard",
259
+ desc: "Add trellis section to CLAUDE.md",
260
+ flags: [
261
+ { name: "--check", desc: "Report status without writing" },
262
+ { name: "--stdout", desc: "Print snippet to stdout" },
263
+ { name: "--json", desc: "JSON output" },
264
+ { name: "--help", desc: "Show help" },
265
+ ],
266
+ },
267
+ {
268
+ name: "pin",
269
+ desc: "Pin prompt to a specific version",
270
+ flags: [
271
+ { name: "--json", desc: "JSON output" },
272
+ { name: "--help", desc: "Show help" },
273
+ ],
274
+ },
275
+ {
276
+ name: "unpin",
277
+ desc: "Remove version pin from a prompt",
278
+ flags: [
279
+ { name: "--json", desc: "JSON output" },
280
+ { name: "--help", desc: "Show help" },
281
+ ],
282
+ },
283
+ {
284
+ name: "doctor",
285
+ desc: "Check project health and data integrity",
286
+ flags: [
287
+ { name: "--fix", desc: "Fix auto-fixable issues" },
288
+ { name: "--verbose", desc: "Show all check results" },
289
+ { name: "--json", desc: "JSON output" },
290
+ { name: "--help", desc: "Show help" },
291
+ ],
292
+ },
293
+ {
294
+ name: "upgrade",
295
+ desc: "Upgrade trellis to the latest version",
296
+ flags: [
297
+ { name: "--check", desc: "Check for updates without installing" },
298
+ { name: "--json", desc: "JSON output" },
299
+ { name: "--help", desc: "Show help" },
300
+ ],
301
+ },
302
+ {
303
+ name: "completions",
304
+ desc: "Generate shell completions",
305
+ flags: [{ name: "--help", desc: "Show help" }],
306
+ },
307
+ ] as const;
308
+
309
+ const BIN = "tl";
310
+
311
+ export function generateBash(): string {
312
+ const lines: string[] = [
313
+ `# Bash completion for ${BIN}`,
314
+ `# Source this file to enable completions:`,
315
+ `# source <(${BIN} completions bash)`,
316
+ "",
317
+ `_${BIN}() {`,
318
+ " local cur prev words cword",
319
+ " _init_completion || return",
320
+ "",
321
+ ` local commands='${COMMANDS.map((c) => c.name).join(" ")}'`,
322
+ "",
323
+ " # Top-level completion",
324
+ " if [[ $cword -eq 1 ]]; then",
325
+ ' COMPREPLY=($(compgen -W "$commands --help --version --timing" -- "$cur"))',
326
+ " return",
327
+ " fi",
328
+ "",
329
+ ` local command="\${words[1]}"`,
330
+ "",
331
+ ];
332
+
333
+ for (const cmd of COMMANDS) {
334
+ lines.push(` if [[ $command == "${cmd.name}" ]]; then`);
335
+
336
+ if (cmd.subcommands && cmd.subcommands.length > 0) {
337
+ const subcmdNames = cmd.subcommands.map((s) => s.name).join(" ");
338
+ lines.push(" if [[ $cword -eq 2 ]]; then");
339
+ lines.push(` COMPREPLY=($(compgen -W "${subcmdNames}" -- "$cur"))`);
340
+ lines.push(" return");
341
+ lines.push(" fi");
342
+
343
+ for (const subcmd of cmd.subcommands) {
344
+ if (subcmd.flags && subcmd.flags.length > 0) {
345
+ const subcmdFlags = subcmd.flags.map((f) => f.name).join(" ");
346
+ lines.push(` if [[ \${words[2]} == "${subcmd.name}" ]]; then`);
347
+ lines.push(` COMPREPLY=($(compgen -W "${subcmdFlags}" -- "$cur"))`);
348
+ lines.push(" return");
349
+ lines.push(" fi");
350
+ }
351
+ }
352
+ }
353
+
354
+ if (cmd.flags && cmd.flags.length > 0) {
355
+ const cmdFlags = cmd.flags.map((f) => f.name).join(" ");
356
+ lines.push(` COMPREPLY=($(compgen -W "${cmdFlags}" -- "$cur"))`);
357
+ lines.push(" return");
358
+ }
359
+
360
+ lines.push(" fi");
361
+ lines.push("");
362
+ }
363
+
364
+ lines.push(" return 0");
365
+ lines.push("}");
366
+ lines.push("");
367
+ lines.push(`complete -F _${BIN} ${BIN}`);
368
+
369
+ return lines.join("\n");
370
+ }
371
+
372
+ export function generateZsh(): string {
373
+ const lines: string[] = [
374
+ `#compdef ${BIN}`,
375
+ `# Zsh completion for ${BIN}`,
376
+ `# Place this file in your fpath or source it:`,
377
+ `# source <(${BIN} completions zsh)`,
378
+ "",
379
+ `_${BIN}() {`,
380
+ " local -a commands",
381
+ " commands=(",
382
+ ];
383
+
384
+ for (const cmd of COMMANDS) {
385
+ lines.push(` '${cmd.name}:${cmd.desc}'`);
386
+ }
387
+ lines.push(" )");
388
+ lines.push("");
389
+
390
+ lines.push(" local -a global_opts");
391
+ lines.push(" global_opts=(");
392
+ lines.push(" '--help[Show help]'");
393
+ lines.push(" '--version[Show version]'");
394
+ lines.push(" '--json[Output as JSON]'");
395
+ lines.push(" '--quiet[Suppress non-error output]'");
396
+ lines.push(" '--verbose[Extra diagnostic output]'");
397
+ lines.push(" '--timing[Show command execution time]'");
398
+ lines.push(" )");
399
+ lines.push("");
400
+
401
+ lines.push(" if (( CURRENT == 2 )); then");
402
+ lines.push(" _describe 'command' commands");
403
+ lines.push(" _arguments $global_opts");
404
+ lines.push(" return");
405
+ lines.push(" fi");
406
+ lines.push("");
407
+
408
+ lines.push(' local command="$words[2]"');
409
+ lines.push("");
410
+ lines.push(' case "$command" in');
411
+
412
+ for (const cmd of COMMANDS) {
413
+ lines.push(` ${cmd.name})`);
414
+
415
+ if (cmd.subcommands && cmd.subcommands.length > 0) {
416
+ lines.push(" local -a subcommands");
417
+ lines.push(" subcommands=(");
418
+ for (const subcmd of cmd.subcommands) {
419
+ lines.push(` '${subcmd.name}:${subcmd.desc}'`);
420
+ }
421
+ lines.push(" )");
422
+ lines.push("");
423
+ lines.push(" if (( CURRENT == 3 )); then");
424
+ lines.push(" _describe 'subcommand' subcommands");
425
+ lines.push(" return");
426
+ lines.push(" fi");
427
+
428
+ for (const subcmd of cmd.subcommands) {
429
+ if (subcmd.flags && subcmd.flags.length > 0) {
430
+ lines.push(` if [[ $words[3] == "${subcmd.name}" ]]; then`);
431
+ lines.push(" _arguments \\");
432
+ for (const flag of subcmd.flags) {
433
+ if (flag.values) {
434
+ const vals = flag.values.join(" ");
435
+ lines.push(` '${flag.name}[${flag.desc}]:value:(${vals})' \\`);
436
+ } else if (flag.takesValue) {
437
+ lines.push(` '${flag.name}[${flag.desc}]:value:' \\`);
438
+ } else {
439
+ lines.push(` '${flag.name}[${flag.desc}]' \\`);
440
+ }
441
+ }
442
+ const lastLine = lines[lines.length - 1];
443
+ if (lastLine) {
444
+ lines[lines.length - 1] = lastLine.replace(" \\", "");
445
+ }
446
+ lines.push(" return");
447
+ lines.push(" fi");
448
+ }
449
+ }
450
+ }
451
+
452
+ if (cmd.flags && cmd.flags.length > 0) {
453
+ lines.push(" _arguments \\");
454
+ for (const flag of cmd.flags) {
455
+ if (flag.values) {
456
+ const vals = flag.values.join(" ");
457
+ lines.push(` '${flag.name}[${flag.desc}]:value:(${vals})' \\`);
458
+ } else if (flag.takesValue) {
459
+ lines.push(` '${flag.name}[${flag.desc}]:value:' \\`);
460
+ } else {
461
+ lines.push(` '${flag.name}[${flag.desc}]' \\`);
462
+ }
463
+ }
464
+ const lastLine = lines[lines.length - 1];
465
+ if (lastLine) {
466
+ lines[lines.length - 1] = lastLine.replace(" \\", "");
467
+ }
468
+ }
469
+
470
+ lines.push(" ;;");
471
+ }
472
+
473
+ lines.push(" esac");
474
+ lines.push("}");
475
+ lines.push("");
476
+ lines.push(`_${BIN} "$@"`);
477
+
478
+ return lines.join("\n");
479
+ }
480
+
481
+ export function generateFish(): string {
482
+ const lines: string[] = [
483
+ `# Fish completion for ${BIN}`,
484
+ `# Place this file in ~/.config/fish/completions/${BIN}.fish or source it:`,
485
+ `# ${BIN} completions fish | source`,
486
+ "",
487
+ `# Remove all existing completions for ${BIN}`,
488
+ `complete -c ${BIN} -e`,
489
+ "",
490
+ "# Global options",
491
+ `complete -c ${BIN} -l help -d 'Show help'`,
492
+ `complete -c ${BIN} -l version -d 'Show version'`,
493
+ `complete -c ${BIN} -l json -d 'Output as JSON'`,
494
+ `complete -c ${BIN} -l quiet -d 'Suppress non-error output'`,
495
+ `complete -c ${BIN} -l verbose -d 'Extra diagnostic output'`,
496
+ `complete -c ${BIN} -l timing -d 'Show command execution time'`,
497
+ "",
498
+ ];
499
+
500
+ for (const cmd of COMMANDS) {
501
+ lines.push(`# ${cmd.desc}`);
502
+ lines.push(
503
+ `complete -c ${BIN} -f -n '__fish_use_subcommand' -a '${cmd.name}' -d '${cmd.desc}'`,
504
+ );
505
+
506
+ if (cmd.subcommands && cmd.subcommands.length > 0) {
507
+ for (const subcmd of cmd.subcommands) {
508
+ lines.push(
509
+ `complete -c ${BIN} -f -n '__fish_seen_subcommand_from ${cmd.name}; and not __fish_seen_subcommand_from ${cmd.subcommands.map((s) => s.name).join(" ")}' -a '${subcmd.name}' -d '${subcmd.desc}'`,
510
+ );
511
+
512
+ if (subcmd.flags && subcmd.flags.length > 0) {
513
+ for (const flag of subcmd.flags) {
514
+ const flagName = flag.name.replace(/^--/, "");
515
+ const cond = `'__fish_seen_subcommand_from ${cmd.name}; and __fish_seen_subcommand_from ${subcmd.name}'`;
516
+
517
+ if (flag.values) {
518
+ lines.push(
519
+ `complete -c ${BIN} -f -n ${cond} -l '${flagName}' -d '${flag.desc}' -xa '${flag.values.join(" ")}'`,
520
+ );
521
+ } else if (flag.takesValue) {
522
+ lines.push(`complete -c ${BIN} -n ${cond} -l '${flagName}' -d '${flag.desc}'`);
523
+ } else {
524
+ lines.push(`complete -c ${BIN} -f -n ${cond} -l '${flagName}' -d '${flag.desc}'`);
525
+ }
526
+ }
527
+ }
528
+ }
529
+ }
530
+
531
+ if (cmd.flags && cmd.flags.length > 0) {
532
+ for (const flag of cmd.flags) {
533
+ const flagName = flag.name.replace(/^--/, "");
534
+ const cond = `'__fish_seen_subcommand_from ${cmd.name}'`;
535
+
536
+ if (flag.values) {
537
+ lines.push(
538
+ `complete -c ${BIN} -f -n ${cond} -l '${flagName}' -d '${flag.desc}' -xa '${flag.values.join(" ")}'`,
539
+ );
540
+ } else if (flag.takesValue) {
541
+ lines.push(`complete -c ${BIN} -n ${cond} -l '${flagName}' -d '${flag.desc}'`);
542
+ } else {
543
+ lines.push(`complete -c ${BIN} -f -n ${cond} -l '${flagName}' -d '${flag.desc}'`);
544
+ }
545
+ }
546
+ }
547
+
548
+ lines.push("");
549
+ }
550
+
551
+ return lines.join("\n");
552
+ }
553
+
554
+ /**
555
+ * Register the `tl completions` command.
556
+ */
557
+ export function registerCompletionsCommand(program: Command): void {
558
+ program
559
+ .command("completions")
560
+ .description("Generate shell completions")
561
+ .argument("<shell>", "Shell to generate completions for (bash, zsh, fish)")
562
+ .action((shell: string) => {
563
+ completionsCommand([shell], program.opts().json ?? false);
564
+ });
565
+ }
566
+
567
+ export function completionsCommand(args: string[], json = false): void {
568
+ const shell = args[0];
569
+
570
+ if (!shell) {
571
+ if (json) {
572
+ jsonOut({ success: false, command: "completions", error: "Missing shell argument" });
573
+ } else {
574
+ errorOut("Error: missing shell argument");
575
+ process.stderr.write("Usage: tl completions <bash|zsh|fish>\n");
576
+ }
577
+ throw new ExitError(1);
578
+ }
579
+
580
+ let script: string;
581
+ switch (shell.toLowerCase()) {
582
+ case "bash":
583
+ script = generateBash();
584
+ break;
585
+ case "zsh":
586
+ script = generateZsh();
587
+ break;
588
+ case "fish":
589
+ script = generateFish();
590
+ break;
591
+ default:
592
+ if (json) {
593
+ jsonOut({
594
+ success: false,
595
+ command: "completions",
596
+ error: `Unknown shell: ${shell}`,
597
+ supported: ["bash", "zsh", "fish"],
598
+ });
599
+ } else {
600
+ errorOut(`Error: unknown shell '${shell}'`);
601
+ process.stderr.write("Supported shells: bash, zsh, fish\n");
602
+ }
603
+ throw new ExitError(1);
604
+ }
605
+
606
+ if (!isQuiet()) {
607
+ process.stdout.write(script);
608
+ process.stdout.write("\n");
609
+ }
610
+ }