@iowarp/clio-coder 0.4.7 → 0.4.8
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/.claude-plugin/marketplace.json +1 -1
- package/CHANGELOG.md +29 -0
- package/CONTRIBUTING.md +83 -74
- package/README.md +66 -45
- package/dist/{acp-W3Y3TRHD.js → acp-JWPQZM2D.js} +14 -14
- package/dist/{agents-J4ICNLQ3.js → agents-4GCDIRVX.js} +55 -54
- package/dist/assets/codewiki.json +1 -1
- package/dist/assets/web-notices/@hono__node-server-LICENSE +21 -0
- package/dist/assets/web-notices/hono-LICENSE +21 -0
- package/dist/{auth-X2UJUMOC.js → auth-SYAKTDQE.js} +22 -22
- package/dist/background-OW67WMYR.js +37 -0
- package/dist/{builtins-XLXWWSRF.js → builtins-TKS63VNV.js} +4 -4
- package/dist/chunk-2JSCCEKO.js +85 -0
- package/dist/{chunk-QKWL7SYE.js → chunk-2SXGG2IV.js} +49 -38
- package/dist/{chunk-MZHXENL7.js → chunk-2U2U5POA.js} +5 -5
- package/dist/{chunk-NCCQ6DVS.js → chunk-2ZWLMA3T.js} +6 -6
- package/dist/{chunk-FQOOGXBH.js → chunk-36XSBPXL.js} +7 -7
- package/dist/{chunk-5AJPUR72.js → chunk-3IQOZRQ6.js} +7 -7
- package/dist/{chunk-4MFBBY2Z.js → chunk-44U2OUSM.js} +3 -3
- package/dist/{chunk-5ZSZEYJK.js → chunk-4P6M2TTE.js} +2 -2
- package/dist/{chunk-IZYTT3CD.js → chunk-526ABLHD.js} +6 -6
- package/dist/{chunk-BO4XV5VX.js → chunk-5C2OQHLR.js} +4 -4
- package/dist/chunk-5D2FNBMG.js +185 -0
- package/dist/{chunk-M6Z2V6YU.js → chunk-5HULHKT2.js} +5 -5
- package/dist/{chunk-PFLOULP3.js → chunk-5UG6EZI3.js} +4 -4
- package/dist/{chunk-WN552PKN.js → chunk-5W4FRA5Q.js} +280 -900
- package/dist/{chunk-KAFMW7WM.js → chunk-6R5MBXBJ.js} +1 -1
- package/dist/{chunk-24S3DN22.js → chunk-6TKOFFGE.js} +4 -4
- package/dist/{chunk-YKRJTYNP.js → chunk-6UJ7RDI7.js} +4 -4
- package/dist/{chunk-GXIWHXDB.js → chunk-6X7VOCDY.js} +3 -3
- package/dist/{chunk-KKEYGFX4.js → chunk-7QQRPB2E.js} +11 -11
- package/dist/{chunk-34XHRVKG.js → chunk-ARRUMZ7X.js} +2 -2
- package/dist/{chunk-3T4DXWP6.js → chunk-ATB3Q7YO.js} +1 -6
- package/dist/chunk-AUHVBIDW.js +19 -0
- package/dist/{chunk-L3Z5ANCV.js → chunk-BE4I3UJ2.js} +7 -7
- package/dist/chunk-BFPHMSK7.js +169 -0
- package/dist/{chunk-LVFANMOH.js → chunk-BHJMMCXS.js} +4 -4
- package/dist/{chunk-D2T66PDV.js → chunk-BIY22UUK.js} +35 -203
- package/dist/{chunk-VMATUZB6.js → chunk-D55WO5J7.js} +11 -11
- package/dist/{chunk-2O2LVQQK.js → chunk-E2NSPYLC.js} +4 -4
- package/dist/{chunk-IJMW64DX.js → chunk-EFXMQYI6.js} +32 -32
- package/dist/{chunk-GVZFCJHE.js → chunk-EPYATQMG.js} +18 -18
- package/dist/{chunk-MZNWZUJM.js → chunk-EXKUF426.js} +11 -11
- package/dist/{chunk-IMOD2YPV.js → chunk-F7Y6QTPL.js} +9 -19
- package/dist/{chunk-IQCNVLO6.js → chunk-FB3KTE2J.js} +10 -7
- package/dist/{chunk-3LXJOICS.js → chunk-FNVPQQYT.js} +2 -2
- package/dist/{chunk-UUQ5G6EZ.js → chunk-GEYX2NZ5.js} +2 -2
- package/dist/{chunk-CP3HIR5H.js → chunk-GJBJHJNY.js} +19 -18
- package/dist/{chunk-LZBMXNLP.js → chunk-GM4TY6VN.js} +43 -6
- package/dist/{chunk-WT5TRMO4.js → chunk-GVU4CXPJ.js} +179 -65
- package/dist/{chunk-TZ6UVP2H.js → chunk-H5DPSUBB.js} +8 -8
- package/dist/{chunk-EUEXGXXR.js → chunk-H77XBUBM.js} +5 -5
- package/dist/{config-YXARKGTX.js → chunk-HMGAKB7E.js} +15 -259
- package/dist/{chunk-EUZRMP4Y.js → chunk-HP7KJ5O2.js} +19 -19
- package/dist/chunk-HVCAY2FH.js +67 -0
- package/dist/{chunk-CPXGJI2A.js → chunk-ICYIUNO4.js} +4 -4
- package/dist/{chunk-GI5RRMAH.js → chunk-IILXVWJY.js} +7 -7
- package/dist/{chunk-MNQN3X6Y.js → chunk-JCVIL6TY.js} +5 -5
- package/dist/chunk-JIMWEYWO.js +63 -0
- package/dist/{chunk-C3G5PNUO.js → chunk-JLBVCROW.js} +25 -25
- package/dist/chunk-JOBN2YQQ.js +176 -0
- package/dist/chunk-JOL2QRLE.js +152 -0
- package/dist/{chunk-N37QC5FV.js → chunk-JRA6OBHY.js} +5 -5
- package/dist/{chunk-C6GEXX4L.js → chunk-JV25I7ID.js} +7 -7
- package/dist/{chunk-SEDI5K5B.js → chunk-JYKUMHCQ.js} +16 -16
- package/dist/{chunk-UA6W4XFJ.js → chunk-K3W6BF5C.js} +2 -2
- package/dist/chunk-K45LHSCI.js +194 -0
- package/dist/{chunk-UA3W4FGC.js → chunk-K53E2PTW.js} +5 -5
- package/dist/{chunk-VCRVEDUC.js → chunk-K5UJD6MM.js} +5 -5
- package/dist/{chunk-65BGHOUR.js → chunk-KGP3UQGJ.js} +5 -5
- package/dist/chunk-KKRXONXG.js +43 -0
- package/dist/{chunk-LBFQMYS3.js → chunk-KWJXCL2X.js} +5 -3
- package/dist/{chunk-RTLNFZMD.js → chunk-L75H5B3B.js} +3 -3
- package/dist/{chunk-G4LGUTOE.js → chunk-LLCGGVSW.js} +6 -6
- package/dist/{chunk-HRAKUPIH.js → chunk-LZCCBLRC.js} +5 -5
- package/dist/{chunk-WURGVOZJ.js → chunk-LZDLYSUN.js} +18 -14
- package/dist/{chunk-ISNCCX42.js → chunk-MATCRH3M.js} +7 -6
- package/dist/{chunk-BAU36233.js → chunk-MEHBW2SP.js} +7 -7
- package/dist/{chunk-BQQ5MXUC.js → chunk-MUXNDNMZ.js} +3 -3
- package/dist/{chunk-NO7J45X6.js → chunk-MWMW53WW.js} +90 -51
- package/dist/chunk-MZDPF35R.js +45 -0
- package/dist/{chunk-P4DL2LM5.js → chunk-MZKYVIWW.js} +8 -119
- package/dist/{chunk-T334FW2H.js → chunk-O2QJDRWP.js} +5 -5
- package/dist/{chunk-T7QQBNLH.js → chunk-O3HSB2YL.js} +9 -7
- package/dist/{chunk-WB7POC6M.js → chunk-OEMFEL26.js} +6 -6
- package/dist/{chunk-77CZRFTE.js → chunk-OPC4DQD6.js} +2 -2
- package/dist/{chunk-4UHVS5T7.js → chunk-ORRNGQDV.js} +8 -8
- package/dist/{chunk-TZHN5ITX.js → chunk-P4JS3MH5.js} +5 -5
- package/dist/{chunk-WBVKKTUT.js → chunk-P7GTE4FX.js} +2 -2
- package/dist/{chunk-6TAATXXH.js → chunk-PAQVETLA.js} +6 -6
- package/dist/{chunk-6CA2BHOR.js → chunk-PFZJMXIY.js} +4 -4
- package/dist/{chunk-4QKAITQT.js → chunk-PGEFOTJB.js} +70 -7
- package/dist/{chunk-MBJO5VNZ.js → chunk-PJ5H5B7A.js} +25 -25
- package/dist/{chunk-DO7M3LSX.js → chunk-PMUUAABD.js} +43 -96
- package/dist/{chunk-A67NR5AT.js → chunk-Q32C6AWI.js} +11 -8
- package/dist/{chunk-ECOMVOHP.js → chunk-QGIC5SX5.js} +2 -2
- package/dist/{chunk-5CMARGPF.js → chunk-QLAGXTTV.js} +7 -2
- package/dist/{chunk-GFQ7P2UF.js → chunk-QLKCCC2J.js} +9 -9
- package/dist/{chunk-SELG4SUR.js → chunk-QWUSS2QP.js} +7 -4
- package/dist/{chunk-P5SC4DLJ.js → chunk-QYSAZMSH.js} +2 -2
- package/dist/{fleet-decisions-S3PTZV2D.js → chunk-R5NRX5N4.js} +5 -41
- package/dist/{chunk-DLIYANB7.js → chunk-RAUOKUZV.js} +11 -11
- package/dist/{chunk-UFYNOQK4.js → chunk-RBES4TCZ.js} +7 -7
- package/dist/{chunk-T52TPHYC.js → chunk-RFULVPBX.js} +4 -4
- package/dist/{chunk-TLTGZTXI.js → chunk-RKFNU5UA.js} +3 -3
- package/dist/{chunk-T4TY5GG3.js → chunk-RM3XJX7P.js} +3 -3
- package/dist/{chunk-6YA46L5A.js → chunk-RNLAPBJL.js} +2 -2
- package/dist/chunk-RPMNIFRY.js +65 -0
- package/dist/{chunk-DACXIVVF.js → chunk-RRZFRIJP.js} +5 -5
- package/dist/{chunk-CE64C5K5.js → chunk-RXI7K4J5.js} +61 -61
- package/dist/{chunk-CULVKYTK.js → chunk-STC6CWUZ.js} +5 -5
- package/dist/{chunk-6YHPAAZR.js → chunk-TEHVMHOK.js} +3 -3
- package/dist/{chunk-VTYHHQ57.js → chunk-TOPICHGR.js} +2 -2
- package/dist/{chunk-UWD3JD5X.js → chunk-UB33F3YW.js} +10 -10
- package/dist/{chunk-TN5FW4XY.js → chunk-UDAK6GR2.js} +12 -9
- package/dist/chunk-USBBEKHW.js +177 -0
- package/dist/{chunk-6CB2IL4N.js → chunk-W5RM7YAH.js} +1 -1
- package/dist/{chunk-6LRLOJHQ.js → chunk-W7KNI3F5.js} +11 -62
- package/dist/chunk-WFTSK7N3.js +637 -0
- package/dist/{chunk-YPRSNUTC.js → chunk-WJWNZXRM.js} +2 -2
- package/dist/chunk-WS4FOGLY.js +686 -0
- package/dist/{chunk-ZGIGW4ZG.js → chunk-WTZVSMQZ.js} +5 -5
- package/dist/{chunk-XR3XJN2M.js → chunk-WWRV5RJI.js} +4 -4
- package/dist/{chunk-24TOGHPO.js → chunk-X6FLVUM5.js} +4 -4
- package/dist/chunk-XC5POIL4.js +68 -0
- package/dist/{chunk-XZ6UFQ52.js → chunk-XTLJDC2X.js} +22 -17
- package/dist/{chunk-7EEGBKV4.js → chunk-YGIV24MF.js} +8 -8
- package/dist/{chunk-RXFPB32E.js → chunk-YJCCMYYT.js} +2 -2
- package/dist/{chunk-4N2RZ4TO.js → chunk-YKIIWURD.js} +3 -3
- package/dist/{chunk-USZA7GWL.js → chunk-YQ3GFEUY.js} +2 -2
- package/dist/{chunk-KS7ETA3P.js → chunk-YXANQGCX.js} +6 -6
- package/dist/{chunk-HOX4YZ2K.js → chunk-YXFKLMX2.js} +5 -5
- package/dist/chunk-ZST3FRCV.js +132 -0
- package/dist/cli/index.js +39 -37
- package/dist/{clio-L2P7S2R2.js → clio-BPBAPZGA.js} +9 -9
- package/dist/{code-nav-B5LNX4KU.js → code-nav-KBQ3RIFK.js} +33 -33
- package/dist/{components-63MMQKUT.js → components-6DKAXWFN.js} +10 -10
- package/dist/config-FWL5JK2H.js +270 -0
- package/dist/config-graph-ACDB26L2.js +156 -0
- package/dist/{configure-LMVQJ46J.js → configure-ZIZ4YV62.js} +48 -48
- package/dist/{context-7HJEWTTP.js → context-EZZPT2ZV.js} +49 -49
- package/dist/{context-YG2LZDYZ.js → context-VIL5MFRH.js} +86 -84
- package/dist/{context-XSZKKFBW.js → context-Z3GOBHDK.js} +16 -16
- package/dist/{context-clear-AC5NXHM2.js → context-clear-ZPB3L7MN.js} +72 -70
- package/dist/{context-index-KKTPRV5G.js → context-index-W6A4V7OC.js} +4 -4
- package/dist/{context-map-T7ROR5D5.js → context-map-DKL3QT6D.js} +3 -3
- package/dist/{context-working-set-F4Q4J3NS.js → context-working-set-2GLBVF7L.js} +23 -22
- package/dist/{detail-H73BEF2N.js → detail-VSBWYSGZ.js} +73 -71
- package/dist/{dispatch-runner-3RY5FSJC.js → dispatch-runner-EEEHGKX4.js} +78 -76
- package/dist/docs-VMMWFVHL.js +101 -0
- package/dist/{doctor-EQYJOGUG.js → doctor-V5L4IQGP.js} +63 -62
- package/dist/{eval-4P7O6CCE.js → eval-VJYJ2BV3.js} +80 -65
- package/dist/{eval-inventory-QOYZERXJ.js → eval-inventory-CX24K2JT.js} +5 -60
- package/dist/evals-J2H5V6DD.js +104 -0
- package/dist/{evidence-D6GUSYJW.js → evidence-POWAEBEW.js} +72 -70
- package/dist/evidence-XCCCLS36.js +242 -0
- package/dist/{evidence-O76QF7TZ.js → evidence-Y35YSXH6.js} +80 -78
- package/dist/{evolve-H47BCETS.js → evolve-GPG72VB6.js} +74 -72
- package/dist/{extensions-NNL3ZOCU.js → extensions-YIZ7W3DA.js} +12 -11
- package/dist/fleet-2MDCQ2VK.js +264 -0
- package/dist/{fleet-KMNS6NOM.js → fleet-W2AF3TOJ.js} +127 -123
- package/dist/{fleet-commands-DOWSYCBX.js → fleet-commands-WS56G26H.js} +11 -11
- package/dist/fleet-decisions-MYGZ3JW7.js +52 -0
- package/dist/{fleet-graph-F2DE2TME.js → fleet-graph-ELTBXBAV.js} +22 -22
- package/dist/{fleet-inspect-EN2Q6IVB.js → fleet-inspect-45IK73L4.js} +84 -248
- package/dist/{fleet-preflight-FRLETDD3.js → fleet-preflight-T5NCZKHE.js} +4 -4
- package/dist/{fleet-validate-B2XDLS57.js → fleet-validate-VG4JBLA4.js} +26 -26
- package/dist/{fleet-verify-4JKUWGJ7.js → fleet-verify-VTSABAYO.js} +72 -70
- package/dist/{fleet-view-BHJFW26B.js → fleet-view-XC7WMKSS.js} +75 -73
- package/dist/{init-XAT5N5YM.js → init-VTJNNTIP.js} +95 -92
- package/dist/install-6PIF6F6W.js +19 -0
- package/dist/{interop-FVECHFKG.js → interop-IU6BNA7C.js} +25 -25
- package/dist/{inventory-7KFQGLCV.js → inventory-QPQUTUUZ.js} +75 -73
- package/dist/{library-NY2XOT75.js → library-HUTAS57T.js} +33 -33
- package/dist/{library-QAPAO23R.js → library-LF7DLU6S.js} +13 -13
- package/dist/library-Q3NWL5CM.js +75 -0
- package/dist/{library-import-5Y6MAS3R.js → library-import-PPW4YUC5.js} +25 -25
- package/dist/{library-inventory-JT6HWITQ.js → library-inventory-DIRVFRZU.js} +19 -19
- package/dist/{library-validation-EQUH25DC.js → library-validation-XHUZ3INE.js} +17 -17
- package/dist/{memory-DYVTTCP6.js → memory-Z2LSKNV6.js} +74 -72
- package/dist/{models-MASFJ6Y2.js → models-3FTREYPY.js} +53 -52
- package/dist/{monitor-YMP4NXJJ.js → monitor-HF2MQRB3.js} +83 -80
- package/dist/{orchestrator-AFQRRTEI.js → orchestrator-UYPA6W4S.js} +498 -358
- package/dist/{panes-NICTHQCV.js → panes-736XB73K.js} +14 -14
- package/dist/{panes-D3Y2KFG5.js → panes-C4P3PIWT.js} +4 -4
- package/dist/{paths-PSFAUIGO.js → paths-JQ4QYIYB.js} +6 -6
- package/dist/{preload-5Q7VXRFJ.js → preload-XSLRYH3Y.js} +72 -70
- package/dist/{reset-7NKZK7JN.js → reset-V7QSPZYE.js} +9 -9
- package/dist/{resources-NILSIZAT.js → resources-OJGDFHYT.js} +22 -22
- package/dist/{run-BPZGEBZV.js → run-T354SMDW.js} +129 -125
- package/dist/settings-MWZXO6RV.js +72 -0
- package/dist/{share-EZ6ERBMH.js → share-Y5ZKJPND.js} +26 -26
- package/dist/{skills-BTVVNYVM.js → skills-4GLZC4LN.js} +28 -28
- package/dist/{skills-eval-UY34MNK7.js → skills-eval-L5T7GODM.js} +87 -85
- package/dist/{skills-inventory-JDHSIA7I.js → skills-inventory-LASKXEZI.js} +22 -22
- package/dist/{slash-commands-K4FNQ2AT.js → slash-commands-OIMRU36D.js} +49 -49
- package/dist/{steer-2B3EQGFH.js → steer-KMAM2Y2C.js} +4 -4
- package/dist/{support-L2SOL3IE.js → support-AWC3XKPX.js} +8 -8
- package/dist/system-CD75NYBU.js +116 -0
- package/dist/{targets-44VKGFLN.js → targets-VSZX2J2S.js} +66 -65
- package/dist/{tasks-3KODKFU7.js → tasks-AN567LYH.js} +14 -14
- package/dist/{terminal-lease-LXA7MMPO.js → terminal-lease-6KTWNHVY.js} +3 -3
- package/dist/{tools-3UB7TEVR.js → tools-AGRK3V5J.js} +13 -13
- package/dist/{trace-TAMIU4OJ.js → trace-P4MQZD33.js} +18 -67
- package/dist/{uninstall-QYVRPEM4.js → uninstall-BRUTEPIC.js} +37 -12
- package/dist/{upgrade-7PMKM2JH.js → upgrade-SBCGHQGJ.js} +22 -21
- package/dist/{usage-6EQV7EQK.js → usage-BIDVTO6V.js} +93 -87
- package/dist/{verifiers-JLITWSHU.js → verifiers-LTGCAMXS.js} +12 -12
- package/dist/{verify-T7NAEVIG.js → verify-OZU4LLNP.js} +9 -9
- package/dist/web/client/THIRD_PARTY_LICENSES.md +1809 -0
- package/dist/web/client/assets/abnfDiagram-VCTEODGH-C5wfoHm3.js +1 -0
- package/dist/web/client/assets/arc-oH91sfLl.js +1 -0
- package/dist/web/client/assets/architecture-7GRP2DOG-EGozsYEO.js +1 -0
- package/dist/web/client/assets/architectureDiagram-5GKGNRK7-z9FokbJl.js +36 -0
- package/dist/web/client/assets/array-BifhSqXX.js +1 -0
- package/dist/web/client/assets/atkinson-hyperlegible-next-latin-ext-wght-normal-C6vrW8VD.woff2 +0 -0
- package/dist/web/client/assets/atkinson-hyperlegible-next-latin-wght-normal-BcXVPD7q.woff2 +0 -0
- package/dist/web/client/assets/blockDiagram-I7D4REHJ-wi0_CYHL.js +129 -0
- package/dist/web/client/assets/c4Diagram-7LVT6UL2-DV7NYc2W.js +38 -0
- package/dist/web/client/assets/channel-CiUWbHN9.js +1 -0
- package/dist/web/client/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/web/client/assets/chunk-4HAMMTFA-Bhsegh3F.js +62 -0
- package/dist/web/client/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/web/client/assets/chunk-75Z2AOVW-RQCckcQG.js +2 -0
- package/dist/web/client/assets/chunk-DU6HZSFF-C5USiOAy.js +125 -0
- package/dist/web/client/assets/chunk-F27PBJKO-BcNqv2x1.js +1 -0
- package/dist/web/client/assets/chunk-FOHPRMQF-CoA4358r.js +161 -0
- package/dist/web/client/assets/chunk-GMAD6QVW-Bq8JWiZT.js +72 -0
- package/dist/web/client/assets/chunk-GVQU2GXP-DbchrAeJ.js +1 -0
- package/dist/web/client/assets/chunk-IMKFNOWR-DrpvjocK.js +231 -0
- package/dist/web/client/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/web/client/assets/chunk-L3NEJ4N5-DHLmTnCe.js +1 -0
- package/dist/web/client/assets/chunk-OSK3NFVY-CsRbtN9n.js +10 -0
- package/dist/web/client/assets/chunk-P2QGCYS3-aqPbxoMh.js +1 -0
- package/dist/web/client/assets/chunk-POPQ4Y6H-Dl5vw0h0.js +1 -0
- package/dist/web/client/assets/chunk-PWAF6VOD-D7OBRSdO.js +1 -0
- package/dist/web/client/assets/chunk-SHT3W25Y-CdKCIwuB.js +168 -0
- package/dist/web/client/assets/chunk-SVP7TREG-B94Nu_1-.js +88 -0
- package/dist/web/client/assets/chunk-TICWLB2K-jjRQI_hk.js +206 -0
- package/dist/web/client/assets/chunk-XXDRQBXY-azkbKE37.js +1 -0
- package/dist/web/client/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/web/client/assets/classDiagram-ZZMXUADV-CMODalmo.js +1 -0
- package/dist/web/client/assets/classDiagram-v2-VYDZK3BY-CMODalmo.js +1 -0
- package/dist/web/client/assets/commit-mono-latin-400-normal-s0S3qwFW.woff +0 -0
- package/dist/web/client/assets/commit-mono-latin-400-normal-wzhe4RuD.woff2 +0 -0
- package/dist/web/client/assets/cose-bilkent-JH36ORCC-RbQL23qS.js +1 -0
- package/dist/web/client/assets/cynefin-OW5HDTMX--i9RDU5f.js +1 -0
- package/dist/web/client/assets/cynefinDiagram-5FMLGOSQ-cRcvyBdp.js +62 -0
- package/dist/web/client/assets/cytoscape.esm-c2aL46s-.js +321 -0
- package/dist/web/client/assets/dagre-C-rnJpZF.js +1 -0
- package/dist/web/client/assets/dagre-GXQ25YYZ-C9mZmAPe.js +4 -0
- package/dist/web/client/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/web/client/assets/diagram-S7CK7UJ4-Oj_zlLDY.js +30 -0
- package/dist/web/client/assets/diagram-UQ7AKVKN-BWKbbfcR.js +41 -0
- package/dist/web/client/assets/diagram-VSXAHHWV-C3N3f7DO.js +3 -0
- package/dist/web/client/assets/diagram-VX7I27RA-CtDKDAWe.js +24 -0
- package/dist/web/client/assets/diagram-Z3DM3KII-B8bkBRCz.js +24 -0
- package/dist/web/client/assets/dist-D0_q-A2b.js +1 -0
- package/dist/web/client/assets/ebnfDiagram-PWID7BFC-CskW-Whx.js +1 -0
- package/dist/web/client/assets/erDiagram-RLTQ6QDP-C-83cgCW.js +99 -0
- package/dist/web/client/assets/eventmodeling-NTZA5JFV-DjVq8wKU.js +1 -0
- package/dist/web/client/assets/flowDiagram-HODETNUW-BUiCBGXt.js +1 -0
- package/dist/web/client/assets/ganttDiagram-EL5Y4UJY-B2lb8lvF.js +292 -0
- package/dist/web/client/assets/gitGraph-4MIJSDKK-B40cQtBE.js +1 -0
- package/dist/web/client/assets/gitGraphDiagram-WWUBYQGX-CH-7P7Di.js +106 -0
- package/dist/web/client/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/web/client/assets/index-Dsi52apB.css +1 -0
- package/dist/web/client/assets/index-FSIC94pi.js +83 -0
- package/dist/web/client/assets/info-A6RAGUB7-eCCE9D_Q.js +1 -0
- package/dist/web/client/assets/infoDiagram-27XIBGKW-DRnvqMjM.js +2 -0
- package/dist/web/client/assets/init-C-OQMol4.js +1 -0
- package/dist/web/client/assets/ishikawaDiagram-5VMMS53U-DBA_55wp.js +70 -0
- package/dist/web/client/assets/journeyDiagram-3NMN7TZE-C-ewpNl7.js +139 -0
- package/dist/web/client/assets/kanban-definition-UXKFOSKX-B1taGsu0.js +89 -0
- package/dist/web/client/assets/katex-ZlcWpGUi.js +257 -0
- package/dist/web/client/assets/line-lZ0kyxDI.js +1 -0
- package/dist/web/client/assets/linear-DIc8FgZj.js +1 -0
- package/dist/web/client/assets/mermaid-parser.core-SXolxpXw.js +7 -0
- package/dist/web/client/assets/mermaid.core-DXgQtkNg.js +44 -0
- package/dist/web/client/assets/mindmap-definition-YA3MSWOX-DXJas9K7.js +96 -0
- package/dist/web/client/assets/newsreader-latin-ext-wght-normal-C-3rgBeH.woff2 +0 -0
- package/dist/web/client/assets/newsreader-latin-wght-normal-CCVVNp6i.woff2 +0 -0
- package/dist/web/client/assets/newsreader-vietnamese-wght-normal-Czsa-EzN.woff2 +0 -0
- package/dist/web/client/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/web/client/assets/packet-AYTQ26CC-OqVl_07o.js +1 -0
- package/dist/web/client/assets/path-fybaL0A-.js +1 -0
- package/dist/web/client/assets/pegDiagram-XKGWAZYB-CPE_zdfN.js +1 -0
- package/dist/web/client/assets/pie-WAS4IAKB-DAxnMBLe.js +1 -0
- package/dist/web/client/assets/pieDiagram-E7YTZNPT-Uwjpufxv.js +39 -0
- package/dist/web/client/assets/prism-bash-D6zCJ74D.js +1 -0
- package/dist/web/client/assets/prism-c-04YixN25.js +1 -0
- package/dist/web/client/assets/prism-clike-DapgWyxx.js +1 -0
- package/dist/web/client/assets/prism-core-BngLtbUd.js +1 -0
- package/dist/web/client/assets/prism-cpp-C-lJbC-6.js +1 -0
- package/dist/web/client/assets/prism-css-CPgOzxXp.js +1 -0
- package/dist/web/client/assets/prism-diff-BF8m0_mq.js +3 -0
- package/dist/web/client/assets/prism-docker-DkT6yOFj.js +1 -0
- package/dist/web/client/assets/prism-fortran-Be5x3y1V.js +1 -0
- package/dist/web/client/assets/prism-go-C_8qAH5n.js +1 -0
- package/dist/web/client/assets/prism-ini-BESK3y0r.js +1 -0
- package/dist/web/client/assets/prism-javascript-BnO-swvr.js +1 -0
- package/dist/web/client/assets/prism-json-Dp_-W-Hv.js +1 -0
- package/dist/web/client/assets/prism-jsx-D-D0NWtC.js +1 -0
- package/dist/web/client/assets/prism-julia-DIjOgiAV.js +1 -0
- package/dist/web/client/assets/prism-latex-DNMbqcH_.js +1 -0
- package/dist/web/client/assets/prism-makefile-CRKWLQ8l.js +1 -0
- package/dist/web/client/assets/prism-markdown-C0FPJ1Iz.js +1 -0
- package/dist/web/client/assets/prism-markup-Cp04rIa1.js +1 -0
- package/dist/web/client/assets/prism-matlab-D-nk08al.js +1 -0
- package/dist/web/client/assets/prism-python-CfiSVtM6.js +1 -0
- package/dist/web/client/assets/prism-r-QmNGR8LX.js +1 -0
- package/dist/web/client/assets/prism-rust-Bu9N8X3N.js +1 -0
- package/dist/web/client/assets/prism-shell-session-Be4UuYoM.js +1 -0
- package/dist/web/client/assets/prism-sql-CYhVDMEE.js +1 -0
- package/dist/web/client/assets/prism-toml-DKb54GAT.js +1 -0
- package/dist/web/client/assets/prism-tsx-p6J2Kc_4.js +1 -0
- package/dist/web/client/assets/prism-typescript-BMqONzxf.js +1 -0
- package/dist/web/client/assets/prism-yaml-C0JHu8gr.js +1 -0
- package/dist/web/client/assets/purify.es-ChwZkWde.js +3 -0
- package/dist/web/client/assets/quadrantDiagram-AXDQQJYC-Bjs4yjgs.js +7 -0
- package/dist/web/client/assets/radar-RG4KPBEZ-CuCKjHM3.js +1 -0
- package/dist/web/client/assets/railroad-74A4TZTK-CnQK-Cc1.js +1 -0
- package/dist/web/client/assets/railroad-abnf-HS5TGJTU-BcW01NZG.js +1 -0
- package/dist/web/client/assets/railroad-ebnf-LZEXJU2U-B7YCEDDd.js +1 -0
- package/dist/web/client/assets/railroad-peg-WCYAUIDC-DjNZbSTZ.js +1 -0
- package/dist/web/client/assets/railroadDiagram-O6MQD6OU-BDDIPNLL.js +1 -0
- package/dist/web/client/assets/requirementDiagram-BXWQKSXE-B5Ydyxc1.js +84 -0
- package/dist/web/client/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/web/client/assets/sankeyDiagram-P5KCCOFB-Bw2Qym75.js +40 -0
- package/dist/web/client/assets/sequenceDiagram-WJ2MYXX4-BZf36nO0.js +162 -0
- package/dist/web/client/assets/sizeCapture-INFHLROL-B0uUizjq.js +1 -0
- package/dist/web/client/assets/src-yeptRXpt.js +1 -0
- package/dist/web/client/assets/stateDiagram-D77RDMKH-DnH6JRkp.js +1 -0
- package/dist/web/client/assets/stateDiagram-v2-MP3YSRHH-C7QtHeK4.js +1 -0
- package/dist/web/client/assets/swimlanes-42K2YHIH-D9PZmtZg.js +1 -0
- package/dist/web/client/assets/swimlanesDiagram-VR7AAH4N-CBZlPFky.js +8 -0
- package/dist/web/client/assets/timeline-definition-24CTP7MA-CrkZZBo7.js +120 -0
- package/dist/web/client/assets/treeView-Q6P3EWNA-C9zDShoC.js +1 -0
- package/dist/web/client/assets/treemap-WGGIJYW6-B-plj9yK.js +1 -0
- package/dist/web/client/assets/vennDiagram-4TSXK5OY-VeOdaphN.js +34 -0
- package/dist/web/client/assets/wardley-WFR3VGLG-Wl1P_m6L.js +1 -0
- package/dist/web/client/assets/wardleyDiagram-VM6X3IG4-B85-R9t2.js +78 -0
- package/dist/web/client/assets/xychartDiagram-S5SC5T6Z-BrD8OW8m.js +7 -0
- package/dist/web/client/clio-coder-logo.webp +0 -0
- package/dist/web/client/icon-192.png +0 -0
- package/dist/web/client/icon-512.png +0 -0
- package/dist/web/client/index.html +4 -0
- package/dist/web/client/manifest.webmanifest +15 -0
- package/dist/web/client/offline.css +55 -0
- package/dist/web/client/offline.html +5 -0
- package/dist/web/client/offline.js +27 -0
- package/dist/web/client/sw.js +34 -0
- package/dist/web/ops-worker.js +37 -0
- package/dist/web/reads-worker.js +1726 -0
- package/dist/web/server.js +8499 -0
- package/dist/web-EU6ATJWA.js +13 -0
- package/dist/{web-fetch-W4TNW4Q7.js → web-fetch-U22Q7HV4.js} +3 -3
- package/dist/{wiki-generate-T2TJQJUA.js → wiki-generate-LZRLFG6I.js} +98 -95
- package/dist/{with-panes-CHFC7HGI.js → with-panes-X5CZOGML.js} +9 -9
- package/dist/worker/entry.js +68 -68
- package/docs/README.md +27 -26
- package/docs/architecture/acp.md +5 -9
- package/docs/architecture/alcf-provider.md +0 -3
- package/docs/architecture/architecture.md +0 -3
- package/docs/architecture/artifact-placement.md +0 -3
- package/docs/architecture/artifact-versions.md +0 -3
- package/docs/architecture/capacity-and-scheduling.md +0 -3
- package/docs/architecture/context-engine.md +0 -3
- package/docs/architecture/context-working-set.md +0 -3
- package/docs/architecture/dispatch-architecture-rationale.md +0 -3
- package/docs/architecture/dispatch-typed-intent.md +0 -3
- package/docs/architecture/evidence-and-memory.md +0 -3
- package/docs/architecture/library.md +0 -2
- package/docs/architecture/middleware-and-components.md +0 -3
- package/docs/architecture/model-catalog.md +1 -4
- package/docs/architecture/observability.md +0 -3
- package/docs/architecture/pi-boundary.md +6 -9
- package/docs/architecture/prompt-envelope-and-tools.md +1 -4
- package/docs/architecture/provider-adapter-cookbook.md +1 -4
- package/docs/architecture/safety-model.md +0 -3
- package/docs/architecture/session-lifecycle.md +0 -3
- package/docs/architecture/time-conventions.md +0 -3
- package/docs/architecture/trace-store.md +28 -20
- package/docs/architecture/tui-design.md +1 -4
- package/docs/architecture/worker-context.md +1 -3
- package/docs/architecture/worker-dispatch-mechanics.md +1 -4
- package/docs/guide/authoring-plugins.md +1 -3
- package/docs/guide/built-in-agents.md +0 -3
- package/docs/guide/commands-and-modes.md +2 -6
- package/docs/guide/configuration-and-targets.md +197 -4
- package/docs/guide/configuration-reference.md +9 -4
- package/docs/guide/environment-variables.md +0 -3
- package/docs/guide/exit-codes-and-output.md +0 -3
- package/docs/guide/extensions-and-sharing.md +0 -3
- package/docs/guide/fleet-dispatch.md +0 -3
- package/docs/guide/glossary.md +0 -3
- package/docs/guide/harness-extensions.md +0 -2
- package/docs/guide/installation-and-lifecycle.md +1 -4
- package/docs/guide/interop.md +0 -2
- package/docs/guide/panes-and-files.md +0 -3
- package/docs/guide/plugins.md +0 -3
- package/docs/guide/proactive-memory.md +0 -3
- package/docs/guide/resource-library.md +0 -2
- package/docs/guide/skills-marketplace.md +0 -2
- package/docs/guide/tool-usage.md +0 -3
- package/docs/guide/troubleshooting.md +0 -3
- package/docs/history/config-knobs-audit.md +0 -3
- package/docs/history/release-cut-checklist.md +0 -3
- package/docs/process/development-pipeline.md +0 -3
- package/docs/process/documentation-coverage.md +3 -3
- package/docs/process/documentation-guide.md +15 -22
- package/docs/process/eval-runner.md +0 -3
- package/docs/process/evals-internal.md +0 -3
- package/docs/process/evolution.md +0 -3
- package/docs/process/fleet-demo-runbook.md +0 -3
- package/docs/process/git-commit-provenance.md +0 -3
- package/docs/process/performance-methodology.md +1 -4
- package/docs/process/release-cut-checklist.md +114 -221
- package/docs/process/scientific-validation.md +1 -4
- package/library/registry.yaml +2 -2
- package/library/skills/meta/clio-coder-test/SKILL.md +25 -15
- package/library/skills/meta/clio-coder-test/evals.md +16 -2
- package/library/skills/meta/clio-coder-test/plugin.json +1 -1
- package/library/skills/meta/clio-coder-test/references/test-map.md +19 -18
- package/library/skills/registry.yaml +2 -2
- package/library/skills/skill-marketplace.json +1 -1
- package/package.json +13 -11
- package/src/cli/docs.ts +65 -328
- package/src/cli/index.ts +3 -1
- package/src/cli/trace.ts +4 -65
- package/src/cli/uninstall.ts +26 -0
- package/src/cli/usage.ts +3 -0
- package/src/cli/web.ts +79 -0
- package/src/core/bus-events.ts +3 -4
- package/src/core/config.ts +71 -0
- package/src/core/domain-loader.ts +37 -28
- package/src/core/termination.ts +13 -9
- package/src/domains/agents/contract.ts +1 -1
- package/src/domains/agents/extension.ts +18 -10
- package/src/domains/config/extension.ts +5 -4
- package/src/domains/dispatch/extension.ts +75 -12
- package/src/domains/dispatch/index.ts +1 -0
- package/src/domains/dispatch/orphan-recovery.ts +1 -0
- package/src/domains/dispatch/receipt-integrity.ts +3 -0
- package/src/domains/dispatch/state.ts +1 -2
- package/src/domains/dispatch/types.ts +2 -0
- package/src/domains/eval/metrics/tracked.ts +22 -2
- package/src/domains/extensions/operator-runtime.ts +3 -1
- package/src/domains/middleware/hooks.ts +2 -2
- package/src/domains/observability/background-memory-usage.ts +3 -0
- package/src/domains/observability/compaction-usage.ts +2 -0
- package/src/domains/observability/cost.ts +5 -0
- package/src/domains/observability/extension.ts +1 -0
- package/src/domains/observability/out-of-turn-usage.ts +2 -0
- package/src/domains/observability/trace-store.ts +65 -5
- package/src/domains/prompts/extension.ts +4 -17
- package/src/domains/providers/cache-deployment.ts +147 -0
- package/src/domains/providers/catalog.ts +12 -7
- package/src/domains/providers/extension.ts +27 -5
- package/src/domains/providers/index.ts +1 -0
- package/src/domains/providers/plugins.ts +3 -13
- package/src/domains/providers/runtimes/common/local-synth.ts +4 -0
- package/src/domains/providers/types/target-descriptor.ts +17 -0
- package/src/domains/session/compaction/compact.ts +4 -1
- package/src/domains/session/entries.ts +1 -0
- package/src/domains/session/usage.ts +6 -7
- package/src/engine/acp/server.ts +11 -0
- package/src/engine/ai.ts +2 -0
- package/src/engine/apis/openai-completions.ts +9 -4
- package/src/engine/prewarm.ts +232 -0
- package/src/engine/provider-diagnostics.ts +6 -1
- package/src/entry/orchestrator.ts +20 -16
- package/src/interactive/chat-loop-messages.ts +3 -0
- package/src/interactive/chat-loop.ts +2 -8
- package/src/interactive/prewarm.ts +11 -197
- package/src/interactive/session-usage-reseed.ts +2 -0
- package/src/interactive/side-question.ts +2 -0
- package/src/interactive/turn-context.ts +1 -0
- package/src/interactive/turn-persistence.ts +3 -0
- package/src/interactive/turn-prewarm.ts +126 -19
- package/src/interactive/turn-runtime.ts +14 -0
- package/src/tools/builtin-tool-catalog.ts +8 -4
- package/src/tools/registry.ts +12 -2
- package/src/worker/spec-contract.ts +27 -0
- package/dist/docs-BL7ROUFN.js +0 -292
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iowarp/clio-coder",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.8",
|
|
4
4
|
"description": "The terminal coding agent for people who maintain the code that science runs on, with user-chosen models and inspectable evidence.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -57,7 +57,6 @@
|
|
|
57
57
|
".claude-plugin/marketplace.json",
|
|
58
58
|
"evals/**",
|
|
59
59
|
"docs/**/*.md",
|
|
60
|
-
"!docs/html/**",
|
|
61
60
|
"README.md",
|
|
62
61
|
"CHANGELOG.md",
|
|
63
62
|
"CONTRIBUTING.md",
|
|
@@ -72,8 +71,8 @@
|
|
|
72
71
|
"access": "public"
|
|
73
72
|
},
|
|
74
73
|
"scripts": {
|
|
75
|
-
"build": "
|
|
76
|
-
"dev": "
|
|
74
|
+
"build": "node --import tsx scripts/build.ts && node --import tsx scripts/build-codewiki-asset.ts",
|
|
75
|
+
"dev": "node --import tsx scripts/build.ts --watch",
|
|
77
76
|
"clean": "rm -rf dist",
|
|
78
77
|
"typecheck": "tsc -p tsconfig.tests.json",
|
|
79
78
|
"format": "biome format --write .",
|
|
@@ -82,18 +81,21 @@
|
|
|
82
81
|
"pi:surface-snapshot": "node --import tsx scripts/pi-surface-diff.ts --write",
|
|
83
82
|
"test:file": "node --import tsx --import ./tests/harness/tmp-root.ts --test",
|
|
84
83
|
"pretest": "test -f dist/cli/index.js || pnpm run build",
|
|
85
|
-
"test": "node --import tsx --import ./tests/harness/tmp-root.ts --test tests/contracts/*.test.ts tests/smoke
|
|
86
|
-
"test:
|
|
87
|
-
"
|
|
88
|
-
"ci": "
|
|
89
|
-
"ci:release": "pnpm run ci && node scripts/check-release.mjs",
|
|
84
|
+
"test": "node --import tsx --import ./tests/harness/tmp-root.ts --test --test-concurrency=2 tests/contracts/*.test.ts tests/smoke/acp-boundary.test.ts tests/smoke/real-binary-boot.test.ts tests/smoke/process-lifecycle.test.ts",
|
|
85
|
+
"test:web": "pnpm --filter @iowarp/clio-coder-web test",
|
|
86
|
+
"ci": "pnpm run typecheck && pnpm run lint && pnpm run build && pnpm run test && pnpm run test:web",
|
|
87
|
+
"ci:release": "node scripts/release-candidate.mjs qualify",
|
|
90
88
|
"install:local": "bash scripts/install-local.sh",
|
|
91
89
|
"smoke:real-home": "bash scripts/smoke-real-home.sh",
|
|
92
|
-
"prepublishOnly": "
|
|
90
|
+
"prepublishOnly": "node scripts/release-candidate.mjs preflight",
|
|
93
91
|
"skills:pin": "node --import tsx scripts/pin-skills.ts",
|
|
94
92
|
"skills:check": "node --import tsx scripts/pin-skills.ts --check",
|
|
95
93
|
"library:pin": "node --import tsx scripts/pin-library.ts",
|
|
96
|
-
"library:check": "node --import tsx scripts/pin-library.ts --check"
|
|
94
|
+
"library:check": "node --import tsx scripts/pin-library.ts --check",
|
|
95
|
+
"test:full": "node --import tsx --import ./tests/harness/tmp-root.ts --test tests/contracts/*.test.ts tests/extended/*.test.ts tests/smoke/*.test.ts tests/extended-smoke/*.test.ts",
|
|
96
|
+
"test:package": "node --import tsx --import ./tests/harness/tmp-root.ts --test --test-concurrency=2 tests/smoke/installed-package.test.ts tests/smoke/native-call-timing.test.ts",
|
|
97
|
+
"release:preflight": "node scripts/release-candidate.mjs preflight",
|
|
98
|
+
"test:web:full": "pnpm --filter @iowarp/clio-coder-web test:full"
|
|
97
99
|
},
|
|
98
100
|
"optionalDependencies": {
|
|
99
101
|
"@anthropic-ai/claude-agent-sdk": "0.3.186"
|
package/src/cli/docs.ts
CHANGED
|
@@ -1,354 +1,91 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { createServer, type IncomingMessage, type Server, type ServerResponse } from "node:http";
|
|
4
|
-
import type { AddressInfo } from "node:net";
|
|
5
|
-
import { relative, resolve } from "node:path";
|
|
6
|
-
import chalk from "chalk";
|
|
1
|
+
import { readdirSync } from "node:fs";
|
|
2
|
+
import { basename, join } from "node:path";
|
|
7
3
|
import { resolvePackageRoot } from "../core/package-root.js";
|
|
8
|
-
import { printError
|
|
9
|
-
|
|
10
|
-
// Human-facing viewer over the source-checkout HTML blueprints. It binds an ephemeral
|
|
11
|
-
// static file server to 127.0.0.1 only, serves docs/html/index.html as the
|
|
12
|
-
// menu plus the blueprint pages, prints the URL, and runs until SIGINT. It
|
|
13
|
-
// uses only Node's built-in http and fs: zero new dependencies, no daemon, no
|
|
14
|
-
// persisted state, no telemetry, and no external network. The static-path
|
|
15
|
-
// resolution and the menu synthesis are pure functions so they unit-test
|
|
16
|
-
// without binding a port.
|
|
17
|
-
|
|
18
|
-
const HOST = "127.0.0.1";
|
|
4
|
+
import { printError } from "./argv.js";
|
|
5
|
+
import { runWebCommand } from "./web.js";
|
|
19
6
|
|
|
20
7
|
const HELP = `clio-coder docs [topic] [--no-open]
|
|
21
8
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
ships the categorized Markdown reference tree under docs/ and excludes HTML.
|
|
25
|
-
The server binds an ephemeral port on
|
|
26
|
-
127.0.0.1, keeps no state, runs no daemon, and reaches no external network.
|
|
27
|
-
Press Ctrl+C to stop it.
|
|
9
|
+
Open the documentation in the Clio Coder web app. Pages, navigation and outlines
|
|
10
|
+
are rendered from the same Markdown reference shipped with Clio.
|
|
28
11
|
|
|
29
12
|
Arguments:
|
|
30
|
-
[topic]
|
|
31
|
-
|
|
13
|
+
[topic] a topic such as safety, configuration, or fleet_dispatch, or a
|
|
14
|
+
document path such as architecture/safety-model.md.
|
|
15
|
+
Omit to open the documentation map.
|
|
32
16
|
|
|
33
17
|
Flags:
|
|
34
|
-
--no-open
|
|
18
|
+
--no-open print the private launch link without opening a browser.
|
|
35
19
|
--help, -h this message.
|
|
36
|
-
`;
|
|
37
|
-
|
|
38
|
-
const CONTENT_TYPES: Readonly<Record<string, string>> = {
|
|
39
|
-
".html": "text/html; charset=utf-8",
|
|
40
|
-
".htm": "text/html; charset=utf-8",
|
|
41
|
-
".css": "text/css; charset=utf-8",
|
|
42
|
-
".js": "text/javascript; charset=utf-8",
|
|
43
|
-
".mjs": "text/javascript; charset=utf-8",
|
|
44
|
-
".json": "application/json; charset=utf-8",
|
|
45
|
-
".svg": "image/svg+xml",
|
|
46
|
-
".png": "image/png",
|
|
47
|
-
".webp": "image/webp",
|
|
48
|
-
".jpg": "image/jpeg",
|
|
49
|
-
".jpeg": "image/jpeg",
|
|
50
|
-
".gif": "image/gif",
|
|
51
|
-
".ico": "image/x-icon",
|
|
52
|
-
".woff": "font/woff",
|
|
53
|
-
".woff2": "font/woff2",
|
|
54
|
-
".ttf": "font/ttf",
|
|
55
|
-
".map": "application/json; charset=utf-8",
|
|
56
|
-
".txt": "text/plain; charset=utf-8",
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
export interface DocsMenuEntry {
|
|
60
|
-
/** Short deep-link key, for example `safety`. */
|
|
61
|
-
topic: string;
|
|
62
|
-
/** Real on-disk file name, for example `safety_blueprint.html`. */
|
|
63
|
-
file: string;
|
|
64
|
-
/** Human label, for example `Safety`. */
|
|
65
|
-
label: string;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/** Resolve the source-checkout HTML root. The npm package deliberately excludes it. */
|
|
69
|
-
function resolveDocsHtmlDir(): string {
|
|
70
|
-
return resolve(resolvePackageRoot(), "docs", "html");
|
|
71
|
-
}
|
|
72
20
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
return CONTENT_TYPES[filePath.slice(dot).toLowerCase()] ?? "application/octet-stream";
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* Map a request URL to a safe relative path under the html root. Pure: no disk
|
|
82
|
-
* access. Strips the query and fragment, decodes percent-escapes, defaults `/`
|
|
83
|
-
* to `index.html`, and rejects any traversal segment so a request can never
|
|
84
|
-
* escape the served directory.
|
|
85
|
-
*/
|
|
86
|
-
function resolveRequestPath(rawUrl: string): { ok: true; relative: string } | { ok: false; reason: string } {
|
|
87
|
-
const pathPart = (rawUrl.split(/[?#]/, 1)[0] ?? "").trim();
|
|
88
|
-
let decoded: string;
|
|
89
|
-
try {
|
|
90
|
-
decoded = decodeURIComponent(pathPart);
|
|
91
|
-
} catch {
|
|
92
|
-
return { ok: false, reason: "bad-request" };
|
|
93
|
-
}
|
|
94
|
-
if (decoded.includes("\0")) return { ok: false, reason: "forbidden" };
|
|
95
|
-
const segments = decoded.split(/[/\\]/).filter((segment) => segment.length > 0 && segment !== ".");
|
|
96
|
-
if (segments.length === 0) return { ok: true, relative: "index.html" };
|
|
97
|
-
for (const segment of segments) {
|
|
98
|
-
if (segment === "..") return { ok: false, reason: "forbidden" };
|
|
99
|
-
}
|
|
100
|
-
return { ok: true, relative: segments.join("/") };
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function titleize(topic: string): string {
|
|
104
|
-
return topic
|
|
105
|
-
.split(/[-_]+/)
|
|
106
|
-
.filter((word) => word.length > 0)
|
|
107
|
-
.map((word) => word.charAt(0).toUpperCase() + word.slice(1))
|
|
108
|
-
.join(" ");
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Synthesize the deep-linkable topic menu from a directory listing. Pure: takes
|
|
113
|
-
* the file-name list, not the directory. `index.html` is the menu itself and is
|
|
114
|
-
* excluded; a trailing `_blueprint` is stripped from the topic key.
|
|
115
|
-
*/
|
|
116
|
-
function synthesizeMenu(fileNames: ReadonlyArray<string>): DocsMenuEntry[] {
|
|
117
|
-
const entries: DocsMenuEntry[] = [];
|
|
118
|
-
for (const name of fileNames) {
|
|
119
|
-
if (!name.toLowerCase().endsWith(".html")) continue;
|
|
120
|
-
if (name.toLowerCase() === "index.html") continue;
|
|
121
|
-
const topic = name.replace(/\.html$/i, "").replace(/_blueprint$/i, "");
|
|
122
|
-
entries.push({ topic, file: name, label: titleize(topic) });
|
|
123
|
-
}
|
|
124
|
-
entries.sort((a, b) => a.topic.localeCompare(b.topic));
|
|
125
|
-
return entries;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Resolve a user-supplied `[topic]` to a real file name. Pure. Accepts the bare
|
|
130
|
-
* topic (`safety`), the blueprint file stem (`safety_blueprint`), or a full
|
|
131
|
-
* `.html` name, case-insensitively. Returns null when nothing matches.
|
|
132
|
-
*/
|
|
133
|
-
function topicToFile(topic: string, fileNames: ReadonlyArray<string>): string | null {
|
|
134
|
-
const wanted = topic
|
|
135
|
-
.trim()
|
|
136
|
-
.toLowerCase()
|
|
137
|
-
.replace(/\.html$/i, "");
|
|
138
|
-
if (wanted.length === 0) return null;
|
|
139
|
-
for (const candidate of [`${wanted}.html`, `${wanted}_blueprint.html`]) {
|
|
140
|
-
const match = fileNames.find((name) => name.toLowerCase() === candidate);
|
|
141
|
-
if (match) return match;
|
|
142
|
-
}
|
|
143
|
-
const hit = synthesizeMenu(fileNames).find((entry) => entry.topic.toLowerCase() === wanted);
|
|
144
|
-
return hit ? hit.file : null;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
function isWithin(child: string, parent: string): boolean {
|
|
148
|
-
const rel = relative(parent, child);
|
|
149
|
-
return rel === "" || (!rel.startsWith("..") && !rel.startsWith(`..${"/"}`) && !/^([A-Za-z]:)?[/\\]/.test(rel));
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
function listHtmlFiles(htmlDir: string): string[] {
|
|
153
|
-
try {
|
|
154
|
-
return readdirSync(htmlDir)
|
|
155
|
-
.filter((name) => name.toLowerCase().endsWith(".html"))
|
|
156
|
-
.sort((a, b) => a.localeCompare(b));
|
|
157
|
-
} catch {
|
|
158
|
-
return [];
|
|
159
|
-
}
|
|
160
|
-
}
|
|
21
|
+
Reuses your installed background app when available. Otherwise starts a local
|
|
22
|
+
foreground web server on 127.0.0.1; press Ctrl+C to stop it. No background service
|
|
23
|
+
is installed by this command. Your current directory does not affect the docs.
|
|
24
|
+
`;
|
|
161
25
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
res.writeHead(status, { "content-type": "text/plain; charset=utf-8" });
|
|
175
|
-
res.end(resolved.reason);
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
const requestedTarget = resolve(root, resolved.relative);
|
|
179
|
-
if (!isWithin(requestedTarget, root)) {
|
|
180
|
-
res.writeHead(403, { "content-type": "text/plain; charset=utf-8" });
|
|
181
|
-
res.end("forbidden");
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
let size: number | null = null;
|
|
185
|
-
let target: string | null = null;
|
|
186
|
-
try {
|
|
187
|
-
target = realpathSync(requestedTarget);
|
|
188
|
-
if (!isWithin(target, root)) {
|
|
189
|
-
res.writeHead(403, { "content-type": "text/plain; charset=utf-8" });
|
|
190
|
-
res.end("forbidden");
|
|
191
|
-
return;
|
|
192
|
-
}
|
|
193
|
-
const stat = statSync(target);
|
|
194
|
-
if (stat.isFile()) size = stat.size;
|
|
195
|
-
} catch {
|
|
196
|
-
size = null;
|
|
197
|
-
}
|
|
198
|
-
if (size === null || target === null) {
|
|
199
|
-
res.writeHead(404, { "content-type": "text/plain; charset=utf-8" });
|
|
200
|
-
res.end("not found");
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
const headers = {
|
|
204
|
-
"content-type": contentTypeFor(target),
|
|
205
|
-
"content-length": String(size),
|
|
206
|
-
"cache-control": "no-store",
|
|
207
|
-
};
|
|
208
|
-
if (req.method === "HEAD") {
|
|
209
|
-
res.writeHead(200, headers);
|
|
210
|
-
res.end();
|
|
211
|
-
return;
|
|
212
|
-
}
|
|
213
|
-
res.writeHead(200, headers);
|
|
214
|
-
const stream = createReadStream(target);
|
|
215
|
-
stream.on("error", () => {
|
|
216
|
-
if (!res.writableEnded) res.end();
|
|
217
|
-
});
|
|
218
|
-
stream.pipe(res);
|
|
26
|
+
const key = (value: string) => value.toLowerCase().replace(/_/g, "-");
|
|
27
|
+
const route = (path: string) => `/docs/${path.split("/").map(encodeURIComponent).join("/")}`;
|
|
28
|
+
|
|
29
|
+
/** Resolve only catalogued destinations; ambiguous basenames require a full path. */
|
|
30
|
+
export function docsTopicRoute(topic: string | undefined, pages: readonly string[]): string | undefined {
|
|
31
|
+
if (topic === undefined) return "/docs";
|
|
32
|
+
if (!topic || /[\\\0?#]/.test(topic) || topic.startsWith("/") || topic.split("/").includes("..")) return;
|
|
33
|
+
const wanted = key(topic.replace(/^docs\//, ""));
|
|
34
|
+
const topics: Record<string, string> = {
|
|
35
|
+
safety: "architecture/safety-model.md",
|
|
36
|
+
configuration: "guide/configuration-and-targets.md",
|
|
37
|
+
trace: "architecture/trace-store.md",
|
|
219
38
|
};
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
const onError = (err: Error): void => rejectListen(err);
|
|
243
|
-
server.once("error", onError);
|
|
244
|
-
server.listen(options.port ?? 0, host, () => {
|
|
245
|
-
server.removeListener("error", onError);
|
|
246
|
-
resolveListen();
|
|
247
|
-
});
|
|
248
|
-
});
|
|
249
|
-
const address = server.address() as AddressInfo;
|
|
250
|
-
const port = address.port;
|
|
251
|
-
return {
|
|
252
|
-
server,
|
|
253
|
-
port,
|
|
254
|
-
url: `http://${host}:${port}/`,
|
|
255
|
-
close: () => new Promise<void>((resolveClose) => server.close(() => resolveClose())),
|
|
39
|
+
const preferred = topics[wanted];
|
|
40
|
+
if (preferred && pages.includes(preferred)) return route(preferred);
|
|
41
|
+
const exact = pages.find((path) => key(path) === wanted || key(path.replace(/\.md$/i, "")) === wanted);
|
|
42
|
+
if (exact) return route(exact);
|
|
43
|
+
const name = wanted.replace(/\.md$/, "");
|
|
44
|
+
const exactNames = pages.filter((path) => key(basename(path).replace(/\.md$/i, "")) === name);
|
|
45
|
+
const matches = exactNames.length
|
|
46
|
+
? exactNames
|
|
47
|
+
: pages.filter((path) => key(basename(path).replace(/\.md$/i, "")).startsWith(`${name}-`));
|
|
48
|
+
const match = matches[0];
|
|
49
|
+
return matches.length === 1 && match ? route(match) : undefined;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function catalog(root: string) {
|
|
53
|
+
const pages: string[] = [];
|
|
54
|
+
const scan = (path: string) => {
|
|
55
|
+
for (const entry of readdirSync(join(root, path), { withFileTypes: true })) {
|
|
56
|
+
const name = path ? `${path}/${entry.name}` : entry.name;
|
|
57
|
+
if (name === "html") continue;
|
|
58
|
+
if (entry.isDirectory()) scan(name);
|
|
59
|
+
else if (entry.isFile() && /\.md$/i.test(name)) pages.push(name);
|
|
60
|
+
}
|
|
256
61
|
};
|
|
62
|
+
scan("");
|
|
63
|
+
return pages;
|
|
257
64
|
}
|
|
258
65
|
|
|
259
|
-
function
|
|
260
|
-
const platform = process.platform;
|
|
261
|
-
const command = platform === "darwin" ? "open" : platform === "win32" ? "cmd" : "xdg-open";
|
|
262
|
-
const args = platform === "win32" ? ["/c", "start", "", url] : [url];
|
|
263
|
-
try {
|
|
264
|
-
const child = spawn(command, args, { stdio: "ignore", detached: true });
|
|
265
|
-
child.on("error", () => {
|
|
266
|
-
// Best-effort: the printed URL is the fallback when no opener exists.
|
|
267
|
-
});
|
|
268
|
-
child.unref();
|
|
269
|
-
} catch {
|
|
270
|
-
// Best-effort: never fail the command because a browser could not launch.
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
export function waitForShutdown(): Promise<void> {
|
|
275
|
-
return new Promise((resolveShutdown) => {
|
|
276
|
-
const onSignal = (): void => {
|
|
277
|
-
process.removeListener("SIGINT", onSignal);
|
|
278
|
-
process.removeListener("SIGTERM", onSignal);
|
|
279
|
-
resolveShutdown();
|
|
280
|
-
};
|
|
281
|
-
process.once("SIGINT", onSignal);
|
|
282
|
-
process.once("SIGTERM", onSignal);
|
|
283
|
-
});
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
export async function runDocsCommand(args: ReadonlyArray<string> = []): Promise<number> {
|
|
66
|
+
export async function runDocsCommand(args: readonly string[] = []): Promise<number> {
|
|
287
67
|
if (args.includes("--help") || args.includes("-h")) {
|
|
288
68
|
process.stdout.write(HELP);
|
|
289
69
|
return 0;
|
|
290
70
|
}
|
|
291
|
-
|
|
292
|
-
const positionals
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
noOpen = true;
|
|
296
|
-
continue;
|
|
297
|
-
}
|
|
298
|
-
if (arg.startsWith("-")) {
|
|
299
|
-
printError(`unknown flag: ${arg}`);
|
|
300
|
-
process.stdout.write(HELP);
|
|
301
|
-
return 2;
|
|
302
|
-
}
|
|
303
|
-
positionals.push(arg);
|
|
304
|
-
}
|
|
305
|
-
if (positionals.length > 1) {
|
|
306
|
-
printError("docs accepts at most one [topic]");
|
|
307
|
-
process.stdout.write(HELP);
|
|
71
|
+
const positionals = args.filter((arg) => arg !== "--no-open");
|
|
72
|
+
const unknownFlag = positionals.find((arg) => arg.startsWith("-"));
|
|
73
|
+
if (unknownFlag || positionals.length > 1) {
|
|
74
|
+
printError(unknownFlag ? `unknown flag: ${unknownFlag}` : "docs accepts at most one [topic]");
|
|
308
75
|
return 2;
|
|
309
76
|
}
|
|
310
|
-
|
|
311
|
-
let htmlDir: string;
|
|
312
77
|
try {
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
if (files.length === 0) {
|
|
320
|
-
printError(`no HTML docs at ${htmlDir}`);
|
|
321
|
-
process.stdout.write(
|
|
322
|
-
` the npm package ships only the categorized Markdown reference tree: ${resolve(resolvePackageRoot(), "docs")}\n` +
|
|
323
|
-
" the interactive blueprints are in a source checkout and at https://github.com/iowarp/clio-coder/tree/main/docs/html\n",
|
|
324
|
-
);
|
|
325
|
-
return 1;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
let landing = "index.html";
|
|
329
|
-
const topic = positionals[0];
|
|
330
|
-
if (topic !== undefined) {
|
|
331
|
-
const file = topicToFile(topic, files);
|
|
332
|
-
if (!file) {
|
|
333
|
-
printError(`unknown docs topic: ${topic}`);
|
|
334
|
-
const topics = synthesizeMenu(files).map((entry) => entry.topic);
|
|
335
|
-
if (topics.length > 0) process.stdout.write(` available topics: ${topics.join(", ")}\n`);
|
|
78
|
+
const pages = catalog(join(resolvePackageRoot(), "docs"));
|
|
79
|
+
const path = docsTopicRoute(positionals[0], pages);
|
|
80
|
+
if (!path) {
|
|
81
|
+
printError(
|
|
82
|
+
`Unknown or ambiguous docs topic: ${positionals[0]}. Run clio-coder docs to browse the documentation map.`,
|
|
83
|
+
);
|
|
336
84
|
return 2;
|
|
337
85
|
}
|
|
338
|
-
|
|
86
|
+
return runWebCommand(["--path", path, "--reuse-background", args.includes("--no-open") ? "--no-open" : "--open"]);
|
|
87
|
+
} catch (error) {
|
|
88
|
+
printError(error instanceof Error ? error.message : "Could not open the documentation.");
|
|
89
|
+
return 1;
|
|
339
90
|
}
|
|
340
|
-
|
|
341
|
-
const handle = await startDocsServer({ htmlDir });
|
|
342
|
-
const landingUrl = landing === "index.html" ? handle.url : `${handle.url}${landing}`;
|
|
343
|
-
printHeader("Clio docs viewer");
|
|
344
|
-
process.stdout.write(` serving HTML root ${htmlDir}\n`);
|
|
345
|
-
process.stdout.write(` open ${chalk.cyan(landingUrl)}\n`);
|
|
346
|
-
process.stdout.write(" bound to 127.0.0.1 only: no external network, no daemon, no state.\n");
|
|
347
|
-
process.stdout.write(" press Ctrl+C to stop.\n");
|
|
348
|
-
if (!noOpen) openBrowser(landingUrl);
|
|
349
|
-
|
|
350
|
-
await waitForShutdown();
|
|
351
|
-
await handle.close();
|
|
352
|
-
process.stdout.write("docs viewer stopped.\n");
|
|
353
|
-
return 0;
|
|
354
91
|
}
|
package/src/cli/index.ts
CHANGED
|
@@ -29,6 +29,7 @@ science. CLIO stands for Context Layer for Input/Output, named for the Greek mus
|
|
|
29
29
|
|
|
30
30
|
Usage:
|
|
31
31
|
clio-coder start interactive repository chat
|
|
32
|
+
clio-coder web [--open] start the browser application
|
|
32
33
|
clio-coder acp serve Clio as an ACP v1 agent over stdio
|
|
33
34
|
clio-coder --acp alias for clio-coder acp
|
|
34
35
|
clio-coder run [flags] <task> run one headless main-agent turn
|
|
@@ -75,7 +76,7 @@ Usage:
|
|
|
75
76
|
clio-coder tools list|status|install|remove <id> pinned external programs Clio can drive
|
|
76
77
|
clio-coder interop inspect --json detected external coding agents and how far each one is wired
|
|
77
78
|
clio-coder panes install|theme install the pane multiplexer (alias for 'tools install herdr'), or print Clio's theme as a herdr block
|
|
78
|
-
clio-coder docs [topic]
|
|
79
|
+
clio-coder docs [topic] open documentation in the web app (--no-open to print the launch link)
|
|
79
80
|
clio-coder dev <command> harness instruments; run 'clio-coder dev' for the list
|
|
80
81
|
clio-coder --help, -h this message
|
|
81
82
|
clio-coder --help --all this message plus every command under 'clio-coder dev'
|
|
@@ -260,6 +261,7 @@ const COMMAND_HANDLERS = new Map<string, CommandHandler>([
|
|
|
260
261
|
["library", async (subArgs) => (await import("./library.js")).runLibraryCommand(subArgs)],
|
|
261
262
|
["tasks", async (subArgs) => (await import("./tasks.js")).runTasksCommand(subArgs)],
|
|
262
263
|
["verifiers", async (subArgs) => (await import("./verifiers.js")).runVerifiersCommand(subArgs)],
|
|
264
|
+
["web", async (subArgs) => (await import("./web.js")).runWebCommand(subArgs)],
|
|
263
265
|
["docs", async (subArgs) => (await import("./docs.js")).runDocsCommand(subArgs)],
|
|
264
266
|
["share", async (subArgs) => (await import("./share.js")).runShareCommand(subArgs)],
|
|
265
267
|
["export", async (subArgs) => (await import("./share.js")).runExportCommand(subArgs)],
|
package/src/cli/trace.ts
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
|
-
import { access } from "node:fs/promises";
|
|
3
2
|
import { resolve } from "node:path";
|
|
4
|
-
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
5
3
|
import { clioStatePath } from "../core/xdg.js";
|
|
6
4
|
import type { CodeStepRecord } from "../domains/dispatch/code-step.js";
|
|
7
5
|
import { codeStepDir, readCodeStepRecords } from "../domains/dispatch/code-step-store.js";
|
|
@@ -29,10 +27,8 @@ const HELP = `Usage:
|
|
|
29
27
|
clio-coder trace code-steps <rootId> [--json] deterministic code steps of one fleet root
|
|
30
28
|
clio-coder trace prune [--max-age-days N] [--max-bytes N] [--db PATH] [--json]
|
|
31
29
|
clio-coder trace sql <SELECT query> [--db PATH]
|
|
32
|
-
clio-coder trace ui [--db PATH] [--port N] source checkout only
|
|
33
30
|
|
|
34
|
-
The
|
|
35
|
-
Clio the subcommands above are the way in. They read the same database, except
|
|
31
|
+
The subcommands above read the same database, except
|
|
36
32
|
code-steps, which reads the per-root record files under the state directory's
|
|
37
33
|
code-steps/ tree (a code step is a subprocess, not a model run, so it never
|
|
38
34
|
enters the SQLite mirror).
|
|
@@ -51,7 +47,6 @@ interface ParsedTraceArgs {
|
|
|
51
47
|
dbExplicit: boolean;
|
|
52
48
|
follow: boolean;
|
|
53
49
|
limit: number;
|
|
54
|
-
port: number;
|
|
55
50
|
json: boolean;
|
|
56
51
|
maxAgeDays: number | undefined;
|
|
57
52
|
maxBytes: number | undefined;
|
|
@@ -63,7 +58,6 @@ function parseTraceArgs(args: string[]): ParsedTraceArgs {
|
|
|
63
58
|
let dbExplicit = false;
|
|
64
59
|
let follow = false;
|
|
65
60
|
let limit = DEFAULT_TRACE_LIMIT;
|
|
66
|
-
let port = 0;
|
|
67
61
|
let json = false;
|
|
68
62
|
let maxAgeDays: number | undefined;
|
|
69
63
|
let maxBytes: number | undefined;
|
|
@@ -71,13 +65,7 @@ function parseTraceArgs(args: string[]): ParsedTraceArgs {
|
|
|
71
65
|
const arg = args[index];
|
|
72
66
|
if (arg === "--follow") follow = true;
|
|
73
67
|
else if (arg === "--json") json = true;
|
|
74
|
-
else if (
|
|
75
|
-
arg === "--db" ||
|
|
76
|
-
arg === "--limit" ||
|
|
77
|
-
arg === "--port" ||
|
|
78
|
-
arg === "--max-age-days" ||
|
|
79
|
-
arg === "--max-bytes"
|
|
80
|
-
) {
|
|
68
|
+
else if (arg === "--db" || arg === "--limit" || arg === "--max-age-days" || arg === "--max-bytes") {
|
|
81
69
|
const value = args[index + 1];
|
|
82
70
|
if (value === undefined) throw new Error(`${arg} requires a value`);
|
|
83
71
|
index += 1;
|
|
@@ -85,25 +73,23 @@ function parseTraceArgs(args: string[]): ParsedTraceArgs {
|
|
|
85
73
|
db = resolve(value);
|
|
86
74
|
dbExplicit = true;
|
|
87
75
|
} else if (arg === "--limit") limit = parseInteger(value, "--limit", 1, 500);
|
|
88
|
-
else if (arg === "--port") port = parseInteger(value, "--port", 0, 65_535);
|
|
89
76
|
else if (arg === "--max-age-days") maxAgeDays = parseInteger(value, arg, 1, 36_500);
|
|
90
77
|
else maxBytes = parseInteger(value, arg, 1024 * 1024, Number.MAX_SAFE_INTEGER);
|
|
91
78
|
} else if (arg?.startsWith("--db=")) {
|
|
92
79
|
db = resolve(arg.slice(5));
|
|
93
80
|
dbExplicit = true;
|
|
94
81
|
} else if (arg?.startsWith("--limit=")) limit = parseInteger(arg.slice(8), "--limit", 1, 500);
|
|
95
|
-
else if (arg?.startsWith("--port=")) port = parseInteger(arg.slice(7), "--port", 0, 65_535);
|
|
96
82
|
else if (arg?.startsWith("--max-age-days=")) maxAgeDays = parseInteger(arg.slice(15), "--max-age-days", 1, 36_500);
|
|
97
83
|
else if (arg?.startsWith("--max-bytes="))
|
|
98
84
|
maxBytes = parseInteger(arg.slice(12), "--max-bytes", 1024 * 1024, Number.MAX_SAFE_INTEGER);
|
|
99
85
|
else if (arg?.startsWith("-")) throw new Error(`unknown trace flag: ${arg}`);
|
|
100
86
|
else if (arg !== undefined) positional.push(arg);
|
|
101
87
|
}
|
|
102
|
-
return { positional, db, dbExplicit, follow, limit,
|
|
88
|
+
return { positional, db, dbExplicit, follow, limit, json, maxAgeDays, maxBytes };
|
|
103
89
|
}
|
|
104
90
|
|
|
105
91
|
/** Every subcommand `trace` answers to. Anything else is a usage error. */
|
|
106
|
-
const TRACE_COMMANDS = new Set(["runs", "inspect", "phases", "tail", "procs", "code-steps", "prune", "sql"
|
|
92
|
+
const TRACE_COMMANDS = new Set(["runs", "inspect", "phases", "tail", "procs", "code-steps", "prune", "sql"]);
|
|
107
93
|
|
|
108
94
|
/** The subcommands whose first positional is a run id. */
|
|
109
95
|
const TRACE_COMMANDS_NEEDING_RUN_ID = new Set(["phases", "tail", "procs"]);
|
|
@@ -169,8 +155,6 @@ export async function runTraceCommand(args: string[]): Promise<number> {
|
|
|
169
155
|
}
|
|
170
156
|
}
|
|
171
157
|
|
|
172
|
-
if (command === "ui") return runTraceUi(parsed.db, parsed.port);
|
|
173
|
-
|
|
174
158
|
// Code-step records live in flat per-root JSON files beside the ledger, not
|
|
175
159
|
// in the SQLite mirror, so this answers before the database is consulted and
|
|
176
160
|
// ignores --db. An absent root directory is the empty state: the root either
|
|
@@ -187,7 +171,6 @@ export async function runTraceCommand(args: string[]): Promise<number> {
|
|
|
187
171
|
!parsed.dbExplicit &&
|
|
188
172
|
!parsed.follow &&
|
|
189
173
|
parsed.limit === DEFAULT_TRACE_LIMIT &&
|
|
190
|
-
parsed.port === 0 &&
|
|
191
174
|
parsed.maxAgeDays === undefined &&
|
|
192
175
|
parsed.maxBytes === undefined,
|
|
193
176
|
);
|
|
@@ -379,50 +362,6 @@ function printProcesses(rows: TraceProcessRow[]): void {
|
|
|
379
362
|
}
|
|
380
363
|
}
|
|
381
364
|
|
|
382
|
-
async function runTraceUi(db: string, port: number): Promise<number> {
|
|
383
|
-
const candidates = [
|
|
384
|
-
fileURLToPath(new URL("../apps/trace-viewer/server.mjs", import.meta.url)),
|
|
385
|
-
fileURLToPath(new URL("../../apps/trace-viewer/server.mjs", import.meta.url)),
|
|
386
|
-
];
|
|
387
|
-
const entry = await firstExisting(candidates);
|
|
388
|
-
if (entry === null) {
|
|
389
|
-
process.stderr.write(
|
|
390
|
-
"trace viewer is available only from a source checkout; apps/trace-viewer/server.mjs was not found\n" +
|
|
391
|
-
" the npm package does not carry the viewer, so an installed clio cannot start it\n" +
|
|
392
|
-
` the same run is readable here: clio-coder trace runs --db ${db}\n` +
|
|
393
|
-
" from a checkout of the repository: npm run trace:ui\n",
|
|
394
|
-
);
|
|
395
|
-
return 1;
|
|
396
|
-
}
|
|
397
|
-
const module = (await import(pathToFileURL(entry).href)) as {
|
|
398
|
-
startTraceViewer(options: { db: string; port: number }): Promise<{ url: string; close(): Promise<void> }>;
|
|
399
|
-
};
|
|
400
|
-
const server = await module.startTraceViewer({ db, port });
|
|
401
|
-
process.stdout.write(`Trace viewer: ${server.url}\n`);
|
|
402
|
-
await new Promise<void>((resolveStop) => {
|
|
403
|
-
const stop = (): void => {
|
|
404
|
-
process.off("SIGINT", stop);
|
|
405
|
-
process.off("SIGTERM", stop);
|
|
406
|
-
void server.close().finally(resolveStop);
|
|
407
|
-
};
|
|
408
|
-
process.on("SIGINT", stop);
|
|
409
|
-
process.on("SIGTERM", stop);
|
|
410
|
-
});
|
|
411
|
-
return 0;
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
async function firstExisting(paths: string[]): Promise<string | null> {
|
|
415
|
-
for (const path of paths) {
|
|
416
|
-
try {
|
|
417
|
-
await access(path);
|
|
418
|
-
return path;
|
|
419
|
-
} catch {
|
|
420
|
-
// Try the next source-checkout location.
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
return null;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
365
|
function parseInteger(value: string, flag: string, min: number, max: number): number {
|
|
427
366
|
const parsed = Number(value);
|
|
428
367
|
if (!Number.isInteger(parsed) || parsed < min || parsed > max)
|