@iowarp/clio-coder 0.4.6 → 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 +283 -0
- package/CHANGELOG.md +79 -0
- package/CONTRIBUTING.md +178 -96
- package/NOTICE +8 -0
- package/README.md +100 -47
- package/dist/acp-JWPQZM2D.js +130 -0
- package/dist/agents-4GCDIRVX.js +149 -0
- package/dist/assets/codewiki.json +1 -1
- package/dist/assets/tui-notices/get-east-asian-width-LICENSE +9 -0
- package/dist/assets/tui-notices/marked-LICENSE +44 -0
- package/dist/assets/tui-notices/pi-tui-LICENSE +21 -0
- package/dist/assets/web-notices/@hono__node-server-LICENSE +21 -0
- package/dist/assets/web-notices/hono-LICENSE +21 -0
- package/dist/auth-SYAKTDQE.js +551 -0
- package/dist/background-OW67WMYR.js +37 -0
- package/dist/builtins-TKS63VNV.js +22 -0
- package/dist/chunk-2JSCCEKO.js +85 -0
- package/dist/chunk-2SXGG2IV.js +391 -0
- package/dist/chunk-2U2U5POA.js +59 -0
- package/dist/chunk-2ZWLMA3T.js +658 -0
- package/dist/chunk-36XSBPXL.js +579 -0
- package/dist/chunk-3IQOZRQ6.js +396 -0
- package/dist/chunk-3XE4NRLF.js +324 -0
- package/dist/chunk-44U2OUSM.js +243 -0
- package/dist/chunk-4P6M2TTE.js +119 -0
- package/dist/chunk-526ABLHD.js +1219 -0
- package/dist/chunk-5C2OQHLR.js +674 -0
- package/dist/chunk-5D2FNBMG.js +185 -0
- package/dist/chunk-5EQO5NWP.js +243 -0
- package/dist/chunk-5HULHKT2.js +32 -0
- package/dist/chunk-5UG6EZI3.js +66 -0
- package/dist/chunk-5W4FRA5Q.js +22283 -0
- package/dist/chunk-6R5MBXBJ.js +386 -0
- package/dist/chunk-6TKOFFGE.js +1058 -0
- package/dist/chunk-6UJ7RDI7.js +1143 -0
- package/dist/chunk-6X7VOCDY.js +44 -0
- package/dist/chunk-7QQRPB2E.js +915 -0
- package/dist/chunk-ARRUMZ7X.js +1377 -0
- package/dist/chunk-ATB3Q7YO.js +663 -0
- package/dist/chunk-AUHVBIDW.js +19 -0
- package/dist/chunk-BE4I3UJ2.js +668 -0
- package/dist/chunk-BFPHMSK7.js +169 -0
- package/dist/chunk-BHJMMCXS.js +466 -0
- package/dist/chunk-BIY22UUK.js +1322 -0
- package/dist/chunk-D55WO5J7.js +110 -0
- package/dist/chunk-DVJL77SO.js +162 -0
- package/dist/chunk-E2NSPYLC.js +814 -0
- package/dist/chunk-EFXMQYI6.js +4484 -0
- package/dist/chunk-EPYATQMG.js +2718 -0
- package/dist/chunk-EXKUF426.js +1801 -0
- package/dist/chunk-F7Y6QTPL.js +689 -0
- package/dist/chunk-FB3KTE2J.js +1710 -0
- package/dist/chunk-FNVPQQYT.js +117 -0
- package/dist/chunk-GEVQNST4.js +101 -0
- package/dist/chunk-GEYX2NZ5.js +697 -0
- package/dist/chunk-GJBJHJNY.js +2120 -0
- package/dist/chunk-GM4TY6VN.js +1233 -0
- package/dist/chunk-GVU4CXPJ.js +5191 -0
- package/dist/chunk-H5DPSUBB.js +637 -0
- package/dist/chunk-H77XBUBM.js +688 -0
- package/dist/chunk-HMGAKB7E.js +380 -0
- package/dist/chunk-HP7KJ5O2.js +797 -0
- package/dist/chunk-HVCAY2FH.js +67 -0
- package/dist/chunk-ICYIUNO4.js +35 -0
- package/dist/chunk-IILXVWJY.js +223 -0
- package/dist/chunk-JCVIL6TY.js +595 -0
- package/dist/chunk-JIMWEYWO.js +63 -0
- package/dist/chunk-JLBVCROW.js +562 -0
- package/dist/chunk-JOBN2YQQ.js +176 -0
- package/dist/chunk-JOL2QRLE.js +152 -0
- package/dist/chunk-JRA6OBHY.js +974 -0
- package/dist/chunk-JV25I7ID.js +1865 -0
- package/dist/chunk-JYKUMHCQ.js +705 -0
- package/dist/chunk-K3W6BF5C.js +283 -0
- package/dist/chunk-K45LHSCI.js +194 -0
- package/dist/chunk-K53E2PTW.js +1289 -0
- package/dist/chunk-K5UJD6MM.js +39 -0
- package/dist/chunk-KGP3UQGJ.js +200 -0
- package/dist/chunk-KKRXONXG.js +43 -0
- package/dist/chunk-KWJXCL2X.js +103 -0
- package/dist/chunk-L75H5B3B.js +446 -0
- package/dist/chunk-LLCGGVSW.js +108 -0
- package/dist/chunk-LZCCBLRC.js +57 -0
- package/dist/chunk-LZDLYSUN.js +197 -0
- package/dist/chunk-MATCRH3M.js +667 -0
- package/dist/chunk-MEHBW2SP.js +132 -0
- package/dist/chunk-MUXNDNMZ.js +659 -0
- package/dist/chunk-MWMW53WW.js +7346 -0
- package/dist/chunk-MZDPF35R.js +45 -0
- package/dist/chunk-MZKYVIWW.js +188 -0
- package/dist/chunk-O2QJDRWP.js +362 -0
- package/dist/chunk-O3HSB2YL.js +693 -0
- package/dist/chunk-OEMFEL26.js +891 -0
- package/dist/chunk-OH3YYA3B.js +15 -0
- package/dist/chunk-OPC4DQD6.js +634 -0
- package/dist/chunk-ORRNGQDV.js +207 -0
- package/dist/chunk-P4JS3MH5.js +165 -0
- package/dist/chunk-P7GTE4FX.js +308 -0
- package/dist/chunk-PAQVETLA.js +962 -0
- package/dist/chunk-PFZJMXIY.js +146 -0
- package/dist/chunk-PGEFOTJB.js +1974 -0
- package/dist/chunk-PJ5H5B7A.js +3151 -0
- package/dist/chunk-PMUUAABD.js +604 -0
- package/dist/chunk-Q32C6AWI.js +236 -0
- package/dist/chunk-QGIC5SX5.js +139 -0
- package/dist/chunk-QLAGXTTV.js +482 -0
- package/dist/chunk-QLKCCC2J.js +573 -0
- package/dist/chunk-QWUSS2QP.js +3630 -0
- package/dist/chunk-QYSAZMSH.js +47 -0
- package/dist/chunk-R5NRX5N4.js +123 -0
- package/dist/chunk-RAUOKUZV.js +1572 -0
- package/dist/chunk-RBES4TCZ.js +302 -0
- package/dist/chunk-RFCKPS2V.js +26 -0
- package/dist/chunk-RFULVPBX.js +318 -0
- package/dist/chunk-RKFNU5UA.js +404 -0
- package/dist/chunk-RM3XJX7P.js +1148 -0
- package/dist/chunk-RNLAPBJL.js +386 -0
- package/dist/chunk-RPMNIFRY.js +65 -0
- package/dist/chunk-RRZFRIJP.js +42 -0
- package/dist/chunk-RXI7K4J5.js +4493 -0
- package/dist/chunk-SER7RRAE.js +4271 -0
- package/dist/chunk-STC6CWUZ.js +402 -0
- package/dist/chunk-TEHVMHOK.js +97 -0
- package/dist/chunk-TOPICHGR.js +33 -0
- package/dist/chunk-U3TPUXOQ.js +2653 -0
- package/dist/chunk-UB33F3YW.js +709 -0
- package/dist/chunk-UDAK6GR2.js +175 -0
- package/dist/chunk-USBBEKHW.js +177 -0
- package/dist/chunk-V4ZKOKRB.js +13433 -0
- package/dist/chunk-W5RM7YAH.js +78 -0
- package/dist/chunk-W7KNI3F5.js +215 -0
- package/dist/chunk-WFTSK7N3.js +637 -0
- package/dist/chunk-WJWNZXRM.js +395 -0
- package/dist/chunk-WLHX3MM5.js +63 -0
- package/dist/chunk-WS4FOGLY.js +686 -0
- package/dist/chunk-WTZVSMQZ.js +52 -0
- package/dist/chunk-WWRV5RJI.js +165 -0
- package/dist/chunk-X6FLVUM5.js +141 -0
- package/dist/chunk-XC5POIL4.js +68 -0
- package/dist/chunk-XTLJDC2X.js +1013 -0
- package/dist/chunk-XW2UZICE.js +372 -0
- package/dist/chunk-Y3JU5RPK.js +8 -0
- package/dist/chunk-YGIV24MF.js +1018 -0
- package/dist/chunk-YJCCMYYT.js +125 -0
- package/dist/chunk-YKIIWURD.js +36 -0
- package/dist/chunk-YQ3GFEUY.js +341 -0
- package/dist/chunk-YXANQGCX.js +179 -0
- package/dist/chunk-YXFKLMX2.js +222 -0
- package/dist/chunk-ZST3FRCV.js +132 -0
- package/dist/cli/index.js +40 -40
- package/dist/clio-BPBAPZGA.js +26 -0
- package/dist/code-nav-KBQ3RIFK.js +686 -0
- package/dist/components-6DKAXWFN.js +674 -0
- package/dist/config-FWL5JK2H.js +270 -0
- package/dist/config-graph-ACDB26L2.js +156 -0
- package/dist/configure-ZIZ4YV62.js +85 -0
- package/dist/context-EZZPT2ZV.js +1074 -0
- package/dist/context-VIL5MFRH.js +282 -0
- package/dist/context-Z3GOBHDK.js +344 -0
- package/dist/context-clear-ZPB3L7MN.js +188 -0
- package/dist/context-index-W6A4V7OC.js +120 -0
- package/dist/context-map-DKL3QT6D.js +555 -0
- package/dist/context-working-set-2GLBVF7L.js +1559 -0
- package/dist/detail-VSBWYSGZ.js +119 -0
- package/dist/dispatch-runner-EEEHGKX4.js +2442 -0
- package/dist/docs-VMMWFVHL.js +101 -0
- package/dist/doctor-V5L4IQGP.js +812 -0
- package/dist/eval-VJYJ2BV3.js +5050 -0
- package/dist/eval-inventory-CX24K2JT.js +260 -0
- package/dist/evals-J2H5V6DD.js +104 -0
- package/dist/evidence-POWAEBEW.js +229 -0
- package/dist/evidence-XCCCLS36.js +242 -0
- package/dist/evidence-Y35YSXH6.js +388 -0
- package/dist/evolve-GPG72VB6.js +613 -0
- package/dist/extensions-YIZ7W3DA.js +308 -0
- package/dist/fleet-2MDCQ2VK.js +264 -0
- package/dist/fleet-W2AF3TOJ.js +919 -0
- package/dist/fleet-commands-WS56G26H.js +75 -0
- package/dist/fleet-decisions-MYGZ3JW7.js +52 -0
- package/dist/fleet-graph-ELTBXBAV.js +136 -0
- package/dist/fleet-inspect-45IK73L4.js +308 -0
- package/dist/fleet-preflight-T5NCZKHE.js +22 -0
- package/dist/fleet-validate-VG4JBLA4.js +91 -0
- package/dist/fleet-verify-VTSABAYO.js +206 -0
- package/dist/fleet-view-XC7WMKSS.js +123 -0
- package/dist/init-VTJNNTIP.js +329 -0
- package/dist/install-6PIF6F6W.js +19 -0
- package/dist/interop-IU6BNA7C.js +246 -0
- package/dist/inventory-QPQUTUUZ.js +123 -0
- package/dist/library-HUTAS57T.js +492 -0
- package/dist/library-LF7DLU6S.js +306 -0
- package/dist/library-Q3NWL5CM.js +75 -0
- package/dist/library-import-PPW4YUC5.js +183 -0
- package/dist/library-inventory-DIRVFRZU.js +56 -0
- package/dist/library-validation-XHUZ3INE.js +42 -0
- package/dist/memory-Z2LSKNV6.js +516 -0
- package/dist/models-3FTREYPY.js +302 -0
- package/dist/monitor-HF2MQRB3.js +781 -0
- package/dist/orchestrator-UYPA6W4S.js +41502 -0
- package/dist/panes-736XB73K.js +74 -0
- package/dist/panes-C4P3PIWT.js +103 -0
- package/dist/paths-JQ4QYIYB.js +67 -0
- package/dist/preload-XSLRYH3Y.js +120 -0
- package/dist/reset-V7QSPZYE.js +345 -0
- package/dist/resources-OJGDFHYT.js +181 -0
- package/dist/run-T354SMDW.js +892 -0
- package/dist/settings-MWZXO6RV.js +72 -0
- package/dist/share-Y5ZKJPND.js +293 -0
- package/dist/skills-4GLZC4LN.js +100 -0
- package/dist/skills-eval-L5T7GODM.js +1074 -0
- package/dist/skills-inventory-LASKXEZI.js +138 -0
- package/dist/slash-commands-OIMRU36D.js +95 -0
- package/dist/steer-KMAM2Y2C.js +77 -0
- package/dist/support-AWC3XKPX.js +38 -0
- package/dist/system-CD75NYBU.js +116 -0
- package/dist/targets-VSZX2J2S.js +1116 -0
- package/dist/tasks-AN567LYH.js +36 -0
- package/dist/terminal-lease-6KTWNHVY.js +418 -0
- package/dist/tools-AGRK3V5J.js +28 -0
- package/dist/trace-P4MQZD33.js +524 -0
- package/dist/tui-primitives-A6MUW32V.js +18 -0
- package/dist/uninstall-BRUTEPIC.js +432 -0
- package/dist/upgrade-SBCGHQGJ.js +307 -0
- package/dist/usage-BIDVTO6V.js +1061 -0
- package/dist/verifiers-LTGCAMXS.js +630 -0
- package/dist/verify-OZU4LLNP.js +30 -0
- 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-U22Q7HV4.js +788 -0
- package/dist/wiki-generate-LZRLFG6I.js +623 -0
- package/dist/with-panes-X5CZOGML.js +628 -0
- package/dist/worker/entry.js +300 -93
- package/docs/README.md +58 -14
- package/docs/architecture/acp.md +5 -9
- package/docs/architecture/alcf-provider.md +0 -3
- package/docs/architecture/architecture.md +8 -10
- package/docs/architecture/artifact-placement.md +0 -3
- package/docs/architecture/artifact-versions.md +3 -6
- package/docs/architecture/capacity-and-scheduling.md +0 -3
- package/docs/architecture/context-engine.md +35 -4
- 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 +30 -0
- package/docs/architecture/middleware-and-components.md +1 -4
- package/docs/architecture/model-catalog.md +21 -4
- package/docs/architecture/observability.md +0 -3
- package/docs/architecture/pi-boundary.md +23 -8
- package/docs/architecture/prompt-envelope-and-tools.md +6 -9
- package/docs/architecture/provider-adapter-cookbook.md +1 -4
- package/docs/architecture/safety-model.md +21 -5
- package/docs/architecture/session-lifecycle.md +12 -4
- package/docs/architecture/time-conventions.md +0 -3
- package/docs/architecture/trace-store.md +28 -20
- package/docs/architecture/tui-design.md +108 -12
- package/docs/architecture/worker-context.md +104 -0
- package/docs/architecture/worker-dispatch-mechanics.md +1 -4
- package/docs/guide/authoring-plugins.md +158 -0
- package/docs/guide/built-in-agents.md +5 -8
- package/docs/guide/commands-and-modes.md +162 -61
- package/docs/guide/configuration-and-targets.md +198 -5
- package/docs/guide/configuration-reference.md +36 -38
- package/docs/guide/environment-variables.md +2 -5
- package/docs/guide/exit-codes-and-output.md +1 -4
- package/docs/guide/extensions-and-sharing.md +92 -55
- package/docs/guide/fleet-dispatch.md +31 -7
- package/docs/guide/glossary.md +1 -4
- package/docs/guide/harness-extensions.md +289 -0
- package/docs/guide/installation-and-lifecycle.md +10 -13
- package/docs/guide/interop.md +241 -0
- package/docs/guide/panes-and-files.md +3 -6
- package/docs/guide/plugins.md +77 -0
- package/docs/guide/proactive-memory.md +0 -3
- package/docs/guide/resource-library.md +109 -45
- package/docs/guide/skills-marketplace.md +34 -73
- package/docs/guide/tool-usage.md +19 -10
- package/docs/guide/troubleshooting.md +1 -4
- package/docs/history/config-knobs-audit.md +0 -3
- package/docs/history/release-cut-checklist.md +0 -3
- package/docs/process/development-pipeline.md +14 -17
- package/docs/process/documentation-coverage.md +31 -4
- package/docs/process/documentation-guide.md +28 -27
- package/docs/process/eval-runner.md +8 -6
- 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 +2 -5
- package/docs/process/release-cut-checklist.md +114 -217
- package/docs/process/scientific-validation.md +23 -3
- package/evals/scalar-decision-machinery.ts +1 -1
- package/examples/extensions/README.md +67 -0
- package/examples/extensions/lab-status/clio-coder-extension.json +14 -0
- package/examples/extensions/lab-status/extension.mjs +68 -0
- package/examples/extensions/lab-status/jobs.synthetic.json +9 -0
- package/examples/extensions/measurements/clio-coder-extension.json +28 -0
- package/examples/extensions/measurements/summarize.cjs +23 -0
- package/library/README.md +109 -0
- package/library/_authoring/templates/agent/README.md +28 -0
- package/library/_authoring/templates/agent/agents/benchmark-scout.md +30 -0
- package/library/_authoring/templates/agent/plugin.json +23 -0
- package/library/_authoring/templates/fleet/README.md +29 -0
- package/library/_authoring/templates/fleet/fleets/pipeline-review.md +31 -0
- package/library/_authoring/templates/fleet/plugin.json +23 -0
- package/library/_authoring/templates/plugin/README.md +37 -0
- package/library/_authoring/templates/plugin/agents/data-curator.md +31 -0
- package/library/_authoring/templates/plugin/assets/curation-guide.md +22 -0
- package/library/_authoring/templates/plugin/plugin.json +42 -0
- package/library/_authoring/templates/plugin/prompts/inspect-dataset.md +15 -0
- package/library/_authoring/templates/plugin/skills/dataset-curation/SKILL.md +36 -0
- package/library/_authoring/templates/plugin/skills/dataset-curation/evals.md +17 -0
- package/library/_authoring/templates/prompt/README.md +28 -0
- package/library/_authoring/templates/prompt/plugin.json +23 -0
- package/library/_authoring/templates/prompt/prompts/paper-summary.md +26 -0
- package/library/_authoring/templates/skill/README.md +24 -0
- package/library/_authoring/templates/skill/SKILL.md +39 -0
- package/library/_authoring/templates/skill/evals.md +30 -0
- package/library/_authoring/templates/skill/plugin.json +23 -0
- package/library/agents/README.md +7 -0
- package/library/fleets/README.md +7 -0
- package/library/plugins/materio/README.md +137 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-lab-definer.md +208 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-literature-reviewer.md +308 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-research-explorer.md +249 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-executor.md +416 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-verifier.md +60 -0
- package/library/plugins/materio/ai.iowarp.clio/agents/materio-workflow-planner.md +238 -0
- package/library/plugins/materio/ai.iowarp.clio/fleets/materio-execute-task.md +50 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/add-task.md +66 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/archive-task.md +65 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/checkpoint.md +26 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-research-tasks.md +230 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-virtual-lab.md +181 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/execute-task.md +292 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/help.md +129 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/identify-research.md +206 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/literature-review.md +201 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/pause-research.md +12 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/progress.md +105 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/remove-task.md +63 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/resume-research.md +64 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/settings.md +16 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/status.md +92 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/upload-data.md +104 -0
- package/library/plugins/materio/ai.iowarp.clio/prompts/materio/wtfp.md +145 -0
- package/library/plugins/materio/ai.iowarp.clio/references/execution.md +56 -0
- package/library/plugins/materio/ai.iowarp.portability/provenance.json +9 -0
- package/library/plugins/materio/assets/actions/add-task.md +86 -0
- package/library/plugins/materio/assets/actions/archive-task.md +84 -0
- package/library/plugins/materio/assets/actions/checkpoint.md +47 -0
- package/library/plugins/materio/assets/actions/define-research-tasks.md +228 -0
- package/library/plugins/materio/assets/actions/define-virtual-lab.md +179 -0
- package/library/plugins/materio/assets/actions/execute-task.md +290 -0
- package/library/plugins/materio/assets/actions/help.md +140 -0
- package/library/plugins/materio/assets/actions/identify-research.md +204 -0
- package/library/plugins/materio/assets/actions/literature-review.md +199 -0
- package/library/plugins/materio/assets/actions/pause-research.md +34 -0
- package/library/plugins/materio/assets/actions/progress.md +125 -0
- package/library/plugins/materio/assets/actions/remove-task.md +82 -0
- package/library/plugins/materio/assets/actions/resume-research.md +84 -0
- package/library/plugins/materio/assets/actions/settings.md +38 -0
- package/library/plugins/materio/assets/actions/status.md +112 -0
- package/library/plugins/materio/assets/actions/upload-data.md +123 -0
- package/library/plugins/materio/assets/actions/wtfp.md +179 -0
- package/library/plugins/materio/assets/references/research-domains.md +134 -0
- package/library/plugins/materio/assets/references/research-policy.md +77 -0
- package/library/plugins/materio/assets/references/traditional-workflows.md +146 -0
- package/library/plugins/materio/assets/scripts/check_physics.py +271 -0
- package/library/plugins/materio/assets/scripts/check_scripts.py +248 -0
- package/library/plugins/materio/assets/scripts/project_plugin.py +165 -0
- package/library/plugins/materio/assets/scripts/research_state.py +400 -0
- package/library/plugins/materio/assets/scripts/verify_citations.py +616 -0
- package/library/plugins/materio/assets/templates/RESEARCH.md +39 -0
- package/library/plugins/materio/assets/templates/VIRTUAL-LAB.md +120 -0
- package/library/plugins/materio/assets/templates/WORKFLOW.md +42 -0
- package/library/plugins/materio/assets/templates/config.json +5 -0
- package/library/plugins/materio/evals/scripts.yaml +29 -0
- package/library/plugins/materio/plugin.json +530 -0
- package/library/plugins/materio/skills/materio-lab-definer/SKILL.md +74 -0
- package/library/plugins/materio/skills/materio-literature-reviewer/SKILL.md +64 -0
- package/library/plugins/materio/skills/materio-research-explorer/SKILL.md +74 -0
- package/library/plugins/materio/skills/materio-task-executor/SKILL.md +214 -0
- package/library/plugins/materio/skills/materio-task-verifier/SKILL.md +46 -0
- package/library/plugins/materio/skills/materio-workflow-planner/SKILL.md +79 -0
- package/library/plugins/materio/tests/test_check_physics.py +139 -0
- package/library/plugins/materio/tests/test_check_scripts.py +140 -0
- package/library/plugins/materio/tests/test_research_state.py +291 -0
- package/library/plugins/materio/tests/test_verify_citations.py +337 -0
- package/library/prompts/README.md +7 -0
- package/library/registry.yaml +921 -0
- package/library/skills/README.md +120 -0
- package/library/skills/coding/ast-grep/SKILL.md +213 -0
- package/library/skills/coding/ast-grep/evals.md +82 -0
- package/library/skills/coding/ast-grep/plugin.json +23 -0
- package/library/skills/coding/coding-standards/SKILL.md +164 -0
- package/library/skills/coding/coding-standards/evals.md +57 -0
- package/library/skills/coding/coding-standards/plugin.json +23 -0
- package/library/skills/coding/prototype/SKILL.md +151 -0
- package/library/skills/coding/prototype/evals.md +61 -0
- package/library/skills/coding/prototype/plugin.json +23 -0
- package/library/skills/coding/tdd/SKILL.md +134 -0
- package/library/skills/coding/tdd/evals.md +61 -0
- package/library/skills/coding/tdd/plugin.json +23 -0
- package/library/skills/context/context-handoff/SKILL.md +176 -0
- package/library/skills/context/context-handoff/evals.md +101 -0
- package/library/skills/context/context-handoff/plugin.json +23 -0
- package/library/skills/context/context-prime/SKILL.md +131 -0
- package/library/skills/context/context-prime/evals.md +99 -0
- package/library/skills/context/context-prime/plugin.json +23 -0
- package/library/skills/git/branch-closeout/SKILL.md +132 -0
- package/library/skills/git/branch-closeout/plugin.json +23 -0
- package/library/skills/git/file-ticket/SKILL.md +126 -0
- package/library/skills/git/file-ticket/plugin.json +23 -0
- package/library/skills/git/fix-issue/SKILL.md +136 -0
- package/library/skills/git/fix-issue/plugin.json +23 -0
- package/library/skills/git/resolve-merge-conflicts/SKILL.md +151 -0
- package/library/skills/git/resolve-merge-conflicts/evals.md +85 -0
- package/library/skills/git/resolve-merge-conflicts/plugin.json +23 -0
- package/library/skills/git/ship/SKILL.md +134 -0
- package/library/skills/git/ship/plugin.json +23 -0
- package/library/skills/git/worktree-create/SKILL.md +127 -0
- package/library/skills/git/worktree-create/plugin.json +23 -0
- package/library/skills/git/worktree-merge/SKILL.md +147 -0
- package/library/skills/git/worktree-merge/plugin.json +23 -0
- package/library/skills/meta/clio-coder-dev/SKILL.md +101 -0
- package/library/skills/meta/clio-coder-dev/evals.md +46 -0
- package/library/skills/meta/clio-coder-dev/plugin.json +23 -0
- package/library/skills/meta/clio-coder-test/SKILL.md +156 -0
- package/library/skills/meta/clio-coder-test/evals.md +62 -0
- package/library/skills/meta/clio-coder-test/plugin.json +23 -0
- package/library/skills/meta/clio-coder-test/references/test-map.md +97 -0
- package/library/skills/meta/credentials/SKILL.md +132 -0
- package/library/skills/meta/credentials/evals.md +104 -0
- package/library/skills/meta/credentials/plugin.json +23 -0
- package/library/skills/meta/find-skills/SKILL.md +85 -0
- package/library/skills/meta/find-skills/evals.md +65 -0
- package/library/skills/meta/find-skills/plugin.json +23 -0
- package/library/skills/meta/herdr/SKILL.md +133 -0
- package/library/skills/meta/herdr/evals.md +38 -0
- package/library/skills/meta/herdr/plugin.json +23 -0
- package/library/skills/meta/skill-craft/SKILL.md +139 -0
- package/library/skills/meta/skill-craft/evals.md +49 -0
- package/library/skills/meta/skill-craft/plugin.json +23 -0
- package/library/skills/planning/archify/SKILL.md +196 -0
- package/library/skills/planning/archify/plugin.json +23 -0
- package/library/skills/planning/architecture/SKILL.md +184 -0
- package/library/skills/planning/architecture/evals.md +101 -0
- package/library/skills/planning/architecture/plugin.json +23 -0
- package/library/skills/planning/backlog/SKILL.md +212 -0
- package/library/skills/planning/backlog/evals.md +185 -0
- package/library/skills/planning/backlog/plugin.json +23 -0
- package/library/skills/planning/prd/SKILL.md +129 -0
- package/library/skills/planning/prd/evals.md +103 -0
- package/library/skills/planning/prd/plugin.json +23 -0
- package/library/skills/planning/product-intent/SKILL.md +173 -0
- package/library/skills/planning/product-intent/evals.md +106 -0
- package/library/skills/planning/product-intent/plugin.json +23 -0
- package/library/skills/planning/tech-spec/SKILL.md +172 -0
- package/library/skills/planning/tech-spec/evals.md +120 -0
- package/library/skills/planning/tech-spec/plugin.json +23 -0
- package/library/skills/registry.yaml +144 -0
- package/library/skills/remote.yaml +13 -0
- package/library/skills/research/arxiv-literature/SKILL.md +168 -0
- package/library/skills/research/arxiv-literature/evals.md +108 -0
- package/library/skills/research/arxiv-literature/plugin.json +23 -0
- package/library/skills/research/experiment-protocol/SKILL.md +148 -0
- package/library/skills/research/experiment-protocol/evals.md +114 -0
- package/library/skills/research/experiment-protocol/plugin.json +23 -0
- package/library/skills/research/scientific-debugging/SKILL.md +149 -0
- package/library/skills/research/scientific-debugging/evals.md +156 -0
- package/library/skills/research/scientific-debugging/plugin.json +23 -0
- package/library/skills/research/scientific-modernization/SKILL.md +170 -0
- package/library/skills/research/scientific-modernization/evals.md +111 -0
- package/library/skills/research/scientific-modernization/plugin.json +23 -0
- package/library/skills/skill-marketplace.json +507 -0
- package/library/skills/workflow/cut-it/SKILL.md +153 -0
- package/library/skills/workflow/cut-it/evals.md +143 -0
- package/library/skills/workflow/cut-it/plugin.json +23 -0
- package/library/skills/workflow/design-council/SKILL.md +233 -0
- package/library/skills/workflow/design-council/evals.md +258 -0
- package/library/skills/workflow/design-council/plugin.json +23 -0
- package/library/skills/workflow/grill-me/SKILL.md +267 -0
- package/library/skills/workflow/grill-me/evals.md +231 -0
- package/library/skills/workflow/grill-me/plugin.json +23 -0
- package/library/skills/workflow/workflow-distiller/SKILL.md +204 -0
- package/library/skills/workflow/workflow-distiller/evals.md +233 -0
- package/library/skills/workflow/workflow-distiller/plugin.json +23 -0
- package/package.json +23 -14
- package/src/cli/agents.ts +1 -1
- package/src/cli/config-inspect.ts +1 -1
- package/src/cli/configure.ts +2 -2
- package/src/cli/docs.ts +65 -328
- package/src/cli/eval.ts +40 -6
- package/src/cli/extensions.ts +74 -8
- package/src/cli/fleet-preflight.ts +2 -0
- package/src/cli/fleet.ts +2 -0
- package/src/cli/index.ts +4 -4
- package/src/cli/interop-inspect.ts +61 -33
- package/src/cli/interop.ts +79 -9
- package/src/cli/library-import.ts +139 -0
- package/src/cli/library.ts +418 -120
- package/src/cli/run.ts +26 -9
- package/src/cli/skills-eval.ts +43 -6
- package/src/cli/skills-inventory.ts +6 -2
- package/src/cli/skills.ts +44 -491
- 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 +8 -4
- package/src/core/config.ts +71 -0
- package/src/core/defaults.ts +1 -1
- package/src/core/domain-loader.ts +37 -28
- package/src/core/recent-models.ts +2 -2
- package/src/core/session-routing.ts +3 -3
- package/src/core/state-file-lock.ts +1 -1
- package/src/core/termination.ts +13 -9
- package/src/core/tool-names.ts +5 -0
- package/src/domains/agents/contract.ts +1 -1
- package/src/domains/agents/extension.ts +53 -9
- package/src/domains/agents/fleet-commands.ts +92 -1
- package/src/domains/agents/fleet-contract.ts +87 -19
- package/src/domains/agents/recipe.ts +5 -4
- package/src/domains/agents/registry.ts +80 -24
- package/src/domains/config/extension.ts +5 -4
- package/src/domains/config/keybindings.ts +155 -95
- package/src/domains/context/worker/contract.ts +91 -0
- package/src/domains/context/worker/pressure.ts +120 -0
- package/src/domains/context/worker/recall.ts +62 -0
- package/src/domains/context/worker/select.ts +164 -0
- package/src/domains/context/worker/snapshot.ts +35 -0
- package/src/domains/context/worker/store.ts +16 -0
- package/src/domains/context/working-set/replay/synthetic.ts +2 -1
- package/src/domains/dispatch/active-route-planner.ts +2 -0
- package/src/domains/dispatch/backoff.ts +1 -0
- package/src/domains/dispatch/code-step.ts +12 -2
- package/src/domains/dispatch/contract.ts +3 -0
- package/src/domains/dispatch/execution-plan.ts +2 -0
- package/src/domains/dispatch/extension.ts +184 -39
- package/src/domains/dispatch/fleet-plan.ts +10 -0
- package/src/domains/dispatch/fleet-run.ts +1 -0
- package/src/domains/dispatch/index.ts +1 -0
- package/src/domains/dispatch/orphan-recovery.ts +2 -0
- package/src/domains/dispatch/receipt-integrity.ts +7 -0
- package/src/domains/dispatch/state.ts +2 -2
- package/src/domains/dispatch/types.ts +7 -0
- package/src/domains/dispatch/validation.ts +12 -0
- package/src/domains/dispatch/workspace-checkpoint.ts +1 -1
- package/src/domains/eval/metrics/tracked.ts +22 -2
- package/src/domains/evidence/failure-attribution.ts +1 -0
- package/src/domains/evidence/trust-status.ts +22 -3
- package/src/domains/extensions/command-schema.ts +145 -0
- package/src/domains/extensions/command-tools.ts +15 -0
- package/src/domains/extensions/compatibility.ts +7 -0
- package/src/domains/extensions/contract.ts +0 -4
- package/src/domains/extensions/discovery.ts +69 -205
- package/src/domains/extensions/extension.ts +0 -4
- package/src/domains/extensions/index.ts +1 -5
- package/src/domains/extensions/manager.ts +1 -6
- package/src/domains/extensions/operator-commands.ts +29 -0
- package/src/domains/extensions/operator-runtime.ts +485 -0
- package/src/domains/extensions/public-api.ts +53 -0
- package/src/domains/extensions/runtime-child.mjs +114 -0
- package/src/domains/extensions/runtime-process.ts +306 -0
- package/src/domains/extensions/runtime-schema.ts +146 -0
- package/src/domains/extensions/snapshot-access.ts +21 -0
- package/src/domains/extensions/snapshot.ts +4 -32
- package/src/domains/extensions/state.ts +5 -83
- package/src/domains/extensions/types.ts +33 -34
- package/src/domains/interop/adopt.ts +546 -0
- package/src/domains/interop/detect.ts +50 -12
- package/src/domains/interop/foreign.ts +554 -0
- package/src/domains/interop/import.ts +277 -0
- package/src/domains/interop/index.ts +24 -0
- package/src/domains/interop/install.ts +6 -0
- package/src/domains/interop/inventory.ts +351 -0
- package/src/domains/interop/projection.ts +360 -0
- package/src/domains/interop/registry.ts +106 -3
- package/src/domains/interop/types.ts +51 -0
- package/src/domains/lifecycle/migrations/index.ts +0 -2
- package/src/domains/lifecycle/naming-resources.ts +1 -1
- package/src/domains/middleware/hooks.ts +2 -2
- package/src/domains/middleware/marketplace-offer.ts +1 -1
- package/src/domains/mux/contract.ts +1 -1
- 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/plugins/catalog.ts +204 -0
- package/src/domains/plugins/contract.ts +24 -0
- package/src/domains/plugins/discovery.ts +316 -0
- package/src/domains/plugins/extension.ts +40 -0
- package/src/domains/plugins/index.ts +77 -0
- package/src/domains/plugins/integrity.ts +6 -0
- package/src/domains/plugins/manifest.ts +3 -0
- package/src/domains/plugins/resources.ts +102 -0
- package/src/domains/plugins/state.ts +753 -0
- package/src/domains/plugins/types.ts +217 -0
- package/src/domains/prompts/extension.ts +4 -10
- package/src/domains/prompts/fragments/operating/skills.md +10 -10
- 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/resources/common-loader.ts +9 -6
- package/src/domains/resources/index.ts +67 -0
- package/src/domains/resources/library-actions.ts +836 -0
- package/src/domains/resources/library-evals.ts +38 -0
- package/src/domains/resources/library-inventory.ts +1048 -0
- package/src/domains/resources/library-types.ts +50 -0
- package/src/domains/resources/library-validation.ts +634 -0
- package/src/domains/resources/library.ts +437 -156
- package/src/domains/resources/package-references.ts +66 -0
- package/src/domains/resources/prompts/loader.ts +75 -41
- package/src/domains/resources/skills/install.ts +2 -2
- package/src/domains/resources/skills/loader.ts +77 -22
- package/src/domains/resources/skills/marketplace.ts +48 -57
- package/src/domains/resources/skills/promotion.ts +2 -2
- package/src/domains/resources/skills/provenance-pin.ts +17 -4
- package/src/domains/safety/action-classifier.ts +2 -2
- package/src/domains/safety/default-path-policy.ts +3 -1
- package/src/domains/safety/policy-engine.ts +1 -1
- package/src/domains/safety/protected-artifacts.ts +21 -5
- package/src/domains/safety/skill-authority.ts +5 -2
- 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/domains/share/archive.ts +1 -1
- package/src/engine/acp/server.ts +11 -0
- package/src/engine/ai.ts +2 -0
- package/src/engine/apis/openai-completions.ts +61 -6
- package/src/engine/notices/pi-tui-LICENSE +21 -0
- package/src/engine/prewarm.ts +232 -0
- package/src/engine/provider-diagnostics.ts +6 -1
- package/src/engine/tui.ts +3 -0
- package/src/engine/worker-runtime.ts +58 -14
- package/src/engine/worker-tools.ts +5 -0
- package/src/entry/orchestrator.ts +46 -21
- package/src/entry/plugin-reload.ts +18 -0
- package/src/interactive/application-controller.ts +67 -21
- package/src/interactive/chat-loop-messages.ts +3 -0
- package/src/interactive/chat-loop.ts +32 -11
- package/src/interactive/chat-panel.ts +5 -1
- package/src/interactive/clio-editor.ts +53 -21
- package/src/interactive/command-output.ts +56 -1
- package/src/interactive/editor-submit.ts +65 -28
- package/src/interactive/fleet-run-preview.ts +2 -0
- package/src/interactive/follow-up-queue-panel.ts +3 -3
- package/src/interactive/footer/dashboard.ts +4 -1
- package/src/interactive/footer/notifications.ts +2 -2
- package/src/interactive/footer/widgets.ts +2 -2
- package/src/interactive/interactive-application.ts +209 -21
- package/src/interactive/interactive-input-runtime.ts +254 -7
- package/src/interactive/interactive-presentation.ts +41 -12
- package/src/interactive/interactive-slash-runtime.ts +37 -8
- package/src/interactive/keybinding-manager.ts +156 -79
- package/src/interactive/keyboard-owner.ts +37 -0
- package/src/interactive/leader-key.ts +49 -102
- package/src/interactive/leader-menu.ts +45 -0
- package/src/interactive/overlay-ask-user-lifecycle.ts +9 -1
- package/src/interactive/overlay-frame.ts +15 -0
- package/src/interactive/overlay-key-routing.ts +46 -47
- package/src/interactive/overlay-lifecycle.ts +30 -15
- package/src/interactive/overlay-resource-openers.ts +56 -46
- package/src/interactive/overlays/ask-user.ts +630 -556
- package/src/interactive/overlays/extension-panel.ts +70 -0
- package/src/interactive/overlays/extensions.ts +28 -5
- package/src/interactive/overlays/fleet-run-approval.ts +7 -3
- package/src/interactive/overlays/help-reference.ts +89 -40
- package/src/interactive/overlays/interop.ts +122 -3
- package/src/interactive/overlays/keybinding-detail.ts +2 -2
- package/src/interactive/overlays/library-lifecycle.ts +90 -0
- package/src/interactive/overlays/library-model.ts +574 -0
- package/src/interactive/overlays/library-review.ts +557 -0
- package/src/interactive/overlays/library-tabs.ts +3 -15
- package/src/interactive/overlays/library.ts +602 -0
- package/src/interactive/overlays/list-overlay.ts +218 -39
- package/src/interactive/overlays/model-selector.ts +28 -25
- package/src/interactive/overlays/session-selector.ts +9 -3
- package/src/interactive/overlays/settings.ts +25 -18
- package/src/interactive/overlays/tree-selector.ts +16 -11
- package/src/interactive/permission-hint.ts +13 -0
- package/src/interactive/permission-overlay.ts +77 -28
- package/src/interactive/prewarm.ts +11 -197
- package/src/interactive/prompt-source-label.ts +21 -0
- package/src/interactive/renderers/reference-card.ts +35 -0
- package/src/interactive/renderers/worker-entry.ts +35 -3
- package/src/interactive/session-usage-reseed.ts +2 -0
- package/src/interactive/side-question.ts +2 -0
- package/src/interactive/slash-autocomplete.ts +99 -1
- package/src/interactive/slash-commands.ts +390 -67
- package/src/interactive/slash-spec.ts +0 -1
- package/src/interactive/terminal-lease.ts +44 -12
- 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-queues.ts +8 -7
- package/src/interactive/turn-runtime.ts +15 -1
- package/src/interactive/view/view-overlay.ts +19 -14
- package/src/interactive/welcome-dashboard.ts +525 -408
- package/src/tools/bootstrap.ts +8 -0
- package/src/tools/builtin-tool-catalog.ts +15 -6
- package/src/tools/context/index.ts +58 -5
- package/src/tools/context/library.ts +465 -0
- package/src/tools/context/surface.ts +20 -6
- package/src/tools/core-bootstrap.ts +3 -0
- package/src/tools/dispatch-admission.ts +24 -1
- package/src/tools/dispatch-arguments.ts +8 -0
- package/src/tools/dispatch-plan.ts +32 -0
- package/src/tools/dispatch-schema.ts +31 -1
- package/src/tools/dispatch-types.ts +3 -0
- package/src/tools/dispatch.ts +1 -1
- package/src/tools/harness-extensions.ts +169 -0
- package/src/tools/observation.ts +4 -0
- package/src/tools/policy.ts +7 -1
- package/src/tools/registry.ts +31 -3
- package/src/tools/worker-evidence.ts +5 -0
- package/src/worker/context-seed.ts +192 -0
- package/src/worker/entry.ts +1 -0
- package/src/worker/spec-contract.ts +35 -1
- package/dist/acp-UVEVWSDL.js +0 -130
- package/dist/agents-VWY37DTK.js +0 -148
- package/dist/auth-PCV2XQDV.js +0 -551
- package/dist/builtins-PD652MTK.js +0 -22
- package/dist/chunk-22PQ4TX4.js +0 -360
- package/dist/chunk-24T2YZ7A.js +0 -22648
- package/dist/chunk-2AKYFREM.js +0 -1008
- package/dist/chunk-2QPI3TR3.js +0 -162
- package/dist/chunk-3BJGMT2D.js +0 -324
- package/dist/chunk-3HQVBIKD.js +0 -308
- package/dist/chunk-3JLFK5MW.js +0 -193
- package/dist/chunk-3O2ZAUGQ.js +0 -283
- package/dist/chunk-3QKXHCGS.js +0 -59
- package/dist/chunk-3T4DXWP6.js +0 -668
- package/dist/chunk-3UW3KU4A.js +0 -21
- package/dist/chunk-3WBALRQH.js +0 -5076
- package/dist/chunk-4DU2TVI4.js +0 -108
- package/dist/chunk-4U4TKZFR.js +0 -5052
- package/dist/chunk-4VMV6OS6.js +0 -101
- package/dist/chunk-536HXRFE.js +0 -1257
- package/dist/chunk-5CMARGPF.js +0 -477
- package/dist/chunk-5CY4Q6QI.js +0 -141
- package/dist/chunk-5QRX7SLS.js +0 -1018
- package/dist/chunk-5VTJP36Q.js +0 -36
- package/dist/chunk-5ZSZEYJK.js +0 -119
- package/dist/chunk-6HAO6X5B.js +0 -197
- package/dist/chunk-6OII3LOK.js +0 -404
- package/dist/chunk-6RYDAVQT.js +0 -4338
- package/dist/chunk-6VRRJT7L.js +0 -146
- package/dist/chunk-6YA46L5A.js +0 -386
- package/dist/chunk-77CZRFTE.js +0 -634
- package/dist/chunk-7JSSKXG2.js +0 -1215
- package/dist/chunk-7WUZEB2M.js +0 -165
- package/dist/chunk-7YJWEF2L.js +0 -974
- package/dist/chunk-ACCKVSHU.js +0 -44
- package/dist/chunk-B3MOMLJ4.js +0 -433
- package/dist/chunk-BBV5TKE6.js +0 -35
- package/dist/chunk-BLTEAUCB.js +0 -668
- package/dist/chunk-BS4GAMUB.js +0 -233
- package/dist/chunk-BT7HGDOX.js +0 -3151
- package/dist/chunk-CBSKDFWL.js +0 -101
- package/dist/chunk-CXQ37WJH.js +0 -45
- package/dist/chunk-DXLUVUD4.js +0 -1490
- package/dist/chunk-DZK63TZJ.js +0 -1334
- package/dist/chunk-E7RF4KBO.js +0 -266
- package/dist/chunk-ECOMVOHP.js +0 -139
- package/dist/chunk-EHOSNVVM.js +0 -59
- package/dist/chunk-F5Z7EWMN.js +0 -4484
- package/dist/chunk-FQOOGXBH.js +0 -579
- package/dist/chunk-GLYBJ4RQ.js +0 -396
- package/dist/chunk-HHVJNVUJ.js +0 -179
- package/dist/chunk-HL26ADLH.js +0 -77
- package/dist/chunk-HPTJF6DG.js +0 -2465
- package/dist/chunk-HXHFDHB6.js +0 -962
- package/dist/chunk-HZ2T2YED.js +0 -1687
- package/dist/chunk-HZFBVU5X.js +0 -666
- package/dist/chunk-I2K2NCZQ.js +0 -659
- package/dist/chunk-IGLVVNEG.js +0 -402
- package/dist/chunk-IKRWLEDA.js +0 -1567
- package/dist/chunk-J2FYEQ5L.js +0 -33
- package/dist/chunk-JMPL7NUB.js +0 -108
- package/dist/chunk-K2HL3GBL.js +0 -998
- package/dist/chunk-KAFMW7WM.js +0 -386
- package/dist/chunk-KTFSFCVN.js +0 -46
- package/dist/chunk-LIN2K3EL.js +0 -66
- package/dist/chunk-LUL5Z66S.js +0 -221
- package/dist/chunk-LVFANMOH.js +0 -466
- package/dist/chunk-LY4N4TTL.js +0 -117
- package/dist/chunk-LZBMXNLP.js +0 -1196
- package/dist/chunk-M6TAYK66.js +0 -807
- package/dist/chunk-N2OKBREN.js +0 -243
- package/dist/chunk-NC4KV7EL.js +0 -39
- package/dist/chunk-NF3BK5WR.js +0 -42
- package/dist/chunk-NNWJYUNO.js +0 -573
- package/dist/chunk-NTK3WTHM.js +0 -141
- package/dist/chunk-ODUTYZIU.js +0 -688
- package/dist/chunk-OQM5IVJY.js +0 -1377
- package/dist/chunk-P5JMBPDJ.js +0 -7192
- package/dist/chunk-P5SC4DLJ.js +0 -47
- package/dist/chunk-P6M7RKMI.js +0 -97
- package/dist/chunk-PWWSIB2A.js +0 -52
- package/dist/chunk-PZN2LQY6.js +0 -674
- package/dist/chunk-Q7NNUHQV.js +0 -705
- package/dist/chunk-QCOV5DFY.js +0 -911
- package/dist/chunk-QNWRHOMF.js +0 -692
- package/dist/chunk-QRFXEO6Y.js +0 -17
- package/dist/chunk-QXFBABFJ.js +0 -380
- package/dist/chunk-RGZNQ5CT.js +0 -657
- package/dist/chunk-SRZOW5L2.js +0 -1865
- package/dist/chunk-SXQKNKRA.js +0 -223
- package/dist/chunk-T334FW2H.js +0 -362
- package/dist/chunk-T52TPHYC.js +0 -318
- package/dist/chunk-TJFDL26W.js +0 -658
- package/dist/chunk-TN5FW4XY.js +0 -172
- package/dist/chunk-U7H5WRG5.js +0 -123
- package/dist/chunk-UFYNOQK4.js +0 -302
- package/dist/chunk-URBGEOH3.js +0 -32
- package/dist/chunk-USZA7GWL.js +0 -341
- package/dist/chunk-UUQ5G6EZ.js +0 -697
- package/dist/chunk-VAHLPXPY.js +0 -399
- package/dist/chunk-VANN3GDP.js +0 -2488
- package/dist/chunk-VHMX7SXF.js +0 -1289
- package/dist/chunk-WJIMKGD6.js +0 -132
- package/dist/chunk-WKUYQBCG.js +0 -795
- package/dist/chunk-WNGF5AJX.js +0 -1911
- package/dist/chunk-WV6TDAPN.js +0 -3627
- package/dist/chunk-X3BI7HTV.js +0 -562
- package/dist/chunk-XWMSPJYN.js +0 -149
- package/dist/chunk-YPRSNUTC.js +0 -395
- package/dist/chunk-ZS43Y2FT.js +0 -438
- package/dist/clio-QQCMTUZE.js +0 -26
- package/dist/code-nav-GUPM6766.js +0 -686
- package/dist/components-TNIKXCBH.js +0 -674
- package/dist/config-IIM7YOD3.js +0 -621
- package/dist/configure-4ZM5HWJX.js +0 -73
- package/dist/context-44BZLJ3J.js +0 -344
- package/dist/context-AIDVQKMW.js +0 -278
- package/dist/context-OL5P3HEP.js +0 -1031
- package/dist/context-clear-OQV76MYP.js +0 -184
- package/dist/context-index-HP2JFUWA.js +0 -120
- package/dist/context-map-INTXD54D.js +0 -555
- package/dist/context-working-set-ZUW3EGLS.js +0 -1556
- package/dist/detail-UXPWRANG.js +0 -115
- package/dist/dispatch-runner-P3ZW6G77.js +0 -2438
- package/dist/docs-BL7ROUFN.js +0 -292
- package/dist/doctor-JJVGPZWT.js +0 -797
- package/dist/eval-V2RTN3UH.js +0 -4972
- package/dist/eval-inventory-QOYZERXJ.js +0 -315
- package/dist/evidence-35PYWGSO.js +0 -225
- package/dist/evidence-CIGGKI6J.js +0 -383
- package/dist/evolve-33SM3NJP.js +0 -609
- package/dist/extensions-YVRHX6ZI.js +0 -229
- package/dist/fleet-LFO7SIPC.js +0 -908
- package/dist/fleet-commands-RLK72GU3.js +0 -75
- package/dist/fleet-decisions-3SBSCTCW.js +0 -159
- package/dist/fleet-graph-JZIBCGMW.js +0 -134
- package/dist/fleet-inspect-2L5YGGZJ.js +0 -469
- package/dist/fleet-preflight-QRSHIIDE.js +0 -22
- package/dist/fleet-validate-LIAVKDUU.js +0 -92
- package/dist/fleet-verify-JIK3OQZR.js +0 -202
- package/dist/fleet-view-IWHYGQKK.js +0 -118
- package/dist/init-NJEDOTQW.js +0 -321
- package/dist/interop-RVCAYECG.js +0 -115
- package/dist/inventory-74UL7UHU.js +0 -118
- package/dist/library-CTKZA7K3.js +0 -226
- package/dist/memory-I76I5VUH.js +0 -512
- package/dist/models-D4YDIQZQ.js +0 -289
- package/dist/monitor-NKVD55HX.js +0 -775
- package/dist/orchestrator-I6OATVPK.js +0 -39518
- package/dist/panes-7BTYH3XQ.js +0 -103
- package/dist/panes-WPOMEMRH.js +0 -74
- package/dist/paths-J3KN7UAO.js +0 -67
- package/dist/preload-EJAWJEIO.js +0 -116
- package/dist/reset-4XMQKDNZ.js +0 -345
- package/dist/resources-TVYVXK3Q.js +0 -125
- package/dist/run-OWQNNSJU.js +0 -872
- package/dist/share-NPZZMUXG.js +0 -290
- package/dist/skills-OXFEAWMT.js +0 -510
- package/dist/skills-eval-J5TCKSJA.js +0 -1034
- package/dist/skills-inventory-7II4DM57.js +0 -133
- package/dist/slash-commands-MDSDSWYF.js +0 -92
- package/dist/steer-S7D7IKPU.js +0 -77
- package/dist/support-5VAEC32W.js +0 -38
- package/dist/targets-KILZEOCE.js +0 -1109
- package/dist/tasks-R6P6OV22.js +0 -36
- package/dist/terminal-lease-LZCG2KN3.js +0 -405
- package/dist/tools-6OCQ6SVB.js +0 -28
- package/dist/trace-JHLXWUMN.js +0 -572
- package/dist/tui-primitives-RCY2HN7G.js +0 -17
- package/dist/uninstall-FXYMFFRT.js +0 -407
- package/dist/upgrade-D2OZH6IQ.js +0 -307
- package/dist/usage-PIASNUS4.js +0 -1052
- package/dist/verifiers-LTHUY2PX.js +0 -630
- package/dist/verify-HYF7KBVE.js +0 -30
- package/dist/web-fetch-MQN4FH3X.js +0 -788
- package/dist/wiki-generate-RK7JQ5NP.js +0 -615
- package/dist/with-panes-OFTNAR4Y.js +0 -628
- package/skills/README.md +0 -418
- package/skills/coding/ast-grep/SKILL.md +0 -213
- package/skills/coding/ast-grep/evals.md +0 -82
- package/skills/coding/coding-standards/SKILL.md +0 -164
- package/skills/coding/coding-standards/evals.md +0 -57
- package/skills/coding/prototype/SKILL.md +0 -151
- package/skills/coding/prototype/evals.md +0 -61
- package/skills/coding/tdd/SKILL.md +0 -134
- package/skills/coding/tdd/evals.md +0 -61
- package/skills/context/context-handoff/SKILL.md +0 -176
- package/skills/context/context-handoff/evals.md +0 -101
- package/skills/context/context-prime/SKILL.md +0 -131
- package/skills/context/context-prime/evals.md +0 -99
- package/skills/git/branch-closeout/SKILL.md +0 -132
- package/skills/git/file-ticket/SKILL.md +0 -126
- package/skills/git/fix-issue/SKILL.md +0 -136
- package/skills/git/resolve-merge-conflicts/SKILL.md +0 -151
- package/skills/git/resolve-merge-conflicts/evals.md +0 -85
- package/skills/git/ship/SKILL.md +0 -134
- package/skills/git/worktree-create/SKILL.md +0 -127
- package/skills/git/worktree-merge/SKILL.md +0 -147
- package/skills/meta/clio-coder-dev/SKILL.md +0 -101
- package/skills/meta/clio-coder-dev/evals.md +0 -46
- package/skills/meta/clio-coder-test/SKILL.md +0 -146
- package/skills/meta/clio-coder-test/evals.md +0 -48
- package/skills/meta/clio-coder-test/references/test-map.md +0 -96
- package/skills/meta/credentials/SKILL.md +0 -132
- package/skills/meta/credentials/evals.md +0 -104
- package/skills/meta/find-skills/SKILL.md +0 -78
- package/skills/meta/find-skills/evals.md +0 -47
- package/skills/meta/herdr/SKILL.md +0 -133
- package/skills/meta/herdr/evals.md +0 -38
- package/skills/meta/skill-craft/SKILL.md +0 -125
- package/skills/meta/skill-craft/evals.md +0 -41
- package/skills/planning/archify/SKILL.md +0 -196
- package/skills/planning/architecture/SKILL.md +0 -184
- package/skills/planning/architecture/evals.md +0 -101
- package/skills/planning/backlog/SKILL.md +0 -212
- package/skills/planning/backlog/evals.md +0 -185
- package/skills/planning/prd/SKILL.md +0 -129
- package/skills/planning/prd/evals.md +0 -103
- package/skills/planning/product-intent/SKILL.md +0 -173
- package/skills/planning/product-intent/evals.md +0 -106
- package/skills/planning/tech-spec/SKILL.md +0 -172
- package/skills/planning/tech-spec/evals.md +0 -120
- package/skills/registry.yaml +0 -144
- package/skills/remote.yaml +0 -13
- package/skills/research/arxiv-literature/SKILL.md +0 -168
- package/skills/research/arxiv-literature/evals.md +0 -108
- package/skills/research/experiment-protocol/SKILL.md +0 -148
- package/skills/research/experiment-protocol/evals.md +0 -114
- package/skills/research/scientific-debugging/SKILL.md +0 -149
- package/skills/research/scientific-debugging/evals.md +0 -156
- package/skills/research/scientific-modernization/SKILL.md +0 -170
- package/skills/research/scientific-modernization/evals.md +0 -111
- package/skills/skill-marketplace.json +0 -507
- package/skills/workflow/cut-it/SKILL.md +0 -153
- package/skills/workflow/cut-it/evals.md +0 -143
- package/skills/workflow/design-council/SKILL.md +0 -233
- package/skills/workflow/design-council/evals.md +0 -258
- package/skills/workflow/grill-me/SKILL.md +0 -267
- package/skills/workflow/grill-me/evals.md +0 -231
- package/skills/workflow/workflow-distiller/SKILL.md +0 -201
- package/skills/workflow/workflow-distiller/evals.md +0 -225
- package/src/domains/extensions/resource-path.ts +0 -27
- package/src/domains/extensions/resources.ts +0 -37
- package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +0 -27
- package/src/interactive/overlays/agents.ts +0 -70
- package/src/interactive/overlays/library-install-confirm.ts +0 -152
- package/src/interactive/overlays/prompts.ts +0 -89
- package/src/interactive/overlays/skills-hub.ts +0 -615
- /package/{skills → library/skills}/coding/ast-grep/references/rule_reference.md +0 -0
- /package/{skills → library/skills}/coding/prototype/references/LOGIC.md +0 -0
- /package/{skills → library/skills}/coding/prototype/references/UI.md +0 -0
- /package/{skills → library/skills}/coding/tdd/references/mocking.md +0 -0
- /package/{skills → library/skills}/coding/tdd/references/tests.md +0 -0
- /package/{skills → library/skills}/context/context-handoff/scripts/new-handoff.sh +0 -0
- /package/{skills → library/skills}/git/branch-closeout/evals.md +0 -0
- /package/{skills → library/skills}/git/branch-closeout/references/closeout-checklist.md +0 -0
- /package/{skills → library/skills}/git/file-ticket/assets/issue-template.md +0 -0
- /package/{skills → library/skills}/git/file-ticket/evals.md +0 -0
- /package/{skills → library/skills}/git/file-ticket/references/issue-discovery.md +0 -0
- /package/{skills → library/skills}/git/fix-issue/evals.md +0 -0
- /package/{skills → library/skills}/git/fix-issue/references/diagnosis-and-rca.md +0 -0
- /package/{skills → library/skills}/git/resolve-merge-conflicts/references/conflict-matrix.md +0 -0
- /package/{skills → library/skills}/git/ship/assets/pr-template.md +0 -0
- /package/{skills → library/skills}/git/ship/evals.md +0 -0
- /package/{skills → library/skills}/git/ship/references/remote-and-branch-policy.md +0 -0
- /package/{skills → library/skills}/git/worktree-create/evals.md +0 -0
- /package/{skills → library/skills}/git/worktree-create/references/worktree-setup.md +0 -0
- /package/{skills → library/skills}/git/worktree-merge/evals.md +0 -0
- /package/{skills → library/skills}/git/worktree-merge/references/merge-strategies.md +0 -0
- /package/{skills → library/skills}/meta/clio-coder-test/references/harness.md +0 -0
- /package/{skills → library/skills}/planning/archify/evals.md +0 -0
|
@@ -0,0 +1,1572 @@
|
|
|
1
|
+
import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
projectSurfaceTrust,
|
|
4
|
+
safetySurfaceTrustHash,
|
|
5
|
+
workspaceTrustDirectory
|
|
6
|
+
} from "./chunk-X6FLVUM5.js";
|
|
7
|
+
import {
|
|
8
|
+
loadProjectVerifierCatalog
|
|
9
|
+
} from "./chunk-5C2OQHLR.js";
|
|
10
|
+
import {
|
|
11
|
+
foreignAgentDirs
|
|
12
|
+
} from "./chunk-5EQO5NWP.js";
|
|
13
|
+
import {
|
|
14
|
+
classify
|
|
15
|
+
} from "./chunk-YXFKLMX2.js";
|
|
16
|
+
import {
|
|
17
|
+
extractCommandCdTargets,
|
|
18
|
+
extractCommandDeleteTargets,
|
|
19
|
+
extractCommandWriteTargets,
|
|
20
|
+
inlineShellScript,
|
|
21
|
+
invokesClioSkillMutation,
|
|
22
|
+
scanShellLike
|
|
23
|
+
} from "./chunk-E2NSPYLC.js";
|
|
24
|
+
import {
|
|
25
|
+
pathBoundaryCovers,
|
|
26
|
+
resolvePathBoundary
|
|
27
|
+
} from "./chunk-R2P2U3ZS.js";
|
|
28
|
+
import {
|
|
29
|
+
artifactDefaultPath
|
|
30
|
+
} from "./chunk-NTTS3O53.js";
|
|
31
|
+
import {
|
|
32
|
+
canonicalizeExistingPath
|
|
33
|
+
} from "./chunk-KQ6IDQIB.js";
|
|
34
|
+
import {
|
|
35
|
+
ToolNames
|
|
36
|
+
} from "./chunk-WLHX3MM5.js";
|
|
37
|
+
import {
|
|
38
|
+
require_dist
|
|
39
|
+
} from "./chunk-B5GGDIHT.js";
|
|
40
|
+
import {
|
|
41
|
+
clioConfigDir
|
|
42
|
+
} from "./chunk-CTTI7G3T.js";
|
|
43
|
+
import {
|
|
44
|
+
resolvePackageRoot
|
|
45
|
+
} from "./chunk-E3LEPLQ2.js";
|
|
46
|
+
import {
|
|
47
|
+
__toESM,
|
|
48
|
+
init_esm_shims
|
|
49
|
+
} from "./chunk-ECBHH7LU.js";
|
|
50
|
+
|
|
51
|
+
// src/domains/safety/path-policy.ts
|
|
52
|
+
init_esm_shims();
|
|
53
|
+
import { homedir } from "node:os";
|
|
54
|
+
import path from "node:path";
|
|
55
|
+
var ORDERED_KINDS = ["zeroAccessPaths", "readOnlyPaths", "noWritePaths", "noDeletePaths"];
|
|
56
|
+
function isSameOrDescendant(candidatePath, policyPath) {
|
|
57
|
+
const candidate = path.resolve(candidatePath);
|
|
58
|
+
const policy = path.resolve(policyPath);
|
|
59
|
+
const relative = path.relative(policy, candidate);
|
|
60
|
+
return relative === "" || relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
|
|
61
|
+
}
|
|
62
|
+
function expandTilde(rawPath) {
|
|
63
|
+
if (rawPath === "~") return homedir();
|
|
64
|
+
if (rawPath.startsWith("~/")) return path.join(homedir(), rawPath.slice(2));
|
|
65
|
+
return rawPath;
|
|
66
|
+
}
|
|
67
|
+
function normalizePolicyEntry(rawPath, root) {
|
|
68
|
+
const expanded = expandTilde(rawPath.trim());
|
|
69
|
+
const resolved = path.isAbsolute(expanded) ? path.resolve(expanded) : path.resolve(root, expanded);
|
|
70
|
+
return canonicalizeExistingPath(resolved);
|
|
71
|
+
}
|
|
72
|
+
function blocksOperation(kind, operation) {
|
|
73
|
+
if (kind === "zeroAccessPaths") return true;
|
|
74
|
+
if (kind === "readOnlyPaths" || kind === "noWritePaths") return operation === "write" || operation === "delete";
|
|
75
|
+
return operation === "delete";
|
|
76
|
+
}
|
|
77
|
+
function compilePathPolicy(input, root = process.cwd()) {
|
|
78
|
+
const resolvedRoot = canonicalizeExistingPath(path.resolve(root));
|
|
79
|
+
const entries = [];
|
|
80
|
+
const diagnostics = [];
|
|
81
|
+
for (const kind of ORDERED_KINDS) {
|
|
82
|
+
for (const rawPath of input[kind] ?? []) {
|
|
83
|
+
const trimmed = rawPath.trim();
|
|
84
|
+
if (trimmed.length === 0) {
|
|
85
|
+
diagnostics.push(`${kind}: path must not be empty`);
|
|
86
|
+
continue;
|
|
87
|
+
}
|
|
88
|
+
const entry = { kind, path: normalizePolicyEntry(trimmed, resolvedRoot), source: trimmed };
|
|
89
|
+
const pattern = compilePathPattern(trimmed, resolvedRoot);
|
|
90
|
+
if (pattern !== null) entry.pattern = pattern;
|
|
91
|
+
entries.push(entry);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
root: resolvedRoot,
|
|
96
|
+
entries: entries.sort((a, b) => a.kind.localeCompare(b.kind) || a.path.localeCompare(b.path)),
|
|
97
|
+
diagnostics
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
function evaluatePathPolicy(policy, operation, targetPath, cwd = policy.root) {
|
|
101
|
+
const expanded = expandTilde(targetPath);
|
|
102
|
+
const lexicalTarget = path.isAbsolute(expanded) ? path.resolve(expanded) : path.resolve(cwd, expanded);
|
|
103
|
+
const resolvedTarget = canonicalizeExistingPath(lexicalTarget);
|
|
104
|
+
const normalizedResolvedTarget = normalizeSeparators(resolvedTarget);
|
|
105
|
+
const normalizedRelativeTarget = normalizeSeparators(path.relative(policy.root, resolvedTarget));
|
|
106
|
+
const normalizedRawTarget = normalizeSeparators(targetPath);
|
|
107
|
+
for (const entry of policy.entries) {
|
|
108
|
+
if (!blocksOperation(entry.kind, operation)) continue;
|
|
109
|
+
if (!matchesEntry(entry, resolvedTarget, normalizedResolvedTarget, normalizedRelativeTarget, normalizedRawTarget))
|
|
110
|
+
continue;
|
|
111
|
+
return {
|
|
112
|
+
kind: "block",
|
|
113
|
+
reasonCode: `path-policy:${entry.kind}`,
|
|
114
|
+
reason: `${operation} denied by ${entry.kind} entry ${entry.source}`,
|
|
115
|
+
matchedPath: entry.path,
|
|
116
|
+
policyKind: entry.kind
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
return { kind: "allow" };
|
|
120
|
+
}
|
|
121
|
+
function matchesEntry(entry, resolvedTarget, normalizedResolvedTarget, normalizedRelativeTarget, normalizedRawTarget) {
|
|
122
|
+
if (isSameOrDescendant(resolvedTarget, entry.path)) return true;
|
|
123
|
+
if (entry.pattern === void 0) return false;
|
|
124
|
+
return entry.pattern.test(normalizedResolvedTarget) || entry.pattern.test(normalizedRelativeTarget) || entry.pattern.test(normalizedRawTarget);
|
|
125
|
+
}
|
|
126
|
+
function compilePathPattern(rawPath, root) {
|
|
127
|
+
if (!rawPath.includes("*")) return null;
|
|
128
|
+
const expanded = expandTilde(rawPath.trim());
|
|
129
|
+
const source = path.isAbsolute(expanded) ? expanded : path.join(root, expanded);
|
|
130
|
+
const normalized = normalizeSeparators(canonicalizePatternSource(source));
|
|
131
|
+
const relative = normalizeSeparators(path.isAbsolute(expanded) ? expanded : expanded);
|
|
132
|
+
const absolutePattern = segmentPattern(normalized);
|
|
133
|
+
const relativePattern = segmentPattern(relative);
|
|
134
|
+
return new RegExp(`(?:${absolutePattern})|(?:${relativePattern})`);
|
|
135
|
+
}
|
|
136
|
+
function canonicalizePatternSource(patternPath) {
|
|
137
|
+
const wildcardIndex = patternPath.indexOf("*");
|
|
138
|
+
if (wildcardIndex === -1) return canonicalizeExistingPath(patternPath);
|
|
139
|
+
const fixedPrefix = patternPath.slice(0, wildcardIndex);
|
|
140
|
+
const separatorIndex = fixedPrefix.lastIndexOf(path.sep);
|
|
141
|
+
if (separatorIndex === -1) return patternPath;
|
|
142
|
+
const prefix = patternPath.slice(0, separatorIndex + 1);
|
|
143
|
+
const suffix = patternPath.slice(separatorIndex + 1);
|
|
144
|
+
return path.join(canonicalizeExistingPath(prefix), suffix);
|
|
145
|
+
}
|
|
146
|
+
function segmentPattern(rawPath) {
|
|
147
|
+
const escaped = rawPath.split("*").map((part) => part.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")).join("[^/]*");
|
|
148
|
+
return `(?:^|/)${escaped}(?:$|/)`;
|
|
149
|
+
}
|
|
150
|
+
function normalizeSeparators(value) {
|
|
151
|
+
return value.split(path.sep).join("/");
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// src/domains/safety/policy-engine.ts
|
|
155
|
+
init_esm_shims();
|
|
156
|
+
import { createHash as createHash2 } from "node:crypto";
|
|
157
|
+
import { readFileSync as readFileSync3 } from "node:fs";
|
|
158
|
+
import path4 from "node:path";
|
|
159
|
+
|
|
160
|
+
// src/domains/safety/default-path-policy.ts
|
|
161
|
+
init_esm_shims();
|
|
162
|
+
var DEFAULT_DAMAGE_CONTROL_PATH_POLICY = {
|
|
163
|
+
zeroAccessPaths: [
|
|
164
|
+
".env",
|
|
165
|
+
".env.local",
|
|
166
|
+
".env.development",
|
|
167
|
+
".env.production",
|
|
168
|
+
".env.staging",
|
|
169
|
+
".env.test",
|
|
170
|
+
".env.*.local",
|
|
171
|
+
"*.env",
|
|
172
|
+
"~/.ssh/",
|
|
173
|
+
"~/.gnupg/",
|
|
174
|
+
"~/.aws/",
|
|
175
|
+
"~/.config/gcloud/",
|
|
176
|
+
"*-credentials.json",
|
|
177
|
+
"*serviceAccount*.json",
|
|
178
|
+
"*service-account*.json",
|
|
179
|
+
"~/.azure/",
|
|
180
|
+
"~/.kube/",
|
|
181
|
+
"kubeconfig",
|
|
182
|
+
"*-secret.yaml",
|
|
183
|
+
"secrets.yaml",
|
|
184
|
+
"~/.docker/",
|
|
185
|
+
"*.pem",
|
|
186
|
+
"*.key",
|
|
187
|
+
"*.p12",
|
|
188
|
+
"*.pfx",
|
|
189
|
+
"*.tfstate",
|
|
190
|
+
"*.tfstate.backup",
|
|
191
|
+
".terraform/",
|
|
192
|
+
".vercel/",
|
|
193
|
+
".netlify/",
|
|
194
|
+
"firebase-adminsdk*.json",
|
|
195
|
+
"serviceAccountKey.json",
|
|
196
|
+
".supabase/",
|
|
197
|
+
"~/.netrc",
|
|
198
|
+
"~/.npmrc",
|
|
199
|
+
"~/.pypirc",
|
|
200
|
+
"~/.git-credentials",
|
|
201
|
+
".git-credentials",
|
|
202
|
+
// Remote URLs in the repo git config can embed access tokens, and .git
|
|
203
|
+
// is hidden from grep/find but not from direct reads without this entry.
|
|
204
|
+
".git/config",
|
|
205
|
+
// Clio's own provider secret store. The literal covers a repo-level file
|
|
206
|
+
// of the same name on purpose; the expanded clioConfigDir() form is
|
|
207
|
+
// appended at policy construction (policy-engine.ts), since this static
|
|
208
|
+
// list cannot call config helpers.
|
|
209
|
+
"credentials.yaml",
|
|
210
|
+
"dump.sql",
|
|
211
|
+
"backup.sql",
|
|
212
|
+
"*.dump"
|
|
213
|
+
],
|
|
214
|
+
readOnlyPaths: [
|
|
215
|
+
// Clio's own operator-authority files in the project. `safety.yaml` is the
|
|
216
|
+
// policy that gates the model's tools, and `verifiers.yaml` is an argv
|
|
217
|
+
// catalog that verify() executes; a model that can author either one can
|
|
218
|
+
// widen its own permissions in two tool calls. Both are authored by the
|
|
219
|
+
// operator through the CLI (`clio-coder verifiers author` lands nothing
|
|
220
|
+
// before `--yes`), so model-side writes and deletes are refused.
|
|
221
|
+
// Skills also refuse model-side writes and deletes; installs go through `clio-coder library install`.
|
|
222
|
+
".clio-coder/safety.yaml",
|
|
223
|
+
".clio-coder/verifiers.yaml",
|
|
224
|
+
".clio-coder/skills/",
|
|
225
|
+
".clio-coder/plugins/",
|
|
226
|
+
".clio-coder/extensions/",
|
|
227
|
+
"/etc/",
|
|
228
|
+
"/usr/",
|
|
229
|
+
"/bin/",
|
|
230
|
+
"/sbin/",
|
|
231
|
+
"/boot/",
|
|
232
|
+
"/root/",
|
|
233
|
+
"~/.bash_history",
|
|
234
|
+
"~/.zsh_history",
|
|
235
|
+
"~/.node_repl_history",
|
|
236
|
+
"~/.bashrc",
|
|
237
|
+
"~/.zshrc",
|
|
238
|
+
"~/.profile",
|
|
239
|
+
"~/.bash_profile",
|
|
240
|
+
"*.min.js",
|
|
241
|
+
"*.min.css",
|
|
242
|
+
"*.bundle.js",
|
|
243
|
+
"*.chunk.js",
|
|
244
|
+
"dist/",
|
|
245
|
+
"build/",
|
|
246
|
+
".next/",
|
|
247
|
+
".nuxt/",
|
|
248
|
+
".output/",
|
|
249
|
+
"node_modules/",
|
|
250
|
+
"__pycache__/",
|
|
251
|
+
".venv/",
|
|
252
|
+
"venv/",
|
|
253
|
+
"target/"
|
|
254
|
+
],
|
|
255
|
+
// Another agent's own configuration. Clio reads these roots for skills,
|
|
256
|
+
// prompts, and rule prose and has no reason to author them, so the guard is
|
|
257
|
+
// on writes and not only on deletes.
|
|
258
|
+
noWritePaths: [...foreignAgentDirs()],
|
|
259
|
+
noDeletePaths: [
|
|
260
|
+
"~/.claude/",
|
|
261
|
+
"CLAUDE.md",
|
|
262
|
+
"LICENSE",
|
|
263
|
+
"LICENSE.*",
|
|
264
|
+
"COPYING",
|
|
265
|
+
"COPYING.*",
|
|
266
|
+
"NOTICE",
|
|
267
|
+
"PATENTS",
|
|
268
|
+
"README.md",
|
|
269
|
+
"README.*"
|
|
270
|
+
]
|
|
271
|
+
};
|
|
272
|
+
function mergePathPolicyInputs(base, override) {
|
|
273
|
+
return {
|
|
274
|
+
zeroAccessPaths: [...base.zeroAccessPaths ?? [], ...override.zeroAccessPaths ?? []],
|
|
275
|
+
readOnlyPaths: [...base.readOnlyPaths ?? [], ...override.readOnlyPaths ?? []],
|
|
276
|
+
noWritePaths: [...base.noWritePaths ?? [], ...override.noWritePaths ?? []],
|
|
277
|
+
noDeletePaths: [...base.noDeletePaths ?? [], ...override.noDeletePaths ?? []]
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
var OPERATOR_PATH_POLICY = {
|
|
281
|
+
zeroAccessPaths: DEFAULT_DAMAGE_CONTROL_PATH_POLICY.zeroAccessPaths?.filter((entry) => entry.startsWith("~/")) ?? [],
|
|
282
|
+
readOnlyPaths: DEFAULT_DAMAGE_CONTROL_PATH_POLICY.readOnlyPaths?.filter(
|
|
283
|
+
(entry) => entry.startsWith("~/") || entry.startsWith("/") || entry.startsWith(".clio-coder/")
|
|
284
|
+
) ?? [],
|
|
285
|
+
noWritePaths: DEFAULT_DAMAGE_CONTROL_PATH_POLICY.noWritePaths ?? [],
|
|
286
|
+
noDeletePaths: DEFAULT_DAMAGE_CONTROL_PATH_POLICY.noDeletePaths?.filter((entry) => entry.startsWith("~/")) ?? []
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
// src/domains/safety/project-policy.ts
|
|
290
|
+
init_esm_shims();
|
|
291
|
+
var import_yaml = __toESM(require_dist(), 1);
|
|
292
|
+
import { createHash } from "node:crypto";
|
|
293
|
+
import { existsSync, readFileSync, realpathSync } from "node:fs";
|
|
294
|
+
import path2 from "node:path";
|
|
295
|
+
var POLICY_RELATIVE_PATH = path2.join(".clio-coder", "safety.yaml");
|
|
296
|
+
var ACTION_CLASSES = /* @__PURE__ */ new Set([
|
|
297
|
+
"read",
|
|
298
|
+
"write",
|
|
299
|
+
"execute",
|
|
300
|
+
"dispatch",
|
|
301
|
+
"system_modify",
|
|
302
|
+
"git_destructive",
|
|
303
|
+
"unknown"
|
|
304
|
+
]);
|
|
305
|
+
var PATH_POLICY_KEYS = ["zeroAccessPaths", "readOnlyPaths", "noWritePaths", "noDeletePaths"];
|
|
306
|
+
var ROOT_KEYS = /* @__PURE__ */ new Set(["version", "commands", "tasks", "disableDefaultPathPolicy", ...PATH_POLICY_KEYS]);
|
|
307
|
+
var COMMAND_KEYS = /* @__PURE__ */ new Set([
|
|
308
|
+
"id",
|
|
309
|
+
"command",
|
|
310
|
+
"cwd",
|
|
311
|
+
"timeoutMs",
|
|
312
|
+
"maxOutputBytes",
|
|
313
|
+
"actionClass",
|
|
314
|
+
"shellOperators",
|
|
315
|
+
"env",
|
|
316
|
+
"requireConfirmation",
|
|
317
|
+
"rationale",
|
|
318
|
+
"owner",
|
|
319
|
+
"comment"
|
|
320
|
+
]);
|
|
321
|
+
var ENV_KEYS = /* @__PURE__ */ new Set(["mode", "allow"]);
|
|
322
|
+
var ID_RE = /^[a-zA-Z0-9][a-zA-Z0-9_.:-]*$/;
|
|
323
|
+
function projectSafetyPolicyPath(cwd = process.cwd()) {
|
|
324
|
+
let cursor = path2.resolve(cwd);
|
|
325
|
+
while (true) {
|
|
326
|
+
const candidate = path2.join(cursor, POLICY_RELATIVE_PATH);
|
|
327
|
+
if (existsSync(candidate)) return candidate;
|
|
328
|
+
const parent = path2.dirname(cursor);
|
|
329
|
+
if (parent === cursor) return null;
|
|
330
|
+
cursor = parent;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
function loadProjectSafetyPolicy(cwd = process.cwd()) {
|
|
334
|
+
let policyPath = projectSafetyPolicyPath(cwd);
|
|
335
|
+
if (policyPath === null) {
|
|
336
|
+
return {
|
|
337
|
+
path: null,
|
|
338
|
+
hash: null,
|
|
339
|
+
valid: true,
|
|
340
|
+
errors: [],
|
|
341
|
+
commands: [],
|
|
342
|
+
pathPolicy: {},
|
|
343
|
+
disableDefaultPathPolicy: false
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
let raw;
|
|
347
|
+
try {
|
|
348
|
+
policyPath = realpathSync(policyPath);
|
|
349
|
+
raw = readFileSync(policyPath, "utf8");
|
|
350
|
+
} catch (err) {
|
|
351
|
+
return {
|
|
352
|
+
path: policyPath,
|
|
353
|
+
hash: null,
|
|
354
|
+
valid: false,
|
|
355
|
+
errors: [`cannot read project safety policy: ${err instanceof Error ? err.message : String(err)}`],
|
|
356
|
+
commands: [],
|
|
357
|
+
pathPolicy: {},
|
|
358
|
+
disableDefaultPathPolicy: false
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
const hash = sha256(raw);
|
|
362
|
+
try {
|
|
363
|
+
const parsed = (0, import_yaml.parse)(raw);
|
|
364
|
+
return validateProjectSafetyPolicy(parsed, policyPath, hash);
|
|
365
|
+
} catch (err) {
|
|
366
|
+
return {
|
|
367
|
+
path: policyPath,
|
|
368
|
+
hash,
|
|
369
|
+
valid: false,
|
|
370
|
+
errors: [`cannot parse project safety policy: ${err instanceof Error ? err.message : String(err)}`],
|
|
371
|
+
commands: [],
|
|
372
|
+
pathPolicy: {},
|
|
373
|
+
disableDefaultPathPolicy: false
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
function validateProjectSafetyPolicy(value, policyPath, hash) {
|
|
378
|
+
const errors = [];
|
|
379
|
+
const commands = [];
|
|
380
|
+
if (!isPlainRecord(value)) {
|
|
381
|
+
return {
|
|
382
|
+
path: policyPath,
|
|
383
|
+
hash,
|
|
384
|
+
valid: false,
|
|
385
|
+
errors: ["policy root must be a mapping"],
|
|
386
|
+
commands: [],
|
|
387
|
+
pathPolicy: {},
|
|
388
|
+
disableDefaultPathPolicy: false
|
|
389
|
+
};
|
|
390
|
+
}
|
|
391
|
+
for (const key of Object.keys(value)) {
|
|
392
|
+
if (!ROOT_KEYS.has(key)) errors.push(`unknown root key '${key}'`);
|
|
393
|
+
}
|
|
394
|
+
if (value.version !== 1) errors.push("version must be 1");
|
|
395
|
+
appendCommandPolicies(commands, errors, value.commands, "commands");
|
|
396
|
+
appendCommandPolicies(commands, errors, value.tasks, "tasks");
|
|
397
|
+
const pathPolicy = parsePathPolicy(value, errors);
|
|
398
|
+
const disableDefaultPathPolicy = value.disableDefaultPathPolicy === void 0 ? false : booleanField(value, "disableDefaultPathPolicy", "policy", errors);
|
|
399
|
+
const ids = /* @__PURE__ */ new Set();
|
|
400
|
+
for (const command of commands) {
|
|
401
|
+
if (ids.has(command.id)) errors.push(`duplicate command id '${command.id}'`);
|
|
402
|
+
ids.add(command.id);
|
|
403
|
+
}
|
|
404
|
+
return {
|
|
405
|
+
path: policyPath,
|
|
406
|
+
hash,
|
|
407
|
+
valid: errors.length === 0,
|
|
408
|
+
errors,
|
|
409
|
+
commands: errors.length === 0 ? commands : [],
|
|
410
|
+
pathPolicy: errors.length === 0 ? pathPolicy : {},
|
|
411
|
+
disableDefaultPathPolicy: errors.length === 0 ? disableDefaultPathPolicy : false
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
function parsePathPolicy(value, errors) {
|
|
415
|
+
const out = {};
|
|
416
|
+
for (const key of PATH_POLICY_KEYS) {
|
|
417
|
+
const parsed = parsePathList(value[key], key, errors);
|
|
418
|
+
if (parsed !== void 0) out[key] = parsed;
|
|
419
|
+
}
|
|
420
|
+
return out;
|
|
421
|
+
}
|
|
422
|
+
function parsePathList(value, key, errors) {
|
|
423
|
+
if (value === void 0) return void 0;
|
|
424
|
+
if (!Array.isArray(value)) {
|
|
425
|
+
errors.push(`${key} must be an array`);
|
|
426
|
+
return void 0;
|
|
427
|
+
}
|
|
428
|
+
const out = [];
|
|
429
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
430
|
+
const item = value[index];
|
|
431
|
+
const label = `${key}[${index}]`;
|
|
432
|
+
if (typeof item !== "string" || item.trim().length === 0) {
|
|
433
|
+
errors.push(`${label} must be a non-empty string`);
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
const trimmed = item.trim();
|
|
437
|
+
if (path2.isAbsolute(trimmed)) {
|
|
438
|
+
errors.push(`${label} must be relative to the policy root`);
|
|
439
|
+
continue;
|
|
440
|
+
}
|
|
441
|
+
const normalized = path2.normalize(trimmed);
|
|
442
|
+
const segments = normalized.split(path2.sep).filter((segment) => segment.length > 0);
|
|
443
|
+
if (segments.some((segment) => segment === "..")) {
|
|
444
|
+
errors.push(`${label} must not escape the policy root with '..'`);
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
out.push(trimmed);
|
|
448
|
+
}
|
|
449
|
+
return out;
|
|
450
|
+
}
|
|
451
|
+
function appendCommandPolicies(out, errors, value, field) {
|
|
452
|
+
if (value === void 0) return;
|
|
453
|
+
if (!Array.isArray(value)) {
|
|
454
|
+
errors.push(`${field} must be an array`);
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
458
|
+
const parsed = parseCommandPolicy(value[index], `${field}[${index}]`);
|
|
459
|
+
if (parsed.errors.length > 0) {
|
|
460
|
+
errors.push(...parsed.errors);
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
if (parsed.command !== void 0) out.push(parsed.command);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
function parseCommandPolicy(value, label) {
|
|
467
|
+
const errors = [];
|
|
468
|
+
if (!isPlainRecord(value)) return { errors: [`${label} must be a mapping`] };
|
|
469
|
+
for (const key of Object.keys(value)) {
|
|
470
|
+
if (!COMMAND_KEYS.has(key)) errors.push(`${label}: unknown key '${key}'`);
|
|
471
|
+
}
|
|
472
|
+
const id = stringField(value, "id", label, errors);
|
|
473
|
+
const command = stringField(value, "command", label, errors);
|
|
474
|
+
const cwd = optionalStringField(value, "cwd", label, errors);
|
|
475
|
+
const timeoutMs = optionalPositiveInt(value, "timeoutMs", label, errors);
|
|
476
|
+
const maxOutputBytes = optionalPositiveInt(value, "maxOutputBytes", label, errors);
|
|
477
|
+
const actionClass = parseActionClass(value.actionClass, label, errors);
|
|
478
|
+
const shellOperators = parseShellOperators(value.shellOperators, label, errors);
|
|
479
|
+
const env = parseEnvPolicy(value.env, label, errors);
|
|
480
|
+
const requireConfirmation = value.requireConfirmation === void 0 ? false : booleanField(value, "requireConfirmation", label, errors);
|
|
481
|
+
const rationale = optionalStringField(value, "rationale", label, errors);
|
|
482
|
+
const owner = optionalStringField(value, "owner", label, errors);
|
|
483
|
+
const comment = optionalStringField(value, "comment", label, errors);
|
|
484
|
+
if (id && !ID_RE.test(id)) errors.push(`${label}.id must match ${ID_RE}`);
|
|
485
|
+
if (command && command.trim().length === 0) errors.push(`${label}.command must not be empty`);
|
|
486
|
+
if (cwd !== void 0) {
|
|
487
|
+
if (path2.isAbsolute(cwd)) {
|
|
488
|
+
errors.push(`${label}.cwd must be relative to the policy root`);
|
|
489
|
+
} else {
|
|
490
|
+
const normalized = path2.normalize(cwd);
|
|
491
|
+
const segments = normalized.split(path2.sep).filter((segment) => segment.length > 0);
|
|
492
|
+
if (segments.some((segment) => segment === "..")) {
|
|
493
|
+
errors.push(`${label}.cwd must not escape the policy root with '..'`);
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
if (errors.length > 0 || id === void 0 || command === void 0 || actionClass === void 0 || env === void 0) {
|
|
498
|
+
return { errors };
|
|
499
|
+
}
|
|
500
|
+
const parsed = {
|
|
501
|
+
id,
|
|
502
|
+
command,
|
|
503
|
+
actionClass,
|
|
504
|
+
shellOperators,
|
|
505
|
+
env,
|
|
506
|
+
requireConfirmation
|
|
507
|
+
};
|
|
508
|
+
if (cwd !== void 0) parsed.cwd = cwd;
|
|
509
|
+
if (timeoutMs !== void 0) parsed.timeoutMs = timeoutMs;
|
|
510
|
+
if (maxOutputBytes !== void 0) parsed.maxOutputBytes = maxOutputBytes;
|
|
511
|
+
if (rationale !== void 0) parsed.rationale = rationale;
|
|
512
|
+
if (owner !== void 0) parsed.owner = owner;
|
|
513
|
+
if (comment !== void 0) parsed.comment = comment;
|
|
514
|
+
return { command: parsed, errors: [] };
|
|
515
|
+
}
|
|
516
|
+
function parseActionClass(value, label, errors) {
|
|
517
|
+
if (typeof value !== "string") {
|
|
518
|
+
errors.push(`${label}.actionClass must be a string`);
|
|
519
|
+
return void 0;
|
|
520
|
+
}
|
|
521
|
+
if (!ACTION_CLASSES.has(value)) {
|
|
522
|
+
errors.push(`${label}.actionClass is not supported: ${value}`);
|
|
523
|
+
return void 0;
|
|
524
|
+
}
|
|
525
|
+
return value;
|
|
526
|
+
}
|
|
527
|
+
function parseShellOperators(value, label, errors) {
|
|
528
|
+
if (value === void 0) return "deny";
|
|
529
|
+
if (value === "deny" || value === "allow") return value;
|
|
530
|
+
errors.push(`${label}.shellOperators must be 'deny' or 'allow'`);
|
|
531
|
+
return "deny";
|
|
532
|
+
}
|
|
533
|
+
function parseEnvPolicy(value, label, errors) {
|
|
534
|
+
if (value === void 0) return { mode: "none", allow: [] };
|
|
535
|
+
if (!isPlainRecord(value)) {
|
|
536
|
+
errors.push(`${label}.env must be a mapping`);
|
|
537
|
+
return void 0;
|
|
538
|
+
}
|
|
539
|
+
for (const key of Object.keys(value)) {
|
|
540
|
+
if (!ENV_KEYS.has(key)) errors.push(`${label}.env: unknown key '${key}'`);
|
|
541
|
+
}
|
|
542
|
+
const mode = value.mode;
|
|
543
|
+
if (mode !== "none" && mode !== "allowlist") {
|
|
544
|
+
errors.push(`${label}.env.mode must be 'none' or 'allowlist'`);
|
|
545
|
+
return void 0;
|
|
546
|
+
}
|
|
547
|
+
const allow = value.allow;
|
|
548
|
+
if (allow === void 0) return { mode, allow: [] };
|
|
549
|
+
if (!Array.isArray(allow) || allow.some((entry) => typeof entry !== "string" || entry.length === 0)) {
|
|
550
|
+
errors.push(`${label}.env.allow must be an array of non-empty strings`);
|
|
551
|
+
return void 0;
|
|
552
|
+
}
|
|
553
|
+
if (mode === "none" && allow.length > 0) {
|
|
554
|
+
errors.push(`${label}.env.allow requires env.mode='allowlist'`);
|
|
555
|
+
return void 0;
|
|
556
|
+
}
|
|
557
|
+
return { mode, allow: [...allow] };
|
|
558
|
+
}
|
|
559
|
+
function stringField(record, key, label, errors) {
|
|
560
|
+
const value = record[key];
|
|
561
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
562
|
+
errors.push(`${label}.${key} must be a non-empty string`);
|
|
563
|
+
return void 0;
|
|
564
|
+
}
|
|
565
|
+
return value;
|
|
566
|
+
}
|
|
567
|
+
function optionalStringField(record, key, label, errors) {
|
|
568
|
+
const value = record[key];
|
|
569
|
+
if (value === void 0) return void 0;
|
|
570
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
571
|
+
errors.push(`${label}.${key} must be a non-empty string when present`);
|
|
572
|
+
return void 0;
|
|
573
|
+
}
|
|
574
|
+
return value;
|
|
575
|
+
}
|
|
576
|
+
function optionalPositiveInt(record, key, label, errors) {
|
|
577
|
+
const value = record[key];
|
|
578
|
+
if (value === void 0) return void 0;
|
|
579
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value) || value <= 0) {
|
|
580
|
+
errors.push(`${label}.${key} must be a positive integer`);
|
|
581
|
+
return void 0;
|
|
582
|
+
}
|
|
583
|
+
return value;
|
|
584
|
+
}
|
|
585
|
+
function booleanField(record, key, label, errors) {
|
|
586
|
+
const value = record[key];
|
|
587
|
+
if (typeof value === "boolean") return value;
|
|
588
|
+
errors.push(`${label}.${key} must be a boolean`);
|
|
589
|
+
return false;
|
|
590
|
+
}
|
|
591
|
+
function isPlainRecord(value) {
|
|
592
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
593
|
+
}
|
|
594
|
+
function sha256(raw) {
|
|
595
|
+
return createHash("sha256").update(raw, "utf8").digest("hex");
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
// src/domains/safety/rejection-feedback.ts
|
|
599
|
+
init_esm_shims();
|
|
600
|
+
var HARD_BLOCK_CLASSES = ["git_destructive"];
|
|
601
|
+
function buildShort(ctx) {
|
|
602
|
+
const postureSuffix = ctx.posture ? ` in ${ctx.posture}` : "";
|
|
603
|
+
return `${ctx.tool} blocked: ${ctx.actionClass}${postureSuffix}`;
|
|
604
|
+
}
|
|
605
|
+
function buildDetail(ctx) {
|
|
606
|
+
const lines = [`Clio refused to run ${ctx.tool}.`];
|
|
607
|
+
for (const reason of ctx.reasons) {
|
|
608
|
+
lines.push(`- ${reason}`);
|
|
609
|
+
}
|
|
610
|
+
if (ctx.ruleId) {
|
|
611
|
+
lines.push(`rule: ${ctx.ruleId}`);
|
|
612
|
+
}
|
|
613
|
+
return lines.join("\n");
|
|
614
|
+
}
|
|
615
|
+
function buildHints(ctx) {
|
|
616
|
+
const hints = [];
|
|
617
|
+
const hardBlock = HARD_BLOCK_CLASSES.includes(ctx.actionClass) || ctx.ruleId !== void 0;
|
|
618
|
+
if (hardBlock) {
|
|
619
|
+
hints.push("This is a hard block; confirmation cannot override it.");
|
|
620
|
+
return hints;
|
|
621
|
+
}
|
|
622
|
+
if (ctx.actionClass === "system_modify") {
|
|
623
|
+
hints.push("Operator confirmation is required for this action.");
|
|
624
|
+
}
|
|
625
|
+
return hints;
|
|
626
|
+
}
|
|
627
|
+
function formatRejection(ctx) {
|
|
628
|
+
return {
|
|
629
|
+
short: buildShort(ctx),
|
|
630
|
+
detail: buildDetail(ctx),
|
|
631
|
+
hints: buildHints(ctx)
|
|
632
|
+
};
|
|
633
|
+
}
|
|
634
|
+
var MODEL_REJECTION_PIVOT = "Do not retry this action through another tool unless a hint above names one; pivot or report the blocker.";
|
|
635
|
+
var MODEL_REJECTION_MAX_LINES = 16;
|
|
636
|
+
var MODEL_REJECTION_MAX_LINE_CHARS = 300;
|
|
637
|
+
function formatModelRejection(reason, rejection) {
|
|
638
|
+
const lines = [];
|
|
639
|
+
const seen = /* @__PURE__ */ new Set();
|
|
640
|
+
const push = (line) => {
|
|
641
|
+
const bounded = line.length > MODEL_REJECTION_MAX_LINE_CHARS ? `${line.slice(0, MODEL_REJECTION_MAX_LINE_CHARS)}\u2026` : line;
|
|
642
|
+
const trimmed = bounded.trim();
|
|
643
|
+
if (trimmed.length === 0) return;
|
|
644
|
+
const normalized = trimmed.replace(/^-\s+/, "");
|
|
645
|
+
if (seen.has(normalized) || normalized === MODEL_REJECTION_PIVOT) return;
|
|
646
|
+
seen.add(normalized);
|
|
647
|
+
lines.push(trimmed);
|
|
648
|
+
};
|
|
649
|
+
for (const line of reason.split("\n")) push(line);
|
|
650
|
+
if (rejection) {
|
|
651
|
+
for (const line of rejection.detail.split("\n")) push(line);
|
|
652
|
+
for (const hint of rejection.hints) push(hint);
|
|
653
|
+
}
|
|
654
|
+
const bodyBudget = MODEL_REJECTION_MAX_LINES - 1;
|
|
655
|
+
const body = lines.length > bodyBudget ? [...lines.slice(0, bodyBudget - 1), "(further detail elided)"] : lines;
|
|
656
|
+
return [...body, MODEL_REJECTION_PIVOT].join("\n");
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
// src/domains/safety/rule-pack-loader.ts
|
|
660
|
+
init_esm_shims();
|
|
661
|
+
var import_yaml2 = __toESM(require_dist(), 1);
|
|
662
|
+
import { readFileSync as readFileSync2 } from "node:fs";
|
|
663
|
+
import { join } from "node:path";
|
|
664
|
+
|
|
665
|
+
// src/domains/safety/rule-compiler.ts
|
|
666
|
+
init_esm_shims();
|
|
667
|
+
function asString(value, ruleId, field) {
|
|
668
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
669
|
+
throw new Error(`damage-control rule '${ruleId}': expected string for ${field}`);
|
|
670
|
+
}
|
|
671
|
+
return value;
|
|
672
|
+
}
|
|
673
|
+
function compileDamageControlRule(raw, index) {
|
|
674
|
+
if (typeof raw.id !== "string" || raw.id.length === 0) {
|
|
675
|
+
throw new Error(`damage-control rule at index ${index}: missing or non-string 'id'`);
|
|
676
|
+
}
|
|
677
|
+
const id = raw.id;
|
|
678
|
+
const description = asString(raw.description, id, "description");
|
|
679
|
+
const patternString = asString(raw.pattern, id, "pattern");
|
|
680
|
+
const klass = asString(raw.class, id, "class");
|
|
681
|
+
if (typeof raw.block !== "boolean") {
|
|
682
|
+
throw new Error(`damage-control rule '${id}': expected boolean for block`);
|
|
683
|
+
}
|
|
684
|
+
if (raw.ask !== void 0 && typeof raw.ask !== "boolean") {
|
|
685
|
+
throw new Error(`damage-control rule '${id}': expected boolean for ask`);
|
|
686
|
+
}
|
|
687
|
+
let pattern;
|
|
688
|
+
try {
|
|
689
|
+
pattern = new RegExp(patternString, "i");
|
|
690
|
+
} catch (err) {
|
|
691
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
692
|
+
throw new Error(`damage-control rule '${id}': invalid pattern: ${msg}`);
|
|
693
|
+
}
|
|
694
|
+
return {
|
|
695
|
+
id,
|
|
696
|
+
description,
|
|
697
|
+
pattern,
|
|
698
|
+
class: klass,
|
|
699
|
+
block: raw.block,
|
|
700
|
+
...raw.ask !== void 0 ? { ask: raw.ask } : {}
|
|
701
|
+
};
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
// src/domains/safety/rule-pack-loader.ts
|
|
705
|
+
function compilePackRules(rawRules, packId) {
|
|
706
|
+
if (rawRules === void 0 || rawRules === null) return [];
|
|
707
|
+
if (!Array.isArray(rawRules)) {
|
|
708
|
+
throw new Error(`damage-control pack '${packId}': expected array at 'rules'`);
|
|
709
|
+
}
|
|
710
|
+
return rawRules.map((rule, index) => compileDamageControlRule(rule, index));
|
|
711
|
+
}
|
|
712
|
+
function emptyRuleset(version) {
|
|
713
|
+
return { version, rules: [] };
|
|
714
|
+
}
|
|
715
|
+
function loadRulePacks(yamlPath) {
|
|
716
|
+
const raw = readFileSync2(yamlPath, "utf8");
|
|
717
|
+
const parsed = (0, import_yaml2.parse)(raw);
|
|
718
|
+
if (!parsed || typeof parsed !== "object") {
|
|
719
|
+
throw new Error(`damage-control rules at ${yamlPath}: expected mapping at document root`);
|
|
720
|
+
}
|
|
721
|
+
const version = typeof parsed.version === "number" ? parsed.version : 0;
|
|
722
|
+
if (version === 1) {
|
|
723
|
+
const baseRules = compilePackRules(parsed.rules, "base");
|
|
724
|
+
return {
|
|
725
|
+
base: { version: 1, rules: baseRules }
|
|
726
|
+
};
|
|
727
|
+
}
|
|
728
|
+
if (version !== 2) {
|
|
729
|
+
throw new Error(`damage-control rules at ${yamlPath}: unsupported version ${String(parsed.version)}`);
|
|
730
|
+
}
|
|
731
|
+
if (!Array.isArray(parsed.packs)) {
|
|
732
|
+
throw new Error(`damage-control rules at ${yamlPath}: expected array at 'packs'`);
|
|
733
|
+
}
|
|
734
|
+
const out = {
|
|
735
|
+
base: emptyRuleset(2)
|
|
736
|
+
};
|
|
737
|
+
for (const rawPack of parsed.packs) {
|
|
738
|
+
const packId = rawPack.id;
|
|
739
|
+
if (packId !== "base") {
|
|
740
|
+
throw new Error(`damage-control rules at ${yamlPath}: unknown pack id ${String(packId)}`);
|
|
741
|
+
}
|
|
742
|
+
const rules = compilePackRules(rawPack.rules, packId);
|
|
743
|
+
out[packId] = { version: 2, rules };
|
|
744
|
+
}
|
|
745
|
+
return out;
|
|
746
|
+
}
|
|
747
|
+
function loadDefaultRulePacks() {
|
|
748
|
+
return loadRulePacks(join(resolvePackageRoot(), "damage-control-rules.yaml"));
|
|
749
|
+
}
|
|
750
|
+
var cachedPacks = null;
|
|
751
|
+
function getCachedDefaultRulePacks() {
|
|
752
|
+
if (cachedPacks === null) cachedPacks = loadDefaultRulePacks();
|
|
753
|
+
return cachedPacks;
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
// src/domains/safety/skill-authority.ts
|
|
757
|
+
init_esm_shims();
|
|
758
|
+
import { homedir as homedir2 } from "node:os";
|
|
759
|
+
import path3 from "node:path";
|
|
760
|
+
function activeClioSkillRoots(cwd) {
|
|
761
|
+
return ["skills", "plugins", "extensions"].flatMap((kind) => [
|
|
762
|
+
path3.join(cwd, ".clio-coder", kind),
|
|
763
|
+
path3.join(clioConfigDir(), kind)
|
|
764
|
+
]);
|
|
765
|
+
}
|
|
766
|
+
function skillMutationReason(roots, targets, cwd, command) {
|
|
767
|
+
const workingDirs = [cwd];
|
|
768
|
+
if (command !== null) {
|
|
769
|
+
for (const destination of extractCommandCdTargets(command)) {
|
|
770
|
+
workingDirs.push(path3.resolve(workingDirs.at(-1) ?? cwd, expandHome(destination)));
|
|
771
|
+
}
|
|
772
|
+
}
|
|
773
|
+
for (const target of targets) {
|
|
774
|
+
if (target.operation === "read") continue;
|
|
775
|
+
for (const directory of workingDirs) {
|
|
776
|
+
const lexical = path3.resolve(directory, expandHome(target.path));
|
|
777
|
+
const resolved = canonicalizeExistingPath(lexical);
|
|
778
|
+
for (const root of roots) {
|
|
779
|
+
for (const boundary of [root, canonicalizeExistingPath(root)]) {
|
|
780
|
+
for (const candidate of [lexical, resolved]) {
|
|
781
|
+
if (isSameOrDescendant(candidate, boundary) || target.operation === "delete" && isSameOrDescendant(boundary, candidate)) {
|
|
782
|
+
return `active resource tree ${root} is operator-owned; draft changes outside installed resource roots and use the operator install or update interface`;
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
}
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
return null;
|
|
790
|
+
}
|
|
791
|
+
function expandHome(value) {
|
|
792
|
+
return value === "~" ? homedir2() : value.startsWith("~/") ? path3.join(homedir2(), value.slice(2)) : value;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
// src/domains/safety/workspace-trust.ts
|
|
796
|
+
init_esm_shims();
|
|
797
|
+
function gateProjectSafetyPolicy(workspaceRoot, policy) {
|
|
798
|
+
if (policy.path === null) return policy;
|
|
799
|
+
const trustVerdict = policy.hash === null ? "untrusted" : projectSurfaceTrust(workspaceRoot, "safety", safetySurfaceTrustHash(policy.path, policy.hash));
|
|
800
|
+
if (trustVerdict === "trusted") return { ...policy, trustVerdict };
|
|
801
|
+
return {
|
|
802
|
+
...policy,
|
|
803
|
+
trustVerdict,
|
|
804
|
+
// This is the admitted empty policy, whose execution defaults are valid.
|
|
805
|
+
// Unapproved parse failures retain diagnostics below but cannot acquire the
|
|
806
|
+
// authority to block execution. An approved malformed policy stays invalid.
|
|
807
|
+
valid: true,
|
|
808
|
+
commands: [],
|
|
809
|
+
pathPolicy: {},
|
|
810
|
+
disableDefaultPathPolicy: false,
|
|
811
|
+
errors: [
|
|
812
|
+
...policy.errors,
|
|
813
|
+
`${policy.path} is ${trustVerdict}; project safety ignored. Review with clio-coder config trust safety.`
|
|
814
|
+
]
|
|
815
|
+
};
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
// src/domains/safety/policy-engine.ts
|
|
819
|
+
var BUILTIN_ALLOWLIST = [
|
|
820
|
+
{ id: "builtin:pwd", re: /^pwd$/ },
|
|
821
|
+
{ id: "builtin:ls", re: /^ls(?:\s+(-[A-Za-z0-9]+|\.[/\w.-]*|[/\w.-]+))*$/ },
|
|
822
|
+
{ id: "builtin:git-status", re: /^git\s+status(?:\s+--short|\s+--branch|\s+-sb)*$/ },
|
|
823
|
+
{ id: "builtin:git-diff", re: /^git\s+diff(?:\s+--cached|\s+--stat|\s+--name-only|\s+--\s+[\w./-]+)*$/ },
|
|
824
|
+
{ id: "builtin:git-log", re: /^git\s+log\s+--oneline(?:\s+-n\s+[1-9]\d{0,2})?(?:\s+--\s+[\w./-]+)?$/ }
|
|
825
|
+
];
|
|
826
|
+
var PROJECT_SCRIPT_COMMANDS = [
|
|
827
|
+
{ id: "builtin:npm-test", re: /^npm\s+(?:test|run\s+test)(?:\s+--\s+[\w=./:-]+(?:\s+[\w=./:-]+)*)?$/ },
|
|
828
|
+
{ id: "builtin:npm-lint", re: /^npm\s+run\s+lint(?:\s+--\s+[\w=./:-]+(?:\s+[\w=./:-]+)*)?$/ },
|
|
829
|
+
{ id: "builtin:npm-build", re: /^npm\s+run\s+build(?:\s+--\s+[\w=./:-]+(?:\s+[\w=./:-]+)*)?$/ },
|
|
830
|
+
{ id: "builtin:npm-typecheck", re: /^npm\s+run\s+typecheck(?:\s+--\s+[\w=./:-]+(?:\s+[\w=./:-]+)*)?$/ },
|
|
831
|
+
{ id: "builtin:npm-ci-script", re: /^npm\s+run\s+ci(?:\s+--\s+[\w=./:-]+(?:\s+[\w=./:-]+)*)?$/ },
|
|
832
|
+
{ id: "builtin:pytest", re: /^pytest(?:\s+[\w=./:-]+)*$/ },
|
|
833
|
+
{ id: "builtin:python-pytest", re: /^python(?:3(?:\.\d+)?)?\s+-m\s+pytest(?:\s+[\w=./:-]+)*$/ },
|
|
834
|
+
{ id: "builtin:cargo-test", re: /^cargo\s+test(?:\s+[\w=./:-]+)*$/ },
|
|
835
|
+
{ id: "builtin:go-test", re: /^go\s+test(?:\s+[\w=./:-]+)*$/ },
|
|
836
|
+
{ id: "builtin:make-test", re: /^make\s+test(?:\s+[\w=./:-]+)*$/ }
|
|
837
|
+
];
|
|
838
|
+
var BASH_RECOGNIZED_FORM_HINT = "Recognized forms run without asking: one command per bash call, or a && chain whose every step is recognized, with cwd passed as the cwd argument instead of a leading cd.";
|
|
839
|
+
var EXECUTION_TOOLS = /* @__PURE__ */ new Set([ToolNames.Bash, ToolNames.Verify]);
|
|
840
|
+
var WRITE_ROOT_REFUSED_TOOLS = /* @__PURE__ */ new Set([
|
|
841
|
+
ToolNames.Bash,
|
|
842
|
+
ToolNames.Verify,
|
|
843
|
+
ToolNames.Dispatch
|
|
844
|
+
]);
|
|
845
|
+
var WRITE_ROOT_TOOLS = /* @__PURE__ */ new Set([ToolNames.Write, ToolNames.Edit, ToolNames.Artifact]);
|
|
846
|
+
function writeRootTargetPath(call) {
|
|
847
|
+
if (!WRITE_ROOT_TOOLS.has(call.tool)) return null;
|
|
848
|
+
const target = pathArg(call.args);
|
|
849
|
+
if (target !== null) return target;
|
|
850
|
+
if (call.tool === ToolNames.Artifact) return artifactDefaultPath(call.args?.kind);
|
|
851
|
+
return null;
|
|
852
|
+
}
|
|
853
|
+
function isWriteConfinementEscape(call, actionClass) {
|
|
854
|
+
if (WRITE_ROOT_REFUSED_TOOLS.has(call.tool)) return true;
|
|
855
|
+
return actionClass === "execute" || actionClass === "dispatch";
|
|
856
|
+
}
|
|
857
|
+
function evaluateWriteRoots(roots, writeRootCwd, call) {
|
|
858
|
+
if (roots.length === 0) return null;
|
|
859
|
+
const target = writeRootTargetPath(call);
|
|
860
|
+
if (target === null) return null;
|
|
861
|
+
const resolved = path4.resolve(writeRootCwd, target);
|
|
862
|
+
if (pathBoundaryCovers(roots, resolved)) return null;
|
|
863
|
+
return `write target '${target}' resolves to '${resolved}', which is outside the permitted write roots for this run: ${roots.join(", ")}`;
|
|
864
|
+
}
|
|
865
|
+
function createSafetyPolicyEngine(options = {}) {
|
|
866
|
+
const cwd = canonicalizeExistingPath(path4.resolve(options.cwd ?? process.cwd()));
|
|
867
|
+
const writeRootCwd = path4.resolve(options.cwd ?? process.cwd());
|
|
868
|
+
const writeRoots = (options.writeRoots ?? []).map((root) => resolvePathBoundary(writeRootCwd, root));
|
|
869
|
+
const skillRoots = activeClioSkillRoots(cwd);
|
|
870
|
+
const packs = options.rulePacks ?? getCachedDefaultRulePacks();
|
|
871
|
+
const projectPolicy = options.projectPolicy ?? gateProjectSafetyPolicy(cwd, loadProjectSafetyPolicy(cwd));
|
|
872
|
+
const projectPolicyRoot = projectPolicy.path === null ? cwd : path4.dirname(path4.dirname(path4.resolve(projectPolicy.path)));
|
|
873
|
+
const pathPolicyInput = projectPolicy.disableDefaultPathPolicy ? projectPolicy.pathPolicy : mergePathPolicyInputs(DEFAULT_DAMAGE_CONTROL_PATH_POLICY, projectPolicy.pathPolicy);
|
|
874
|
+
const expandedDefaults = mergePathPolicyInputs(mergePathPolicyInputs(pathPolicyInput, OPERATOR_PATH_POLICY), {
|
|
875
|
+
zeroAccessPaths: clioCredentialStorePaths(),
|
|
876
|
+
readOnlyPaths: [...clioSkillsRootPaths(), path4.join(clioConfigDir(), "settings.yaml"), workspaceTrustDirectory()]
|
|
877
|
+
});
|
|
878
|
+
const pathPolicy = compilePathPolicy(expandedDefaults, projectPolicyRoot);
|
|
879
|
+
const zeroAccessPolicy = {
|
|
880
|
+
root: pathPolicy.root,
|
|
881
|
+
entries: pathPolicy.entries.filter((entry) => entry.kind === "zeroAccessPaths"),
|
|
882
|
+
diagnostics: []
|
|
883
|
+
};
|
|
884
|
+
const sourcedRules = packs.base.rules.map((rule) => ({ rule, source: "damage-control:base" }));
|
|
885
|
+
return {
|
|
886
|
+
evaluate(call, posture) {
|
|
887
|
+
const rawClassification = classify(call);
|
|
888
|
+
const command = commandArg(call.args);
|
|
889
|
+
const callCwd = cwdArg(call.args, cwd);
|
|
890
|
+
const catalogCheck = resolveVerifyCatalogCheck(call, cwd);
|
|
891
|
+
const catalogCommand = catalogCheck === null ? null : catalogCheck.command.join(" ");
|
|
892
|
+
const scan = catalogCommand ?? damageControlScan(call);
|
|
893
|
+
const hit = scan ? matchSourcedRule(scan, sourcedRules) : null;
|
|
894
|
+
const classification = effectiveClassification(rawClassification, hit?.match);
|
|
895
|
+
const base = baseDecision(call, classification, callCwd, posture, command);
|
|
896
|
+
const writeRootReason = evaluateWriteRoots(writeRoots, writeRootCwd, call);
|
|
897
|
+
if (writeRootReason !== null) {
|
|
898
|
+
return blockDecision(base, {
|
|
899
|
+
ruleId: "write-root",
|
|
900
|
+
reasonCode: "write-root",
|
|
901
|
+
reasons: [writeRootReason],
|
|
902
|
+
policySource: "builtin-classifier"
|
|
903
|
+
});
|
|
904
|
+
}
|
|
905
|
+
if (writeRoots.length > 0 && isWriteConfinementEscape(call, classification.actionClass)) {
|
|
906
|
+
return blockDecision(base, {
|
|
907
|
+
ruleId: "write-root",
|
|
908
|
+
reasonCode: "write-root",
|
|
909
|
+
reasons: [
|
|
910
|
+
`tool '${call.tool}' (${classification.actionClass}) can mutate the filesystem outside the permitted write roots and is blocked under write-root confinement`
|
|
911
|
+
],
|
|
912
|
+
policySource: "builtin-classifier"
|
|
913
|
+
});
|
|
914
|
+
}
|
|
915
|
+
const askRule = hit?.match.ask === true && hit.match.block !== true;
|
|
916
|
+
if (!askRule && (classification.actionClass === "git_destructive" || hit?.match.actionClass === "git_destructive" || hit?.match.block === true)) {
|
|
917
|
+
const blockInput = {
|
|
918
|
+
reasonCode: hit ? `damage-control:${hit.match.ruleId}` : "classification:git_destructive",
|
|
919
|
+
reasons: [...classification.reasons, ...hit ? [hit.match.reason] : []],
|
|
920
|
+
policySource: hit?.source ?? "damage-control:base"
|
|
921
|
+
};
|
|
922
|
+
if (hit?.match.ruleId !== void 0) blockInput.ruleId = hit.match.ruleId;
|
|
923
|
+
if (hit?.match !== void 0) blockInput.match = hit.match;
|
|
924
|
+
return blockDecision(base, blockInput);
|
|
925
|
+
}
|
|
926
|
+
if (!projectPolicy.valid && EXECUTION_TOOLS.has(call.tool)) {
|
|
927
|
+
const blockInput = {
|
|
928
|
+
ruleId: "project-policy-invalid",
|
|
929
|
+
reasonCode: "project-policy-invalid",
|
|
930
|
+
reasons: [`project safety policy is invalid and execution fails closed: ${projectPolicy.errors.join("; ")}`],
|
|
931
|
+
policySource: "project-policy-invalid"
|
|
932
|
+
};
|
|
933
|
+
if (projectPolicy.hash !== null) blockInput.policyHash = projectPolicy.hash;
|
|
934
|
+
if (projectPolicy.path !== null) blockInput.projectPolicyPath = projectPolicy.path;
|
|
935
|
+
return blockDecision(base, blockInput);
|
|
936
|
+
}
|
|
937
|
+
const mutationCommand = call.tool === ToolNames.Bash ? command : catalogCommand;
|
|
938
|
+
if (mutationCommand !== null && invokesTrustMutation(mutationCommand)) {
|
|
939
|
+
return blockDecision(base, {
|
|
940
|
+
reasonCode: "trust-authority",
|
|
941
|
+
ruleId: "trust-authority",
|
|
942
|
+
reasons: ["workspace trust grants require the operator CLI"],
|
|
943
|
+
policySource: "builtin-classifier"
|
|
944
|
+
});
|
|
945
|
+
}
|
|
946
|
+
if (skillMutationReason(
|
|
947
|
+
[path4.join(clioConfigDir(), "settings.yaml"), workspaceTrustDirectory()],
|
|
948
|
+
pathPolicyTargets(catalogCommand === null ? call : { tool: ToolNames.Bash, args: { command: catalogCommand } }),
|
|
949
|
+
callCwd,
|
|
950
|
+
mutationCommand
|
|
951
|
+
) !== null) {
|
|
952
|
+
return blockDecision(base, {
|
|
953
|
+
reasonCode: "path-policy:readOnlyPaths",
|
|
954
|
+
ruleId: "path-policy:readOnlyPaths",
|
|
955
|
+
reasons: ["Clio settings and workspace trust records are operator-owned and cannot be mutated by tools"],
|
|
956
|
+
policySource: "builtin-classifier"
|
|
957
|
+
});
|
|
958
|
+
}
|
|
959
|
+
const skillReason = mutationCommand !== null && invokesClioSkillMutation(mutationCommand) ? "resource installation and lifecycle changes require the operator CLI or an explicit operator install choice; draft outside installed resource roots" : skillMutationReason(
|
|
960
|
+
skillRoots,
|
|
961
|
+
pathPolicyTargets(catalogCommand === null ? call : { tool: ToolNames.Bash, args: { command: catalogCommand } }),
|
|
962
|
+
callCwd,
|
|
963
|
+
mutationCommand
|
|
964
|
+
);
|
|
965
|
+
if (skillReason !== null) {
|
|
966
|
+
return blockDecision(base, {
|
|
967
|
+
ruleId: "skill-authority",
|
|
968
|
+
reasonCode: "skill-authority",
|
|
969
|
+
reasons: [skillReason],
|
|
970
|
+
policySource: "builtin-classifier"
|
|
971
|
+
});
|
|
972
|
+
}
|
|
973
|
+
const pathBlock = evaluateProjectPathPolicy(pathPolicy, call, callCwd);
|
|
974
|
+
if (pathBlock !== null) {
|
|
975
|
+
const blockInput = {
|
|
976
|
+
ruleId: pathBlock.reasonCode,
|
|
977
|
+
reasonCode: pathBlock.reasonCode,
|
|
978
|
+
reasons: [pathBlock.reason],
|
|
979
|
+
policySource: "project-policy"
|
|
980
|
+
};
|
|
981
|
+
if (projectPolicy.hash !== null) blockInput.policyHash = projectPolicy.hash;
|
|
982
|
+
if (projectPolicy.path !== null) blockInput.projectPolicyPath = projectPolicy.path;
|
|
983
|
+
return blockDecision(base, blockInput);
|
|
984
|
+
}
|
|
985
|
+
const scannedCommand = call.tool === ToolNames.Bash ? command : catalogCommand;
|
|
986
|
+
if (scannedCommand !== null) {
|
|
987
|
+
const secretRead = evaluateBashZeroAccessRead(zeroAccessPolicy, scannedCommand, callCwd);
|
|
988
|
+
if (secretRead !== null) {
|
|
989
|
+
const blockInput = {
|
|
990
|
+
ruleId: "secret_path_bash",
|
|
991
|
+
reasonCode: "secret_path_bash",
|
|
992
|
+
reasons: [
|
|
993
|
+
`bash read of zero-access path blocked: '${secretRead.token}' matches ${secretRead.entrySource}. Check presence with exit codes only (grep -sq "^NAME=" <file>); have the user supply values through their own terminal (read -s), never through chat or command output.`
|
|
994
|
+
],
|
|
995
|
+
policySource: "project-policy"
|
|
996
|
+
};
|
|
997
|
+
if (projectPolicy.hash !== null) blockInput.policyHash = projectPolicy.hash;
|
|
998
|
+
if (projectPolicy.path !== null) blockInput.projectPolicyPath = projectPolicy.path;
|
|
999
|
+
return blockDecision(base, blockInput);
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
if (askRule && hit !== null && posture !== "confirmed") {
|
|
1003
|
+
return askDecision(base, {
|
|
1004
|
+
ruleId: hit.match.ruleId,
|
|
1005
|
+
reasonCode: `damage-control:${hit.match.ruleId}`,
|
|
1006
|
+
reasons: [...classification.reasons, hit.match.reason, "damage-control rule requires confirmation"],
|
|
1007
|
+
policySource: hit.source,
|
|
1008
|
+
match: hit.match
|
|
1009
|
+
});
|
|
1010
|
+
}
|
|
1011
|
+
if (askRule && hit !== null && posture === "confirmed") {
|
|
1012
|
+
return allowDecision(base, {
|
|
1013
|
+
ruleId: hit.match.ruleId,
|
|
1014
|
+
reasonCode: `damage-control:${hit.match.ruleId}`,
|
|
1015
|
+
reasons: [...classification.reasons, hit.match.reason, "damage-control rule confirmed by operator"],
|
|
1016
|
+
policySource: hit.source,
|
|
1017
|
+
match: hit.match
|
|
1018
|
+
});
|
|
1019
|
+
}
|
|
1020
|
+
if (classification.actionClass === "system_modify") {
|
|
1021
|
+
const input = {
|
|
1022
|
+
ruleId: "system-modify-confirm",
|
|
1023
|
+
reasonCode: "system-modify-confirm",
|
|
1024
|
+
reasons: [...classification.reasons, "system-level changes require one-shot confirmation at every autonomy level"],
|
|
1025
|
+
policySource: "builtin-classifier"
|
|
1026
|
+
};
|
|
1027
|
+
return posture === "confirmed" ? allowDecision(base, input) : askDecision(base, input);
|
|
1028
|
+
}
|
|
1029
|
+
const packageCommand = call.tool === ToolNames.Verify && catalogCheck === null && typeof call.args?.check === "string" && call.args.check !== "frontend" ? `npm run ${call.args.check}` : null;
|
|
1030
|
+
if ((call.tool === ToolNames.Bash || catalogCheck !== null || packageCommand !== null) && classification.actionClass === "execute") {
|
|
1031
|
+
const bash = evaluateBashPolicy(
|
|
1032
|
+
catalogCheck?.command ?? packageCommand ?? command ?? "",
|
|
1033
|
+
catalogCheck === null ? callCwd : path4.resolve(cwd, catalogCheck.cwd),
|
|
1034
|
+
cwd,
|
|
1035
|
+
posture,
|
|
1036
|
+
projectPolicy
|
|
1037
|
+
);
|
|
1038
|
+
if ((catalogCheck !== null || packageCommand !== null) && bash.kind === "allow" && bash.execRecognition !== "recognized" && posture !== "confirmed") {
|
|
1039
|
+
return askDecision(base, {
|
|
1040
|
+
...bash,
|
|
1041
|
+
reasonCode: "project-verifier-confirm",
|
|
1042
|
+
reasons: [
|
|
1043
|
+
...bash.reasons,
|
|
1044
|
+
`Repository verifier requires confirmation or an approved safety declaration: ${catalogCommand ?? packageCommand}`
|
|
1045
|
+
]
|
|
1046
|
+
});
|
|
1047
|
+
}
|
|
1048
|
+
if (bash.kind === "block") return blockDecision(base, bash);
|
|
1049
|
+
if (bash.kind === "ask") return askDecision(base, bash);
|
|
1050
|
+
return allowDecision(base, bash);
|
|
1051
|
+
}
|
|
1052
|
+
const allowInput = {
|
|
1053
|
+
reasonCode: "allowed",
|
|
1054
|
+
reasons: classification.reasons,
|
|
1055
|
+
policySource: hit?.source ?? "none"
|
|
1056
|
+
};
|
|
1057
|
+
if (hit?.match.ruleId !== void 0) allowInput.ruleId = hit.match.ruleId;
|
|
1058
|
+
if (hit?.match !== void 0) allowInput.match = hit.match;
|
|
1059
|
+
if (classification.actionClass === "execute") allowInput.execRecognition = "recognized";
|
|
1060
|
+
return allowDecision(base, allowInput);
|
|
1061
|
+
},
|
|
1062
|
+
metadata() {
|
|
1063
|
+
return {
|
|
1064
|
+
version: 1,
|
|
1065
|
+
rulePackHash: rulePackHash(packs),
|
|
1066
|
+
rulePackVersion: packs.base.version,
|
|
1067
|
+
activeRuleIds: sourcedRules.map((entry) => entry.rule.id),
|
|
1068
|
+
projectPolicyPath: projectPolicy.path,
|
|
1069
|
+
projectPolicyHash: projectPolicy.hash,
|
|
1070
|
+
projectPolicyValid: projectPolicy.valid,
|
|
1071
|
+
projectPolicyErrors: [...projectPolicy.errors, ...pathPolicy.diagnostics],
|
|
1072
|
+
disableDefaultPathPolicy: projectPolicy.disableDefaultPathPolicy,
|
|
1073
|
+
workspaceTrustVerdict: projectPolicy.trustVerdict ?? "trusted",
|
|
1074
|
+
cwd
|
|
1075
|
+
};
|
|
1076
|
+
}
|
|
1077
|
+
};
|
|
1078
|
+
}
|
|
1079
|
+
function clioCredentialStorePaths() {
|
|
1080
|
+
try {
|
|
1081
|
+
return [path4.join(clioConfigDir(), "credentials.yaml")];
|
|
1082
|
+
} catch {
|
|
1083
|
+
return [];
|
|
1084
|
+
}
|
|
1085
|
+
}
|
|
1086
|
+
function clioSkillsRootPaths() {
|
|
1087
|
+
try {
|
|
1088
|
+
return [path4.join(clioConfigDir(), "skills")];
|
|
1089
|
+
} catch {
|
|
1090
|
+
return [];
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
var SAFE_PRESENCE_RE = /^\s*grep\s+(?:-(?:q|sq|qs)\s+)('[^']*'|"[^"]*"|\S+)\s+\S+\s*$/;
|
|
1094
|
+
function isSafePresenceCheck(command) {
|
|
1095
|
+
const match = SAFE_PRESENCE_RE.exec(command);
|
|
1096
|
+
if (!match || match[1] === void 0) return false;
|
|
1097
|
+
const pattern = stripQuotes(match[1]);
|
|
1098
|
+
return /^\^[A-Za-z_][A-Za-z0-9_]*=/.test(pattern);
|
|
1099
|
+
}
|
|
1100
|
+
function stripQuotes(token) {
|
|
1101
|
+
if (token.length >= 2) {
|
|
1102
|
+
const first = token[0];
|
|
1103
|
+
const last = token[token.length - 1];
|
|
1104
|
+
if (first === '"' && last === '"' || first === "'" && last === "'") return token.slice(1, -1);
|
|
1105
|
+
}
|
|
1106
|
+
return token;
|
|
1107
|
+
}
|
|
1108
|
+
function bashPathTokenCandidates(command) {
|
|
1109
|
+
const candidates = [];
|
|
1110
|
+
for (const scanned of scanShellLike(command)) {
|
|
1111
|
+
if (scanned.operator) continue;
|
|
1112
|
+
const token = scanned.value;
|
|
1113
|
+
if (token.length === 0) continue;
|
|
1114
|
+
if (/\s/.test(token)) continue;
|
|
1115
|
+
if (token.startsWith("-") && !token.includes("/") && !token.includes("=")) continue;
|
|
1116
|
+
candidates.push(token);
|
|
1117
|
+
const eq = token.indexOf("=");
|
|
1118
|
+
if (eq > 0 && eq < token.length - 1) candidates.push(token.slice(eq + 1));
|
|
1119
|
+
}
|
|
1120
|
+
return candidates;
|
|
1121
|
+
}
|
|
1122
|
+
function evaluateBashZeroAccessRead(zeroAccessPolicy, command, callCwd) {
|
|
1123
|
+
if (zeroAccessPolicy.entries.length === 0) return null;
|
|
1124
|
+
if (isSafePresenceCheck(command)) return null;
|
|
1125
|
+
for (const token of bashPathTokenCandidates(command)) {
|
|
1126
|
+
const decision = evaluatePathPolicy(zeroAccessPolicy, "read", token, callCwd);
|
|
1127
|
+
if (decision.kind === "block") {
|
|
1128
|
+
return { token, entrySource: `zeroAccessPaths entry ${decision.matchedPath}` };
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
return null;
|
|
1132
|
+
}
|
|
1133
|
+
function evaluateProjectPathPolicy(policy, call, callCwd) {
|
|
1134
|
+
if (policy.entries.length === 0) return null;
|
|
1135
|
+
for (const target of pathPolicyTargets(call)) {
|
|
1136
|
+
const decision = evaluatePathPolicy(policy, target.operation, target.path, callCwd);
|
|
1137
|
+
if (decision.kind === "block") return decision;
|
|
1138
|
+
}
|
|
1139
|
+
return null;
|
|
1140
|
+
}
|
|
1141
|
+
function pathPolicyTargets(call) {
|
|
1142
|
+
const args = call.args;
|
|
1143
|
+
switch (call.tool) {
|
|
1144
|
+
case ToolNames.Read:
|
|
1145
|
+
case ToolNames.Ls:
|
|
1146
|
+
case ToolNames.Grep:
|
|
1147
|
+
case ToolNames.Find: {
|
|
1148
|
+
const target = pathArg(args) ?? ".";
|
|
1149
|
+
return [{ operation: "read", path: target }];
|
|
1150
|
+
}
|
|
1151
|
+
case ToolNames.Write:
|
|
1152
|
+
case ToolNames.Edit: {
|
|
1153
|
+
const target = pathArg(args);
|
|
1154
|
+
return target === null ? [] : [{ operation: "write", path: target }];
|
|
1155
|
+
}
|
|
1156
|
+
case ToolNames.Artifact:
|
|
1157
|
+
return [{ operation: "write", path: pathArg(args) ?? artifactDefaultPath(args?.kind) }];
|
|
1158
|
+
case ToolNames.CredentialPresent:
|
|
1159
|
+
return [];
|
|
1160
|
+
case ToolNames.Bash: {
|
|
1161
|
+
const command = commandArg(args);
|
|
1162
|
+
if (command === null) return [];
|
|
1163
|
+
return [
|
|
1164
|
+
...extractCommandWriteTargets(command).map((target) => ({ operation: "write", path: target })),
|
|
1165
|
+
...extractCommandDeleteTargets(command).map((target) => ({ operation: "delete", path: target }))
|
|
1166
|
+
];
|
|
1167
|
+
}
|
|
1168
|
+
default:
|
|
1169
|
+
return [];
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
function evaluateBashPolicy(input, callCwd, workspaceRoot, posture, policy) {
|
|
1173
|
+
if (typeof input !== "string" && !input.every((arg) => /^[\w=./:-]+$/u.test(arg))) {
|
|
1174
|
+
return {
|
|
1175
|
+
kind: posture === "confirmed" ? "allow" : "ask",
|
|
1176
|
+
ruleId: "verify-unrecognized-argv",
|
|
1177
|
+
reasonCode: "verify-unrecognized-argv",
|
|
1178
|
+
reasons: ["project verifier argv is outside the bare-word no-prompt command set"],
|
|
1179
|
+
policySource: "builtin-command-allowlist",
|
|
1180
|
+
execRecognition: "unrecognized"
|
|
1181
|
+
};
|
|
1182
|
+
}
|
|
1183
|
+
const command = typeof input === "string" ? input : input.join(" ");
|
|
1184
|
+
if (command.trim().length === 0) {
|
|
1185
|
+
return {
|
|
1186
|
+
kind: "block",
|
|
1187
|
+
ruleId: "bash-empty-command",
|
|
1188
|
+
reasonCode: "bash-empty-command",
|
|
1189
|
+
reasons: ["bash command must not be empty"],
|
|
1190
|
+
policySource: "builtin-command-allowlist"
|
|
1191
|
+
};
|
|
1192
|
+
}
|
|
1193
|
+
if (typeof input === "string" && (/\$(?:[A-Za-z_{0-9@*#?!-])/.test(command) || /(?:^|[\s;&|])(?:python[\d.]*|node|ruby|perl|php|lua)\s+(?:[^\n]*?\s)?-[ce]\b/.test(command)) && posture !== "confirmed") {
|
|
1194
|
+
return {
|
|
1195
|
+
kind: "ask",
|
|
1196
|
+
reasonCode: "bash-hidden-content",
|
|
1197
|
+
ruleId: "bash-hidden-content",
|
|
1198
|
+
reasons: ["shell variables or interpreter source hide paths from the safety scan and require one-shot confirmation"],
|
|
1199
|
+
policySource: "builtin-command-allowlist",
|
|
1200
|
+
execRecognition: "unrecognized"
|
|
1201
|
+
};
|
|
1202
|
+
}
|
|
1203
|
+
const projectMatch = matchingProjectCommand(policy, command, callCwd);
|
|
1204
|
+
if (projectMatch) {
|
|
1205
|
+
const base = {
|
|
1206
|
+
ruleId: projectMatch.id,
|
|
1207
|
+
reasonCode: `project-policy:${projectMatch.id}`,
|
|
1208
|
+
reasons: [`allowed by project safety policy command '${projectMatch.id}'`],
|
|
1209
|
+
policySource: "project-policy",
|
|
1210
|
+
execRecognition: "recognized"
|
|
1211
|
+
};
|
|
1212
|
+
if (policy.hash !== null) base.policyHash = policy.hash;
|
|
1213
|
+
if (policy.path !== null) base.projectPolicyPath = policy.path;
|
|
1214
|
+
if (projectMatch.requireConfirmation && posture !== "confirmed") {
|
|
1215
|
+
return {
|
|
1216
|
+
...base,
|
|
1217
|
+
kind: "ask",
|
|
1218
|
+
reasons: [...base.reasons, "project policy requires confirmation"]
|
|
1219
|
+
};
|
|
1220
|
+
}
|
|
1221
|
+
return { ...base, kind: "allow" };
|
|
1222
|
+
}
|
|
1223
|
+
if (!isUnderOrSame(callCwd, workspaceRoot)) {
|
|
1224
|
+
return {
|
|
1225
|
+
kind: "block",
|
|
1226
|
+
ruleId: "bash-cwd-escape",
|
|
1227
|
+
reasonCode: "bash-cwd-escape",
|
|
1228
|
+
reasons: [
|
|
1229
|
+
`bash cwd '${callCwd}' escapes workspace root '${workspaceRoot}'; use a typed tool or a project policy entry with explicit cwd`
|
|
1230
|
+
],
|
|
1231
|
+
policySource: "builtin-command-allowlist"
|
|
1232
|
+
};
|
|
1233
|
+
}
|
|
1234
|
+
const recognitionCommand = inlineShellScript(command) ?? command;
|
|
1235
|
+
if (hasCommandSubstitution(recognitionCommand) && posture !== "confirmed") {
|
|
1236
|
+
return {
|
|
1237
|
+
kind: "ask",
|
|
1238
|
+
ruleId: "bash-command-substitution",
|
|
1239
|
+
reasonCode: "bash-command-substitution",
|
|
1240
|
+
reasons: ["command substitution hides the executed content from the safety net and requires one-shot confirmation"],
|
|
1241
|
+
policySource: "builtin-command-allowlist",
|
|
1242
|
+
execRecognition: "unrecognized"
|
|
1243
|
+
};
|
|
1244
|
+
}
|
|
1245
|
+
if (PROJECT_SCRIPT_COMMANDS.some((entry) => entry.re.test(recognitionCommand))) {
|
|
1246
|
+
return {
|
|
1247
|
+
kind: posture === "confirmed" ? "allow" : "ask",
|
|
1248
|
+
reasonCode: "project-script-confirm",
|
|
1249
|
+
ruleId: "project-script-confirm",
|
|
1250
|
+
reasons: [
|
|
1251
|
+
"Repository-authored code requires one-shot confirmation or an operator-approved safety command declaration.",
|
|
1252
|
+
projectScriptPreview(recognitionCommand, callCwd)
|
|
1253
|
+
],
|
|
1254
|
+
policySource: "builtin-command-allowlist",
|
|
1255
|
+
execRecognition: "unrecognized"
|
|
1256
|
+
};
|
|
1257
|
+
}
|
|
1258
|
+
const chain = recognizeCommandChain(recognitionCommand, callCwd, workspaceRoot, policy);
|
|
1259
|
+
if (chain !== null) {
|
|
1260
|
+
const chainReasons = [`every step of the && chain is recognized: ${chain.ruleIds.join(", ")}`];
|
|
1261
|
+
if (chain.requiresConfirmation) {
|
|
1262
|
+
for (const segment of recognitionCommand.split("&&").map((part) => part.trim())) {
|
|
1263
|
+
if (PROJECT_SCRIPT_COMMANDS.some((entry) => entry.re.test(segment)))
|
|
1264
|
+
chainReasons.push(projectScriptPreview(segment, callCwd));
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
if (chain.requiresConfirmation && posture !== "confirmed") {
|
|
1268
|
+
return {
|
|
1269
|
+
kind: "ask",
|
|
1270
|
+
ruleId: "bash-recognized-chain",
|
|
1271
|
+
reasonCode: "bash-recognized-chain",
|
|
1272
|
+
reasons: [...chainReasons, "repository code or project policy requires confirmation for one step"],
|
|
1273
|
+
policySource: "builtin-command-allowlist",
|
|
1274
|
+
execRecognition: "recognized"
|
|
1275
|
+
};
|
|
1276
|
+
}
|
|
1277
|
+
return {
|
|
1278
|
+
kind: "allow",
|
|
1279
|
+
ruleId: "bash-recognized-chain",
|
|
1280
|
+
reasonCode: "bash-recognized-chain",
|
|
1281
|
+
reasons: chainReasons,
|
|
1282
|
+
policySource: "builtin-command-allowlist",
|
|
1283
|
+
execRecognition: "recognized"
|
|
1284
|
+
};
|
|
1285
|
+
}
|
|
1286
|
+
if (hasSequencingOperators(command)) {
|
|
1287
|
+
const scriptSegments = recognitionCommand.split(/&&|\|\||[;|\n]/).map((part) => part.trim()).filter((part) => PROJECT_SCRIPT_COMMANDS.some((entry) => entry.re.test(part)));
|
|
1288
|
+
if (scriptSegments.length > 0 && posture !== "confirmed") {
|
|
1289
|
+
return {
|
|
1290
|
+
kind: "ask",
|
|
1291
|
+
ruleId: "project-script-confirm",
|
|
1292
|
+
reasonCode: "project-script-confirm",
|
|
1293
|
+
reasons: [
|
|
1294
|
+
"Repository scripts in compound commands require one-shot confirmation",
|
|
1295
|
+
...scriptSegments.map((part) => projectScriptPreview(part, callCwd))
|
|
1296
|
+
],
|
|
1297
|
+
policySource: "builtin-command-allowlist",
|
|
1298
|
+
execRecognition: "unrecognized"
|
|
1299
|
+
};
|
|
1300
|
+
}
|
|
1301
|
+
return {
|
|
1302
|
+
kind: "allow",
|
|
1303
|
+
ruleId: "bash-shell-operators",
|
|
1304
|
+
reasonCode: "bash-shell-operators",
|
|
1305
|
+
reasons: [
|
|
1306
|
+
"shell operators defeat per-command recognition; the autonomy level decides admission",
|
|
1307
|
+
BASH_RECOGNIZED_FORM_HINT
|
|
1308
|
+
],
|
|
1309
|
+
policySource: "builtin-command-allowlist",
|
|
1310
|
+
execRecognition: "unrecognized"
|
|
1311
|
+
};
|
|
1312
|
+
}
|
|
1313
|
+
for (const entry of BUILTIN_ALLOWLIST) {
|
|
1314
|
+
if (entry.re.test(recognitionCommand)) {
|
|
1315
|
+
return {
|
|
1316
|
+
kind: "allow",
|
|
1317
|
+
ruleId: entry.id,
|
|
1318
|
+
reasonCode: entry.id,
|
|
1319
|
+
reasons: [`matched built-in no-prompt command allowlist '${entry.id}'`],
|
|
1320
|
+
policySource: "builtin-command-allowlist",
|
|
1321
|
+
execRecognition: "recognized"
|
|
1322
|
+
};
|
|
1323
|
+
}
|
|
1324
|
+
}
|
|
1325
|
+
return {
|
|
1326
|
+
kind: "allow",
|
|
1327
|
+
ruleId: "bash-unrecognized",
|
|
1328
|
+
reasonCode: "bash-unrecognized",
|
|
1329
|
+
reasons: [
|
|
1330
|
+
"bash command is outside the no-prompt set; the autonomy level decides admission",
|
|
1331
|
+
BASH_RECOGNIZED_FORM_HINT
|
|
1332
|
+
],
|
|
1333
|
+
policySource: "builtin-command-allowlist",
|
|
1334
|
+
execRecognition: "unrecognized"
|
|
1335
|
+
};
|
|
1336
|
+
}
|
|
1337
|
+
function baseDecision(call, classification, cwd, posture, command) {
|
|
1338
|
+
const out = {
|
|
1339
|
+
classification,
|
|
1340
|
+
tool: call.tool,
|
|
1341
|
+
actionClass: classification.actionClass,
|
|
1342
|
+
cwd
|
|
1343
|
+
};
|
|
1344
|
+
if (posture !== void 0) out.posture = posture;
|
|
1345
|
+
if (command !== null) out.command = command;
|
|
1346
|
+
return out;
|
|
1347
|
+
}
|
|
1348
|
+
function allowDecision(base, input) {
|
|
1349
|
+
return { ...base, ...input, kind: "allow" };
|
|
1350
|
+
}
|
|
1351
|
+
function askDecision(base, input) {
|
|
1352
|
+
const rejectionInput = {
|
|
1353
|
+
tool: base.tool,
|
|
1354
|
+
actionClass: base.classification.actionClass,
|
|
1355
|
+
reasons: input.reasons
|
|
1356
|
+
};
|
|
1357
|
+
if (base.posture !== void 0) rejectionInput.posture = base.posture;
|
|
1358
|
+
if (input.ruleId !== void 0) rejectionInput.ruleId = input.ruleId;
|
|
1359
|
+
const rejection = formatRejection(rejectionInput);
|
|
1360
|
+
return { ...base, ...input, kind: "ask", rejection };
|
|
1361
|
+
}
|
|
1362
|
+
function blockDecision(base, input) {
|
|
1363
|
+
const rejectionInput = {
|
|
1364
|
+
tool: base.tool,
|
|
1365
|
+
actionClass: base.classification.actionClass,
|
|
1366
|
+
reasons: input.reasons
|
|
1367
|
+
};
|
|
1368
|
+
if (base.posture !== void 0) rejectionInput.posture = base.posture;
|
|
1369
|
+
if (input.ruleId !== void 0) rejectionInput.ruleId = input.ruleId;
|
|
1370
|
+
const rejection = formatRejection(rejectionInput);
|
|
1371
|
+
return { ...base, ...input, kind: "block", rejection };
|
|
1372
|
+
}
|
|
1373
|
+
function matchSourcedRule(commandString, rules) {
|
|
1374
|
+
for (const entry of rules) {
|
|
1375
|
+
if (entry.rule.pattern.test(commandString)) {
|
|
1376
|
+
const match = {
|
|
1377
|
+
ruleId: entry.rule.id,
|
|
1378
|
+
reason: `matched ${entry.rule.id}: ${entry.rule.description}`,
|
|
1379
|
+
actionClass: entry.rule.class,
|
|
1380
|
+
block: entry.rule.block
|
|
1381
|
+
};
|
|
1382
|
+
if (entry.rule.ask !== void 0) match.ask = entry.rule.ask;
|
|
1383
|
+
return { match, source: entry.source };
|
|
1384
|
+
}
|
|
1385
|
+
}
|
|
1386
|
+
return null;
|
|
1387
|
+
}
|
|
1388
|
+
var ACTION_CLASSES2 = /* @__PURE__ */ new Set([
|
|
1389
|
+
"read",
|
|
1390
|
+
"write",
|
|
1391
|
+
"execute",
|
|
1392
|
+
"system_modify",
|
|
1393
|
+
"git_destructive",
|
|
1394
|
+
"dispatch"
|
|
1395
|
+
]);
|
|
1396
|
+
function effectiveClassification(classification, match) {
|
|
1397
|
+
if (!match || !ACTION_CLASSES2.has(match.actionClass)) return classification;
|
|
1398
|
+
const actionClass = match.actionClass;
|
|
1399
|
+
if (actionClass === classification.actionClass) return classification;
|
|
1400
|
+
return {
|
|
1401
|
+
actionClass,
|
|
1402
|
+
reasons: [...classification.reasons, `damage-control:${match.ruleId}`]
|
|
1403
|
+
};
|
|
1404
|
+
}
|
|
1405
|
+
function matchingProjectCommand(policy, command, cwd) {
|
|
1406
|
+
if (!policy.valid || policy.path === null) return null;
|
|
1407
|
+
const policyRoot = path4.dirname(path4.dirname(policy.path));
|
|
1408
|
+
for (const entry of policy.commands) {
|
|
1409
|
+
if (entry.command !== command) continue;
|
|
1410
|
+
if (entry.shellOperators === "deny" && hasShellOperators(command)) continue;
|
|
1411
|
+
const allowedCwd = entry.cwd !== void 0 ? path4.resolve(policyRoot, entry.cwd) : policyRoot;
|
|
1412
|
+
if (!isUnderOrSame(cwd, allowedCwd)) continue;
|
|
1413
|
+
return entry;
|
|
1414
|
+
}
|
|
1415
|
+
return null;
|
|
1416
|
+
}
|
|
1417
|
+
var CHAIN_MAX_SEGMENTS = 6;
|
|
1418
|
+
function recognizeCommandChain(command, callCwd, workspaceRoot, policy) {
|
|
1419
|
+
const segments = [];
|
|
1420
|
+
let current = [];
|
|
1421
|
+
for (const token of scanShellLike(command)) {
|
|
1422
|
+
if (token.operator && token.value === "&&") {
|
|
1423
|
+
segments.push(current);
|
|
1424
|
+
current = [];
|
|
1425
|
+
continue;
|
|
1426
|
+
}
|
|
1427
|
+
if (token.operator) return null;
|
|
1428
|
+
current.push(token.value);
|
|
1429
|
+
}
|
|
1430
|
+
segments.push(current);
|
|
1431
|
+
if (segments.length < 2 || segments.length > CHAIN_MAX_SEGMENTS) return null;
|
|
1432
|
+
const ruleIds = [];
|
|
1433
|
+
let requiresConfirmation = false;
|
|
1434
|
+
for (const segment of segments) {
|
|
1435
|
+
if (segment.length === 0) return null;
|
|
1436
|
+
if (segment[0] === "cd") {
|
|
1437
|
+
if (segment.length !== 2) return null;
|
|
1438
|
+
const target = segment[1] ?? "";
|
|
1439
|
+
if (target.startsWith("~") || !isUnderOrSame(path4.resolve(callCwd, target), workspaceRoot)) return null;
|
|
1440
|
+
ruleIds.push("builtin:cd-workspace");
|
|
1441
|
+
continue;
|
|
1442
|
+
}
|
|
1443
|
+
const rendered = segment.join(" ");
|
|
1444
|
+
const projectMatch = matchingProjectCommand(policy, rendered, callCwd);
|
|
1445
|
+
if (projectMatch) {
|
|
1446
|
+
ruleIds.push(projectMatch.id);
|
|
1447
|
+
if (projectMatch.requireConfirmation) requiresConfirmation = true;
|
|
1448
|
+
continue;
|
|
1449
|
+
}
|
|
1450
|
+
if (PROJECT_SCRIPT_COMMANDS.some((entry) => entry.re.test(rendered))) {
|
|
1451
|
+
ruleIds.push("project-script-confirm");
|
|
1452
|
+
requiresConfirmation = true;
|
|
1453
|
+
continue;
|
|
1454
|
+
}
|
|
1455
|
+
const builtin = BUILTIN_ALLOWLIST.find((entry) => entry.re.test(rendered));
|
|
1456
|
+
if (builtin === void 0) return null;
|
|
1457
|
+
ruleIds.push(builtin.id);
|
|
1458
|
+
}
|
|
1459
|
+
return { ruleIds, requiresConfirmation };
|
|
1460
|
+
}
|
|
1461
|
+
function hasSequencingOperators(command) {
|
|
1462
|
+
return /(\|\||&&|;|\||>>?|<|\n|\r)/.test(command);
|
|
1463
|
+
}
|
|
1464
|
+
function hasCommandSubstitution(command) {
|
|
1465
|
+
return /(`|\$\()/.test(command);
|
|
1466
|
+
}
|
|
1467
|
+
function hasShellOperators(command) {
|
|
1468
|
+
return hasSequencingOperators(command) || hasCommandSubstitution(command);
|
|
1469
|
+
}
|
|
1470
|
+
function isUnderOrSame(child, parent) {
|
|
1471
|
+
const rel = path4.relative(
|
|
1472
|
+
canonicalizeExistingPath(path4.resolve(parent)),
|
|
1473
|
+
canonicalizeExistingPath(path4.resolve(child))
|
|
1474
|
+
);
|
|
1475
|
+
return rel === "" || !rel.startsWith("..") && !path4.isAbsolute(rel);
|
|
1476
|
+
}
|
|
1477
|
+
function commandArg(args) {
|
|
1478
|
+
return typeof args?.command === "string" ? args.command : null;
|
|
1479
|
+
}
|
|
1480
|
+
function pathArg(args) {
|
|
1481
|
+
if (!args) return null;
|
|
1482
|
+
const candidate = args.path ?? args.file_path ?? args.filePath;
|
|
1483
|
+
return typeof candidate === "string" && candidate.length > 0 ? candidate : null;
|
|
1484
|
+
}
|
|
1485
|
+
function cwdArg(args, fallback) {
|
|
1486
|
+
const resolved = typeof args?.cwd === "string" && args.cwd.length > 0 ? path4.resolve(fallback, args.cwd) : fallback;
|
|
1487
|
+
return canonicalizeExistingPath(resolved);
|
|
1488
|
+
}
|
|
1489
|
+
var CONTENT_BEARING_TOOLS = /* @__PURE__ */ new Set([
|
|
1490
|
+
ToolNames.Write,
|
|
1491
|
+
ToolNames.Edit,
|
|
1492
|
+
ToolNames.Artifact,
|
|
1493
|
+
ToolNames.Dispatch,
|
|
1494
|
+
ToolNames.Tasks
|
|
1495
|
+
]);
|
|
1496
|
+
function damageControlScan(call) {
|
|
1497
|
+
if (!CONTENT_BEARING_TOOLS.has(call.tool)) return serializeArgs(call.args);
|
|
1498
|
+
const pathArg2 = call.args?.path;
|
|
1499
|
+
return typeof pathArg2 === "string" ? pathArg2 : "";
|
|
1500
|
+
}
|
|
1501
|
+
function resolveVerifyCatalogCheck(call, workspaceRoot) {
|
|
1502
|
+
if (call.tool !== ToolNames.Verify) return null;
|
|
1503
|
+
const check = call.args?.check;
|
|
1504
|
+
if (typeof check !== "string") return null;
|
|
1505
|
+
const id = check.trim();
|
|
1506
|
+
if (id.length === 0 || id === "frontend") return null;
|
|
1507
|
+
try {
|
|
1508
|
+
const catalog = loadProjectVerifierCatalog(workspaceRoot);
|
|
1509
|
+
if (!catalog.ok || catalog.source === null) return null;
|
|
1510
|
+
return catalog.source.checks.find((candidate) => candidate.id === id) ?? null;
|
|
1511
|
+
} catch {
|
|
1512
|
+
return null;
|
|
1513
|
+
}
|
|
1514
|
+
}
|
|
1515
|
+
function serializeArgs(args) {
|
|
1516
|
+
if (!args) return "";
|
|
1517
|
+
const parts = [];
|
|
1518
|
+
for (const v of Object.values(args)) {
|
|
1519
|
+
if (v == null) continue;
|
|
1520
|
+
if (typeof v === "string" || typeof v === "number" || typeof v === "boolean") parts.push(String(v));
|
|
1521
|
+
else {
|
|
1522
|
+
try {
|
|
1523
|
+
parts.push(JSON.stringify(v));
|
|
1524
|
+
} catch {
|
|
1525
|
+
}
|
|
1526
|
+
}
|
|
1527
|
+
}
|
|
1528
|
+
return parts.join(" ");
|
|
1529
|
+
}
|
|
1530
|
+
function rulePackHash(packs) {
|
|
1531
|
+
const payload = {
|
|
1532
|
+
base: packPayload(packs.base.rules)
|
|
1533
|
+
};
|
|
1534
|
+
return createHash2("sha256").update(JSON.stringify(payload), "utf8").digest("hex");
|
|
1535
|
+
}
|
|
1536
|
+
function packPayload(rules) {
|
|
1537
|
+
return rules.map((rule) => ({
|
|
1538
|
+
id: rule.id,
|
|
1539
|
+
description: rule.description,
|
|
1540
|
+
pattern: rule.pattern.source,
|
|
1541
|
+
class: rule.class,
|
|
1542
|
+
block: rule.block,
|
|
1543
|
+
...rule.ask !== void 0 ? { ask: rule.ask } : {}
|
|
1544
|
+
}));
|
|
1545
|
+
}
|
|
1546
|
+
function invokesTrustMutation(command) {
|
|
1547
|
+
const words = scanShellLike(command).filter((token) => !token.operator).map((token) => token.value);
|
|
1548
|
+
return words.some((word, index) => word === "config" && words[index + 1] === "trust") || /\bconfig\s+trust\b/.test(inlineShellScript(command) ?? "");
|
|
1549
|
+
}
|
|
1550
|
+
function projectScriptPreview(command, cwd) {
|
|
1551
|
+
const match = /^npm\s+(?:run\s+)?([\w:-]+)/.exec(command);
|
|
1552
|
+
if (match) {
|
|
1553
|
+
try {
|
|
1554
|
+
const manifest = JSON.parse(readFileSync3(path4.join(cwd, "package.json"), "utf8"));
|
|
1555
|
+
const name = match[1] ?? "test";
|
|
1556
|
+
const scripts = [`pre${name}`, name, `post${name}`].flatMap(
|
|
1557
|
+
(key) => typeof manifest.scripts?.[key] === "string" ? [`${key}: ${manifest.scripts[key]}`] : []
|
|
1558
|
+
);
|
|
1559
|
+
return `package.json scripts (repository data): ${scripts.join("; ") || "no script resolved"}`;
|
|
1560
|
+
} catch {
|
|
1561
|
+
return "package.json script body could not be resolved; repository code will execute.";
|
|
1562
|
+
}
|
|
1563
|
+
}
|
|
1564
|
+
return `Repository command: ${command}. Its test/build files and dependencies execute with the child process permissions.`;
|
|
1565
|
+
}
|
|
1566
|
+
|
|
1567
|
+
export {
|
|
1568
|
+
formatModelRejection,
|
|
1569
|
+
WRITE_ROOT_REFUSED_TOOLS,
|
|
1570
|
+
createSafetyPolicyEngine
|
|
1571
|
+
};
|
|
1572
|
+
//# sourceMappingURL=chunk-RAUOKUZV.js.map
|