@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.
- package/CHANGELOG.md +153 -0
- package/CONTRIBUTING.md +25 -15
- package/README.md +340 -27
- package/dist/{acp-H2NGRPWO.js → acp-H3CU2HBQ.js} +25 -25
- package/dist/{agents-TL5LLUQP.js → agents-IXQQZ7BD.js} +77 -75
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-E5SW4HMS.js → auth-R7KYF7N3.js} +38 -39
- package/dist/builtins-CRFDQUVP.js +22 -0
- package/dist/{chunk-7DRAWPTZ.js → chunk-22PQ4TX4.js} +4 -4
- package/dist/{chunk-NEDJ26B5.js → chunk-2GPGAE5W.js} +6 -51
- package/dist/{chunk-IKCO5N3L.js → chunk-2QPI3TR3.js} +3 -3
- package/dist/{chunk-HRQMFLJP.js → chunk-32KJPXAM.js} +6 -6
- package/dist/{chunk-65DEGPJ6.js → chunk-3A3CUMKA.js} +6 -4
- package/dist/{chunk-5TSRNF4G.js → chunk-3T4DXWP6.js} +170 -12
- package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
- package/dist/{chunk-XIVNBFZS.js → chunk-4SVIVOMC.js} +208 -39
- package/dist/{chunk-NMJXSHBJ.js → chunk-5A6XR3RJ.js} +44 -19
- package/dist/{chunk-YPC6ZR5L.js → chunk-5CMARGPF.js} +119 -5
- package/dist/{chunk-KXDSS5WJ.js → chunk-5CY4Q6QI.js} +4 -4
- package/dist/chunk-5DDOTTG4.js +402 -0
- package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
- package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
- package/dist/{chunk-PUVDKJ2Y.js → chunk-5VTJP36Q.js} +5 -7
- package/dist/{chunk-JGRC33J2.js → chunk-5ZMXGW7P.js} +90 -9
- package/dist/chunk-5ZSZEYJK.js +119 -0
- package/dist/chunk-633EXGZA.js +44 -0
- package/dist/{chunk-IWT4SF4R.js → chunk-6CDNRHWH.js} +361 -89
- package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
- package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
- package/dist/{chunk-INY6HTFL.js → chunk-6SYEGZI3.js} +12 -12
- package/dist/{chunk-SKHCAU7K.js → chunk-6YA46L5A.js} +5 -4
- package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
- package/dist/{chunk-L47TF46W.js → chunk-7HBHHVCK.js} +24 -3
- package/dist/{chunk-DWUOQKRU.js → chunk-7TKWWPD7.js} +5 -4
- package/dist/{chunk-2VTFPG5O.js → chunk-7WLRF2U5.js} +2 -2
- package/dist/chunk-7WUZEB2M.js +165 -0
- package/dist/{chunk-6PTFB5VS.js → chunk-7YJWEF2L.js} +59 -28
- package/dist/{chunk-3EBYEESD.js → chunk-A46ILRS2.js} +5 -5
- package/dist/{chunk-UOIZ7DA4.js → chunk-AP7HDJOP.js} +2 -2
- package/dist/{chunk-APJ265NV.js → chunk-B5GGDIHT.js} +146 -146
- package/dist/{chunk-PMZVFWSR.js → chunk-B5ZTR6KZ.js} +2 -2
- package/dist/chunk-B6UM3OZC.js +15 -0
- package/dist/{chunk-MCEPRMZW.js → chunk-BBV5TKE6.js} +5 -5
- package/dist/{chunk-4O6MANBS.js → chunk-BS4GAMUB.js} +14 -10
- package/dist/{chunk-S66XZJOF.js → chunk-C27U2TYG.js} +2 -2
- package/dist/{chunk-42FMPA75.js → chunk-CBSKDFWL.js} +3 -3
- package/dist/{chunk-2LEAKD4C.js → chunk-CKK25WN3.js} +3 -3
- package/dist/{chunk-BYP5D4HI.js → chunk-CTTI7G3T.js} +2 -2
- package/dist/{chunk-XAKHZX5N.js → chunk-CVDAFGPW.js} +4 -4
- package/dist/{chunk-RKKLTLYB.js → chunk-CXQ37WJH.js} +3 -3
- package/dist/{chunk-GTUD2WMY.js → chunk-DBREN25X.js} +44 -9
- package/dist/{chunk-WCXUNS7U.js → chunk-DIMRLNIC.js} +35 -66
- package/dist/{chunk-NDDGJUXD.js → chunk-DNCE23JJ.js} +2 -2
- package/dist/{chunk-HVDIIIQW.js → chunk-DNHVRBH4.js} +3 -3
- package/dist/{chunk-2UG5F4C5.js → chunk-DRD2A54W.js} +116 -52
- package/dist/{chunk-D7E7WCDF.js → chunk-DVNAPPXU.js} +2 -2
- package/dist/{chunk-YXLYO42X.js → chunk-DXVMLM3Z.js} +3 -2
- package/dist/{chunk-5MEZN6CB.js → chunk-DZK63TZJ.js} +6 -6
- package/dist/{chunk-IGLP3ODT.js → chunk-E3BQTQUP.js} +15 -15
- package/dist/{chunk-IWHMRKLL.js → chunk-E3LEPLQ2.js} +2 -2
- package/dist/{chunk-3R73A4XB.js → chunk-ECBHH7LU.js} +3 -3
- package/dist/chunk-ECOMVOHP.js +139 -0
- package/dist/chunk-EFSEIZE6.js +56 -0
- package/dist/{chunk-IJNZMHLA.js → chunk-EHCPSZJF.js} +4 -4
- package/dist/{chunk-K6BSR66V.js → chunk-EHOSNVVM.js} +6 -2
- package/dist/{chunk-RRNP2ANY.js → chunk-EQEJJ53P.js} +10 -10
- package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
- package/dist/{chunk-JKKCYP3C.js → chunk-F34AR6O3.js} +21 -15
- package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
- package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
- package/dist/{chunk-MWUZBSAQ.js → chunk-FSTIBAGM.js} +358 -63
- package/dist/{chunk-ZTJUVLTU.js → chunk-FXFVDPWY.js} +2 -2
- package/dist/{chunk-XPLRXC72.js → chunk-GD55RTIW.js} +3 -3
- package/dist/{chunk-5B2AEOW5.js → chunk-GH5ZR6JP.js} +472 -472
- package/dist/{chunk-JSC3U7TI.js → chunk-GJ24ODAX.js} +5 -5
- package/dist/{chunk-B4VEBZKF.js → chunk-GNQRWTMY.js} +139 -52
- package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
- package/dist/chunk-GXCCHKN6.js +59 -0
- package/dist/{chunk-V2ANDPVT.js → chunk-HGSLRG33.js} +170 -8
- package/dist/{chunk-LLDJM5XK.js → chunk-HHVJNVUJ.js} +6 -6
- package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
- package/dist/{chunk-VA5FNYMT.js → chunk-HR3HPQ76.js} +42 -5
- package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
- package/dist/{chunk-OML5D5V5.js → chunk-I7VLWRK2.js} +8 -8
- package/dist/{chunk-VW6DOEDG.js → chunk-ICO4TQ2F.js} +16 -5
- package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
- package/dist/{chunk-WBKFA554.js → chunk-ILJ7DWGE.js} +9 -9
- package/dist/{chunk-2JH2WHGE.js → chunk-J2FYEQ5L.js} +4 -4
- package/dist/{chunk-BMS5RKQY.js → chunk-JABWPKFY.js} +3 -3
- package/dist/{chunk-QDC3K2U3.js → chunk-K2BLQC5E.js} +3 -3
- package/dist/{chunk-EKCHAPYA.js → chunk-K2HL3GBL.js} +4 -4
- package/dist/{chunk-N2Z7HLVY.js → chunk-K6RDB7IA.js} +28 -28
- package/dist/{chunk-TM6LQDI3.js → chunk-KDWLXVMN.js} +85 -335
- package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
- package/dist/{chunk-RSJ25QSL.js → chunk-KF6GFW6O.js} +217 -50
- package/dist/{chunk-BTK3SSSK.js → chunk-KMF54VH3.js} +2 -2
- package/dist/chunk-KPRLAMP4.js +32 -0
- package/dist/{chunk-ECH6PKUQ.js → chunk-KQ6IDQIB.js} +2 -2
- package/dist/{chunk-IUE3Y34X.js → chunk-KTFSFCVN.js} +20 -9
- package/dist/{chunk-7E7I3WLS.js → chunk-KYKNBD4Y.js} +36 -34
- package/dist/chunk-L4N3DWNW.js +539 -0
- package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
- package/dist/{chunk-JIEGK6UF.js → chunk-LTR5QCLS.js} +51 -7
- package/dist/chunk-LUL5Z66S.js +221 -0
- package/dist/chunk-LVFANMOH.js +466 -0
- package/dist/{chunk-H7IXIC72.js → chunk-LY4N4TTL.js} +17 -3
- package/dist/{chunk-VKPAQYEB.js → chunk-LZBMXNLP.js} +5 -5
- package/dist/{chunk-UL3WSD3F.js → chunk-M4KFUXS7.js} +2 -2
- package/dist/{chunk-I7ZPNEJM.js → chunk-M6TAYK66.js} +8 -8
- package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
- package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
- package/dist/chunk-MDU3C27C.js +674 -0
- package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
- package/dist/{chunk-4UVU7BJ5.js → chunk-NC4KV7EL.js} +6 -6
- package/dist/{chunk-JEQ3XTHC.js → chunk-NF3BK5WR.js} +5 -5
- package/dist/chunk-NTK3WTHM.js +141 -0
- package/dist/{chunk-GYV6VZOC.js → chunk-NTTS3O53.js} +2 -2
- package/dist/{chunk-UPZU6GE4.js → chunk-NY6IWDVU.js} +6 -6
- package/dist/chunk-O2RQ7LCK.js +283 -0
- package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
- package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
- package/dist/{chunk-WRBAGUNF.js → chunk-ODUTYZIU.js} +5 -5
- package/dist/{chunk-E3TPLWFX.js → chunk-ONRTXOZY.js} +4 -4
- package/dist/{chunk-B4OAX3SI.js → chunk-OQM5IVJY.js} +118 -225
- package/dist/{chunk-XRZT5WY5.js → chunk-P5SC4DLJ.js} +4 -4
- package/dist/{chunk-R6Q67RJH.js → chunk-PECBKCDK.js} +34 -6
- package/dist/{chunk-33YXPOE3.js → chunk-PPEZJWUG.js} +2 -2
- package/dist/{chunk-64I3JVYM.js → chunk-PWWSIB2A.js} +5 -5
- package/dist/{chunk-2STGEDFV.js → chunk-QEQISF75.js} +2 -2
- package/dist/{chunk-3DPEIQKN.js → chunk-QH3ZTUOA.js} +2 -2
- package/dist/{chunk-YAKGTXEV.js → chunk-QRFXEO6Y.js} +2 -2
- package/dist/{chunk-35MSIRKH.js → chunk-QUIJZSDW.js} +2 -2
- package/dist/{chunk-HHV2GANA.js → chunk-R2P2U3ZS.js} +2 -2
- package/dist/chunk-R6MAYTMS.js +108 -0
- package/dist/{chunk-MUW2BDDH.js → chunk-R6MICQYU.js} +6 -6
- package/dist/{chunk-JDAY6FIL.js → chunk-RLTT5GVY.js} +132 -17
- package/dist/{chunk-ZWPRK62N.js → chunk-RXIOCVBZ.js} +24 -6
- package/dist/{chunk-NIQJ66N4.js → chunk-S32UQ5GL.js} +62 -35
- package/dist/{chunk-AX2THNSA.js → chunk-SBZX6ARC.js} +12 -12
- package/dist/{chunk-TXOTCRLG.js → chunk-SD7SHNDW.js} +2 -2
- package/dist/{chunk-AF4YM7Z4.js → chunk-SDWNDICN.js} +10284 -3756
- package/dist/{chunk-UXCU4E3T.js → chunk-SE4ZKILO.js} +6 -6
- package/dist/chunk-SL2RDHKO.js +19 -0
- package/dist/{chunk-NUGM5KR6.js → chunk-SRCEQKQS.js} +2 -2
- package/dist/{chunk-KKOJXO6R.js → chunk-SRZOW5L2.js} +46 -14
- package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
- package/dist/chunk-T52TPHYC.js +318 -0
- package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
- package/dist/{chunk-LDJG7DW3.js → chunk-T7FDXNRU.js} +13 -13
- package/dist/{chunk-XPWWI35G.js → chunk-TEG3RYVZ.js} +59 -41
- package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
- package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
- package/dist/{chunk-PAJQJ7BS.js → chunk-TZ7MFRG4.js} +1263 -835
- package/dist/{chunk-GI7YYQ3F.js → chunk-U2JOLB7O.js} +415 -83
- package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
- package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
- package/dist/{chunk-CE5AX47J.js → chunk-U7H5WRG5.js} +5 -5
- package/dist/{chunk-G76U63X4.js → chunk-U7VQ4NI4.js} +22 -22
- package/dist/{chunk-7ZYNNDKC.js → chunk-UFYNOQK4.js} +7 -7
- package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
- package/dist/{chunk-QWGDJJYJ.js → chunk-UL36QJX6.js} +14 -14
- package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
- package/dist/{chunk-HEQY7ZFI.js → chunk-URBGEOH3.js} +5 -5
- package/dist/chunk-USZA7GWL.js +341 -0
- package/dist/{chunk-W6RRQCPQ.js → chunk-UTUNT5QL.js} +48 -579
- package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
- package/dist/{chunk-F5JHEYZM.js → chunk-UXAC2FX4.js} +73 -41
- package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
- package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
- package/dist/chunk-VLPTKCKT.js +396 -0
- package/dist/{chunk-336NSSKI.js → chunk-VNBICSS2.js} +2 -2
- package/dist/{chunk-VAVR4IJY.js → chunk-VQD7NH7Z.js} +3 -3
- package/dist/{chunk-LBMZMYH2.js → chunk-W2RJEH6Q.js} +3 -3
- package/dist/{chunk-7CR24IG7.js → chunk-WDV62RKY.js} +2 -2
- package/dist/{chunk-2UH2KFUP.js → chunk-WFKDPU7U.js} +4 -4
- package/dist/{chunk-ZDN3Y73Y.js → chunk-WJIMKGD6.js} +9 -51
- package/dist/{chunk-YQWYVTMC.js → chunk-WLMSOT73.js} +59 -12
- package/dist/{chunk-MXHC5QYU.js → chunk-WTQGRBHV.js} +5 -144
- package/dist/chunk-WXA2CFJO.js +23 -0
- package/dist/{chunk-QSNYB6ZV.js → chunk-XCUDZQLX.js} +3 -3
- package/dist/{chunk-2APPQIER.js → chunk-XXBQKW32.js} +11 -11
- package/dist/{chunk-2VIKGWFZ.js → chunk-YEJIG7LN.js} +332 -332
- package/dist/chunk-YGDMBK7O.js +567 -0
- package/dist/{chunk-4WR7VSYB.js → chunk-YYB3MC65.js} +23 -9
- package/dist/{chunk-2IR2NMPA.js → chunk-ZIDFQJRB.js} +2 -2
- package/dist/{chunk-54CBCGIR.js → chunk-ZMZQEBKI.js} +136 -81
- package/dist/{chunk-6EJMN2Y3.js → chunk-ZTNFYMIO.js} +2 -2
- package/dist/{chunk-WEPFGWHJ.js → chunk-ZZFWWYLX.js} +2 -2
- package/dist/cli/index.js +45 -44
- package/dist/clio-5I2IBFYL.js +26 -0
- package/dist/{code-nav-MDZNQS33.js → code-nav-YXIAEZVS.js} +48 -32
- package/dist/codewiki/build-worker.js +76 -29
- package/dist/{compile-cache-OQAVB7Y5.js → compile-cache-WJEPUZEJ.js} +4 -4
- package/dist/{components-UCUQ4QXW.js → components-TNIKXCBH.js} +13 -14
- package/dist/{config-SVM5P5YI.js → config-Y2JDJ3JJ.js} +210 -119
- package/dist/configure-SML6UBZ5.js +55 -0
- package/dist/{context-2OHRKS42.js → context-P5YSEO55.js} +125 -115
- package/dist/{context-VNCR7KAG.js → context-QQ53HSGJ.js} +91 -62
- package/dist/{context-E3VC7RX5.js → context-S2EEC3EJ.js} +62 -31
- package/dist/context-clear-TMEQCOTH.js +183 -0
- package/dist/{context-index-HNG3MOME.js → context-index-HP2JFUWA.js} +13 -11
- package/dist/{context-map-COB37XXN.js → context-map-INTXD54D.js} +71 -21
- package/dist/{context-working-set-VDS25HXZ.js → context-working-set-CNLSQN5K.js} +31 -31
- package/dist/detail-5572VLBO.js +114 -0
- package/dist/{dispatch-runner-5AHT53RF.js → dispatch-runner-FRHD6P2O.js} +214 -126
- package/dist/{docs-PD3EXDKU.js → docs-BL7ROUFN.js} +5 -7
- package/dist/{doctor-WNNVO6FY.js → doctor-N3LCM2LG.js} +89 -66
- package/dist/{eval-7G7SGAYO.js → eval-BUU3ZOUZ.js} +493 -197
- package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
- package/dist/evidence-DTGEN456.js +224 -0
- package/dist/{evidence-VD6736FQ.js → evidence-SQ5DNFEN.js} +114 -195
- package/dist/{evolve-AL3NGVRL.js → evolve-IJNUFZDS.js} +107 -88
- package/dist/{extensions-MOVJ32NM.js → extensions-YVRHX6ZI.js} +16 -17
- package/dist/{fleet-QZHUMAGI.js → fleet-ZNNVSYFO.js} +147 -141
- package/dist/{fleet-commands-BAYT5FJZ.js → fleet-commands-5YE7NPJL.js} +27 -23
- package/dist/{fleet-decisions-IREVMRU4.js → fleet-decisions-3SBSCTCW.js} +16 -15
- package/dist/{fleet-graph-YCTT3HTI.js → fleet-graph-6HHPWF5T.js} +39 -38
- package/dist/{fleet-inspect-QVJTDAVB.js → fleet-inspect-JEYMGCGC.js} +107 -87
- package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
- package/dist/{fleet-preflight-25QAFPK4.js → fleet-preflight-QRSHIIDE.js} +10 -10
- package/dist/{fleet-validate-5O57AAJ7.js → fleet-validate-4PM4GDDL.js} +46 -42
- package/dist/{fleet-verify-CPH2W2T6.js → fleet-verify-NJDTHTO3.js} +105 -85
- package/dist/fleet-view-UP2BWQQY.js +117 -0
- package/dist/{init-J477LKZH.js → init-S3GZQ5ZF.js} +123 -117
- package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
- package/dist/{interop-3FCM6XLG.js → interop-YOTGXFJM.js} +25 -26
- package/dist/inventory-K2OZ36YJ.js +117 -0
- package/dist/{library-QUQEIUG6.js → library-GJI6W6OK.js} +45 -45
- package/dist/{memory-SGGSEP65.js → memory-OQOXQGYD.js} +107 -90
- package/dist/{models-HEKUAXXK.js → models-3IK2Y5WE.js} +64 -65
- package/dist/{monitor-HKU57TYQ.js → monitor-FTJLTKCQ.js} +136 -101
- package/dist/{orchestrator-VDFAEFAI.js → orchestrator-N47O7SFD.js} +1442 -1671
- package/dist/{panes-DN2SSFOH.js → panes-7BTYH3XQ.js} +8 -8
- package/dist/{panes-TALGNPZT.js → panes-WPOMEMRH.js} +22 -23
- package/dist/{paths-NBMFAIEZ.js → paths-J3KN7UAO.js} +12 -13
- package/dist/preload-65U34NG6.js +115 -0
- package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
- package/dist/{reset-EAJFFJVB.js → reset-MUVQDLNL.js} +20 -21
- package/dist/{resources-OVKSEFVE.js → resources-LM76COAO.js} +41 -40
- package/dist/{run-7DP7ZF2J.js → run-3VFZQ33N.js} +168 -166
- package/dist/{share-WML67FT3.js → share-4JUB4BL7.js} +43 -43
- package/dist/{skills-SG662R2K.js → skills-S36AAJHU.js} +47 -47
- package/dist/{skills-eval-VVZEUU46.js → skills-eval-G6T57L7M.js} +127 -104
- package/dist/{skills-inventory-I2E23GET.js → skills-inventory-WLM46PJH.js} +41 -40
- package/dist/slash-commands-GBARG3Y7.js +91 -0
- package/dist/{steer-2LQOMCPB.js → steer-S7D7IKPU.js} +7 -7
- package/dist/{support-CC2UJBJ6.js → support-5VAEC32W.js} +14 -14
- package/dist/{targets-4QC3HIEW.js → targets-N5REUETU.js} +147 -98
- package/dist/tasks-6BVY5YZF.js +36 -0
- package/dist/{terminal-lease-TUHIJ6Y2.js → terminal-lease-57UEOJKS.js} +12 -11
- package/dist/tools-6OCQ6SVB.js +28 -0
- package/dist/{trace-FXMXUZUF.js → trace-JHLXWUMN.js} +18 -17
- package/dist/{tree-sitter-HGKH6LG4.js → tree-sitter-AQUUOSYM.js} +6 -6
- package/dist/{tui-primitives-K5PASC3O.js → tui-primitives-RCY2HN7G.js} +3 -3
- package/dist/{uninstall-5PEVOE5B.js → uninstall-FXYMFFRT.js} +19 -20
- package/dist/{upgrade-M4WXY6KN.js → upgrade-4HD5HAIV.js} +49 -45
- package/dist/{usage-N7ZNVLEM.js → usage-4GWM2WWP.js} +143 -103
- package/dist/{verifiers-DJTP4XX6.js → verifiers-GSKWKWVG.js} +162 -28
- package/dist/verify-3AS3ULCY.js +30 -0
- package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
- package/dist/{web-fetch-MPARV2K7.js → web-fetch-MQN4FH3X.js} +169 -18
- package/dist/wiki-generate-7BV7XWIY.js +614 -0
- package/dist/{with-panes-4GCGSL7J.js → with-panes-OFTNAR4Y.js} +34 -20
- package/dist/worker/entry.js +99 -85
- package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
- package/docs/README.md +10 -8
- package/docs/architecture/acp.md +27 -0
- package/docs/architecture/architecture.md +5 -5
- package/docs/architecture/artifact-versions.md +1 -1
- package/docs/architecture/context-engine.md +44 -59
- package/docs/architecture/context-working-set.md +7 -9
- package/docs/architecture/dispatch-architecture-rationale.md +1 -1
- package/docs/architecture/dispatch-typed-intent.md +1 -1
- package/docs/architecture/evidence-and-memory.md +11 -1
- package/docs/architecture/observability.md +7 -1
- package/docs/architecture/pi-boundary.md +37 -7
- package/docs/architecture/prompt-envelope-and-tools.md +22 -12
- package/docs/architecture/safety-model.md +10 -17
- package/docs/architecture/session-lifecycle.md +4 -4
- package/docs/architecture/tui-design.md +1 -1
- package/docs/architecture/worker-dispatch-mechanics.md +4 -0
- package/docs/guide/built-in-agents.md +8 -8
- package/docs/guide/commands-and-modes.md +66 -38
- package/docs/guide/configuration-and-targets.md +10 -3
- package/docs/guide/configuration-reference.md +23 -8
- package/docs/guide/environment-variables.md +8 -4
- package/docs/guide/fleet-dispatch.md +12 -0
- package/docs/guide/installation-and-lifecycle.md +35 -9
- package/docs/guide/proactive-memory.md +1 -1
- package/docs/guide/skills-marketplace.md +11 -3
- package/docs/guide/tool-usage.md +87 -5
- package/docs/history/config-knobs-audit.md +2 -2
- package/docs/process/development-pipeline.md +15 -10
- package/docs/process/documentation-guide.md +2 -2
- package/docs/process/eval-runner.md +15 -0
- package/docs/process/evals-internal.md +1 -1
- package/docs/process/git-commit-provenance.md +15 -0
- package/docs/process/release-cut-checklist.md +207 -0
- package/docs/process/scientific-validation.md +18 -17
- package/evals/README.md +4 -0
- package/evals/behavioral-corpus-grader.mjs +147 -14
- package/evals/behavioral-machinery-support.ts +1 -0
- package/evals/behavioral-machinery.yaml +1 -1
- package/evals/behavioral-model-negative-control.yaml +1 -0
- package/evals/behavioral-model.yaml +266 -1
- package/evals/fixtures/docs-retrieval.json +102 -0
- package/evals/fixtures/scalar-decision.json +17 -0
- package/evals/fixtures/scout-citation-pipeline.json +55 -0
- package/evals/fixtures/source-explanation.json +74 -0
- package/evals/fixtures/tool-arguments.json +18 -0
- package/evals/fixtures/tool-surface/read.txt +4 -0
- package/evals/fixtures/tool-surface/subdir/keep.txt +1 -0
- package/evals/no-edit-memory-grader.mjs +149 -0
- package/evals/scalar-decision-grader.py +41 -0
- package/evals/scalar-decision-machinery.ts +145 -0
- package/evals/source-explanation-grader.mjs +118 -0
- package/evals/tool-surface-grader.mjs +53 -0
- package/evals/tool-surface-model.yaml +274 -0
- package/package.json +14 -14
- package/skills/README.md +6 -6
- package/skills/coding/coding-standards/SKILL.md +14 -4
- package/skills/context/context-handoff/SKILL.md +3 -3
- package/skills/context/context-prime/SKILL.md +3 -3
- package/skills/planning/architecture/SKILL.md +5 -5
- package/skills/planning/backlog/SKILL.md +4 -4
- package/skills/planning/prd/SKILL.md +4 -3
- package/skills/planning/product-intent/SKILL.md +8 -8
- package/skills/planning/tech-spec/SKILL.md +4 -4
- package/skills/registry.yaml +33 -33
- package/skills/research/arxiv-literature/SKILL.md +3 -3
- package/skills/research/experiment-protocol/SKILL.md +3 -3
- package/skills/research/scientific-debugging/SKILL.md +3 -2
- package/skills/research/scientific-modernization/SKILL.md +3 -3
- package/skills/skill-marketplace.json +17 -17
- package/skills/workflow/cut-it/SKILL.md +3 -4
- package/skills/workflow/design-council/SKILL.md +5 -10
- package/skills/workflow/grill-me/SKILL.md +14 -15
- package/skills/workflow/workflow-distiller/SKILL.md +4 -4
- package/src/cli/args.ts +0 -8
- package/src/cli/bootstrap-generate.ts +6 -0
- package/src/cli/config-inspect.ts +24 -7
- package/src/cli/config-trust.ts +62 -0
- package/src/cli/config.ts +8 -0
- package/src/cli/configure.ts +2 -1
- package/src/cli/context-map.ts +75 -14
- package/src/cli/context.ts +46 -17
- package/src/cli/doctor-state-size.ts +1 -12
- package/src/cli/doctor-validation-contract.ts +28 -0
- package/src/cli/doctor.ts +5 -0
- package/src/cli/eval.ts +17 -3
- package/src/cli/evidence-detail.ts +1 -75
- package/src/cli/evidence-inventory.ts +1 -167
- package/src/cli/index.ts +2 -0
- package/src/cli/modes/print.ts +32 -4
- package/src/cli/run.ts +16 -16
- package/src/cli/skills-eval.ts +10 -8
- package/src/cli/steer-channel.ts +31 -18
- package/src/cli/targets.ts +84 -32
- package/src/cli/tasks.ts +93 -0
- package/src/cli/upgrade.ts +19 -11
- package/src/cli/usage.ts +30 -0
- package/src/cli/verifiers.ts +147 -1
- package/src/cli/wiki-generate.ts +240 -96
- package/src/core/bash-exec.ts +43 -15
- package/src/core/bus-events.ts +15 -0
- package/src/core/commit-attribution.ts +41 -1
- package/src/core/config.ts +33 -14
- package/src/core/defaults.ts +5 -4
- package/src/core/file-references.ts +11 -1
- package/src/core/git-commit-attribution.ts +46 -3
- package/src/core/incomplete-installation.ts +3 -1
- package/src/core/run-overrides.ts +0 -5
- package/src/core/settings-layers.ts +21 -5
- package/src/core/skill-activation.ts +3 -0
- package/src/core/termination.ts +26 -9
- package/src/core/tool-names.ts +5 -2
- package/src/core/untrusted-content.ts +16 -0
- package/src/core/workspace-trust.ts +179 -0
- package/src/domains/agents/builtins/architect.md +1 -1
- package/src/domains/agents/builtins/coder.md +5 -3
- package/src/domains/agents/builtins/context-bootstrap.md +3 -1
- package/src/domains/agents/builtins/documenter.md +8 -5
- package/src/domains/agents/builtins/git-master.md +1 -1
- package/src/domains/agents/builtins/provenance.md +7 -7
- package/src/domains/agents/builtins/researcher.md +1 -0
- package/src/domains/agents/builtins/scout.md +7 -1
- package/src/domains/agents/builtins/tester.md +1 -1
- package/src/domains/agents/builtins/verifier.md +2 -2
- package/src/domains/agents/builtins/wiki-writer.md +4 -3
- package/src/domains/agents/result-contract.ts +199 -26
- package/src/domains/context/bootstrap-prompt.ts +11 -9
- package/src/domains/context/bootstrap.ts +74 -39
- package/src/domains/context/clio-md.ts +88 -26
- package/src/domains/context/codewiki/build-operation.ts +121 -0
- package/src/domains/context/codewiki/build-worker-protocol.ts +37 -3
- package/src/domains/context/codewiki/build-worker.ts +3 -35
- package/src/domains/context/codewiki/coordinator.ts +36 -6
- package/src/domains/context/codewiki/indexer.ts +59 -19
- package/src/domains/context/contract.ts +6 -2
- package/src/domains/context/extension.ts +97 -11
- package/src/domains/context/fingerprint.ts +39 -34
- package/src/domains/context/index.ts +7 -1
- package/src/domains/context/prompt-context.ts +55 -14
- package/src/domains/context/refresh.ts +12 -57
- package/src/domains/context/wiki/assemble.ts +14 -10
- package/src/domains/context/wiki/evidence.ts +209 -0
- package/src/domains/context/wiki/frontmatter.ts +5 -2
- package/src/domains/context/wiki/generate.ts +207 -67
- package/src/domains/context/wiki/meta.ts +10 -2
- package/src/domains/context/wiki/plan-store.ts +70 -14
- package/src/domains/context/wiki/plan.ts +71 -14
- package/src/domains/context/wiki/prompts.ts +85 -1
- package/src/domains/context/wiki/source-content.ts +106 -0
- package/src/domains/context/wiki/staleness.ts +33 -22
- package/src/domains/context/working-set/contract.ts +8 -2
- package/src/domains/context/working-set/engine.ts +17 -4
- package/src/domains/context/working-set/fold.ts +15 -2
- package/src/domains/context/working-set/marker.ts +2 -1
- package/src/domains/context/working-set/project.ts +18 -7
- package/src/domains/context/working-set/recall.ts +82 -56
- package/src/domains/dispatch/active-route-planner.ts +10 -3
- package/src/domains/dispatch/admission-queue.ts +19 -7
- package/src/domains/dispatch/admission.ts +3 -3
- package/src/domains/dispatch/budget-envelope.ts +47 -82
- package/src/domains/dispatch/capacity-lease.ts +57 -19
- package/src/domains/dispatch/code-step.ts +11 -4
- package/src/domains/dispatch/contract.ts +41 -9
- package/src/domains/dispatch/event-pump.ts +28 -7
- package/src/domains/dispatch/execution-role.ts +49 -2
- package/src/domains/dispatch/execution-scheduler.ts +4 -0
- package/src/domains/dispatch/extension.ts +240 -132
- package/src/domains/dispatch/fleet-commit-attribution.ts +5 -0
- package/src/domains/dispatch/fleet-run.ts +21 -0
- package/src/domains/dispatch/gate-role-prompts.ts +4 -2
- package/src/domains/dispatch/host-verification.ts +114 -13
- package/src/domains/dispatch/intent.ts +28 -18
- package/src/domains/dispatch/orphan-recovery.ts +2 -0
- package/src/domains/dispatch/parallel-writers.ts +34 -0
- package/src/domains/dispatch/receipt-integrity.ts +4 -0
- package/src/domains/dispatch/reservation-store.ts +13 -37
- package/src/domains/dispatch/route-approval.ts +3 -3
- package/src/domains/dispatch/route-observer.ts +4 -2
- package/src/domains/dispatch/route-quality.ts +6 -1
- package/src/domains/dispatch/state.ts +15 -2
- package/src/domains/dispatch/types.ts +21 -5
- package/src/domains/dispatch/worker-spawn.ts +58 -21
- package/src/domains/dispatch/workspace-checkpoint.ts +57 -0
- package/src/domains/eval/compare/behavioral.ts +81 -14
- package/src/domains/eval/compare/compare.ts +15 -5
- package/src/domains/eval/compare/envelope.ts +12 -5
- package/src/domains/eval/metrics/context.ts +24 -1
- package/src/domains/eval/metrics/tracked.ts +4 -28
- package/src/domains/eval/reports/comparison.ts +9 -9
- package/src/domains/eval/runners/clio-run.ts +17 -10
- package/src/domains/eval/runners/context-index.ts +2 -7
- package/src/domains/eval/runners/context-init.ts +3 -6
- package/src/domains/eval/runners/external-command.ts +29 -11
- package/src/domains/eval/schema/suite.ts +2 -0
- package/src/domains/eval/schema/validate.ts +1 -0
- package/src/domains/eval/suites/run.ts +189 -13
- package/src/domains/eval/verifiers/integrity.ts +39 -0
- package/src/domains/eval/verifiers/patch.ts +58 -2
- package/src/domains/eval/workspaces/temp-copy.ts +3 -0
- package/src/domains/evidence/build.ts +106 -17
- package/src/domains/evidence/detail.ts +69 -0
- package/src/domains/evidence/eval.ts +13 -1
- package/src/domains/evidence/finish-contract-map.ts +5 -1
- package/src/domains/evidence/inventory.ts +167 -0
- package/src/domains/evidence/store.ts +16 -0
- package/src/domains/evidence/types.ts +12 -0
- package/src/domains/extensions/resources.ts +7 -0
- package/src/domains/interop/registry.ts +2 -2
- package/src/domains/middleware/hooks-io.ts +45 -26
- package/src/domains/middleware/hooks.ts +6 -0
- package/src/domains/middleware/injection-screen.ts +23 -0
- package/src/domains/middleware/marketplace-offer.ts +20 -1
- package/src/domains/middleware/rules.ts +5 -1
- package/src/domains/middleware/runtime.ts +7 -3
- package/src/domains/middleware/stalled-turn.ts +18 -3
- package/src/domains/middleware/task-board-reminder.ts +4 -2
- package/src/domains/middleware/task-nudge.ts +4 -1
- package/src/domains/mux/contract.ts +34 -1
- package/src/domains/mux/detect.ts +3 -6
- package/src/domains/mux/dock-controller.ts +8 -1
- package/src/domains/mux/index.ts +1 -0
- package/src/domains/mux/socket-client.ts +13 -3
- package/src/domains/observability/accountability.ts +15 -1
- package/src/domains/observability/contract.ts +54 -9
- package/src/domains/observability/evidence-index.ts +10 -0
- package/src/domains/observability/extension.ts +9 -5
- package/src/domains/observability/projection.ts +423 -53
- package/src/{interactive → domains/observability}/worker-progress.ts +3 -3
- package/src/domains/prompts/compiler.ts +10 -2
- package/src/domains/prompts/contract.ts +7 -4
- package/src/domains/prompts/extension.ts +28 -64
- package/src/domains/prompts/fragments/identity/clio.md +23 -0
- package/src/domains/prompts/fragments/operating/contract.md +12 -0
- package/src/domains/prompts/fragments/operating/delegation.md +5 -0
- package/src/domains/prompts/fragments/wiki/page.md +36 -15
- package/src/domains/prompts/fragments/wiki/plan.md +4 -4
- package/src/domains/prompts/preload-prefix.ts +31 -0
- package/src/domains/prompts/preload.ts +135 -61
- package/src/domains/providers/auth/backend-file.ts +15 -11
- package/src/domains/providers/auth/storage.ts +3 -5
- package/src/domains/providers/catalog.ts +18 -3
- package/src/domains/providers/model-discovery.ts +1 -4
- package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +16 -14
- package/src/domains/providers/runtime-resolution.ts +11 -9
- package/src/domains/providers/runtimes/claude/claude-code.ts +9 -0
- package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
- package/src/domains/providers/support.ts +1 -1
- package/src/domains/providers/types/runtime-descriptor.ts +1 -1
- package/src/domains/resources/skills/promotion.ts +8 -1
- package/src/domains/safety/action-classifier.ts +16 -0
- package/src/domains/safety/autonomy.ts +10 -1
- package/src/domains/safety/contract.ts +5 -1
- package/src/domains/safety/default-path-policy.ts +13 -0
- package/src/domains/safety/extension.ts +11 -2
- package/src/domains/safety/finish-contract-registration.ts +29 -14
- package/src/domains/safety/finish-contract.ts +252 -40
- package/src/domains/safety/index.ts +20 -1
- package/src/domains/safety/policy-engine.ts +211 -34
- package/src/domains/safety/project-policy.ts +7 -2
- package/src/domains/safety/rigor.ts +53 -39
- package/src/domains/safety/validation-contract.ts +388 -0
- package/src/domains/safety/workspace-trust.ts +43 -0
- package/src/domains/session/archive-readers.ts +10 -1
- package/src/domains/session/compaction/compact.ts +384 -21
- package/src/domains/session/compaction/cut-point.ts +42 -5
- package/src/domains/session/compaction/tokens.ts +9 -1
- package/src/domains/session/decision-board.ts +137 -28
- package/src/domains/session/entries.ts +213 -11
- package/src/domains/session/extension.ts +4 -4
- package/src/domains/session/handoff.ts +2 -1
- package/src/domains/session/manager.ts +2 -3
- package/src/domains/session/prompt-manifest.ts +47 -8
- package/src/domains/session/task-board.ts +32 -1
- package/src/domains/session/tree/fork.ts +1 -2
- package/src/domains/session/tree/navigator.ts +1 -1
- package/src/domains/user-tasks/acceptance.ts +56 -0
- package/src/domains/user-tasks/active-acceptance.ts +40 -0
- package/src/domains/user-tasks/handoff.ts +16 -0
- package/src/domains/user-tasks/store.ts +34 -3
- package/src/engine/acp/adapter.ts +60 -10
- package/src/engine/acp/server.ts +22 -4
- package/src/engine/acp/transport.ts +55 -9
- package/src/engine/acp/types.ts +9 -0
- package/src/engine/antigravity/subprocess-runtime.ts +20 -4
- package/src/engine/api-registry.ts +19 -2
- package/src/engine/apis/ollama-native.ts +15 -0
- package/src/engine/apis/openai-completions.ts +13 -6
- package/src/engine/apis/output-budget.ts +26 -10
- package/src/engine/claude/sdk-runtime.ts +4 -3
- package/src/engine/claude/subprocess-runtime.ts +107 -60
- package/src/engine/env-api-keys.ts +2 -1
- package/src/engine/external-subprocess.ts +26 -7
- package/src/engine/loop-guard.ts +19 -2
- package/src/engine/provider-diagnostics.ts +129 -0
- package/src/engine/provider-payload.ts +3 -1
- package/src/engine/worker-runtime.ts +13 -2
- package/src/engine/worker-tools.ts +5 -1
- package/src/entry/extension-reload.ts +1 -0
- package/src/entry/orchestrator.ts +64 -17
- package/src/interactive/chat-loop-messages.ts +12 -4
- package/src/interactive/chat-loop.ts +115 -45
- package/src/interactive/chat-renderer.ts +60 -0
- package/src/interactive/context-recall-command.ts +2 -1
- package/src/interactive/dispatch-board.ts +58 -714
- package/src/interactive/editor-submit.ts +13 -0
- package/src/interactive/fleet-run-preview.ts +2 -1
- package/src/interactive/interactive-application.ts +11 -4
- package/src/interactive/interactive-event-projection.ts +7 -1
- package/src/interactive/interactive-presentation.ts +63 -12
- package/src/interactive/interactive-slash-runtime.ts +4 -1
- package/src/interactive/layout.ts +2 -1
- package/src/interactive/model-session-replay.ts +2 -2
- package/src/interactive/oracle.ts +5 -2
- package/src/interactive/overlay-frame.ts +1 -0
- package/src/interactive/overlay-general-openers.ts +3 -1
- package/src/interactive/overlay-session-lifecycle.ts +6 -0
- package/src/interactive/overlays/ask-user.ts +1 -0
- package/src/interactive/overlays/fleet-run-approval.ts +3 -2
- package/src/interactive/overlays/message-picker.ts +3 -3
- package/src/interactive/overlays/settings.ts +2 -2
- package/src/interactive/overlays/tree-selector.ts +2 -2
- package/src/interactive/renderers/branch-summary.ts +1 -1
- package/src/interactive/renderers/tool-execution.ts +17 -1
- package/src/interactive/renderers/worker-entry.ts +25 -10
- package/src/interactive/slash-autocomplete.ts +4 -6
- package/src/interactive/slash-commands.ts +31 -43
- package/src/interactive/slash-spec.ts +28 -0
- package/src/interactive/turn-context.ts +221 -53
- package/src/interactive/turn-middleware.ts +3 -1
- package/src/interactive/turn-persistence.ts +3 -0
- package/src/interactive/turn-runtime.ts +11 -2
- package/src/interactive/turn-state.ts +10 -9
- package/src/interactive/view/artifacts.ts +2 -0
- package/src/interactive/watch-pane.ts +18 -4
- package/src/interactive/worker-stream.ts +14 -10
- package/src/tools/agent-tools.ts +6 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/bootstrap.ts +4 -0
- package/src/tools/builtin-tool-catalog.ts +40 -2
- package/src/tools/codewiki/code-nav.ts +4 -10
- package/src/tools/compete-judge-task.ts +71 -0
- package/src/tools/compete-worktrees.ts +41 -1
- package/src/tools/context/index.ts +32 -7
- package/src/tools/context/surface.ts +15 -4
- package/src/tools/core-bootstrap.ts +16 -0
- package/src/tools/decide.ts +136 -0
- package/src/tools/dispatch-admission.ts +33 -1
- package/src/tools/dispatch-arguments.ts +38 -1
- package/src/tools/dispatch-plan.ts +12 -9
- package/src/tools/dispatch-runner.ts +63 -33
- package/src/tools/dispatch-schema.ts +30 -23
- package/src/tools/dispatch-scout-admission.ts +10 -44
- package/src/tools/dispatch-scout.ts +2 -3
- package/src/tools/dispatch-types.ts +6 -0
- package/src/tools/evidence.ts +96 -0
- package/src/tools/find.ts +13 -4
- package/src/tools/grep.ts +13 -1
- package/src/tools/limitation.ts +76 -0
- package/src/tools/ls.ts +7 -1
- package/src/tools/monitor.ts +26 -11
- package/src/tools/network-policy.ts +11 -24
- package/src/tools/observation.ts +39 -2
- package/src/tools/policy.ts +9 -0
- package/src/tools/presentation.ts +3 -0
- package/src/tools/read.ts +112 -15
- package/src/tools/registry.ts +55 -18
- package/src/tools/result-shaping.ts +127 -7
- package/src/tools/task-worktree.ts +13 -3
- package/src/tools/tasks.ts +40 -5
- package/src/tools/verify/authoring.ts +170 -83
- package/src/tools/verify/catalog.ts +122 -5
- package/src/tools/verify/frontend.ts +67 -30
- package/src/tools/verify/index.ts +2 -1
- package/src/tools/verify/numeric.ts +303 -0
- package/src/tools/verify/perf.ts +143 -0
- package/src/tools/verify/scripts.ts +229 -2
- package/src/tools/web-fetch-network.ts +179 -0
- package/src/tools/web-fetch-surface.ts +2 -1
- package/src/tools/web-fetch.ts +15 -13
- package/src/tools/worker-evidence.ts +27 -0
- package/src/worker/spec-contract.ts +12 -8
- package/dist/builtins-IA7V7FUC.js +0 -22
- package/dist/chunk-2WZ546HR.js +0 -792
- package/dist/chunk-5PSMVOLM.js +0 -56
- package/dist/chunk-7DICMOS6.js +0 -313
- package/dist/chunk-BEPZRGGU.js +0 -1560
- package/dist/chunk-JVCV3ICN.js +0 -47
- package/dist/chunk-KK4JZPBQ.js +0 -3982
- package/dist/chunk-MNJGS2IN.js +0 -33
- package/dist/chunk-NDINPTJ4.js +0 -641
- package/dist/chunk-O5CVSAG5.js +0 -122
- package/dist/chunk-OQE5J4C6.js +0 -73
- package/dist/chunk-RVG5JXAL.js +0 -41
- package/dist/chunk-T56WDKA5.js +0 -183
- package/dist/chunk-UUVG37B4.js +0 -244
- package/dist/chunk-VPKWYKEY.js +0 -169
- package/dist/chunk-Y3CBHOR6.js +0 -228
- package/dist/clio-CMMK4KRR.js +0 -25
- package/dist/configure-LE3IK2TJ.js +0 -56
- package/dist/context-clear-BW4O37TG.js +0 -176
- package/dist/fleet-view-SWBR3VGQ.js +0 -97
- package/dist/preload-P6DGH2PZ.js +0 -13
- package/dist/slash-commands-S7MBJDQK.js +0 -83
- package/dist/tools-TFGJICCU.js +0 -29
- package/dist/verify-RWE4PPEK.js +0 -27
- package/dist/wiki-generate-C7IQOXSP.js +0 -469
|
@@ -14,21 +14,26 @@ import {
|
|
|
14
14
|
} from "node:fs";
|
|
15
15
|
import { dirname, join } from "node:path";
|
|
16
16
|
import type { ContextActivityPayload } from "../../../core/bus-events.js";
|
|
17
|
+
import type { DecisionLedgerEntry } from "../../session/entries.js";
|
|
17
18
|
import { detectProjectType } from "../../session/workspace/project-type.js";
|
|
18
19
|
import type { BootstrapProgressSink } from "../bootstrap.js";
|
|
19
20
|
import { coordinateCodewikiWrite } from "../codewiki/coordinator.js";
|
|
20
21
|
import type { Codewiki } from "../codewiki/schema.js";
|
|
21
22
|
import type { Fingerprint } from "../fingerprint.js";
|
|
22
23
|
import { readClioState, writeClioState } from "../state.js";
|
|
23
|
-
import { assembleWikiTree,
|
|
24
|
+
import { assembleWikiTree, pageSourceIndex } from "./assemble.js";
|
|
25
|
+
import { inspectWikiPageEvidence } from "./evidence.js";
|
|
24
26
|
import { isGeneratedWikiFile, listWikiPagesInDir, WIKI_PLAN_FILE, wikiDir, wikiMarkdownFilesInDir } from "./layout.js";
|
|
25
27
|
import {
|
|
26
28
|
computeWikiContentHash,
|
|
27
29
|
computeWikiContentHashOfDir,
|
|
28
30
|
currentWikiGitHead,
|
|
29
31
|
readWikiMeta,
|
|
32
|
+
readWikiMetaInDir,
|
|
33
|
+
type WikiMeta,
|
|
30
34
|
wikiMetaPath,
|
|
31
35
|
writeWikiMeta,
|
|
36
|
+
writeWikiMetaInDir,
|
|
32
37
|
} from "./meta.js";
|
|
33
38
|
import {
|
|
34
39
|
planWikiGeneration,
|
|
@@ -37,13 +42,16 @@ import {
|
|
|
37
42
|
type WikiPlan,
|
|
38
43
|
type WikiPlanPage,
|
|
39
44
|
} from "./plan.js";
|
|
40
|
-
import { readWikiPlanFile,
|
|
45
|
+
import { readWikiPlanFile, unclaimedCandidates, writeWikiPlanFile } from "./plan-store.js";
|
|
41
46
|
import type { WikiGenerateMode } from "./prompts.js";
|
|
47
|
+
import { captureWikiSourceContent, type WikiSourceContent, wikiSourcesMatch } from "./source-content.js";
|
|
42
48
|
import { changedPathsSince } from "./staleness.js";
|
|
43
49
|
|
|
44
50
|
export type { WikiDepth, WikiGenerateMode };
|
|
45
51
|
|
|
46
52
|
export interface WikiGenerateInput {
|
|
53
|
+
/** The current session board, already scoped to its active branch. */
|
|
54
|
+
decisions?: ReadonlyArray<DecisionLedgerEntry>;
|
|
47
55
|
cwd: string;
|
|
48
56
|
mode: WikiGenerateMode;
|
|
49
57
|
/**
|
|
@@ -67,6 +75,8 @@ export interface WikiGenerateInput {
|
|
|
67
75
|
* paths.
|
|
68
76
|
*/
|
|
69
77
|
resumed: boolean;
|
|
78
|
+
/** Operator-requested retry of pending work, including exhausted writers, once this run. */
|
|
79
|
+
retryPending?: boolean;
|
|
70
80
|
/** Indexed areas no existing page covers, offered to a planning pass. */
|
|
71
81
|
unclaimedAreas: ReadonlyArray<WikiPlanPage>;
|
|
72
82
|
gitHead?: string | null;
|
|
@@ -76,10 +86,14 @@ export interface WikiGenerateInput {
|
|
|
76
86
|
export type WikiGenerate = (input: WikiGenerateInput) => void | Promise<void>;
|
|
77
87
|
|
|
78
88
|
export interface RunWikiGenerateInput {
|
|
89
|
+
/** The current session board, already scoped to its active branch. */
|
|
90
|
+
decisions?: ReadonlyArray<DecisionLedgerEntry>;
|
|
79
91
|
cwd?: string;
|
|
80
92
|
mode?: WikiGenerateMode;
|
|
81
93
|
/** Repository-detail policy. Auto scales decomposition from indexed files and lines. */
|
|
82
94
|
depth?: WikiDepth;
|
|
95
|
+
/** Resume the existing plan, allowing exhausted pending writers one more attempt. */
|
|
96
|
+
retryPending?: boolean;
|
|
83
97
|
model: string;
|
|
84
98
|
generate?: WikiGenerate;
|
|
85
99
|
onProgress?: BootstrapProgressSink;
|
|
@@ -294,13 +308,29 @@ function adoptOrCreateStaging(cwd: string): { dir: string; adopted: boolean } {
|
|
|
294
308
|
|
|
295
309
|
type PromoteResult = { ok: true } | { ok: false; problems: string[] };
|
|
296
310
|
|
|
297
|
-
/**
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
311
|
+
/** Resolve a previous process crash before reading metadata or cleaning staging. */
|
|
312
|
+
function recoverPublication(cwd: string): void {
|
|
313
|
+
const wiki = wikiDir(cwd);
|
|
314
|
+
const prev = join(clioDir(cwd), WIKI_PREV_DIR);
|
|
315
|
+
if (!existsSync(prev)) return;
|
|
316
|
+
const valid = (dir: string): boolean => {
|
|
317
|
+
const meta = readWikiMetaInDir(dir);
|
|
318
|
+
return meta !== null && meta.contentHash === computeWikiContentHashOfDir(dir);
|
|
319
|
+
};
|
|
320
|
+
if (valid(wiki)) {
|
|
321
|
+
removeDir(prev);
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
if (!valid(prev)) throw new Error(`wiki recovery requires a valid publication; preserved ${wiki} and ${prev}`);
|
|
325
|
+
if (existsSync(wiki)) {
|
|
326
|
+
const interrupted = mkdtempSync(join(clioDir(cwd), "wiki-interrupted-"));
|
|
327
|
+
renameSync(wiki, join(interrupted, "wiki"));
|
|
328
|
+
}
|
|
329
|
+
renameSync(prev, wiki);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/** Promote a prepared content/metadata pair; restore the old pair on rename failure. */
|
|
333
|
+
function promoteStaging(cwd: string, stagingDir: string): PromoteResult {
|
|
304
334
|
const wiki = wikiDir(cwd);
|
|
305
335
|
const prev = join(clioDir(cwd), WIKI_PREV_DIR);
|
|
306
336
|
removeDir(prev);
|
|
@@ -308,7 +338,6 @@ function promoteStaging(cwd: string, stagingDir: string, writeMeta: () => void):
|
|
|
308
338
|
if (hadWiki) renameSync(wiki, prev);
|
|
309
339
|
try {
|
|
310
340
|
renameSync(stagingDir, wiki);
|
|
311
|
-
writeMeta();
|
|
312
341
|
} catch (err) {
|
|
313
342
|
const problems = [`wiki promotion failed: ${err instanceof Error ? err.message : String(err)}`];
|
|
314
343
|
removeDir(stagingDir);
|
|
@@ -332,9 +361,9 @@ function promoteStaging(cwd: string, stagingDir: string, writeMeta: () => void):
|
|
|
332
361
|
* interrupted run, then the plan the last promoted wiki recorded, then the
|
|
333
362
|
* candidate skeleton the index just produced.
|
|
334
363
|
*
|
|
335
|
-
* A resumed plan
|
|
336
|
-
*
|
|
337
|
-
*
|
|
364
|
+
* A resumed plan retains its structure because finished pages link to its
|
|
365
|
+
* paths. Completed dispatches are reusable only when the checkpoint source
|
|
366
|
+
* content matches; missing or changed evidence requeues the pages. Areas the index has since found that no
|
|
338
367
|
* page covers are carried separately and offered to a planning pass, which is
|
|
339
368
|
* the only thing allowed to change a plan's shape.
|
|
340
369
|
*/
|
|
@@ -345,24 +374,60 @@ function resolvePlan(input: {
|
|
|
345
374
|
mode: WikiGenerateMode;
|
|
346
375
|
candidate: WikiPlan;
|
|
347
376
|
previousPlan: WikiPlan | undefined;
|
|
377
|
+
sourceContent: WikiSourceContent;
|
|
348
378
|
gitHead: string | null;
|
|
349
379
|
}): { plan: WikiPlan; resumed: boolean; unclaimedAreas: WikiPlanPage[] } {
|
|
350
380
|
const staged = input.adopted ? readWikiPlanFile(input.stagingDir) : null;
|
|
351
|
-
|
|
352
|
-
if (
|
|
381
|
+
const previous = staged ?? (input.mode === "update" ? input.previousPlan : undefined);
|
|
382
|
+
if (previous) {
|
|
353
383
|
const pageSources = pageSourceIndex(input.stagingDir, input.cwd);
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
384
|
+
// A partial first publication has no whole-wiki Git certification yet.
|
|
385
|
+
// Its completed pages still have the harness-captured plan baseline.
|
|
386
|
+
const partialHead =
|
|
387
|
+
input.gitHead === null && previous.pages.some((page) => page.status !== "written")
|
|
388
|
+
? previous.sourceGitHead
|
|
389
|
+
: undefined;
|
|
390
|
+
const gitAvailable = changedPathsSince(input.cwd, staged?.sourceGitHead ?? partialHead ?? input.gitHead) !== null;
|
|
391
|
+
const existing = new Set(wikiMarkdownFilesInDir(input.stagingDir));
|
|
392
|
+
const plan = {
|
|
393
|
+
...previous,
|
|
394
|
+
pages: previous.pages.map((page) => {
|
|
395
|
+
if (page.status !== "written") return page;
|
|
396
|
+
const evidence = inspectWikiPageEvidence({
|
|
397
|
+
pagePath: page.path,
|
|
398
|
+
outputDir: input.stagingDir,
|
|
399
|
+
sourceRoot: input.cwd,
|
|
400
|
+
});
|
|
401
|
+
const sources = [
|
|
402
|
+
...page.sources,
|
|
403
|
+
...(page.dependencies ?? []),
|
|
404
|
+
...(pageSources.get(page.path) ?? []),
|
|
405
|
+
...(evidence.dependencies ?? []),
|
|
406
|
+
];
|
|
407
|
+
return gitAvailable &&
|
|
408
|
+
existing.has(page.path) &&
|
|
409
|
+
evidence.ok &&
|
|
410
|
+
wikiSourcesMatch(previous.sourceContent, input.sourceContent, sources)
|
|
411
|
+
? { ...page, dependencies: evidence.dependencies ?? [] }
|
|
412
|
+
: {
|
|
413
|
+
...page,
|
|
414
|
+
status: "pending" as const,
|
|
415
|
+
attempts: 0,
|
|
416
|
+
...(!evidence.ok
|
|
417
|
+
? {
|
|
418
|
+
lastFailure: {
|
|
419
|
+
phase: "validation" as const,
|
|
420
|
+
detail: `saved page evidence check failed: ${evidence.reasons.join("; ")}`.slice(0, 500),
|
|
421
|
+
},
|
|
422
|
+
}
|
|
423
|
+
: {}),
|
|
424
|
+
};
|
|
363
425
|
}),
|
|
364
|
-
|
|
365
|
-
|
|
426
|
+
};
|
|
427
|
+
return {
|
|
428
|
+
plan,
|
|
429
|
+
resumed: staged !== null,
|
|
430
|
+
unclaimedAreas: staged ? [] : unclaimedCandidates(previous, input.candidate, pageSources),
|
|
366
431
|
};
|
|
367
432
|
}
|
|
368
433
|
return { plan: input.candidate, resumed: false, unclaimedAreas: [] };
|
|
@@ -371,9 +436,9 @@ function resolvePlan(input: {
|
|
|
371
436
|
/**
|
|
372
437
|
* Reconcile the plan against the tree that actually exists. A page whose file
|
|
373
438
|
* the assembly pass dropped, or that was never written, is owed again; a page
|
|
374
|
-
* on disk
|
|
375
|
-
*
|
|
376
|
-
*
|
|
439
|
+
* on disk retains its recorded dispatch outcome. A page
|
|
440
|
+
* created by a writer without a plan entry remains available and is adopted
|
|
441
|
+
* pending: its own completed dispatch has not yet been recorded.
|
|
377
442
|
*/
|
|
378
443
|
function reconcilePlan(plan: WikiPlan, stagingDir: string): WikiPlan {
|
|
379
444
|
const contentFiles = wikiMarkdownFilesInDir(stagingDir).filter((relPath) => !isGeneratedWikiFile(relPath));
|
|
@@ -386,15 +451,13 @@ function reconcilePlan(plan: WikiPlan, stagingDir: string): WikiPlan {
|
|
|
386
451
|
title: relPath.replace(/\.md$/, ""),
|
|
387
452
|
intent: "",
|
|
388
453
|
sources: [],
|
|
389
|
-
status: "
|
|
390
|
-
attempts:
|
|
454
|
+
status: "pending" as const,
|
|
455
|
+
attempts: 0,
|
|
391
456
|
}));
|
|
392
457
|
return {
|
|
393
458
|
...plan,
|
|
394
459
|
pages: [
|
|
395
|
-
...plan.pages.map((page) =>
|
|
396
|
-
onDisk.has(page.path) ? { ...page, status: "written" as const } : { ...page, status: "pending" as const },
|
|
397
|
-
),
|
|
460
|
+
...plan.pages.map((page) => (onDisk.has(page.path) ? page : { ...page, status: "pending" as const })),
|
|
398
461
|
...adopted,
|
|
399
462
|
],
|
|
400
463
|
};
|
|
@@ -404,8 +467,6 @@ export async function runWikiGenerate(
|
|
|
404
467
|
input: RunWikiGenerateInput = { model: "configured-clio-target" },
|
|
405
468
|
): Promise<RunWikiGenerateResult> {
|
|
406
469
|
const cwd = input.cwd ?? process.cwd();
|
|
407
|
-
const existingMeta = readWikiMeta(cwd);
|
|
408
|
-
const mode = input.mode ?? (existingMeta ? "update" : "init");
|
|
409
470
|
|
|
410
471
|
const lock = acquireWikiLock(cwd);
|
|
411
472
|
if (!lock.ok) {
|
|
@@ -415,10 +476,12 @@ export async function runWikiGenerate(
|
|
|
415
476
|
}
|
|
416
477
|
|
|
417
478
|
try {
|
|
479
|
+
recoverPublication(cwd);
|
|
480
|
+
const existingMeta = readWikiMeta(cwd);
|
|
481
|
+
const mode = input.mode ?? (existingMeta ? "update" : "init");
|
|
418
482
|
progress(input, { phase: "codewiki", status: "started", message: "loading codewiki for wiki generation" });
|
|
419
483
|
const { codewiki, fingerprint } = await loadOrBuildCodewiki(cwd);
|
|
420
484
|
const sourceTreeHash = fingerprint.treeHash;
|
|
421
|
-
const generation = planWikiGeneration(codewiki, input.depth ?? "auto");
|
|
422
485
|
progress(input, {
|
|
423
486
|
phase: "codewiki",
|
|
424
487
|
status: "completed",
|
|
@@ -428,6 +491,27 @@ export async function runWikiGenerate(
|
|
|
428
491
|
});
|
|
429
492
|
|
|
430
493
|
const staging = adoptOrCreateStaging(cwd);
|
|
494
|
+
const stagedPlan = staging.adopted ? readWikiPlanFile(staging.dir) : null;
|
|
495
|
+
const savedPlan = stagedPlan ?? (mode === "update" ? existingMeta?.plan : undefined);
|
|
496
|
+
const savedDepth = savedPlan?.depth ?? existingMeta?.generation?.depth;
|
|
497
|
+
const continuing = Boolean(
|
|
498
|
+
stagedPlan || input.retryPending || savedPlan?.pages.some((page) => page.status !== "written"),
|
|
499
|
+
);
|
|
500
|
+
const requestedDepth = input.depth ?? savedPlan?.requestedDepth ?? existingMeta?.generation?.requestedDepth ?? "auto";
|
|
501
|
+
const generation = planWikiGeneration(
|
|
502
|
+
codewiki,
|
|
503
|
+
continuing && (input.depth === undefined || input.depth === "auto") && savedDepth ? savedDepth : requestedDepth,
|
|
504
|
+
);
|
|
505
|
+
// Keep the policy separate from its resolved coverage so a completed auto wiki can grow.
|
|
506
|
+
generation.requestedDepth =
|
|
507
|
+
continuing && (input.depth === undefined || input.depth === "auto")
|
|
508
|
+
? (savedPlan?.requestedDepth ?? existingMeta?.generation?.requestedDepth ?? savedDepth ?? requestedDepth)
|
|
509
|
+
: requestedDepth;
|
|
510
|
+
const depthChanged = Boolean(
|
|
511
|
+
savedPlan && (savedDepth ? savedDepth !== generation.depth : input.depth !== undefined && input.depth !== "auto"),
|
|
512
|
+
);
|
|
513
|
+
const sourceGitHead = currentWikiGitHead(cwd) ?? undefined;
|
|
514
|
+
const sourceContent = captureWikiSourceContent(cwd);
|
|
431
515
|
const resolved = resolvePlan({
|
|
432
516
|
cwd,
|
|
433
517
|
stagingDir: staging.dir,
|
|
@@ -435,8 +519,25 @@ export async function runWikiGenerate(
|
|
|
435
519
|
mode,
|
|
436
520
|
candidate: generation.plan,
|
|
437
521
|
previousPlan: existingMeta?.plan,
|
|
522
|
+
sourceContent,
|
|
438
523
|
gitHead: existingMeta?.gitHead ?? null,
|
|
439
524
|
});
|
|
525
|
+
if (input.retryPending && !resolved.resumed && !existingMeta?.plan) {
|
|
526
|
+
if (!staging.adopted) removeDir(staging.dir);
|
|
527
|
+
return failed(
|
|
528
|
+
["no saved wiki plan to retry; run `clio-coder context wiki` first"],
|
|
529
|
+
listWikiPagesInDir(wikiDir(cwd)).length,
|
|
530
|
+
);
|
|
531
|
+
}
|
|
532
|
+
if (depthChanged) {
|
|
533
|
+
resolved.plan = {
|
|
534
|
+
...resolved.plan,
|
|
535
|
+
pages: resolved.plan.pages.map((page) => ({ ...page, status: "pending", attempts: 0 })),
|
|
536
|
+
};
|
|
537
|
+
resolved.resumed = false;
|
|
538
|
+
}
|
|
539
|
+
resolved.plan.depth = generation.depth;
|
|
540
|
+
resolved.plan.requestedDepth = generation.requestedDepth;
|
|
440
541
|
const owed = resolved.plan.pages.filter((page) => page.status !== "written").length;
|
|
441
542
|
progress(input, {
|
|
442
543
|
phase: "codewiki",
|
|
@@ -445,8 +546,14 @@ export async function runWikiGenerate(
|
|
|
445
546
|
detail:
|
|
446
547
|
`${generation.sourceFiles} source files; ${generation.sourceLines} lines; ` +
|
|
447
548
|
`${resolved.plan.pages.length} pages planned; ${owed} to write` +
|
|
448
|
-
(resolved.resumed ? "; resuming an interrupted run" : "")
|
|
549
|
+
(resolved.resumed ? "; resuming an interrupted run" : "") +
|
|
550
|
+
(depthChanged
|
|
551
|
+
? `; coverage changed from ${savedDepth ?? "legacy unspecified"} to ${generation.depth}; prior pages requeued with prose retained`
|
|
552
|
+
: ""),
|
|
449
553
|
});
|
|
554
|
+
resolved.plan = { ...resolved.plan, sourceTreeHash, sourceContent };
|
|
555
|
+
if (sourceGitHead) resolved.plan.sourceGitHead = sourceGitHead;
|
|
556
|
+
else delete resolved.plan.sourceGitHead;
|
|
450
557
|
writeWikiPlanFile(staging.dir, resolved.plan);
|
|
451
558
|
|
|
452
559
|
const beforeHash = computeWikiContentHash(cwd);
|
|
@@ -471,8 +578,10 @@ export async function runWikiGenerate(
|
|
|
471
578
|
codewiki,
|
|
472
579
|
generation,
|
|
473
580
|
plan: resolved.plan,
|
|
474
|
-
resumed: resolved.resumed,
|
|
581
|
+
resumed: resolved.resumed || (input.retryPending === true && !depthChanged),
|
|
582
|
+
...(input.retryPending ? { retryPending: true } : {}),
|
|
475
583
|
unclaimedAreas: resolved.unclaimedAreas,
|
|
584
|
+
...(input.decisions ? { decisions: input.decisions } : {}),
|
|
476
585
|
gitHead: existingMeta?.gitHead ?? null,
|
|
477
586
|
...(input.onProgress ? { progress: input.onProgress } : {}),
|
|
478
587
|
});
|
|
@@ -495,9 +604,33 @@ export async function runWikiGenerate(
|
|
|
495
604
|
}
|
|
496
605
|
progress(input, { phase: "generate", status: "completed", message: "wiki generator completed" });
|
|
497
606
|
|
|
498
|
-
const
|
|
607
|
+
const checkpoint = readWikiPlanFile(staging.dir) ?? resolved.plan;
|
|
608
|
+
// Replanning explicitly retires old planned publications. Other writer
|
|
609
|
+
// additions remain available, including pages linked by completed work.
|
|
610
|
+
for (const path of checkpoint.retiredPages ?? []) rmSync(join(staging.dir, path), { force: true });
|
|
611
|
+
// Capture citation evidence before assembly removes missing paths from
|
|
612
|
+
// routing metadata. Failed refreshes and no-op runs must retain it.
|
|
613
|
+
const citedSources = pageSourceIndex(staging.dir, cwd);
|
|
614
|
+
const currentContent = captureWikiSourceContent(cwd);
|
|
615
|
+
const workedPlan: WikiPlan = {
|
|
616
|
+
...checkpoint,
|
|
617
|
+
sourceTreeHash,
|
|
618
|
+
sourceContent,
|
|
619
|
+
pages: checkpoint.pages.map((page) => {
|
|
620
|
+
const dependencies = [...new Set([...(page.dependencies ?? []), ...(citedSources.get(page.path) ?? [])])];
|
|
621
|
+
const stable = wikiSourcesMatch(sourceContent, currentContent, [...page.sources, ...dependencies]);
|
|
622
|
+
return {
|
|
623
|
+
...page,
|
|
624
|
+
dependencies,
|
|
625
|
+
...(page.status === "written" && !stable ? { status: "pending" as const, attempts: 0 } : {}),
|
|
626
|
+
};
|
|
627
|
+
}),
|
|
628
|
+
};
|
|
629
|
+
if (sourceGitHead) workedPlan.sourceGitHead = sourceGitHead;
|
|
630
|
+
else delete workedPlan.sourceGitHead;
|
|
499
631
|
const report = assembleWikiTree({ dir: staging.dir, sourceRoot: cwd, plan: workedPlan });
|
|
500
632
|
const finalPlan = reconcilePlan(workedPlan, staging.dir);
|
|
633
|
+
delete finalPlan.retiredPages;
|
|
501
634
|
const pendingCount = finalPlan.pages.filter((page) => page.status !== "written").length;
|
|
502
635
|
progress(input, {
|
|
503
636
|
phase: "state",
|
|
@@ -509,9 +642,6 @@ export async function runWikiGenerate(
|
|
|
509
642
|
(pendingCount > 0 ? `; ${pendingCount} page${pendingCount === 1 ? "" : "s"} still to write` : ""),
|
|
510
643
|
});
|
|
511
644
|
|
|
512
|
-
// The plan lives on in meta.json, so the staged working copy must not be
|
|
513
|
-
// promoted into the wiki tree alongside the pages.
|
|
514
|
-
rmSync(join(staging.dir, WIKI_PLAN_FILE), { force: true });
|
|
515
645
|
const afterHash = computeWikiContentHashOfDir(staging.dir);
|
|
516
646
|
const stagedPages = listWikiPagesInDir(staging.dir);
|
|
517
647
|
// Unresolved references are reported, not fatal. They are repaired in the
|
|
@@ -519,25 +649,31 @@ export async function runWikiGenerate(
|
|
|
519
649
|
// reach the operator and the next update run without costing this one.
|
|
520
650
|
const problems = report.issues.map((issue) => `${issue.page} has an unresolved ${issue.kind}: ${issue.reference}`);
|
|
521
651
|
|
|
522
|
-
const
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
652
|
+
const unchanged = afterHash === beforeHash && existingMeta !== null;
|
|
653
|
+
const pendingPublishedPage = finalPlan.pages.some(
|
|
654
|
+
(page) => page.status !== "written" && stagedPages.some((available) => available.path === page.path),
|
|
655
|
+
);
|
|
656
|
+
const meta: WikiMeta = {
|
|
657
|
+
version: 1,
|
|
658
|
+
updatedAt: unchanged ? existingMeta.updatedAt : new Date().toISOString(),
|
|
659
|
+
gitHead: pendingPublishedPage ? (existingMeta?.gitHead ?? null) : currentWikiGitHead(cwd),
|
|
660
|
+
...(pendingPublishedPage
|
|
661
|
+
? existingMeta?.sourceTreeHash
|
|
662
|
+
? { sourceTreeHash: existingMeta.sourceTreeHash }
|
|
663
|
+
: {}
|
|
664
|
+
: { sourceTreeHash }),
|
|
665
|
+
model: unchanged ? existingMeta.model : input.model,
|
|
666
|
+
contentHash: afterHash,
|
|
667
|
+
pages: stagedPages,
|
|
668
|
+
generation: {
|
|
669
|
+
requestedDepth: generation.requestedDepth,
|
|
670
|
+
depth: generation.depth,
|
|
671
|
+
sourceFiles: generation.sourceFiles,
|
|
672
|
+
sourceLines: generation.sourceLines,
|
|
673
|
+
pagesPlanned: finalPlan.pages.length,
|
|
674
|
+
pagesWritten: finalPlan.pages.length - pendingCount,
|
|
675
|
+
},
|
|
676
|
+
plan: finalPlan,
|
|
541
677
|
};
|
|
542
678
|
|
|
543
679
|
const done = (status: "generated" | "noop"): RunWikiGenerateResult => ({
|
|
@@ -552,22 +688,25 @@ export async function runWikiGenerate(
|
|
|
552
688
|
// the assembled tree matches the live wiki byte for byte there is nothing
|
|
553
689
|
// to swap, so metadata is refreshed in place.
|
|
554
690
|
if (afterHash === beforeHash && computeWikiContentHash(cwd) === beforeHash && existingMeta) {
|
|
691
|
+
writeWikiMeta(cwd, meta);
|
|
692
|
+
rmSync(join(wikiDir(cwd), WIKI_PLAN_FILE), { force: true });
|
|
555
693
|
removeDir(staging.dir);
|
|
556
|
-
// Metadata is left exactly as it was. Rewriting it would churn
|
|
557
|
-
// `updatedAt` and `model` on a run that changed nothing, which makes
|
|
558
|
-
// every no-op look like a regeneration to anything reading the file.
|
|
559
694
|
progress(input, {
|
|
560
695
|
phase: "state",
|
|
561
696
|
status: "completed",
|
|
562
|
-
message: "wiki unchanged;
|
|
697
|
+
message: "wiki unchanged; progress recorded",
|
|
563
698
|
detail: wikiMetaPath(cwd),
|
|
564
699
|
});
|
|
565
700
|
progress(input, { phase: "done", status: "completed", message: "wiki unchanged" });
|
|
566
701
|
return done("noop");
|
|
567
702
|
}
|
|
568
703
|
|
|
704
|
+
// Keep the checkpoint until the complete publication is prepared. A crash
|
|
705
|
+
// during either rename can then recover the last good content/metadata pair.
|
|
706
|
+
writeWikiPlanFile(staging.dir, finalPlan);
|
|
707
|
+
writeWikiMetaInDir(staging.dir, meta);
|
|
569
708
|
progress(input, { phase: "state", status: "running", message: "promoting wiki" });
|
|
570
|
-
const promoted = promoteStaging(cwd, staging.dir
|
|
709
|
+
const promoted = promoteStaging(cwd, staging.dir);
|
|
571
710
|
if (!promoted.ok) {
|
|
572
711
|
progress(input, {
|
|
573
712
|
phase: "done",
|
|
@@ -577,6 +716,7 @@ export async function runWikiGenerate(
|
|
|
577
716
|
});
|
|
578
717
|
return failed(promoted.problems, listWikiPagesInDir(wikiDir(cwd)).length);
|
|
579
718
|
}
|
|
719
|
+
rmSync(join(wikiDir(cwd), WIKI_PLAN_FILE), { force: true });
|
|
580
720
|
progress(input, { phase: "state", status: "completed", message: "wiki metadata written" });
|
|
581
721
|
progress(input, {
|
|
582
722
|
phase: "done",
|
|
@@ -168,7 +168,11 @@ export function isWikiMeta(value: unknown): value is WikiMeta {
|
|
|
168
168
|
}
|
|
169
169
|
|
|
170
170
|
export function readWikiMeta(cwd: string): WikiMeta | null {
|
|
171
|
-
|
|
171
|
+
return readWikiMetaInDir(wikiDir(cwd));
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export function readWikiMetaInDir(dir: string): WikiMeta | null {
|
|
175
|
+
const filePath = join(dir, "meta.json");
|
|
172
176
|
if (!existsSync(filePath)) return null;
|
|
173
177
|
let parsed: unknown;
|
|
174
178
|
try {
|
|
@@ -181,6 +185,10 @@ export function readWikiMeta(cwd: string): WikiMeta | null {
|
|
|
181
185
|
}
|
|
182
186
|
|
|
183
187
|
export function writeWikiMeta(cwd: string, meta: WikiMeta): void {
|
|
188
|
+
writeWikiMetaInDir(wikiDir(cwd), meta);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export function writeWikiMetaInDir(dir: string, meta: WikiMeta): void {
|
|
184
192
|
const normalized: WikiMeta = {
|
|
185
193
|
version: 1,
|
|
186
194
|
updatedAt: meta.updatedAt,
|
|
@@ -192,7 +200,7 @@ export function writeWikiMeta(cwd: string, meta: WikiMeta): void {
|
|
|
192
200
|
...(meta.generation !== undefined ? { generation: { ...meta.generation } } : {}),
|
|
193
201
|
...(meta.plan !== undefined ? { plan: meta.plan } : {}),
|
|
194
202
|
};
|
|
195
|
-
safeResourceWrite(
|
|
203
|
+
safeResourceWrite(join(dir, "meta.json"), `${JSON.stringify(normalized)}\n`, { encoding: "utf8" });
|
|
196
204
|
}
|
|
197
205
|
|
|
198
206
|
/**
|
|
@@ -13,7 +13,8 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
13
13
|
import { join } from "node:path";
|
|
14
14
|
import { safeResourceWrite } from "../../../core/safe-resource-write.js";
|
|
15
15
|
import { isGeneratedWikiFile, WIKI_PLAN_FILE } from "./layout.js";
|
|
16
|
-
import type { WikiPageStatus, WikiPlan, WikiPlanPage } from "./plan.js";
|
|
16
|
+
import type { WikiPageFailure, WikiPageStatus, WikiPlan, WikiPlanPage } from "./plan.js";
|
|
17
|
+
import { parseWikiSourceContent } from "./source-content.js";
|
|
17
18
|
|
|
18
19
|
/** Dispatches one page may receive across all runs before it is left alone. */
|
|
19
20
|
export const MAX_PAGE_ATTEMPTS = 3;
|
|
@@ -75,6 +76,16 @@ function parsedAttempts(value: unknown): number | null {
|
|
|
75
76
|
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : null;
|
|
76
77
|
}
|
|
77
78
|
|
|
79
|
+
function parsedFailure(value: unknown): WikiPageFailure | undefined {
|
|
80
|
+
if (!isRecord(value)) return undefined;
|
|
81
|
+
const phase = value.phase;
|
|
82
|
+
if (phase !== "admission" && phase !== "writer" && phase !== "validation") return undefined;
|
|
83
|
+
const detail = usableString(value.detail)?.replace(/\s+/gu, " ").slice(0, 500);
|
|
84
|
+
if (!detail) return undefined;
|
|
85
|
+
const runId = usableString(value.runId)?.slice(0, 120);
|
|
86
|
+
return { phase, detail, ...(runId ? { runId } : {}) };
|
|
87
|
+
}
|
|
88
|
+
|
|
78
89
|
export interface SanitizeWikiPlanOptions {
|
|
79
90
|
/**
|
|
80
91
|
* Whether the recorded progress in this document may be believed.
|
|
@@ -90,7 +101,7 @@ export interface SanitizeWikiPlanOptions {
|
|
|
90
101
|
|
|
91
102
|
/**
|
|
92
103
|
* Parse a plan, preferring harness-owned progress from `previous` for any page
|
|
93
|
-
* whose path survived. Returns null when nothing usable is left, so the caller
|
|
104
|
+
* whose path and specification survived. Returns null when nothing usable is left, so the caller
|
|
94
105
|
* falls back to the candidate plan.
|
|
95
106
|
*/
|
|
96
107
|
export function sanitizeWikiPlan(
|
|
@@ -107,22 +118,65 @@ export function sanitizeWikiPlan(
|
|
|
107
118
|
if (!isRecord(entry)) continue;
|
|
108
119
|
const path = sanitizePagePath(entry.path);
|
|
109
120
|
if (path === null || seen.has(path)) continue;
|
|
110
|
-
const intent = usableString(entry.intent);
|
|
121
|
+
const intent = (usableString(entry.intent) ?? "").slice(0, MAX_INTENT_CHARS);
|
|
122
|
+
const title = usableString(entry.title) ?? path.replace(/\.md$/, "");
|
|
123
|
+
const sources = stringList(entry.sources, 16);
|
|
111
124
|
const prior = priorByPath.get(path);
|
|
125
|
+
const changedSpec =
|
|
126
|
+
prior !== undefined &&
|
|
127
|
+
(prior.title !== title ||
|
|
128
|
+
prior.intent !== intent ||
|
|
129
|
+
JSON.stringify([...prior.sources].sort()) !== JSON.stringify([...sources].sort()));
|
|
112
130
|
const recorded = options.trustStatus ? parsedStatus(entry.status) : null;
|
|
113
131
|
const recordedAttempts = options.trustStatus ? parsedAttempts(entry.attempts) : null;
|
|
132
|
+
const lastFailure = prior?.lastFailure ?? (options.trustStatus ? parsedFailure(entry.lastFailure) : undefined);
|
|
133
|
+
const dependencies =
|
|
134
|
+
prior?.dependencies ?? (options.trustStatus ? stringList(entry.dependencies, Number.POSITIVE_INFINITY) : []);
|
|
114
135
|
seen.add(path);
|
|
115
136
|
pages.push({
|
|
116
137
|
path,
|
|
117
|
-
title
|
|
118
|
-
intent
|
|
119
|
-
sources
|
|
120
|
-
|
|
121
|
-
|
|
138
|
+
title,
|
|
139
|
+
intent,
|
|
140
|
+
sources,
|
|
141
|
+
...(dependencies.length > 0 ? { dependencies } : {}),
|
|
142
|
+
status: changedSpec ? "pending" : (prior?.status ?? recorded ?? "pending"),
|
|
143
|
+
attempts: changedSpec ? 0 : (prior?.attempts ?? recordedAttempts ?? 0),
|
|
144
|
+
...(!changedSpec && (prior?.status ?? recorded) !== "written" && lastFailure ? { lastFailure } : {}),
|
|
122
145
|
});
|
|
123
146
|
}
|
|
124
147
|
if (pages.length === 0) return null;
|
|
125
|
-
|
|
148
|
+
const retiredPages = [
|
|
149
|
+
...new Set([
|
|
150
|
+
...(previous?.retiredPages ?? (options.trustStatus ? stringList(value.retiredPages, MAX_PLAN_PAGES) : [])),
|
|
151
|
+
...(previous?.pages.filter((page) => !seen.has(page.path)).map((page) => page.path) ?? []),
|
|
152
|
+
]),
|
|
153
|
+
]
|
|
154
|
+
.map(sanitizePagePath)
|
|
155
|
+
.filter((path): path is string => path !== null && !seen.has(path));
|
|
156
|
+
const sourceContent =
|
|
157
|
+
previous?.sourceContent ?? (options.trustStatus ? parseWikiSourceContent(value.sourceContent) : undefined);
|
|
158
|
+
const sourceTreeHash = previous?.sourceTreeHash ?? (options.trustStatus ? value.sourceTreeHash : undefined);
|
|
159
|
+
const sourceGitHead = previous?.sourceGitHead ?? (options.trustStatus ? value.sourceGitHead : undefined);
|
|
160
|
+
const depth = previous?.depth ?? (options.trustStatus ? value.depth : undefined);
|
|
161
|
+
const requestedDepth = previous?.requestedDepth ?? (options.trustStatus ? value.requestedDepth : undefined);
|
|
162
|
+
return {
|
|
163
|
+
version: 1,
|
|
164
|
+
...(depth === "simple" || depth === "medium" || depth === "detailed" ? { depth } : {}),
|
|
165
|
+
...(requestedDepth === "auto" ||
|
|
166
|
+
requestedDepth === "simple" ||
|
|
167
|
+
requestedDepth === "medium" ||
|
|
168
|
+
requestedDepth === "detailed"
|
|
169
|
+
? { requestedDepth }
|
|
170
|
+
: {}),
|
|
171
|
+
...(sourceContent ? { sourceContent } : {}),
|
|
172
|
+
...(retiredPages.length ? { retiredPages } : {}),
|
|
173
|
+
...(typeof sourceTreeHash === "string" && /^[a-f0-9]{64}$/.test(sourceTreeHash) ? { sourceTreeHash } : {}),
|
|
174
|
+
...(typeof sourceGitHead === "string" && /^(?:[a-f0-9]{40}|[a-f0-9]{64})$/.test(sourceGitHead)
|
|
175
|
+
? { sourceGitHead }
|
|
176
|
+
: {}),
|
|
177
|
+
overview: usableString(value.overview) ?? previous?.overview ?? "",
|
|
178
|
+
pages,
|
|
179
|
+
};
|
|
126
180
|
}
|
|
127
181
|
|
|
128
182
|
function readPlanDocument(dir: string): unknown {
|
|
@@ -174,7 +228,8 @@ export function unclaimedCandidates(
|
|
|
174
228
|
const knownPaths = new Set(plan.pages.map((page) => page.path));
|
|
175
229
|
const claimed = new Set<string>();
|
|
176
230
|
for (const page of plan.pages) {
|
|
177
|
-
for (const source of [...page.sources, ...(pageSources.get(page.path) ?? [])])
|
|
231
|
+
for (const source of [...page.sources, ...(page.dependencies ?? []), ...(pageSources.get(page.path) ?? [])])
|
|
232
|
+
claimed.add(source);
|
|
178
233
|
}
|
|
179
234
|
return candidate.pages.filter(
|
|
180
235
|
(page) => !knownPaths.has(page.path) && !page.sources.some((source) => claimed.has(source)),
|
|
@@ -201,8 +256,9 @@ export interface ScopeUpdateInput {
|
|
|
201
256
|
export function scopePlanForUpdate(input: ScopeUpdateInput): WikiPlan {
|
|
202
257
|
const changedPrefixes = [...input.changedPaths];
|
|
203
258
|
const pages = input.plan.pages.map((page): WikiPlanPage => {
|
|
259
|
+
if (page.status !== "written") return page;
|
|
204
260
|
if (!input.existingPages.has(page.path)) return { ...page, status: "pending", attempts: 0 };
|
|
205
|
-
const claimed = [...(input.pageSources.get(page.path) ?? []), ...page.sources];
|
|
261
|
+
const claimed = [...(input.pageSources.get(page.path) ?? []), ...page.sources, ...(page.dependencies ?? [])];
|
|
206
262
|
const touched = claimed.some((source) =>
|
|
207
263
|
changedPrefixes.some((changed) => changed === source || changed.startsWith(`${source}/`)),
|
|
208
264
|
);
|
|
@@ -211,7 +267,7 @@ export function scopePlanForUpdate(input: ScopeUpdateInput): WikiPlan {
|
|
|
211
267
|
return { ...input.plan, pages };
|
|
212
268
|
}
|
|
213
269
|
|
|
214
|
-
/**
|
|
215
|
-
export function pendingPages(plan: WikiPlan): WikiPlanPage[] {
|
|
216
|
-
return plan.pages.filter((page) => page.status !== "written" && page.attempts < MAX_PAGE_ATTEMPTS);
|
|
270
|
+
/** An explicit operator retry includes exhausted pages without erasing their attempt history. */
|
|
271
|
+
export function pendingPages(plan: WikiPlan, retryExhausted = false): WikiPlanPage[] {
|
|
272
|
+
return plan.pages.filter((page) => page.status !== "written" && (retryExhausted || page.attempts < MAX_PAGE_ATTEMPTS));
|
|
217
273
|
}
|