@iowarp/clio-coder 0.4.7 → 0.4.9

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 (675) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +111 -0
  3. package/CONTRIBUTING.md +83 -74
  4. package/README.md +69 -47
  5. package/dist/{acp-W3Y3TRHD.js → acp-ZWZCPS2A.js} +15 -15
  6. package/dist/{agents-J4ICNLQ3.js → agents-LYSOWZUE.js} +61 -59
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/assets/web-notices/@hono__node-server-LICENSE +21 -0
  9. package/dist/assets/web-notices/hono-LICENSE +21 -0
  10. package/dist/{auth-X2UJUMOC.js → auth-WBQGKWQ5.js} +27 -27
  11. package/dist/background-BUMOBAQN.js +37 -0
  12. package/dist/{builtins-XLXWWSRF.js → builtins-ODRJOEDI.js} +7 -7
  13. package/dist/{chunk-C3G5PNUO.js → chunk-2DRRZ57Q.js} +36 -27
  14. package/dist/chunk-2JBZYUPY.js +105 -0
  15. package/dist/chunk-2KUBKL63.js +336 -0
  16. package/dist/chunk-2VBWFXYE.js +198 -0
  17. package/dist/{chunk-XZ6UFQ52.js → chunk-2X2R3UTH.js} +25 -15
  18. package/dist/{chunk-M6Z2V6YU.js → chunk-37LW32LZ.js} +5 -5
  19. package/dist/{chunk-6LRLOJHQ.js → chunk-3AND2EFU.js} +11 -62
  20. package/dist/{chunk-FQOOGXBH.js → chunk-3RDHGNU7.js} +101 -33
  21. package/dist/{chunk-D2T66PDV.js → chunk-3SUDBGEI.js} +41 -208
  22. package/dist/{chunk-5AJPUR72.js → chunk-3TQN67I2.js} +9 -9
  23. package/dist/{chunk-LBFQMYS3.js → chunk-3U4BL2EV.js} +5 -3
  24. package/dist/{chunk-UFYNOQK4.js → chunk-3UQADNG2.js} +7 -7
  25. package/dist/{chunk-V4ZKOKRB.js → chunk-434LRQ6Z.js} +61 -53
  26. package/dist/{chunk-NO7J45X6.js → chunk-4ATBOFRP.js} +713 -218
  27. package/dist/{chunk-ECOMVOHP.js → chunk-4DNL43EZ.js} +3 -3
  28. package/dist/{chunk-WT5TRMO4.js → chunk-4HFJKRGZ.js} +255 -82
  29. package/dist/{chunk-5A6XR3RJ.js → chunk-555E2WVV.js} +16 -2
  30. package/dist/{chunk-WURGVOZJ.js → chunk-5RTEFNBP.js} +18 -14
  31. package/dist/{config-YXARKGTX.js → chunk-64XJW7NT.js} +24 -268
  32. package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
  33. package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
  34. package/dist/{chunk-MZNWZUJM.js → chunk-7FBCRWVT.js} +288 -288
  35. package/dist/{chunk-UA6W4XFJ.js → chunk-7JSOSVLP.js} +2 -2
  36. package/dist/chunk-7N3OLLSL.js +637 -0
  37. package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
  38. package/dist/{chunk-N37QC5FV.js → chunk-A6DULIMH.js} +21 -9
  39. package/dist/{fleet-decisions-S3PTZV2D.js → chunk-AB3QXXBC.js} +5 -41
  40. package/dist/chunk-ACCECAH4.js +49 -0
  41. package/dist/{chunk-CP3HIR5H.js → chunk-AM6CEP2K.js} +20 -19
  42. package/dist/chunk-AUHVBIDW.js +19 -0
  43. package/dist/{chunk-BQQ5MXUC.js → chunk-AY4XE6GN.js} +19 -13
  44. package/dist/{chunk-ISNCCX42.js → chunk-BBA2TAWV.js} +10 -9
  45. package/dist/chunk-BFPHMSK7.js +169 -0
  46. package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
  47. package/dist/{chunk-DO7M3LSX.js → chunk-BMNVVKEW.js} +40 -93
  48. package/dist/{chunk-VTYHHQ57.js → chunk-CTGZCEI6.js} +2 -2
  49. package/dist/{chunk-RTLNFZMD.js → chunk-DIAJYJYG.js} +3 -3
  50. package/dist/chunk-EHZRAB4U.js +63 -0
  51. package/dist/{chunk-KS7ETA3P.js → chunk-EM2DIQAJ.js} +3 -3
  52. package/dist/{chunk-MNQN3X6Y.js → chunk-ETF4ROKH.js} +5 -5
  53. package/dist/{chunk-WN552PKN.js → chunk-F2YM3JY4.js} +744 -1134
  54. package/dist/{chunk-7EEGBKV4.js → chunk-FEBQWHJT.js} +24 -19
  55. package/dist/{chunk-4QKAITQT.js → chunk-FPS4R2RN.js} +74 -10
  56. package/dist/chunk-G5R53COU.js +68 -0
  57. package/dist/chunk-GHXGMFQ5.js +40 -0
  58. package/dist/{chunk-GFQ7P2UF.js → chunk-GJDRMBDI.js} +10 -10
  59. package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
  60. package/dist/{chunk-NCCQ6DVS.js → chunk-GREYLTZ5.js} +8 -8
  61. package/dist/{chunk-HOX4YZ2K.js → chunk-H2WSCZZT.js} +19 -3
  62. package/dist/{chunk-3LXJOICS.js → chunk-H6IUCY6Q.js} +2 -2
  63. package/dist/{chunk-BO4XV5VX.js → chunk-H72DCH3E.js} +95 -206
  64. package/dist/{chunk-SEDI5K5B.js → chunk-H7TXJR23.js} +20 -20
  65. package/dist/chunk-HBJQQTKM.js +40 -0
  66. package/dist/chunk-HCVKSGNZ.js +990 -0
  67. package/dist/chunk-HVCAY2FH.js +67 -0
  68. package/dist/{chunk-34XHRVKG.js → chunk-I47EJPYL.js} +3 -3
  69. package/dist/{chunk-4N2RZ4TO.js → chunk-IALGWTLO.js} +3 -3
  70. package/dist/{chunk-IQCNVLO6.js → chunk-IALZJE37.js} +10 -7
  71. package/dist/{chunk-DLIYANB7.js → chunk-IC7JXLOM.js} +16 -11
  72. package/dist/{chunk-G4LGUTOE.js → chunk-IOSVTTCD.js} +5 -5
  73. package/dist/{chunk-DBREN25X.js → chunk-IPTPMLA6.js} +8 -3
  74. package/dist/{chunk-V552WL53.js → chunk-IZZI3SKQ.js} +3 -67
  75. package/dist/{chunk-TN5FW4XY.js → chunk-JIYWMQZ5.js} +12 -9
  76. package/dist/{chunk-T7QQBNLH.js → chunk-JKU34ACI.js} +10 -8
  77. package/dist/chunk-JOBN2YQQ.js +176 -0
  78. package/dist/chunk-JOL2QRLE.js +152 -0
  79. package/dist/{chunk-GXIWHXDB.js → chunk-JTR3VSV3.js} +3 -3
  80. package/dist/{chunk-T334FW2H.js → chunk-JU6MAMRJ.js} +7 -7
  81. package/dist/chunk-JURMQWVJ.js +15 -0
  82. package/dist/{chunk-CULVKYTK.js → chunk-K3XN4LZ4.js} +5 -5
  83. package/dist/{chunk-3T4DXWP6.js → chunk-KIVFXGBM.js} +27 -7
  84. package/dist/chunk-KKRXONXG.js +43 -0
  85. package/dist/{chunk-YPRSNUTC.js → chunk-KOAHT3N2.js} +2 -2
  86. package/dist/chunk-KP5BPXR3.js +73 -0
  87. package/dist/{chunk-UA3W4FGC.js → chunk-KRJQG47M.js} +6 -6
  88. package/dist/{chunk-GI5RRMAH.js → chunk-KW6OJ7IY.js} +19 -21
  89. package/dist/{chunk-A46ILRS2.js → chunk-L3NBWLSN.js} +4 -4
  90. package/dist/{chunk-MZHXENL7.js → chunk-L4RUTLRL.js} +8 -8
  91. package/dist/{chunk-P5SC4DLJ.js → chunk-LGTVWPRN.js} +2 -2
  92. package/dist/{chunk-65BGHOUR.js → chunk-LSQW6KZO.js} +5 -5
  93. package/dist/{chunk-TZHN5ITX.js → chunk-LWJYOHT3.js} +8 -8
  94. package/dist/{chunk-U3TPUXOQ.js → chunk-M6YLF66Z.js} +74 -40
  95. package/dist/chunk-MJ4QEJVT.js +185 -0
  96. package/dist/{chunk-T4TY5GG3.js → chunk-MO65K5CH.js} +5 -5
  97. package/dist/{chunk-TZ6UVP2H.js → chunk-MTOZEQHL.js} +8 -8
  98. package/dist/chunk-MZDPF35R.js +45 -0
  99. package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
  100. package/dist/{chunk-KAFMW7WM.js → chunk-NBPA5QM6.js} +2 -2
  101. package/dist/{chunk-EUEXGXXR.js → chunk-NMBEW4PP.js} +5 -5
  102. package/dist/{chunk-SELG4SUR.js → chunk-NPLLK3HO.js} +72 -89
  103. package/dist/{chunk-VCRVEDUC.js → chunk-NSYGPIVW.js} +5 -5
  104. package/dist/{context-7HJEWTTP.js → chunk-NXTV5OI5.js} +36 -90
  105. package/dist/{chunk-IMOD2YPV.js → chunk-NYDG4QP4.js} +9 -19
  106. package/dist/{chunk-6CA2BHOR.js → chunk-OA2GDACN.js} +5 -5
  107. package/dist/{chunk-A67NR5AT.js → chunk-PJI57EC6.js} +14 -11
  108. package/dist/{chunk-IJMW64DX.js → chunk-PJJBUGMR.js} +50 -50
  109. package/dist/{chunk-CPXGJI2A.js → chunk-PNJE7JPS.js} +20 -5
  110. package/dist/chunk-PP23PZEV.js +1347 -0
  111. package/dist/chunk-PPIFDSBK.js +409 -0
  112. package/dist/{chunk-T52TPHYC.js → chunk-PTFISXQO.js} +8 -7
  113. package/dist/{chunk-C6GEXX4L.js → chunk-QB33Z5S7.js} +5 -5
  114. package/dist/{chunk-VMATUZB6.js → chunk-QGNII5VC.js} +10 -10
  115. package/dist/{chunk-TLTGZTXI.js → chunk-QI72X67S.js} +104 -27
  116. package/dist/chunk-QKHZZFKH.js +98 -0
  117. package/dist/{chunk-PFLOULP3.js → chunk-RDKX2PME.js} +4 -4
  118. package/dist/{chunk-B5ZTR6KZ.js → chunk-RL7LJYN4.js} +1 -1
  119. package/dist/chunk-RPMNIFRY.js +65 -0
  120. package/dist/{chunk-L3Z5ANCV.js → chunk-RQROVOV3.js} +13 -11
  121. package/dist/{chunk-6YHPAAZR.js → chunk-S34A7BSP.js} +3 -3
  122. package/dist/{chunk-5ZSZEYJK.js → chunk-SJETVJHX.js} +2 -2
  123. package/dist/{chunk-77CZRFTE.js → chunk-SJMNU4ZS.js} +2 -2
  124. package/dist/chunk-SLLG2G44.js +85 -0
  125. package/dist/{chunk-GVZFCJHE.js → chunk-SQAZN2V3.js} +48 -22
  126. package/dist/{chunk-2O2LVQQK.js → chunk-SQBT46OF.js} +2 -2
  127. package/dist/{chunk-ZGIGW4ZG.js → chunk-TCUOGIL2.js} +5 -5
  128. package/dist/{chunk-DACXIVVF.js → chunk-TIWPKCVO.js} +5 -5
  129. package/dist/{chunk-5CMARGPF.js → chunk-UIU7MGZ3.js} +11 -2
  130. package/dist/chunk-USBBEKHW.js +177 -0
  131. package/dist/{chunk-WLHX3MM5.js → chunk-V4XJWDHR.js} +21 -11
  132. package/dist/{chunk-MBJO5VNZ.js → chunk-VPWGADBG.js} +33 -33
  133. package/dist/{chunk-UUQ5G6EZ.js → chunk-VWFCAK34.js} +6 -6
  134. package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
  135. package/dist/{chunk-4MFBBY2Z.js → chunk-W72LLZAV.js} +3 -3
  136. package/dist/{chunk-4UHVS5T7.js → chunk-WGRDABW7.js} +8 -8
  137. package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
  138. package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
  139. package/dist/{chunk-6YA46L5A.js → chunk-XFLSL7BT.js} +2 -2
  140. package/dist/{chunk-QKWL7SYE.js → chunk-XJZEDCNT.js} +50 -39
  141. package/dist/{chunk-UWD3JD5X.js → chunk-XLLEL3K7.js} +10 -10
  142. package/dist/{chunk-2GPGAE5W.js → chunk-XNIZBOFV.js} +15 -1
  143. package/dist/chunk-XNZWWDC3.js +686 -0
  144. package/dist/{chunk-WBVKKTUT.js → chunk-XRECG65F.js} +2 -2
  145. package/dist/chunk-XTQ7MEJG.js +457 -0
  146. package/dist/{chunk-GEVQNST4.js → chunk-XZWSP67B.js} +2 -2
  147. package/dist/{chunk-WB7POC6M.js → chunk-Y3M2T5RO.js} +6 -6
  148. package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
  149. package/dist/{chunk-EUZRMP4Y.js → chunk-YPQOPFP7.js} +20 -20
  150. package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
  151. package/dist/{chunk-BAU36233.js → chunk-YQYINEJI.js} +9 -9
  152. package/dist/{chunk-CE64C5K5.js → chunk-ZF6CV4WZ.js} +1356 -235
  153. package/dist/{chunk-3XE4NRLF.js → chunk-ZKJU55MX.js} +4 -2
  154. package/dist/{chunk-IZYTT3CD.js → chunk-ZKQ63XZ5.js} +16 -39
  155. package/dist/{chunk-6TAATXXH.js → chunk-ZKVMDNAN.js} +7 -7
  156. package/dist/chunk-ZST3FRCV.js +132 -0
  157. package/dist/cli/index.js +50 -38
  158. package/dist/{clio-L2P7S2R2.js → clio-JUDCLNHC.js} +11 -11
  159. package/dist/clio-context-tools-FT672MNZ.js +136 -0
  160. package/dist/{code-nav-B5LNX4KU.js → code-nav-7OVCTP2Z.js} +39 -37
  161. package/dist/{components-63MMQKUT.js → components-OZXZMDWU.js} +11 -11
  162. package/dist/config-P3ZQVF63.js +275 -0
  163. package/dist/config-graph-GKAOBAS5.js +160 -0
  164. package/dist/{configure-LMVQJ46J.js → configure-25LRYZJG.js} +56 -55
  165. package/dist/context-72VQV7JX.js +73 -0
  166. package/dist/{context-YG2LZDYZ.js → context-COWRWXP3.js} +89 -83
  167. package/dist/{context-XSZKKFBW.js → context-WB3D474G.js} +16 -16
  168. package/dist/{context-clear-AC5NXHM2.js → context-clear-Y4LYMWC6.js} +88 -82
  169. package/dist/{context-index-KKTPRV5G.js → context-index-W6A4V7OC.js} +4 -4
  170. package/dist/{context-map-T7ROR5D5.js → context-map-DKL3QT6D.js} +3 -3
  171. package/dist/{context-working-set-F4Q4J3NS.js → context-working-set-TMZYVC7A.js} +27 -25
  172. package/dist/data-tool-KMBWKKWR.js +2987 -0
  173. package/dist/{detail-H73BEF2N.js → detail-4GLROGY5.js} +89 -83
  174. package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-TR3LBP5P.js} +113 -107
  175. package/dist/docs-ZK777W2G.js +101 -0
  176. package/dist/{doctor-EQYJOGUG.js → doctor-WC4OV2OB.js} +76 -73
  177. package/dist/{eval-4P7O6CCE.js → eval-FUNWJNUJ.js} +88 -73
  178. package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
  179. package/dist/evals-L73EBHSU.js +104 -0
  180. package/dist/{evidence-O76QF7TZ.js → evidence-AVJ2RTHX.js} +99 -93
  181. package/dist/{evidence-D6GUSYJW.js → evidence-P4NZOAK7.js} +88 -82
  182. package/dist/evidence-Y55WKYHH.js +246 -0
  183. package/dist/{evolve-H47BCETS.js → evolve-MAWKRYWF.js} +93 -87
  184. package/dist/{extensions-NNL3ZOCU.js → extensions-PYQH3H47.js} +14 -13
  185. package/dist/fleet-M4H2QBWT.js +268 -0
  186. package/dist/{fleet-KMNS6NOM.js → fleet-ULBXXRDR.js} +146 -138
  187. package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-7NNC4JZU.js} +18 -17
  188. package/dist/fleet-decisions-EHEY7KPU.js +52 -0
  189. package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-LQ2AHZT3.js} +24 -24
  190. package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-5IGBIIYZ.js} +98 -258
  191. package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-UTTNOKMG.js} +9 -4
  192. package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-YGILJKA6.js} +29 -29
  193. package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-AUWTCDKR.js} +88 -82
  194. package/dist/{fleet-view-BHJFW26B.js → fleet-view-TGUFCY5A.js} +90 -84
  195. package/dist/{init-XAT5N5YM.js → init-GFN2Z7NF.js} +111 -104
  196. package/dist/install-6PIF6F6W.js +19 -0
  197. package/dist/{interop-FVECHFKG.js → interop-EF5JUWWK.js} +29 -29
  198. package/dist/{inventory-7KFQGLCV.js → inventory-I6VJDDYF.js} +90 -84
  199. package/dist/library-3J5IO2OJ.js +75 -0
  200. package/dist/{library-QAPAO23R.js → library-IJTOFTDS.js} +20 -19
  201. package/dist/{library-NY2XOT75.js → library-Z3KZSHPE.js} +35 -35
  202. package/dist/{library-import-5Y6MAS3R.js → library-import-IMKFLDHX.js} +29 -29
  203. package/dist/{library-inventory-JT6HWITQ.js → library-inventory-CQP5D6GU.js} +21 -21
  204. package/dist/{library-validation-EQUH25DC.js → library-validation-33UTX7AI.js} +19 -19
  205. package/dist/mcp-5FWZKUS6.js +26 -0
  206. package/dist/{memory-DYVTTCP6.js → memory-36CWN67Y.js} +93 -87
  207. package/dist/{models-MASFJ6Y2.js → models-KQ6PQJJQ.js} +57 -56
  208. package/dist/{monitor-YMP4NXJJ.js → monitor-XX6ZD6KC.js} +98 -91
  209. package/dist/{orchestrator-AFQRRTEI.js → orchestrator-SK6HDAOP.js} +1537 -832
  210. package/dist/{panes-NICTHQCV.js → panes-L27QRXUH.js} +14 -14
  211. package/dist/{panes-D3Y2KFG5.js → panes-LXZIWNOZ.js} +4 -4
  212. package/dist/{paths-PSFAUIGO.js → paths-7DJDU4P4.js} +6 -6
  213. package/dist/{preload-5Q7VXRFJ.js → preload-K2TDYI4Y.js} +88 -82
  214. package/dist/{reset-7NKZK7JN.js → reset-73VU3XNT.js} +13 -13
  215. package/dist/{resources-NILSIZAT.js → resources-3BYJYVYL.js} +24 -24
  216. package/dist/{run-BPZGEBZV.js → run-AR7PY6GW.js} +144 -136
  217. package/dist/run-script-H2KUDIII.js +41 -0
  218. package/dist/settings-3VMBMWID.js +72 -0
  219. package/dist/{share-EZ6ERBMH.js → share-HVWH4FPF.js} +30 -30
  220. package/dist/{skills-BTVVNYVM.js → skills-5TYEY75Q.js} +30 -30
  221. package/dist/{skills-eval-UY34MNK7.js → skills-eval-CK3MD63Z.js} +114 -103
  222. package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-KSFYG3I6.js} +24 -24
  223. package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-DMVHML7P.js} +60 -57
  224. package/dist/{steer-2B3EQGFH.js → steer-XCD6V3EW.js} +4 -4
  225. package/dist/{support-L2SOL3IE.js → support-JAZL6VBR.js} +7 -7
  226. package/dist/system-3TDQRMZZ.js +116 -0
  227. package/dist/{targets-44VKGFLN.js → targets-EZKHAYRN.js} +74 -72
  228. package/dist/{tasks-3KODKFU7.js → tasks-SNEFHWYW.js} +18 -18
  229. package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-BNLFA4OF.js} +8 -7
  230. package/dist/{tools-3UB7TEVR.js → tools-7IM6BDCE.js} +12 -12
  231. package/dist/{trace-TAMIU4OJ.js → trace-C3MBGD4S.js} +16 -65
  232. package/dist/{tui-primitives-A6MUW32V.js → tui-primitives-36BY2774.js} +2 -2
  233. package/dist/{uninstall-QYVRPEM4.js → uninstall-WWLOSZ42.js} +35 -10
  234. package/dist/{upgrade-7PMKM2JH.js → upgrade-ETK2JNSJ.js} +42 -51
  235. package/dist/{usage-6EQV7EQK.js → usage-S2HOB7BZ.js} +112 -102
  236. package/dist/{verifiers-JLITWSHU.js → verifiers-QDTEVH7R.js} +26 -24
  237. package/dist/{verify-T7NAEVIG.js → verify-SUKUK6XM.js} +16 -15
  238. package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
  239. package/dist/web/client/assets/abnfDiagram-VCTEODGH-BznNOe_I.js +1 -0
  240. package/dist/web/client/assets/arc-Pry-7G1_.js +1 -0
  241. package/dist/web/client/assets/architecture-7GRP2DOG-BQO9DL_y.js +1 -0
  242. package/dist/web/client/assets/architectureDiagram-5GKGNRK7-CKPbdvyx.js +36 -0
  243. package/dist/web/client/assets/array-BifhSqXX.js +1 -0
  244. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
  245. package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
  246. package/dist/web/client/assets/blockDiagram-I7D4REHJ-prINbpbM.js +129 -0
  247. package/dist/web/client/assets/c4Diagram-7LVT6UL2-DkVRKtyU.js +38 -0
  248. package/dist/web/client/assets/channel-c4EeUUqA.js +1 -0
  249. package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
  250. package/dist/web/client/assets/chunk-4HAMMTFA-CV0Z1ApC.js +62 -0
  251. package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
  252. package/dist/web/client/assets/chunk-75Z2AOVW-D34Nohxq.js +2 -0
  253. package/dist/web/client/assets/chunk-DU6HZSFF-Das_cS-O.js +125 -0
  254. package/dist/web/client/assets/chunk-F27PBJKO-CmRojxkG.js +1 -0
  255. package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
  256. package/dist/web/client/assets/chunk-GMAD6QVW-ClYZmc73.js +72 -0
  257. package/dist/web/client/assets/chunk-GVQU2GXP-B2BiHFt-.js +1 -0
  258. package/dist/web/client/assets/chunk-IMKFNOWR-BGApZ8nP.js +231 -0
  259. package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
  260. package/dist/web/client/assets/chunk-L3NEJ4N5-DIzCgpkY.js +1 -0
  261. package/dist/web/client/assets/chunk-OSK3NFVY-BPT-yePv.js +10 -0
  262. package/dist/web/client/assets/chunk-P2QGCYS3-BC1WTc2t.js +1 -0
  263. package/dist/web/client/assets/chunk-POPQ4Y6H-BSjzBmZU.js +1 -0
  264. package/dist/web/client/assets/chunk-PWAF6VOD-BIjLs86Z.js +1 -0
  265. package/dist/web/client/assets/chunk-SHT3W25Y-CduDz2cm.js +168 -0
  266. package/dist/web/client/assets/chunk-SVP7TREG-XUn4pPAP.js +88 -0
  267. package/dist/web/client/assets/chunk-TICWLB2K-DcBy2DKy.js +206 -0
  268. package/dist/web/client/assets/chunk-XXDRQBXY-DqAYeljN.js +1 -0
  269. package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
  270. package/dist/web/client/assets/classDiagram-ZZMXUADV-C0HR7YKN.js +1 -0
  271. package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-C0HR7YKN.js +1 -0
  272. package/dist/web/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
  273. package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
  274. package/dist/web/client/assets/cose-bilkent-JH36ORCC-CVh1icwb.js +1 -0
  275. package/dist/web/client/assets/cynefin-OW5HDTMX-BecPbyM6.js +1 -0
  276. package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-BzMzFwyT.js +62 -0
  277. package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
  278. package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
  279. package/dist/web/client/assets/dagre-GXQ25YYZ-CAWJmRMG.js +4 -0
  280. package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
  281. package/dist/web/client/assets/diagram-S7CK7UJ4--lp0ALmn.js +30 -0
  282. package/dist/web/client/assets/diagram-UQ7AKVKN-gKUnsjcj.js +41 -0
  283. package/dist/web/client/assets/diagram-VSXAHHWV-BoN5D1Gh.js +3 -0
  284. package/dist/web/client/assets/diagram-VX7I27RA-BMtuswQ6.js +24 -0
  285. package/dist/web/client/assets/diagram-Z3DM3KII-DtU8LXrA.js +24 -0
  286. package/dist/web/client/assets/dist-v5Q1xZ2K.js +1 -0
  287. package/dist/web/client/assets/ebnfDiagram-PWID7BFC-DDcnv9BH.js +1 -0
  288. package/dist/web/client/assets/erDiagram-RLTQ6QDP-DvRb4iDL.js +99 -0
  289. package/dist/web/client/assets/eventmodeling-NTZA5JFV-01h4SbTc.js +1 -0
  290. package/dist/web/client/assets/flowDiagram-HODETNUW-Bll_YZ6T.js +1 -0
  291. package/dist/web/client/assets/framework-YGoR34M4.js +9 -0
  292. package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-DdFZ9hvH.js +292 -0
  293. package/dist/web/client/assets/gitGraph-4MIJSDKK-DjD_AAMj.js +1 -0
  294. package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CDyN9n2u.js +106 -0
  295. package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
  296. package/dist/web/client/assets/index-CVcy0FAn.js +75 -0
  297. package/dist/web/client/assets/index-Dsi52apB.css +1 -0
  298. package/dist/web/client/assets/info-A6RAGUB7-C_XK8Hq0.js +1 -0
  299. package/dist/web/client/assets/infoDiagram-27XIBGKW-DIe4tJ1i.js +2 -0
  300. package/dist/web/client/assets/init-C-OQMol4.js +1 -0
  301. package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-CVl5unKI.js +70 -0
  302. package/dist/web/client/assets/journeyDiagram-3NMN7TZE-CPEB1Vt8.js +139 -0
  303. package/dist/web/client/assets/kanban-definition-UXKFOSKX-j-9WXjYQ.js +89 -0
  304. package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
  305. package/dist/web/client/assets/line-BIDAcEtX.js +1 -0
  306. package/dist/web/client/assets/linear-SzVmGSw4.js +1 -0
  307. package/dist/web/client/assets/mermaid-parser.core-Ux4vssh0.js +7 -0
  308. package/dist/web/client/assets/mermaid.core-CDuwVKeh.js +44 -0
  309. package/dist/web/client/assets/mindmap-definition-YA3MSWOX-5MlQEeQ6.js +96 -0
  310. package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
  311. package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
  312. package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
  313. package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
  314. package/dist/web/client/assets/packet-AYTQ26CC-DRO66c9Q.js +1 -0
  315. package/dist/web/client/assets/path-fybaL0A-.js +1 -0
  316. package/dist/web/client/assets/pegDiagram-XKGWAZYB-BakZnSjM.js +1 -0
  317. package/dist/web/client/assets/pie-WAS4IAKB-BEzcmhz8.js +1 -0
  318. package/dist/web/client/assets/pieDiagram-E7YTZNPT-DpmqgoPt.js +39 -0
  319. package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
  320. package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
  321. package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
  322. package/dist/web/client/assets/prism-core-BtsZdCS6.js +1 -0
  323. package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
  324. package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
  325. package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
  326. package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
  327. package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
  328. package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
  329. package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
  330. package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
  331. package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
  332. package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
  333. package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
  334. package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
  335. package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
  336. package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
  337. package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
  338. package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
  339. package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
  340. package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
  341. package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
  342. package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
  343. package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
  344. package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
  345. package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
  346. package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
  347. package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
  348. package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
  349. package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-DuMPwwV2.js +7 -0
  350. package/dist/web/client/assets/radar-RG4KPBEZ-Djm3oXl5.js +1 -0
  351. package/dist/web/client/assets/railroad-74A4TZTK-Cpvkwsao.js +1 -0
  352. package/dist/web/client/assets/railroad-abnf-HS5TGJTU-CpRQ3ruG.js +1 -0
  353. package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-1Rm5a5eJ.js +1 -0
  354. package/dist/web/client/assets/railroad-peg-WCYAUIDC-C8344cTh.js +1 -0
  355. package/dist/web/client/assets/railroadDiagram-O6MQD6OU-CgMS4B6R.js +1 -0
  356. package/dist/web/client/assets/requirementDiagram-BXWQKSXE-CX5eoNdN.js +84 -0
  357. package/dist/web/client/assets/rolldown-runtime-hePW80VL.js +1 -0
  358. package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
  359. package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-CODBX2N3.js +40 -0
  360. package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-eUhhF8OR.js +162 -0
  361. package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
  362. package/dist/web/client/assets/src-B6xuSHsQ.js +1 -0
  363. package/dist/web/client/assets/stateDiagram-D77RDMKH-vR6l0NC2.js +1 -0
  364. package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-BYUm8jLY.js +1 -0
  365. package/dist/web/client/assets/swimlanes-42K2YHIH-v9Tw_zX7.js +1 -0
  366. package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-B2jdCvhD.js +8 -0
  367. package/dist/web/client/assets/timeline-definition-24CTP7MA-DxianbhU.js +120 -0
  368. package/dist/web/client/assets/treeView-Q6P3EWNA-DLxnZb9R.js +1 -0
  369. package/dist/web/client/assets/treemap-WGGIJYW6-I7UnZ6xJ.js +1 -0
  370. package/dist/web/client/assets/vennDiagram-4TSXK5OY-Ar7M8Mrj.js +34 -0
  371. package/dist/web/client/assets/wardley-WFR3VGLG-B8ZSHeDu.js +1 -0
  372. package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-Qks2FmIn.js +78 -0
  373. package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BBBjRtiE.js +7 -0
  374. package/dist/web/client/clio-coder-logo.webp +0 -0
  375. package/dist/web/client/icon-192.png +0 -0
  376. package/dist/web/client/icon-512.png +0 -0
  377. package/dist/web/client/index.html +6 -0
  378. package/dist/web/client/manifest.webmanifest +15 -0
  379. package/dist/web/client/offline.css +55 -0
  380. package/dist/web/client/offline.html +5 -0
  381. package/dist/web/client/offline.js +27 -0
  382. package/dist/web/client/sw.js +34 -0
  383. package/dist/web/ops-worker.js +37 -0
  384. package/dist/web/reads-worker.js +1726 -0
  385. package/dist/web/server.js +8499 -0
  386. package/dist/web-EMGUGGEI.js +13 -0
  387. package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-6BRRVQON.js} +22 -5
  388. package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-XHSJTDOP.js} +120 -113
  389. package/dist/{with-panes-CHFC7HGI.js → with-panes-Z6BTEHMZ.js} +12 -12
  390. package/dist/worker/entry.js +113 -99
  391. package/docs/README.md +28 -27
  392. package/docs/architecture/acp.md +5 -9
  393. package/docs/architecture/alcf-provider.md +0 -3
  394. package/docs/architecture/architecture.md +0 -3
  395. package/docs/architecture/artifact-placement.md +12 -4
  396. package/docs/architecture/artifact-versions.md +0 -3
  397. package/docs/architecture/capacity-and-scheduling.md +0 -3
  398. package/docs/architecture/context-engine.md +0 -3
  399. package/docs/architecture/context-working-set.md +0 -3
  400. package/docs/architecture/dispatch-architecture-rationale.md +0 -3
  401. package/docs/architecture/dispatch-typed-intent.md +0 -3
  402. package/docs/architecture/evidence-and-memory.md +0 -3
  403. package/docs/architecture/library.md +1 -3
  404. package/docs/architecture/middleware-and-components.md +0 -3
  405. package/docs/architecture/model-catalog.md +1 -4
  406. package/docs/architecture/observability.md +0 -3
  407. package/docs/architecture/pi-boundary.md +6 -9
  408. package/docs/architecture/prompt-envelope-and-tools.md +37 -30
  409. package/docs/architecture/provider-adapter-cookbook.md +1 -4
  410. package/docs/architecture/safety-model.md +19 -9
  411. package/docs/architecture/session-lifecycle.md +10 -7
  412. package/docs/architecture/time-conventions.md +0 -3
  413. package/docs/architecture/trace-store.md +28 -20
  414. package/docs/architecture/tui-design.md +38 -18
  415. package/docs/architecture/worker-context.md +1 -3
  416. package/docs/architecture/worker-dispatch-mechanics.md +1 -4
  417. package/docs/guide/authoring-plugins.md +1 -3
  418. package/docs/guide/built-in-agents.md +0 -3
  419. package/docs/guide/commands-and-modes.md +41 -25
  420. package/docs/guide/configuration-and-targets.md +204 -9
  421. package/docs/guide/configuration-reference.md +125 -17
  422. package/docs/guide/environment-variables.md +2 -8
  423. package/docs/guide/exit-codes-and-output.md +0 -3
  424. package/docs/guide/extensions-and-sharing.md +0 -3
  425. package/docs/guide/fleet-dispatch.md +3 -5
  426. package/docs/guide/glossary.md +1 -4
  427. package/docs/guide/harness-extensions.md +0 -2
  428. package/docs/guide/installation-and-lifecycle.md +3 -6
  429. package/docs/guide/interop.md +0 -2
  430. package/docs/guide/panes-and-files.md +0 -3
  431. package/docs/guide/plugins.md +0 -3
  432. package/docs/guide/proactive-memory.md +0 -3
  433. package/docs/guide/resource-library.md +1 -3
  434. package/docs/guide/skills-marketplace.md +0 -2
  435. package/docs/guide/tool-usage.md +166 -67
  436. package/docs/guide/troubleshooting.md +1 -4
  437. package/docs/history/config-knobs-audit.md +0 -3
  438. package/docs/history/release-cut-checklist.md +0 -3
  439. package/docs/process/development-pipeline.md +0 -3
  440. package/docs/process/documentation-coverage.md +3 -3
  441. package/docs/process/documentation-guide.md +16 -22
  442. package/docs/process/eval-runner.md +0 -3
  443. package/docs/process/evals-internal.md +0 -3
  444. package/docs/process/evolution.md +0 -3
  445. package/docs/process/fleet-demo-runbook.md +6 -9
  446. package/docs/process/git-commit-provenance.md +0 -3
  447. package/docs/process/performance-methodology.md +1 -4
  448. package/docs/process/release-cut-checklist.md +114 -221
  449. package/docs/process/scientific-validation.md +23 -6
  450. package/docs/process/tool-audit-v0.4.9.md +357 -0
  451. package/library/registry.yaml +2 -2
  452. package/library/skills/meta/clio-coder-test/SKILL.md +25 -15
  453. package/library/skills/meta/clio-coder-test/evals.md +16 -2
  454. package/library/skills/meta/clio-coder-test/plugin.json +1 -1
  455. package/library/skills/meta/clio-coder-test/references/test-map.md +19 -18
  456. package/library/skills/registry.yaml +2 -2
  457. package/library/skills/skill-marketplace.json +1 -1
  458. package/package.json +13 -11
  459. package/src/cli/argv.ts +31 -0
  460. package/src/cli/clio.ts +17 -13
  461. package/src/cli/config.ts +4 -0
  462. package/src/cli/docs.ts +65 -328
  463. package/src/cli/doctor-panes.ts +1 -1
  464. package/src/cli/doctor.ts +3 -1
  465. package/src/cli/index.ts +17 -2
  466. package/src/cli/mcp.ts +106 -0
  467. package/src/cli/skills-eval.ts +8 -2
  468. package/src/cli/trace.ts +4 -65
  469. package/src/cli/uninstall.ts +26 -0
  470. package/src/cli/upgrade.ts +34 -38
  471. package/src/cli/usage.ts +3 -0
  472. package/src/cli/verifiers.ts +1 -1
  473. package/src/cli/web.ts +79 -0
  474. package/src/core/bash-exec.ts +27 -4
  475. package/src/core/bus-events.ts +3 -4
  476. package/src/core/config.ts +73 -1
  477. package/src/core/defaults.ts +10 -1
  478. package/src/core/domain-loader.ts +37 -28
  479. package/src/core/event-bus.ts +1 -1
  480. package/src/core/run-records.ts +438 -0
  481. package/src/core/safe-exec.ts +506 -56
  482. package/src/core/skill-activation.ts +5 -3
  483. package/src/core/termination.ts +16 -12
  484. package/src/core/tool-names.ts +33 -12
  485. package/src/domains/agents/contract.ts +1 -1
  486. package/src/domains/agents/extension.ts +18 -10
  487. package/src/domains/config/extension.ts +5 -4
  488. package/src/domains/context/clio-md.ts +1 -1
  489. package/src/domains/context/worker/pressure.ts +6 -2
  490. package/src/domains/context/working-set/path-index.ts +7 -2
  491. package/src/domains/dispatch/code-step.ts +7 -2
  492. package/src/domains/dispatch/contract.ts +7 -0
  493. package/src/domains/dispatch/execution-role.ts +3 -3
  494. package/src/domains/dispatch/execution-scheduler.ts +204 -79
  495. package/src/domains/dispatch/extension.ts +206 -26
  496. package/src/domains/dispatch/fleet-preflight.ts +18 -3
  497. package/src/domains/dispatch/fleet-run.ts +1 -0
  498. package/src/domains/dispatch/gate-decisions.ts +3 -3
  499. package/src/domains/dispatch/heartbeat.ts +1 -1
  500. package/src/domains/dispatch/host-verification.ts +16 -14
  501. package/src/domains/dispatch/index.ts +1 -0
  502. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  503. package/src/domains/dispatch/receipt-findings.ts +3 -4
  504. package/src/domains/dispatch/receipt-integrity.ts +3 -0
  505. package/src/domains/dispatch/reservation-store.ts +7 -9
  506. package/src/domains/dispatch/route-facts.ts +1 -1
  507. package/src/domains/dispatch/state.ts +4 -5
  508. package/src/domains/dispatch/types.ts +3 -1
  509. package/src/domains/eval/metrics/tracked.ts +22 -2
  510. package/src/domains/evidence/build.ts +35 -7
  511. package/src/domains/extensions/operator-runtime.ts +3 -1
  512. package/src/domains/gateway/mcp/client.ts +923 -0
  513. package/src/domains/gateway/mcp/config.ts +456 -0
  514. package/src/domains/gateway/mcp/index.ts +88 -0
  515. package/src/domains/gateway/mcp/protocol.ts +273 -0
  516. package/src/domains/gateway/mcp/trust.ts +263 -0
  517. package/src/domains/lifecycle/doctor.ts +17 -3
  518. package/src/domains/middleware/hooks.ts +2 -2
  519. package/src/domains/mux/contract.ts +5 -9
  520. package/src/domains/mux/detect.ts +1 -1
  521. package/src/domains/mux/extension.ts +1 -1
  522. package/src/domains/mux/protocol.ts +5 -7
  523. package/src/domains/mux/socket-client.ts +3 -3
  524. package/src/domains/observability/accountability.ts +2 -2
  525. package/src/domains/observability/background-memory-usage.ts +3 -0
  526. package/src/domains/observability/compaction-usage.ts +2 -0
  527. package/src/domains/observability/contract.ts +7 -3
  528. package/src/domains/observability/cost.ts +5 -0
  529. package/src/domains/observability/evidence-index.ts +2 -2
  530. package/src/domains/observability/extension.ts +1 -0
  531. package/src/domains/observability/out-of-turn-usage.ts +2 -0
  532. package/src/domains/observability/projection.ts +10 -0
  533. package/src/domains/observability/trace-store.ts +65 -5
  534. package/src/domains/prompts/compiler.ts +41 -23
  535. package/src/domains/prompts/extension.ts +4 -17
  536. package/src/domains/prompts/fragments/identity/docs-routing.md +2 -2
  537. package/src/domains/prompts/fragments/operating/skills.md +12 -10
  538. package/src/domains/providers/cache-deployment.ts +147 -0
  539. package/src/domains/providers/catalog.ts +12 -7
  540. package/src/domains/providers/extension.ts +27 -5
  541. package/src/domains/providers/index.ts +6 -1
  542. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +42 -10
  543. package/src/domains/providers/plugins.ts +3 -13
  544. package/src/domains/providers/probe/http.ts +44 -59
  545. package/src/domains/providers/probe/reasoning.ts +2 -0
  546. package/src/domains/providers/runtimes/common/local-synth.ts +4 -0
  547. package/src/domains/providers/runtimes/local-native/llamacpp-embed.ts +20 -31
  548. package/src/domains/providers/runtimes/local-native/llamacpp-rerank.ts +9 -4
  549. package/src/domains/providers/types/target-descriptor.ts +17 -0
  550. package/src/domains/safety/action-classifier.ts +17 -1
  551. package/src/domains/safety/call-target.ts +14 -0
  552. package/src/domains/safety/contract.ts +1 -1
  553. package/src/domains/safety/finish-contract.ts +9 -3
  554. package/src/domains/safety/loop-detector.ts +1 -1
  555. package/src/domains/safety/policy-engine.ts +7 -0
  556. package/src/domains/safety/protected-artifacts.ts +3 -4
  557. package/src/domains/safety/rejection-feedback.ts +1 -1
  558. package/src/domains/safety/scope.ts +2 -3
  559. package/src/domains/safety/validation-contract.ts +3 -2
  560. package/src/domains/scheduling/budget.ts +5 -3
  561. package/src/domains/scheduling/contract.ts +2 -1
  562. package/src/domains/scheduling/extension.ts +3 -3
  563. package/src/domains/session/compaction/branch-summary.ts +1 -1
  564. package/src/domains/session/compaction/compact.ts +29 -3
  565. package/src/domains/session/compaction/cut-point.ts +1 -1
  566. package/src/domains/session/compaction/tokens.ts +5 -10
  567. package/src/domains/session/contract.ts +1 -1
  568. package/src/domains/session/cwd-fallback.ts +2 -2
  569. package/src/domains/session/entries.ts +1 -0
  570. package/src/domains/session/handoff.ts +5 -1
  571. package/src/domains/session/history.ts +6 -0
  572. package/src/domains/session/manager.ts +14 -7
  573. package/src/domains/session/retry.ts +2 -1
  574. package/src/domains/session/session-artifacts.ts +12 -7
  575. package/src/domains/session/task-board.ts +2 -3
  576. package/src/domains/session/usage.ts +6 -7
  577. package/src/engine/acp/server.ts +11 -0
  578. package/src/engine/ai.ts +2 -0
  579. package/src/engine/apis/openai-completions.ts +17 -4
  580. package/src/engine/loop-guard.ts +7 -0
  581. package/src/engine/prewarm.ts +232 -0
  582. package/src/engine/provider-diagnostics.ts +6 -1
  583. package/src/engine/provider-error-body.ts +65 -0
  584. package/src/engine/session.ts +118 -29
  585. package/src/engine/worker-runtime.ts +3 -0
  586. package/src/entry/boot-options.ts +2 -0
  587. package/src/entry/orchestrator.ts +38 -18
  588. package/src/interactive/chat-loop-messages.ts +3 -0
  589. package/src/interactive/chat-loop-policy.ts +1 -0
  590. package/src/interactive/chat-loop.ts +10 -12
  591. package/src/interactive/chat-panel.ts +23 -9
  592. package/src/interactive/chat-renderer.ts +33 -11
  593. package/src/interactive/clio-editor.ts +13 -5
  594. package/src/interactive/dispatch-board.ts +70 -30
  595. package/src/interactive/editor-submit.ts +30 -25
  596. package/src/interactive/footer/widgets.ts +12 -9
  597. package/src/interactive/interactive-presentation.ts +2 -3
  598. package/src/interactive/mux-bridge.ts +3 -7
  599. package/src/interactive/overlay-general-openers.ts +14 -7
  600. package/src/interactive/overlays/cwd-fallback.ts +1 -1
  601. package/src/interactive/overlays/library-model.ts +114 -35
  602. package/src/interactive/overlays/library.ts +52 -5
  603. package/src/interactive/overlays/list-overlay.ts +4 -1
  604. package/src/interactive/overlays/session-selector.ts +28 -23
  605. package/src/interactive/overlays/settings.ts +20 -1
  606. package/src/interactive/overlays/tree-selector.ts +47 -10
  607. package/src/interactive/panes-runtime.ts +1 -1
  608. package/src/interactive/prewarm.ts +11 -197
  609. package/src/interactive/renderers/compaction-summary.ts +1 -1
  610. package/src/interactive/renderers/provider-error.ts +118 -0
  611. package/src/interactive/renderers/retry-status.ts +59 -23
  612. package/src/interactive/renderers/tool-execution.ts +67 -7
  613. package/src/interactive/renderers/worker-answer.ts +198 -0
  614. package/src/interactive/renderers/worker-entry.ts +57 -163
  615. package/src/interactive/session-usage-reseed.ts +2 -0
  616. package/src/interactive/side-question.ts +2 -0
  617. package/src/interactive/slash-commands.ts +26 -1
  618. package/src/interactive/slash-spec.ts +2 -2
  619. package/src/interactive/theme/labels.ts +66 -30
  620. package/src/interactive/turn-context.ts +1 -0
  621. package/src/interactive/turn-persistence.ts +9 -1
  622. package/src/interactive/turn-prewarm.ts +126 -19
  623. package/src/interactive/turn-recovery.ts +2 -1
  624. package/src/interactive/turn-runtime.ts +36 -5
  625. package/src/interactive/view/artifacts.ts +3 -2
  626. package/src/interactive/view/view-overlay.ts +96 -20
  627. package/src/tools/agent-tools.ts +21 -7
  628. package/src/tools/artifact.ts +16 -8
  629. package/src/tools/bash.ts +90 -11
  630. package/src/tools/bootstrap.ts +42 -4
  631. package/src/tools/builtin-tool-catalog.ts +80 -11
  632. package/src/tools/context/index.ts +27 -31
  633. package/src/tools/context/library.ts +3 -1
  634. package/src/tools/context/surface.ts +12 -26
  635. package/src/tools/core-bootstrap.ts +72 -1
  636. package/src/tools/data/csv.ts +1189 -0
  637. package/src/tools/data/index.ts +308 -0
  638. package/src/tools/data/json.ts +1799 -0
  639. package/src/tools/data/jsonl.ts +561 -0
  640. package/src/tools/data/shared.ts +452 -0
  641. package/src/tools/edit-diff.ts +0 -7
  642. package/src/tools/edit.ts +115 -18
  643. package/src/tools/file-mutation-queue.ts +114 -4
  644. package/src/tools/find.ts +108 -29
  645. package/src/tools/gateway/caps.ts +11 -0
  646. package/src/tools/gateway/clio-context-surface.ts +41 -0
  647. package/src/tools/gateway/clio-context-tools.ts +77 -0
  648. package/src/tools/gateway/data-surface.ts +138 -0
  649. package/src/tools/gateway/data-tool.ts +201 -0
  650. package/src/tools/gateway/index.ts +342 -0
  651. package/src/tools/gateway/mcp-capabilities.ts +469 -0
  652. package/src/tools/grep.ts +88 -33
  653. package/src/tools/harness-extensions.ts +3 -0
  654. package/src/tools/ignore-policy.ts +7 -5
  655. package/src/tools/ls.ts +111 -20
  656. package/src/tools/policy.ts +35 -13
  657. package/src/tools/presentation.ts +6 -0
  658. package/src/tools/read.ts +634 -156
  659. package/src/tools/registry.ts +106 -8
  660. package/src/tools/run-script.ts +997 -0
  661. package/src/tools/spawn-hygiene.ts +157 -5
  662. package/src/tools/surface.ts +163 -0
  663. package/src/tools/verify/authoring.ts +8 -3
  664. package/src/tools/verify/catalog.ts +14 -1
  665. package/src/tools/verify/numeric.ts +367 -59
  666. package/src/tools/verify/perf.ts +171 -9
  667. package/src/tools/verify/scripts.ts +178 -26
  668. package/src/tools/web-fetch-surface.ts +22 -0
  669. package/src/tools/web-fetch.ts +26 -1
  670. package/src/tools/write.ts +45 -19
  671. package/src/worker/spec-contract.ts +27 -0
  672. package/dist/chunk-B6UM3OZC.js +0 -15
  673. package/dist/chunk-GJ24ODAX.js +0 -196
  674. package/dist/chunk-HRAKUPIH.js +0 -57
  675. package/dist/docs-BL7ROUFN.js +0 -292
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iowarp/clio-coder",
3
- "version": "0.4.7",
3
+ "version": "0.4.9",
4
4
  "description": "The terminal coding agent for people who maintain the code that science runs on, with user-chosen models and inspectable evidence.",
5
5
  "keywords": [
6
6
  "ai",
@@ -57,7 +57,6 @@
57
57
  ".claude-plugin/marketplace.json",
58
58
  "evals/**",
59
59
  "docs/**/*.md",
60
- "!docs/html/**",
61
60
  "README.md",
62
61
  "CHANGELOG.md",
63
62
  "CONTRIBUTING.md",
@@ -72,8 +71,8 @@
72
71
  "access": "public"
73
72
  },
74
73
  "scripts": {
75
- "build": "tsup && node --import tsx scripts/build-codewiki-asset.ts",
76
- "dev": "tsup --watch",
74
+ "build": "node --import tsx scripts/build.ts && node --import tsx scripts/build-codewiki-asset.ts",
75
+ "dev": "node --import tsx scripts/build.ts --watch",
77
76
  "clean": "rm -rf dist",
78
77
  "typecheck": "tsc -p tsconfig.tests.json",
79
78
  "format": "biome format --write .",
@@ -82,18 +81,21 @@
82
81
  "pi:surface-snapshot": "node --import tsx scripts/pi-surface-diff.ts --write",
83
82
  "test:file": "node --import tsx --import ./tests/harness/tmp-root.ts --test",
84
83
  "pretest": "test -f dist/cli/index.js || pnpm run build",
85
- "test": "node --import tsx --import ./tests/harness/tmp-root.ts --test tests/contracts/*.test.ts tests/smoke/*.test.ts",
86
- "test:trace-viewer": "pnpm --filter @iowarp/clio-trace-viewer test",
87
- "trace:ui": "node apps/trace-viewer/server.mjs",
88
- "ci": "pnpm run typecheck && pnpm run lint && pnpm run build && pnpm run test && pnpm run test:trace-viewer",
89
- "ci:release": "pnpm run ci && node scripts/check-release.mjs",
84
+ "test": "node --import tsx --import ./tests/harness/tmp-root.ts --test --test-concurrency=2 tests/contracts/*.test.ts tests/smoke/acp-boundary.test.ts tests/smoke/real-binary-boot.test.ts tests/smoke/process-lifecycle.test.ts",
85
+ "test:web": "pnpm --filter @iowarp/clio-coder-web test",
86
+ "ci": "pnpm run typecheck && pnpm run lint && pnpm run build && pnpm run test && pnpm run test:web",
87
+ "ci:release": "node scripts/release-candidate.mjs qualify",
90
88
  "install:local": "bash scripts/install-local.sh",
91
89
  "smoke:real-home": "bash scripts/smoke-real-home.sh",
92
- "prepublishOnly": "CLIO_CODER_RELEASE_CONTEXT=publish pnpm run ci:release",
90
+ "prepublishOnly": "node scripts/release-candidate.mjs preflight",
93
91
  "skills:pin": "node --import tsx scripts/pin-skills.ts",
94
92
  "skills:check": "node --import tsx scripts/pin-skills.ts --check",
95
93
  "library:pin": "node --import tsx scripts/pin-library.ts",
96
- "library:check": "node --import tsx scripts/pin-library.ts --check"
94
+ "library:check": "node --import tsx scripts/pin-library.ts --check",
95
+ "test:full": "node --import tsx --import ./tests/harness/tmp-root.ts --test tests/contracts/*.test.ts tests/extended/*.test.ts tests/smoke/*.test.ts tests/extended-smoke/*.test.ts",
96
+ "test:package": "node --import tsx --import ./tests/harness/tmp-root.ts --test --test-concurrency=2 tests/smoke/installed-package.test.ts tests/smoke/native-call-timing.test.ts",
97
+ "release:preflight": "node scripts/release-candidate.mjs preflight",
98
+ "test:web:full": "pnpm --filter @iowarp/clio-coder-web test:full"
97
99
  },
98
100
  "optionalDependencies": {
99
101
  "@anthropic-ai/claude-agent-sdk": "0.3.186"
package/src/cli/argv.ts CHANGED
@@ -8,6 +8,16 @@
8
8
  */
9
9
 
10
10
  import chalk from "chalk";
11
+ import type { AutonomyLevel } from "../domains/safety/autonomy.js";
12
+
13
+ // A type-only import keeps this module out of the domain graph; `satisfies`
14
+ // fails the build if the levels ever drift from the safety domain's list.
15
+ const AUTONOMY_LEVELS = [
16
+ "read-only",
17
+ "suggest",
18
+ "auto-edit",
19
+ "full-auto",
20
+ ] as const satisfies ReadonlyArray<AutonomyLevel>;
11
21
 
12
22
  export function printError(message: string, detail?: string): void {
13
23
  const head = chalk.red("error:");
@@ -75,6 +85,8 @@ export interface GlobalCliFlags {
75
85
  * both beat the `panes.enabled` setting; absent means the setting decides.
76
86
  */
77
87
  panes?: "with" | "without";
88
+ /** `--autonomy <level>` before any subcommand: one interactive session at that level. */
89
+ autonomy?: AutonomyLevel;
78
90
  rest: string[];
79
91
  error?: string;
80
92
  }
@@ -136,6 +148,7 @@ export function extractGlobalFlags(
136
148
  let noContextFiles = false;
137
149
  let noSkills = false;
138
150
  let panes: "with" | "without" | undefined;
151
+ let autonomy: AutonomyLevel | undefined;
139
152
  const skillPaths: string[] = [];
140
153
  for (let i = 0; i < argv.length; i++) {
141
154
  const arg = argv[i];
@@ -174,6 +187,23 @@ export function extractGlobalFlags(
174
187
  panes = arg === "--with-panes" ? "with" : "without";
175
188
  continue;
176
189
  }
190
+ if (arg === "--autonomy") {
191
+ const value = argv[i + 1];
192
+ if (value === undefined || !AUTONOMY_LEVELS.includes(value as AutonomyLevel)) {
193
+ return {
194
+ noContextFiles,
195
+ noSkills,
196
+ skillPaths,
197
+ rest,
198
+ error: `--autonomy must be one of: ${AUTONOMY_LEVELS.join("|")}`,
199
+ ...(apiKey === undefined ? {} : { apiKey }),
200
+ ...(panes === undefined ? {} : { panes }),
201
+ };
202
+ }
203
+ autonomy = value as AutonomyLevel;
204
+ i += 1;
205
+ continue;
206
+ }
177
207
  if (arg === "--api-key" || arg === "--skill") {
178
208
  const value = argv[i + 1];
179
209
  if (value === undefined || value.startsWith("-") || isSubcommand(value)) {
@@ -209,5 +239,6 @@ export function extractGlobalFlags(
209
239
  rest,
210
240
  ...(apiKey === undefined ? {} : { apiKey }),
211
241
  ...(panes === undefined ? {} : { panes }),
242
+ ...(autonomy === undefined ? {} : { autonomy }),
212
243
  };
213
244
  }
package/src/cli/clio.ts CHANGED
@@ -13,7 +13,22 @@ function terminalLeaseEligible(
13
13
  return !options.headless && !options.acp && env.CLIO_CODER_INTERACTIVE === "1";
14
14
  }
15
15
 
16
- export async function runClioCommand(options: BootOptions = {}): Promise<number> {
16
+ export interface ClioCommandDependencies {
17
+ bootOrchestrator: typeof import("../entry/orchestrator.js").bootOrchestrator;
18
+ }
19
+
20
+ const DEFAULT_DEPENDENCIES: ClioCommandDependencies = {
21
+ bootOrchestrator: async (options) => {
22
+ const { bootOrchestrator } = await import("../entry/orchestrator.js");
23
+ return bootOrchestrator(options);
24
+ },
25
+ };
26
+
27
+ export async function runClioCommand(
28
+ options: BootOptions = {},
29
+ dependencies: Partial<ClioCommandDependencies> = {},
30
+ ): Promise<number> {
31
+ const deps = { ...DEFAULT_DEPENDENCIES, ...dependencies };
17
32
  // Bare `clio` (no subcommand) boots interactive mode implicitly, but only
18
33
  // when stdin is a real TTY. Piped or /dev/null stdin (used by verify.ts,
19
34
  // CI runners, and non-interactive scripts) should fall through to the
@@ -69,18 +84,7 @@ export async function runClioCommand(options: BootOptions = {}): Promise<number>
69
84
  }
70
85
  }
71
86
  }
72
- // Deterministic built-PTY interleaving seam. It is unavailable outside
73
- // NODE_ENV=test and bounded even under a malformed value.
74
- if (terminalLease && process.env.NODE_ENV === "test") {
75
- const requestedDelay = Number.parseInt(process.env.CLIO_CODER_TEST_STAGE1_DELAY_MS ?? "0", 10);
76
- const delayMs = Number.isFinite(requestedDelay) ? Math.max(0, Math.min(5_000, requestedDelay)) : 0;
77
- if (delayMs > 0) await new Promise<void>((resolve) => setTimeout(resolve, delayMs));
78
- if (process.env.CLIO_CODER_TEST_STAGE1_FAIL === "1") {
79
- throw new Error("injected Stage 1 hydration failure");
80
- }
81
- }
82
- const { bootOrchestrator } = await import("../entry/orchestrator.js");
83
- const result = await bootOrchestrator({
87
+ const result = await deps.bootOrchestrator({
84
88
  ...options,
85
89
  ...(startupSettings ? { startupSettings } : {}),
86
90
  ...(terminalLease ? { terminalLease } : {}),
package/src/cli/config.ts CHANGED
@@ -24,6 +24,10 @@ function renderText(cwd: string): string {
24
24
 
25
25
  out.push("Settings (only keys a layer set; everything else is built-in):");
26
26
  if (graph.settings.length === 0) out.push(" (none; all built-in defaults)");
27
+ // An ignored layer explains a value better than the value does. Left to the
28
+ // trailing Issues block, an untrusted project file read as a setting that
29
+ // silently failed to apply.
30
+ for (const issue of graph.issues) if (issue.startsWith("settings ")) out.push(` ! ${issue}`);
27
31
  for (const entry of graph.settings) {
28
32
  out.push(` ${entry.key} = ${JSON.stringify(entry.value)} [${entry.source}]`);
29
33
  }
package/src/cli/docs.ts CHANGED
@@ -1,354 +1,91 @@
1
- import { spawn } from "node:child_process";
2
- import { createReadStream, readdirSync, realpathSync, statSync } from "node:fs";
3
- import { createServer, type IncomingMessage, type Server, type ServerResponse } from "node:http";
4
- import type { AddressInfo } from "node:net";
5
- import { relative, resolve } from "node:path";
6
- import chalk from "chalk";
1
+ import { readdirSync } from "node:fs";
2
+ import { basename, join } from "node:path";
7
3
  import { resolvePackageRoot } from "../core/package-root.js";
8
- import { printError, printHeader } from "./argv.js";
9
-
10
- // Human-facing viewer over the source-checkout HTML blueprints. It binds an ephemeral
11
- // static file server to 127.0.0.1 only, serves docs/html/index.html as the
12
- // menu plus the blueprint pages, prints the URL, and runs until SIGINT. It
13
- // uses only Node's built-in http and fs: zero new dependencies, no daemon, no
14
- // persisted state, no telemetry, and no external network. The static-path
15
- // resolution and the menu synthesis are pure functions so they unit-test
16
- // without binding a port.
17
-
18
- const HOST = "127.0.0.1";
4
+ import { printError } from "./argv.js";
5
+ import { runWebCommand } from "./web.js";
19
6
 
20
7
  const HELP = `clio-coder docs [topic] [--no-open]
21
8
 
22
- Serve Clio Coder's interactive HTML documentation locally and open it in a
23
- browser. The blueprints live in docs/html of a source checkout; the npm package
24
- ships the categorized Markdown reference tree under docs/ and excludes HTML.
25
- The server binds an ephemeral port on
26
- 127.0.0.1, keeps no state, runs no daemon, and reaches no external network.
27
- Press Ctrl+C to stop it.
9
+ Open the documentation in the Clio Coder web app. Pages, navigation and outlines
10
+ are rendered from the same Markdown reference shipped with Clio.
28
11
 
29
12
  Arguments:
30
- [topic] deep-link a specific blueprint (for example: safety, configuration,
31
- tools). Omit to open the documentation menu.
13
+ [topic] a topic such as safety, configuration, or fleet_dispatch, or a
14
+ document path such as architecture/safety-model.md.
15
+ Omit to open the documentation map.
32
16
 
33
17
  Flags:
34
- --no-open do not launch a browser; just print the URL.
18
+ --no-open print the private launch link without opening a browser.
35
19
  --help, -h this message.
36
- `;
37
-
38
- const CONTENT_TYPES: Readonly<Record<string, string>> = {
39
- ".html": "text/html; charset=utf-8",
40
- ".htm": "text/html; charset=utf-8",
41
- ".css": "text/css; charset=utf-8",
42
- ".js": "text/javascript; charset=utf-8",
43
- ".mjs": "text/javascript; charset=utf-8",
44
- ".json": "application/json; charset=utf-8",
45
- ".svg": "image/svg+xml",
46
- ".png": "image/png",
47
- ".webp": "image/webp",
48
- ".jpg": "image/jpeg",
49
- ".jpeg": "image/jpeg",
50
- ".gif": "image/gif",
51
- ".ico": "image/x-icon",
52
- ".woff": "font/woff",
53
- ".woff2": "font/woff2",
54
- ".ttf": "font/ttf",
55
- ".map": "application/json; charset=utf-8",
56
- ".txt": "text/plain; charset=utf-8",
57
- };
58
-
59
- export interface DocsMenuEntry {
60
- /** Short deep-link key, for example `safety`. */
61
- topic: string;
62
- /** Real on-disk file name, for example `safety_blueprint.html`. */
63
- file: string;
64
- /** Human label, for example `Safety`. */
65
- label: string;
66
- }
67
-
68
- /** Resolve the source-checkout HTML root. The npm package deliberately excludes it. */
69
- function resolveDocsHtmlDir(): string {
70
- return resolve(resolvePackageRoot(), "docs", "html");
71
- }
72
20
 
73
- /** Content-type for a file path by extension. Pure. Defaults to octet-stream. */
74
- function contentTypeFor(filePath: string): string {
75
- const dot = filePath.lastIndexOf(".");
76
- if (dot === -1) return "application/octet-stream";
77
- return CONTENT_TYPES[filePath.slice(dot).toLowerCase()] ?? "application/octet-stream";
78
- }
79
-
80
- /**
81
- * Map a request URL to a safe relative path under the html root. Pure: no disk
82
- * access. Strips the query and fragment, decodes percent-escapes, defaults `/`
83
- * to `index.html`, and rejects any traversal segment so a request can never
84
- * escape the served directory.
85
- */
86
- function resolveRequestPath(rawUrl: string): { ok: true; relative: string } | { ok: false; reason: string } {
87
- const pathPart = (rawUrl.split(/[?#]/, 1)[0] ?? "").trim();
88
- let decoded: string;
89
- try {
90
- decoded = decodeURIComponent(pathPart);
91
- } catch {
92
- return { ok: false, reason: "bad-request" };
93
- }
94
- if (decoded.includes("\0")) return { ok: false, reason: "forbidden" };
95
- const segments = decoded.split(/[/\\]/).filter((segment) => segment.length > 0 && segment !== ".");
96
- if (segments.length === 0) return { ok: true, relative: "index.html" };
97
- for (const segment of segments) {
98
- if (segment === "..") return { ok: false, reason: "forbidden" };
99
- }
100
- return { ok: true, relative: segments.join("/") };
101
- }
102
-
103
- function titleize(topic: string): string {
104
- return topic
105
- .split(/[-_]+/)
106
- .filter((word) => word.length > 0)
107
- .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
108
- .join(" ");
109
- }
110
-
111
- /**
112
- * Synthesize the deep-linkable topic menu from a directory listing. Pure: takes
113
- * the file-name list, not the directory. `index.html` is the menu itself and is
114
- * excluded; a trailing `_blueprint` is stripped from the topic key.
115
- */
116
- function synthesizeMenu(fileNames: ReadonlyArray<string>): DocsMenuEntry[] {
117
- const entries: DocsMenuEntry[] = [];
118
- for (const name of fileNames) {
119
- if (!name.toLowerCase().endsWith(".html")) continue;
120
- if (name.toLowerCase() === "index.html") continue;
121
- const topic = name.replace(/\.html$/i, "").replace(/_blueprint$/i, "");
122
- entries.push({ topic, file: name, label: titleize(topic) });
123
- }
124
- entries.sort((a, b) => a.topic.localeCompare(b.topic));
125
- return entries;
126
- }
127
-
128
- /**
129
- * Resolve a user-supplied `[topic]` to a real file name. Pure. Accepts the bare
130
- * topic (`safety`), the blueprint file stem (`safety_blueprint`), or a full
131
- * `.html` name, case-insensitively. Returns null when nothing matches.
132
- */
133
- function topicToFile(topic: string, fileNames: ReadonlyArray<string>): string | null {
134
- const wanted = topic
135
- .trim()
136
- .toLowerCase()
137
- .replace(/\.html$/i, "");
138
- if (wanted.length === 0) return null;
139
- for (const candidate of [`${wanted}.html`, `${wanted}_blueprint.html`]) {
140
- const match = fileNames.find((name) => name.toLowerCase() === candidate);
141
- if (match) return match;
142
- }
143
- const hit = synthesizeMenu(fileNames).find((entry) => entry.topic.toLowerCase() === wanted);
144
- return hit ? hit.file : null;
145
- }
146
-
147
- function isWithin(child: string, parent: string): boolean {
148
- const rel = relative(parent, child);
149
- return rel === "" || (!rel.startsWith("..") && !rel.startsWith(`..${"/"}`) && !/^([A-Za-z]:)?[/\\]/.test(rel));
150
- }
151
-
152
- function listHtmlFiles(htmlDir: string): string[] {
153
- try {
154
- return readdirSync(htmlDir)
155
- .filter((name) => name.toLowerCase().endsWith(".html"))
156
- .sort((a, b) => a.localeCompare(b));
157
- } catch {
158
- return [];
159
- }
160
- }
21
+ Reuses your installed background app when available. Otherwise starts a local
22
+ foreground web server on 127.0.0.1; press Ctrl+C to stop it. No background service
23
+ is installed by this command. Your current directory does not affect the docs.
24
+ `;
161
25
 
162
- /** Build the static request handler for one html root. */
163
- export function createDocsRequestHandler(htmlDir: string): (req: IncomingMessage, res: ServerResponse) => void {
164
- const root = realpathSync(resolve(htmlDir));
165
- return (req, res) => {
166
- if (req.method !== "GET" && req.method !== "HEAD") {
167
- res.writeHead(405, { "content-type": "text/plain; charset=utf-8", allow: "GET, HEAD" });
168
- res.end("method not allowed");
169
- return;
170
- }
171
- const resolved = resolveRequestPath(req.url ?? "/");
172
- if (!resolved.ok) {
173
- const status = resolved.reason === "forbidden" ? 403 : 400;
174
- res.writeHead(status, { "content-type": "text/plain; charset=utf-8" });
175
- res.end(resolved.reason);
176
- return;
177
- }
178
- const requestedTarget = resolve(root, resolved.relative);
179
- if (!isWithin(requestedTarget, root)) {
180
- res.writeHead(403, { "content-type": "text/plain; charset=utf-8" });
181
- res.end("forbidden");
182
- return;
183
- }
184
- let size: number | null = null;
185
- let target: string | null = null;
186
- try {
187
- target = realpathSync(requestedTarget);
188
- if (!isWithin(target, root)) {
189
- res.writeHead(403, { "content-type": "text/plain; charset=utf-8" });
190
- res.end("forbidden");
191
- return;
192
- }
193
- const stat = statSync(target);
194
- if (stat.isFile()) size = stat.size;
195
- } catch {
196
- size = null;
197
- }
198
- if (size === null || target === null) {
199
- res.writeHead(404, { "content-type": "text/plain; charset=utf-8" });
200
- res.end("not found");
201
- return;
202
- }
203
- const headers = {
204
- "content-type": contentTypeFor(target),
205
- "content-length": String(size),
206
- "cache-control": "no-store",
207
- };
208
- if (req.method === "HEAD") {
209
- res.writeHead(200, headers);
210
- res.end();
211
- return;
212
- }
213
- res.writeHead(200, headers);
214
- const stream = createReadStream(target);
215
- stream.on("error", () => {
216
- if (!res.writableEnded) res.end();
217
- });
218
- stream.pipe(res);
26
+ const key = (value: string) => value.toLowerCase().replace(/_/g, "-");
27
+ const route = (path: string) => `/docs/${path.split("/").map(encodeURIComponent).join("/")}`;
28
+
29
+ /** Resolve only catalogued destinations; ambiguous basenames require a full path. */
30
+ export function docsTopicRoute(topic: string | undefined, pages: readonly string[]): string | undefined {
31
+ if (topic === undefined) return "/docs";
32
+ if (!topic || /[\\\0?#]/.test(topic) || topic.startsWith("/") || topic.split("/").includes("..")) return;
33
+ const wanted = key(topic.replace(/^docs\//, ""));
34
+ const topics: Record<string, string> = {
35
+ safety: "architecture/safety-model.md",
36
+ configuration: "guide/configuration-and-targets.md",
37
+ trace: "architecture/trace-store.md",
219
38
  };
220
- }
221
-
222
- export interface DocsServerHandle {
223
- server: Server;
224
- url: string;
225
- port: number;
226
- close(): Promise<void>;
227
- }
228
-
229
- export interface StartDocsServerOptions {
230
- htmlDir: string;
231
- /** Bind host. Defaults to 127.0.0.1 and is never widened. */
232
- host?: string;
233
- /** Bind port. Defaults to 0 (ephemeral). */
234
- port?: number;
235
- }
236
-
237
- /** Start the viewer bound to 127.0.0.1 on an ephemeral port. */
238
- async function startDocsServer(options: StartDocsServerOptions): Promise<DocsServerHandle> {
239
- const host = options.host ?? HOST;
240
- const server = createServer(createDocsRequestHandler(options.htmlDir));
241
- await new Promise<void>((resolveListen, rejectListen) => {
242
- const onError = (err: Error): void => rejectListen(err);
243
- server.once("error", onError);
244
- server.listen(options.port ?? 0, host, () => {
245
- server.removeListener("error", onError);
246
- resolveListen();
247
- });
248
- });
249
- const address = server.address() as AddressInfo;
250
- const port = address.port;
251
- return {
252
- server,
253
- port,
254
- url: `http://${host}:${port}/`,
255
- close: () => new Promise<void>((resolveClose) => server.close(() => resolveClose())),
39
+ const preferred = topics[wanted];
40
+ if (preferred && pages.includes(preferred)) return route(preferred);
41
+ const exact = pages.find((path) => key(path) === wanted || key(path.replace(/\.md$/i, "")) === wanted);
42
+ if (exact) return route(exact);
43
+ const name = wanted.replace(/\.md$/, "");
44
+ const exactNames = pages.filter((path) => key(basename(path).replace(/\.md$/i, "")) === name);
45
+ const matches = exactNames.length
46
+ ? exactNames
47
+ : pages.filter((path) => key(basename(path).replace(/\.md$/i, "")).startsWith(`${name}-`));
48
+ const match = matches[0];
49
+ return matches.length === 1 && match ? route(match) : undefined;
50
+ }
51
+
52
+ function catalog(root: string) {
53
+ const pages: string[] = [];
54
+ const scan = (path: string) => {
55
+ for (const entry of readdirSync(join(root, path), { withFileTypes: true })) {
56
+ const name = path ? `${path}/${entry.name}` : entry.name;
57
+ if (name === "html") continue;
58
+ if (entry.isDirectory()) scan(name);
59
+ else if (entry.isFile() && /\.md$/i.test(name)) pages.push(name);
60
+ }
256
61
  };
62
+ scan("");
63
+ return pages;
257
64
  }
258
65
 
259
- function openBrowser(url: string): void {
260
- const platform = process.platform;
261
- const command = platform === "darwin" ? "open" : platform === "win32" ? "cmd" : "xdg-open";
262
- const args = platform === "win32" ? ["/c", "start", "", url] : [url];
263
- try {
264
- const child = spawn(command, args, { stdio: "ignore", detached: true });
265
- child.on("error", () => {
266
- // Best-effort: the printed URL is the fallback when no opener exists.
267
- });
268
- child.unref();
269
- } catch {
270
- // Best-effort: never fail the command because a browser could not launch.
271
- }
272
- }
273
-
274
- export function waitForShutdown(): Promise<void> {
275
- return new Promise((resolveShutdown) => {
276
- const onSignal = (): void => {
277
- process.removeListener("SIGINT", onSignal);
278
- process.removeListener("SIGTERM", onSignal);
279
- resolveShutdown();
280
- };
281
- process.once("SIGINT", onSignal);
282
- process.once("SIGTERM", onSignal);
283
- });
284
- }
285
-
286
- export async function runDocsCommand(args: ReadonlyArray<string> = []): Promise<number> {
66
+ export async function runDocsCommand(args: readonly string[] = []): Promise<number> {
287
67
  if (args.includes("--help") || args.includes("-h")) {
288
68
  process.stdout.write(HELP);
289
69
  return 0;
290
70
  }
291
- let noOpen = false;
292
- const positionals: string[] = [];
293
- for (const arg of args) {
294
- if (arg === "--no-open") {
295
- noOpen = true;
296
- continue;
297
- }
298
- if (arg.startsWith("-")) {
299
- printError(`unknown flag: ${arg}`);
300
- process.stdout.write(HELP);
301
- return 2;
302
- }
303
- positionals.push(arg);
304
- }
305
- if (positionals.length > 1) {
306
- printError("docs accepts at most one [topic]");
307
- process.stdout.write(HELP);
71
+ const positionals = args.filter((arg) => arg !== "--no-open");
72
+ const unknownFlag = positionals.find((arg) => arg.startsWith("-"));
73
+ if (unknownFlag || positionals.length > 1) {
74
+ printError(unknownFlag ? `unknown flag: ${unknownFlag}` : "docs accepts at most one [topic]");
308
75
  return 2;
309
76
  }
310
-
311
- let htmlDir: string;
312
77
  try {
313
- htmlDir = resolveDocsHtmlDir();
314
- } catch (err) {
315
- printError(`could not resolve the docs HTML root: ${err instanceof Error ? err.message : String(err)}`);
316
- return 1;
317
- }
318
- const files = listHtmlFiles(htmlDir);
319
- if (files.length === 0) {
320
- printError(`no HTML docs at ${htmlDir}`);
321
- process.stdout.write(
322
- ` the npm package ships only the categorized Markdown reference tree: ${resolve(resolvePackageRoot(), "docs")}\n` +
323
- " the interactive blueprints are in a source checkout and at https://github.com/iowarp/clio-coder/tree/main/docs/html\n",
324
- );
325
- return 1;
326
- }
327
-
328
- let landing = "index.html";
329
- const topic = positionals[0];
330
- if (topic !== undefined) {
331
- const file = topicToFile(topic, files);
332
- if (!file) {
333
- printError(`unknown docs topic: ${topic}`);
334
- const topics = synthesizeMenu(files).map((entry) => entry.topic);
335
- if (topics.length > 0) process.stdout.write(` available topics: ${topics.join(", ")}\n`);
78
+ const pages = catalog(join(resolvePackageRoot(), "docs"));
79
+ const path = docsTopicRoute(positionals[0], pages);
80
+ if (!path) {
81
+ printError(
82
+ `Unknown or ambiguous docs topic: ${positionals[0]}. Run clio-coder docs to browse the documentation map.`,
83
+ );
336
84
  return 2;
337
85
  }
338
- landing = file;
86
+ return runWebCommand(["--path", path, "--reuse-background", args.includes("--no-open") ? "--no-open" : "--open"]);
87
+ } catch (error) {
88
+ printError(error instanceof Error ? error.message : "Could not open the documentation.");
89
+ return 1;
339
90
  }
340
-
341
- const handle = await startDocsServer({ htmlDir });
342
- const landingUrl = landing === "index.html" ? handle.url : `${handle.url}${landing}`;
343
- printHeader("Clio docs viewer");
344
- process.stdout.write(` serving HTML root ${htmlDir}\n`);
345
- process.stdout.write(` open ${chalk.cyan(landingUrl)}\n`);
346
- process.stdout.write(" bound to 127.0.0.1 only: no external network, no daemon, no state.\n");
347
- process.stdout.write(" press Ctrl+C to stop.\n");
348
- if (!noOpen) openBrowser(landingUrl);
349
-
350
- await waitForShutdown();
351
- await handle.close();
352
- process.stdout.write("docs viewer stopped.\n");
353
- return 0;
354
91
  }
@@ -11,7 +11,7 @@ import { describeResolution, findPinnedTool, toolStatus } from "../domains/toolc
11
11
  *
12
12
  * Six rows, in the order an operator debugs them: what mode the pane layer
13
13
  * resolved to, whether the socket answered, whether the server is new enough
14
- * for the methods phase 3 uses, where the pane host binary resolves, what the
14
+ * for the notification and pane-control methods, where the pane host binary resolves, what the
15
15
  * boot layout composes, and whether the journal directory the viewer reads is
16
16
  * writable.
17
17
  *
package/src/cli/doctor.ts CHANGED
@@ -20,6 +20,8 @@ const HELP = `clio-coder doctor [--fix] [--json]
20
20
  Diagnose Clio Coder state without creating files. On a home Clio has never
21
21
  written to, doctor says so in one row and exits 0. Use --fix to repair structure:
22
22
  missing directories, missing template files, and credential permissions.
23
+ --fix also records the fleet preflight, which is what admits an SSH node to
24
+ dispatch for the current project root; plain doctor only reports it.
23
25
  Settings are validated directly against the current schema.
24
26
  Pass --json to emit a machine-readable report on stdout.
25
27
  `;
@@ -63,7 +65,7 @@ export async function runDoctorCommand(args: ReadonlyArray<string> = []): Promis
63
65
  const interopChecks = untouched ? [] : await runDoctorInteropChecks();
64
66
  // Fleet preflight probes each configured node over SSH and persists the
65
67
  // per-node eligibility verdicts dispatch placement enforces.
66
- const fleetChecks = untouched ? [] : await runDoctorFleetChecks();
68
+ const fleetChecks = untouched ? [] : await runDoctorFleetChecks(process.cwd(), { fix });
67
69
  // Resolution reads PATH and the vendor root and creates nothing, but on an
68
70
  // untouched home there is no vendor root to look at and the answer would be
69
71
  // "none" for every row regardless, so the sweep stays with the others.