@iowarp/clio-coder 0.4.2 → 0.4.4

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 (523) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/CONTRIBUTING.md +86 -19
  3. package/README.md +35 -6
  4. package/dist/{acp-TMDQZDIG.js → acp-WNAYYF4F.js} +12 -13
  5. package/dist/{agents-5N5NG3XG.js → agents-3OKXHLOI.js} +60 -57
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-Z5CCBXKQ.js → auth-VKNNMGPU.js} +21 -19
  8. package/dist/{builtins-K6TNDT24.js → builtins-WGALA46I.js} +9 -4
  9. package/dist/{chunk-XE3PCIXH.js → chunk-23L32XTI.js} +12 -9
  10. package/dist/{chunk-I64IFBLB.js → chunk-25QBEXRS.js} +18 -11
  11. package/dist/{chunk-CDNVLKUX.js → chunk-26QSH3EJ.js} +13 -7
  12. package/dist/{chunk-QQLGQY2A.js → chunk-2ASED4PZ.js} +22 -22
  13. package/dist/{chunk-MCEPRMZW.js → chunk-2CU2H6KE.js} +2 -2
  14. package/dist/chunk-2DSOYNFC.js +108 -0
  15. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  16. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  17. package/dist/{chunk-O3YUNJZ2.js → chunk-2ZSONWVL.js} +82 -25
  18. package/dist/{chunk-2NHR3NAY.js → chunk-36CT5VVL.js} +331 -42
  19. package/dist/{chunk-2X4RYJTJ.js → chunk-3GY4F45V.js} +3 -3
  20. package/dist/{chunk-ZW55JB7N.js → chunk-3ODX73FK.js} +4 -6
  21. package/dist/{chunk-PBP4B7XR.js → chunk-3UNOLWNZ.js} +3 -3
  22. package/dist/{chunk-4JDLP6ZS.js → chunk-3UUXNFEX.js} +14 -10
  23. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  24. package/dist/{chunk-ZW4HH5JJ.js → chunk-4M6Z5QVF.js} +6 -6
  25. package/dist/{chunk-K6BSR66V.js → chunk-4NSRCOYP.js} +4 -1
  26. package/dist/{chunk-M2DAX4F6.js → chunk-4WR7VSYB.js} +2 -2
  27. package/dist/{chunk-FSP7CMNU.js → chunk-54X7T7DK.js} +61 -6
  28. package/dist/{chunk-54ODD65L.js → chunk-5636DCO5.js} +4 -4
  29. package/dist/chunk-57XXR6DR.js +3763 -0
  30. package/dist/{chunk-3KIPBMUA.js → chunk-5ICU3EUH.js} +2 -2
  31. package/dist/{chunk-77QIVUZB.js → chunk-5MEZN6CB.js} +4 -4
  32. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  33. package/dist/{chunk-YJISEZKC.js → chunk-5TUB6SLS.js} +6 -6
  34. package/dist/{chunk-IMXMHHMQ.js → chunk-6OSVSQL5.js} +341 -57
  35. package/dist/{chunk-Q4XWMHX6.js → chunk-6PAZTBPA.js} +14 -2
  36. package/dist/{chunk-FVDGR2ZL.js → chunk-6Q3CYFD3.js} +112 -39
  37. package/dist/{chunk-IDNA72AH.js → chunk-6QOTUPRG.js} +155 -36
  38. package/dist/{chunk-X7IARSHT.js → chunk-6UINWWS6.js} +16 -10
  39. package/dist/{chunk-CYZW7JHJ.js → chunk-72YIHOZQ.js} +9 -9
  40. package/dist/{chunk-IKSLQ4XV.js → chunk-75W7L2E2.js} +752 -861
  41. package/dist/{chunk-CRFOIAX3.js → chunk-7UGL4MB5.js} +6 -6
  42. package/dist/{chunk-HIICAHCJ.js → chunk-AUPNRN7C.js} +2 -2
  43. package/dist/{chunk-7BHIY2MW.js → chunk-BJVFZO5U.js} +8 -50
  44. package/dist/{chunk-B74PXLU7.js → chunk-CUSRQKPU.js} +65 -3
  45. package/dist/chunk-DQOVN6KV.js +386 -0
  46. package/dist/{chunk-E7GT7O5N.js → chunk-DT3LWJOB.js} +7 -4
  47. package/dist/chunk-DXKJURES.js +671 -0
  48. package/dist/{chunk-JBCS7CRR.js → chunk-EL24TAU4.js} +10 -10
  49. package/dist/{chunk-TPEQIQIE.js → chunk-ELWDPP3Y.js} +8 -8
  50. package/dist/{chunk-NDINPTJ4.js → chunk-ELZVTCGV.js} +5 -4
  51. package/dist/chunk-EXLD33WO.js +381 -0
  52. package/dist/chunk-FEAXX7B6.js +101 -0
  53. package/dist/{chunk-RLYRBIYQ.js → chunk-FFUPXJC4.js} +90 -331
  54. package/dist/{chunk-5PFYMY2V.js → chunk-FTMGRKEF.js} +2 -2
  55. package/dist/{chunk-34BHNEE3.js → chunk-GHS5EBTQ.js} +58 -7
  56. package/dist/{chunk-DYHAXKHD.js → chunk-GWZNEVM2.js} +12 -8
  57. package/dist/chunk-GX5WYQO4.js +59 -0
  58. package/dist/chunk-GYV6VZOC.js +26 -0
  59. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  60. package/dist/chunk-I2DWJ4GM.js +390 -0
  61. package/dist/{chunk-TXOTCRLG.js → chunk-I5FWO7L5.js} +5 -5
  62. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  63. package/dist/{chunk-XQRY4DTA.js → chunk-IGLP3ODT.js} +10 -10
  64. package/dist/chunk-IRXAATOX.js +539 -0
  65. package/dist/chunk-IXIY2H4R.js +44 -0
  66. package/dist/{chunk-SSEYRH53.js → chunk-IZXGRF7P.js} +92 -147
  67. package/dist/{chunk-5TSRNF4G.js → chunk-JCI2ROMZ.js} +164 -6
  68. package/dist/{chunk-JWJGP5DQ.js → chunk-JEIYHLOR.js} +7 -7
  69. package/dist/{chunk-F2I26BDK.js → chunk-JQLNNIKT.js} +4 -4
  70. package/dist/{chunk-BYMNWQ7O.js → chunk-JSD46VO2.js} +315 -63
  71. package/dist/{chunk-AK5XEFVZ.js → chunk-JT2RFCC5.js} +64 -14
  72. package/dist/{chunk-MCMZMDAC.js → chunk-K6T2ZAMZ.js} +168 -6
  73. package/dist/{chunk-PGF63K6I.js → chunk-KFV5L5SK.js} +73 -4
  74. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  75. package/dist/{chunk-PJX3WQUQ.js → chunk-LLXSDWXS.js} +3 -3
  76. package/dist/{chunk-DZAW46HP.js → chunk-LTIKRKFL.js} +3 -3
  77. package/dist/{chunk-DZEK6CJN.js → chunk-N56KALIC.js} +21 -21
  78. package/dist/{chunk-B7HM5Z7T.js → chunk-NAI6ZFCY.js} +9 -5
  79. package/dist/{chunk-I66ZTYNP.js → chunk-NRO2BJRH.js} +2656 -2213
  80. package/dist/{chunk-ZGNYYXQ6.js → chunk-NXIMQY5W.js} +3 -3
  81. package/dist/{chunk-IKOZFYBN.js → chunk-NXYCB2VD.js} +149 -106
  82. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  83. package/dist/{chunk-462T4EGZ.js → chunk-O5CVSAG5.js} +2 -2
  84. package/dist/chunk-ODGTEFFI.js +50 -0
  85. package/dist/{chunk-3F7VUY77.js → chunk-OEJSLEPW.js} +2 -2
  86. package/dist/{chunk-KKOJXO6R.js → chunk-OMQNJVKW.js} +4 -2
  87. package/dist/{chunk-5KW52TEP.js → chunk-Q4WO54TA.js} +132 -77
  88. package/dist/{chunk-W6NIE6OW.js → chunk-QUFRYSWI.js} +13 -7
  89. package/dist/{chunk-42FMPA75.js → chunk-QZWQA4DE.js} +2 -2
  90. package/dist/chunk-R6Q67RJH.js +134 -0
  91. package/dist/{chunk-W4YEMFBX.js → chunk-RAY4OVGZ.js} +3 -3
  92. package/dist/{chunk-ZNT2M6TG.js → chunk-RQCKCSRL.js} +17 -17
  93. package/dist/{chunk-LJID3DYZ.js → chunk-RXTN6AKH.js} +3 -3
  94. package/dist/{chunk-P75RZCJW.js → chunk-RZDWV63N.js} +3 -3
  95. package/dist/{chunk-UH632ZYL.js → chunk-S6PYF2XF.js} +2 -2
  96. package/dist/{chunk-HJWWJ6IL.js → chunk-TOIVGRUX.js} +17 -5
  97. package/dist/{chunk-HLAFFSEK.js → chunk-TQAHXW6Y.js} +2 -2
  98. package/dist/{chunk-JIEGK6UF.js → chunk-U6TMQNSI.js} +48 -4
  99. package/dist/{chunk-2HFQNRV3.js → chunk-UEPWCCTY.js} +12 -12
  100. package/dist/chunk-UOIZ7DA4.js +41 -0
  101. package/dist/{chunk-UH347SHR.js → chunk-USR47QNF.js} +11 -11
  102. package/dist/{chunk-AZ4WMN4W.js → chunk-V6HJFQZE.js} +2 -2
  103. package/dist/chunk-V76WTFTW.js +318 -0
  104. package/dist/{chunk-NMJXSHBJ.js → chunk-W54I7H25.js} +2 -2
  105. package/dist/{chunk-KPXDY6QF.js → chunk-XRZT5WY5.js} +2 -2
  106. package/dist/{chunk-UBRFI4HS.js → chunk-XULDXHTN.js} +142 -50
  107. package/dist/chunk-XXYSBZIQ.js +283 -0
  108. package/dist/{chunk-HKMD33FO.js → chunk-Y55JBDO5.js} +405 -122
  109. package/dist/{chunk-XOXV5GKE.js → chunk-YD5GIKET.js} +17 -8
  110. package/dist/{chunk-XGDPUNND.js → chunk-YECAMM3D.js} +2 -2
  111. package/dist/{chunk-BO7Y52RY.js → chunk-YNFKXPEC.js} +7 -7
  112. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  113. package/dist/{chunk-M2WXEHER.js → chunk-ZA4VCIGV.js} +2 -2
  114. package/dist/cli/index.js +42 -40
  115. package/dist/{clio-7VB377CC.js → clio-QLICPCF5.js} +7 -7
  116. package/dist/{code-nav-YVLCYA7V.js → code-nav-IJR2DBPR.js} +9 -9
  117. package/dist/{components-UBWCQSRW.js → components-2TGAI2RC.js} +5 -6
  118. package/dist/{config-4HVOS65E.js → config-IUA6OYNS.js} +88 -81
  119. package/dist/{configure-PIWO7B24.js → configure-VEPX4NMX.js} +26 -25
  120. package/dist/{context-KQYIWPWT.js → context-2DKHWH2T.js} +60 -45
  121. package/dist/{context-IYEHL3WQ.js → context-4MPR7WKB.js} +78 -69
  122. package/dist/{context-N6ZE3LGJ.js → context-BOYF5EJM.js} +15 -11
  123. package/dist/{context-clear-G4OGZJDS.js → context-clear-S4ZJCQUX.js} +73 -65
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-BWLF6LJP.js → context-working-set-3I3FYX6Y.js} +18 -17
  126. package/dist/detail-A7JAVSIG.js +98 -0
  127. package/dist/{dispatch-runner-2QQAITS3.js → dispatch-runner-RJ5I2F2O.js} +99 -75
  128. package/dist/{docs-PD3EXDKU.js → docs-SPOV3BAN.js} +3 -5
  129. package/dist/{doctor-LHBD36VU.js → doctor-DKICC2SN.js} +71 -48
  130. package/dist/{eval-C45FYRJ6.js → eval-OQOQUDHK.js} +308 -146
  131. package/dist/{eval-inventory-6DEJPLBF.js → eval-inventory-Y6QRFOH5.js} +4 -4
  132. package/dist/{evidence-6SHONYAF.js → evidence-4DQ25GUQ.js} +79 -175
  133. package/dist/evidence-4F5USFKH.js +208 -0
  134. package/dist/{evolve-KRKMV72X.js → evolve-GSS52E5J.js} +71 -67
  135. package/dist/{extensions-KPZ2UHBB.js → extensions-G7MFLYHT.js} +8 -9
  136. package/dist/{fleet-IVTCKDHT.js → fleet-Q37YHHAQ.js} +126 -118
  137. package/dist/{fleet-commands-EDWL3IT7.js → fleet-commands-G7E4N7SM.js} +16 -13
  138. package/dist/{fleet-decisions-YP3YEFGK.js → fleet-decisions-O7M6QBA2.js} +9 -8
  139. package/dist/{fleet-graph-ZFWKHY2M.js → fleet-graph-TOUBW6OW.js} +21 -20
  140. package/dist/{fleet-inspect-FVUNCBML.js → fleet-inspect-SW33JJNI.js} +65 -60
  141. package/dist/{fleet-preflight-UN5XED4R.js → fleet-preflight-CV2655TW.js} +4 -5
  142. package/dist/{fleet-validate-XOWC4HSX.js → fleet-validate-KESZX2YH.js} +25 -24
  143. package/dist/{fleet-verify-UN3SODEL.js → fleet-verify-UQPMTVE3.js} +66 -61
  144. package/dist/{fleet-view-TWHJKCN6.js → fleet-view-MN2VG4MR.js} +65 -60
  145. package/dist/{init-T2QORQ3Y.js → init-PXEXQSBF.js} +90 -82
  146. package/dist/{interop-IN5I2A66.js → interop-ZG5T62U3.js} +12 -13
  147. package/dist/inventory-C26CFDRR.js +101 -0
  148. package/dist/{library-LSCATDLZ.js → library-B2W4N74O.js} +29 -29
  149. package/dist/{memory-HYOKAGGJ.js → memory-YCANYS5A.js} +73 -69
  150. package/dist/{models-2GPMFYCM.js → models-GERTU3YI.js} +51 -47
  151. package/dist/{monitor-E4ASVUJH.js → monitor-CPNIUULB.js} +74 -67
  152. package/dist/{orchestrator-DDMPR3PY.js → orchestrator-J4BSH4WQ.js} +1288 -1606
  153. package/dist/{panes-E3RUXOW5.js → panes-BOHAEGYC.js} +4 -4
  154. package/dist/{panes-IXKLOKA2.js → panes-NXSLDQZ2.js} +10 -11
  155. package/dist/{paths-L7LGY6RN.js → paths-VSUWNC22.js} +6 -7
  156. package/dist/reset-TNWTB5LU.js +343 -0
  157. package/dist/{resources-OTRSN34L.js → resources-4PXNMD5G.js} +29 -22
  158. package/dist/{run-5DEYH5QK.js → run-D6XJ34CN.js} +132 -132
  159. package/dist/{share-IHWTLO3M.js → share-2NWMJJEE.js} +27 -27
  160. package/dist/{skills-IYMXMKW4.js → skills-KR7WON5G.js} +40 -33
  161. package/dist/{skills-eval-DROHSJAR.js → skills-eval-O2ZNOLDS.js} +81 -77
  162. package/dist/{skills-inventory-D7X4L4ZX.js → skills-inventory-ZZOUBK7O.js} +23 -22
  163. package/dist/{slash-commands-QBM7UZ3B.js → slash-commands-ZXPJD64J.js} +47 -37
  164. package/dist/{steer-Z5DO23FJ.js → steer-XA25PSCS.js} +4 -4
  165. package/dist/{support-U7QOWY26.js → support-7EMVWYG2.js} +6 -6
  166. package/dist/{targets-P2FUC4IL.js → targets-OMH2XCSN.js} +50 -49
  167. package/dist/tasks-IPAGMEIX.js +36 -0
  168. package/dist/{terminal-lease-YREJ3JX2.js → terminal-lease-C2J3JYRE.js} +4 -4
  169. package/dist/{tools-5B7RO6MV.js → tools-EFFEAIDP.js} +8 -9
  170. package/dist/{trace-YMGMUM6A.js → trace-FXMXUZUF.js} +7 -7
  171. package/dist/uninstall-HALS6BLF.js +407 -0
  172. package/dist/upgrade-MS72RJEP.js +306 -0
  173. package/dist/{usage-ME5MPXGX.js → usage-NHG6MCJM.js} +162 -108
  174. package/dist/{verifiers-BVZ7IWOO.js → verifiers-7AUNVXDY.js} +155 -22
  175. package/dist/{verify-5K7ZKQFC.js → verify-FWYGPKMR.js} +14 -12
  176. package/dist/{web-fetch-MPARV2K7.js → web-fetch-V4FKSDAV.js} +4 -4
  177. package/dist/{wiki-generate-F5W5QTYY.js → wiki-generate-743CIGJW.js} +99 -90
  178. package/dist/{with-panes-BYOJCLAM.js → with-panes-BDQEWBRT.js} +10 -10
  179. package/dist/worker/entry.js +72 -68
  180. package/docs/README.md +3 -2
  181. package/docs/architecture/acp.md +17 -0
  182. package/docs/architecture/artifact-placement.md +1 -0
  183. package/docs/architecture/artifact-versions.md +2 -2
  184. package/docs/architecture/context-engine.md +4 -0
  185. package/docs/architecture/dispatch-typed-intent.md +1 -1
  186. package/docs/architecture/evidence-and-memory.md +1 -1
  187. package/docs/architecture/middleware-and-components.md +1 -1
  188. package/docs/architecture/model-catalog.md +21 -10
  189. package/docs/architecture/observability.md +19 -2
  190. package/docs/architecture/prompt-envelope-and-tools.md +17 -5
  191. package/docs/architecture/provider-adapter-cookbook.md +63 -0
  192. package/docs/architecture/safety-model.md +25 -22
  193. package/docs/architecture/tui-design.md +1 -1
  194. package/docs/guide/built-in-agents.md +25 -11
  195. package/docs/guide/commands-and-modes.md +18 -3
  196. package/docs/guide/configuration-and-targets.md +100 -10
  197. package/docs/guide/configuration-reference.md +17 -7
  198. package/docs/guide/environment-variables.md +4 -2
  199. package/docs/guide/installation-and-lifecycle.md +37 -4
  200. package/docs/guide/proactive-memory.md +66 -55
  201. package/docs/guide/skills-marketplace.md +18 -0
  202. package/docs/guide/tool-usage.md +78 -3
  203. package/docs/history/config-knobs-audit.md +2 -2
  204. package/docs/process/development-pipeline.md +40 -2
  205. package/docs/process/eval-runner.md +67 -3
  206. package/docs/process/git-commit-provenance.md +15 -0
  207. package/docs/process/release-cut-checklist.md +207 -0
  208. package/docs/process/scientific-validation.md +18 -17
  209. package/evals/behavioral-machinery-support.ts +1 -0
  210. package/evals/behavioral-machinery.yaml +1 -1
  211. package/evals/behavioral-model.yaml +3 -2
  212. package/package.json +2 -2
  213. package/skills/README.md +7 -5
  214. package/skills/coding/ast-grep/SKILL.md +101 -30
  215. package/skills/coding/ast-grep/evals.md +26 -0
  216. package/skills/coding/coding-standards/SKILL.md +47 -2
  217. package/skills/coding/coding-standards/evals.md +23 -0
  218. package/skills/coding/prototype/SKILL.md +87 -28
  219. package/skills/coding/prototype/evals.md +19 -0
  220. package/skills/coding/tdd/SKILL.md +80 -53
  221. package/skills/coding/tdd/evals.md +20 -0
  222. package/skills/context/context-handoff/SKILL.md +43 -2
  223. package/skills/context/context-handoff/evals.md +44 -0
  224. package/skills/context/context-prime/SKILL.md +45 -15
  225. package/skills/context/context-prime/evals.md +45 -0
  226. package/skills/git/branch-closeout/SKILL.md +132 -0
  227. package/skills/git/branch-closeout/evals.md +133 -0
  228. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  229. package/skills/git/file-ticket/SKILL.md +77 -63
  230. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  231. package/skills/git/file-ticket/evals.md +31 -26
  232. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  233. package/skills/git/fix-issue/SKILL.md +87 -64
  234. package/skills/git/fix-issue/evals.md +35 -31
  235. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  236. package/skills/git/resolve-merge-conflicts/SKILL.md +100 -51
  237. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  238. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  239. package/skills/git/ship/SKILL.md +103 -67
  240. package/skills/git/ship/assets/pr-template.md +21 -0
  241. package/skills/git/ship/evals.md +44 -28
  242. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  243. package/skills/git/worktree-create/SKILL.md +80 -50
  244. package/skills/git/worktree-create/evals.md +40 -33
  245. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  246. package/skills/git/worktree-merge/SKILL.md +112 -65
  247. package/skills/git/worktree-merge/evals.md +42 -34
  248. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  249. package/skills/planning/archify/SKILL.md +196 -0
  250. package/skills/planning/archify/evals.md +65 -0
  251. package/skills/planning/architecture/SKILL.md +61 -12
  252. package/skills/planning/architecture/evals.md +65 -0
  253. package/skills/planning/backlog/SKILL.md +130 -14
  254. package/skills/planning/backlog/evals.md +142 -0
  255. package/skills/planning/prd/SKILL.md +47 -6
  256. package/skills/planning/prd/evals.md +54 -0
  257. package/skills/planning/product-intent/SKILL.md +57 -2
  258. package/skills/planning/product-intent/evals.md +70 -0
  259. package/skills/planning/tech-spec/SKILL.md +53 -2
  260. package/skills/planning/tech-spec/evals.md +73 -0
  261. package/skills/registry.yaml +58 -50
  262. package/skills/remote.yaml +13 -0
  263. package/skills/research/arxiv-literature/SKILL.md +76 -18
  264. package/skills/research/arxiv-literature/evals.md +50 -0
  265. package/skills/research/experiment-protocol/SKILL.md +20 -1
  266. package/skills/research/experiment-protocol/evals.md +23 -0
  267. package/skills/research/scientific-debugging/SKILL.md +24 -1
  268. package/skills/research/scientific-debugging/evals.md +18 -0
  269. package/skills/research/scientific-modernization/SKILL.md +26 -1
  270. package/skills/research/scientific-modernization/evals.md +27 -0
  271. package/skills/skill-marketplace.json +63 -28
  272. package/skills/workflow/cut-it/SKILL.md +64 -5
  273. package/skills/workflow/cut-it/evals.md +101 -0
  274. package/skills/workflow/design-council/SKILL.md +112 -27
  275. package/skills/workflow/design-council/evals.md +161 -0
  276. package/skills/workflow/grill-me/SKILL.md +85 -10
  277. package/skills/workflow/grill-me/evals.md +153 -0
  278. package/skills/workflow/workflow-distiller/SKILL.md +76 -17
  279. package/skills/workflow/workflow-distiller/evals.md +118 -0
  280. package/src/cli/args.ts +0 -8
  281. package/src/cli/configure-interop.ts +105 -13
  282. package/src/cli/configure-oauth.ts +57 -0
  283. package/src/cli/configure-onboarding.ts +980 -0
  284. package/src/cli/configure-target.ts +594 -0
  285. package/src/cli/configure.ts +1084 -529
  286. package/src/cli/context-map.ts +114 -0
  287. package/src/cli/context.ts +4 -0
  288. package/src/cli/doctor-state-size.ts +1 -12
  289. package/src/cli/doctor-validation-contract.ts +28 -0
  290. package/src/cli/doctor.ts +5 -0
  291. package/src/cli/evidence-detail.ts +1 -75
  292. package/src/cli/evidence-inventory.ts +1 -167
  293. package/src/cli/index.ts +3 -0
  294. package/src/cli/lifecycle-presenter.ts +436 -0
  295. package/src/cli/models.ts +10 -2
  296. package/src/cli/modes/print.ts +5 -1
  297. package/src/cli/reset.ts +228 -106
  298. package/src/cli/run.ts +7 -4
  299. package/src/cli/select.ts +664 -0
  300. package/src/cli/skills.ts +9 -2
  301. package/src/cli/targets.ts +3 -0
  302. package/src/cli/tasks.ts +84 -0
  303. package/src/cli/uninstall.ts +233 -165
  304. package/src/cli/upgrade.ts +210 -150
  305. package/src/cli/usage.ts +92 -27
  306. package/src/cli/validate-model.ts +3 -3
  307. package/src/cli/verifiers.ts +147 -1
  308. package/src/cli/wiki-generate.ts +1 -0
  309. package/src/core/commit-attribution.ts +41 -1
  310. package/src/core/config.ts +56 -0
  311. package/src/core/external-diagnostic.ts +44 -0
  312. package/src/core/gateway-routing.ts +157 -0
  313. package/src/core/git-commit-attribution.ts +46 -3
  314. package/src/core/run-overrides.ts +0 -5
  315. package/src/core/safe-exec.ts +17 -2
  316. package/src/core/skill-activation.ts +92 -2
  317. package/src/core/tool-names.ts +5 -2
  318. package/src/domains/agents/builtins/architect.md +1 -1
  319. package/src/domains/agents/builtins/coder.md +1 -1
  320. package/src/domains/agents/builtins/documenter.md +1 -1
  321. package/src/domains/agents/builtins/git-master.md +1 -1
  322. package/src/domains/agents/builtins/provenance.md +7 -7
  323. package/src/domains/agents/builtins/tester.md +1 -1
  324. package/src/domains/agents/builtins/verifier.md +2 -2
  325. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  326. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  327. package/src/domains/agents/catalog.ts +1 -1
  328. package/src/domains/agents/result-contract.ts +70 -0
  329. package/src/domains/context/extension.ts +31 -7
  330. package/src/domains/context/refresh.ts +3 -0
  331. package/src/domains/context/wiki/frontmatter.ts +5 -2
  332. package/src/domains/context/wiki/generate.ts +6 -0
  333. package/src/domains/context/wiki/map-seed.ts +589 -0
  334. package/src/domains/context/wiki/plan.ts +2 -2
  335. package/src/domains/context/wiki/prompts.ts +43 -0
  336. package/src/domains/dispatch/active-route-planner.ts +4 -0
  337. package/src/domains/dispatch/admission.ts +29 -0
  338. package/src/domains/dispatch/agent-candidates.ts +10 -0
  339. package/src/domains/dispatch/budget-envelope.ts +86 -1
  340. package/src/domains/dispatch/capability-match.ts +1 -0
  341. package/src/domains/dispatch/capacity-lease.ts +17 -0
  342. package/src/domains/dispatch/code-step.ts +11 -4
  343. package/src/domains/dispatch/contract.ts +42 -8
  344. package/src/domains/dispatch/execution-scheduler.ts +2 -0
  345. package/src/domains/dispatch/extension.ts +184 -56
  346. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  347. package/src/domains/dispatch/fleet-run.ts +1 -0
  348. package/src/domains/dispatch/host-verification.ts +114 -13
  349. package/src/domains/dispatch/intent.ts +28 -18
  350. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  351. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  352. package/src/domains/dispatch/reservation-store.ts +5 -3
  353. package/src/domains/dispatch/state.ts +15 -2
  354. package/src/domains/dispatch/types.ts +20 -2
  355. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  356. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  357. package/src/domains/eval/metrics/token-stream.ts +201 -31
  358. package/src/domains/eval/metrics/tracked.ts +40 -4
  359. package/src/domains/eval/runners/clio-run.ts +17 -11
  360. package/src/domains/eval/runners/context-index.ts +2 -7
  361. package/src/domains/eval/runners/context-init.ts +3 -6
  362. package/src/domains/eval/runners/external-command.ts +29 -11
  363. package/src/domains/eval/schema/suite.ts +28 -0
  364. package/src/domains/eval/schema/verdict.ts +2 -2
  365. package/src/domains/eval/suites/resolve.ts +13 -1
  366. package/src/domains/eval/suites/run.ts +24 -3
  367. package/src/domains/evidence/build.ts +102 -15
  368. package/src/domains/evidence/detail.ts +69 -0
  369. package/src/domains/evidence/eval.ts +13 -1
  370. package/src/domains/evidence/finish-contract-map.ts +5 -1
  371. package/src/domains/evidence/inventory.ts +167 -0
  372. package/src/domains/evidence/store.ts +16 -0
  373. package/src/domains/evidence/types.ts +12 -0
  374. package/src/domains/extensions/resources.ts +7 -0
  375. package/src/domains/interop/registry.ts +6 -2
  376. package/src/domains/interop/types.ts +4 -0
  377. package/src/domains/lifecycle/migrations/index.ts +4 -0
  378. package/src/domains/memory/task-memory-policy.ts +70 -26
  379. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  380. package/src/domains/middleware/index.ts +0 -1
  381. package/src/domains/middleware/marketplace-offer.ts +22 -35
  382. package/src/domains/middleware/memory-intervention.ts +127 -32
  383. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  384. package/src/domains/middleware/runtime.ts +7 -3
  385. package/src/domains/middleware/skills-reminder.ts +31 -2
  386. package/src/domains/mux/detect.ts +3 -6
  387. package/src/domains/observability/accountability.ts +15 -1
  388. package/src/domains/observability/compaction-usage.ts +118 -0
  389. package/src/domains/observability/contract.ts +52 -7
  390. package/src/domains/observability/cost.ts +1 -1
  391. package/src/domains/observability/evidence-index.ts +10 -0
  392. package/src/domains/observability/extension.ts +15 -6
  393. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  394. package/src/domains/observability/projection.ts +394 -45
  395. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  396. package/src/domains/prompts/fragments/operating/contract.md +2 -0
  397. package/src/domains/prompts/fragments/wiki/page.md +8 -0
  398. package/src/domains/providers/contract.ts +4 -1
  399. package/src/domains/providers/extension.ts +40 -9
  400. package/src/domains/providers/model-capabilities.ts +9 -0
  401. package/src/domains/providers/model-discovery.ts +3 -4
  402. package/src/domains/providers/model-runtime-capabilities.ts +15 -5
  403. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +48 -26
  404. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  405. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  406. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  407. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  408. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  409. package/src/domains/providers/support.ts +11 -5
  410. package/src/domains/providers/target-model-cache.ts +25 -2
  411. package/src/domains/providers/types/capability-flags.ts +2 -0
  412. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  413. package/src/domains/providers/types/target-descriptor.ts +19 -0
  414. package/src/domains/resources/index.ts +3 -0
  415. package/src/domains/resources/skills/install.ts +72 -7
  416. package/src/domains/resources/skills/loader.ts +7 -0
  417. package/src/domains/resources/skills/marketplace.ts +63 -11
  418. package/src/domains/safety/action-classifier.ts +7 -0
  419. package/src/domains/safety/autonomy.ts +15 -0
  420. package/src/domains/safety/default-path-policy.ts +2 -0
  421. package/src/domains/safety/finish-contract-registration.ts +29 -14
  422. package/src/domains/safety/finish-contract.ts +252 -40
  423. package/src/domains/safety/index.ts +21 -1
  424. package/src/domains/safety/path-policy.ts +1 -1
  425. package/src/domains/safety/policy-engine.ts +60 -17
  426. package/src/domains/safety/protected-artifacts.ts +191 -88
  427. package/src/domains/safety/rigor.ts +53 -39
  428. package/src/domains/safety/run-effects.ts +2 -22
  429. package/src/domains/safety/skill-authority.ts +55 -0
  430. package/src/domains/safety/validation-contract.ts +388 -0
  431. package/src/domains/session/archive-readers.ts +10 -1
  432. package/src/domains/session/compaction/compact.ts +72 -22
  433. package/src/domains/session/decision-board.ts +101 -2
  434. package/src/domains/session/entries.ts +50 -7
  435. package/src/domains/session/extension.ts +4 -4
  436. package/src/domains/session/handoff.ts +2 -1
  437. package/src/domains/session/manager.ts +2 -3
  438. package/src/domains/session/task-board.ts +14 -1
  439. package/src/domains/session/tree/fork.ts +1 -2
  440. package/src/domains/session/tree/navigator.ts +1 -1
  441. package/src/domains/session/usage.ts +3 -3
  442. package/src/domains/user-tasks/acceptance.ts +56 -0
  443. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  444. package/src/domains/user-tasks/store.ts +34 -3
  445. package/src/engine/acp/adapter.ts +24 -6
  446. package/src/engine/acp/server.ts +21 -4
  447. package/src/engine/acp/transport.ts +53 -8
  448. package/src/engine/acp/types.ts +4 -0
  449. package/src/engine/agent.ts +13 -3
  450. package/src/engine/ai.ts +26 -8
  451. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  452. package/src/engine/api-registry.ts +3 -0
  453. package/src/engine/apis/ollama-native.ts +15 -0
  454. package/src/engine/apis/openai-completions.ts +117 -14
  455. package/src/engine/claude/subprocess-runtime.ts +107 -60
  456. package/src/engine/external-subprocess.ts +122 -6
  457. package/src/entry/background-model-metadata.ts +18 -0
  458. package/src/entry/compaction-prompt.ts +57 -0
  459. package/src/entry/orchestrator.ts +416 -218
  460. package/src/entry/task-memory-lifecycle.ts +35 -0
  461. package/src/interactive/chat-loop-messages.ts +13 -4
  462. package/src/interactive/chat-loop.ts +65 -2
  463. package/src/interactive/chat-renderer.ts +1 -0
  464. package/src/interactive/cost-overlay.ts +26 -2
  465. package/src/interactive/dispatch-board.ts +46 -717
  466. package/src/interactive/fleet-run-preview.ts +2 -1
  467. package/src/interactive/interactive-application.ts +3 -2
  468. package/src/interactive/interactive-presentation.ts +55 -12
  469. package/src/interactive/interactive-slash-runtime.ts +4 -2
  470. package/src/interactive/oracle.ts +5 -2
  471. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  472. package/src/interactive/overlays/message-picker.ts +2 -2
  473. package/src/interactive/overlays/settings.ts +2 -2
  474. package/src/interactive/overlays/tree-selector.ts +2 -2
  475. package/src/interactive/renderers/branch-summary.ts +1 -1
  476. package/src/interactive/renderers/worker-entry.ts +32 -0
  477. package/src/interactive/slash-autocomplete.ts +4 -6
  478. package/src/interactive/slash-commands.ts +49 -45
  479. package/src/interactive/slash-spec.ts +28 -0
  480. package/src/interactive/theme/labels.ts +19 -13
  481. package/src/interactive/turn-context.ts +9 -5
  482. package/src/interactive/turn-recovery.ts +8 -0
  483. package/src/interactive/turn-runtime.ts +27 -11
  484. package/src/interactive/turn-state.ts +7 -0
  485. package/src/interactive/view/artifacts.ts +2 -0
  486. package/src/interactive/worker-receipts.ts +1 -0
  487. package/src/interactive/worker-stream.ts +13 -4
  488. package/src/tools/bootstrap.ts +4 -0
  489. package/src/tools/builtin-tool-catalog.ts +31 -0
  490. package/src/tools/compete-worktrees.ts +7 -1
  491. package/src/tools/context/index.ts +30 -9
  492. package/src/tools/core-bootstrap.ts +16 -0
  493. package/src/tools/decide.ts +136 -0
  494. package/src/tools/dispatch-admission.ts +21 -0
  495. package/src/tools/dispatch-arguments.ts +1 -0
  496. package/src/tools/dispatch-event-text.ts +10 -0
  497. package/src/tools/dispatch-plan.ts +6 -2
  498. package/src/tools/dispatch-runner.ts +27 -1
  499. package/src/tools/dispatch-types.ts +6 -0
  500. package/src/tools/evidence.ts +96 -0
  501. package/src/tools/limitation.ts +76 -0
  502. package/src/tools/policy.ts +9 -0
  503. package/src/tools/presentation.ts +3 -0
  504. package/src/tools/registry.ts +11 -5
  505. package/src/tools/result-shaping.ts +17 -5
  506. package/src/tools/task-worktree.ts +13 -3
  507. package/src/tools/tasks.ts +10 -1
  508. package/src/tools/verify/authoring.ts +170 -83
  509. package/src/tools/verify/catalog.ts +122 -5
  510. package/src/tools/verify/index.ts +2 -1
  511. package/src/tools/verify/numeric.ts +298 -0
  512. package/src/tools/verify/perf.ts +143 -0
  513. package/src/tools/verify/scripts.ts +229 -2
  514. package/src/tools/worker-evidence.ts +3 -1
  515. package/src/worker/spec-contract.ts +4 -0
  516. package/dist/chunk-2Z2IKEXI.js +0 -1554
  517. package/dist/chunk-RVG5JXAL.js +0 -41
  518. package/dist/chunk-T56WDKA5.js +0 -183
  519. package/dist/chunk-VN3SHNBN.js +0 -313
  520. package/dist/chunk-VPKWYKEY.js +0 -169
  521. package/dist/reset-OAQP3W4O.js +0 -230
  522. package/dist/uninstall-N34PCTGJ.js +0 -331
  523. package/dist/upgrade-PXK3S2YM.js +0 -325
@@ -0,0 +1,436 @@
1
+ import { type Dirent, lstatSync, readdirSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { stdin as defaultInput, stdout as defaultOutput } from "node:process";
5
+ import { createInterface } from "node:readline/promises";
6
+ import chalk from "chalk";
7
+
8
+ import { terminalColumns, wrapPlain } from "./text-layout.js";
9
+
10
+ export interface LifecyclePresenterOptions {
11
+ json?: boolean;
12
+ plain?: boolean;
13
+ stream?: NodeJS.WritableStream;
14
+ inputStream?: NodeJS.ReadableStream;
15
+ /** Terminal width used to wrap prose. Defaults to the stream's columns, else 80. */
16
+ columns?: number;
17
+ }
18
+
19
+ export type LifecycleItemStatus = "remove" | "keep" | "absent" | "skip" | "clean";
20
+
21
+ // `| undefined` on every optional field is required, not decorative: the repo
22
+ // compiles with exactOptionalPropertyTypes, and every inventory in reset and
23
+ // uninstall builds these rows from a conditional that can produce undefined.
24
+ export interface LifecycleItem {
25
+ label: string;
26
+ path: string;
27
+ bytes?: number | null | undefined;
28
+ status?: LifecycleItemStatus | undefined;
29
+ detail?: string | undefined;
30
+ }
31
+
32
+ export interface LifecycleReport {
33
+ command: string;
34
+ title: string;
35
+ method?: string;
36
+ status: "success" | "skipped" | "dry-run" | "error";
37
+ items: LifecycleItem[];
38
+ steps: Array<{ type: string; message: string }>;
39
+ warnings: string[];
40
+ errors: string[];
41
+ advice: Array<{ lead: string; command: string }>;
42
+ summary?: string;
43
+ }
44
+
45
+ /**
46
+ * One decimal above the byte range, which is the precision a size on a lifecycle
47
+ * listing is read at: the operator wants to know whether a root is megabytes or
48
+ * gigabytes before agreeing to delete it, not its third significant figure.
49
+ *
50
+ * Not `formatSize` from pi-agent-core, which this otherwise matches. That one
51
+ * stops at megabytes, so a data root holding evidence and vendored tools reads
52
+ * as `4300.8MB` where the question being asked is whether it is gigabytes; and
53
+ * it writes no space before the unit, which is fine inside a tool observation
54
+ * and wrong in a column of paths a person is scanning.
55
+ */
56
+ export function formatBytes(bytes: number): string {
57
+ if (bytes < 1024) return `${bytes} B`;
58
+ const units = ["KB", "MB", "GB", "TB"];
59
+ let value = bytes / 1024;
60
+ let unitIndex = 0;
61
+ while (value >= 1024 && unitIndex < units.length - 1) {
62
+ value /= 1024;
63
+ unitIndex += 1;
64
+ }
65
+ return `${value.toFixed(1)} ${units[unitIndex]}`;
66
+ }
67
+
68
+ export function measurePath(targetPath: string): {
69
+ bytes: number;
70
+ exists: boolean;
71
+ isDirectory: boolean;
72
+ isSymbolicLink: boolean;
73
+ } {
74
+ let stats: ReturnType<typeof lstatSync>;
75
+ try {
76
+ stats = lstatSync(targetPath);
77
+ } catch {
78
+ return { bytes: 0, exists: false, isDirectory: false, isSymbolicLink: false };
79
+ }
80
+ if (stats.isSymbolicLink()) {
81
+ return { bytes: stats.size, exists: true, isDirectory: false, isSymbolicLink: true };
82
+ }
83
+ if (!stats.isDirectory()) {
84
+ return { bytes: stats.size, exists: true, isDirectory: false, isSymbolicLink: false };
85
+ }
86
+
87
+ let total = 0;
88
+ // A symlinked subdirectory is counted as the link it is and never descended
89
+ // into, so a root that links out to a shared tree reports its own footprint
90
+ // and the walk cannot loop.
91
+ function walk(dir: string): void {
92
+ let entries: Dirent[];
93
+ try {
94
+ entries = readdirSync(dir, { withFileTypes: true });
95
+ } catch {
96
+ return;
97
+ }
98
+ for (const entry of entries) {
99
+ const full = join(dir, entry.name);
100
+ try {
101
+ if (entry.isDirectory()) walk(full);
102
+ else total += lstatSync(full).size;
103
+ } catch {
104
+ // An entry that vanished or cannot be read contributes nothing.
105
+ }
106
+ }
107
+ }
108
+ walk(targetPath);
109
+ return { bytes: total, exists: true, isDirectory: true, isSymbolicLink: false };
110
+ }
111
+
112
+ export function shortenPath(targetPath: string, home = homedir()): string {
113
+ if (!targetPath) return targetPath;
114
+ if (targetPath === home) return "~";
115
+ if (targetPath.startsWith(`${home}/`) || targetPath.startsWith(`${home}\\`)) {
116
+ return `~/${targetPath.slice(home.length + 1)}`;
117
+ }
118
+ return targetPath;
119
+ }
120
+
121
+ /**
122
+ * The kinds of block the rail knows how to space. One blank rail separates two
123
+ * adjacent blocks of different kinds; consecutive blocks of the same kind (a run
124
+ * of detected facts, a run of completed steps) stay together, which is what
125
+ * makes the transcript read as groups rather than as one padded line per call.
126
+ * Spacing lives here rather than in each emitter so no caller can produce a
127
+ * transcript with a doubled or a missing separator.
128
+ */
129
+ type Block = "header" | "step" | "list" | "warn" | "note" | "advice" | "completed" | "message" | "confirm";
130
+
131
+ export class LifecyclePresenter {
132
+ private readonly json: boolean;
133
+ private readonly plain: boolean;
134
+ private readonly out: NodeJS.WritableStream;
135
+ private readonly in: NodeJS.ReadableStream;
136
+ private readonly columns: number;
137
+ private readonly report: LifecycleReport;
138
+ private lastBlock: Block | null = null;
139
+ private emitted = false;
140
+
141
+ constructor(options: LifecyclePresenterOptions = {}) {
142
+ this.json = Boolean(options.json);
143
+ const stream = options.stream ?? defaultOutput;
144
+ const isTty = Boolean((stream as { isTTY?: boolean }).isTTY);
145
+ this.plain = options.plain ?? (!isTty || Boolean(process.env.NO_COLOR));
146
+ this.out = stream;
147
+ this.in = options.inputStream ?? defaultInput;
148
+ // terminalColumns also reads $COLUMNS, so a piped or captured run can be
149
+ // told how wide it is instead of being pinned to 80.
150
+ this.columns = options.columns ?? terminalColumns(stream as { columns?: number | undefined });
151
+ this.report = {
152
+ command: "",
153
+ title: "",
154
+ status: "success",
155
+ items: [],
156
+ steps: [],
157
+ warnings: [],
158
+ errors: [],
159
+ advice: [],
160
+ };
161
+ }
162
+
163
+ isJson(): boolean {
164
+ return this.json;
165
+ }
166
+
167
+ isPlain(): boolean {
168
+ return this.plain;
169
+ }
170
+
171
+ getReport(): LifecycleReport {
172
+ return this.report;
173
+ }
174
+
175
+ setMethod(method: string): void {
176
+ this.report.method = method;
177
+ }
178
+
179
+ /** Open a block, writing the one separator that belongs before it. */
180
+ private open(block: Block): void {
181
+ if (this.lastBlock !== null && this.lastBlock !== block) this.separator();
182
+ this.lastBlock = block;
183
+ }
184
+
185
+ private separator(): void {
186
+ this.out.write(this.plain ? "\n" : `${chalk.cyan("│")}\n`);
187
+ }
188
+
189
+ /**
190
+ * Close the current block, for a caller that is about to draw its own lines
191
+ * on the rail. `configure` hands the rail to the arrow-key selector after
192
+ * rendering a screen's values, and the selector cannot know what came before
193
+ * it.
194
+ */
195
+ blank(): void {
196
+ if (this.json) return;
197
+ this.separator();
198
+ this.lastBlock = null;
199
+ }
200
+
201
+ /** Rail-level prose, wrapped to the terminal so the rail survives a narrow window. */
202
+ private prose(text: string): void {
203
+ const prefix = this.plain ? " " : `${chalk.cyan("│")} `;
204
+ for (const line of wrapPlain(text, this.columns - 3)) this.out.write(`${prefix}${line}\n`);
205
+ }
206
+
207
+ header(title: string, command = ""): void {
208
+ this.report.title = title;
209
+ this.report.command = command;
210
+ if (this.json) return;
211
+ if (this.plain) {
212
+ this.out.write(`\n${title}\n`);
213
+ } else {
214
+ this.out.write(`\n${chalk.cyan("┌")} ${chalk.bold(title)}\n`);
215
+ }
216
+ this.lastBlock = "header";
217
+ }
218
+
219
+ /** One detected fact. Consecutive facts group into a single block. */
220
+ step(text: string): void {
221
+ this.report.steps.push({ type: "step", message: text });
222
+ if (this.json) return;
223
+ this.open("step");
224
+ if (this.plain) this.out.write(` ${text}\n`);
225
+ else this.out.write(`${chalk.blue("●")} ${text}\n`);
226
+ }
227
+
228
+ /** A line of prose on the rail, not a detected fact. */
229
+ note(text: string): void {
230
+ this.report.steps.push({ type: "note", message: text });
231
+ if (this.json) return;
232
+ this.open("note");
233
+ this.prose(text);
234
+ }
235
+
236
+ /**
237
+ * Aligned label/value rows for a settings screen. Not `note()`, because
238
+ * these must not reflow: the column is what makes eight values scannable,
239
+ * and a wrap would put the value under the wrong label.
240
+ */
241
+ fields(rows: ReadonlyArray<readonly [string, string]>): void {
242
+ for (const [label, value] of rows) this.report.steps.push({ type: "field", message: `${label}: ${value}` });
243
+ if (this.json || rows.length === 0) return;
244
+ this.open("step");
245
+ const width = Math.max(...rows.map(([label]) => label.length));
246
+ for (const [label, value] of rows) {
247
+ const padded = `${label}${" ".repeat(width - label.length)}`;
248
+ if (this.plain) this.out.write(` ${padded} ${value}\n`);
249
+ else this.out.write(`${chalk.blue("●")} ${chalk.dim(padded)} ${value}\n`);
250
+ }
251
+ }
252
+
253
+ substep(text: string, glyph = "✓"): void {
254
+ this.report.steps.push({ type: "substep", message: text });
255
+ if (this.json) return;
256
+ this.open("list");
257
+ if (this.plain) {
258
+ this.out.write(` ${glyph} ${text}\n`);
259
+ return;
260
+ }
261
+ const coloredGlyph = glyph === "✓" ? chalk.green(glyph) : chalk.dim(glyph);
262
+ this.out.write(`${chalk.blue("●")} ${coloredGlyph} ${text}\n`);
263
+ }
264
+
265
+ listItems(header: string, items: ReadonlyArray<LifecycleItem>): void {
266
+ for (const item of items) {
267
+ this.report.items.push(item);
268
+ }
269
+ if (this.json) return;
270
+
271
+ this.open("note");
272
+ this.prose(`${header}:`);
273
+ this.open("list");
274
+
275
+ for (const item of items) {
276
+ const sizeStr =
277
+ item.status !== "absent" && item.bytes !== undefined && item.bytes !== null ? ` (${formatBytes(item.bytes)})` : "";
278
+ const removes = item.status === undefined || item.status === "remove";
279
+ let suffix = "";
280
+ if (item.status === "keep") suffix = item.detail ? ` (${item.detail})` : " (kept)";
281
+ else if (item.status === "absent") suffix = item.detail ? ` (${item.detail})` : " (absent)";
282
+ else if (item.status === "skip") suffix = item.detail ? ` (${item.detail})` : " (skipped)";
283
+ else if (item.status === "clean") suffix = item.detail ? ` (${item.detail})` : " (nothing to remove)";
284
+ else if (item.detail) suffix = ` (${item.detail})`;
285
+
286
+ const body = `${item.label}: ${shortenPath(item.path)}${sizeStr}`;
287
+ if (this.plain) {
288
+ this.out.write(` ${removes ? "✓" : "–"} ${body}${suffix}\n`);
289
+ continue;
290
+ }
291
+ const glyph = removes ? chalk.green("✓") : item.status === "skip" ? chalk.yellow("–") : chalk.dim("–");
292
+ const tail = suffix.length === 0 ? "" : item.status === "skip" ? chalk.yellow(suffix) : chalk.dim(suffix);
293
+ this.out.write(
294
+ `${chalk.blue("●")} ${glyph} ${chalk.bold(item.label)}: ${shortenPath(item.path)}${sizeStr}${tail}\n`,
295
+ );
296
+ }
297
+ }
298
+
299
+ /** One action that has already happened. Consecutive results group together. */
300
+ completedStep(text: string): void {
301
+ this.report.steps.push({ type: "completed", message: text });
302
+ if (this.json) return;
303
+ this.open("completed");
304
+ if (this.plain) this.out.write(` ✓ ${text}\n`);
305
+ else this.out.write(`${chalk.green("◇")} ${text}\n`);
306
+ }
307
+
308
+ warn(text: string): void {
309
+ this.report.warnings.push(text);
310
+ if (this.json) return;
311
+ this.open("warn");
312
+ if (this.plain) {
313
+ for (const line of wrapPlain(text, this.columns - 3)) this.out.write(` ${line}\n`);
314
+ return;
315
+ }
316
+ const prefix = `${chalk.yellow("▲")} `;
317
+ const continuation = `${chalk.cyan("│")} `;
318
+ wrapPlain(text, this.columns - 3).forEach((line, index) => {
319
+ this.out.write(`${index === 0 ? prefix : continuation}${chalk.yellow(line)}\n`);
320
+ });
321
+ }
322
+
323
+ /**
324
+ * Record a failure and say it once on stderr. The JSON report is not written
325
+ * here: a command that fails still has advice to add, and emitting mid-flight
326
+ * either dropped it or put a second document on stdout. Callers end on
327
+ * `finish()`.
328
+ */
329
+ fail(message: string, detail?: string): void {
330
+ this.report.status = "error";
331
+ this.report.errors.push(detail ? `${message}: ${detail}` : message);
332
+ if (this.json) return;
333
+ if (this.plain) {
334
+ process.stderr.write(`error: ${message}\n`);
335
+ if (detail) process.stderr.write(` ${detail}\n`);
336
+ return;
337
+ }
338
+ process.stderr.write(`${chalk.red("✖")} ${chalk.red(message)}\n`);
339
+ if (detail) process.stderr.write(`${chalk.cyan("│")} ${chalk.dim(detail)}\n`);
340
+ }
341
+
342
+ commandAdvice(lead: string, command: string): void {
343
+ this.report.advice.push({ lead, command });
344
+ if (this.json) return;
345
+ this.open("advice");
346
+ this.prose(lead);
347
+ for (const line of command.split("\n")) {
348
+ if (this.plain) this.out.write(` ${line}\n`);
349
+ else this.out.write(`${chalk.blue("●")} ${chalk.cyan(line)}\n`);
350
+ }
351
+ }
352
+
353
+ message(text: string): void {
354
+ this.report.steps.push({ type: "message", message: text });
355
+ if (this.json) return;
356
+ this.open("message");
357
+ if (this.plain) this.out.write(` ${text}\n`);
358
+ else this.out.write(`${chalk.cyan("◆")} ${chalk.bold(text)}\n`);
359
+ }
360
+
361
+ /**
362
+ * Ask once, and treat a closed input as a refusal.
363
+ *
364
+ * `rl.question()` from readline/promises settles on an answer and on an abort
365
+ * signal, but not on the input ending: at EOF the interface emits `close` and
366
+ * the promise is simply never resolved. Every caller here guards a delete, so
367
+ * the failure mode was a `clio-coder uninstall` that printed its prompt and
368
+ * then hung forever on Ctrl-D. Racing the `close` event settles that case as
369
+ * "no", which is the only safe reading of an input that stopped talking.
370
+ */
371
+ async confirm(question: string, defaultYes = false): Promise<boolean> {
372
+ if (this.json) return false;
373
+ const hint = defaultYes ? "Y/n" : "y/N";
374
+ this.open("confirm");
375
+ const rl = createInterface({ input: this.in, output: this.out });
376
+ try {
377
+ const promptStr = this.plain
378
+ ? ` ${question} [${hint}]: `
379
+ : `${chalk.cyan("◇")} ${chalk.bold(question)} [${hint}]\n${chalk.cyan("│")} `;
380
+ const answer = await new Promise<string | null>((resolve) => {
381
+ let settled = false;
382
+ const settle = (value: string | null): void => {
383
+ if (settled) return;
384
+ settled = true;
385
+ resolve(value);
386
+ };
387
+ rl.once("close", () => settle(null));
388
+ rl.question(promptStr).then(
389
+ (value) => settle(value),
390
+ () => settle(null),
391
+ );
392
+ });
393
+ if (answer === null) return false;
394
+ const normalized = answer.trim().toLowerCase();
395
+ const confirmed = normalized.length === 0 ? defaultYes : normalized === "y" || normalized === "yes";
396
+ this.out.write(this.plain ? ` ${confirmed ? "Yes" : "No"}\n` : `${chalk.cyan("│")} ${confirmed ? "Yes" : "No"}\n`);
397
+ return confirmed;
398
+ } finally {
399
+ rl.close();
400
+ }
401
+ }
402
+
403
+ /**
404
+ * Close the transcript. Every command ends here, on success and on failure,
405
+ * so `--json` emits exactly one document containing everything that was
406
+ * recorded, including advice added after a failure.
407
+ */
408
+ done(summary = "Done"): void {
409
+ this.report.summary = summary;
410
+ if (this.json) {
411
+ this.emit();
412
+ return;
413
+ }
414
+ if (this.plain) {
415
+ this.out.write(`\n${summary}\n`);
416
+ return;
417
+ }
418
+ this.separator();
419
+ this.out.write(`${chalk.cyan("└")} ${chalk.bold(summary)}\n\n`);
420
+ }
421
+
422
+ /** Emit the JSON report without a closing line, for paths that ended in an error. */
423
+ finish(): void {
424
+ if (this.json) this.emit();
425
+ }
426
+
427
+ private emit(): void {
428
+ if (this.emitted) return;
429
+ this.emitted = true;
430
+ this.out.write(`${JSON.stringify(this.report, null, 2)}\n`);
431
+ }
432
+ }
433
+
434
+ export function createLifecyclePresenter(options: LifecyclePresenterOptions = {}): LifecyclePresenter {
435
+ return new LifecyclePresenter(options);
436
+ }
package/src/cli/models.ts CHANGED
@@ -14,6 +14,8 @@ export interface ModelRow {
14
14
  targetId: string;
15
15
  runtimeId: string;
16
16
  modelId: string;
17
+ label?: string;
18
+ source: string;
17
19
  caps: string;
18
20
  contextWindow: number;
19
21
  maxTokens: number;
@@ -128,6 +130,7 @@ function collectRows(entries: ReadonlyArray<TargetStatus>, providers: ProvidersC
128
130
  targetId: status.target.id,
129
131
  runtimeId,
130
132
  modelId: "(no models)",
133
+ source: status.discoveredModelsSource ?? "none",
131
134
  state: "-",
132
135
  ...formatCapabilities(caps),
133
136
  });
@@ -140,6 +143,8 @@ function collectRows(entries: ReadonlyArray<TargetStatus>, providers: ProvidersC
140
143
  targetId: status.target.id,
141
144
  runtimeId,
142
145
  modelId,
146
+ ...(candidate.label ? { label: candidate.label } : {}),
147
+ source: candidate.source,
143
148
  state: candidate.loadState ?? "-",
144
149
  ...formatCapabilities(caps),
145
150
  });
@@ -219,11 +224,14 @@ function truncateModelId(id: string): string {
219
224
 
220
225
  function modelTableLines(rows: ReadonlyArray<ModelRow>): string[] {
221
226
  const includeState = rows.some((row) => row.state && row.state !== "-");
227
+ const includeLabel = rows.some((row) => row.label && row.label !== row.modelId);
222
228
  const headers = includeState
223
- ? ["target", "runtime", "model", "state", "caps", "ctx", "max"]
224
- : ["target", "runtime", "model", "caps", "ctx", "max"];
229
+ ? ["target", "runtime", "model", ...(includeLabel ? ["label"] : []), "source", "state", "caps", "ctx", "max"]
230
+ : ["target", "runtime", "model", ...(includeLabel ? ["label"] : []), "source", "caps", "ctx", "max"];
225
231
  const cells = rows.map((row) => {
226
232
  const base = [row.targetId, row.runtimeId, truncateModelId(row.modelId)];
233
+ if (includeLabel) base.push(row.label ?? "-");
234
+ base.push(row.source);
227
235
  if (includeState) base.push(row.state || "-");
228
236
  base.push(row.caps, compactTokenCount(row.contextWindow), compactTokenCount(row.maxTokens));
229
237
  return base;
@@ -153,10 +153,14 @@ function resultFromEvent(event: ChatLoopEvent, current: HeadlessMainAgentResult)
153
153
  }
154
154
  if (event.type !== "message_end") return current;
155
155
  const message = event.message;
156
+ if (message?.role !== "assistant") return current;
156
157
  const error = assistantError(message);
157
158
  if (error) return { ...current, text: "", error };
158
159
  const text = assistantText(message).trimEnd();
159
- if (text.length === 0) return current;
160
+ // A successful retry may contain only tool calls. It supersedes the prior
161
+ // provider error even without prose; the terminal tool/answer checks still
162
+ // decide whether the task completed. Tool-result messages cannot clear it.
163
+ if (text.length === 0) return { ...current, error: null };
160
164
  return { ...current, text, error: null };
161
165
  }
162
166