@iowarp/clio-coder 0.4.3 → 0.4.5

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 (670) hide show
  1. package/CHANGELOG.md +153 -0
  2. package/CONTRIBUTING.md +25 -15
  3. package/README.md +340 -27
  4. package/dist/{acp-H2NGRPWO.js → acp-H3CU2HBQ.js} +25 -25
  5. package/dist/{agents-TL5LLUQP.js → agents-IXQQZ7BD.js} +77 -75
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-E5SW4HMS.js → auth-R7KYF7N3.js} +38 -39
  8. package/dist/builtins-CRFDQUVP.js +22 -0
  9. package/dist/{chunk-7DRAWPTZ.js → chunk-22PQ4TX4.js} +4 -4
  10. package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
  11. package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
  12. package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
  13. package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
  14. package/dist/{chunk-5TSRNF4G.js → chunk-3T4DXWP6.js} +170 -12
  15. package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
  16. package/dist/{chunk-XIVNBFZS.js → chunk-4SVIVOMC.js} +208 -39
  17. package/dist/{chunk-NMJXSHBJ.js → chunk-5A6XR3RJ.js} +44 -19
  18. package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
  19. package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
  20. package/dist/chunk-5DDOTTG4.js +402 -0
  21. package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
  22. package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
  23. package/dist/{chunk-PUVDKJ2Y.js → chunk-5VTJP36Q.js} +5 -7
  24. package/dist/{chunk-JGRC33J2.js → chunk-5ZMXGW7P.js} +90 -9
  25. package/dist/chunk-5ZSZEYJK.js +119 -0
  26. package/dist/chunk-633EXGZA.js +44 -0
  27. package/dist/{chunk-IWT4SF4R.js → chunk-6CDNRHWH.js} +361 -89
  28. package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
  29. package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
  30. package/dist/{chunk-INY6HTFL.js → chunk-6SYEGZI3.js} +12 -12
  31. package/dist/{chunk-SKHCAU7K.js → chunk-6YA46L5A.js} +5 -4
  32. package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
  33. package/dist/{chunk-L47TF46W.js → chunk-7HBHHVCK.js} +24 -3
  34. package/dist/{chunk-DWUOQKRU.js → chunk-7TKWWPD7.js} +5 -4
  35. package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
  36. package/dist/chunk-7WUZEB2M.js +165 -0
  37. package/dist/{chunk-6PTFB5VS.js → chunk-7YJWEF2L.js} +59 -28
  38. package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
  39. package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
  40. package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
  41. package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
  42. package/dist/chunk-B6UM3OZC.js +15 -0
  43. package/dist/{chunk-MCEPRMZW.js → chunk-BBV5TKE6.js} +5 -5
  44. package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
  45. package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
  46. package/dist/{chunk-42FMPA75.js → chunk-CBSKDFWL.js} +3 -3
  47. package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
  48. package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
  49. package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
  50. package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
  51. package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
  52. package/dist/{chunk-WCXUNS7U.js → chunk-DIMRLNIC.js} +35 -66
  53. package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
  54. package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
  55. package/dist/{chunk-2UG5F4C5.js → chunk-DRD2A54W.js} +116 -52
  56. package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
  57. package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
  58. package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
  59. package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
  60. package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
  61. package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
  62. package/dist/chunk-ECOMVOHP.js +139 -0
  63. package/dist/chunk-EFSEIZE6.js +56 -0
  64. package/dist/{chunk-IJNZMHLA.js → chunk-EHCPSZJF.js} +4 -4
  65. package/dist/{chunk-K6BSR66V.js → chunk-EHOSNVVM.js} +6 -2
  66. package/dist/{chunk-RRNP2ANY.js → chunk-EQEJJ53P.js} +10 -10
  67. package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
  68. package/dist/{chunk-JKKCYP3C.js → chunk-F34AR6O3.js} +21 -15
  69. package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
  70. package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
  71. package/dist/{chunk-MWUZBSAQ.js → chunk-FSTIBAGM.js} +358 -63
  72. package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
  73. package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
  74. package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
  75. package/dist/{chunk-JSC3U7TI.js → chunk-GJ24ODAX.js} +5 -5
  76. package/dist/{chunk-B4VEBZKF.js → chunk-GNQRWTMY.js} +139 -52
  77. package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
  78. package/dist/chunk-GXCCHKN6.js +59 -0
  79. package/dist/{chunk-V2ANDPVT.js → chunk-HGSLRG33.js} +170 -8
  80. package/dist/{chunk-LLDJM5XK.js → chunk-HHVJNVUJ.js} +6 -6
  81. package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
  82. package/dist/{chunk-VA5FNYMT.js → chunk-HR3HPQ76.js} +42 -5
  83. package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
  84. package/dist/{chunk-OML5D5V5.js → chunk-I7VLWRK2.js} +8 -8
  85. package/dist/{chunk-VW6DOEDG.js → chunk-ICO4TQ2F.js} +16 -5
  86. package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
  87. package/dist/{chunk-WBKFA554.js → chunk-ILJ7DWGE.js} +9 -9
  88. package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
  89. package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
  90. package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
  91. package/dist/{chunk-EKCHAPYA.js → chunk-K2HL3GBL.js} +4 -4
  92. package/dist/{chunk-N2Z7HLVY.js → chunk-K6RDB7IA.js} +28 -28
  93. package/dist/{chunk-TM6LQDI3.js → chunk-KDWLXVMN.js} +85 -335
  94. package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
  95. package/dist/{chunk-RSJ25QSL.js → chunk-KF6GFW6O.js} +217 -50
  96. package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
  97. package/dist/chunk-KPRLAMP4.js +32 -0
  98. package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
  99. package/dist/{chunk-IUE3Y34X.js → chunk-KTFSFCVN.js} +20 -9
  100. package/dist/{chunk-7E7I3WLS.js → chunk-KYKNBD4Y.js} +36 -34
  101. package/dist/chunk-L4N3DWNW.js +539 -0
  102. package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
  103. package/dist/{chunk-JIEGK6UF.js → chunk-LTR5QCLS.js} +51 -7
  104. package/dist/chunk-LUL5Z66S.js +221 -0
  105. package/dist/chunk-LVFANMOH.js +466 -0
  106. package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
  107. package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
  108. package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
  109. package/dist/{chunk-I7ZPNEJM.js → chunk-M6TAYK66.js} +8 -8
  110. package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
  111. package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
  112. package/dist/chunk-MDU3C27C.js +674 -0
  113. package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
  114. package/dist/{chunk-4UVU7BJ5.js → chunk-NC4KV7EL.js} +6 -6
  115. package/dist/{chunk-JEQ3XTHC.js → chunk-NF3BK5WR.js} +5 -5
  116. package/dist/chunk-NTK3WTHM.js +141 -0
  117. package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
  118. package/dist/{chunk-UPZU6GE4.js → chunk-NY6IWDVU.js} +6 -6
  119. package/dist/chunk-O2RQ7LCK.js +283 -0
  120. package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
  121. package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
  122. package/dist/{chunk-WRBAGUNF.js → chunk-ODUTYZIU.js} +5 -5
  123. package/dist/{chunk-E3TPLWFX.js → chunk-ONRTXOZY.js} +4 -4
  124. package/dist/{chunk-B4OAX3SI.js → chunk-OQM5IVJY.js} +118 -225
  125. package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
  126. package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
  127. package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
  128. package/dist/{chunk-64I3JVYM.js → chunk-PWWSIB2A.js} +5 -5
  129. package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
  130. package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
  131. package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
  132. package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
  133. package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
  134. package/dist/chunk-R6MAYTMS.js +108 -0
  135. package/dist/{chunk-MUW2BDDH.js → chunk-R6MICQYU.js} +6 -6
  136. package/dist/{chunk-JDAY6FIL.js → chunk-RLTT5GVY.js} +132 -17
  137. package/dist/{chunk-ZWPRK62N.js → chunk-RXIOCVBZ.js} +24 -6
  138. package/dist/{chunk-NIQJ66N4.js → chunk-S32UQ5GL.js} +62 -35
  139. package/dist/{chunk-AX2THNSA.js → chunk-SBZX6ARC.js} +12 -12
  140. package/dist/{chunk-TXOTCRLG.js → chunk-SD7SHNDW.js} +2 -2
  141. package/dist/{chunk-AF4YM7Z4.js → chunk-SDWNDICN.js} +10284 -3756
  142. package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
  143. package/dist/chunk-SL2RDHKO.js +19 -0
  144. package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
  145. package/dist/{chunk-KKOJXO6R.js → chunk-SRZOW5L2.js} +46 -14
  146. package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
  147. package/dist/chunk-T52TPHYC.js +318 -0
  148. package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
  149. package/dist/{chunk-LDJG7DW3.js → chunk-T7FDXNRU.js} +13 -13
  150. package/dist/{chunk-XPWWI35G.js → chunk-TEG3RYVZ.js} +59 -41
  151. package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
  152. package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
  153. package/dist/{chunk-PAJQJ7BS.js → chunk-TZ7MFRG4.js} +1263 -835
  154. package/dist/{chunk-GI7YYQ3F.js → chunk-U2JOLB7O.js} +415 -83
  155. package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
  156. package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
  157. package/dist/{chunk-CE5AX47J.js → chunk-U7H5WRG5.js} +5 -5
  158. package/dist/{chunk-G76U63X4.js → chunk-U7VQ4NI4.js} +22 -22
  159. package/dist/{chunk-7ZYNNDKC.js → chunk-UFYNOQK4.js} +7 -7
  160. package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
  161. package/dist/{chunk-QWGDJJYJ.js → chunk-UL36QJX6.js} +14 -14
  162. package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
  163. package/dist/{chunk-HEQY7ZFI.js → chunk-URBGEOH3.js} +5 -5
  164. package/dist/chunk-USZA7GWL.js +341 -0
  165. package/dist/{chunk-W6RRQCPQ.js → chunk-UTUNT5QL.js} +48 -579
  166. package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
  167. package/dist/{chunk-F5JHEYZM.js → chunk-UXAC2FX4.js} +73 -41
  168. package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
  169. package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
  170. package/dist/chunk-VLPTKCKT.js +396 -0
  171. package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
  172. package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
  173. package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
  174. package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
  175. package/dist/{chunk-2UH2KFUP.js → chunk-WFKDPU7U.js} +4 -4
  176. package/dist/{chunk-ZDN3Y73Y.js → chunk-WJIMKGD6.js} +9 -51
  177. package/dist/{chunk-YQWYVTMC.js → chunk-WLMSOT73.js} +59 -12
  178. package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
  179. package/dist/chunk-WXA2CFJO.js +23 -0
  180. package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
  181. package/dist/{chunk-2APPQIER.js → chunk-XXBQKW32.js} +11 -11
  182. package/dist/{chunk-2VIKGWFZ.js → chunk-YEJIG7LN.js} +332 -332
  183. package/dist/chunk-YGDMBK7O.js +567 -0
  184. package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
  185. package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
  186. package/dist/{chunk-54CBCGIR.js → chunk-ZMZQEBKI.js} +136 -81
  187. package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
  188. package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
  189. package/dist/cli/index.js +45 -44
  190. package/dist/clio-5I2IBFYL.js +26 -0
  191. package/dist/{code-nav-MDZNQS33.js → code-nav-YXIAEZVS.js} +48 -32
  192. package/dist/codewiki/build-worker.js +76 -29
  193. package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
  194. package/dist/{components-UCUQ4QXW.js → components-TNIKXCBH.js} +13 -14
  195. package/dist/{config-SVM5P5YI.js → config-Y2JDJ3JJ.js} +210 -119
  196. package/dist/configure-SML6UBZ5.js +55 -0
  197. package/dist/{context-2OHRKS42.js → context-P5YSEO55.js} +125 -115
  198. package/dist/{context-VNCR7KAG.js → context-QQ53HSGJ.js} +91 -62
  199. package/dist/{context-E3VC7RX5.js → context-S2EEC3EJ.js} +62 -31
  200. package/dist/context-clear-TMEQCOTH.js +183 -0
  201. package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
  202. package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
  203. package/dist/{context-working-set-VDS25HXZ.js → context-working-set-CNLSQN5K.js} +31 -31
  204. package/dist/detail-5572VLBO.js +114 -0
  205. package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-FRHD6P2O.js} +214 -126
  206. package/dist/{docs-PD3EXDKU.js → docs-BL7ROUFN.js} +5 -7
  207. package/dist/{doctor-WNNVO6FY.js → doctor-N3LCM2LG.js} +89 -66
  208. package/dist/{eval-7G7SGAYO.js → eval-BUU3ZOUZ.js} +493 -197
  209. package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
  210. package/dist/evidence-DTGEN456.js +224 -0
  211. package/dist/{evidence-VD6736FQ.js → evidence-SQ5DNFEN.js} +114 -195
  212. package/dist/{evolve-AL3NGVRL.js → evolve-IJNUFZDS.js} +107 -88
  213. package/dist/{extensions-MOVJ32NM.js → extensions-YVRHX6ZI.js} +16 -17
  214. package/dist/{fleet-QZHUMAGI.js → fleet-ZNNVSYFO.js} +147 -141
  215. package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-5YE7NPJL.js} +27 -23
  216. package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-3SBSCTCW.js} +16 -15
  217. package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-6HHPWF5T.js} +39 -38
  218. package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-JEYMGCGC.js} +107 -87
  219. package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
  220. package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-QRSHIIDE.js} +10 -10
  221. package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-4PM4GDDL.js} +46 -42
  222. package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-NJDTHTO3.js} +105 -85
  223. package/dist/fleet-view-UP2BWQQY.js +117 -0
  224. package/dist/{init-J477LKZH.js → init-S3GZQ5ZF.js} +123 -117
  225. package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
  226. package/dist/{interop-3FCM6XLG.js → interop-YOTGXFJM.js} +25 -26
  227. package/dist/inventory-K2OZ36YJ.js +117 -0
  228. package/dist/{library-QUQEIUG6.js → library-GJI6W6OK.js} +45 -45
  229. package/dist/{memory-SGGSEP65.js → memory-OQOXQGYD.js} +107 -90
  230. package/dist/{models-HEKUAXXK.js → models-3IK2Y5WE.js} +64 -65
  231. package/dist/{monitor-HKU57TYQ.js → monitor-FTJLTKCQ.js} +136 -101
  232. package/dist/{orchestrator-VDFAEFAI.js → orchestrator-N47O7SFD.js} +1442 -1671
  233. package/dist/{panes-DN2SSFOH.js → panes-7BTYH3XQ.js} +8 -8
  234. package/dist/{panes-TALGNPZT.js → panes-WPOMEMRH.js} +22 -23
  235. package/dist/{paths-NBMFAIEZ.js → paths-J3KN7UAO.js} +12 -13
  236. package/dist/preload-65U34NG6.js +115 -0
  237. package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
  238. package/dist/{reset-EAJFFJVB.js → reset-MUVQDLNL.js} +20 -21
  239. package/dist/{resources-OVKSEFVE.js → resources-LM76COAO.js} +41 -40
  240. package/dist/{run-7DP7ZF2J.js → run-3VFZQ33N.js} +168 -166
  241. package/dist/{share-WML67FT3.js → share-4JUB4BL7.js} +43 -43
  242. package/dist/{skills-SG662R2K.js → skills-S36AAJHU.js} +47 -47
  243. package/dist/{skills-eval-VVZEUU46.js → skills-eval-G6T57L7M.js} +127 -104
  244. package/dist/{skills-inventory-I2E23GET.js → skills-inventory-WLM46PJH.js} +41 -40
  245. package/dist/slash-commands-GBARG3Y7.js +91 -0
  246. package/dist/{steer-2LQOMCPB.js → steer-S7D7IKPU.js} +7 -7
  247. package/dist/{support-CC2UJBJ6.js → support-5VAEC32W.js} +14 -14
  248. package/dist/{targets-4QC3HIEW.js → targets-N5REUETU.js} +147 -98
  249. package/dist/tasks-6BVY5YZF.js +36 -0
  250. package/dist/{terminal-lease-TUHIJ6Y2.js → terminal-lease-57UEOJKS.js} +12 -11
  251. package/dist/tools-6OCQ6SVB.js +28 -0
  252. package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
  253. package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
  254. package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
  255. package/dist/{uninstall-5PEVOE5B.js → uninstall-FXYMFFRT.js} +19 -20
  256. package/dist/{upgrade-M4WXY6KN.js → upgrade-4HD5HAIV.js} +49 -45
  257. package/dist/{usage-N7ZNVLEM.js → usage-4GWM2WWP.js} +143 -103
  258. package/dist/{verifiers-DJTP4XX6.js → verifiers-GSKWKWVG.js} +162 -28
  259. package/dist/verify-3AS3ULCY.js +30 -0
  260. package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
  261. package/dist/{web-fetch-MPARV2K7.js → web-fetch-MQN4FH3X.js} +169 -18
  262. package/dist/wiki-generate-7BV7XWIY.js +614 -0
  263. package/dist/{with-panes-4GCGSL7J.js → with-panes-OFTNAR4Y.js} +34 -20
  264. package/dist/worker/entry.js +99 -85
  265. package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
  266. package/docs/README.md +10 -8
  267. package/docs/architecture/acp.md +27 -0
  268. package/docs/architecture/architecture.md +5 -5
  269. package/docs/architecture/artifact-versions.md +1 -1
  270. package/docs/architecture/context-engine.md +44 -59
  271. package/docs/architecture/context-working-set.md +7 -9
  272. package/docs/architecture/dispatch-architecture-rationale.md +1 -1
  273. package/docs/architecture/dispatch-typed-intent.md +1 -1
  274. package/docs/architecture/evidence-and-memory.md +11 -1
  275. package/docs/architecture/observability.md +7 -1
  276. package/docs/architecture/pi-boundary.md +37 -7
  277. package/docs/architecture/prompt-envelope-and-tools.md +22 -12
  278. package/docs/architecture/safety-model.md +10 -17
  279. package/docs/architecture/session-lifecycle.md +4 -4
  280. package/docs/architecture/tui-design.md +1 -1
  281. package/docs/architecture/worker-dispatch-mechanics.md +4 -0
  282. package/docs/guide/built-in-agents.md +8 -8
  283. package/docs/guide/commands-and-modes.md +66 -38
  284. package/docs/guide/configuration-and-targets.md +10 -3
  285. package/docs/guide/configuration-reference.md +23 -8
  286. package/docs/guide/environment-variables.md +8 -4
  287. package/docs/guide/fleet-dispatch.md +12 -0
  288. package/docs/guide/installation-and-lifecycle.md +35 -9
  289. package/docs/guide/proactive-memory.md +1 -1
  290. package/docs/guide/skills-marketplace.md +11 -3
  291. package/docs/guide/tool-usage.md +87 -5
  292. package/docs/history/config-knobs-audit.md +2 -2
  293. package/docs/process/development-pipeline.md +15 -10
  294. package/docs/process/documentation-guide.md +2 -2
  295. package/docs/process/eval-runner.md +15 -0
  296. package/docs/process/evals-internal.md +1 -1
  297. package/docs/process/git-commit-provenance.md +15 -0
  298. package/docs/process/release-cut-checklist.md +207 -0
  299. package/docs/process/scientific-validation.md +18 -17
  300. package/evals/README.md +4 -0
  301. package/evals/behavioral-corpus-grader.mjs +147 -14
  302. package/evals/behavioral-machinery-support.ts +1 -0
  303. package/evals/behavioral-machinery.yaml +1 -1
  304. package/evals/behavioral-model-negative-control.yaml +1 -0
  305. package/evals/behavioral-model.yaml +266 -1
  306. package/evals/fixtures/docs-retrieval.json +102 -0
  307. package/evals/fixtures/scalar-decision.json +17 -0
  308. package/evals/fixtures/scout-citation-pipeline.json +55 -0
  309. package/evals/fixtures/source-explanation.json +74 -0
  310. package/evals/fixtures/tool-arguments.json +18 -0
  311. package/evals/fixtures/tool-surface/read.txt +4 -0
  312. package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
  313. package/evals/no-edit-memory-grader.mjs +149 -0
  314. package/evals/scalar-decision-grader.py +41 -0
  315. package/evals/scalar-decision-machinery.ts +145 -0
  316. package/evals/source-explanation-grader.mjs +118 -0
  317. package/evals/tool-surface-grader.mjs +53 -0
  318. package/evals/tool-surface-model.yaml +274 -0
  319. package/package.json +14 -14
  320. package/skills/README.md +6 -6
  321. package/skills/coding/coding-standards/SKILL.md +14 -4
  322. package/skills/context/context-handoff/SKILL.md +3 -3
  323. package/skills/context/context-prime/SKILL.md +3 -3
  324. package/skills/planning/architecture/SKILL.md +5 -5
  325. package/skills/planning/backlog/SKILL.md +4 -4
  326. package/skills/planning/prd/SKILL.md +4 -3
  327. package/skills/planning/product-intent/SKILL.md +8 -8
  328. package/skills/planning/tech-spec/SKILL.md +4 -4
  329. package/skills/registry.yaml +33 -33
  330. package/skills/research/arxiv-literature/SKILL.md +3 -3
  331. package/skills/research/experiment-protocol/SKILL.md +3 -3
  332. package/skills/research/scientific-debugging/SKILL.md +3 -2
  333. package/skills/research/scientific-modernization/SKILL.md +3 -3
  334. package/skills/skill-marketplace.json +17 -17
  335. package/skills/workflow/cut-it/SKILL.md +3 -4
  336. package/skills/workflow/design-council/SKILL.md +5 -10
  337. package/skills/workflow/grill-me/SKILL.md +14 -15
  338. package/skills/workflow/workflow-distiller/SKILL.md +4 -4
  339. package/src/cli/args.ts +0 -8
  340. package/src/cli/bootstrap-generate.ts +6 -0
  341. package/src/cli/config-inspect.ts +24 -7
  342. package/src/cli/config-trust.ts +62 -0
  343. package/src/cli/config.ts +8 -0
  344. package/src/cli/configure.ts +2 -1
  345. package/src/cli/context-map.ts +75 -14
  346. package/src/cli/context.ts +46 -17
  347. package/src/cli/doctor-state-size.ts +1 -12
  348. package/src/cli/doctor-validation-contract.ts +28 -0
  349. package/src/cli/doctor.ts +5 -0
  350. package/src/cli/eval.ts +17 -3
  351. package/src/cli/evidence-detail.ts +1 -75
  352. package/src/cli/evidence-inventory.ts +1 -167
  353. package/src/cli/index.ts +2 -0
  354. package/src/cli/modes/print.ts +32 -4
  355. package/src/cli/run.ts +16 -16
  356. package/src/cli/skills-eval.ts +10 -8
  357. package/src/cli/steer-channel.ts +31 -18
  358. package/src/cli/targets.ts +84 -32
  359. package/src/cli/tasks.ts +93 -0
  360. package/src/cli/upgrade.ts +19 -11
  361. package/src/cli/usage.ts +30 -0
  362. package/src/cli/verifiers.ts +147 -1
  363. package/src/cli/wiki-generate.ts +240 -96
  364. package/src/core/bash-exec.ts +43 -15
  365. package/src/core/bus-events.ts +15 -0
  366. package/src/core/commit-attribution.ts +41 -1
  367. package/src/core/config.ts +33 -14
  368. package/src/core/defaults.ts +5 -4
  369. package/src/core/file-references.ts +11 -1
  370. package/src/core/git-commit-attribution.ts +46 -3
  371. package/src/core/incomplete-installation.ts +3 -1
  372. package/src/core/run-overrides.ts +0 -5
  373. package/src/core/settings-layers.ts +21 -5
  374. package/src/core/skill-activation.ts +3 -0
  375. package/src/core/termination.ts +26 -9
  376. package/src/core/tool-names.ts +5 -2
  377. package/src/core/untrusted-content.ts +16 -0
  378. package/src/core/workspace-trust.ts +179 -0
  379. package/src/domains/agents/builtins/architect.md +1 -1
  380. package/src/domains/agents/builtins/coder.md +5 -3
  381. package/src/domains/agents/builtins/context-bootstrap.md +3 -1
  382. package/src/domains/agents/builtins/documenter.md +8 -5
  383. package/src/domains/agents/builtins/git-master.md +1 -1
  384. package/src/domains/agents/builtins/provenance.md +7 -7
  385. package/src/domains/agents/builtins/researcher.md +1 -0
  386. package/src/domains/agents/builtins/scout.md +7 -1
  387. package/src/domains/agents/builtins/tester.md +1 -1
  388. package/src/domains/agents/builtins/verifier.md +2 -2
  389. package/src/domains/agents/builtins/wiki-writer.md +4 -3
  390. package/src/domains/agents/result-contract.ts +199 -26
  391. package/src/domains/context/bootstrap-prompt.ts +11 -9
  392. package/src/domains/context/bootstrap.ts +74 -39
  393. package/src/domains/context/clio-md.ts +88 -26
  394. package/src/domains/context/codewiki/build-operation.ts +121 -0
  395. package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
  396. package/src/domains/context/codewiki/build-worker.ts +3 -35
  397. package/src/domains/context/codewiki/coordinator.ts +36 -6
  398. package/src/domains/context/codewiki/indexer.ts +59 -19
  399. package/src/domains/context/contract.ts +6 -2
  400. package/src/domains/context/extension.ts +97 -11
  401. package/src/domains/context/fingerprint.ts +39 -34
  402. package/src/domains/context/index.ts +7 -1
  403. package/src/domains/context/prompt-context.ts +55 -14
  404. package/src/domains/context/refresh.ts +12 -57
  405. package/src/domains/context/wiki/assemble.ts +14 -10
  406. package/src/domains/context/wiki/evidence.ts +209 -0
  407. package/src/domains/context/wiki/frontmatter.ts +5 -2
  408. package/src/domains/context/wiki/generate.ts +207 -67
  409. package/src/domains/context/wiki/meta.ts +10 -2
  410. package/src/domains/context/wiki/plan-store.ts +70 -14
  411. package/src/domains/context/wiki/plan.ts +71 -14
  412. package/src/domains/context/wiki/prompts.ts +85 -1
  413. package/src/domains/context/wiki/source-content.ts +106 -0
  414. package/src/domains/context/wiki/staleness.ts +33 -22
  415. package/src/domains/context/working-set/contract.ts +8 -2
  416. package/src/domains/context/working-set/engine.ts +17 -4
  417. package/src/domains/context/working-set/fold.ts +15 -2
  418. package/src/domains/context/working-set/marker.ts +2 -1
  419. package/src/domains/context/working-set/project.ts +18 -7
  420. package/src/domains/context/working-set/recall.ts +82 -56
  421. package/src/domains/dispatch/active-route-planner.ts +10 -3
  422. package/src/domains/dispatch/admission-queue.ts +19 -7
  423. package/src/domains/dispatch/admission.ts +3 -3
  424. package/src/domains/dispatch/budget-envelope.ts +47 -82
  425. package/src/domains/dispatch/capacity-lease.ts +57 -19
  426. package/src/domains/dispatch/code-step.ts +11 -4
  427. package/src/domains/dispatch/contract.ts +41 -9
  428. package/src/domains/dispatch/event-pump.ts +28 -7
  429. package/src/domains/dispatch/execution-role.ts +49 -2
  430. package/src/domains/dispatch/execution-scheduler.ts +4 -0
  431. package/src/domains/dispatch/extension.ts +240 -132
  432. package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
  433. package/src/domains/dispatch/fleet-run.ts +21 -0
  434. package/src/domains/dispatch/gate-role-prompts.ts +4 -2
  435. package/src/domains/dispatch/host-verification.ts +114 -13
  436. package/src/domains/dispatch/intent.ts +28 -18
  437. package/src/domains/dispatch/orphan-recovery.ts +2 -0
  438. package/src/domains/dispatch/parallel-writers.ts +34 -0
  439. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  440. package/src/domains/dispatch/reservation-store.ts +13 -37
  441. package/src/domains/dispatch/route-approval.ts +3 -3
  442. package/src/domains/dispatch/route-observer.ts +4 -2
  443. package/src/domains/dispatch/route-quality.ts +6 -1
  444. package/src/domains/dispatch/state.ts +15 -2
  445. package/src/domains/dispatch/types.ts +21 -5
  446. package/src/domains/dispatch/worker-spawn.ts +58 -21
  447. package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
  448. package/src/domains/eval/compare/behavioral.ts +81 -14
  449. package/src/domains/eval/compare/compare.ts +15 -5
  450. package/src/domains/eval/compare/envelope.ts +12 -5
  451. package/src/domains/eval/metrics/context.ts +24 -1
  452. package/src/domains/eval/metrics/tracked.ts +4 -28
  453. package/src/domains/eval/reports/comparison.ts +9 -9
  454. package/src/domains/eval/runners/clio-run.ts +17 -10
  455. package/src/domains/eval/runners/context-index.ts +2 -7
  456. package/src/domains/eval/runners/context-init.ts +3 -6
  457. package/src/domains/eval/runners/external-command.ts +29 -11
  458. package/src/domains/eval/schema/suite.ts +2 -0
  459. package/src/domains/eval/schema/validate.ts +1 -0
  460. package/src/domains/eval/suites/run.ts +189 -13
  461. package/src/domains/eval/verifiers/integrity.ts +39 -0
  462. package/src/domains/eval/verifiers/patch.ts +58 -2
  463. package/src/domains/eval/workspaces/temp-copy.ts +3 -0
  464. package/src/domains/evidence/build.ts +106 -17
  465. package/src/domains/evidence/detail.ts +69 -0
  466. package/src/domains/evidence/eval.ts +13 -1
  467. package/src/domains/evidence/finish-contract-map.ts +5 -1
  468. package/src/domains/evidence/inventory.ts +167 -0
  469. package/src/domains/evidence/store.ts +16 -0
  470. package/src/domains/evidence/types.ts +12 -0
  471. package/src/domains/extensions/resources.ts +7 -0
  472. package/src/domains/interop/registry.ts +2 -2
  473. package/src/domains/middleware/hooks-io.ts +45 -26
  474. package/src/domains/middleware/hooks.ts +6 -0
  475. package/src/domains/middleware/injection-screen.ts +23 -0
  476. package/src/domains/middleware/marketplace-offer.ts +20 -1
  477. package/src/domains/middleware/rules.ts +5 -1
  478. package/src/domains/middleware/runtime.ts +7 -3
  479. package/src/domains/middleware/stalled-turn.ts +18 -3
  480. package/src/domains/middleware/task-board-reminder.ts +4 -2
  481. package/src/domains/middleware/task-nudge.ts +4 -1
  482. package/src/domains/mux/contract.ts +34 -1
  483. package/src/domains/mux/detect.ts +3 -6
  484. package/src/domains/mux/dock-controller.ts +8 -1
  485. package/src/domains/mux/index.ts +1 -0
  486. package/src/domains/mux/socket-client.ts +13 -3
  487. package/src/domains/observability/accountability.ts +15 -1
  488. package/src/domains/observability/contract.ts +54 -9
  489. package/src/domains/observability/evidence-index.ts +10 -0
  490. package/src/domains/observability/extension.ts +9 -5
  491. package/src/domains/observability/projection.ts +423 -53
  492. package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
  493. package/src/domains/prompts/compiler.ts +10 -2
  494. package/src/domains/prompts/contract.ts +7 -4
  495. package/src/domains/prompts/extension.ts +28 -64
  496. package/src/domains/prompts/fragments/identity/clio.md +23 -0
  497. package/src/domains/prompts/fragments/operating/contract.md +12 -0
  498. package/src/domains/prompts/fragments/operating/delegation.md +5 -0
  499. package/src/domains/prompts/fragments/wiki/page.md +36 -15
  500. package/src/domains/prompts/fragments/wiki/plan.md +4 -4
  501. package/src/domains/prompts/preload-prefix.ts +31 -0
  502. package/src/domains/prompts/preload.ts +135 -61
  503. package/src/domains/providers/auth/backend-file.ts +15 -11
  504. package/src/domains/providers/auth/storage.ts +3 -5
  505. package/src/domains/providers/catalog.ts +18 -3
  506. package/src/domains/providers/model-discovery.ts +1 -4
  507. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
  508. package/src/domains/providers/runtime-resolution.ts +11 -9
  509. package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
  510. package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
  511. package/src/domains/providers/support.ts +1 -1
  512. package/src/domains/providers/types/runtime-descriptor.ts +1 -1
  513. package/src/domains/resources/skills/promotion.ts +8 -1
  514. package/src/domains/safety/action-classifier.ts +16 -0
  515. package/src/domains/safety/autonomy.ts +10 -1
  516. package/src/domains/safety/contract.ts +5 -1
  517. package/src/domains/safety/default-path-policy.ts +13 -0
  518. package/src/domains/safety/extension.ts +11 -2
  519. package/src/domains/safety/finish-contract-registration.ts +29 -14
  520. package/src/domains/safety/finish-contract.ts +252 -40
  521. package/src/domains/safety/index.ts +20 -1
  522. package/src/domains/safety/policy-engine.ts +211 -34
  523. package/src/domains/safety/project-policy.ts +7 -2
  524. package/src/domains/safety/rigor.ts +53 -39
  525. package/src/domains/safety/validation-contract.ts +388 -0
  526. package/src/domains/safety/workspace-trust.ts +43 -0
  527. package/src/domains/session/archive-readers.ts +10 -1
  528. package/src/domains/session/compaction/compact.ts +384 -21
  529. package/src/domains/session/compaction/cut-point.ts +42 -5
  530. package/src/domains/session/compaction/tokens.ts +9 -1
  531. package/src/domains/session/decision-board.ts +137 -28
  532. package/src/domains/session/entries.ts +213 -11
  533. package/src/domains/session/extension.ts +4 -4
  534. package/src/domains/session/handoff.ts +2 -1
  535. package/src/domains/session/manager.ts +2 -3
  536. package/src/domains/session/prompt-manifest.ts +47 -8
  537. package/src/domains/session/task-board.ts +32 -1
  538. package/src/domains/session/tree/fork.ts +1 -2
  539. package/src/domains/session/tree/navigator.ts +1 -1
  540. package/src/domains/user-tasks/acceptance.ts +56 -0
  541. package/src/domains/user-tasks/active-acceptance.ts +40 -0
  542. package/src/domains/user-tasks/handoff.ts +16 -0
  543. package/src/domains/user-tasks/store.ts +34 -3
  544. package/src/engine/acp/adapter.ts +60 -10
  545. package/src/engine/acp/server.ts +22 -4
  546. package/src/engine/acp/transport.ts +55 -9
  547. package/src/engine/acp/types.ts +9 -0
  548. package/src/engine/antigravity/subprocess-runtime.ts +20 -4
  549. package/src/engine/api-registry.ts +19 -2
  550. package/src/engine/apis/ollama-native.ts +15 -0
  551. package/src/engine/apis/openai-completions.ts +13 -6
  552. package/src/engine/apis/output-budget.ts +26 -10
  553. package/src/engine/claude/sdk-runtime.ts +4 -3
  554. package/src/engine/claude/subprocess-runtime.ts +107 -60
  555. package/src/engine/env-api-keys.ts +2 -1
  556. package/src/engine/external-subprocess.ts +26 -7
  557. package/src/engine/loop-guard.ts +19 -2
  558. package/src/engine/provider-diagnostics.ts +129 -0
  559. package/src/engine/provider-payload.ts +3 -1
  560. package/src/engine/worker-runtime.ts +13 -2
  561. package/src/engine/worker-tools.ts +5 -1
  562. package/src/entry/extension-reload.ts +1 -0
  563. package/src/entry/orchestrator.ts +64 -17
  564. package/src/interactive/chat-loop-messages.ts +12 -4
  565. package/src/interactive/chat-loop.ts +115 -45
  566. package/src/interactive/chat-renderer.ts +60 -0
  567. package/src/interactive/context-recall-command.ts +2 -1
  568. package/src/interactive/dispatch-board.ts +58 -714
  569. package/src/interactive/editor-submit.ts +13 -0
  570. package/src/interactive/fleet-run-preview.ts +2 -1
  571. package/src/interactive/interactive-application.ts +11 -4
  572. package/src/interactive/interactive-event-projection.ts +7 -1
  573. package/src/interactive/interactive-presentation.ts +63 -12
  574. package/src/interactive/interactive-slash-runtime.ts +4 -1
  575. package/src/interactive/layout.ts +2 -1
  576. package/src/interactive/model-session-replay.ts +2 -2
  577. package/src/interactive/oracle.ts +5 -2
  578. package/src/interactive/overlay-frame.ts +1 -0
  579. package/src/interactive/overlay-general-openers.ts +3 -1
  580. package/src/interactive/overlay-session-lifecycle.ts +6 -0
  581. package/src/interactive/overlays/ask-user.ts +1 -0
  582. package/src/interactive/overlays/fleet-run-approval.ts +3 -2
  583. package/src/interactive/overlays/message-picker.ts +3 -3
  584. package/src/interactive/overlays/settings.ts +2 -2
  585. package/src/interactive/overlays/tree-selector.ts +2 -2
  586. package/src/interactive/renderers/branch-summary.ts +1 -1
  587. package/src/interactive/renderers/tool-execution.ts +17 -1
  588. package/src/interactive/renderers/worker-entry.ts +25 -10
  589. package/src/interactive/slash-autocomplete.ts +4 -6
  590. package/src/interactive/slash-commands.ts +31 -43
  591. package/src/interactive/slash-spec.ts +28 -0
  592. package/src/interactive/turn-context.ts +221 -53
  593. package/src/interactive/turn-middleware.ts +3 -1
  594. package/src/interactive/turn-persistence.ts +3 -0
  595. package/src/interactive/turn-runtime.ts +11 -2
  596. package/src/interactive/turn-state.ts +10 -9
  597. package/src/interactive/view/artifacts.ts +2 -0
  598. package/src/interactive/watch-pane.ts +18 -4
  599. package/src/interactive/worker-stream.ts +14 -10
  600. package/src/tools/agent-tools.ts +6 -3
  601. package/src/tools/bash.ts +1 -1
  602. package/src/tools/bootstrap.ts +4 -0
  603. package/src/tools/builtin-tool-catalog.ts +40 -2
  604. package/src/tools/codewiki/code-nav.ts +4 -10
  605. package/src/tools/compete-judge-task.ts +71 -0
  606. package/src/tools/compete-worktrees.ts +41 -1
  607. package/src/tools/context/index.ts +32 -7
  608. package/src/tools/context/surface.ts +15 -4
  609. package/src/tools/core-bootstrap.ts +16 -0
  610. package/src/tools/decide.ts +136 -0
  611. package/src/tools/dispatch-admission.ts +33 -1
  612. package/src/tools/dispatch-arguments.ts +38 -1
  613. package/src/tools/dispatch-plan.ts +12 -9
  614. package/src/tools/dispatch-runner.ts +63 -33
  615. package/src/tools/dispatch-schema.ts +30 -23
  616. package/src/tools/dispatch-scout-admission.ts +10 -44
  617. package/src/tools/dispatch-scout.ts +2 -3
  618. package/src/tools/dispatch-types.ts +6 -0
  619. package/src/tools/evidence.ts +96 -0
  620. package/src/tools/find.ts +13 -4
  621. package/src/tools/grep.ts +13 -1
  622. package/src/tools/limitation.ts +76 -0
  623. package/src/tools/ls.ts +7 -1
  624. package/src/tools/monitor.ts +26 -11
  625. package/src/tools/network-policy.ts +11 -24
  626. package/src/tools/observation.ts +39 -2
  627. package/src/tools/policy.ts +9 -0
  628. package/src/tools/presentation.ts +3 -0
  629. package/src/tools/read.ts +112 -15
  630. package/src/tools/registry.ts +55 -18
  631. package/src/tools/result-shaping.ts +127 -7
  632. package/src/tools/task-worktree.ts +13 -3
  633. package/src/tools/tasks.ts +40 -5
  634. package/src/tools/verify/authoring.ts +170 -83
  635. package/src/tools/verify/catalog.ts +122 -5
  636. package/src/tools/verify/frontend.ts +67 -30
  637. package/src/tools/verify/index.ts +2 -1
  638. package/src/tools/verify/numeric.ts +303 -0
  639. package/src/tools/verify/perf.ts +143 -0
  640. package/src/tools/verify/scripts.ts +229 -2
  641. package/src/tools/web-fetch-network.ts +179 -0
  642. package/src/tools/web-fetch-surface.ts +2 -1
  643. package/src/tools/web-fetch.ts +15 -13
  644. package/src/tools/worker-evidence.ts +27 -0
  645. package/src/worker/spec-contract.ts +12 -8
  646. package/dist/builtins-IA7V7FUC.js +0 -22
  647. package/dist/chunk-2WZ546HR.js +0 -792
  648. package/dist/chunk-5PSMVOLM.js +0 -56
  649. package/dist/chunk-7DICMOS6.js +0 -313
  650. package/dist/chunk-BEPZRGGU.js +0 -1560
  651. package/dist/chunk-JVCV3ICN.js +0 -47
  652. package/dist/chunk-KK4JZPBQ.js +0 -3982
  653. package/dist/chunk-MNJGS2IN.js +0 -33
  654. package/dist/chunk-NDINPTJ4.js +0 -641
  655. package/dist/chunk-O5CVSAG5.js +0 -122
  656. package/dist/chunk-OQE5J4C6.js +0 -73
  657. package/dist/chunk-RVG5JXAL.js +0 -41
  658. package/dist/chunk-T56WDKA5.js +0 -183
  659. package/dist/chunk-UUVG37B4.js +0 -244
  660. package/dist/chunk-VPKWYKEY.js +0 -169
  661. package/dist/chunk-Y3CBHOR6.js +0 -228
  662. package/dist/clio-CMMK4KRR.js +0 -25
  663. package/dist/configure-LE3IK2TJ.js +0 -56
  664. package/dist/context-clear-BW4O37TG.js +0 -176
  665. package/dist/fleet-view-SWBR3VGQ.js +0 -97
  666. package/dist/preload-P6DGH2PZ.js +0 -13
  667. package/dist/slash-commands-S7MBJDQK.js +0 -83
  668. package/dist/tools-TFGJICCU.js +0 -29
  669. package/dist/verify-RWE4PPEK.js +0 -27
  670. package/dist/wiki-generate-C7IQOXSP.js +0 -469
@@ -1,3 +1,4 @@
1
+ import { statSync } from "node:fs";
1
2
  import { detectProjectType } from "../session/workspace/project-type.js";
2
3
  import {
3
4
  loadProjectClioMd,
@@ -5,7 +6,7 @@ import {
5
6
  renderProjectContextFragment,
6
7
  renderProjectTypeFragment,
7
8
  } from "./clio-md.js";
8
- import { readCodewiki } from "./codewiki/artifact.js";
9
+ import { codewikiPath } from "./codewiki/artifact.js";
9
10
  import type { ProjectPromptContext } from "./contract.js";
10
11
  import { computeFingerprintCached, isStale } from "./fingerprint.js";
11
12
  import { readClioState } from "./state.js";
@@ -14,7 +15,7 @@ import { wikiCompleteness, wikiStaleness } from "./wiki/staleness.js";
14
15
 
15
16
  /**
16
17
  * Render the project prompt context for `cwd`: the project-type marker, the
17
- * effective CLIO-CODER.md fragments when parseable handbooks exist, the codewiki availability
18
+ * effective CLIO-CODER.md fragments when readable nonempty handbooks exist, the codewiki availability
18
19
  * marker, and the Markdown wiki marker when a valid wiki exists. Shared by the
19
20
  * prompts extension (session compile),
20
21
  * context-init preload reporting, and `clio-coder config inspect`, so every surface
@@ -24,26 +25,59 @@ import { wikiCompleteness, wikiStaleness } from "./wiki/staleness.js";
24
25
  export const HANDBOOK_ABSENT_FRAGMENT =
25
26
  "<handbook>none: this workspace has no CLIO-CODER.md, so do not read one; learn the repository from its files, and the operator can run /context init to write a handbook</handbook>";
26
27
 
28
+ function codewikiArtifactPresent(cwd: string): boolean {
29
+ try {
30
+ return statSync(codewikiPath(cwd)).isFile();
31
+ } catch {
32
+ return false;
33
+ }
34
+ }
35
+
27
36
  export function renderPromptContext(cwd: string): ProjectPromptContext {
28
- const projectType = detectProjectType(cwd);
29
- const pieces = [renderProjectTypeFragment(projectType)];
37
+ // Detection enumerates the tree and reads every `.h` header to classify it,
38
+ // and this renders on session compile and on every bounded dispatch. An
39
+ // indexed project already recorded its type when init, refresh, or the
40
+ // session-start check stamped state; the marker reads that and detects only
41
+ // where nothing has been recorded yet.
42
+ const state = readClioState(cwd);
43
+ const projectType = state?.projectType ?? detectProjectType(cwd);
44
+ const supportFragments = [renderProjectTypeFragment(projectType)];
45
+ const pieces = [...supportFragments];
46
+ const addSupport = (fragment: string): void => {
47
+ pieces.push(fragment);
48
+ supportFragments.push(fragment);
49
+ };
30
50
  const warnings: string[] = [];
31
51
  const loadedClioMd = loadProjectClioMd(cwd);
32
52
  const clioMd: ParsedClioMd | null = loadedClioMd.value;
33
- for (const file of loadedClioMd.files) pieces.push(renderProjectContextFragment(file.value, file.path));
53
+ for (const file of loadedClioMd.files) pieces.push(renderProjectContextFragment(file.source, file.path));
34
54
  for (const issue of loadedClioMd.errors) {
35
- warnings.push(`clio-coder: malformed ${issue.path} ignored: ${issue.error}`);
55
+ warnings.push(`clio-coder: unavailable ${issue.path} ignored: ${issue.error}`);
36
56
  }
37
57
  // Said where the handbook would have been: a model that sees no project
38
58
  // context spends its first tool call reading CLIO-CODER.md and gets
39
59
  // ENOENT, while the operator's header already says it is missing (#191).
40
- if (loadedClioMd.files.length === 0 && loadedClioMd.errors.length === 0) pieces.push(HANDBOOK_ABSENT_FRAGMENT);
41
- const codewiki = readCodewiki(cwd);
42
- if (codewiki) {
43
- const state = readClioState(cwd);
44
- const stale = state ? isStale(state.fingerprint, computeFingerprintCached(cwd, codewiki)) : true;
60
+ if (loadedClioMd.files.length === 0 && loadedClioMd.errors.length === 0) addSupport(HANDBOOK_ABSENT_FRAGMENT);
61
+ // The marker states that an artifact is present and whether the recorded
62
+ // source fingerprint still matches the tree. It does not validate the
63
+ // artifact's contents: parsing the JSON here is main-thread work that grows
64
+ // with the index, on session compile and on every bounded dispatch, for a
65
+ // boolean. An unparseable artifact is still "available" in the sense the
66
+ // marker promises, because `code_nav` reads null for it and rebuilds from
67
+ // source under the lease before answering, and the session-start check does
68
+ // the same. The recorded fingerprint carries the line total the freshness
69
+ // check would otherwise have read off the artifact.
70
+ if (codewikiArtifactPresent(cwd)) {
71
+ let stale = true;
72
+ try {
73
+ if (state) {
74
+ stale = isStale(state.fingerprint, computeFingerprintCached(cwd, null, { artifactLoc: state.fingerprint.loc }));
75
+ }
76
+ } catch {
77
+ warnings.push("clio-coder: codewiki freshness unavailable; source could not be read; run /context refresh");
78
+ }
45
79
  const suffix = stale ? " (stale; run /context refresh)" : "";
46
- pieces.push(`<codewiki>available${suffix}; use code_nav</codewiki>`);
80
+ addSupport(`<codewiki>available${suffix}; use code_nav</codewiki>`);
47
81
  }
48
82
  // A wiki is advertised whenever one exists. There is no invalid-layout state
49
83
  // to gate on: every structural defect is repaired by the assembly pass before
@@ -63,7 +97,14 @@ export function renderPromptContext(cwd: string): ProjectPromptContext {
63
97
  }
64
98
  if (staleness.state === "stale") notes.push("stale");
65
99
  const suffix = notes.length > 0 ? ` (${notes.join("; ")}; run clio-coder context wiki --update)` : "";
66
- pieces.push(`<wiki>${pages.length} pages at .clio-coder/wiki (start: quickstart.md)${suffix}</wiki>`);
100
+ addSupport(`<wiki>${pages.length} pages at .clio-coder/wiki (start: quickstart.md)${suffix}</wiki>`);
67
101
  }
68
- return { text: pieces.join("\n\n"), clioMd, warnings, handbookFiles: loadedClioMd.files.map((file) => file.path) };
102
+ return {
103
+ text: pieces.join("\n\n"),
104
+ clioMd,
105
+ warnings,
106
+ handbookFiles: loadedClioMd.files.map((file) => file.path),
107
+ handbookSources: loadedClioMd.files.map(({ path, source }) => ({ path, source })),
108
+ supportFragments,
109
+ };
69
110
  }
@@ -1,8 +1,7 @@
1
- import { writeFileSync } from "node:fs";
2
- import { join } from "node:path";
1
+ import type { DecisionLedgerEntry } from "../session/entries.js";
3
2
  import { detectProjectType } from "../session/workspace/project-type.js";
4
- import { type BootstrapIo, type BootstrapProgressSink, codewikiSections } from "./bootstrap.js";
5
- import { serializeClioMd, tryReadClioMd } from "./clio-md.js";
3
+ import type { BootstrapIo, BootstrapProgressSink } from "./bootstrap.js";
4
+ import { tryReadClioMd } from "./clio-md.js";
6
5
  import { coordinateCodewikiWrite } from "./codewiki/coordinator.js";
7
6
  import type { Codewiki } from "./codewiki/schema.js";
8
7
  import type { Fingerprint } from "./fingerprint.js";
@@ -13,11 +12,12 @@ import { wikiCompleteness, wikiStaleness } from "./wiki/staleness.js";
13
12
 
14
13
  /**
15
14
  * `/context refresh` and `clio-coder context refresh`: rebuild the codewiki index and
16
- * `.clio-coder` state, then re-derive the handbook sections the index owns. Authoring
17
- * handbook prose stays with `/context init`.
15
+ * `.clio-coder` state while preserving authored handbook bytes. Derived navigation
16
+ * stays in codewiki and the optional Markdown wiki.
18
17
  */
19
18
 
20
19
  export interface RunContextRefreshInput {
20
+ decisions?: ReadonlyArray<DecisionLedgerEntry>;
21
21
  cwd?: string;
22
22
  io?: BootstrapIo;
23
23
  now?: () => Date;
@@ -33,11 +33,11 @@ export interface RunContextRefreshInput {
33
33
  }
34
34
 
35
35
  /**
36
- * What refresh did to CLIO-CODER.md. "absent" covers no handbook and an unparseable
37
- * one alike: a missing or broken handbook is never an error here, because a
36
+ * What refresh found at CLIO-CODER.md. "absent" covers missing, empty, and unreadable
37
+ * files: an unavailable handbook is never an error here, because a
38
38
  * repository must stay fully usable without one.
39
39
  */
40
- export type ClioMdCuration = "updated" | "unchanged" | "absent";
40
+ export type ClioMdCuration = "unchanged" | "absent";
41
41
 
42
42
  export interface RunContextRefreshResult {
43
43
  action: "refreshed";
@@ -48,49 +48,6 @@ export interface RunContextRefreshResult {
48
48
  hint?: string;
49
49
  }
50
50
 
51
- /**
52
- * Re-derive the index-owned sections of an existing handbook against the codewiki
53
- * this run just built. Only sections whose title the index authors are replaced,
54
- * and only when they are already present, so a human's handbook is never grown a
55
- * section it did not ask for and never loses one it wrote. Best-effort by
56
- * construction: nothing here may turn a routine refresh into a failure.
57
- */
58
- function curateClioMd(cwd: string, codewiki: Codewiki): ClioMdCuration {
59
- try {
60
- const parsed = tryReadClioMd(cwd);
61
- if (!parsed?.ok) return "absent";
62
- const handbook = parsed.value;
63
- const fresh = new Map(codewikiSections(codewiki).map((section) => [section.title, section.body] as const));
64
- let changed = false;
65
- const sections = handbook.sections.map((section) => {
66
- const body = fresh.get(section.title);
67
- if (body === undefined || body === section.body) return section;
68
- changed = true;
69
- return { title: section.title, body };
70
- });
71
- // Rewrite only when an index-owned body actually moved. Serializing on every
72
- // refresh would silently reformat a hand-written handbook into the generator's
73
- // canonical rendering, which is a diff the author never asked for.
74
- if (!changed) return "unchanged";
75
- writeFileSync(
76
- join(cwd, "CLIO-CODER.md"),
77
- serializeClioMd({
78
- projectName: handbook.projectName,
79
- identity: handbook.identity,
80
- conventions: handbook.conventions,
81
- invariants: handbook.invariants,
82
- sections,
83
- ...(handbook.importedAgentContext ? { importedAgentContext: handbook.importedAgentContext } : {}),
84
- fingerprint: handbook.fingerprint,
85
- }),
86
- "utf8",
87
- );
88
- return "updated";
89
- } catch {
90
- return "absent";
91
- }
92
- }
93
-
94
51
  function indexedSourceFileCount(codewiki: Codewiki): number {
95
52
  return codewiki.files.filter((file) => file.lang !== "config").length;
96
53
  }
@@ -119,7 +76,7 @@ export async function runContextRefresh(input: RunContextRefreshInput = {}): Pro
119
76
  const coordinated = await coordinateCodewikiWrite(cwd, () => ({ kind: "build", cwd, language: projectType }), {
120
77
  afterCommit: (result, workspace) => {
121
78
  fingerprint = result.fingerprint;
122
- clioMd = curateClioMd(workspace, result.codewiki);
79
+ clioMd = tryReadClioMd(workspace)?.ok ? "unchanged" : "absent";
123
80
  input.onProgress?.({ phase: "state", status: "running", message: "writing state" });
124
81
  const latest = readClioState(workspace);
125
82
  writeClioState(workspace, {
@@ -146,6 +103,7 @@ export async function runContextRefresh(input: RunContextRefreshInput = {}): Pro
146
103
  wikiResult = await runWikiGenerate({
147
104
  cwd,
148
105
  mode: "update",
106
+ ...(input.decisions ? { decisions: input.decisions } : {}),
149
107
  model: input.wikiModel ?? "unresolved-documenter-target",
150
108
  ...(input.wikiGenerate ? { generate: input.wikiGenerate } : {}),
151
109
  ...(input.onProgress ? { onProgress: input.onProgress } : {}),
@@ -162,10 +120,7 @@ export async function runContextRefresh(input: RunContextRefreshInput = {}): Pro
162
120
  }
163
121
 
164
122
  const committedClioMd = clioMd as ClioMdCuration;
165
- const handbookNote = committedClioMd === "updated" ? "; CLIO-CODER.md index sections updated" : "";
166
- input.io?.stdout(
167
- `clio-coder context refresh: codewiki rebuilt (${entries} source file${entries === 1 ? "" : "s"})${handbookNote}\n`,
168
- );
123
+ input.io?.stdout(`clio-coder context refresh: codewiki rebuilt (${entries} source file${entries === 1 ? "" : "s"})\n`);
169
124
  input.onProgress?.({ phase: "done", status: "completed", message: "context refreshed" });
170
125
  return {
171
126
  action: "refreshed",
@@ -15,7 +15,7 @@
15
15
  */
16
16
 
17
17
  import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
18
- import { basename, dirname, join, normalize, posix, relative } from "node:path";
18
+ import { basename, dirname, join, posix, relative } from "node:path";
19
19
  import { readWikiPage, renderWikiPage, resolveSourcePath, type WikiPageMetadata } from "./frontmatter.js";
20
20
  import {
21
21
  isGeneratedWikiFile,
@@ -289,15 +289,19 @@ export function pageSourceIndex(dir: string, sourceRoot: string): Map<string, st
289
289
  const index = new Map<string, string[]>();
290
290
  for (const relPath of wikiMarkdownFilesInDir(dir)) {
291
291
  if (isGeneratedWikiFile(relPath)) continue;
292
- const { metadata } = readWikiPage({ pagePath: relPath, content: readText(join(dir, relPath)), sourceRoot });
293
- index.set(relPath, [...metadata.sources, ...metadata.tests]);
292
+ const { metadata, unresolvedPaths } = readWikiPage({
293
+ pagePath: relPath,
294
+ content: readText(join(dir, relPath)),
295
+ sourceRoot,
296
+ });
297
+ index.set(relPath, [
298
+ ...new Set(
299
+ [...metadata.sources, ...metadata.tests, ...unresolvedPaths].map((cited) => {
300
+ const resolved = resolveSourcePath(sourceRoot, cited);
301
+ return resolved ? relative(sourceRoot, resolved).replace(/\\/g, "/") : cited;
302
+ }),
303
+ ),
304
+ ]);
294
305
  }
295
306
  return index;
296
307
  }
297
-
298
- /** Normalize a repository path for comparison against recorded page sources. */
299
- export function normalizeRepoPath(sourceRoot: string, candidate: string): string {
300
- const resolved = normalize(join(sourceRoot, candidate));
301
- const rel = relative(sourceRoot, resolved);
302
- return rel.split("\\").join("/");
303
- }
@@ -0,0 +1,209 @@
1
+ /** Mechanical publication checks; these do not prove a claim or that a writer read its source. */
2
+ import { accessSync, constants, readFileSync, realpathSync, statSync } from "node:fs";
3
+ import { basename, isAbsolute, relative, resolve } from "node:path";
4
+ import { parse } from "yaml";
5
+ import { readWikiPage, resolveSourcePath, stripFrontmatter } from "./frontmatter.js";
6
+
7
+ export interface WikiPageEvidenceInput {
8
+ pagePath: string;
9
+ content: string;
10
+ sourceRoot: string;
11
+ }
12
+
13
+ export interface WikiPageEvidenceResult {
14
+ ok: boolean;
15
+ /** At most eight actionable diagnostics, each bounded for the persisted retry reason. */
16
+ reasons: string[];
17
+ /** Canonical repository-relative evidence files, present only after successful validation. */
18
+ dependencies?: string[];
19
+ }
20
+
21
+ function within(root: string, path: string): boolean {
22
+ const rel = relative(root, path).replace(/\\/g, "/");
23
+ return rel !== ".." && !rel.startsWith("../") && !isAbsolute(rel);
24
+ }
25
+
26
+ /**
27
+ * Validate the original writer output BEFORE assembly repairs metadata. Existing
28
+ * frontmatter parsing supplies the references; no claims sidecar or prose schema
29
+ * is required. The supported body citation form is a backticked file path with
30
+ * optional :line[-end][:symbol] or #Lline[-Lend]. Markdown wiki links, commands,
31
+ * symbols and decision refs are not interpreted as source evidence.
32
+ */
33
+ export function validateWikiPageEvidence(input: WikiPageEvidenceInput): WikiPageEvidenceResult {
34
+ const reasons: string[] = [];
35
+ const fail = (reason: string): void => {
36
+ if (reasons.length < 8) reasons.push(reason.slice(0, 300));
37
+ };
38
+ if (Buffer.byteLength(input.content, "utf8") > 2 * 1024 * 1024) {
39
+ return { ok: false, reasons: ["Page exceeds the 2 MiB evidence-check limit; split or shorten it before retrying."] };
40
+ }
41
+ const { body, metadata } = readWikiPage({ pagePath: input.pagePath, content: input.content });
42
+ if (
43
+ body
44
+ .replace(/<!--[\s\S]*?-->/g, "")
45
+ .replace(/^\s*#.*$/gm, "")
46
+ .trim().length === 0
47
+ ) {
48
+ fail("Write a nonempty page body beyond headings and comments, grounded in current repository files.");
49
+ }
50
+ const { block } = stripFrontmatter(input.content);
51
+ if (block !== null) {
52
+ try {
53
+ const fields: unknown = parse(`\n${block}`, { schema: "core", uniqueKeys: true });
54
+ if (typeof fields !== "object" || fields === null || Array.isArray(fields)) {
55
+ fail("Repair the YAML frontmatter as a metadata mapping before retrying.");
56
+ } else {
57
+ for (const field of ["sources", "tests"] as const) {
58
+ const value = (fields as Record<string, unknown>)[field];
59
+ if (
60
+ value !== undefined &&
61
+ (!Array.isArray(value) || value.some((item) => typeof item !== "string" || !item.trim()))
62
+ ) {
63
+ fail(`Repair frontmatter ${field}: use a list of nonempty repository-relative file paths.`);
64
+ }
65
+ }
66
+ }
67
+ } catch {
68
+ fail("Repair invalid YAML frontmatter; source/test evidence cannot be checked until it parses.");
69
+ }
70
+ } else if (/^---\r?\n/.test(input.content)) {
71
+ fail("Close the YAML frontmatter with a standalone --- line before the page body.");
72
+ }
73
+
74
+ const declaredReferences = new Set([...metadata.sources, ...metadata.tests]);
75
+ const references = new Set(declaredReferences);
76
+ for (const reference of references) {
77
+ if (/[:#]/.test(reference))
78
+ fail(
79
+ `Use a plain file path in sources/tests: ${JSON.stringify(reference.slice(0, 160))}; put line/symbol citations in the body.`,
80
+ );
81
+ }
82
+ // Remove code fences: example programs and shell commands are not citations.
83
+ const prose = body.replace(/^\s*(`{3,}|~{3,})[^\n]*\n[\s\S]*?^\s*\1\s*$/gm, "");
84
+ for (const match of prose.matchAll(/`([^`\s]+)`/g)) {
85
+ const cited = match[1] ?? "";
86
+ // A filename extension distinguishes a file citation from a symbol or a
87
+ // recorded decision ref. Include extensionless conventional repo files.
88
+ const pathLike = cited.includes("/") && /\.[\w-]+(?=[:#]|$)/.test(cited);
89
+ const rootFile =
90
+ /^[^/:#]+\.(?:[cm]?[jt]sx?|py|rs|go|c|h|cpp|hpp|java|rb|sh|json|ya?ml|toml|md|txt|ini|cfg|xml|html|css|sql)(?=[:#]|$)/i.test(
91
+ cited,
92
+ );
93
+ if (
94
+ !/^[a-z][a-z\d+.-]*:\/\//i.test(cited) &&
95
+ (pathLike || rootFile || /^(?:Makefile|Dockerfile|LICENSE)(?=[:#]|$)/.test(cited))
96
+ ) {
97
+ references.add(cited);
98
+ }
99
+ }
100
+ if (references.size === 0)
101
+ fail("Cite at least one existing repository file in sources/tests or as a backticked source path.");
102
+ if (references.size > 512) {
103
+ fail("Page exceeds the 512-reference evidence-check limit; split or shorten it before retrying.");
104
+ return { ok: false, reasons };
105
+ }
106
+ let root: string;
107
+ try {
108
+ root = realpathSync(input.sourceRoot);
109
+ } catch {
110
+ fail("Repository root is unavailable; restore access and retry evidence validation.");
111
+ return { ok: false, reasons };
112
+ }
113
+ const dependencies = new Set<string>();
114
+ const declaredFilesByName = new Map<string, Set<string>>();
115
+ const linesByFile = new Map<string, number>();
116
+ let readBytes = 0;
117
+ for (const reference of references) {
118
+ const label = JSON.stringify(reference.slice(0, 160));
119
+ const match = /^([^:#]+)(?:(?::(\d+)(?:-(\d+))?)|(?:#L(\d+)(?:-L?(\d+))?))?(?::[A-Za-z_$][\w$.-]*)?$/.exec(reference);
120
+ if (!match) {
121
+ fail(`Repair citation ${label}: use path, path:line[-end], or path#Lline[-Lend].`);
122
+ continue;
123
+ }
124
+ const cited = match[1] ?? "";
125
+ try {
126
+ let source = resolveSourcePath(resolve(input.sourceRoot), cited);
127
+ if (source === null && !declaredReferences.has(reference) && !/[\\/]/.test(cited)) {
128
+ const declared = declaredFilesByName.get(cited);
129
+ if (declared?.size === 1) source = [...declared][0] ?? null;
130
+ }
131
+ if (source === null) {
132
+ fail(`Replace or remove unresolved repository reference ${label}; inspect the current file path.`);
133
+ continue;
134
+ }
135
+ const real = realpathSync(source);
136
+ const stat = statSync(real);
137
+ if (!within(root, real) || !stat.isFile()) {
138
+ fail(
139
+ `Replace ${label} with an existing file inside the repository; directories and escaping symlinks are not evidence.`,
140
+ );
141
+ continue;
142
+ }
143
+ accessSync(real, constants.R_OK);
144
+ // Declared references are checked first. Body shorthand can reuse only
145
+ // their verified files; frontmatter itself remains repository-relative.
146
+ if (declaredReferences.has(reference) && !/[:#]/.test(reference)) {
147
+ for (const name of [basename(cited), basename(real)]) {
148
+ const files = declaredFilesByName.get(name) ?? new Set<string>();
149
+ files.add(real);
150
+ declaredFilesByName.set(name, files);
151
+ }
152
+ }
153
+ dependencies.add(relative(root, real).split("\\").join("/"));
154
+ const startText = match[2] ?? match[4];
155
+ if (startText !== undefined) {
156
+ if (stat.size > 4 * 1024 * 1024) {
157
+ fail(`Cannot check lines in ${label}: file exceeds 4 MiB; cite the file and symbol without a line range.`);
158
+ continue;
159
+ }
160
+ let lines = linesByFile.get(real);
161
+ if (lines === undefined) {
162
+ if (readBytes + stat.size > 16 * 1024 * 1024) {
163
+ fail(
164
+ "Line citations exceed the 16 MiB total source-read limit; split the page or prefer file and symbol citations.",
165
+ );
166
+ continue;
167
+ }
168
+ readBytes += stat.size;
169
+ const text = readFileSync(real, "utf8");
170
+ lines = text.length === 0 ? 0 : text.split("\n").length - (text.endsWith("\n") ? 1 : 0);
171
+ linesByFile.set(real, lines);
172
+ }
173
+ const start = Number(startText);
174
+ const end = Number(match[3] ?? match[5] ?? startText);
175
+ if (!Number.isSafeInteger(start) || !Number.isSafeInteger(end) || start < 1 || end < start || end > lines) {
176
+ fail(
177
+ `Repair line range in ${label}: the current file has ${lines} lines; use an existing ordered range starting at 1.`,
178
+ );
179
+ }
180
+ }
181
+ } catch {
182
+ fail(`Cannot inspect ${label}; restore readable repository evidence or remove the unsupported reference.`);
183
+ }
184
+ }
185
+ return reasons.length === 0 ? { ok: true, reasons, dependencies: [...dependencies].sort() } : { ok: false, reasons };
186
+ }
187
+
188
+ /** Read a planned staging page with bounded IO before validating original evidence. */
189
+ export function inspectWikiPageEvidence(input: {
190
+ pagePath: string;
191
+ outputDir: string;
192
+ sourceRoot: string;
193
+ }): WikiPageEvidenceResult {
194
+ try {
195
+ const path = realpathSync(resolve(input.outputDir, input.pagePath));
196
+ const stat = statSync(path);
197
+ if (!within(realpathSync(input.outputDir), path) || !stat.isFile())
198
+ return { ok: false, reasons: ["planned page must be a regular file inside wiki staging"] };
199
+ if (stat.size > 2 * 1024 * 1024)
200
+ return { ok: false, reasons: ["page exceeds the 2 MiB evidence-check limit; split or shorten it"] };
201
+ return validateWikiPageEvidence({
202
+ pagePath: input.pagePath,
203
+ content: readFileSync(path, "utf8"),
204
+ sourceRoot: input.sourceRoot,
205
+ });
206
+ } catch {
207
+ return { ok: false, reasons: ["writer finished without a readable planned page file"] };
208
+ }
209
+ }
@@ -35,6 +35,8 @@ export interface WikiPageMetadata {
35
35
  invariants: string[];
36
36
  /** Narrowest non-destructive commands that check this area. */
37
37
  validate: string[];
38
+ /** Stable refs for recorded decisions cited in the body. */
39
+ decisions?: string[];
38
40
  }
39
41
 
40
42
  export interface WikiPageDocument {
@@ -47,7 +49,7 @@ export interface WikiPageDocument {
47
49
 
48
50
  const FRONTMATTER_BLOCK = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/;
49
51
 
50
- const LIST_FIELDS = ["sources", "symbols", "tests", "invariants", "validate"] as const;
52
+ const LIST_FIELDS = ["sources", "symbols", "tests", "invariants", "validate", "decisions"] as const;
51
53
 
52
54
  /** Longest generated summary, so an index line stays one line. */
53
55
  const SUMMARY_MAX_CHARS = 240;
@@ -166,6 +168,7 @@ export function readWikiPage(input: ReadWikiPageInput): WikiPageDocument {
166
168
  tests: [],
167
169
  invariants: stringList(authored.invariants),
168
170
  validate: stringList(authored.validate),
171
+ ...(authored.decisions === undefined ? {} : { decisions: stringList(authored.decisions) }),
169
172
  };
170
173
  const unresolvedPaths: string[] = [];
171
174
  for (const field of ["sources", "tests"] as const) {
@@ -189,7 +192,7 @@ function renderList(name: string, values: ReadonlyArray<string>): string[] {
189
192
  function renderFrontmatter(metadata: WikiPageMetadata): string {
190
193
  const lines = [`title: ${JSON.stringify(metadata.title)}`];
191
194
  if (metadata.summary.length > 0) lines.push(`summary: ${JSON.stringify(metadata.summary)}`);
192
- for (const field of LIST_FIELDS) lines.push(...renderList(field, metadata[field]));
195
+ for (const field of LIST_FIELDS) lines.push(...renderList(field, metadata[field] ?? []));
193
196
  return `---\n${lines.join("\n")}\n---\n`;
194
197
  }
195
198