@iowarp/clio-coder 0.4.1 → 0.4.3

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 (604) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/CONTRIBUTING.md +142 -52
  3. package/README.md +434 -473
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-ZILU3AUO.js → acp-H2NGRPWO.js} +12 -12
  6. package/dist/{agents-HYWGBGQR.js → agents-TL5LLUQP.js} +56 -55
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-N3QT7CBO.js → auth-E5SW4HMS.js} +23 -21
  9. package/dist/builtins-IA7V7FUC.js +22 -0
  10. package/dist/{chunk-7RY5VZPH.js → chunk-2APPQIER.js} +8 -8
  11. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  12. package/dist/{chunk-JA5QWE4Z.js → chunk-2UG5F4C5.js} +1973 -1664
  13. package/dist/{chunk-5YHDIDBP.js → chunk-2UH2KFUP.js} +2 -2
  14. package/dist/{chunk-CTJ4RNAA.js → chunk-2VIKGWFZ.js} +2 -2
  15. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  16. package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
  17. package/dist/chunk-3EBYEESD.js +314 -0
  18. package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
  19. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  20. package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
  21. package/dist/chunk-4UVU7BJ5.js +39 -0
  22. package/dist/{chunk-VKRH2TCS.js → chunk-4WR7VSYB.js} +2 -2
  23. package/dist/{chunk-BBTJOK6Y.js → chunk-54CBCGIR.js} +5 -5
  24. package/dist/{chunk-AP73CFDC.js → chunk-5ICU3EUH.js} +2 -2
  25. package/dist/chunk-5MEZN6CB.js +1334 -0
  26. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  27. package/dist/{chunk-ABLSQ6JX.js → chunk-64I3JVYM.js} +8 -2
  28. package/dist/{chunk-AFKWHWXF.js → chunk-6PTFB5VS.js} +39 -22
  29. package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
  30. package/dist/chunk-7DRAWPTZ.js +360 -0
  31. package/dist/chunk-7E7I3WLS.js +3762 -0
  32. package/dist/{chunk-BJGUKIG4.js → chunk-7ZYNNDKC.js} +7 -7
  33. package/dist/{chunk-XKA2ICR3.js → chunk-AF4YM7Z4.js} +652 -252
  34. package/dist/{chunk-GVQJ5CCZ.js → chunk-AX2THNSA.js} +12 -12
  35. package/dist/{chunk-IG7BCQBA.js → chunk-B4OAX3SI.js} +65 -3
  36. package/dist/{chunk-TD3PGPQA.js → chunk-B4VEBZKF.js} +3 -3
  37. package/dist/{chunk-74YWRRU5.js → chunk-BEPZRGGU.js} +10 -10
  38. package/dist/{chunk-FEFIFZTL.js → chunk-CE5AX47J.js} +2 -2
  39. package/dist/{chunk-UAPGZHYC.js → chunk-DWUOQKRU.js} +25 -11
  40. package/dist/{chunk-THYWACCR.js → chunk-E3TPLWFX.js} +3 -3
  41. package/dist/{chunk-7EPLI7VL.js → chunk-EKCHAPYA.js} +2 -2
  42. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  43. package/dist/{chunk-PJJ6MY27.js → chunk-F5JHEYZM.js} +7 -7
  44. package/dist/{chunk-6CCS4G3W.js → chunk-FTMGRKEF.js} +3 -3
  45. package/dist/{chunk-SINK3QR6.js → chunk-G76U63X4.js} +17 -17
  46. package/dist/{chunk-EIMVLWB3.js → chunk-GHS5EBTQ.js} +64 -9
  47. package/dist/{chunk-QMXC4JB7.js → chunk-GI7YYQ3F.js} +187 -1419
  48. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  49. package/dist/{chunk-6HMJX2VU.js → chunk-GWZNEVM2.js} +44 -12
  50. package/dist/chunk-GYV6VZOC.js +26 -0
  51. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  52. package/dist/{chunk-UXN6JT4W.js → chunk-HEQY7ZFI.js} +3 -3
  53. package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
  54. package/dist/{chunk-GCSMB2KY.js → chunk-I7ZPNEJM.js} +145 -102
  55. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  56. package/dist/{chunk-QTFGO774.js → chunk-IGLP3ODT.js} +29 -16
  57. package/dist/chunk-IJNZMHLA.js +101 -0
  58. package/dist/{chunk-BDPT6GTK.js → chunk-INY6HTFL.js} +7 -7
  59. package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
  60. package/dist/{chunk-6NJQITNH.js → chunk-IWT4SF4R.js} +6 -3
  61. package/dist/{chunk-R23Z6K6I.js → chunk-JDAY6FIL.js} +19 -19
  62. package/dist/chunk-JEQ3XTHC.js +42 -0
  63. package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
  64. package/dist/{chunk-TVH4ONAM.js → chunk-JKKCYP3C.js} +10 -10
  65. package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
  66. package/dist/{chunk-C537JADH.js → chunk-KK4JZPBQ.js} +19 -141
  67. package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
  68. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  69. package/dist/{chunk-6DWBAZ5U.js → chunk-L47TF46W.js} +5 -7
  70. package/dist/{chunk-HUAS7ITX.js → chunk-LDJG7DW3.js} +91 -42
  71. package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
  72. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  73. package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
  74. package/dist/{chunk-VKFQTNDV.js → chunk-MUW2BDDH.js} +4 -4
  75. package/dist/{chunk-E67WX76H.js → chunk-MWUZBSAQ.js} +104 -152
  76. package/dist/{chunk-OJTRZGR3.js → chunk-N2Z7HLVY.js} +21 -21
  77. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  78. package/dist/{chunk-FYUN5KZ3.js → chunk-NIQJ66N4.js} +21 -21
  79. package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
  80. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  81. package/dist/{chunk-VEGN6WIQ.js → chunk-O5CVSAG5.js} +3 -3
  82. package/dist/{chunk-MOPSG2X7.js → chunk-OML5D5V5.js} +8 -8
  83. package/dist/{chunk-2VG7KLYV.js → chunk-PAJQJ7BS.js} +5816 -3255
  84. package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
  85. package/dist/{chunk-BTGG6BG2.js → chunk-QWGDJJYJ.js} +158 -19
  86. package/dist/chunk-R6Q67RJH.js +134 -0
  87. package/dist/{chunk-ZJLUDYFY.js → chunk-RRNP2ANY.js} +6 -6
  88. package/dist/{chunk-PVAMAVBB.js → chunk-RSJ25QSL.js} +102 -2
  89. package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
  90. package/dist/chunk-SKHCAU7K.js +385 -0
  91. package/dist/chunk-SZAA6XDG.js +30 -0
  92. package/dist/{chunk-J4HBWF6Y.js → chunk-TM6LQDI3.js} +131 -28
  93. package/dist/chunk-UOIZ7DA4.js +41 -0
  94. package/dist/{chunk-MA3H6DM5.js → chunk-UPZU6GE4.js} +25 -3
  95. package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
  96. package/dist/{chunk-N5UK64DP.js → chunk-V2ANDPVT.js} +4 -4
  97. package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
  98. package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
  99. package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
  100. package/dist/{chunk-QKIFBZKT.js → chunk-VW6DOEDG.js} +497 -81
  101. package/dist/{chunk-SCYB3HA4.js → chunk-W6RRQCPQ.js} +63 -19
  102. package/dist/{chunk-2NM363SV.js → chunk-WBKFA554.js} +10 -10
  103. package/dist/{chunk-R32CLGZ6.js → chunk-WCXUNS7U.js} +82 -21
  104. package/dist/{chunk-GPPB3JBE.js → chunk-WRBAGUNF.js} +3 -3
  105. package/dist/{chunk-IXJT6DCX.js → chunk-XIVNBFZS.js} +85 -30
  106. package/dist/{chunk-UEDMSP56.js → chunk-XPWWI35G.js} +417 -201
  107. package/dist/chunk-XRZT5WY5.js +47 -0
  108. package/dist/{chunk-3QSOM6PA.js → chunk-Y3CBHOR6.js} +2 -2
  109. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  110. package/dist/{chunk-AKB4GYDL.js → chunk-YQWYVTMC.js} +5 -5
  111. package/dist/{chunk-6I5ILFOF.js → chunk-ZA4VCIGV.js} +3 -3
  112. package/dist/{chunk-7OBGU7UB.js → chunk-ZDN3Y73Y.js} +12 -18
  113. package/dist/{chunk-3I5NY75V.js → chunk-ZWPRK62N.js} +8 -5
  114. package/dist/cli/index.js +41 -39
  115. package/dist/{clio-IT3G3VQH.js → clio-CMMK4KRR.js} +9 -9
  116. package/dist/{code-nav-RK6S7F6E.js → code-nav-MDZNQS33.js} +89 -21
  117. package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
  118. package/dist/{config-3QZRWZJF.js → config-SVM5P5YI.js} +131 -84
  119. package/dist/{configure-FL7Y3KJF.js → configure-LE3IK2TJ.js} +28 -26
  120. package/dist/{context-5HE7ODYK.js → context-2OHRKS42.js} +69 -64
  121. package/dist/{context-KYQFRVDC.js → context-E3VC7RX5.js} +15 -11
  122. package/dist/{context-XNHL75JV.js → context-VNCR7KAG.js} +93 -65
  123. package/dist/{context-clear-N545L53A.js → context-clear-BW4O37TG.js} +64 -60
  124. package/dist/context-map-COB37XXN.js +505 -0
  125. package/dist/{context-working-set-QHKXSV2F.js → context-working-set-VDS25HXZ.js} +19 -18
  126. package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-5AHT53RF.js} +93 -82
  127. package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
  128. package/dist/{doctor-ZGPEGHIP.js → doctor-WNNVO6FY.js} +48 -47
  129. package/dist/{eval-GXLL44RD.js → eval-7G7SGAYO.js} +287 -115
  130. package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-Y6QRFOH5.js} +4 -4
  131. package/dist/{evidence-HWLBRH3Q.js → evidence-VD6736FQ.js} +67 -64
  132. package/dist/{evolve-FTZBMNVW.js → evolve-AL3NGVRL.js} +65 -62
  133. package/dist/{extensions-VHRBEID7.js → extensions-MOVJ32NM.js} +9 -7
  134. package/dist/{fleet-CKZHJWZJ.js → fleet-QZHUMAGI.js} +114 -111
  135. package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-BAYT5FJZ.js} +10 -10
  136. package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-IREVMRU4.js} +7 -6
  137. package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-YCTT3HTI.js} +22 -19
  138. package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-QVJTDAVB.js} +58 -55
  139. package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-25QAFPK4.js} +4 -4
  140. package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-5O57AAJ7.js} +26 -23
  141. package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-CPH2W2T6.js} +59 -56
  142. package/dist/{fleet-view-WAMJYNDT.js → fleet-view-SWBR3VGQ.js} +58 -55
  143. package/dist/{init-5XQRBOFV.js → init-J477LKZH.js} +82 -79
  144. package/dist/{interop-34TVO25M.js → interop-3FCM6XLG.js} +11 -11
  145. package/dist/{library-3QY6KF57.js → library-QUQEIUG6.js} +30 -27
  146. package/dist/{memory-L4UTIIIW.js → memory-SGGSEP65.js} +67 -64
  147. package/dist/{models-ZVX3QOWE.js → models-HEKUAXXK.js} +53 -46
  148. package/dist/{monitor-CEKVSYTS.js → monitor-HKU57TYQ.js} +63 -60
  149. package/dist/{orchestrator-77BAP6BC.js → orchestrator-VDFAEFAI.js} +1831 -1057
  150. package/dist/{panes-7STHOAUJ.js → panes-DN2SSFOH.js} +5 -5
  151. package/dist/{panes-SHAUIRXY.js → panes-TALGNPZT.js} +29 -14
  152. package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
  153. package/dist/reset-EAJFFJVB.js +344 -0
  154. package/dist/{resources-74GKTLSF.js → resources-OVKSEFVE.js} +29 -20
  155. package/dist/{run-HBAUJNNZ.js → run-7DP7ZF2J.js} +120 -115
  156. package/dist/{share-G3APVLVP.js → share-WML67FT3.js} +32 -27
  157. package/dist/{skills-35HHUKCR.js → skills-SG662R2K.js} +41 -31
  158. package/dist/{skills-eval-QN4HSHDC.js → skills-eval-VVZEUU46.js} +78 -77
  159. package/dist/{skills-inventory-J357J34F.js → skills-inventory-I2E23GET.js} +23 -20
  160. package/dist/{slash-commands-JZZCQA32.js → slash-commands-S7MBJDQK.js} +40 -36
  161. package/dist/{steer-XAVHJM22.js → steer-2LQOMCPB.js} +3 -3
  162. package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
  163. package/dist/{targets-DSM6CY3M.js → targets-4QC3HIEW.js} +54 -54
  164. package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-TUHIJ6Y2.js} +5 -5
  165. package/dist/{tools-MKNWVPBH.js → tools-TFGJICCU.js} +10 -10
  166. package/dist/{trace-ECQ7TIYZ.js → trace-FXMXUZUF.js} +55 -7
  167. package/dist/uninstall-5PEVOE5B.js +408 -0
  168. package/dist/upgrade-M4WXY6KN.js +303 -0
  169. package/dist/{usage-X52N3IDJ.js → usage-N7ZNVLEM.js} +151 -104
  170. package/dist/{verifiers-EJTVVSMA.js → verifiers-DJTP4XX6.js} +15 -15
  171. package/dist/{verify-YJL6XET2.js → verify-RWE4PPEK.js} +9 -9
  172. package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
  173. package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-C7IQOXSP.js} +89 -86
  174. package/dist/{with-panes-OBOBFIIR.js → with-panes-4GCGSL7J.js} +53 -257
  175. package/dist/worker/entry.js +90 -74
  176. package/docs/README.md +176 -81
  177. package/docs/{acp.md → architecture/acp.md} +36 -20
  178. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  179. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  180. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +27 -23
  181. package/docs/architecture/artifact-versions.md +90 -0
  182. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  183. package/docs/{context-engine.md → architecture/context-engine.md} +29 -25
  184. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  185. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  186. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  187. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  188. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  189. package/docs/{model-catalog.md → architecture/model-catalog.md} +61 -27
  190. package/docs/{observability.md → architecture/observability.md} +38 -14
  191. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  192. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +57 -20
  193. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +99 -25
  194. package/docs/{safety-model.md → architecture/safety-model.md} +35 -20
  195. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  196. package/docs/architecture/time-conventions.md +125 -0
  197. package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
  198. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  199. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  200. package/docs/{built-in-agents.md → guide/built-in-agents.md} +65 -35
  201. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +66 -61
  202. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +323 -297
  203. package/docs/guide/configuration-reference.md +1163 -0
  204. package/docs/{environment-variables.md → guide/environment-variables.md} +33 -28
  205. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
  206. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  207. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
  208. package/docs/{glossary.md → guide/glossary.md} +14 -11
  209. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +81 -17
  210. package/docs/guide/panes-and-files.md +290 -0
  211. package/docs/{proactive-memory.md → guide/proactive-memory.md} +131 -107
  212. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  213. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +25 -3
  214. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  215. package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
  216. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
  217. package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
  218. package/docs/process/development-pipeline.md +152 -0
  219. package/docs/process/documentation-coverage.md +100 -0
  220. package/docs/process/documentation-guide.md +187 -0
  221. package/docs/{eval-runner.md → process/eval-runner.md} +108 -53
  222. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  223. package/docs/{evolution.md → process/evolution.md} +2 -2
  224. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
  225. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  226. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  227. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  228. package/evals/README.md +2 -2
  229. package/evals/behavioral-model.yaml +3 -2
  230. package/package.json +10 -8
  231. package/skills/README.md +52 -41
  232. package/skills/coding/ast-grep/SKILL.md +102 -31
  233. package/skills/coding/ast-grep/evals.md +26 -0
  234. package/skills/coding/coding-standards/SKILL.md +41 -6
  235. package/skills/coding/coding-standards/evals.md +23 -0
  236. package/skills/coding/prototype/SKILL.md +88 -29
  237. package/skills/coding/prototype/evals.md +19 -0
  238. package/skills/coding/tdd/SKILL.md +81 -54
  239. package/skills/coding/tdd/evals.md +20 -0
  240. package/skills/context/context-handoff/SKILL.md +44 -3
  241. package/skills/context/context-handoff/evals.md +44 -0
  242. package/skills/context/context-prime/SKILL.md +46 -16
  243. package/skills/context/context-prime/evals.md +45 -0
  244. package/skills/git/branch-closeout/SKILL.md +132 -0
  245. package/skills/git/branch-closeout/evals.md +133 -0
  246. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  247. package/skills/git/file-ticket/SKILL.md +78 -64
  248. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  249. package/skills/git/file-ticket/evals.md +31 -26
  250. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  251. package/skills/git/fix-issue/SKILL.md +88 -65
  252. package/skills/git/fix-issue/evals.md +35 -31
  253. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  254. package/skills/git/resolve-merge-conflicts/SKILL.md +101 -52
  255. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  256. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  257. package/skills/git/ship/SKILL.md +103 -67
  258. package/skills/git/ship/assets/pr-template.md +21 -0
  259. package/skills/git/ship/evals.md +44 -28
  260. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  261. package/skills/git/worktree-create/SKILL.md +80 -50
  262. package/skills/git/worktree-create/evals.md +40 -33
  263. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  264. package/skills/git/worktree-merge/SKILL.md +112 -65
  265. package/skills/git/worktree-merge/evals.md +42 -34
  266. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  267. package/skills/meta/clio-coder-dev/SKILL.md +9 -5
  268. package/skills/meta/clio-coder-dev/evals.md +3 -2
  269. package/skills/meta/clio-coder-test/SKILL.md +102 -95
  270. package/skills/meta/clio-coder-test/evals.md +9 -4
  271. package/skills/meta/clio-coder-test/references/harness.md +100 -124
  272. package/skills/meta/clio-coder-test/references/test-map.md +77 -50
  273. package/skills/meta/credentials/SKILL.md +2 -2
  274. package/skills/meta/find-skills/SKILL.md +2 -2
  275. package/skills/meta/herdr/SKILL.md +2 -2
  276. package/skills/meta/skill-craft/SKILL.md +22 -16
  277. package/skills/planning/archify/SKILL.md +196 -0
  278. package/skills/planning/archify/evals.md +65 -0
  279. package/skills/planning/architecture/SKILL.md +62 -13
  280. package/skills/planning/architecture/evals.md +65 -0
  281. package/skills/planning/backlog/SKILL.md +131 -15
  282. package/skills/planning/backlog/evals.md +142 -0
  283. package/skills/planning/prd/SKILL.md +47 -7
  284. package/skills/planning/prd/evals.md +54 -0
  285. package/skills/planning/product-intent/SKILL.md +58 -3
  286. package/skills/planning/product-intent/evals.md +70 -0
  287. package/skills/planning/tech-spec/SKILL.md +54 -3
  288. package/skills/planning/tech-spec/evals.md +73 -0
  289. package/skills/registry.yaml +70 -62
  290. package/skills/remote.yaml +13 -0
  291. package/skills/research/arxiv-literature/SKILL.md +77 -19
  292. package/skills/research/arxiv-literature/evals.md +50 -0
  293. package/skills/research/experiment-protocol/SKILL.md +21 -2
  294. package/skills/research/experiment-protocol/evals.md +23 -0
  295. package/skills/research/scientific-debugging/SKILL.md +24 -2
  296. package/skills/research/scientific-debugging/evals.md +18 -0
  297. package/skills/research/scientific-modernization/SKILL.md +27 -2
  298. package/skills/research/scientific-modernization/evals.md +27 -0
  299. package/skills/skill-marketplace.json +97 -62
  300. package/skills/workflow/cut-it/SKILL.md +66 -6
  301. package/skills/workflow/cut-it/evals.md +101 -0
  302. package/skills/workflow/design-council/SKILL.md +118 -28
  303. package/skills/workflow/design-council/evals.md +161 -0
  304. package/skills/workflow/grill-me/SKILL.md +87 -11
  305. package/skills/workflow/grill-me/evals.md +153 -0
  306. package/skills/workflow/workflow-distiller/SKILL.md +77 -18
  307. package/skills/workflow/workflow-distiller/evals.md +118 -0
  308. package/src/cli/args.ts +2 -2
  309. package/src/cli/bootstrap-generate.ts +1 -1
  310. package/src/cli/config-inspect.ts +65 -12
  311. package/src/cli/configure-interop.ts +105 -13
  312. package/src/cli/configure-oauth.ts +57 -0
  313. package/src/cli/configure-onboarding.ts +980 -0
  314. package/src/cli/configure-target.ts +594 -0
  315. package/src/cli/configure.ts +1082 -532
  316. package/src/cli/context-map.ts +114 -0
  317. package/src/cli/context.ts +4 -0
  318. package/src/cli/docs.ts +22 -14
  319. package/src/cli/doctor-naming.ts +5 -5
  320. package/src/cli/doctor-toolchain.ts +3 -3
  321. package/src/cli/eval.ts +1 -2
  322. package/src/cli/extensions.ts +2 -1
  323. package/src/cli/fleet.ts +1 -1
  324. package/src/cli/index.ts +3 -1
  325. package/src/cli/internal-dispatch.ts +3 -4
  326. package/src/cli/lifecycle-presenter.ts +436 -0
  327. package/src/cli/models.ts +10 -2
  328. package/src/cli/modes/print.ts +5 -1
  329. package/src/cli/panes.ts +19 -5
  330. package/src/cli/reset.ts +228 -106
  331. package/src/cli/run.ts +9 -4
  332. package/src/cli/select.ts +664 -0
  333. package/src/cli/share.ts +5 -1
  334. package/src/cli/skills-eval.ts +3 -3
  335. package/src/cli/skills.ts +9 -2
  336. package/src/cli/targets.ts +5 -6
  337. package/src/cli/trace.ts +55 -4
  338. package/src/cli/uninstall.ts +233 -165
  339. package/src/cli/upgrade.ts +204 -149
  340. package/src/cli/usage.ts +86 -27
  341. package/src/cli/validate-model.ts +3 -3
  342. package/src/cli/wiki-generate.ts +1 -1
  343. package/src/core/artifact-paths.ts +1 -1
  344. package/src/core/bash-exec.ts +131 -86
  345. package/src/core/bus-events.ts +51 -6
  346. package/src/core/config.ts +61 -1
  347. package/src/core/defaults.ts +7 -4
  348. package/src/core/dispatch-outcome.ts +16 -0
  349. package/src/core/external-diagnostic.ts +44 -0
  350. package/src/core/gateway-routing.ts +157 -0
  351. package/src/core/guardrails.ts +10 -49
  352. package/src/core/prompt-hint.ts +9 -0
  353. package/src/core/safe-exec.ts +17 -2
  354. package/src/core/skill-activation.ts +89 -2
  355. package/src/domains/agents/builtins/architect.md +2 -3
  356. package/src/domains/agents/builtins/coder.md +3 -2
  357. package/src/domains/agents/builtins/debugger.md +2 -2
  358. package/src/domains/agents/builtins/documenter.md +2 -2
  359. package/src/domains/agents/builtins/git-master.md +1 -1
  360. package/src/domains/agents/builtins/oracle.md +1 -1
  361. package/src/domains/agents/builtins/provenance.md +1 -1
  362. package/src/domains/agents/builtins/researcher.md +1 -1
  363. package/src/domains/agents/builtins/scout.md +1 -1
  364. package/src/domains/agents/builtins/tester.md +2 -2
  365. package/src/domains/agents/builtins/verifier.md +2 -2
  366. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  367. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  368. package/src/domains/agents/catalog.ts +13 -15
  369. package/src/domains/agents/contract.ts +2 -0
  370. package/src/domains/agents/extension.ts +23 -1
  371. package/src/domains/agents/result-contract.ts +70 -0
  372. package/src/domains/config/keybindings.ts +8 -0
  373. package/src/domains/context/extension.ts +0 -3
  374. package/src/domains/context/wiki/map-seed.ts +589 -0
  375. package/src/domains/context/wiki/plan.ts +2 -2
  376. package/src/domains/context/working-set/path-index.ts +1 -0
  377. package/src/domains/dispatch/admission.ts +29 -0
  378. package/src/domains/dispatch/agent-candidates.ts +10 -0
  379. package/src/domains/dispatch/budget-envelope.ts +86 -1
  380. package/src/domains/dispatch/capability-match.ts +11 -0
  381. package/src/domains/dispatch/capacity-lease.ts +17 -0
  382. package/src/domains/dispatch/contract.ts +11 -1
  383. package/src/domains/dispatch/extension.ts +237 -49
  384. package/src/domains/dispatch/host-verification.ts +435 -39
  385. package/src/domains/dispatch/intent-requirements.ts +10 -0
  386. package/src/domains/dispatch/intent.ts +18 -1
  387. package/src/domains/dispatch/path-scope.ts +235 -24
  388. package/src/domains/dispatch/run-event-journal.ts +4 -15
  389. package/src/domains/dispatch/state.ts +2 -3
  390. package/src/domains/dispatch/transport.ts +45 -21
  391. package/src/domains/dispatch/types.ts +58 -3
  392. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  393. package/src/domains/eval/artifacts/store.ts +5 -0
  394. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  395. package/src/domains/eval/metrics/token-stream.ts +201 -31
  396. package/src/domains/eval/metrics/tracked.ts +40 -4
  397. package/src/domains/eval/runners/clio-run.ts +5 -2
  398. package/src/domains/eval/schema/suite.ts +28 -0
  399. package/src/domains/eval/schema/verdict.ts +2 -2
  400. package/src/domains/eval/store.ts +8 -1
  401. package/src/domains/eval/suites/resolve.ts +13 -1
  402. package/src/domains/eval/suites/run.ts +24 -3
  403. package/src/domains/evidence/trust-status.ts +10 -1
  404. package/src/domains/extensions/contract.ts +15 -1
  405. package/src/domains/extensions/discovery.ts +238 -41
  406. package/src/domains/extensions/extension.ts +105 -6
  407. package/src/domains/extensions/index.ts +24 -0
  408. package/src/domains/extensions/integrity.ts +189 -0
  409. package/src/domains/extensions/manager.ts +17 -1
  410. package/src/domains/extensions/resource-path.ts +27 -0
  411. package/src/domains/extensions/resources.ts +18 -38
  412. package/src/domains/extensions/snapshot-store.ts +39 -0
  413. package/src/domains/extensions/snapshot.ts +180 -0
  414. package/src/domains/extensions/state.ts +385 -57
  415. package/src/domains/extensions/types.ts +118 -1
  416. package/src/domains/interop/registry.ts +6 -2
  417. package/src/domains/interop/types.ts +4 -0
  418. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  419. package/src/domains/lifecycle/migrations/index.ts +6 -0
  420. package/src/domains/lifecycle/naming-resources.ts +19 -4
  421. package/src/domains/lifecycle/naming-yazi.ts +10 -5
  422. package/src/domains/memory/task-memory-policy.ts +70 -26
  423. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  424. package/src/domains/middleware/contract.ts +26 -0
  425. package/src/domains/middleware/extension.ts +24 -24
  426. package/src/domains/middleware/hook-receipts.ts +27 -4
  427. package/src/domains/middleware/hooks-io.ts +65 -32
  428. package/src/domains/middleware/hooks.ts +64 -0
  429. package/src/domains/middleware/index.ts +28 -5
  430. package/src/domains/middleware/marketplace-offer.ts +3 -35
  431. package/src/domains/middleware/memory-intervention.ts +127 -32
  432. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  433. package/src/domains/middleware/registrations.ts +326 -0
  434. package/src/domains/middleware/runtime.ts +28 -0
  435. package/src/domains/middleware/skills-reminder.ts +31 -2
  436. package/src/domains/middleware/snapshot.ts +20 -7
  437. package/src/domains/mux/contract.ts +38 -0
  438. package/src/domains/mux/detect.ts +6 -13
  439. package/src/domains/mux/index.ts +1 -1
  440. package/src/domains/mux/operations.ts +44 -5
  441. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  442. package/src/domains/mux/yazi/session.ts +53 -4
  443. package/src/domains/mux/yazi/theme.ts +117 -17
  444. package/src/domains/observability/compaction-usage.ts +118 -0
  445. package/src/domains/observability/contract.ts +10 -11
  446. package/src/domains/observability/cost.ts +1 -1
  447. package/src/domains/observability/extension.ts +17 -4
  448. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  449. package/src/domains/observability/projection.ts +14 -90
  450. package/src/domains/observability/trace-store.ts +43 -7
  451. package/src/domains/prompts/compiler.ts +73 -53
  452. package/src/domains/prompts/contract.ts +15 -3
  453. package/src/domains/prompts/extension.ts +97 -9
  454. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
  455. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  456. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  457. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  458. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  459. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  460. package/src/domains/prompts/fragments/operating/skills.md +10 -24
  461. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  462. package/src/domains/providers/contract.ts +4 -1
  463. package/src/domains/providers/extension.ts +40 -9
  464. package/src/domains/providers/index.ts +1 -1
  465. package/src/domains/providers/model-capabilities.ts +9 -0
  466. package/src/domains/providers/model-discovery.ts +2 -0
  467. package/src/domains/providers/model-runtime-capabilities.ts +99 -25
  468. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +699 -114
  469. package/src/domains/providers/runtime-resolution.ts +31 -0
  470. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  471. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  472. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  473. package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
  474. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  475. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  476. package/src/domains/providers/support.ts +11 -5
  477. package/src/domains/providers/target-model-cache.ts +25 -2
  478. package/src/domains/providers/types/capability-flags.ts +2 -0
  479. package/src/domains/providers/types/cost-provenance.ts +19 -0
  480. package/src/domains/providers/types/local-model-quirks.ts +85 -37
  481. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  482. package/src/domains/providers/types/target-descriptor.ts +19 -0
  483. package/src/domains/resources/index.ts +3 -0
  484. package/src/domains/resources/skills/install.ts +72 -7
  485. package/src/domains/resources/skills/loader.ts +23 -19
  486. package/src/domains/resources/skills/marketplace.ts +63 -11
  487. package/src/domains/safety/autonomy.ts +15 -0
  488. package/src/domains/safety/call-target.ts +1 -1
  489. package/src/domains/safety/index.ts +1 -0
  490. package/src/domains/safety/loop-detector.ts +7 -4
  491. package/src/domains/safety/path-policy.ts +1 -1
  492. package/src/domains/safety/policy-engine.ts +34 -11
  493. package/src/domains/safety/protected-artifacts.ts +191 -88
  494. package/src/domains/safety/run-effects.ts +2 -22
  495. package/src/domains/safety/skill-authority.ts +55 -0
  496. package/src/domains/session/compaction/compact.ts +72 -22
  497. package/src/domains/session/entries.ts +6 -0
  498. package/src/domains/session/task-board.ts +10 -9
  499. package/src/domains/session/usage.ts +3 -3
  500. package/src/domains/share/archive.ts +164 -7
  501. package/src/engine/acp/server.ts +62 -9
  502. package/src/engine/agent.ts +13 -3
  503. package/src/engine/ai.ts +26 -8
  504. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  505. package/src/engine/api-registry.ts +3 -0
  506. package/src/engine/apis/llamacpp-residency.ts +3 -4
  507. package/src/engine/apis/lmstudio.ts +3 -3
  508. package/src/engine/apis/ollama-native.ts +6 -6
  509. package/src/engine/apis/openai-completions.ts +145 -39
  510. package/src/engine/apis/output-budget.ts +8 -18
  511. package/src/engine/apis/residency.ts +8 -27
  512. package/src/engine/external-subprocess.ts +114 -6
  513. package/src/engine/gemma-channel-filter.ts +19 -0
  514. package/src/engine/loop-guard.ts +92 -12
  515. package/src/engine/worker-runtime.ts +40 -11
  516. package/src/engine/worker-tools.ts +3 -1
  517. package/src/entry/background-model-metadata.ts +18 -0
  518. package/src/entry/compaction-prompt.ts +57 -0
  519. package/src/entry/extension-hook-sources.ts +28 -0
  520. package/src/entry/extension-reload.ts +309 -0
  521. package/src/entry/orchestrator.ts +464 -251
  522. package/src/entry/task-memory-lifecycle.ts +35 -0
  523. package/src/interactive/application-controller.ts +2 -1
  524. package/src/interactive/bus-notices.ts +8 -1
  525. package/src/interactive/chat-loop-messages.ts +16 -17
  526. package/src/interactive/chat-loop.ts +75 -3
  527. package/src/interactive/chat-panel.ts +36 -13
  528. package/src/interactive/chat-renderer.ts +72 -7
  529. package/src/interactive/cost-overlay.ts +26 -2
  530. package/src/interactive/dispatch-board.ts +6 -11
  531. package/src/interactive/footer/widgets.ts +13 -0
  532. package/src/interactive/interactive-application.ts +39 -4
  533. package/src/interactive/interactive-input-runtime.ts +4 -0
  534. package/src/interactive/interactive-presentation.ts +2 -2
  535. package/src/interactive/interactive-slash-runtime.ts +4 -1
  536. package/src/interactive/overlays/extensions.ts +9 -1
  537. package/src/interactive/overlays/help-reference.ts +13 -0
  538. package/src/interactive/overlays/settings.ts +27 -16
  539. package/src/interactive/panes-runtime.ts +111 -35
  540. package/src/interactive/prompt-cache-identity.ts +88 -0
  541. package/src/interactive/renderers/worker-entry.ts +32 -0
  542. package/src/interactive/slash-commands.ts +153 -20
  543. package/src/interactive/stream-pacing-policy.ts +0 -23
  544. package/src/interactive/theme/labels.ts +19 -13
  545. package/src/interactive/turn-context.ts +39 -20
  546. package/src/interactive/turn-recovery.ts +8 -0
  547. package/src/interactive/turn-runtime.ts +27 -11
  548. package/src/interactive/turn-state.ts +7 -0
  549. package/src/interactive/worker-receipts.ts +1 -0
  550. package/src/interactive/worker-stream.ts +6 -1
  551. package/src/interactive/yazi-bridge.ts +60 -6
  552. package/src/tools/agent-tools.ts +30 -1
  553. package/src/tools/artifact.ts +2 -2
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/bootstrap.ts +4 -0
  557. package/src/tools/builtin-tool-catalog.ts +52 -22
  558. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  559. package/src/tools/codewiki/code-nav.ts +99 -13
  560. package/src/tools/context/docs-engine.ts +20 -7
  561. package/src/tools/context/index.ts +59 -21
  562. package/src/tools/core-bootstrap.ts +28 -6
  563. package/src/tools/credential-present.ts +1 -2
  564. package/src/tools/dispatch-arguments.ts +6 -1
  565. package/src/tools/dispatch-event-text.ts +10 -0
  566. package/src/tools/dispatch-plan.ts +49 -4
  567. package/src/tools/dispatch-run-events.ts +1 -1
  568. package/src/tools/dispatch-runner.ts +12 -0
  569. package/src/tools/dispatch-schema.ts +338 -0
  570. package/src/tools/dispatch-types.ts +3 -0
  571. package/src/tools/dispatch.ts +9 -254
  572. package/src/tools/ledger.ts +3 -5
  573. package/src/tools/monitor-surface.ts +5 -13
  574. package/src/tools/observation.ts +4 -5
  575. package/src/tools/panes-surface.ts +4 -11
  576. package/src/tools/panes.ts +4 -2
  577. package/src/tools/policy.ts +15 -2
  578. package/src/tools/read.ts +5 -6
  579. package/src/tools/registry.ts +41 -12
  580. package/src/tools/result-shaping.ts +18 -14
  581. package/src/tools/steer-surface.ts +1 -1
  582. package/src/tools/tasks.ts +1 -1
  583. package/src/tools/truncate.ts +6 -5
  584. package/src/tools/verify/surface.ts +6 -12
  585. package/src/tools/web-fetch-surface.ts +1 -3
  586. package/src/tools/worker-evidence.ts +3 -1
  587. package/src/worker/spec-contract.ts +4 -0
  588. package/dist/builtins-UJLMOVOV.js +0 -17
  589. package/dist/chunk-5QIAJV2D.js +0 -48
  590. package/dist/chunk-JZWT5J3Y.js +0 -814
  591. package/dist/chunk-K7VKOLQQ.js +0 -15
  592. package/dist/chunk-PMZCIOCJ.js +0 -25
  593. package/dist/chunk-SUW5DORT.js +0 -819
  594. package/dist/chunk-UOV2BYIW.js +0 -107
  595. package/dist/chunk-WR6U3OVP.js +0 -45
  596. package/dist/chunk-Y45G3AXC.js +0 -1558
  597. package/dist/reset-EOLM7GVE.js +0 -230
  598. package/dist/uninstall-N34PCTGJ.js +0 -331
  599. package/dist/upgrade-H7TOM7YL.js +0 -323
  600. package/docs/artifact-versions.md +0 -67
  601. package/docs/development-pipeline.md +0 -121
  602. package/docs/documentation-coverage.md +0 -46
  603. package/docs/documentation-guide.md +0 -167
  604. package/docs/time-conventions.md +0 -101
@@ -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
 
package/src/cli/panes.ts CHANGED
@@ -1,16 +1,22 @@
1
+ import { renderHerdrThemeBlock } from "../domains/mux/yazi/theme.js";
1
2
  import { printError } from "./shared.js";
2
3
  import { runToolsCommand } from "./tools.js";
3
4
 
4
5
  const HELP = `clio-coder panes install [--force] [--json]
6
+ clio-coder panes theme
5
7
 
6
- Install the pane multiplexer Clio drives. This is an alias for
7
- \`clio-coder tools install herdr\`; the toolchain command is where every pinned
8
- external program is managed, and \`clio-coder tools status herdr\` explains
9
- which copy Clio would run.
8
+ install Install the pane multiplexer Clio drives. This is an alias for
9
+ \`clio-coder tools install herdr\`; the toolchain command is where every
10
+ pinned external program is managed, and \`clio-coder tools status herdr\`
11
+ explains which copy Clio would run.
12
+ theme Print Clio's theme tokens as a herdr [theme.custom] block. herdr styles
13
+ its own chrome from its config.toml and offers no per-pane styling, so
14
+ Clio prints the block for you to paste rather than editing another
15
+ program's configuration. The files pane itself is themed by Clio at open.
10
16
  `;
11
17
 
12
18
  /**
13
- * The user-facing verb for the pane layer's one setup step.
19
+ * The user-facing verbs for the pane layer's setup.
14
20
  *
15
21
  * Panes are the feature; herdr is the program behind it. Naming the program in
16
22
  * a command an operator types is a leak, so the alias exists and routes to the
@@ -26,6 +32,14 @@ export async function runPanesCommand(argv: ReadonlyArray<string> = []): Promise
26
32
  process.stdout.write(HELP);
27
33
  return 2;
28
34
  }
35
+ if (subcommand === "theme") {
36
+ if (rest.length > 0) {
37
+ printError(`panes theme takes no arguments, got: ${rest.join(" ")}`);
38
+ return 2;
39
+ }
40
+ process.stdout.write(renderHerdrThemeBlock());
41
+ return 0;
42
+ }
29
43
  if (subcommand !== "install") {
30
44
  printError(`unknown panes command: ${subcommand}`);
31
45
  process.stderr.write(HELP);