@iowarp/clio-coder 0.4.4 → 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 +92 -2
- package/CONTRIBUTING.md +25 -15
- package/README.md +340 -27
- package/dist/{acp-WNAYYF4F.js → acp-H3CU2HBQ.js} +25 -24
- package/dist/{agents-3OKXHLOI.js → agents-IXQQZ7BD.js} +77 -77
- package/dist/assets/codewiki.json +1 -1
- package/dist/{auth-VKNNMGPU.js → auth-R7KYF7N3.js} +38 -38
- package/dist/builtins-CRFDQUVP.js +22 -0
- package/dist/{chunk-TQAHXW6Y.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-JCI2ROMZ.js → chunk-3T4DXWP6.js} +7 -7
- package/dist/{chunk-DR52UMZW.js → chunk-3UW3KU4A.js} +2 -2
- package/dist/{chunk-6Q3CYFD3.js → chunk-4SVIVOMC.js} +184 -33
- package/dist/{chunk-W54I7H25.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-I2DWJ4GM.js → chunk-5DDOTTG4.js} +54 -42
- package/dist/{chunk-D4CJV46V.js → chunk-5GZICIYO.js} +3 -3
- package/dist/{chunk-4IUZQIJ3.js → chunk-5PHVPU4G.js} +2 -2
- package/dist/{chunk-3ODX73FK.js → chunk-5VTJP36Q.js} +4 -4
- package/dist/{chunk-54X7T7DK.js → chunk-5ZMXGW7P.js} +79 -7
- package/dist/chunk-5ZSZEYJK.js +119 -0
- package/dist/{chunk-IXIY2H4R.js → chunk-633EXGZA.js} +5 -5
- package/dist/{chunk-CUSRQKPU.js → chunk-6CDNRHWH.js} +299 -89
- package/dist/{chunk-EBY63B7G.js → chunk-6EXUUOSN.js} +2 -2
- package/dist/{chunk-SVNXH4L2.js → chunk-6ICZKDUC.js} +2 -2
- package/dist/{chunk-JEIYHLOR.js → chunk-6SYEGZI3.js} +12 -12
- package/dist/{chunk-DQOVN6KV.js → chunk-6YA46L5A.js} +4 -4
- package/dist/{chunk-NZMNUPZZ.js → chunk-77CZRFTE.js} +3 -3
- package/dist/{chunk-6PAZTBPA.js → chunk-7HBHHVCK.js} +15 -6
- package/dist/{chunk-25QBEXRS.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-3UUXNFEX.js → chunk-7YJWEF2L.js} +61 -34
- 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-I5FWO7L5.js → chunk-B6UM3OZC.js} +2 -2
- package/dist/{chunk-2CU2H6KE.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-QZWQA4DE.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-YNFKXPEC.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-XULDXHTN.js → chunk-DRD2A54W.js} +102 -50
- 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-FEAXX7B6.js → chunk-EHCPSZJF.js} +4 -4
- package/dist/{chunk-4NSRCOYP.js → chunk-EHOSNVVM.js} +3 -2
- package/dist/{chunk-7UGL4MB5.js → chunk-EQEJJ53P.js} +10 -10
- package/dist/{chunk-GWZNEVM2.js → chunk-EWD5P3GK.js} +9 -9
- package/dist/{chunk-6UINWWS6.js → chunk-F34AR6O3.js} +14 -14
- package/dist/{chunk-GHS5EBTQ.js → chunk-FKIOX6DS.js} +29 -20
- package/dist/{chunk-HAXOFFRH.js → chunk-FQOOGXBH.js} +7 -7
- package/dist/{chunk-Y55JBDO5.js → chunk-FSTIBAGM.js} +38 -23
- 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-TOIVGRUX.js → chunk-GJ24ODAX.js} +5 -5
- package/dist/{chunk-QUFRYSWI.js → chunk-GNQRWTMY.js} +129 -48
- package/dist/{chunk-5ICU3EUH.js → chunk-GVYWZNRK.js} +5 -5
- package/dist/{chunk-GX5WYQO4.js → chunk-GXCCHKN6.js} +6 -6
- package/dist/{chunk-K6T2ZAMZ.js → chunk-HGSLRG33.js} +6 -6
- package/dist/{chunk-26QSH3EJ.js → chunk-HHVJNVUJ.js} +5 -5
- package/dist/{chunk-F4EKGO4N.js → chunk-HL26ADLH.js} +4 -2
- package/dist/{chunk-JT2RFCC5.js → chunk-HR3HPQ76.js} +5 -5
- package/dist/{chunk-ID64D7PE.js → chunk-HXHFDHB6.js} +24 -24
- package/dist/{chunk-ELWDPP3Y.js → chunk-I7VLWRK2.js} +8 -8
- package/dist/{chunk-6OSVSQL5.js → chunk-ICO4TQ2F.js} +7 -5
- package/dist/{chunk-SZAA6XDG.js → chunk-IFDRAD6F.js} +2 -2
- package/dist/{chunk-72YIHOZQ.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-AUPNRN7C.js → chunk-K2HL3GBL.js} +4 -4
- package/dist/{chunk-2ASED4PZ.js → chunk-K6RDB7IA.js} +26 -26
- package/dist/{chunk-FFUPXJC4.js → chunk-KDWLXVMN.js} +23 -24
- package/dist/{chunk-OZNBF4L3.js → chunk-KECNXMDE.js} +2 -2
- package/dist/{chunk-6QOTUPRG.js → chunk-KF6GFW6O.js} +66 -18
- 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-3UNOLWNZ.js → chunk-KTFSFCVN.js} +20 -9
- package/dist/{chunk-57XXR6DR.js → chunk-KYKNBD4Y.js} +24 -23
- package/dist/{chunk-IRXAATOX.js → chunk-L4N3DWNW.js} +3 -3
- package/dist/{chunk-LCGCVYZ4.js → chunk-LQTKDAUO.js} +2 -2
- package/dist/{chunk-U6TMQNSI.js → chunk-LTR5QCLS.js} +4 -4
- package/dist/chunk-LUL5Z66S.js +221 -0
- package/dist/{chunk-ELZVTCGV.js → chunk-LVFANMOH.js} +151 -327
- 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-NXYCB2VD.js → chunk-M6TAYK66.js} +6 -6
- package/dist/{chunk-NEKRRTYW.js → chunk-MC3JSVR6.js} +2 -2
- package/dist/{chunk-CFGTUFWB.js → chunk-MCJKEGHO.js} +2 -2
- package/dist/{chunk-DXKJURES.js → chunk-MDU3C27C.js} +10 -7
- package/dist/{chunk-6XLNIQDB.js → chunk-MYI32N4R.js} +2 -2
- package/dist/{chunk-3GY4F45V.js → chunk-NC4KV7EL.js} +6 -6
- package/dist/{chunk-LLXSDWXS.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-RZDWV63N.js → chunk-NY6IWDVU.js} +6 -6
- package/dist/{chunk-XXYSBZIQ.js → chunk-O2RQ7LCK.js} +4 -4
- package/dist/{chunk-4BJ5BYCE.js → chunk-O3VV6IVK.js} +2 -2
- package/dist/{chunk-W6GROXXM.js → chunk-O5F25NIE.js} +2 -2
- package/dist/{chunk-NXIMQY5W.js → chunk-ODUTYZIU.js} +5 -5
- package/dist/{chunk-LTIKRKFL.js → chunk-ONRTXOZY.js} +4 -4
- package/dist/{chunk-KFV5L5SK.js → chunk-OQM5IVJY.js} +118 -232
- 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-RXTN6AKH.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-2DSOYNFC.js → chunk-R6MAYTMS.js} +7 -7
- package/dist/{chunk-JQLNNIKT.js → chunk-R6MICQYU.js} +6 -6
- package/dist/{chunk-NAI6ZFCY.js → chunk-RLTT5GVY.js} +122 -11
- package/dist/{chunk-DT3LWJOB.js → chunk-RXIOCVBZ.js} +24 -6
- package/dist/{chunk-N56KALIC.js → chunk-S32UQ5GL.js} +61 -34
- package/dist/{chunk-UEPWCCTY.js → chunk-SBZX6ARC.js} +12 -12
- package/dist/chunk-SD7SHNDW.js +15 -0
- package/dist/{chunk-NRO2BJRH.js → chunk-SDWNDICN.js} +10235 -4015
- 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-OMQNJVKW.js → chunk-SRZOW5L2.js} +43 -13
- package/dist/{chunk-3M6DQK6S.js → chunk-T334FW2H.js} +7 -7
- package/dist/{chunk-V76WTFTW.js → chunk-T52TPHYC.js} +6 -6
- package/dist/{chunk-I7XBWTYH.js → chunk-T53XI6I7.js} +5 -5
- package/dist/{chunk-2ZSONWVL.js → chunk-T7FDXNRU.js} +13 -13
- package/dist/{chunk-JSD46VO2.js → chunk-TEG3RYVZ.js} +43 -36
- package/dist/{chunk-3I7MS7N2.js → chunk-TK2BMCBZ.js} +2 -2
- package/dist/{chunk-5OIVVPHF.js → chunk-TN5FW4XY.js} +13 -6
- package/dist/{chunk-75W7L2E2.js → chunk-TZ7MFRG4.js} +1041 -162
- package/dist/{chunk-36CT5VVL.js → chunk-U2JOLB7O.js} +126 -77
- package/dist/{chunk-LL4KHSZI.js → chunk-U2MSJ57E.js} +2 -2
- package/dist/{chunk-FTMGRKEF.js → chunk-U44YYLVV.js} +4 -4
- package/dist/{chunk-YECAMM3D.js → chunk-U7H5WRG5.js} +5 -5
- package/dist/{chunk-RQCKCSRL.js → chunk-U7VQ4NI4.js} +22 -22
- package/dist/{chunk-5TUB6SLS.js → chunk-UFYNOQK4.js} +7 -7
- package/dist/{chunk-R346GLFC.js → chunk-UHW5V7HC.js} +2 -2
- package/dist/{chunk-USR47QNF.js → chunk-UL36QJX6.js} +14 -14
- package/dist/{chunk-VIA6RFQZ.js → chunk-UQIVHSE4.js} +4 -4
- package/dist/{chunk-RAY4OVGZ.js → chunk-URBGEOH3.js} +5 -5
- package/dist/chunk-USZA7GWL.js +341 -0
- package/dist/{chunk-YD5GIKET.js → chunk-UTUNT5QL.js} +48 -579
- package/dist/{chunk-ZA4VCIGV.js → chunk-UUQ5G6EZ.js} +60 -41
- package/dist/{chunk-23L32XTI.js → chunk-UXAC2FX4.js} +68 -39
- package/dist/{chunk-VG7TBQIY.js → chunk-V552WL53.js} +68 -4
- package/dist/{chunk-BWH6N36D.js → chunk-VHKTOLEW.js} +272 -42
- package/dist/{chunk-EXLD33WO.js → chunk-VLPTKCKT.js} +24 -9
- 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-S6PYF2XF.js → chunk-WFKDPU7U.js} +4 -4
- package/dist/{chunk-BJVFZO5U.js → chunk-WJIMKGD6.js} +7 -7
- package/dist/{chunk-5636DCO5.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-4M6Z5QVF.js → chunk-XXBQKW32.js} +11 -11
- package/dist/{chunk-OEJSLEPW.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-Q4WO54TA.js → chunk-ZMZQEBKI.js} +14 -14
- 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 +44 -44
- package/dist/clio-5I2IBFYL.js +26 -0
- package/dist/{code-nav-IJR2DBPR.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-2TGAI2RC.js → components-TNIKXCBH.js} +13 -13
- package/dist/{config-IUA6OYNS.js → config-Y2JDJ3JJ.js} +210 -124
- package/dist/configure-SML6UBZ5.js +55 -0
- package/dist/{context-4MPR7WKB.js → context-P5YSEO55.js} +125 -121
- package/dist/{context-2DKHWH2T.js → context-QQ53HSGJ.js} +91 -62
- package/dist/{context-BOYF5EJM.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-3I3FYX6Y.js → context-working-set-CNLSQN5K.js} +31 -31
- package/dist/detail-5572VLBO.js +114 -0
- package/dist/{dispatch-runner-RJ5I2F2O.js → dispatch-runner-FRHD6P2O.js} +191 -116
- package/dist/{docs-SPOV3BAN.js → docs-BL7ROUFN.js} +4 -4
- package/dist/{doctor-DKICC2SN.js → doctor-N3LCM2LG.js} +58 -58
- package/dist/{eval-OQOQUDHK.js → eval-BUU3ZOUZ.js} +473 -168
- package/dist/{eval-inventory-Y6QRFOH5.js → eval-inventory-QOYZERXJ.js} +7 -7
- package/dist/evidence-DTGEN456.js +224 -0
- package/dist/{evidence-4DQ25GUQ.js → evidence-SQ5DNFEN.js} +110 -94
- package/dist/{evolve-GSS52E5J.js → evolve-IJNUFZDS.js} +107 -91
- package/dist/{extensions-G7MFLYHT.js → extensions-YVRHX6ZI.js} +16 -16
- package/dist/{fleet-Q37YHHAQ.js → fleet-ZNNVSYFO.js} +147 -147
- package/dist/{fleet-commands-G7E4N7SM.js → fleet-commands-5YE7NPJL.js} +27 -26
- package/dist/{fleet-decisions-O7M6QBA2.js → fleet-decisions-3SBSCTCW.js} +16 -15
- package/dist/{fleet-graph-TOUBW6OW.js → fleet-graph-6HHPWF5T.js} +39 -38
- package/dist/{fleet-inspect-SW33JJNI.js → fleet-inspect-JEYMGCGC.js} +107 -91
- package/dist/{fleet-new-RDVJLHHH.js → fleet-new-RCKGSRDV.js} +3 -3
- package/dist/{fleet-preflight-CV2655TW.js → fleet-preflight-QRSHIIDE.js} +10 -9
- package/dist/{fleet-validate-KESZX2YH.js → fleet-validate-4PM4GDDL.js} +46 -42
- package/dist/{fleet-verify-UQPMTVE3.js → fleet-verify-NJDTHTO3.js} +105 -89
- package/dist/fleet-view-UP2BWQQY.js +117 -0
- package/dist/{init-PXEXQSBF.js → init-S3GZQ5ZF.js} +123 -123
- package/dist/{install-NKNG7KD4.js → install-3RZDDP23.js} +5 -5
- package/dist/{interop-ZG5T62U3.js → interop-YOTGXFJM.js} +25 -25
- package/dist/inventory-K2OZ36YJ.js +117 -0
- package/dist/{library-B2W4N74O.js → library-GJI6W6OK.js} +45 -44
- package/dist/{memory-YCANYS5A.js → memory-OQOXQGYD.js} +107 -93
- package/dist/{models-GERTU3YI.js → models-3IK2Y5WE.js} +63 -62
- package/dist/{monitor-CPNIUULB.js → monitor-FTJLTKCQ.js} +136 -107
- package/dist/{orchestrator-J4BSH4WQ.js → orchestrator-N47O7SFD.js} +1159 -697
- package/dist/{panes-BOHAEGYC.js → panes-7BTYH3XQ.js} +8 -8
- package/dist/{panes-NXSLDQZ2.js → panes-WPOMEMRH.js} +22 -22
- package/dist/{paths-VSUWNC22.js → paths-J3KN7UAO.js} +12 -12
- package/dist/preload-65U34NG6.js +115 -0
- package/dist/{registry-LG64LTF4.js → registry-DESGAXWK.js} +3 -3
- package/dist/{reset-TNWTB5LU.js → reset-MUVQDLNL.js} +20 -20
- package/dist/{resources-4PXNMD5G.js → resources-LM76COAO.js} +41 -40
- package/dist/{run-D6XJ34CN.js → run-3VFZQ33N.js} +162 -156
- package/dist/{share-2NWMJJEE.js → share-4JUB4BL7.js} +43 -42
- package/dist/{skills-KR7WON5G.js → skills-S36AAJHU.js} +47 -46
- package/dist/{skills-eval-O2ZNOLDS.js → skills-eval-G6T57L7M.js} +127 -107
- package/dist/{skills-inventory-ZZOUBK7O.js → skills-inventory-WLM46PJH.js} +41 -40
- package/dist/slash-commands-GBARG3Y7.js +91 -0
- package/dist/{steer-XA25PSCS.js → steer-S7D7IKPU.js} +7 -7
- package/dist/{support-7EMVWYG2.js → support-5VAEC32W.js} +14 -14
- package/dist/{targets-OMH2XCSN.js → targets-N5REUETU.js} +145 -94
- package/dist/tasks-6BVY5YZF.js +36 -0
- package/dist/{terminal-lease-C2J3JYRE.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-HALS6BLF.js → uninstall-FXYMFFRT.js} +17 -17
- package/dist/{upgrade-MS72RJEP.js → upgrade-4HD5HAIV.js} +40 -39
- package/dist/{usage-NHG6MCJM.js → usage-4GWM2WWP.js} +136 -105
- package/dist/{verifiers-7AUNVXDY.js → verifiers-GSKWKWVG.js} +28 -27
- package/dist/verify-3AS3ULCY.js +30 -0
- package/dist/{version-KGEG7EPO.js → version-RFPKO6T7.js} +4 -4
- package/dist/{web-fetch-V4FKSDAV.js → web-fetch-MQN4FH3X.js} +169 -18
- package/dist/wiki-generate-7BV7XWIY.js +614 -0
- package/dist/{with-panes-BDQEWBRT.js → with-panes-OFTNAR4Y.js} +34 -20
- package/dist/worker/entry.js +99 -88
- package/dist/{workspace-ZJ6BFM3Q.js → workspace-DZ7JADBG.js} +6 -6
- package/docs/README.md +7 -6
- package/docs/architecture/acp.md +10 -0
- package/docs/architecture/architecture.md +5 -5
- 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/evidence-and-memory.md +10 -0
- package/docs/architecture/pi-boundary.md +37 -7
- package/docs/architecture/prompt-envelope-and-tools.md +7 -7
- package/docs/architecture/session-lifecycle.md +4 -4
- package/docs/architecture/worker-dispatch-mechanics.md +4 -0
- package/docs/guide/commands-and-modes.md +49 -36
- package/docs/guide/configuration-and-targets.md +7 -2
- package/docs/guide/configuration-reference.md +13 -3
- package/docs/guide/environment-variables.md +6 -2
- 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 +9 -2
- package/docs/process/development-pipeline.md +10 -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/release-cut-checklist.md +6 -6
- package/evals/README.md +4 -0
- package/evals/behavioral-corpus-grader.mjs +147 -14
- 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/registry.yaml +1 -1
- package/skills/skill-marketplace.json +1 -1
- 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/context-map.ts +75 -14
- package/src/cli/context.ts +46 -17
- package/src/cli/eval.ts +17 -3
- package/src/cli/modes/print.ts +32 -4
- package/src/cli/run.ts +16 -14
- package/src/cli/skills-eval.ts +10 -8
- package/src/cli/steer-channel.ts +31 -18
- package/src/cli/targets.ts +83 -31
- package/src/cli/tasks.ts +10 -1
- package/src/cli/upgrade.ts +9 -6
- package/src/cli/usage.ts +24 -0
- package/src/cli/wiki-generate.ts +239 -96
- package/src/core/bash-exec.ts +43 -15
- package/src/core/bus-events.ts +15 -0
- 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/incomplete-installation.ts +3 -1
- package/src/core/settings-layers.ts +21 -5
- package/src/core/termination.ts +26 -9
- package/src/core/untrusted-content.ts +16 -0
- package/src/core/workspace-trust.ts +179 -0
- package/src/domains/agents/builtins/coder.md +4 -2
- package/src/domains/agents/builtins/context-bootstrap.md +3 -1
- package/src/domains/agents/builtins/documenter.md +7 -4
- package/src/domains/agents/builtins/researcher.md +1 -0
- package/src/domains/agents/builtins/scout.md +7 -1
- 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 +72 -10
- 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 +9 -57
- package/src/domains/context/wiki/assemble.ts +14 -10
- package/src/domains/context/wiki/evidence.ts +209 -0
- package/src/domains/context/wiki/generate.ts +201 -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 +42 -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 +6 -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/contract.ts +10 -2
- 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 +2 -0
- package/src/domains/dispatch/extension.ts +190 -105
- package/src/domains/dispatch/fleet-run.ts +20 -0
- package/src/domains/dispatch/gate-role-prompts.ts +4 -2
- package/src/domains/dispatch/parallel-writers.ts +34 -0
- package/src/domains/dispatch/reservation-store.ts +8 -34
- 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/types.ts +4 -3
- 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 +5 -1
- 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 +4 -2
- 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/rules.ts +5 -1
- 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/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/contract.ts +2 -2
- package/src/domains/observability/projection.ts +30 -9
- 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 +10 -0
- package/src/domains/prompts/fragments/operating/delegation.md +5 -0
- package/src/domains/prompts/fragments/wiki/page.md +28 -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/runtime-resolution.ts +11 -9
- package/src/domains/providers/runtimes/cloud/openrouter.ts +2 -0
- package/src/domains/resources/skills/promotion.ts +8 -1
- package/src/domains/safety/action-classifier.ts +9 -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 +11 -0
- package/src/domains/safety/extension.ts +11 -2
- package/src/domains/safety/policy-engine.ts +189 -32
- package/src/domains/safety/project-policy.ts +7 -2
- package/src/domains/safety/workspace-trust.ts +43 -0
- 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 +43 -33
- package/src/domains/session/entries.ts +169 -4
- package/src/domains/session/prompt-manifest.ts +47 -8
- package/src/domains/session/task-board.ts +21 -3
- package/src/domains/user-tasks/handoff.ts +16 -0
- package/src/engine/acp/adapter.ts +44 -12
- package/src/engine/acp/server.ts +1 -0
- package/src/engine/acp/transport.ts +2 -1
- package/src/engine/acp/types.ts +6 -1
- package/src/engine/antigravity/subprocess-runtime.ts +20 -4
- package/src/engine/api-registry.ts +19 -2
- 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/env-api-keys.ts +2 -1
- package/src/engine/external-subprocess.ts +14 -3
- 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 +53 -15
- 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 +17 -2
- package/src/interactive/editor-submit.ts +13 -0
- package/src/interactive/interactive-application.ts +8 -2
- package/src/interactive/interactive-event-projection.ts +7 -1
- package/src/interactive/interactive-presentation.ts +15 -7
- package/src/interactive/interactive-slash-runtime.ts +2 -0
- package/src/interactive/layout.ts +2 -1
- package/src/interactive/model-session-replay.ts +2 -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/message-picker.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-commands.ts +9 -7
- 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/watch-pane.ts +18 -4
- package/src/interactive/worker-stream.ts +7 -7
- package/src/tools/agent-tools.ts +6 -3
- package/src/tools/bash.ts +1 -1
- package/src/tools/builtin-tool-catalog.ts +9 -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 +34 -0
- package/src/tools/context/index.ts +32 -7
- package/src/tools/context/surface.ts +15 -4
- package/src/tools/decide.ts +1 -1
- package/src/tools/dispatch-admission.ts +12 -1
- package/src/tools/dispatch-arguments.ts +38 -1
- package/src/tools/dispatch-plan.ts +7 -7
- package/src/tools/dispatch-runner.ts +48 -32
- 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/find.ts +13 -4
- package/src/tools/grep.ts +13 -1
- 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/read.ts +112 -15
- package/src/tools/registry.ts +54 -17
- package/src/tools/result-shaping.ts +110 -2
- package/src/tools/tasks.ts +33 -7
- package/src/tools/verify/frontend.ts +67 -30
- package/src/tools/verify/numeric.ts +6 -1
- 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-WGALA46I.js +0 -22
- package/dist/chunk-2WZ546HR.js +0 -792
- package/dist/chunk-5PSMVOLM.js +0 -56
- package/dist/chunk-EL24TAU4.js +0 -1560
- package/dist/chunk-IZXGRF7P.js +0 -4048
- package/dist/chunk-JVCV3ICN.js +0 -47
- package/dist/chunk-MNJGS2IN.js +0 -33
- package/dist/chunk-O5CVSAG5.js +0 -122
- package/dist/chunk-ODGTEFFI.js +0 -50
- package/dist/chunk-OQE5J4C6.js +0 -73
- package/dist/chunk-UUVG37B4.js +0 -244
- package/dist/chunk-V6HJFQZE.js +0 -228
- package/dist/clio-QLICPCF5.js +0 -25
- package/dist/configure-VEPX4NMX.js +0 -55
- package/dist/context-clear-S4ZJCQUX.js +0 -182
- package/dist/detail-A7JAVSIG.js +0 -98
- package/dist/evidence-4F5USFKH.js +0 -208
- package/dist/fleet-view-MN2VG4MR.js +0 -101
- package/dist/inventory-C26CFDRR.js +0 -101
- package/dist/preload-P6DGH2PZ.js +0 -13
- package/dist/slash-commands-ZXPJD64J.js +0 -92
- package/dist/tasks-IPAGMEIX.js +0 -36
- package/dist/tools-EFFEAIDP.js +0 -28
- package/dist/verify-FWYGPKMR.js +0 -29
- package/dist/wiki-generate-743CIGJW.js +0 -476
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { execFileSync } from "node:child_process";
|
|
2
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
3
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
-
import { dirname, join, parse } from "node:path";
|
|
4
|
+
import { dirname, join, parse, resolve } from "node:path";
|
|
4
5
|
import type { ContextActivityPayload } from "../../core/bus-events.js";
|
|
5
6
|
import { createTomlFileReader, type TomlFileReader, tomlTableAt } from "../../core/toml.js";
|
|
6
|
-
import {
|
|
7
|
+
import { INTEROP_AGENT_KINDS } from "../interop/registry.js";
|
|
8
|
+
import { type ProjectPreloadClass, selectProjectPreload } from "../prompts/preload.js";
|
|
7
9
|
import { detectProjectType, type ProjectType } from "../session/workspace/project-type.js";
|
|
8
10
|
import {
|
|
9
11
|
type AdoptionScanResult,
|
|
@@ -139,7 +141,7 @@ export interface RunBootstrapResult {
|
|
|
139
141
|
};
|
|
140
142
|
/**
|
|
141
143
|
* How the session compiler will preload the project context that exists
|
|
142
|
-
* on disk after this run
|
|
144
|
+
* on disk after this run with unknown tool capability: full, partial,
|
|
143
145
|
* or none. In preview mode this reflects the current on-disk state, since
|
|
144
146
|
* preview writes nothing.
|
|
145
147
|
*/
|
|
@@ -249,6 +251,23 @@ function projectTypeLabel(projectType: ProjectType): string {
|
|
|
249
251
|
}
|
|
250
252
|
}
|
|
251
253
|
|
|
254
|
+
/** Only project-wide instructions may become unconditional handbook rules. */
|
|
255
|
+
function handbookInstructionFiles(input: BootstrapGenerateInput): SiblingContextFile[] {
|
|
256
|
+
const projectPaths = new Set(
|
|
257
|
+
INTEROP_AGENT_KINDS.flatMap((kind) => kind.instructionFiles.map((file) => resolve(input.cwd, file))),
|
|
258
|
+
);
|
|
259
|
+
const allowed = new Set(
|
|
260
|
+
input.adoption.sources
|
|
261
|
+
.filter((source) => {
|
|
262
|
+
if (source.kind !== "instructions") return false;
|
|
263
|
+
if (source.scope === "project") return projectPaths.has(source.path);
|
|
264
|
+
return input.adoption.includeGlobal && source.path === resolve(input.adoption.homeDir, ".codex/AGENTS.md");
|
|
265
|
+
})
|
|
266
|
+
.map((source) => source.path),
|
|
267
|
+
);
|
|
268
|
+
return input.siblingFiles.filter((file) => allowed.has(file.path));
|
|
269
|
+
}
|
|
270
|
+
|
|
252
271
|
function allContextText(files: ReadonlyArray<SiblingContextFile>): string {
|
|
253
272
|
return files.map((file) => file.content).join("\n\n");
|
|
254
273
|
}
|
|
@@ -308,7 +327,7 @@ function resolveDefaultIdentity(
|
|
|
308
327
|
* strictly better than that, and only than that.
|
|
309
328
|
*/
|
|
310
329
|
function stabilizedIdentity(input: BootstrapGenerateInput, modelIdentity: unknown, tomlFiles: TomlFileReader): string {
|
|
311
|
-
const deterministic = resolveDefaultIdentity(input.cwd, input.projectType, input
|
|
330
|
+
const deterministic = resolveDefaultIdentity(input.cwd, input.projectType, handbookInstructionFiles(input), tomlFiles);
|
|
312
331
|
const model = typeof modelIdentity === "string" ? modelIdentity.trim() : "";
|
|
313
332
|
if (deterministic.bare && model.length > 0) return model;
|
|
314
333
|
return deterministic.text;
|
|
@@ -423,7 +442,7 @@ function indexedSourceFileCount(codewiki: Codewiki): number {
|
|
|
423
442
|
/** Measure how the session compiler will preload the on-disk project context. */
|
|
424
443
|
function measureProjectPreload(cwd: string): ProjectPreloadClass {
|
|
425
444
|
const promptContext = renderPromptContext(cwd);
|
|
426
|
-
return
|
|
445
|
+
return selectProjectPreload(promptContext, null).classification;
|
|
427
446
|
}
|
|
428
447
|
|
|
429
448
|
function packageScripts(cwd: string): Record<string, string> {
|
|
@@ -724,12 +743,12 @@ function stabilizeGeneratedOutput(
|
|
|
724
743
|
const existing = input.existingClioMd;
|
|
725
744
|
const conventions: string[] = [];
|
|
726
745
|
for (const convention of existing?.conventions ?? []) pushUnique(conventions, convention);
|
|
727
|
-
for (const convention of inferConventions(input.cwd, input
|
|
746
|
+
for (const convention of inferConventions(input.cwd, handbookInstructionFiles(input), input.codewiki)) {
|
|
728
747
|
pushUnique(conventions, convention);
|
|
729
748
|
}
|
|
730
749
|
const invariants: string[] = [];
|
|
731
750
|
for (const invariant of existing?.invariants ?? []) pushUnique(invariants, invariant);
|
|
732
|
-
for (const invariant of inferInvariants(input
|
|
751
|
+
for (const invariant of inferInvariants(handbookInstructionFiles(input))) pushUnique(invariants, invariant);
|
|
733
752
|
|
|
734
753
|
const verification = verificationSection(input.cwd, tomlFiles);
|
|
735
754
|
const inferredSections = inferHeuristicSections(input);
|
|
@@ -776,7 +795,7 @@ function stabilizeGeneratedOutput(
|
|
|
776
795
|
* precise number is falsified by any single added file and carries no
|
|
777
796
|
* navigational value the entry-point list does not.
|
|
778
797
|
*/
|
|
779
|
-
|
|
798
|
+
function codewikiSections(codewiki: Codewiki): ClioMdSection[] {
|
|
780
799
|
const sections: ClioMdSection[] = [];
|
|
781
800
|
const entryPoints = codewikiEntryPoints(codewiki, 8);
|
|
782
801
|
if (entryPoints.length > 0) {
|
|
@@ -793,7 +812,7 @@ export function codewikiSections(codewiki: Codewiki): ClioMdSection[] {
|
|
|
793
812
|
|
|
794
813
|
function inferHeuristicSections(input: BootstrapGenerateInput): ClioMdSection[] {
|
|
795
814
|
const sections: ClioMdSection[] = [...codewikiSections(input.codewiki)];
|
|
796
|
-
const invariants = inferInvariants(input
|
|
815
|
+
const invariants = inferInvariants(handbookInstructionFiles(input));
|
|
797
816
|
if (invariants.length > 0) {
|
|
798
817
|
sections.push({
|
|
799
818
|
title: "Architecture boundaries",
|
|
@@ -827,9 +846,9 @@ function heuristicBootstrapOutputSync(input: BootstrapGenerateInput): BootstrapS
|
|
|
827
846
|
const sharedInput = input.tomlFiles ? input : { ...input, tomlFiles };
|
|
828
847
|
return stabilizeGeneratedOutput(sharedInput, {
|
|
829
848
|
projectName: projectName(input.cwd, tomlFiles),
|
|
830
|
-
identity: resolveDefaultIdentity(input.cwd, input.projectType, input
|
|
831
|
-
conventions: inferConventions(input.cwd, input
|
|
832
|
-
invariants: inferInvariants(input
|
|
849
|
+
identity: resolveDefaultIdentity(input.cwd, input.projectType, handbookInstructionFiles(input), tomlFiles).text,
|
|
850
|
+
conventions: inferConventions(input.cwd, handbookInstructionFiles(input), input.codewiki),
|
|
851
|
+
invariants: inferInvariants(handbookInstructionFiles(input)),
|
|
833
852
|
sections: inferHeuristicSections(input),
|
|
834
853
|
});
|
|
835
854
|
}
|
|
@@ -852,7 +871,7 @@ function bootstrapOutputFromParsed(parsed: ParsedClioMd): BootstrapStructuredOut
|
|
|
852
871
|
|
|
853
872
|
function existingClioMdBootstrapOutput(cwd: string): BootstrapStructuredOutput | null {
|
|
854
873
|
const parsed = tryReadClioMd(cwd);
|
|
855
|
-
if (!parsed?.ok) return null;
|
|
874
|
+
if (!parsed?.ok || !parsed.value) return null;
|
|
856
875
|
return bootstrapOutputFromParsed(parsed.value);
|
|
857
876
|
}
|
|
858
877
|
|
|
@@ -1048,15 +1067,16 @@ async function ensureGitignore(cwd: string, input: RunBootstrapInput): Promise<v
|
|
|
1048
1067
|
}
|
|
1049
1068
|
|
|
1050
1069
|
function serializeBootstrapOutput(output: BootstrapStructuredOutput): string {
|
|
1051
|
-
|
|
1070
|
+
const serialized = serializeClioMd({ ...output, fingerprint: null });
|
|
1071
|
+
const parsed = parseClioMd(serialized);
|
|
1072
|
+
if (!parsed.ok) throw new Error(`bootstrap produced invalid CLIO-CODER.md: ${parsed.errors.join("; ")}`);
|
|
1073
|
+
return serialized;
|
|
1052
1074
|
}
|
|
1053
1075
|
|
|
1054
1076
|
function writeClioMdFile(cwd: string, output: BootstrapStructuredOutput): string {
|
|
1055
1077
|
const clioMdPath = join(cwd, "CLIO-CODER.md");
|
|
1056
1078
|
mkdirSync(dirname(clioMdPath), { recursive: true });
|
|
1057
1079
|
const serialized = serializeBootstrapOutput(output);
|
|
1058
|
-
const parsed = parseClioMd(serialized);
|
|
1059
|
-
if (!parsed.ok) throw new Error(`bootstrap produced invalid CLIO-CODER.md: ${parsed.errors.join("; ")}`);
|
|
1060
1080
|
writeFileSync(clioMdPath, serialized, "utf8");
|
|
1061
1081
|
return clioMdPath;
|
|
1062
1082
|
}
|
|
@@ -1068,11 +1088,31 @@ function timestampForPath(now: Date): string {
|
|
|
1068
1088
|
.replace(/\.\d{3}Z$/, "Z");
|
|
1069
1089
|
}
|
|
1070
1090
|
|
|
1071
|
-
function writeClioMdProposal(
|
|
1091
|
+
function writeClioMdProposal(
|
|
1092
|
+
cwd: string,
|
|
1093
|
+
now: Date,
|
|
1094
|
+
output: BootstrapStructuredOutput,
|
|
1095
|
+
generation: BootstrapGenerationTelemetry,
|
|
1096
|
+
existingSource: string | null,
|
|
1097
|
+
): string {
|
|
1072
1098
|
const dir = join(cwd, ".clio-coder", "proposals");
|
|
1073
1099
|
mkdirSync(dir, { recursive: true });
|
|
1074
|
-
const proposalPath = join(dir, `CLIO-CODER-${timestampForPath(now)}.md`);
|
|
1075
|
-
|
|
1100
|
+
const proposalPath = join(dir, `CLIO-CODER-${timestampForPath(now)}-${randomUUID()}.md`);
|
|
1101
|
+
const serialized = serializeBootstrapOutput(output);
|
|
1102
|
+
writeFileSync(proposalPath, serialized, { encoding: "utf8", flag: "wx" });
|
|
1103
|
+
// Proposal provenance belongs to the candidate, never to the untouched handbook.
|
|
1104
|
+
writeFileSync(
|
|
1105
|
+
`${proposalPath}.json`,
|
|
1106
|
+
`${JSON.stringify({
|
|
1107
|
+
version: 1,
|
|
1108
|
+
createdAt: now.toISOString(),
|
|
1109
|
+
handbookPath: join(cwd, "CLIO-CODER.md"),
|
|
1110
|
+
sourceHash: existingSource === null ? null : createHash("sha256").update(existingSource).digest("hex"),
|
|
1111
|
+
proposalHash: createHash("sha256").update(serialized).digest("hex"),
|
|
1112
|
+
generation: durableGenerationTelemetry(generation),
|
|
1113
|
+
})}\n`,
|
|
1114
|
+
{ encoding: "utf8", flag: "wx" },
|
|
1115
|
+
);
|
|
1076
1116
|
return proposalPath;
|
|
1077
1117
|
}
|
|
1078
1118
|
|
|
@@ -1130,17 +1170,13 @@ function writeProjectState(
|
|
|
1130
1170
|
codewikiVersion: number,
|
|
1131
1171
|
fingerprint: Fingerprint,
|
|
1132
1172
|
generation: BootstrapGenerationTelemetry,
|
|
1133
|
-
|
|
1173
|
+
published: boolean,
|
|
1134
1174
|
): string {
|
|
1135
1175
|
const statePath = resolveStatePath(cwd);
|
|
1136
1176
|
const prev = readClioState(cwd);
|
|
1137
1177
|
// lastBootstrap describes how the CLIO-CODER.md on disk was produced, not what the
|
|
1138
|
-
// most recent run happened to do.
|
|
1139
|
-
|
|
1140
|
-
// `existing` would claim the handbook has no model authorship behind it.
|
|
1141
|
-
const lastBootstrap = generated
|
|
1142
|
-
? durableGenerationTelemetry(generation)
|
|
1143
|
-
: (prev?.lastBootstrap ?? durableGenerationTelemetry(generation));
|
|
1178
|
+
// most recent run happened to do. Proposals retain their own generation record.
|
|
1179
|
+
const lastBootstrap = published ? durableGenerationTelemetry(generation) : prev?.lastBootstrap;
|
|
1144
1180
|
const contextSources = recordAdoption ? adoption.sourceSnapshots : prev?.contextSources;
|
|
1145
1181
|
const contextSourceHash = contextSources ? adoptionSnapshotsHash(contextSources) : undefined;
|
|
1146
1182
|
writeClioState(cwd, {
|
|
@@ -1151,7 +1187,7 @@ function writeProjectState(
|
|
|
1151
1187
|
lastInitAt: now.toISOString(),
|
|
1152
1188
|
lastSessionAt: now.toISOString(),
|
|
1153
1189
|
lastIndexedAt: indexedAt,
|
|
1154
|
-
lastBootstrap,
|
|
1190
|
+
...(lastBootstrap ? { lastBootstrap } : {}),
|
|
1155
1191
|
...(contextSources ? { contextSources } : {}),
|
|
1156
1192
|
...(contextSourceHash ? { contextSourceHash } : {}),
|
|
1157
1193
|
});
|
|
@@ -1304,17 +1340,16 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
|
|
|
1304
1340
|
) {
|
|
1305
1341
|
const detail = existingClioMd && !existingClioMd.ok ? ` (${existingClioMd.error})` : "";
|
|
1306
1342
|
throw new Error(
|
|
1307
|
-
`cannot refresh Imported agent context because CLIO-CODER.md
|
|
1343
|
+
`cannot refresh Imported agent context because CLIO-CODER.md has no structured projection${detail}; use --apply or --rewrite after reviewing the handbook`,
|
|
1308
1344
|
);
|
|
1309
1345
|
}
|
|
1310
1346
|
// A supplied generator *is* the request to generate: both entry points
|
|
1311
1347
|
// withhold `generate` for --heuristic and --preview and supply it otherwise.
|
|
1312
|
-
//
|
|
1313
|
-
//
|
|
1314
|
-
// `lastBootstrap.mode: "existing"`, and looked identical to a run that had no
|
|
1315
|
-
// route at all. The handbook still reaches the generator as source (see
|
|
1316
|
-
// `useExistingClioMdAsSource`), so this refreshes rather than replaces.
|
|
1348
|
+
// For an existing handbook, retain that work as a proposal unless replacement
|
|
1349
|
+
// or adoption was explicitly requested. Generation never implies publication.
|
|
1317
1350
|
const shouldGenerate = !hadClioMd || replaceClioMd || input.proposeClioMd === true || input.generate !== undefined;
|
|
1351
|
+
const shouldPropose =
|
|
1352
|
+
input.proposeClioMd === true || (hadClioMd && input.generate !== undefined && !replaceClioMd && input.adopt !== true);
|
|
1318
1353
|
let output: BootstrapStructuredOutput;
|
|
1319
1354
|
let generation: BootstrapGenerationTelemetry = {
|
|
1320
1355
|
mode: shouldGenerate ? "heuristic" : existingParsed ? "existing" : "heuristic",
|
|
@@ -1427,7 +1462,10 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
|
|
|
1427
1462
|
status: "started",
|
|
1428
1463
|
message: hadClioMd ? "preserving CLIO-CODER.md" : "writing CLIO-CODER.md",
|
|
1429
1464
|
});
|
|
1430
|
-
if (
|
|
1465
|
+
if (shouldPropose) {
|
|
1466
|
+
proposalPath = writeClioMdProposal(cwd, now, output, generation, existingClioMdText);
|
|
1467
|
+
action = "proposed";
|
|
1468
|
+
} else if (!hadClioMd) {
|
|
1431
1469
|
clioMdPath = writeClioMdFile(cwd, output);
|
|
1432
1470
|
action = "wrote";
|
|
1433
1471
|
} else if (replaceClioMd) {
|
|
@@ -1436,9 +1474,6 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
|
|
|
1436
1474
|
} else if (input.adopt === true && existingParsed) {
|
|
1437
1475
|
clioMdPath = writeClioMdFile(cwd, output);
|
|
1438
1476
|
action = "refreshed";
|
|
1439
|
-
} else if (input.proposeClioMd === true) {
|
|
1440
|
-
proposalPath = writeClioMdProposal(cwd, now, output);
|
|
1441
|
-
action = "proposed";
|
|
1442
1477
|
}
|
|
1443
1478
|
progress(input, {
|
|
1444
1479
|
phase: "clio-md",
|
|
@@ -1465,7 +1500,7 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
|
|
|
1465
1500
|
codewiki.version,
|
|
1466
1501
|
codewikiFingerprint,
|
|
1467
1502
|
generation,
|
|
1468
|
-
|
|
1503
|
+
action === "wrote" || action === "refreshed",
|
|
1469
1504
|
);
|
|
1470
1505
|
progress(input, {
|
|
1471
1506
|
phase: "state",
|
|
@@ -1489,7 +1524,7 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
|
|
|
1489
1524
|
if (preload.mode === "full" && preload.nearLimit) {
|
|
1490
1525
|
warn(
|
|
1491
1526
|
input.io,
|
|
1492
|
-
` warning: project context is within 10% of the preload limit (${preload.chars}
|
|
1527
|
+
` warning: project context is within 10% of the preload limit (${preload.chars} UTF-16 units of 8000, ${preload.lines} rendered lines of 220); further growth may omit authored suffixes\n`,
|
|
1493
1528
|
);
|
|
1494
1529
|
}
|
|
1495
1530
|
progress(input, {
|
|
@@ -28,7 +28,10 @@ export interface ParsedClioMd {
|
|
|
28
28
|
|
|
29
29
|
export interface LoadedClioMdFile {
|
|
30
30
|
path: string;
|
|
31
|
-
|
|
31
|
+
/** Exact UTF-8 authored source for prompt rendering. */
|
|
32
|
+
source: string;
|
|
33
|
+
/** Optional generator-format projection; never the authority for authored text. */
|
|
34
|
+
value: ParsedClioMd | null;
|
|
32
35
|
}
|
|
33
36
|
|
|
34
37
|
export interface ClioMdLoadError {
|
|
@@ -39,9 +42,9 @@ export interface ClioMdLoadError {
|
|
|
39
42
|
export interface LoadedProjectClioMd {
|
|
40
43
|
/** Effective files in ancestor-to-descendant order. */
|
|
41
44
|
files: LoadedClioMdFile[];
|
|
42
|
-
/** Selected files that could not be read or
|
|
45
|
+
/** Selected files that could not be read or were empty. */
|
|
43
46
|
errors: ClioMdLoadError[];
|
|
44
|
-
/** The layered
|
|
47
|
+
/** The layered structured projection, or null when no selected file matches the generator format. */
|
|
45
48
|
value: ParsedClioMd | null;
|
|
46
49
|
}
|
|
47
50
|
|
|
@@ -77,10 +80,60 @@ function normalizeInline(value: string): string {
|
|
|
77
80
|
.trim();
|
|
78
81
|
}
|
|
79
82
|
|
|
83
|
+
/**
|
|
84
|
+
* The same text with every character inside a fenced code block or an HTML
|
|
85
|
+
* comment replaced by a filler, newlines kept, so offsets into the mask are
|
|
86
|
+
* offsets into the original. Heading scans run on the mask and slice from the
|
|
87
|
+
* source: a `# comment` line in a fenced shell example used to read as a
|
|
88
|
+
* second H1 and reject the whole handbook, and a `## not a heading` inside a
|
|
89
|
+
* fence split into a section whose serialization then rewrote the fence.
|
|
90
|
+
*/
|
|
91
|
+
function maskNonHeadingRegions(text: string): string {
|
|
92
|
+
const lines = text.split("\n");
|
|
93
|
+
const out: string[] = [];
|
|
94
|
+
let fence: { char: string; length: number } | null = null;
|
|
95
|
+
let inComment = false;
|
|
96
|
+
for (const line of lines) {
|
|
97
|
+
let masked = false;
|
|
98
|
+
if (fence) {
|
|
99
|
+
masked = true;
|
|
100
|
+
const close = /^\s{0,3}(`{3,}|~{3,})\s*$/.exec(line);
|
|
101
|
+
if (close?.[1] && close[1][0] === fence.char && close[1].length >= fence.length) fence = null;
|
|
102
|
+
} else if (inComment) {
|
|
103
|
+
masked = true;
|
|
104
|
+
if (line.includes("-->")) inComment = false;
|
|
105
|
+
} else {
|
|
106
|
+
const open = /^\s{0,3}(`{3,}|~{3,})/.exec(line);
|
|
107
|
+
if (open?.[1]) {
|
|
108
|
+
fence = { char: open[1][0] ?? "`", length: open[1].length };
|
|
109
|
+
masked = true;
|
|
110
|
+
} else if (/^\s*<!--/.test(line)) {
|
|
111
|
+
masked = true;
|
|
112
|
+
if (!line.includes("-->")) inComment = true;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// A non-whitespace filler: the heading regexes end in `\s*$`, which would
|
|
116
|
+
// otherwise run through a blank-masked block and swallow it into the
|
|
117
|
+
// heading match.
|
|
118
|
+
out.push(masked ? "_".repeat(line.length) : line);
|
|
119
|
+
}
|
|
120
|
+
return out.join("\n");
|
|
121
|
+
}
|
|
122
|
+
|
|
80
123
|
function normalizeNestedMarkdown(value: string): string {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
124
|
+
const body = normalizeSource(value).trim();
|
|
125
|
+
// Demote authored H1/H2 inside a section body so it cannot outrank the
|
|
126
|
+
// section, but only where a heading scan would see one: a fence or comment
|
|
127
|
+
// keeps its bytes.
|
|
128
|
+
const mask = maskNonHeadingRegions(body);
|
|
129
|
+
let out = "";
|
|
130
|
+
let cursor = 0;
|
|
131
|
+
for (const match of mask.matchAll(/^(#{1,2})(\s+)/gm)) {
|
|
132
|
+
if (match.index === undefined) continue;
|
|
133
|
+
out += body.slice(cursor, match.index) + "###" + (match[2] ?? "");
|
|
134
|
+
cursor = match.index + match[0].length;
|
|
135
|
+
}
|
|
136
|
+
return out + body.slice(cursor);
|
|
84
137
|
}
|
|
85
138
|
|
|
86
139
|
function charLen(value: string): number {
|
|
@@ -112,7 +165,7 @@ function parseFooter(source: string): {
|
|
|
112
165
|
|
|
113
166
|
const footerEnd = match.index + match[0].length;
|
|
114
167
|
const trailing = source.slice(footerEnd).trim();
|
|
115
|
-
if (trailing.length > 0) warnings.push("trailing content after fingerprint footer
|
|
168
|
+
if (trailing.length > 0) warnings.push("trailing content after fingerprint footer omitted from structured fields");
|
|
116
169
|
let parsed: unknown;
|
|
117
170
|
try {
|
|
118
171
|
parsed = JSON.parse(match[1] ?? "");
|
|
@@ -162,7 +215,7 @@ function validateFooter(value: unknown): ClioMdFingerprintFooter | null {
|
|
|
162
215
|
}
|
|
163
216
|
|
|
164
217
|
function readSections(body: string): ClioMdSection[] {
|
|
165
|
-
const headings = [...body.matchAll(H2_RE)];
|
|
218
|
+
const headings = [...maskNonHeadingRegions(body).matchAll(H2_RE)];
|
|
166
219
|
const sections: ClioMdSection[] = [];
|
|
167
220
|
for (let i = 0; i < headings.length; i += 1) {
|
|
168
221
|
const heading = headings[i];
|
|
@@ -187,7 +240,8 @@ function extraSections(sections: ReadonlyArray<ClioMdSection>): ClioMdSection[]
|
|
|
187
240
|
}
|
|
188
241
|
|
|
189
242
|
function identityParagraph(afterH1: string): string {
|
|
190
|
-
const
|
|
243
|
+
const firstSection = /^##\s+/m.exec(maskNonHeadingRegions(afterH1));
|
|
244
|
+
const beforeFirstSection = firstSection ? afterH1.slice(0, firstSection.index) : afterH1;
|
|
191
245
|
const paragraphs = beforeFirstSection
|
|
192
246
|
.trim()
|
|
193
247
|
.split(/\n\s*\n/)
|
|
@@ -219,7 +273,7 @@ export function parseClioMd(source: string): ClioMdParseResult {
|
|
|
219
273
|
warnings.push(...footerResult.warnings);
|
|
220
274
|
if (footerResult.errors.length > 0) return { ok: false, errors: footerResult.errors, warnings };
|
|
221
275
|
|
|
222
|
-
const h1Matches = [...footerResult.body.matchAll(H1_RE)];
|
|
276
|
+
const h1Matches = [...maskNonHeadingRegions(footerResult.body).matchAll(H1_RE)];
|
|
223
277
|
if (h1Matches.length === 0) return { ok: false, errors: ["missing H1 heading"], warnings };
|
|
224
278
|
if (h1Matches.length > 1) return { ok: false, errors: ["more than one H1 heading"], warnings };
|
|
225
279
|
|
|
@@ -317,7 +371,9 @@ function escapeXmlAttribute(value: string): string {
|
|
|
317
371
|
return value.replaceAll("&", "&").replaceAll('"', """).replaceAll("<", "<").replaceAll(">", ">");
|
|
318
372
|
}
|
|
319
373
|
|
|
320
|
-
export function renderProjectContextFragment(parsed: ParsedClioMd, sourcePath?: string): string {
|
|
374
|
+
export function renderProjectContextFragment(parsed: ParsedClioMd | string, sourcePath?: string): string {
|
|
375
|
+
const source = sourcePath ? ` path="${escapeXmlAttribute(sourcePath)}"` : "";
|
|
376
|
+
if (typeof parsed === "string") return `<project-context${source}>\n${parsed}\n</project-context>`;
|
|
321
377
|
const sections: string[] = [`# ${parsed.projectName}`, parsed.identity];
|
|
322
378
|
if (parsed.conventions.length > 0) {
|
|
323
379
|
sections.push("## Conventions", ...parsed.conventions.map((item) => `- ${item}`));
|
|
@@ -331,7 +387,6 @@ export function renderProjectContextFragment(parsed: ParsedClioMd, sourcePath?:
|
|
|
331
387
|
if (parsed.importedAgentContext) {
|
|
332
388
|
sections.push("## Imported agent context", parsed.importedAgentContext);
|
|
333
389
|
}
|
|
334
|
-
const source = sourcePath ? ` path="${escapeXmlAttribute(sourcePath)}"` : "";
|
|
335
390
|
return `<project-context${source}>\n${sections.join("\n\n")}\n</project-context>`;
|
|
336
391
|
}
|
|
337
392
|
|
|
@@ -352,35 +407,40 @@ function selectedClioMdPath(directory: string): string | null {
|
|
|
352
407
|
return null;
|
|
353
408
|
}
|
|
354
409
|
|
|
355
|
-
function readClioMdPath(
|
|
410
|
+
function readClioMdPath(
|
|
411
|
+
filePath: string,
|
|
412
|
+
): { ok: true; source: string; value: ParsedClioMd | null } | { ok: false; error: string } {
|
|
356
413
|
let content: string;
|
|
357
414
|
try {
|
|
358
415
|
content = readFileSync(filePath, "utf8");
|
|
359
416
|
} catch (err) {
|
|
360
417
|
return { ok: false, error: err instanceof Error ? err.message : String(err) };
|
|
361
418
|
}
|
|
419
|
+
if (content.trim().length === 0) return { ok: false, error: "handbook is empty" };
|
|
420
|
+
// Authored Markdown needs no generator schema. Preserve it even when a
|
|
421
|
+
// structured projection cannot be derived; producer validation stays strict.
|
|
362
422
|
const parsed = parseClioMd(content);
|
|
363
|
-
|
|
364
|
-
return { ok: true, value: parsed.value };
|
|
423
|
+
return { ok: true, source: content, value: parsed.ok ? parsed.value : null };
|
|
365
424
|
}
|
|
366
425
|
|
|
367
426
|
function mergeClioMdFiles(files: ReadonlyArray<LoadedClioMdFile>): ParsedClioMd | null {
|
|
368
|
-
const
|
|
427
|
+
const values = files.flatMap((file) => (file.value ? [file.value] : []));
|
|
428
|
+
const nearest = values.at(-1);
|
|
369
429
|
if (!nearest) return null;
|
|
370
430
|
return {
|
|
371
431
|
projectName: nearest.projectName,
|
|
372
|
-
identity:
|
|
373
|
-
conventions:
|
|
374
|
-
invariants:
|
|
375
|
-
sections:
|
|
432
|
+
identity: values.map((value) => value.identity).join("\n\n"),
|
|
433
|
+
conventions: values.flatMap((value) => value.conventions),
|
|
434
|
+
invariants: values.flatMap((value) => value.invariants),
|
|
435
|
+
sections: values.flatMap((value) => value.sections),
|
|
376
436
|
importedAgentContext:
|
|
377
|
-
|
|
378
|
-
.map((
|
|
437
|
+
values
|
|
438
|
+
.map((value) => value.importedAgentContext)
|
|
379
439
|
.filter((value): value is string => value !== null)
|
|
380
440
|
.join("\n\n") || null,
|
|
381
441
|
fingerprint: nearest.fingerprint,
|
|
382
442
|
firstInit: nearest.firstInit,
|
|
383
|
-
warnings:
|
|
443
|
+
warnings: values.flatMap((value) => value.warnings),
|
|
384
444
|
};
|
|
385
445
|
}
|
|
386
446
|
|
|
@@ -388,7 +448,7 @@ function mergeClioMdFiles(files: ReadonlyArray<LoadedClioMdFile>): ParsedClioMd
|
|
|
388
448
|
* Load effective project handbooks from filesystem root through `cwd`.
|
|
389
449
|
* Candidate selection follows pi-coding-agent 0.84's
|
|
390
450
|
* `loadProjectContextFiles`: an override wins over the base file in the same
|
|
391
|
-
* directory. Clio's
|
|
451
|
+
* directory. Clio's override additionally resets the inherited
|
|
392
452
|
* handbook chain for that subtree, as required by the project-context
|
|
393
453
|
* contract. Handbooks below the override may add new layers.
|
|
394
454
|
*/
|
|
@@ -416,13 +476,15 @@ export function loadProjectClioMd(cwd: string): LoadedProjectClioMd {
|
|
|
416
476
|
const errors: ClioMdLoadError[] = [];
|
|
417
477
|
for (const filePath of selectedPaths) {
|
|
418
478
|
const read = readClioMdPath(filePath);
|
|
419
|
-
if (read.ok) files.push({ path: filePath, value: read.value });
|
|
479
|
+
if (read.ok) files.push({ path: filePath, source: read.source, value: read.value });
|
|
420
480
|
else errors.push({ path: filePath, error: read.error });
|
|
421
481
|
}
|
|
422
482
|
return { files, errors, value: mergeClioMdFiles(files) };
|
|
423
483
|
}
|
|
424
484
|
|
|
425
|
-
export function tryReadClioMd(
|
|
485
|
+
export function tryReadClioMd(
|
|
486
|
+
cwd: string,
|
|
487
|
+
): { ok: true; source: string; value: ParsedClioMd | null } | { ok: false; error: string } | null {
|
|
426
488
|
const filePath = join(cwd, "CLIO-CODER.md");
|
|
427
489
|
if (!existsSync(filePath)) return null;
|
|
428
490
|
return readClioMdPath(filePath);
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { detectProjectType } from "../../session/workspace/project-type.js";
|
|
3
|
+
import { computeFingerprint, isStale } from "../fingerprint.js";
|
|
4
|
+
import { codewikiNeedsBackfill, readCodewiki } from "./artifact.js";
|
|
5
|
+
import type {
|
|
6
|
+
CodewikiArtifactRef,
|
|
7
|
+
CodewikiBuildWorkerOutcome,
|
|
8
|
+
CodewikiBuildWorkerRequest,
|
|
9
|
+
CodewikiBuildWorkerResult,
|
|
10
|
+
} from "./build-worker-protocol.js";
|
|
11
|
+
import { buildCodewiki, type CodewikiBuildOptions, syncCodewiki, updateCodewikiPaths } from "./indexer.js";
|
|
12
|
+
import type { Codewiki } from "./schema.js";
|
|
13
|
+
|
|
14
|
+
function isArtifactRef(value: Codewiki | CodewikiArtifactRef | null): value is CodewikiArtifactRef {
|
|
15
|
+
return value !== null && "source" in value && value.source === "artifact";
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Worker-side build policy; options use the indexer's source reader for
|
|
20
|
+
* deterministic race tests. The outcome omits the artifact when it was handed
|
|
21
|
+
* in by reference and left unchanged, so the coordinator never receives a
|
|
22
|
+
* clone of what it already holds.
|
|
23
|
+
*/
|
|
24
|
+
export async function executeCodewikiBuildOutcome(
|
|
25
|
+
request: CodewikiBuildWorkerRequest,
|
|
26
|
+
options: CodewikiBuildOptions = {},
|
|
27
|
+
): Promise<CodewikiBuildWorkerOutcome> {
|
|
28
|
+
const handed = request.kind === "build" ? null : request.current;
|
|
29
|
+
// Resolved lazily: the unchanged-ensure path below never needs the artifact's
|
|
30
|
+
// contents, and parsing it there would put the cost back that the reference
|
|
31
|
+
// took out. Read once, then reused by every later step.
|
|
32
|
+
let resolved: Codewiki | null | undefined = isArtifactRef(handed) ? undefined : handed;
|
|
33
|
+
const resolveCurrent = (): Codewiki | null => {
|
|
34
|
+
if (resolved === undefined) resolved = readCodewiki(request.cwd);
|
|
35
|
+
return resolved;
|
|
36
|
+
};
|
|
37
|
+
// A reference the disk no longer honors (deleted or corrupt between the
|
|
38
|
+
// coordinator's read and this resolution) is exactly the "no artifact" case:
|
|
39
|
+
// an ensure rebuilds from source as it would have with `current: null`,
|
|
40
|
+
// and an incremental refuses rather than fabricating an index from one path.
|
|
41
|
+
const requireCurrent = (): Codewiki => {
|
|
42
|
+
const current = resolveCurrent();
|
|
43
|
+
if (!current) throw new Error("codewiki artifact referenced by the coordinator is unreadable; rebuild it");
|
|
44
|
+
return current;
|
|
45
|
+
};
|
|
46
|
+
let unreadable = false;
|
|
47
|
+
const buildOptions: CodewikiBuildOptions = {
|
|
48
|
+
...options,
|
|
49
|
+
readFile: (path) => {
|
|
50
|
+
try {
|
|
51
|
+
const text = options.readFile ? options.readFile(path) : readFileSync(path, "utf8");
|
|
52
|
+
if (text === null) unreadable = true;
|
|
53
|
+
return text;
|
|
54
|
+
} catch {
|
|
55
|
+
unreadable = true;
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
if (request.kind === "ensure" && handed !== null) {
|
|
61
|
+
const needsBackfill = isArtifactRef(handed) ? handed.needsBackfill : codewikiNeedsBackfill(handed);
|
|
62
|
+
if (!needsBackfill) {
|
|
63
|
+
const fingerprint = isArtifactRef(handed)
|
|
64
|
+
? computeFingerprint(request.cwd, null, { artifactLoc: handed.loc })
|
|
65
|
+
: computeFingerprint(request.cwd, handed);
|
|
66
|
+
if (request.previous && !isStale(request.previous, fingerprint)) {
|
|
67
|
+
return { codewiki: isArtifactRef(handed) ? null : handed, fingerprint, changed: false };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
let current: Codewiki | null = handed === null ? null : resolveCurrent();
|
|
72
|
+
if (request.kind === "incremental") {
|
|
73
|
+
const base = requireCurrent();
|
|
74
|
+
current = await updateCodewikiPaths(request.cwd, base, request.paths, buildOptions);
|
|
75
|
+
// An unchanged notification proves nothing about unrelated files. Retain
|
|
76
|
+
// the old global baseline so the next ensure still detects external edits.
|
|
77
|
+
if (current === base && request.previous && !unreadable) {
|
|
78
|
+
return { codewiki: isArtifactRef(handed) ? null : base, fingerprint: request.previous, changed: false };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
for (let attempt = 0; attempt < 3; attempt += 1) {
|
|
83
|
+
// Both scans bracket all source reads, including sync's cached parse inputs.
|
|
84
|
+
// Never stamp a post-build tree that changed after an earlier file was read.
|
|
85
|
+
const before = computeFingerprint(request.cwd, current);
|
|
86
|
+
unreadable = false;
|
|
87
|
+
current = current
|
|
88
|
+
? await syncCodewiki(request.cwd, current, buildOptions)
|
|
89
|
+
: await buildCodewiki(
|
|
90
|
+
{
|
|
91
|
+
cwd: request.cwd,
|
|
92
|
+
language:
|
|
93
|
+
(request.kind === "incremental" ? requireCurrent().language : request.language) ??
|
|
94
|
+
detectProjectType(request.cwd),
|
|
95
|
+
},
|
|
96
|
+
buildOptions,
|
|
97
|
+
);
|
|
98
|
+
const after = computeFingerprint(request.cwd, current);
|
|
99
|
+
if (!isStale(before, after) && !unreadable) {
|
|
100
|
+
return { codewiki: current, fingerprint: after, changed: true };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
throw new Error("codewiki source snapshot did not stabilize after 3 attempts; previous index preserved");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* In-process form for callers that hold the artifact: the worker outcome with
|
|
108
|
+
* the handed object substituted wherever the reconciliation left it unchanged.
|
|
109
|
+
*/
|
|
110
|
+
export async function executeCodewikiBuild(
|
|
111
|
+
request: CodewikiBuildWorkerRequest,
|
|
112
|
+
options: CodewikiBuildOptions = {},
|
|
113
|
+
): Promise<CodewikiBuildWorkerResult> {
|
|
114
|
+
const outcome = await executeCodewikiBuildOutcome(request, options);
|
|
115
|
+
if (outcome.codewiki)
|
|
116
|
+
return { codewiki: outcome.codewiki, fingerprint: outcome.fingerprint, changed: outcome.changed };
|
|
117
|
+
const handed = request.kind === "build" ? null : request.current;
|
|
118
|
+
const current = handed && !isArtifactRef(handed) ? handed : readCodewiki(request.cwd);
|
|
119
|
+
if (!current) throw new Error("codewiki reconciliation returned no artifact");
|
|
120
|
+
return { codewiki: current, fingerprint: outcome.fingerprint, changed: outcome.changed };
|
|
121
|
+
}
|
|
@@ -1,6 +1,22 @@
|
|
|
1
1
|
import type { Fingerprint } from "../fingerprint.js";
|
|
2
2
|
import type { Codewiki } from "./schema.js";
|
|
3
3
|
|
|
4
|
+
/**
|
|
5
|
+
* The committed artifact, named instead of shipped. Structured-cloning a
|
|
6
|
+
* parsed index into the worker and back costs main-thread time proportional to
|
|
7
|
+
* the index size on every reconciliation, including the `code_nav` calls that
|
|
8
|
+
* reconcile nothing. The coordinator already holds the artifact lease, so the
|
|
9
|
+
* file on disk is exactly the object it would have cloned; the worker reads it
|
|
10
|
+
* only on the paths that need its contents.
|
|
11
|
+
*/
|
|
12
|
+
export interface CodewikiArtifactRef {
|
|
13
|
+
source: "artifact";
|
|
14
|
+
/** `codewikiNeedsBackfill(current)`, computed where the object is already parsed. */
|
|
15
|
+
needsBackfill: boolean;
|
|
16
|
+
/** Source line total the artifact records, so an unchanged fingerprint matches the committed one exactly. */
|
|
17
|
+
loc: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
4
20
|
export type CodewikiBuildWorkerRequest =
|
|
5
21
|
| { kind: "build"; cwd: string; language: Codewiki["language"] }
|
|
6
22
|
| {
|
|
@@ -8,10 +24,17 @@ export type CodewikiBuildWorkerRequest =
|
|
|
8
24
|
cwd: string;
|
|
9
25
|
/** Optional when neither state nor an existing artifact identifies the project. */
|
|
10
26
|
language?: Codewiki["language"];
|
|
11
|
-
current: Codewiki | null;
|
|
27
|
+
current: Codewiki | CodewikiArtifactRef | null;
|
|
12
28
|
previous: Fingerprint | null;
|
|
13
29
|
}
|
|
14
|
-
| {
|
|
30
|
+
| {
|
|
31
|
+
kind: "incremental";
|
|
32
|
+
cwd: string;
|
|
33
|
+
current: Codewiki | CodewikiArtifactRef;
|
|
34
|
+
paths: string[];
|
|
35
|
+
/** Retained for no-op batches; absence requires global reconciliation. */
|
|
36
|
+
previous?: Fingerprint | null;
|
|
37
|
+
};
|
|
15
38
|
|
|
16
39
|
export interface CodewikiBuildWorkerResult {
|
|
17
40
|
codewiki: Codewiki;
|
|
@@ -19,6 +42,17 @@ export interface CodewikiBuildWorkerResult {
|
|
|
19
42
|
changed: boolean;
|
|
20
43
|
}
|
|
21
44
|
|
|
45
|
+
/**
|
|
46
|
+
* What the worker posts back. An unchanged reconciliation of an artifact it
|
|
47
|
+
* was handed by reference leaves `codewiki` null: the caller still holds the
|
|
48
|
+
* object, and returning it would clone the whole artifact a second time.
|
|
49
|
+
*/
|
|
50
|
+
export interface CodewikiBuildWorkerOutcome {
|
|
51
|
+
codewiki: Codewiki | null;
|
|
52
|
+
fingerprint: Fingerprint;
|
|
53
|
+
changed: boolean;
|
|
54
|
+
}
|
|
55
|
+
|
|
22
56
|
export type CodewikiBuildWorkerMessage =
|
|
23
|
-
| { ok: true; result:
|
|
57
|
+
| { ok: true; result: CodewikiBuildWorkerOutcome }
|
|
24
58
|
| { ok: false; error: string; stack?: string };
|