@iowarp/clio-coder 0.4.2 → 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 (369) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/CONTRIBUTING.md +86 -19
  3. package/README.md +35 -6
  4. package/dist/{acp-TMDQZDIG.js → acp-H2NGRPWO.js} +11 -11
  5. package/dist/{agents-5N5NG3XG.js → agents-TL5LLUQP.js} +54 -53
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-Z5CCBXKQ.js → auth-E5SW4HMS.js} +19 -16
  8. package/dist/{builtins-K6TNDT24.js → builtins-IA7V7FUC.js} +9 -4
  9. package/dist/{chunk-ZW4HH5JJ.js → chunk-2APPQIER.js} +6 -6
  10. package/dist/{chunk-72GZI5EV.js → chunk-2JH2WHGE.js} +2 -2
  11. package/dist/{chunk-UBRFI4HS.js → chunk-2UG5F4C5.js} +127 -47
  12. package/dist/{chunk-UH632ZYL.js → chunk-2UH2KFUP.js} +2 -2
  13. package/dist/{chunk-3F7VUY77.js → chunk-2VIKGWFZ.js} +2 -2
  14. package/dist/{chunk-I66EAJFY.js → chunk-2WZ546HR.js} +267 -232
  15. package/dist/{chunk-RKSR6VSF.js → chunk-4IUZQIJ3.js} +29 -1
  16. package/dist/{chunk-2X4RYJTJ.js → chunk-4UVU7BJ5.js} +2 -2
  17. package/dist/{chunk-M2DAX4F6.js → chunk-4WR7VSYB.js} +2 -2
  18. package/dist/{chunk-5KW52TEP.js → chunk-54CBCGIR.js} +5 -5
  19. package/dist/{chunk-3KIPBMUA.js → chunk-5ICU3EUH.js} +2 -2
  20. package/dist/{chunk-77QIVUZB.js → chunk-5MEZN6CB.js} +4 -4
  21. package/dist/{chunk-O42A54GG.js → chunk-5OIVVPHF.js} +2 -2
  22. package/dist/{chunk-LJID3DYZ.js → chunk-64I3JVYM.js} +2 -2
  23. package/dist/{chunk-4JDLP6ZS.js → chunk-6PTFB5VS.js} +7 -7
  24. package/dist/{chunk-VN3SHNBN.js → chunk-7DICMOS6.js} +2 -2
  25. package/dist/{chunk-HLAFFSEK.js → chunk-7DRAWPTZ.js} +2 -2
  26. package/dist/chunk-7E7I3WLS.js +3762 -0
  27. package/dist/{chunk-YJISEZKC.js → chunk-7ZYNNDKC.js} +6 -6
  28. package/dist/{chunk-I66ZTYNP.js → chunk-AF4YM7Z4.js} +236 -101
  29. package/dist/{chunk-2HFQNRV3.js → chunk-AX2THNSA.js} +12 -12
  30. package/dist/{chunk-PGF63K6I.js → chunk-B4OAX3SI.js} +65 -3
  31. package/dist/{chunk-W6NIE6OW.js → chunk-B4VEBZKF.js} +3 -3
  32. package/dist/{chunk-JBCS7CRR.js → chunk-BEPZRGGU.js} +10 -10
  33. package/dist/{chunk-XGDPUNND.js → chunk-CE5AX47J.js} +2 -2
  34. package/dist/{chunk-I64IFBLB.js → chunk-DWUOQKRU.js} +17 -10
  35. package/dist/{chunk-DZAW46HP.js → chunk-E3TPLWFX.js} +3 -3
  36. package/dist/{chunk-HIICAHCJ.js → chunk-EKCHAPYA.js} +2 -2
  37. package/dist/{chunk-XE3PCIXH.js → chunk-F5JHEYZM.js} +7 -7
  38. package/dist/{chunk-5PFYMY2V.js → chunk-FTMGRKEF.js} +2 -2
  39. package/dist/{chunk-ZNT2M6TG.js → chunk-G76U63X4.js} +17 -17
  40. package/dist/{chunk-34BHNEE3.js → chunk-GHS5EBTQ.js} +58 -7
  41. package/dist/{chunk-2NHR3NAY.js → chunk-GI7YYQ3F.js} +40 -34
  42. package/dist/{chunk-DYHAXKHD.js → chunk-GWZNEVM2.js} +12 -8
  43. package/dist/chunk-GYV6VZOC.js +26 -0
  44. package/dist/{chunk-MQXIVJ35.js → chunk-HAXOFFRH.js} +5 -5
  45. package/dist/{chunk-W4YEMFBX.js → chunk-HEQY7ZFI.js} +2 -2
  46. package/dist/{chunk-IKOZFYBN.js → chunk-I7ZPNEJM.js} +145 -102
  47. package/dist/{chunk-WNP7O5WZ.js → chunk-ID64D7PE.js} +4 -4
  48. package/dist/{chunk-XQRY4DTA.js → chunk-IGLP3ODT.js} +10 -10
  49. package/dist/chunk-IJNZMHLA.js +101 -0
  50. package/dist/{chunk-JWJGP5DQ.js → chunk-INY6HTFL.js} +7 -7
  51. package/dist/{chunk-PBP4B7XR.js → chunk-IUE3Y34X.js} +2 -2
  52. package/dist/{chunk-B74PXLU7.js → chunk-IWT4SF4R.js} +3 -3
  53. package/dist/{chunk-B7HM5Z7T.js → chunk-JDAY6FIL.js} +5 -5
  54. package/dist/{chunk-PJX3WQUQ.js → chunk-JEQ3XTHC.js} +2 -2
  55. package/dist/{chunk-FSP7CMNU.js → chunk-JGRC33J2.js} +50 -4
  56. package/dist/{chunk-X7IARSHT.js → chunk-JKKCYP3C.js} +9 -9
  57. package/dist/{chunk-HJWWJ6IL.js → chunk-JSC3U7TI.js} +16 -4
  58. package/dist/{chunk-SSEYRH53.js → chunk-KK4JZPBQ.js} +19 -140
  59. package/dist/{chunk-IHXBNWMM.js → chunk-KXDSS5WJ.js} +7 -3
  60. package/dist/{chunk-Q4XWMHX6.js → chunk-L47TF46W.js} +2 -2
  61. package/dist/{chunk-O3YUNJZ2.js → chunk-LDJG7DW3.js} +81 -24
  62. package/dist/{chunk-CDNVLKUX.js → chunk-LLDJM5XK.js} +13 -7
  63. package/dist/{chunk-F2I26BDK.js → chunk-MUW2BDDH.js} +4 -4
  64. package/dist/{chunk-HKMD33FO.js → chunk-MWUZBSAQ.js} +79 -76
  65. package/dist/{chunk-QQLGQY2A.js → chunk-N2Z7HLVY.js} +20 -20
  66. package/dist/{chunk-DZEK6CJN.js → chunk-NIQJ66N4.js} +19 -19
  67. package/dist/{chunk-CWVRRIEI.js → chunk-NZMNUPZZ.js} +2 -2
  68. package/dist/{chunk-462T4EGZ.js → chunk-O5CVSAG5.js} +2 -2
  69. package/dist/{chunk-TPEQIQIE.js → chunk-OML5D5V5.js} +8 -8
  70. package/dist/{chunk-IKSLQ4XV.js → chunk-PAJQJ7BS.js} +558 -216
  71. package/dist/{chunk-ZW55JB7N.js → chunk-PUVDKJ2Y.js} +2 -2
  72. package/dist/{chunk-UH347SHR.js → chunk-QWGDJJYJ.js} +11 -11
  73. package/dist/chunk-R6Q67RJH.js +134 -0
  74. package/dist/{chunk-CRFOIAX3.js → chunk-RRNP2ANY.js} +6 -6
  75. package/dist/{chunk-IDNA72AH.js → chunk-RSJ25QSL.js} +2 -2
  76. package/dist/chunk-SKHCAU7K.js +385 -0
  77. package/dist/{chunk-RLYRBIYQ.js → chunk-TM6LQDI3.js} +20 -12
  78. package/dist/chunk-UOIZ7DA4.js +41 -0
  79. package/dist/{chunk-P75RZCJW.js → chunk-UPZU6GE4.js} +3 -3
  80. package/dist/{chunk-MCMZMDAC.js → chunk-V2ANDPVT.js} +4 -4
  81. package/dist/{chunk-AK5XEFVZ.js → chunk-VA5FNYMT.js} +26 -13
  82. package/dist/{chunk-IMXMHHMQ.js → chunk-VW6DOEDG.js} +332 -57
  83. package/dist/{chunk-XOXV5GKE.js → chunk-W6RRQCPQ.js} +16 -7
  84. package/dist/{chunk-CYZW7JHJ.js → chunk-WBKFA554.js} +8 -8
  85. package/dist/{chunk-BO7Y52RY.js → chunk-WCXUNS7U.js} +7 -7
  86. package/dist/{chunk-ZGNYYXQ6.js → chunk-WRBAGUNF.js} +3 -3
  87. package/dist/{chunk-FVDGR2ZL.js → chunk-XIVNBFZS.js} +85 -30
  88. package/dist/{chunk-BYMNWQ7O.js → chunk-XPWWI35G.js} +299 -58
  89. package/dist/{chunk-KPXDY6QF.js → chunk-XRZT5WY5.js} +2 -2
  90. package/dist/{chunk-AZ4WMN4W.js → chunk-Y3CBHOR6.js} +2 -2
  91. package/dist/{chunk-VXMFAE2W.js → chunk-YPC6ZR5L.js} +19 -6
  92. package/dist/{chunk-54ODD65L.js → chunk-YQWYVTMC.js} +4 -4
  93. package/dist/{chunk-M2WXEHER.js → chunk-ZA4VCIGV.js} +2 -2
  94. package/dist/{chunk-7BHIY2MW.js → chunk-ZDN3Y73Y.js} +6 -6
  95. package/dist/{chunk-E7GT7O5N.js → chunk-ZWPRK62N.js} +7 -4
  96. package/dist/cli/index.js +38 -37
  97. package/dist/{clio-7VB377CC.js → clio-CMMK4KRR.js} +7 -7
  98. package/dist/{code-nav-YVLCYA7V.js → code-nav-MDZNQS33.js} +7 -7
  99. package/dist/{components-UBWCQSRW.js → components-UCUQ4QXW.js} +4 -4
  100. package/dist/{config-4HVOS65E.js → config-SVM5P5YI.js} +76 -74
  101. package/dist/{configure-PIWO7B24.js → configure-LE3IK2TJ.js} +26 -24
  102. package/dist/{context-IYEHL3WQ.js → context-2OHRKS42.js} +66 -63
  103. package/dist/{context-N6ZE3LGJ.js → context-E3VC7RX5.js} +15 -11
  104. package/dist/{context-KQYIWPWT.js → context-VNCR7KAG.js} +60 -45
  105. package/dist/{context-clear-G4OGZJDS.js → context-clear-BW4O37TG.js} +61 -59
  106. package/dist/context-map-COB37XXN.js +505 -0
  107. package/dist/{context-working-set-BWLF6LJP.js → context-working-set-VDS25HXZ.js} +17 -16
  108. package/dist/{dispatch-runner-2QQAITS3.js → dispatch-runner-5AHT53RF.js} +85 -74
  109. package/dist/{doctor-LHBD36VU.js → doctor-WNNVO6FY.js} +37 -37
  110. package/dist/{eval-C45FYRJ6.js → eval-7G7SGAYO.js} +285 -114
  111. package/dist/{eval-inventory-6DEJPLBF.js → eval-inventory-Y6QRFOH5.js} +4 -4
  112. package/dist/{evidence-6SHONYAF.js → evidence-VD6736FQ.js} +63 -62
  113. package/dist/{evolve-KRKMV72X.js → evolve-AL3NGVRL.js} +62 -61
  114. package/dist/{extensions-KPZ2UHBB.js → extensions-MOVJ32NM.js} +7 -7
  115. package/dist/{fleet-IVTCKDHT.js → fleet-QZHUMAGI.js} +110 -108
  116. package/dist/{fleet-commands-EDWL3IT7.js → fleet-commands-BAYT5FJZ.js} +10 -10
  117. package/dist/{fleet-decisions-YP3YEFGK.js → fleet-decisions-IREVMRU4.js} +7 -6
  118. package/dist/{fleet-graph-ZFWKHY2M.js → fleet-graph-YCTT3HTI.js} +19 -18
  119. package/dist/{fleet-inspect-FVUNCBML.js → fleet-inspect-QVJTDAVB.js} +55 -54
  120. package/dist/{fleet-preflight-UN5XED4R.js → fleet-preflight-25QAFPK4.js} +4 -4
  121. package/dist/{fleet-validate-XOWC4HSX.js → fleet-validate-5O57AAJ7.js} +23 -22
  122. package/dist/{fleet-verify-UN3SODEL.js → fleet-verify-CPH2W2T6.js} +56 -55
  123. package/dist/{fleet-view-TWHJKCN6.js → fleet-view-SWBR3VGQ.js} +55 -54
  124. package/dist/{init-T2QORQ3Y.js → init-J477LKZH.js} +78 -76
  125. package/dist/{interop-IN5I2A66.js → interop-3FCM6XLG.js} +11 -11
  126. package/dist/{library-LSCATDLZ.js → library-QUQEIUG6.js} +28 -27
  127. package/dist/{memory-HYOKAGGJ.js → memory-SGGSEP65.js} +64 -63
  128. package/dist/{models-2GPMFYCM.js → models-HEKUAXXK.js} +49 -43
  129. package/dist/{monitor-E4ASVUJH.js → monitor-HKU57TYQ.js} +61 -60
  130. package/dist/{orchestrator-DDMPR3PY.js → orchestrator-VDFAEFAI.js} +919 -546
  131. package/dist/{panes-E3RUXOW5.js → panes-DN2SSFOH.js} +3 -3
  132. package/dist/{panes-IXKLOKA2.js → panes-TALGNPZT.js} +8 -8
  133. package/dist/{paths-L7LGY6RN.js → paths-NBMFAIEZ.js} +5 -5
  134. package/dist/reset-EAJFFJVB.js +344 -0
  135. package/dist/{resources-OTRSN34L.js → resources-OVKSEFVE.js} +27 -20
  136. package/dist/{run-5DEYH5QK.js → run-7DP7ZF2J.js} +113 -109
  137. package/dist/{share-IHWTLO3M.js → share-WML67FT3.js} +26 -25
  138. package/dist/{skills-IYMXMKW4.js → skills-SG662R2K.js} +39 -31
  139. package/dist/{skills-eval-DROHSJAR.js → skills-eval-VVZEUU46.js} +74 -73
  140. package/dist/{skills-inventory-D7X4L4ZX.js → skills-inventory-I2E23GET.js} +21 -20
  141. package/dist/{slash-commands-QBM7UZ3B.js → slash-commands-S7MBJDQK.js} +35 -34
  142. package/dist/{steer-Z5DO23FJ.js → steer-2LQOMCPB.js} +3 -3
  143. package/dist/{support-U7QOWY26.js → support-CC2UJBJ6.js} +6 -6
  144. package/dist/{targets-P2FUC4IL.js → targets-4QC3HIEW.js} +48 -45
  145. package/dist/{terminal-lease-YREJ3JX2.js → terminal-lease-TUHIJ6Y2.js} +2 -2
  146. package/dist/{tools-5B7RO6MV.js → tools-TFGJICCU.js} +8 -8
  147. package/dist/{trace-YMGMUM6A.js → trace-FXMXUZUF.js} +7 -7
  148. package/dist/uninstall-5PEVOE5B.js +408 -0
  149. package/dist/upgrade-M4WXY6KN.js +303 -0
  150. package/dist/{usage-ME5MPXGX.js → usage-N7ZNVLEM.js} +147 -102
  151. package/dist/{verifiers-BVZ7IWOO.js → verifiers-DJTP4XX6.js} +15 -15
  152. package/dist/{verify-5K7ZKQFC.js → verify-RWE4PPEK.js} +9 -9
  153. package/dist/{wiki-generate-F5W5QTYY.js → wiki-generate-C7IQOXSP.js} +84 -82
  154. package/dist/{with-panes-BYOJCLAM.js → with-panes-4GCGSL7J.js} +9 -9
  155. package/dist/worker/entry.js +61 -60
  156. package/docs/architecture/artifact-placement.md +1 -0
  157. package/docs/architecture/artifact-versions.md +1 -1
  158. package/docs/architecture/context-engine.md +4 -0
  159. package/docs/architecture/middleware-and-components.md +1 -1
  160. package/docs/architecture/model-catalog.md +21 -10
  161. package/docs/architecture/observability.md +12 -1
  162. package/docs/architecture/prompt-envelope-and-tools.md +2 -0
  163. package/docs/architecture/provider-adapter-cookbook.md +63 -0
  164. package/docs/architecture/safety-model.md +15 -5
  165. package/docs/guide/built-in-agents.md +17 -3
  166. package/docs/guide/commands-and-modes.md +1 -1
  167. package/docs/guide/configuration-and-targets.md +97 -9
  168. package/docs/guide/configuration-reference.md +7 -2
  169. package/docs/guide/environment-variables.md +2 -0
  170. package/docs/guide/installation-and-lifecycle.md +37 -4
  171. package/docs/guide/proactive-memory.md +66 -55
  172. package/docs/guide/skills-marketplace.md +18 -0
  173. package/docs/process/development-pipeline.md +34 -1
  174. package/docs/process/eval-runner.md +67 -3
  175. package/evals/behavioral-model.yaml +3 -2
  176. package/package.json +2 -2
  177. package/skills/README.md +7 -5
  178. package/skills/coding/ast-grep/SKILL.md +101 -30
  179. package/skills/coding/ast-grep/evals.md +26 -0
  180. package/skills/coding/coding-standards/SKILL.md +40 -5
  181. package/skills/coding/coding-standards/evals.md +23 -0
  182. package/skills/coding/prototype/SKILL.md +87 -28
  183. package/skills/coding/prototype/evals.md +19 -0
  184. package/skills/coding/tdd/SKILL.md +80 -53
  185. package/skills/coding/tdd/evals.md +20 -0
  186. package/skills/context/context-handoff/SKILL.md +43 -2
  187. package/skills/context/context-handoff/evals.md +44 -0
  188. package/skills/context/context-prime/SKILL.md +45 -15
  189. package/skills/context/context-prime/evals.md +45 -0
  190. package/skills/git/branch-closeout/SKILL.md +132 -0
  191. package/skills/git/branch-closeout/evals.md +133 -0
  192. package/skills/git/branch-closeout/references/closeout-checklist.md +81 -0
  193. package/skills/git/file-ticket/SKILL.md +77 -63
  194. package/skills/git/file-ticket/assets/issue-template.md +22 -0
  195. package/skills/git/file-ticket/evals.md +31 -26
  196. package/skills/git/file-ticket/references/issue-discovery.md +49 -0
  197. package/skills/git/fix-issue/SKILL.md +87 -64
  198. package/skills/git/fix-issue/evals.md +35 -31
  199. package/skills/git/fix-issue/references/diagnosis-and-rca.md +46 -0
  200. package/skills/git/resolve-merge-conflicts/SKILL.md +100 -51
  201. package/skills/git/resolve-merge-conflicts/evals.md +52 -25
  202. package/skills/git/resolve-merge-conflicts/references/conflict-matrix.md +126 -0
  203. package/skills/git/ship/SKILL.md +103 -67
  204. package/skills/git/ship/assets/pr-template.md +21 -0
  205. package/skills/git/ship/evals.md +44 -28
  206. package/skills/git/ship/references/remote-and-branch-policy.md +62 -0
  207. package/skills/git/worktree-create/SKILL.md +80 -50
  208. package/skills/git/worktree-create/evals.md +40 -33
  209. package/skills/git/worktree-create/references/worktree-setup.md +62 -66
  210. package/skills/git/worktree-merge/SKILL.md +112 -65
  211. package/skills/git/worktree-merge/evals.md +42 -34
  212. package/skills/git/worktree-merge/references/merge-strategies.md +52 -0
  213. package/skills/planning/archify/SKILL.md +196 -0
  214. package/skills/planning/archify/evals.md +65 -0
  215. package/skills/planning/architecture/SKILL.md +61 -12
  216. package/skills/planning/architecture/evals.md +65 -0
  217. package/skills/planning/backlog/SKILL.md +130 -14
  218. package/skills/planning/backlog/evals.md +142 -0
  219. package/skills/planning/prd/SKILL.md +46 -6
  220. package/skills/planning/prd/evals.md +54 -0
  221. package/skills/planning/product-intent/SKILL.md +57 -2
  222. package/skills/planning/product-intent/evals.md +70 -0
  223. package/skills/planning/tech-spec/SKILL.md +53 -2
  224. package/skills/planning/tech-spec/evals.md +73 -0
  225. package/skills/registry.yaml +58 -50
  226. package/skills/remote.yaml +13 -0
  227. package/skills/research/arxiv-literature/SKILL.md +76 -18
  228. package/skills/research/arxiv-literature/evals.md +50 -0
  229. package/skills/research/experiment-protocol/SKILL.md +20 -1
  230. package/skills/research/experiment-protocol/evals.md +23 -0
  231. package/skills/research/scientific-debugging/SKILL.md +23 -1
  232. package/skills/research/scientific-debugging/evals.md +18 -0
  233. package/skills/research/scientific-modernization/SKILL.md +26 -1
  234. package/skills/research/scientific-modernization/evals.md +27 -0
  235. package/skills/skill-marketplace.json +63 -28
  236. package/skills/workflow/cut-it/SKILL.md +65 -5
  237. package/skills/workflow/cut-it/evals.md +101 -0
  238. package/skills/workflow/design-council/SKILL.md +117 -27
  239. package/skills/workflow/design-council/evals.md +161 -0
  240. package/skills/workflow/grill-me/SKILL.md +86 -10
  241. package/skills/workflow/grill-me/evals.md +153 -0
  242. package/skills/workflow/workflow-distiller/SKILL.md +76 -17
  243. package/skills/workflow/workflow-distiller/evals.md +118 -0
  244. package/src/cli/configure-interop.ts +105 -13
  245. package/src/cli/configure-oauth.ts +57 -0
  246. package/src/cli/configure-onboarding.ts +980 -0
  247. package/src/cli/configure-target.ts +594 -0
  248. package/src/cli/configure.ts +1082 -528
  249. package/src/cli/context-map.ts +114 -0
  250. package/src/cli/context.ts +4 -0
  251. package/src/cli/index.ts +1 -0
  252. package/src/cli/lifecycle-presenter.ts +436 -0
  253. package/src/cli/models.ts +10 -2
  254. package/src/cli/modes/print.ts +5 -1
  255. package/src/cli/reset.ts +228 -106
  256. package/src/cli/run.ts +7 -2
  257. package/src/cli/select.ts +664 -0
  258. package/src/cli/skills.ts +9 -2
  259. package/src/cli/targets.ts +3 -0
  260. package/src/cli/uninstall.ts +233 -165
  261. package/src/cli/upgrade.ts +204 -149
  262. package/src/cli/usage.ts +86 -27
  263. package/src/cli/validate-model.ts +3 -3
  264. package/src/core/config.ts +56 -0
  265. package/src/core/external-diagnostic.ts +44 -0
  266. package/src/core/gateway-routing.ts +157 -0
  267. package/src/core/safe-exec.ts +17 -2
  268. package/src/core/skill-activation.ts +89 -2
  269. package/src/domains/agents/builtins/world-knowledge.md +31 -0
  270. package/src/domains/agents/catalog.ts +1 -1
  271. package/src/domains/agents/result-contract.ts +70 -0
  272. package/src/domains/context/wiki/map-seed.ts +589 -0
  273. package/src/domains/context/wiki/plan.ts +2 -2
  274. package/src/domains/dispatch/admission.ts +29 -0
  275. package/src/domains/dispatch/agent-candidates.ts +10 -0
  276. package/src/domains/dispatch/budget-envelope.ts +86 -1
  277. package/src/domains/dispatch/capability-match.ts +1 -0
  278. package/src/domains/dispatch/capacity-lease.ts +17 -0
  279. package/src/domains/dispatch/contract.ts +11 -1
  280. package/src/domains/dispatch/extension.ts +134 -29
  281. package/src/domains/dispatch/types.ts +3 -0
  282. package/src/domains/dispatch/worker-model-metadata.ts +38 -0
  283. package/src/domains/eval/metrics/call-ledger-stream.ts +34 -11
  284. package/src/domains/eval/metrics/token-stream.ts +201 -31
  285. package/src/domains/eval/metrics/tracked.ts +40 -4
  286. package/src/domains/eval/runners/clio-run.ts +5 -2
  287. package/src/domains/eval/schema/suite.ts +28 -0
  288. package/src/domains/eval/schema/verdict.ts +2 -2
  289. package/src/domains/eval/suites/resolve.ts +13 -1
  290. package/src/domains/eval/suites/run.ts +24 -3
  291. package/src/domains/interop/registry.ts +6 -2
  292. package/src/domains/interop/types.ts +4 -0
  293. package/src/domains/lifecycle/migrations/index.ts +4 -0
  294. package/src/domains/memory/task-memory-policy.ts +70 -26
  295. package/src/domains/memory/task-memory-telemetry.ts +1 -0
  296. package/src/domains/middleware/index.ts +0 -1
  297. package/src/domains/middleware/marketplace-offer.ts +3 -35
  298. package/src/domains/middleware/memory-intervention.ts +127 -32
  299. package/src/domains/middleware/memory-step-endpoint.ts +3 -2
  300. package/src/domains/middleware/skills-reminder.ts +31 -2
  301. package/src/domains/observability/compaction-usage.ts +118 -0
  302. package/src/domains/observability/cost.ts +1 -1
  303. package/src/domains/observability/extension.ts +6 -1
  304. package/src/domains/observability/out-of-turn-usage.ts +52 -21
  305. package/src/domains/providers/contract.ts +4 -1
  306. package/src/domains/providers/extension.ts +40 -9
  307. package/src/domains/providers/model-capabilities.ts +9 -0
  308. package/src/domains/providers/model-discovery.ts +2 -0
  309. package/src/domains/providers/model-runtime-capabilities.ts +15 -5
  310. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +32 -12
  311. package/src/domains/providers/runtimes/antigravity/antigravity-code.ts +225 -45
  312. package/src/domains/providers/runtimes/common/lmstudio-http.ts +6 -2
  313. package/src/domains/providers/runtimes/common/local-synth.ts +2 -0
  314. package/src/domains/providers/runtimes/protocol/litellm.ts +119 -29
  315. package/src/domains/providers/support.ts +11 -5
  316. package/src/domains/providers/target-model-cache.ts +25 -2
  317. package/src/domains/providers/types/capability-flags.ts +2 -0
  318. package/src/domains/providers/types/runtime-descriptor.ts +20 -1
  319. package/src/domains/providers/types/target-descriptor.ts +19 -0
  320. package/src/domains/resources/index.ts +3 -0
  321. package/src/domains/resources/skills/install.ts +72 -7
  322. package/src/domains/resources/skills/loader.ts +7 -0
  323. package/src/domains/resources/skills/marketplace.ts +63 -11
  324. package/src/domains/safety/autonomy.ts +15 -0
  325. package/src/domains/safety/index.ts +1 -0
  326. package/src/domains/safety/path-policy.ts +1 -1
  327. package/src/domains/safety/policy-engine.ts +34 -11
  328. package/src/domains/safety/protected-artifacts.ts +191 -88
  329. package/src/domains/safety/run-effects.ts +2 -22
  330. package/src/domains/safety/skill-authority.ts +55 -0
  331. package/src/domains/session/compaction/compact.ts +72 -22
  332. package/src/domains/session/entries.ts +6 -0
  333. package/src/domains/session/usage.ts +3 -3
  334. package/src/engine/agent.ts +13 -3
  335. package/src/engine/ai.ts +26 -8
  336. package/src/engine/antigravity/subprocess-runtime.ts +386 -120
  337. package/src/engine/api-registry.ts +3 -0
  338. package/src/engine/apis/openai-completions.ts +117 -14
  339. package/src/engine/external-subprocess.ts +114 -6
  340. package/src/entry/background-model-metadata.ts +18 -0
  341. package/src/entry/compaction-prompt.ts +57 -0
  342. package/src/entry/orchestrator.ts +405 -216
  343. package/src/entry/task-memory-lifecycle.ts +35 -0
  344. package/src/interactive/chat-loop-messages.ts +13 -4
  345. package/src/interactive/chat-loop.ts +65 -2
  346. package/src/interactive/chat-renderer.ts +1 -0
  347. package/src/interactive/cost-overlay.ts +26 -2
  348. package/src/interactive/interactive-slash-runtime.ts +2 -1
  349. package/src/interactive/renderers/worker-entry.ts +32 -0
  350. package/src/interactive/slash-commands.ts +24 -6
  351. package/src/interactive/theme/labels.ts +19 -13
  352. package/src/interactive/turn-context.ts +9 -5
  353. package/src/interactive/turn-recovery.ts +8 -0
  354. package/src/interactive/turn-runtime.ts +27 -11
  355. package/src/interactive/turn-state.ts +7 -0
  356. package/src/interactive/worker-receipts.ts +1 -0
  357. package/src/interactive/worker-stream.ts +6 -1
  358. package/src/tools/context/index.ts +30 -9
  359. package/src/tools/dispatch-arguments.ts +1 -0
  360. package/src/tools/dispatch-event-text.ts +10 -0
  361. package/src/tools/dispatch-plan.ts +1 -0
  362. package/src/tools/dispatch-runner.ts +12 -0
  363. package/src/tools/registry.ts +11 -5
  364. package/src/tools/worker-evidence.ts +3 -1
  365. package/src/worker/spec-contract.ts +4 -0
  366. package/dist/chunk-2Z2IKEXI.js +0 -1554
  367. package/dist/reset-OAQP3W4O.js +0 -230
  368. package/dist/uninstall-N34PCTGJ.js +0 -331
  369. package/dist/upgrade-PXK3S2YM.js +0 -325
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-5TSRNF4G.js";
8
8
  import {
9
9
  authStoragePath
10
- } from "./chunk-WNP7O5WZ.js";
10
+ } from "./chunk-ID64D7PE.js";
11
11
  import {
12
12
  init_esm_shims
13
13
  } from "./chunk-3R73A4XB.js";
@@ -35,4 +35,4 @@ export {
35
35
  printPlaintextCredentialWarning,
36
36
  credentialWriteFailed
37
37
  };
38
- //# sourceMappingURL=chunk-ZW55JB7N.js.map
38
+ //# sourceMappingURL=chunk-PUVDKJ2Y.js.map
@@ -1,13 +1,13 @@
1
1
  import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
2
  import {
3
3
  migrateSettingsV1Document
4
- } from "./chunk-3KIPBMUA.js";
4
+ } from "./chunk-5ICU3EUH.js";
5
5
  import {
6
6
  parseAgentRecipeSchema
7
- } from "./chunk-CRFOIAX3.js";
7
+ } from "./chunk-RRNP2ANY.js";
8
8
  import {
9
9
  parseFleetContract
10
- } from "./chunk-3F7VUY77.js";
10
+ } from "./chunk-2VIKGWFZ.js";
11
11
  import {
12
12
  parseFrontmatter
13
13
  } from "./chunk-RKKLTLYB.js";
@@ -17,17 +17,17 @@ import {
17
17
  installExtension,
18
18
  listInstalledExtensions,
19
19
  loadManifestFromRoot
20
- } from "./chunk-77QIVUZB.js";
20
+ } from "./chunk-5MEZN6CB.js";
21
21
  import {
22
22
  assertAgentSpecPolicy,
23
23
  normalizeAgentSpec
24
- } from "./chunk-PGF63K6I.js";
24
+ } from "./chunk-B4OAX3SI.js";
25
25
  import {
26
26
  readSettings,
27
27
  settingsPath,
28
28
  updateSettings,
29
29
  validateSettings
30
- } from "./chunk-34BHNEE3.js";
30
+ } from "./chunk-GHS5EBTQ.js";
31
31
  import {
32
32
  readClioVersion
33
33
  } from "./chunk-IWHMRKLL.js";
@@ -37,14 +37,14 @@ import {
37
37
  import {
38
38
  require_dist
39
39
  } from "./chunk-APJ265NV.js";
40
- import {
41
- clioConfigDir,
42
- resolveClioDirs
43
- } from "./chunk-BYP5D4HI.js";
44
40
  import {
45
41
  safeResourceBackupPath,
46
42
  safeResourceWrite
47
43
  } from "./chunk-WEPFGWHJ.js";
44
+ import {
45
+ clioConfigDir,
46
+ resolveClioDirs
47
+ } from "./chunk-BYP5D4HI.js";
48
48
  import {
49
49
  __toESM,
50
50
  init_esm_shims
@@ -792,4 +792,4 @@ export {
792
792
  importShareArchive,
793
793
  ShareDomainModule
794
794
  };
795
- //# sourceMappingURL=chunk-UH347SHR.js.map
795
+ //# sourceMappingURL=chunk-QWGDJJYJ.js.map
@@ -0,0 +1,134 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ init_esm_shims
4
+ } from "./chunk-3R73A4XB.js";
5
+
6
+ // src/domains/context/wiki/plan.ts
7
+ init_esm_shims();
8
+ var WIKI_DEPTH_STRATEGY = {
9
+ simple: { areaDepth: 1, areaShare: 0.08, minAreaLines: 400 },
10
+ medium: { areaDepth: 2, areaShare: 0.03, minAreaLines: 250 },
11
+ detailed: { areaDepth: 3, areaShare: 8e-3, minAreaLines: 150 }
12
+ };
13
+ var MAX_PAGE_SOURCES = 8;
14
+ function areaForPath(path, maxDepth) {
15
+ const directories = path.split("/").filter(Boolean).slice(0, -1);
16
+ if (directories.length === 0) return ".";
17
+ return directories.slice(0, Math.max(1, maxDepth)).join("/");
18
+ }
19
+ function classifyDepth(sourceFiles, sourceLines) {
20
+ if (sourceFiles <= 150 && sourceLines <= 3e4) return "simple";
21
+ if (sourceFiles <= 800 && sourceLines <= 15e4) return "medium";
22
+ return "detailed";
23
+ }
24
+ function slugSegment(segment) {
25
+ const slug = segment.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
26
+ return slug.length > 0 ? slug : "section";
27
+ }
28
+ function areaSegments(area) {
29
+ const parts = area.split("/").filter((part) => part.length > 0 && part !== ".");
30
+ if (parts.length === 0) return ["root"];
31
+ if (parts[0] !== "src") return parts;
32
+ return parts.length === 1 ? ["source"] : parts.slice(1);
33
+ }
34
+ function pagePathForArea(area) {
35
+ return `${areaSegments(area).map(slugSegment).join("/")}.md`;
36
+ }
37
+ function titleForArea(area) {
38
+ const name = areaSegments(area).join(" ").replace(/[-_]+/g, " ").trim();
39
+ return name.length > 0 ? name.charAt(0).toUpperCase() + name.slice(1) : "Overview";
40
+ }
41
+ function rankedSources(files) {
42
+ return [...files].sort((a, b) => {
43
+ const roleRank = (file) => file.role === "entry" ? 0 : file.role === "test" ? 2 : 1;
44
+ return roleRank(a) - roleRank(b) || b.loc - a.loc || a.path.localeCompare(b.path);
45
+ }).slice(0, MAX_PAGE_SOURCES).map((file) => file.path);
46
+ }
47
+ function collectAreas(source, areaDepth) {
48
+ const byKey = /* @__PURE__ */ new Map();
49
+ for (const file of source) {
50
+ const key = areaForPath(file.path, areaDepth);
51
+ const area = byKey.get(key) ?? { key, files: [], lines: 0 };
52
+ area.files.push(file);
53
+ area.lines += Math.max(0, file.loc);
54
+ byKey.set(key, area);
55
+ }
56
+ return [...byKey.values()].sort((a, b) => b.lines - a.lines || a.key.localeCompare(b.key));
57
+ }
58
+ function overviewPage(source) {
59
+ const entries = source.filter((file) => file.role === "entry");
60
+ return {
61
+ path: "architecture.md",
62
+ title: "Architecture",
63
+ intent: "Explain what this repository is, its top-level composition, how a request or command flows through it, and where the boundaries between its major areas are.",
64
+ sources: rankedSources(entries.length > 0 ? entries : source),
65
+ status: "pending",
66
+ attempts: 0
67
+ };
68
+ }
69
+ function buildCandidatePlan(codewiki, depth) {
70
+ const source = codewiki.files.filter((file) => file.lang !== "config");
71
+ const totalLines = source.reduce((total, file) => total + Math.max(0, file.loc), 0);
72
+ const { areaDepth, areaShare, minAreaLines } = WIKI_DEPTH_STRATEGY[depth];
73
+ const threshold = Math.max(minAreaLines, Math.floor(totalLines * areaShare));
74
+ const areas = collectAreas(source, areaDepth);
75
+ const included = areas.filter((area) => area.lines >= threshold);
76
+ const selected = included.length > 0 ? included : areas.slice(0, 1);
77
+ const selectedKeys = new Set(selected.map((area) => area.key));
78
+ const extras = /* @__PURE__ */ new Map();
79
+ for (const area of areas) {
80
+ if (selectedKeys.has(area.key)) continue;
81
+ const ancestor = selected.find((candidate) => area.key.startsWith(`${candidate.key}/`));
82
+ const host = ancestor?.key ?? selected[0]?.key;
83
+ if (host === void 0) continue;
84
+ extras.set(host, [...extras.get(host) ?? [], ...area.files]);
85
+ }
86
+ const pages = selected.map((area) => {
87
+ const files = [...area.files, ...extras.get(area.key) ?? []];
88
+ return {
89
+ path: pagePathForArea(area.key),
90
+ title: titleForArea(area.key),
91
+ intent: `Document ${area.key} (${area.files.length} indexed files, ${area.lines} lines): what it owns, its entry points and important symbols, the state and lifecycle invariants it enforces, an upstream caller and a downstream dependency, the focused tests that prove its behavior, and what to watch when editing it.`,
92
+ sources: rankedSources(files),
93
+ status: "pending",
94
+ attempts: 0
95
+ };
96
+ });
97
+ return dedupePagePaths({
98
+ version: 1,
99
+ overview: "",
100
+ pages: [overviewPage(source), ...pages]
101
+ });
102
+ }
103
+ function dedupePagePaths(plan) {
104
+ const seen = /* @__PURE__ */ new Set();
105
+ const pages = [];
106
+ for (const page of plan.pages) {
107
+ let path = page.path;
108
+ let suffix = 2;
109
+ while (seen.has(path)) {
110
+ path = page.path.replace(/\.md$/, `-${suffix}.md`);
111
+ suffix += 1;
112
+ }
113
+ seen.add(path);
114
+ pages.push({ ...page, path });
115
+ }
116
+ return { ...plan, pages };
117
+ }
118
+ function planWikiGeneration(codewiki, requestedDepth = "auto") {
119
+ const source = codewiki.files.filter((file) => file.lang !== "config");
120
+ const sourceFiles = source.length;
121
+ const sourceLines = source.reduce((total, file) => total + Math.max(0, file.loc), 0);
122
+ const depth = requestedDepth === "auto" ? classifyDepth(sourceFiles, sourceLines) : requestedDepth;
123
+ return { requestedDepth, depth, sourceFiles, sourceLines, plan: buildCandidatePlan(codewiki, depth) };
124
+ }
125
+
126
+ export {
127
+ WIKI_DEPTH_STRATEGY,
128
+ areaForPath,
129
+ classifyDepth,
130
+ pagePathForArea,
131
+ buildCandidatePlan,
132
+ planWikiGeneration
133
+ };
134
+ //# sourceMappingURL=chunk-R6Q67RJH.js.map
@@ -1,13 +1,13 @@
1
1
  import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
- import {
3
- loadSkills
4
- } from "./chunk-O3YUNJZ2.js";
5
2
  import {
6
3
  parseFrontmatter
7
4
  } from "./chunk-RKKLTLYB.js";
5
+ import {
6
+ loadSkills
7
+ } from "./chunk-LDJG7DW3.js";
8
8
  import {
9
9
  enabledExtensionResourceRoots
10
- } from "./chunk-HLAFFSEK.js";
10
+ } from "./chunk-7DRAWPTZ.js";
11
11
  import {
12
12
  assertAgentSpecPolicy,
13
13
  isAgentAudience,
@@ -19,7 +19,7 @@ import {
19
19
  isShadowAgent,
20
20
  normalizeAgentSpec,
21
21
  parseResultContract
22
- } from "./chunk-PGF63K6I.js";
22
+ } from "./chunk-B4OAX3SI.js";
23
23
  import {
24
24
  resolvePackageRoot
25
25
  } from "./chunk-IWHMRKLL.js";
@@ -396,4 +396,4 @@ export {
396
396
  parseAgentRecipeSchema,
397
397
  discoverAgentRecipes
398
398
  };
399
- //# sourceMappingURL=chunk-CRFOIAX3.js.map
399
+ //# sourceMappingURL=chunk-RRNP2ANY.js.map
@@ -4,7 +4,7 @@ import {
4
4
  extractCommandDeleteTargets,
5
5
  extractCommandWriteTargets,
6
6
  toolMutationPaths
7
- } from "./chunk-IKOZFYBN.js";
7
+ } from "./chunk-I7ZPNEJM.js";
8
8
  import {
9
9
  isProjectVerifierCheckId,
10
10
  isVerificationScriptName
@@ -489,4 +489,4 @@ export {
489
489
  assessFinishContract,
490
490
  typedValidationSummary
491
491
  };
492
- //# sourceMappingURL=chunk-IDNA72AH.js.map
492
+ //# sourceMappingURL=chunk-RSJ25QSL.js.map
@@ -0,0 +1,385 @@
1
+ import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
+ import {
3
+ terminalColumns,
4
+ wrapPlain
5
+ } from "./chunk-2IR2NMPA.js";
6
+ import {
7
+ source_default
8
+ } from "./chunk-5TSRNF4G.js";
9
+ import {
10
+ init_esm_shims
11
+ } from "./chunk-3R73A4XB.js";
12
+
13
+ // src/cli/lifecycle-presenter.ts
14
+ init_esm_shims();
15
+ import { lstatSync, readdirSync } from "node:fs";
16
+ import { homedir } from "node:os";
17
+ import { join } from "node:path";
18
+ import { stdin as defaultInput, stdout as defaultOutput } from "node:process";
19
+ import { createInterface } from "node:readline/promises";
20
+ function formatBytes(bytes) {
21
+ if (bytes < 1024) return `${bytes} B`;
22
+ const units = ["KB", "MB", "GB", "TB"];
23
+ let value = bytes / 1024;
24
+ let unitIndex = 0;
25
+ while (value >= 1024 && unitIndex < units.length - 1) {
26
+ value /= 1024;
27
+ unitIndex += 1;
28
+ }
29
+ return `${value.toFixed(1)} ${units[unitIndex]}`;
30
+ }
31
+ function measurePath(targetPath) {
32
+ let stats;
33
+ try {
34
+ stats = lstatSync(targetPath);
35
+ } catch {
36
+ return { bytes: 0, exists: false, isDirectory: false, isSymbolicLink: false };
37
+ }
38
+ if (stats.isSymbolicLink()) {
39
+ return { bytes: stats.size, exists: true, isDirectory: false, isSymbolicLink: true };
40
+ }
41
+ if (!stats.isDirectory()) {
42
+ return { bytes: stats.size, exists: true, isDirectory: false, isSymbolicLink: false };
43
+ }
44
+ let total = 0;
45
+ function walk(dir) {
46
+ let entries;
47
+ try {
48
+ entries = readdirSync(dir, { withFileTypes: true });
49
+ } catch {
50
+ return;
51
+ }
52
+ for (const entry of entries) {
53
+ const full = join(dir, entry.name);
54
+ try {
55
+ if (entry.isDirectory()) walk(full);
56
+ else total += lstatSync(full).size;
57
+ } catch {
58
+ }
59
+ }
60
+ }
61
+ walk(targetPath);
62
+ return { bytes: total, exists: true, isDirectory: true, isSymbolicLink: false };
63
+ }
64
+ function shortenPath(targetPath, home = homedir()) {
65
+ if (!targetPath) return targetPath;
66
+ if (targetPath === home) return "~";
67
+ if (targetPath.startsWith(`${home}/`) || targetPath.startsWith(`${home}\\`)) {
68
+ return `~/${targetPath.slice(home.length + 1)}`;
69
+ }
70
+ return targetPath;
71
+ }
72
+ var LifecyclePresenter = class {
73
+ json;
74
+ plain;
75
+ out;
76
+ in;
77
+ columns;
78
+ report;
79
+ lastBlock = null;
80
+ emitted = false;
81
+ constructor(options = {}) {
82
+ this.json = Boolean(options.json);
83
+ const stream = options.stream ?? defaultOutput;
84
+ const isTty = Boolean(stream.isTTY);
85
+ this.plain = options.plain ?? (!isTty || Boolean(process.env.NO_COLOR));
86
+ this.out = stream;
87
+ this.in = options.inputStream ?? defaultInput;
88
+ this.columns = options.columns ?? terminalColumns(stream);
89
+ this.report = {
90
+ command: "",
91
+ title: "",
92
+ status: "success",
93
+ items: [],
94
+ steps: [],
95
+ warnings: [],
96
+ errors: [],
97
+ advice: []
98
+ };
99
+ }
100
+ isJson() {
101
+ return this.json;
102
+ }
103
+ isPlain() {
104
+ return this.plain;
105
+ }
106
+ getReport() {
107
+ return this.report;
108
+ }
109
+ setMethod(method) {
110
+ this.report.method = method;
111
+ }
112
+ /** Open a block, writing the one separator that belongs before it. */
113
+ open(block) {
114
+ if (this.lastBlock !== null && this.lastBlock !== block) this.separator();
115
+ this.lastBlock = block;
116
+ }
117
+ separator() {
118
+ this.out.write(this.plain ? "\n" : `${source_default.cyan("\u2502")}
119
+ `);
120
+ }
121
+ /**
122
+ * Close the current block, for a caller that is about to draw its own lines
123
+ * on the rail. `configure` hands the rail to the arrow-key selector after
124
+ * rendering a screen's values, and the selector cannot know what came before
125
+ * it.
126
+ */
127
+ blank() {
128
+ if (this.json) return;
129
+ this.separator();
130
+ this.lastBlock = null;
131
+ }
132
+ /** Rail-level prose, wrapped to the terminal so the rail survives a narrow window. */
133
+ prose(text) {
134
+ const prefix = this.plain ? " " : `${source_default.cyan("\u2502")} `;
135
+ for (const line of wrapPlain(text, this.columns - 3)) this.out.write(`${prefix}${line}
136
+ `);
137
+ }
138
+ header(title, command = "") {
139
+ this.report.title = title;
140
+ this.report.command = command;
141
+ if (this.json) return;
142
+ if (this.plain) {
143
+ this.out.write(`
144
+ ${title}
145
+ `);
146
+ } else {
147
+ this.out.write(`
148
+ ${source_default.cyan("\u250C")} ${source_default.bold(title)}
149
+ `);
150
+ }
151
+ this.lastBlock = "header";
152
+ }
153
+ /** One detected fact. Consecutive facts group into a single block. */
154
+ step(text) {
155
+ this.report.steps.push({ type: "step", message: text });
156
+ if (this.json) return;
157
+ this.open("step");
158
+ if (this.plain) this.out.write(` ${text}
159
+ `);
160
+ else this.out.write(`${source_default.blue("\u25CF")} ${text}
161
+ `);
162
+ }
163
+ /** A line of prose on the rail, not a detected fact. */
164
+ note(text) {
165
+ this.report.steps.push({ type: "note", message: text });
166
+ if (this.json) return;
167
+ this.open("note");
168
+ this.prose(text);
169
+ }
170
+ /**
171
+ * Aligned label/value rows for a settings screen. Not `note()`, because
172
+ * these must not reflow: the column is what makes eight values scannable,
173
+ * and a wrap would put the value under the wrong label.
174
+ */
175
+ fields(rows) {
176
+ for (const [label, value] of rows) this.report.steps.push({ type: "field", message: `${label}: ${value}` });
177
+ if (this.json || rows.length === 0) return;
178
+ this.open("step");
179
+ const width = Math.max(...rows.map(([label]) => label.length));
180
+ for (const [label, value] of rows) {
181
+ const padded = `${label}${" ".repeat(width - label.length)}`;
182
+ if (this.plain) this.out.write(` ${padded} ${value}
183
+ `);
184
+ else this.out.write(`${source_default.blue("\u25CF")} ${source_default.dim(padded)} ${value}
185
+ `);
186
+ }
187
+ }
188
+ substep(text, glyph = "\u2713") {
189
+ this.report.steps.push({ type: "substep", message: text });
190
+ if (this.json) return;
191
+ this.open("list");
192
+ if (this.plain) {
193
+ this.out.write(` ${glyph} ${text}
194
+ `);
195
+ return;
196
+ }
197
+ const coloredGlyph = glyph === "\u2713" ? source_default.green(glyph) : source_default.dim(glyph);
198
+ this.out.write(`${source_default.blue("\u25CF")} ${coloredGlyph} ${text}
199
+ `);
200
+ }
201
+ listItems(header, items) {
202
+ for (const item of items) {
203
+ this.report.items.push(item);
204
+ }
205
+ if (this.json) return;
206
+ this.open("note");
207
+ this.prose(`${header}:`);
208
+ this.open("list");
209
+ for (const item of items) {
210
+ const sizeStr = item.status !== "absent" && item.bytes !== void 0 && item.bytes !== null ? ` (${formatBytes(item.bytes)})` : "";
211
+ const removes = item.status === void 0 || item.status === "remove";
212
+ let suffix = "";
213
+ if (item.status === "keep") suffix = item.detail ? ` (${item.detail})` : " (kept)";
214
+ else if (item.status === "absent") suffix = item.detail ? ` (${item.detail})` : " (absent)";
215
+ else if (item.status === "skip") suffix = item.detail ? ` (${item.detail})` : " (skipped)";
216
+ else if (item.status === "clean") suffix = item.detail ? ` (${item.detail})` : " (nothing to remove)";
217
+ else if (item.detail) suffix = ` (${item.detail})`;
218
+ const body = `${item.label}: ${shortenPath(item.path)}${sizeStr}`;
219
+ if (this.plain) {
220
+ this.out.write(` ${removes ? "\u2713" : "\u2013"} ${body}${suffix}
221
+ `);
222
+ continue;
223
+ }
224
+ const glyph = removes ? source_default.green("\u2713") : item.status === "skip" ? source_default.yellow("\u2013") : source_default.dim("\u2013");
225
+ const tail = suffix.length === 0 ? "" : item.status === "skip" ? source_default.yellow(suffix) : source_default.dim(suffix);
226
+ this.out.write(
227
+ `${source_default.blue("\u25CF")} ${glyph} ${source_default.bold(item.label)}: ${shortenPath(item.path)}${sizeStr}${tail}
228
+ `
229
+ );
230
+ }
231
+ }
232
+ /** One action that has already happened. Consecutive results group together. */
233
+ completedStep(text) {
234
+ this.report.steps.push({ type: "completed", message: text });
235
+ if (this.json) return;
236
+ this.open("completed");
237
+ if (this.plain) this.out.write(` \u2713 ${text}
238
+ `);
239
+ else this.out.write(`${source_default.green("\u25C7")} ${text}
240
+ `);
241
+ }
242
+ warn(text) {
243
+ this.report.warnings.push(text);
244
+ if (this.json) return;
245
+ this.open("warn");
246
+ if (this.plain) {
247
+ for (const line of wrapPlain(text, this.columns - 3)) this.out.write(` ${line}
248
+ `);
249
+ return;
250
+ }
251
+ const prefix = `${source_default.yellow("\u25B2")} `;
252
+ const continuation = `${source_default.cyan("\u2502")} `;
253
+ wrapPlain(text, this.columns - 3).forEach((line, index) => {
254
+ this.out.write(`${index === 0 ? prefix : continuation}${source_default.yellow(line)}
255
+ `);
256
+ });
257
+ }
258
+ /**
259
+ * Record a failure and say it once on stderr. The JSON report is not written
260
+ * here: a command that fails still has advice to add, and emitting mid-flight
261
+ * either dropped it or put a second document on stdout. Callers end on
262
+ * `finish()`.
263
+ */
264
+ fail(message, detail) {
265
+ this.report.status = "error";
266
+ this.report.errors.push(detail ? `${message}: ${detail}` : message);
267
+ if (this.json) return;
268
+ if (this.plain) {
269
+ process.stderr.write(`error: ${message}
270
+ `);
271
+ if (detail) process.stderr.write(` ${detail}
272
+ `);
273
+ return;
274
+ }
275
+ process.stderr.write(`${source_default.red("\u2716")} ${source_default.red(message)}
276
+ `);
277
+ if (detail) process.stderr.write(`${source_default.cyan("\u2502")} ${source_default.dim(detail)}
278
+ `);
279
+ }
280
+ commandAdvice(lead, command) {
281
+ this.report.advice.push({ lead, command });
282
+ if (this.json) return;
283
+ this.open("advice");
284
+ this.prose(lead);
285
+ for (const line of command.split("\n")) {
286
+ if (this.plain) this.out.write(` ${line}
287
+ `);
288
+ else this.out.write(`${source_default.blue("\u25CF")} ${source_default.cyan(line)}
289
+ `);
290
+ }
291
+ }
292
+ message(text) {
293
+ this.report.steps.push({ type: "message", message: text });
294
+ if (this.json) return;
295
+ this.open("message");
296
+ if (this.plain) this.out.write(` ${text}
297
+ `);
298
+ else this.out.write(`${source_default.cyan("\u25C6")} ${source_default.bold(text)}
299
+ `);
300
+ }
301
+ /**
302
+ * Ask once, and treat a closed input as a refusal.
303
+ *
304
+ * `rl.question()` from readline/promises settles on an answer and on an abort
305
+ * signal, but not on the input ending: at EOF the interface emits `close` and
306
+ * the promise is simply never resolved. Every caller here guards a delete, so
307
+ * the failure mode was a `clio-coder uninstall` that printed its prompt and
308
+ * then hung forever on Ctrl-D. Racing the `close` event settles that case as
309
+ * "no", which is the only safe reading of an input that stopped talking.
310
+ */
311
+ async confirm(question, defaultYes = false) {
312
+ if (this.json) return false;
313
+ const hint = defaultYes ? "Y/n" : "y/N";
314
+ this.open("confirm");
315
+ const rl = createInterface({ input: this.in, output: this.out });
316
+ try {
317
+ const promptStr = this.plain ? ` ${question} [${hint}]: ` : `${source_default.cyan("\u25C7")} ${source_default.bold(question)} [${hint}]
318
+ ${source_default.cyan("\u2502")} `;
319
+ const answer = await new Promise((resolve) => {
320
+ let settled = false;
321
+ const settle = (value) => {
322
+ if (settled) return;
323
+ settled = true;
324
+ resolve(value);
325
+ };
326
+ rl.once("close", () => settle(null));
327
+ rl.question(promptStr).then(
328
+ (value) => settle(value),
329
+ () => settle(null)
330
+ );
331
+ });
332
+ if (answer === null) return false;
333
+ const normalized = answer.trim().toLowerCase();
334
+ const confirmed = normalized.length === 0 ? defaultYes : normalized === "y" || normalized === "yes";
335
+ this.out.write(this.plain ? ` ${confirmed ? "Yes" : "No"}
336
+ ` : `${source_default.cyan("\u2502")} ${confirmed ? "Yes" : "No"}
337
+ `);
338
+ return confirmed;
339
+ } finally {
340
+ rl.close();
341
+ }
342
+ }
343
+ /**
344
+ * Close the transcript. Every command ends here, on success and on failure,
345
+ * so `--json` emits exactly one document containing everything that was
346
+ * recorded, including advice added after a failure.
347
+ */
348
+ done(summary = "Done") {
349
+ this.report.summary = summary;
350
+ if (this.json) {
351
+ this.emit();
352
+ return;
353
+ }
354
+ if (this.plain) {
355
+ this.out.write(`
356
+ ${summary}
357
+ `);
358
+ return;
359
+ }
360
+ this.separator();
361
+ this.out.write(`${source_default.cyan("\u2514")} ${source_default.bold(summary)}
362
+
363
+ `);
364
+ }
365
+ /** Emit the JSON report without a closing line, for paths that ended in an error. */
366
+ finish() {
367
+ if (this.json) this.emit();
368
+ }
369
+ emit() {
370
+ if (this.emitted) return;
371
+ this.emitted = true;
372
+ this.out.write(`${JSON.stringify(this.report, null, 2)}
373
+ `);
374
+ }
375
+ };
376
+ function createLifecyclePresenter(options = {}) {
377
+ return new LifecyclePresenter(options);
378
+ }
379
+
380
+ export {
381
+ measurePath,
382
+ shortenPath,
383
+ createLifecyclePresenter
384
+ };
385
+ //# sourceMappingURL=chunk-SKHCAU7K.js.map