@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,1801 @@
|
|
|
1
|
+
import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
normalizedSkillHash
|
|
4
|
+
} from "./chunk-DNCE23JJ.js";
|
|
5
|
+
import {
|
|
6
|
+
readRootEntries,
|
|
7
|
+
splitYamlFrontmatter,
|
|
8
|
+
stringField
|
|
9
|
+
} from "./chunk-YJCCMYYT.js";
|
|
10
|
+
import {
|
|
11
|
+
LIBRARY_PROVIDES_LIMITS,
|
|
12
|
+
enabledPluginResourceRoots,
|
|
13
|
+
installPlugin,
|
|
14
|
+
isLibraryKind,
|
|
15
|
+
isLibraryResourceKind,
|
|
16
|
+
isPluginId,
|
|
17
|
+
listInstalledPlugins,
|
|
18
|
+
pluginBaseDir,
|
|
19
|
+
pluginResourcePath,
|
|
20
|
+
readPluginInstallRecord,
|
|
21
|
+
readPluginManifest,
|
|
22
|
+
removePlugin,
|
|
23
|
+
resolvePackageReferences
|
|
24
|
+
} from "./chunk-6UJ7RDI7.js";
|
|
25
|
+
import {
|
|
26
|
+
isAgentAudience,
|
|
27
|
+
isAgentCapabilityClass,
|
|
28
|
+
isAgentCategory,
|
|
29
|
+
isAgentLatencyClass,
|
|
30
|
+
isAgentProduct,
|
|
31
|
+
isAgentProjectContextTier,
|
|
32
|
+
parseResultContract
|
|
33
|
+
} from "./chunk-ARRUMZ7X.js";
|
|
34
|
+
import {
|
|
35
|
+
extensionContentDigest,
|
|
36
|
+
isSemanticVersion
|
|
37
|
+
} from "./chunk-XW2UZICE.js";
|
|
38
|
+
import {
|
|
39
|
+
readSettings,
|
|
40
|
+
updateSettings
|
|
41
|
+
} from "./chunk-PGEFOTJB.js";
|
|
42
|
+
import {
|
|
43
|
+
warnLegacyNaming
|
|
44
|
+
} from "./chunk-DVNAPPXU.js";
|
|
45
|
+
import {
|
|
46
|
+
INTEROP_AGENT_KINDS,
|
|
47
|
+
interopSourceRank
|
|
48
|
+
} from "./chunk-5EQO5NWP.js";
|
|
49
|
+
import {
|
|
50
|
+
ToolNames
|
|
51
|
+
} from "./chunk-WLHX3MM5.js";
|
|
52
|
+
import {
|
|
53
|
+
require_dist
|
|
54
|
+
} from "./chunk-B5GGDIHT.js";
|
|
55
|
+
import {
|
|
56
|
+
buildSafeToolEnv,
|
|
57
|
+
runCommandVector
|
|
58
|
+
} from "./chunk-GJ24ODAX.js";
|
|
59
|
+
import {
|
|
60
|
+
withStateFileLockSync
|
|
61
|
+
} from "./chunk-DVJL77SO.js";
|
|
62
|
+
import {
|
|
63
|
+
clioConfigDir
|
|
64
|
+
} from "./chunk-CTTI7G3T.js";
|
|
65
|
+
import {
|
|
66
|
+
safeResourceWrite
|
|
67
|
+
} from "./chunk-ZZFWWYLX.js";
|
|
68
|
+
import {
|
|
69
|
+
resolvePackageRoot
|
|
70
|
+
} from "./chunk-E3LEPLQ2.js";
|
|
71
|
+
import {
|
|
72
|
+
__toESM,
|
|
73
|
+
init_esm_shims
|
|
74
|
+
} from "./chunk-ECBHH7LU.js";
|
|
75
|
+
|
|
76
|
+
// src/domains/agents/recipe.ts
|
|
77
|
+
init_esm_shims();
|
|
78
|
+
import path from "node:path";
|
|
79
|
+
var AGENT_BUDGET_KEYS = ["toolCalls", "readReserve", "synthesis", "maximum"];
|
|
80
|
+
function parseAgentBudgetPhase(value, prefix, relationTarget) {
|
|
81
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
82
|
+
throw new Error(`${prefix} must be a non-null YAML object`);
|
|
83
|
+
}
|
|
84
|
+
const record = value;
|
|
85
|
+
for (const key of Object.keys(record)) {
|
|
86
|
+
if (key !== "toolCalls" && key !== "readReserve") throw new Error(`${prefix}.${key} is unknown`);
|
|
87
|
+
}
|
|
88
|
+
for (const key of ["toolCalls", "readReserve"]) {
|
|
89
|
+
if (!Object.hasOwn(record, key)) throw new Error(`${prefix}.${key} is required`);
|
|
90
|
+
}
|
|
91
|
+
const toolCalls = record.toolCalls;
|
|
92
|
+
if (typeof toolCalls !== "number" || !Number.isSafeInteger(toolCalls)) {
|
|
93
|
+
throw new Error(`${prefix}.toolCalls must be a finite safe integer`);
|
|
94
|
+
}
|
|
95
|
+
if (toolCalls <= 0) throw new Error(`${prefix}.toolCalls must be greater than 0`);
|
|
96
|
+
const readReserve = record.readReserve;
|
|
97
|
+
if (typeof readReserve !== "number" || !Number.isSafeInteger(readReserve)) {
|
|
98
|
+
throw new Error(`${prefix}.readReserve must be a finite safe integer`);
|
|
99
|
+
}
|
|
100
|
+
if (readReserve < 0) throw new Error(`${prefix}.readReserve must be greater than or equal to 0`);
|
|
101
|
+
if (readReserve >= toolCalls) throw new Error(`${prefix}.readReserve must be less than ${relationTarget}`);
|
|
102
|
+
return { toolCalls, readReserve };
|
|
103
|
+
}
|
|
104
|
+
function parseAgentBudget(value, sourcePath) {
|
|
105
|
+
if (value === void 0) return void 0;
|
|
106
|
+
const prefix = `agent budget: ${sourcePath}: budget`;
|
|
107
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
108
|
+
throw new Error(`${prefix} must be a non-null YAML object`);
|
|
109
|
+
}
|
|
110
|
+
const record = value;
|
|
111
|
+
for (const key of Object.keys(record)) {
|
|
112
|
+
if (!AGENT_BUDGET_KEYS.includes(key)) {
|
|
113
|
+
throw new Error(`${prefix}.${key} is unknown`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
for (const key of ["toolCalls", "readReserve", "synthesis"]) {
|
|
117
|
+
if (!Object.hasOwn(record, key)) throw new Error(`${prefix}.${key} is required`);
|
|
118
|
+
}
|
|
119
|
+
const phase = parseAgentBudgetPhase(
|
|
120
|
+
{ toolCalls: record.toolCalls, readReserve: record.readReserve },
|
|
121
|
+
prefix,
|
|
122
|
+
"budget.toolCalls"
|
|
123
|
+
);
|
|
124
|
+
const synthesis = record.synthesis;
|
|
125
|
+
if (typeof synthesis !== "boolean") throw new Error(`${prefix}.synthesis must be a boolean`);
|
|
126
|
+
const maximum = record.maximum === void 0 ? void 0 : parseAgentBudgetPhase(record.maximum, `${prefix}.maximum`, "budget.maximum.toolCalls");
|
|
127
|
+
if (maximum !== void 0) {
|
|
128
|
+
if (maximum.toolCalls < phase.toolCalls) {
|
|
129
|
+
throw new Error(`${prefix}.maximum.toolCalls must be greater than or equal to budget.toolCalls`);
|
|
130
|
+
}
|
|
131
|
+
if (maximum.readReserve < phase.readReserve) {
|
|
132
|
+
throw new Error(`${prefix}.maximum.readReserve must be greater than or equal to budget.readReserve`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return { ...phase, synthesis, ...maximum === void 0 ? {} : { maximum } };
|
|
136
|
+
}
|
|
137
|
+
function recipeIdFromPath(absPath, rootDir) {
|
|
138
|
+
const resolvedRoot = path.resolve(rootDir);
|
|
139
|
+
const resolvedPath = path.resolve(absPath);
|
|
140
|
+
const relPath = path.relative(resolvedRoot, resolvedPath);
|
|
141
|
+
if (relPath === "" || relPath.startsWith("..") || path.isAbsolute(relPath)) {
|
|
142
|
+
throw new Error(`recipe: path must live under rootDir (${resolvedPath} not under ${resolvedRoot})`);
|
|
143
|
+
}
|
|
144
|
+
if (path.dirname(relPath) !== ".") {
|
|
145
|
+
throw new Error(`recipe: recipes must live directly under rootDir (${resolvedPath})`);
|
|
146
|
+
}
|
|
147
|
+
if (path.extname(relPath) !== ".md") {
|
|
148
|
+
throw new Error(`recipe: recipe files must end in .md (${resolvedPath})`);
|
|
149
|
+
}
|
|
150
|
+
const id = path.basename(relPath, ".md");
|
|
151
|
+
if (id === "") {
|
|
152
|
+
throw new Error(`recipe: recipe filename must not be empty (${resolvedPath})`);
|
|
153
|
+
}
|
|
154
|
+
return id;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// src/domains/agents/recipe-schema.ts
|
|
158
|
+
init_esm_shims();
|
|
159
|
+
var RECIPE_KEYS = [
|
|
160
|
+
"version",
|
|
161
|
+
"name",
|
|
162
|
+
"description",
|
|
163
|
+
"tools",
|
|
164
|
+
"skills",
|
|
165
|
+
"audience",
|
|
166
|
+
"category",
|
|
167
|
+
"capabilityClass",
|
|
168
|
+
"latencyClass",
|
|
169
|
+
"projectContextTier",
|
|
170
|
+
"budget",
|
|
171
|
+
"resultContract",
|
|
172
|
+
"tags"
|
|
173
|
+
];
|
|
174
|
+
var OPTIONAL_RECIPE_KEYS = ["product"];
|
|
175
|
+
var ALL_RECIPE_KEYS = [...RECIPE_KEYS, ...OPTIONAL_RECIPE_KEYS];
|
|
176
|
+
function requiredString(value, path6) {
|
|
177
|
+
if (typeof value !== "string" || value.trim().length === 0)
|
|
178
|
+
throw new Error(`agent recipe: ${path6} must be a non-empty string`);
|
|
179
|
+
return value;
|
|
180
|
+
}
|
|
181
|
+
function requiredStringArray(value, path6) {
|
|
182
|
+
if (!Array.isArray(value)) throw new Error(`agent recipe: ${path6} must be an array of strings`);
|
|
183
|
+
const entries = value.map((entry, index) => requiredString(entry, `${path6}[${index}]`));
|
|
184
|
+
if (new Set(entries).size !== entries.length) throw new Error(`agent recipe: ${path6} must not contain duplicates`);
|
|
185
|
+
return entries;
|
|
186
|
+
}
|
|
187
|
+
function enumValue(value, path6, predicate) {
|
|
188
|
+
if (!predicate(value)) throw new Error(`agent recipe: ${path6} has an unsupported value`);
|
|
189
|
+
return value;
|
|
190
|
+
}
|
|
191
|
+
function parseAudience(value, source, filepath) {
|
|
192
|
+
const audience = enumValue(value, `${filepath}: audience`, isAgentAudience);
|
|
193
|
+
if (source === "builtin") {
|
|
194
|
+
if (audience === "custom") {
|
|
195
|
+
throw new Error(`agent recipe: ${filepath}: a builtin recipe must not declare audience 'custom'`);
|
|
196
|
+
}
|
|
197
|
+
return audience;
|
|
198
|
+
}
|
|
199
|
+
if (audience !== "custom") {
|
|
200
|
+
throw new Error(
|
|
201
|
+
`agent recipe: ${filepath}: a ${source} recipe must declare audience 'custom', not '${audience}'; audience follows where the recipe was discovered and cannot be claimed in frontmatter`
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
return audience;
|
|
205
|
+
}
|
|
206
|
+
function parseTools(value, filepath) {
|
|
207
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
208
|
+
throw new Error(`agent recipe: ${filepath}: tools must be a { required, optional } object`);
|
|
209
|
+
}
|
|
210
|
+
const record = value;
|
|
211
|
+
if (Object.keys(record).some((key) => key !== "required" && key !== "optional")) {
|
|
212
|
+
throw new Error(`agent recipe: ${filepath}: tools has an unknown key`);
|
|
213
|
+
}
|
|
214
|
+
if (!("required" in record) || !("optional" in record)) {
|
|
215
|
+
throw new Error(`agent recipe: ${filepath}: tools.required and tools.optional are required`);
|
|
216
|
+
}
|
|
217
|
+
if (!Array.isArray(record.required) || !Array.isArray(record.optional)) {
|
|
218
|
+
throw new Error(`agent recipe: ${filepath}: tools.required and tools.optional must be arrays`);
|
|
219
|
+
}
|
|
220
|
+
const required = record.required.map((entry, index) => {
|
|
221
|
+
const entryPath = `${filepath}: tools.required[${index}]`;
|
|
222
|
+
if (typeof entry === "string") return requiredString(entry, entryPath);
|
|
223
|
+
if (entry === null || typeof entry !== "object" || Array.isArray(entry)) {
|
|
224
|
+
throw new Error(`agent recipe: ${entryPath} must be a tool name or { anyOf: [...] }`);
|
|
225
|
+
}
|
|
226
|
+
const group = entry;
|
|
227
|
+
if (Object.keys(group).length !== 1 || !("anyOf" in group)) {
|
|
228
|
+
throw new Error(`agent recipe: ${entryPath} must contain only anyOf`);
|
|
229
|
+
}
|
|
230
|
+
const anyOf = requiredStringArray(group.anyOf, `${entryPath}.anyOf`);
|
|
231
|
+
if (anyOf.length === 0) throw new Error(`agent recipe: ${entryPath}.anyOf must not be empty`);
|
|
232
|
+
return { anyOf };
|
|
233
|
+
});
|
|
234
|
+
const optional = requiredStringArray(record.optional, `${filepath}: tools.optional`);
|
|
235
|
+
const tools = [
|
|
236
|
+
...required.flatMap((requirement) => typeof requirement === "string" ? [requirement] : requirement.anyOf),
|
|
237
|
+
...optional
|
|
238
|
+
];
|
|
239
|
+
if (new Set(tools).size !== tools.length)
|
|
240
|
+
throw new Error(`agent recipe: ${filepath}: tools contains duplicate requirements`);
|
|
241
|
+
return { tools, toolRequirements: { required, optional } };
|
|
242
|
+
}
|
|
243
|
+
function parseAgentRecipeSchema(input) {
|
|
244
|
+
const { frontmatter, filepath } = input;
|
|
245
|
+
for (const key of Object.keys(frontmatter)) {
|
|
246
|
+
if (!ALL_RECIPE_KEYS.includes(key)) {
|
|
247
|
+
throw new Error(`agent recipe: ${filepath}: unknown key '${key}'`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
for (const key of RECIPE_KEYS) {
|
|
251
|
+
if (!(key in frontmatter)) throw new Error(`agent recipe: ${filepath}: ${key} is required`);
|
|
252
|
+
}
|
|
253
|
+
if (frontmatter.version !== 1) throw new Error(`agent recipe: ${filepath}: version must be the supported integer 1`);
|
|
254
|
+
if (input.body.trim().length === 0) throw new Error(`agent recipe: ${filepath}: persona body must not be empty`);
|
|
255
|
+
const parsedTools = parseTools(frontmatter.tools, filepath);
|
|
256
|
+
const budget = parseAgentBudget(frontmatter.budget, filepath);
|
|
257
|
+
if (budget === void 0) throw new Error(`agent recipe: ${filepath}: budget is required`);
|
|
258
|
+
return {
|
|
259
|
+
version: 1,
|
|
260
|
+
id: input.id,
|
|
261
|
+
name: requiredString(frontmatter.name, `${filepath}: name`),
|
|
262
|
+
description: requiredString(frontmatter.description, `${filepath}: description`),
|
|
263
|
+
tools: parsedTools.tools,
|
|
264
|
+
toolRequirements: parsedTools.toolRequirements,
|
|
265
|
+
skills: requiredStringArray(frontmatter.skills, `${filepath}: skills`),
|
|
266
|
+
boundSkillPaths: [],
|
|
267
|
+
audience: parseAudience(frontmatter.audience, input.source, filepath),
|
|
268
|
+
category: enumValue(frontmatter.category, `${filepath}: category`, isAgentCategory),
|
|
269
|
+
capabilityClass: enumValue(
|
|
270
|
+
frontmatter.capabilityClass,
|
|
271
|
+
`${filepath}: capabilityClass`,
|
|
272
|
+
isAgentCapabilityClass
|
|
273
|
+
),
|
|
274
|
+
latencyClass: enumValue(
|
|
275
|
+
frontmatter.latencyClass,
|
|
276
|
+
`${filepath}: latencyClass`,
|
|
277
|
+
isAgentLatencyClass
|
|
278
|
+
),
|
|
279
|
+
projectContextTier: enumValue(
|
|
280
|
+
frontmatter.projectContextTier,
|
|
281
|
+
`${filepath}: projectContextTier`,
|
|
282
|
+
isAgentProjectContextTier
|
|
283
|
+
),
|
|
284
|
+
budget,
|
|
285
|
+
resultContract: parseResultContract(frontmatter.resultContract, filepath),
|
|
286
|
+
// Optional, but not lenient. A misspelled product silently costs the run
|
|
287
|
+
// the delivery tools its reserve window was supposed to keep, and the
|
|
288
|
+
// only symptom is a blocked tool call deep in a dispatch log.
|
|
289
|
+
...frontmatter.product === void 0 ? {} : { product: enumValue(frontmatter.product, `${filepath}: product`, isAgentProduct) },
|
|
290
|
+
tags: requiredStringArray(frontmatter.tags, `${filepath}: tags`),
|
|
291
|
+
source: input.source,
|
|
292
|
+
filepath,
|
|
293
|
+
body: input.body
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// src/domains/plugins/catalog.ts
|
|
298
|
+
init_esm_shims();
|
|
299
|
+
var import_yaml = __toESM(require_dist(), 1);
|
|
300
|
+
import { execFileSync } from "node:child_process";
|
|
301
|
+
import { existsSync, mkdtempSync, readFileSync, realpathSync, rmSync, statSync } from "node:fs";
|
|
302
|
+
import { homedir, tmpdir } from "node:os";
|
|
303
|
+
import path2 from "node:path";
|
|
304
|
+
function parsePluginGithubSource(source) {
|
|
305
|
+
const match = /^https:\/\/github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/tree\/([A-Za-z0-9_.-]+)(?:\/(.*?))?\/?$/.exec(source);
|
|
306
|
+
if (!match?.[1] || !match[2] || !match[3]) return void 0;
|
|
307
|
+
const subdir = match[4] ?? "";
|
|
308
|
+
if (subdir.split("/").some((part) => part === ".." || part === ".") || subdir.includes("\\") || subdir.includes("\0"))
|
|
309
|
+
return void 0;
|
|
310
|
+
return { url: `https://github.com/${match[1]}/${match[2]}.git`, ref: match[3], subdir };
|
|
311
|
+
}
|
|
312
|
+
function pluginLocalPath(source, cwd = process.cwd()) {
|
|
313
|
+
return path2.resolve(cwd, source.startsWith("~/") ? path2.join(homedir(), source.slice(2)) : source);
|
|
314
|
+
}
|
|
315
|
+
function fetchPluginSource(source, cwd = process.cwd()) {
|
|
316
|
+
const local = pluginLocalPath(source, cwd);
|
|
317
|
+
if (existsSync(local)) return { root: local, cleanup: () => {
|
|
318
|
+
} };
|
|
319
|
+
const remote = parsePluginGithubSource(source);
|
|
320
|
+
if (!remote)
|
|
321
|
+
throw new Error(
|
|
322
|
+
`unsupported plugin source: ${source}; use a local directory or https://github.com/owner/repo/tree/ref/path`
|
|
323
|
+
);
|
|
324
|
+
const temp = mkdtempSync(path2.join(tmpdir(), "clio-coder-plugin-"));
|
|
325
|
+
const cleanup = () => rmSync(temp, { recursive: true, force: true });
|
|
326
|
+
try {
|
|
327
|
+
execFileSync(
|
|
328
|
+
"git",
|
|
329
|
+
["-c", "core.hooksPath=/dev/null", "clone", "--depth", "1", "--branch", remote.ref, "--", remote.url, temp],
|
|
330
|
+
{
|
|
331
|
+
stdio: "pipe",
|
|
332
|
+
timeout: 12e4,
|
|
333
|
+
maxBuffer: 1e6,
|
|
334
|
+
env: buildSafeToolEnv({ GIT_TERMINAL_PROMPT: "0", GIT_CONFIG_NOSYSTEM: "1" })
|
|
335
|
+
}
|
|
336
|
+
);
|
|
337
|
+
const root = path2.join(temp, remote.subdir);
|
|
338
|
+
if (!existsSync(root) || !statSync(root).isDirectory())
|
|
339
|
+
throw new Error(`plugin source has no directory ${remote.subdir || "."}: ${source}`);
|
|
340
|
+
const relative = path2.relative(realpathSync(temp), realpathSync(root));
|
|
341
|
+
if (relative === ".." || relative.startsWith(`..${path2.sep}`) || path2.isAbsolute(relative))
|
|
342
|
+
throw new Error("plugin source escapes repository");
|
|
343
|
+
if (!remote.subdir) rmSync(path2.join(temp, ".git"), { recursive: true, force: true });
|
|
344
|
+
return { root, cleanup };
|
|
345
|
+
} catch (error) {
|
|
346
|
+
cleanup();
|
|
347
|
+
throw error;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
var PROVIDED_NAME = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;
|
|
351
|
+
function providedResources(value, name, diagnostics) {
|
|
352
|
+
if (value === void 0) return void 0;
|
|
353
|
+
if (!Array.isArray(value) || value.length > LIBRARY_PROVIDES_LIMITS.entries) {
|
|
354
|
+
diagnostics.push(`library index provides ignored (not a bounded list): ${name}`);
|
|
355
|
+
return void 0;
|
|
356
|
+
}
|
|
357
|
+
const hints = [];
|
|
358
|
+
const seen = /* @__PURE__ */ new Set();
|
|
359
|
+
for (const raw of value) {
|
|
360
|
+
const item = raw && typeof raw === "object" ? raw : void 0;
|
|
361
|
+
if (!item || !isLibraryResourceKind(item.kind) || typeof item.name !== "string" || item.name.length > LIBRARY_PROVIDES_LIMITS.name || !PROVIDED_NAME.test(item.name) || item.description !== void 0 && (typeof item.description !== "string" || item.description.length > LIBRARY_PROVIDES_LIMITS.description)) {
|
|
362
|
+
diagnostics.push(`library index provides ignored (malformed hint): ${name}`);
|
|
363
|
+
return void 0;
|
|
364
|
+
}
|
|
365
|
+
const key = `${item.kind}:${item.name}`;
|
|
366
|
+
if (seen.has(key)) continue;
|
|
367
|
+
seen.add(key);
|
|
368
|
+
hints.push({
|
|
369
|
+
kind: item.kind,
|
|
370
|
+
name: item.name,
|
|
371
|
+
...typeof item.description === "string" ? { description: item.description } : {}
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
return hints;
|
|
375
|
+
}
|
|
376
|
+
function readPluginCatalog(file, diagnostics) {
|
|
377
|
+
if (!existsSync(file)) return [];
|
|
378
|
+
try {
|
|
379
|
+
const parsed = (0, import_yaml.parse)(readFileSync(file, "utf8"));
|
|
380
|
+
const rows = Array.isArray(parsed) ? parsed : parsed && typeof parsed === "object" && Array.isArray(parsed.entries) ? parsed.entries : void 0;
|
|
381
|
+
if (!rows) throw new Error("library index must be a list or contain an entries list");
|
|
382
|
+
return rows.flatMap((row) => {
|
|
383
|
+
if (!row || typeof row !== "object") {
|
|
384
|
+
diagnostics.push(`library index entry malformed: ${file}`);
|
|
385
|
+
return [];
|
|
386
|
+
}
|
|
387
|
+
const item = row;
|
|
388
|
+
if (!isLibraryKind(item.kind) || typeof item.name !== "string" || !isPluginId(item.name) || typeof item.description !== "string" || typeof item.sourceUrl !== "string" || item.sourceUrl.trim().length === 0 || !isSemanticVersion(item.version) || typeof item.sha256 !== "string" || !/^[a-f0-9]{64}$/.test(item.sha256)) {
|
|
389
|
+
diagnostics.push(
|
|
390
|
+
`library index entry requires name, description, sourceUrl, version, and full-tree sha256: ${String(item.name ?? file)}`
|
|
391
|
+
);
|
|
392
|
+
return [];
|
|
393
|
+
}
|
|
394
|
+
if (item.requires !== void 0 && (!Array.isArray(item.requires) || item.requires.some((ref) => typeof ref !== "string"))) {
|
|
395
|
+
diagnostics.push(`library_requirement_malformed: ${item.name}`);
|
|
396
|
+
return [];
|
|
397
|
+
}
|
|
398
|
+
const remote = /^(?:[a-z][a-z0-9+.-]*:\/\/|git@)/i.test(item.sourceUrl);
|
|
399
|
+
if (remote && !parsePluginGithubSource(item.sourceUrl)) {
|
|
400
|
+
diagnostics.push(`unsupported library index source: ${item.sourceUrl}`);
|
|
401
|
+
return [];
|
|
402
|
+
}
|
|
403
|
+
const provides = providedResources(item.provides, item.name, diagnostics);
|
|
404
|
+
return [
|
|
405
|
+
{
|
|
406
|
+
kind: item.kind,
|
|
407
|
+
name: item.name,
|
|
408
|
+
description: item.description,
|
|
409
|
+
sourceUrl: remote ? item.sourceUrl : path2.resolve(path2.dirname(file), item.sourceUrl),
|
|
410
|
+
version: item.version,
|
|
411
|
+
sha256: item.sha256,
|
|
412
|
+
origin: "catalog",
|
|
413
|
+
...typeof item.category === "string" ? { category: item.category } : {},
|
|
414
|
+
...["pass", "warn", "fail", "unknown"].includes(String(item.audit)) ? { audit: item.audit } : {},
|
|
415
|
+
...Array.isArray(item.triggers) ? { triggers: item.triggers.filter((value) => typeof value === "string") } : {},
|
|
416
|
+
...Array.isArray(item.requires) ? { requires: item.requires } : {},
|
|
417
|
+
...provides ? { provides } : {},
|
|
418
|
+
index: path2.resolve(file)
|
|
419
|
+
}
|
|
420
|
+
];
|
|
421
|
+
});
|
|
422
|
+
} catch (error) {
|
|
423
|
+
diagnostics.push(`library index unreadable: ${error instanceof Error ? error.message : String(error)}`);
|
|
424
|
+
return [];
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
function bundledLibraryIndexPath() {
|
|
428
|
+
return path2.join(resolvePackageRoot(), "library", "registry.yaml");
|
|
429
|
+
}
|
|
430
|
+
function bundledPluginCatalog(diagnostics) {
|
|
431
|
+
try {
|
|
432
|
+
return readPluginCatalog(bundledLibraryIndexPath(), diagnostics);
|
|
433
|
+
} catch (error) {
|
|
434
|
+
diagnostics.push(`library index unavailable: ${error instanceof Error ? error.message : String(error)}`);
|
|
435
|
+
return [];
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// src/domains/resources/library.ts
|
|
440
|
+
init_esm_shims();
|
|
441
|
+
var import_yaml2 = __toESM(require_dist(), 1);
|
|
442
|
+
import { existsSync as existsSync2, readFileSync as readFileSync2 } from "node:fs";
|
|
443
|
+
import path3 from "node:path";
|
|
444
|
+
function catalogPath() {
|
|
445
|
+
const configured = readSettings().integrations.library.catalog;
|
|
446
|
+
return path3.resolve(configured ?? path3.join(clioConfigDir(), "library.yaml"));
|
|
447
|
+
}
|
|
448
|
+
function parseCatalog(filePath, diagnostics) {
|
|
449
|
+
return readPluginCatalog(filePath, diagnostics).map((entry) => ({ ...entry, origin: "index" }));
|
|
450
|
+
}
|
|
451
|
+
function displayInstallRecord(id, options, diagnostics) {
|
|
452
|
+
try {
|
|
453
|
+
return readPluginInstallRecord(id, options);
|
|
454
|
+
} catch (error) {
|
|
455
|
+
const message = `package state unavailable (${options.scope}:${id}): ${error instanceof Error ? error.message : String(error)}`;
|
|
456
|
+
if (!diagnostics.includes(message)) diagnostics.push(message);
|
|
457
|
+
return void 0;
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
function libraryEntryRef(entry) {
|
|
461
|
+
return `${entry.kind}:${entry.name}`;
|
|
462
|
+
}
|
|
463
|
+
function discoverLibrary(options = {}) {
|
|
464
|
+
const diagnostics = [];
|
|
465
|
+
const bundledPlugins = bundledPluginCatalog(diagnostics);
|
|
466
|
+
const privatePath = catalogPath();
|
|
467
|
+
const primary = options.catalog ? parseCatalog(path3.resolve(options.catalog), diagnostics) : [];
|
|
468
|
+
const privateEntries = parseCatalog(privatePath, diagnostics);
|
|
469
|
+
const byRef = /* @__PURE__ */ new Map();
|
|
470
|
+
for (const entry of [
|
|
471
|
+
...bundledPlugins,
|
|
472
|
+
...privateEntries,
|
|
473
|
+
...parseCatalog(path3.join(options.cwd ?? process.cwd(), ".clio-coder", "library.yaml"), diagnostics),
|
|
474
|
+
...primary
|
|
475
|
+
])
|
|
476
|
+
byRef.set(libraryEntryRef(entry), entry);
|
|
477
|
+
for (const plugin of listInstalledPlugins(options.cwd ?? process.cwd(), { all: true })) {
|
|
478
|
+
const ref = `${plugin.kind ?? "plugin"}:${plugin.id}`;
|
|
479
|
+
if (byRef.has(ref)) continue;
|
|
480
|
+
const record = displayInstallRecord(
|
|
481
|
+
plugin.id,
|
|
482
|
+
{ ...options.cwd ? { cwd: options.cwd } : {}, scope: plugin.scope },
|
|
483
|
+
diagnostics
|
|
484
|
+
);
|
|
485
|
+
byRef.set(ref, {
|
|
486
|
+
kind: plugin.kind ?? "plugin",
|
|
487
|
+
name: plugin.id,
|
|
488
|
+
version: plugin.version,
|
|
489
|
+
description: plugin.description,
|
|
490
|
+
sourceUrl: record?.source ?? plugin.rootPath,
|
|
491
|
+
origin: "installed"
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
const refusals = {};
|
|
495
|
+
const entries = [...byRef.values()];
|
|
496
|
+
for (const entry of entries) {
|
|
497
|
+
try {
|
|
498
|
+
resolveLibraryRequirements(entry, [...byRef.values()]);
|
|
499
|
+
} catch (error) {
|
|
500
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
501
|
+
refusals[libraryEntryRef(entry)] = message;
|
|
502
|
+
if (!diagnostics.includes(message)) diagnostics.push(message);
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
return {
|
|
506
|
+
entries: entries.sort((a, b) => libraryEntryRef(a).localeCompare(libraryEntryRef(b))),
|
|
507
|
+
diagnostics,
|
|
508
|
+
refusals
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
var REQUIREMENT_PATTERN = /^(skill|agent|prompt|fleet|plugin):([A-Za-z0-9][A-Za-z0-9._-]*)$/;
|
|
512
|
+
function resolveLibraryRequirements(entry, catalog) {
|
|
513
|
+
const byRef = new Map(catalog.map((item) => [libraryEntryRef(item), item]));
|
|
514
|
+
const ordered = [];
|
|
515
|
+
const visiting = [];
|
|
516
|
+
const visited = /* @__PURE__ */ new Set();
|
|
517
|
+
const visit = (current) => {
|
|
518
|
+
const currentRef = libraryEntryRef(current);
|
|
519
|
+
if (visited.has(currentRef)) return;
|
|
520
|
+
const cycleAt = visiting.indexOf(currentRef);
|
|
521
|
+
if (cycleAt >= 0)
|
|
522
|
+
throw new Error(`library_requirement_cycle: ${[...visiting.slice(cycleAt), currentRef].join(" -> ")}`);
|
|
523
|
+
visiting.push(currentRef);
|
|
524
|
+
for (const requirement of current.requires ?? []) {
|
|
525
|
+
if (!REQUIREMENT_PATTERN.test(requirement)) throw new Error("library_requirement_malformed");
|
|
526
|
+
const dependency = byRef.get(requirement);
|
|
527
|
+
if (!dependency) throw new Error(`library_requirement_missing: ${requirement}`);
|
|
528
|
+
visit(dependency);
|
|
529
|
+
}
|
|
530
|
+
visiting.pop();
|
|
531
|
+
visited.add(currentRef);
|
|
532
|
+
ordered.push(current);
|
|
533
|
+
};
|
|
534
|
+
visit(entry);
|
|
535
|
+
return ordered;
|
|
536
|
+
}
|
|
537
|
+
function resolveInstalledLibraryEntry(ref, options = {}) {
|
|
538
|
+
const copies = listInstalledPlugins(options.cwd ?? process.cwd(), { ...options, all: true }).filter((item2) => ref.includes(":") ? `${item2.kind ?? "plugin"}:${item2.id}` === ref : item2.id === ref).sort((a, b) => Number(b.scope === "project") - Number(a.scope === "project"));
|
|
539
|
+
const item = copies[0];
|
|
540
|
+
if (!item) throw new Error(`package not installed: ${ref}`);
|
|
541
|
+
const saved = readPluginInstallRecord(item.id, { ...options, scope: item.scope });
|
|
542
|
+
return {
|
|
543
|
+
scope: item.scope,
|
|
544
|
+
kind: item.kind ?? "plugin",
|
|
545
|
+
name: item.id,
|
|
546
|
+
description: item.description,
|
|
547
|
+
version: item.version,
|
|
548
|
+
sourceUrl: saved?.source ?? item.rootPath,
|
|
549
|
+
origin: "installed",
|
|
550
|
+
...item.manifest?.clio.requires ? { requires: item.manifest.clio.requires } : {}
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
function registerLibraryPackage(source, options = {}) {
|
|
554
|
+
const local = pluginLocalPath(source, options.cwd);
|
|
555
|
+
const candidate = readPluginManifest(local);
|
|
556
|
+
if (!candidate.valid || !candidate.manifest || !candidate.contentDigest)
|
|
557
|
+
throw new Error(candidate.diagnostics.map((item) => item.message).join("; "));
|
|
558
|
+
const manifest = candidate.manifest;
|
|
559
|
+
const entry = {
|
|
560
|
+
kind: manifest.clio.kind ?? "plugin",
|
|
561
|
+
name: manifest.name,
|
|
562
|
+
description: manifest.description ?? "",
|
|
563
|
+
...manifest.version ? { version: manifest.version } : {},
|
|
564
|
+
sha256: candidate.contentDigest,
|
|
565
|
+
sourceUrl: local,
|
|
566
|
+
origin: "index",
|
|
567
|
+
...manifest.clio.requires ? { requires: manifest.clio.requires } : {}
|
|
568
|
+
};
|
|
569
|
+
const file = options.scope === "project" ? path3.join(options.cwd ?? process.cwd(), ".clio-coder", "library.yaml") : catalogPath();
|
|
570
|
+
withStateFileLockSync(file, () => {
|
|
571
|
+
const diagnostics = [];
|
|
572
|
+
const before = existsSync2(file) ? readFileSync2(file, "utf8") : void 0;
|
|
573
|
+
const entries = readPluginCatalog(file, diagnostics);
|
|
574
|
+
if (diagnostics.length) throw new Error(diagnostics.join("; "));
|
|
575
|
+
const previous = entries.find((item) => item.name === entry.name);
|
|
576
|
+
if (previous && !options.force)
|
|
577
|
+
throw new Error(`package already registered: ${entry.name}; use --force to replace its pin`);
|
|
578
|
+
const next = [...entries.filter((item) => item.name !== entry.name), entry].sort(
|
|
579
|
+
(a, b) => a.name.localeCompare(b.name)
|
|
580
|
+
);
|
|
581
|
+
if ((existsSync2(file) ? readFileSync2(file, "utf8") : void 0) !== before)
|
|
582
|
+
throw new Error("library index changed during registration");
|
|
583
|
+
safeResourceWrite(file, (0, import_yaml2.stringify)({ entries: next.map(({ origin: _origin, index: _index, ...item }) => item) }), {
|
|
584
|
+
encoding: "utf8"
|
|
585
|
+
});
|
|
586
|
+
});
|
|
587
|
+
return entry;
|
|
588
|
+
}
|
|
589
|
+
function libraryWorkspace(options = {}) {
|
|
590
|
+
const discovery = discoverLibrary(options);
|
|
591
|
+
const installed = listInstalledPlugins(options.cwd ?? process.cwd(), { ...options, all: true });
|
|
592
|
+
return {
|
|
593
|
+
...discovery,
|
|
594
|
+
entries: discovery.entries.map((entry) => ({
|
|
595
|
+
...entry,
|
|
596
|
+
installed: installed.filter((item) => item.id === entry.name && (item.kind ?? "plugin") === entry.kind).map((item) => ({
|
|
597
|
+
...item,
|
|
598
|
+
origin: displayInstallRecord(item.id, { ...options, scope: item.scope }, discovery.diagnostics)?.origin
|
|
599
|
+
}))
|
|
600
|
+
}))
|
|
601
|
+
};
|
|
602
|
+
}
|
|
603
|
+
function installedPlugin(entry, options = {}) {
|
|
604
|
+
return listInstalledPlugins(options.cwd ?? process.cwd(), {
|
|
605
|
+
all: true,
|
|
606
|
+
...options.scope ? { scope: options.scope } : {}
|
|
607
|
+
}).filter((plugin) => plugin.id === entry.name && (plugin.kind ?? "plugin") === entry.kind).sort((left, right) => Number(right.scope === "project") - Number(left.scope === "project"))[0];
|
|
608
|
+
}
|
|
609
|
+
function libraryInstallPath(entry, options = {}) {
|
|
610
|
+
if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(entry.name)) throw new Error(`invalid library entry name: ${entry.name}`);
|
|
611
|
+
return installedPlugin(entry, options)?.rootPath ?? path3.join(pluginBaseDir(options.scope ?? "user", options.cwd ?? process.cwd()), entry.name);
|
|
612
|
+
}
|
|
613
|
+
function libraryEntryInstalled(entry, options = {}) {
|
|
614
|
+
return installedPlugin(entry, options) !== void 0;
|
|
615
|
+
}
|
|
616
|
+
function libraryEntryPin(entry, options = {}) {
|
|
617
|
+
const plugin = installedPlugin(entry, options);
|
|
618
|
+
if (!plugin) return void 0;
|
|
619
|
+
const record = displayInstallRecord(entry.name, { ...options, scope: plugin.scope }, []);
|
|
620
|
+
return record ? { sha256: record.contentDigest, sourceUrl: record.source } : void 0;
|
|
621
|
+
}
|
|
622
|
+
function classifyLibraryRequirements(entry, catalog, options = {}) {
|
|
623
|
+
const ordered = resolveLibraryRequirements(entry, catalog).slice(0, -1);
|
|
624
|
+
const inactive = ordered.filter(
|
|
625
|
+
(requirement) => libraryEntryInstalled(requirement, options) && !listInstalledPlugins(options.cwd ?? process.cwd(), options).some(
|
|
626
|
+
(plugin) => plugin.id === requirement.name && (plugin.kind ?? "plugin") === requirement.kind && plugin.loadable
|
|
627
|
+
)
|
|
628
|
+
);
|
|
629
|
+
const inactiveRefs = new Set(inactive.map(libraryEntryRef));
|
|
630
|
+
const satisfied = ordered.filter(
|
|
631
|
+
(requirement) => libraryEntryInstalled(requirement, options) && !inactiveRefs.has(libraryEntryRef(requirement))
|
|
632
|
+
);
|
|
633
|
+
const satisfiedRefs = new Set(satisfied.map(libraryEntryRef));
|
|
634
|
+
return {
|
|
635
|
+
ordered,
|
|
636
|
+
satisfied,
|
|
637
|
+
...inactive.length ? { inactive } : {},
|
|
638
|
+
unsatisfied: ordered.filter((requirement) => !satisfiedRefs.has(libraryEntryRef(requirement)))
|
|
639
|
+
};
|
|
640
|
+
}
|
|
641
|
+
function planLibraryInstall(entry, options = {}) {
|
|
642
|
+
const fetched = fetchPluginSource(entry.sourceUrl, options.cwd);
|
|
643
|
+
try {
|
|
644
|
+
const candidate = readPluginManifest(fetched.root);
|
|
645
|
+
if (!candidate.valid || !candidate.manifest)
|
|
646
|
+
throw new Error(`invalid plugin: ${candidate.diagnostics.map((item) => item.message).join("; ")}`);
|
|
647
|
+
if ((candidate.manifest.clio.kind ?? "plugin") !== entry.kind)
|
|
648
|
+
throw new Error(`package kind mismatch: expected ${entry.kind}`);
|
|
649
|
+
if (candidate.manifest.name !== entry.name)
|
|
650
|
+
throw new Error(`plugin identity mismatch: expected ${entry.name}, found ${candidate.manifest.name}`);
|
|
651
|
+
if (entry.version && candidate.manifest.version !== entry.version)
|
|
652
|
+
throw new Error(`plugin version mismatch: expected ${entry.version}, found ${candidate.manifest.version}`);
|
|
653
|
+
const declaredRequirements = candidate.manifest.clio.requires ?? [];
|
|
654
|
+
if (JSON.stringify([...declaredRequirements].sort()) !== JSON.stringify([...entry.requires ?? []].sort()))
|
|
655
|
+
throw new Error(
|
|
656
|
+
`library_requirement_mismatch: ${entry.name}; index and manifest must declare the same requirements`
|
|
657
|
+
);
|
|
658
|
+
const sha2562 = extensionContentDigest(fetched.root);
|
|
659
|
+
if (entry.sha256 && sha2562 !== entry.sha256) throw new Error(`plugin_pin_mismatch: ${entry.name}`);
|
|
660
|
+
return {
|
|
661
|
+
entry: { ...entry, ...candidate.manifest.version ? { version: candidate.manifest.version } : {} },
|
|
662
|
+
path: path3.join(pluginBaseDir(options.scope ?? "user", options.cwd ?? process.cwd()), entry.name),
|
|
663
|
+
sha256: sha2562,
|
|
664
|
+
sourceRoot: fetched.root,
|
|
665
|
+
cleanup: fetched.cleanup,
|
|
666
|
+
...options
|
|
667
|
+
};
|
|
668
|
+
} catch (error) {
|
|
669
|
+
fetched.cleanup();
|
|
670
|
+
throw error;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
function releaseLibraryPlan(plan) {
|
|
674
|
+
plan.cleanup?.();
|
|
675
|
+
}
|
|
676
|
+
function commitLibraryInstallPlan(plan) {
|
|
677
|
+
if (existsSync2(plan.path) && !plan.force) throw new Error(`library destination already exists: ${plan.path}`);
|
|
678
|
+
if (!plan.sourceRoot) throw new Error("plugin install plan has no staged source");
|
|
679
|
+
if (plan.expectedInstalledDigest && extensionContentDigest(plan.path) !== plan.expectedInstalledDigest)
|
|
680
|
+
throw new Error(`plugin_destination_changed: ${plan.entry.name}`);
|
|
681
|
+
const expect = plan.expect ?? (plan.expectedInstalledDigest ? {
|
|
682
|
+
copies: [
|
|
683
|
+
{
|
|
684
|
+
scope: plan.scope ?? "user",
|
|
685
|
+
id: plan.entry.name,
|
|
686
|
+
partial: true,
|
|
687
|
+
recorded: true,
|
|
688
|
+
tree: plan.expectedInstalledDigest
|
|
689
|
+
}
|
|
690
|
+
]
|
|
691
|
+
} : void 0);
|
|
692
|
+
return installPlugin(plan.sourceRoot, {
|
|
693
|
+
...plan.cwd ? { cwd: plan.cwd } : {},
|
|
694
|
+
scope: plan.scope ?? "user",
|
|
695
|
+
force: plan.force ?? false,
|
|
696
|
+
expectedDigest: plan.sha256,
|
|
697
|
+
expectedId: plan.entry.name,
|
|
698
|
+
expectedKind: plan.entry.kind,
|
|
699
|
+
...plan.entry.version ? { expectedVersion: plan.entry.version } : {},
|
|
700
|
+
...expect ? { expect } : {},
|
|
701
|
+
origin: {
|
|
702
|
+
kind: plan.entry.origin === "catalog" || plan.entry.origin === "index" ? "catalog" : parsePluginGithubSource(plan.entry.sourceUrl) ? "github" : "local",
|
|
703
|
+
source: plan.entry.sourceUrl
|
|
704
|
+
}
|
|
705
|
+
});
|
|
706
|
+
}
|
|
707
|
+
function installLibraryPlan(plan) {
|
|
708
|
+
let recovery;
|
|
709
|
+
try {
|
|
710
|
+
const result = commitLibraryInstallPlan(plan);
|
|
711
|
+
if (!result.plugin || result.diagnostics.some((item) => item.type === "error"))
|
|
712
|
+
throw new Error(
|
|
713
|
+
`${result.diagnostics.map((item) => item.message).join("; ") || "plugin install failed"}${result.recovery ? `; recovery: ${JSON.stringify(result.recovery)}` : ""}`
|
|
714
|
+
);
|
|
715
|
+
recovery = result.recovery;
|
|
716
|
+
return recovery ? { recovery } : {};
|
|
717
|
+
} finally {
|
|
718
|
+
releaseLibraryPlan(plan);
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
function resolveLibraryPackage(source, options = {}) {
|
|
722
|
+
const local = pluginLocalPath(source, options.cwd);
|
|
723
|
+
if (existsSync2(local)) {
|
|
724
|
+
const candidate = readPluginManifest(local);
|
|
725
|
+
if (!candidate.valid || !candidate.manifest)
|
|
726
|
+
throw new Error(`invalid plugin: ${candidate.diagnostics.map((item) => item.message).join("; ")}`);
|
|
727
|
+
return {
|
|
728
|
+
kind: candidate.manifest.clio.kind ?? "plugin",
|
|
729
|
+
name: candidate.manifest.name,
|
|
730
|
+
...candidate.manifest.clio.requires ? { requires: candidate.manifest.clio.requires } : {},
|
|
731
|
+
description: candidate.manifest.description ?? "",
|
|
732
|
+
...candidate.manifest.version ? { version: candidate.manifest.version } : {},
|
|
733
|
+
sourceUrl: local,
|
|
734
|
+
origin: "installed"
|
|
735
|
+
};
|
|
736
|
+
}
|
|
737
|
+
const matches = discoverLibrary(options).entries.filter(
|
|
738
|
+
(item) => source.includes(":") ? libraryEntryRef(item) === source : item.name === source
|
|
739
|
+
);
|
|
740
|
+
if (matches.length > 1) throw new Error(`ambiguous package: ${source}; use kind:name`);
|
|
741
|
+
const entry = matches[0];
|
|
742
|
+
if (entry) return entry;
|
|
743
|
+
if (parsePluginGithubSource(source))
|
|
744
|
+
throw new Error("remote plugin installation requires a catalog entry with version and full-tree sha256 pin");
|
|
745
|
+
throw new Error(`plugin source is neither an existing local directory nor a catalog entry: ${source}`);
|
|
746
|
+
}
|
|
747
|
+
function planLibraryUpdate(id, options = {}) {
|
|
748
|
+
const identity = resolveInstalledLibraryEntry(id, options);
|
|
749
|
+
const plugin = installedPlugin(identity, options);
|
|
750
|
+
if (!plugin) throw new Error(`plugin not installed: ${id}`);
|
|
751
|
+
const pin = libraryEntryPin(identity, { ...options, scope: plugin.scope });
|
|
752
|
+
if (!options.force && pin && extensionContentDigest(plugin.rootPath) !== pin.sha256)
|
|
753
|
+
throw new Error(`plugin_local_changes: ${id}; use --force to replace local changes`);
|
|
754
|
+
const record = readPluginInstallRecord(identity.name, { ...options, scope: plugin.scope });
|
|
755
|
+
if (typeof record?.origin === "object" && record.origin.kind === "interop")
|
|
756
|
+
throw new Error("interop packages require a new reviewed adoption; remove the installed copy and adopt it again");
|
|
757
|
+
const catalogOrigin = record?.origin && typeof record.origin === "object" && record.origin.kind === "catalog";
|
|
758
|
+
const discovery = discoverLibrary(options);
|
|
759
|
+
const catalog = catalogOrigin ? discovery.entries.find(
|
|
760
|
+
(entry2) => entry2.kind === identity.kind && entry2.name === identity.name && entry2.origin !== "installed"
|
|
761
|
+
) : void 0;
|
|
762
|
+
if (catalogOrigin && !catalog)
|
|
763
|
+
throw new Error(
|
|
764
|
+
`plugin catalog source unavailable: ${id}; restore its pinned catalog entry or explicitly install a new source`
|
|
765
|
+
);
|
|
766
|
+
const entry = catalog ?? (pin ? resolveLibraryPackage(pin.sourceUrl, options) : void 0);
|
|
767
|
+
if (!entry) throw new Error(`plugin has no update source: ${id}`);
|
|
768
|
+
if (entry.name !== identity.name || entry.kind !== identity.kind)
|
|
769
|
+
throw new Error(`package identity mismatch: expected ${id}, found ${libraryEntryRef(entry)}`);
|
|
770
|
+
const requirements = classifyLibraryRequirements(entry, discovery.entries, options);
|
|
771
|
+
if (requirements.inactive?.length)
|
|
772
|
+
throw new Error(
|
|
773
|
+
`library_requirement_inactive: ${requirements.inactive.map(libraryEntryRef).join(", ")}; enable or repair these plugins explicitly`
|
|
774
|
+
);
|
|
775
|
+
if (requirements.unsatisfied.length)
|
|
776
|
+
throw new Error(
|
|
777
|
+
`library_requirement_missing: ${requirements.unsatisfied.map(libraryEntryRef).join(", ")}; install required resources before updating`
|
|
778
|
+
);
|
|
779
|
+
const plan = planLibraryInstall(entry, { ...options, scope: plugin.scope, force: true });
|
|
780
|
+
if (!options.force) plan.expectedInstalledDigest = extensionContentDigest(plugin.rootPath);
|
|
781
|
+
return plan;
|
|
782
|
+
}
|
|
783
|
+
function removeLibraryEntry(entry, options = {}) {
|
|
784
|
+
const installed = installedPlugin(entry, options);
|
|
785
|
+
if (!installed) throw new Error(`package not installed: ${libraryEntryRef(entry)}`);
|
|
786
|
+
const result = removePlugin(entry.name, { ...options, scope: installed.scope });
|
|
787
|
+
if (result.diagnostics.some((item) => item.type === "error"))
|
|
788
|
+
throw new Error(
|
|
789
|
+
`${result.diagnostics.map((item) => item.message).join("; ")}${result.recovery ? `; recovery: ${JSON.stringify(result.recovery)}` : ""}`
|
|
790
|
+
);
|
|
791
|
+
return result.recovery ? { recovery: result.recovery } : {};
|
|
792
|
+
}
|
|
793
|
+
function pinLibraryEntry(entry, options = {}) {
|
|
794
|
+
const installed = libraryInstallPath(entry, options);
|
|
795
|
+
const pin = libraryEntryPin(entry, options);
|
|
796
|
+
if (!pin) throw new Error(`plugin is not installed with a verified pin: ${entry.name}`);
|
|
797
|
+
if (extensionContentDigest(installed) !== pin.sha256)
|
|
798
|
+
throw new Error(`plugin_local_changes: ${entry.name}; reinstall explicitly to accept changed content`);
|
|
799
|
+
return pin;
|
|
800
|
+
}
|
|
801
|
+
function libraryEntryDrift(entry, options = {}) {
|
|
802
|
+
const installed = libraryInstallPath(entry, options);
|
|
803
|
+
if (!existsSync2(installed)) return { status: "missing" };
|
|
804
|
+
const pin = libraryEntryPin(entry, options);
|
|
805
|
+
if (!pin) return { status: "unpinned" };
|
|
806
|
+
const observed = extensionContentDigest(installed);
|
|
807
|
+
return { status: observed === pin.sha256 ? "clean" : "changed", expected: pin.sha256, observed };
|
|
808
|
+
}
|
|
809
|
+
function confirmedRemote() {
|
|
810
|
+
const settings = readSettings().integrations.library;
|
|
811
|
+
if (!settings.remote || settings.remote !== settings.confirmedRemote) throw new Error("library_remote_unconfirmed");
|
|
812
|
+
return settings.remote;
|
|
813
|
+
}
|
|
814
|
+
function confirmLibraryRemote(url) {
|
|
815
|
+
const current = readSettings().integrations.library.remote;
|
|
816
|
+
if (current !== null && current !== url) throw new Error("library_remote_mismatch");
|
|
817
|
+
updateSettings((settings) => {
|
|
818
|
+
if (settings.integrations.library.remote === null) settings.integrations.library.remote = url;
|
|
819
|
+
settings.integrations.library.confirmedRemote = url;
|
|
820
|
+
});
|
|
821
|
+
}
|
|
822
|
+
async function syncLibrary(direction, runner = runCommandVector) {
|
|
823
|
+
const settings = readSettings().integrations.library;
|
|
824
|
+
if (!settings.sync) throw new Error("library_sync_disabled");
|
|
825
|
+
const remote = confirmedRemote();
|
|
826
|
+
const cwd = path3.dirname(catalogPath());
|
|
827
|
+
const remoteResult = await runner("git", ["remote", "get-url", "library"], { cwd, workspaceRoot: cwd });
|
|
828
|
+
if (remoteResult.exitCode !== 0 || remoteResult.stdout.trim() !== remote)
|
|
829
|
+
throw new Error("library_remote_unconfirmed");
|
|
830
|
+
if (direction === "sync") {
|
|
831
|
+
const fetched = await runner("git", ["fetch", "library"], { cwd, workspaceRoot: cwd });
|
|
832
|
+
if (fetched.exitCode !== 0) throw new Error(fetched.stderr.trim() || "library sync failed");
|
|
833
|
+
const advanced = await runner("git", ["merge", "--ff-only", "FETCH_HEAD"], { cwd, workspaceRoot: cwd });
|
|
834
|
+
if (advanced.exitCode !== 0) throw new Error(advanced.stderr.trim() || "library sync failed");
|
|
835
|
+
return;
|
|
836
|
+
}
|
|
837
|
+
const result = await runner("git", ["push", "library"], { cwd, workspaceRoot: cwd });
|
|
838
|
+
if (result.exitCode !== 0) throw new Error(result.stderr.trim() || `library ${direction} failed`);
|
|
839
|
+
}
|
|
840
|
+
|
|
841
|
+
// src/domains/resources/skills/marketplace.ts
|
|
842
|
+
init_esm_shims();
|
|
843
|
+
import { existsSync as existsSync4, readdirSync as readdirSync2, readFileSync as readFileSync4 } from "node:fs";
|
|
844
|
+
import path5 from "node:path";
|
|
845
|
+
|
|
846
|
+
// src/domains/resources/skills/loader.ts
|
|
847
|
+
init_esm_shims();
|
|
848
|
+
import { createHash } from "node:crypto";
|
|
849
|
+
import { existsSync as existsSync3, readdirSync, readFileSync as readFileSync3, realpathSync as realpathSync2 } from "node:fs";
|
|
850
|
+
import { homedir as homedir2 } from "node:os";
|
|
851
|
+
import path4 from "node:path";
|
|
852
|
+
var MAX_NAME_LENGTH = 64;
|
|
853
|
+
var MAX_DESCRIPTION_LENGTH = 1024;
|
|
854
|
+
var MAX_SKILL_BYTES = 1024 * 1024;
|
|
855
|
+
var SKILL_ACTIVATION_BODY_CAP_BYTES = 50 * 1024;
|
|
856
|
+
var CORE_FRONTMATTER_KEYS = /* @__PURE__ */ new Set([
|
|
857
|
+
"name",
|
|
858
|
+
"description",
|
|
859
|
+
"disable-model-invocation",
|
|
860
|
+
"allowed-tools",
|
|
861
|
+
"disallowed-tools"
|
|
862
|
+
]);
|
|
863
|
+
var SKILL_PRECEDENCE = {
|
|
864
|
+
package: 10,
|
|
865
|
+
userCompat: 20,
|
|
866
|
+
user: 30,
|
|
867
|
+
projectCompat: 40,
|
|
868
|
+
project: 50,
|
|
869
|
+
cli: 60
|
|
870
|
+
};
|
|
871
|
+
function sha256(value) {
|
|
872
|
+
return createHash("sha256").update(value, "utf8").digest("hex");
|
|
873
|
+
}
|
|
874
|
+
function defaultPrecedenceForScope(scope) {
|
|
875
|
+
switch (scope) {
|
|
876
|
+
case "package":
|
|
877
|
+
return SKILL_PRECEDENCE.package;
|
|
878
|
+
case "user":
|
|
879
|
+
return SKILL_PRECEDENCE.user;
|
|
880
|
+
case "project":
|
|
881
|
+
return SKILL_PRECEDENCE.project;
|
|
882
|
+
case "cli":
|
|
883
|
+
return SKILL_PRECEDENCE.cli;
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
function projectCompatTrusted(explicit) {
|
|
887
|
+
return explicit === true;
|
|
888
|
+
}
|
|
889
|
+
function defaultSkillRoots(input = {}) {
|
|
890
|
+
const cwd = input.cwd ?? process.cwd();
|
|
891
|
+
const home = input.home ?? homedir2();
|
|
892
|
+
const configDir = input.configDir ?? clioConfigDirSafe();
|
|
893
|
+
const trustProject = projectCompatTrusted(input.trustProjectCompatRoots);
|
|
894
|
+
const roots = [];
|
|
895
|
+
for (const root of enabledPluginResourceRoots("skills", cwd)) {
|
|
896
|
+
roots.push({
|
|
897
|
+
path: root.path,
|
|
898
|
+
scope: "package",
|
|
899
|
+
source: "plugin",
|
|
900
|
+
rootPath: root.rootPath,
|
|
901
|
+
plugin: true,
|
|
902
|
+
containment: root.rootPath,
|
|
903
|
+
origin: root.source,
|
|
904
|
+
precedence: SKILL_PRECEDENCE.package,
|
|
905
|
+
trusted: root.trust !== "foreign" || trustProject
|
|
906
|
+
});
|
|
907
|
+
}
|
|
908
|
+
for (const kind of INTEROP_AGENT_KINDS) {
|
|
909
|
+
if (kind.userSkillRoot === void 0 || kind.skillSource === void 0) continue;
|
|
910
|
+
roots.push({
|
|
911
|
+
path: path4.join(home, kind.userSkillRoot),
|
|
912
|
+
scope: "user",
|
|
913
|
+
source: kind.skillSource,
|
|
914
|
+
origin: `${kind.skillSource}-user`,
|
|
915
|
+
precedence: SKILL_PRECEDENCE.userCompat,
|
|
916
|
+
trusted: true,
|
|
917
|
+
containment: home
|
|
918
|
+
});
|
|
919
|
+
}
|
|
920
|
+
if (configDir) {
|
|
921
|
+
roots.push({
|
|
922
|
+
path: path4.join(configDir, "skills"),
|
|
923
|
+
scope: "user",
|
|
924
|
+
source: "clio-coder",
|
|
925
|
+
origin: "config",
|
|
926
|
+
precedence: SKILL_PRECEDENCE.user,
|
|
927
|
+
trusted: true,
|
|
928
|
+
containment: home
|
|
929
|
+
});
|
|
930
|
+
}
|
|
931
|
+
for (const kind of INTEROP_AGENT_KINDS) {
|
|
932
|
+
if (kind.projectSkillRoot === void 0 || kind.skillSource === void 0) continue;
|
|
933
|
+
roots.push({
|
|
934
|
+
path: path4.join(cwd, kind.projectSkillRoot),
|
|
935
|
+
scope: "project",
|
|
936
|
+
source: kind.skillSource,
|
|
937
|
+
origin: `${kind.skillSource}-project`,
|
|
938
|
+
precedence: SKILL_PRECEDENCE.projectCompat,
|
|
939
|
+
trusted: trustProject,
|
|
940
|
+
containment: cwd
|
|
941
|
+
});
|
|
942
|
+
}
|
|
943
|
+
roots.push({
|
|
944
|
+
path: path4.join(cwd, ".clio-coder", "skills"),
|
|
945
|
+
scope: "project",
|
|
946
|
+
source: "clio-coder",
|
|
947
|
+
origin: "project",
|
|
948
|
+
precedence: SKILL_PRECEDENCE.project,
|
|
949
|
+
trusted: true,
|
|
950
|
+
containment: cwd
|
|
951
|
+
});
|
|
952
|
+
return roots;
|
|
953
|
+
}
|
|
954
|
+
function clioConfigDirSafe() {
|
|
955
|
+
try {
|
|
956
|
+
return clioConfigDir();
|
|
957
|
+
} catch {
|
|
958
|
+
return null;
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
function splitSkillFrontmatter(raw) {
|
|
962
|
+
const split = splitYamlFrontmatter(raw);
|
|
963
|
+
if (!split.ok && split.reason === "missing") {
|
|
964
|
+
throw new Error("skill file is missing YAML frontmatter");
|
|
965
|
+
}
|
|
966
|
+
if (!split.ok && split.reason === "missing closing delimiter") {
|
|
967
|
+
throw new Error("skill file is missing a closing YAML frontmatter delimiter");
|
|
968
|
+
}
|
|
969
|
+
if (!split.ok && split.reason === "must be a YAML object") {
|
|
970
|
+
throw new Error("skill frontmatter must be a YAML object");
|
|
971
|
+
}
|
|
972
|
+
if (!split.ok) throw new Error(`skill frontmatter is ${split.reason}`);
|
|
973
|
+
return split;
|
|
974
|
+
}
|
|
975
|
+
function booleanField(frontmatter, key) {
|
|
976
|
+
return frontmatter[key] === true;
|
|
977
|
+
}
|
|
978
|
+
function rawToolListField(frontmatter, key) {
|
|
979
|
+
const raw = frontmatter[key];
|
|
980
|
+
const entries = typeof raw === "string" ? raw.split(",") : Array.isArray(raw) ? raw.filter((entry) => typeof entry === "string") : null;
|
|
981
|
+
if (entries === null) return void 0;
|
|
982
|
+
const tools = entries.map((entry) => entry.trim()).filter((entry) => entry.length > 0);
|
|
983
|
+
return tools.length > 0 ? [...new Set(tools)] : void 0;
|
|
984
|
+
}
|
|
985
|
+
var TOOL_NAMES_BY_LOWERCASE = new Map(Object.values(ToolNames).map((name) => [name.toLowerCase(), name]));
|
|
986
|
+
function resolveDeclaredTools(declared) {
|
|
987
|
+
const tools = [];
|
|
988
|
+
const unrecognized = [];
|
|
989
|
+
for (const entry of declared) {
|
|
990
|
+
const resolved = TOOL_NAMES_BY_LOWERCASE.get(entry.toLowerCase());
|
|
991
|
+
if (resolved === void 0) unrecognized.push(entry);
|
|
992
|
+
else if (!tools.includes(resolved)) tools.push(resolved);
|
|
993
|
+
}
|
|
994
|
+
return { tools, unrecognized };
|
|
995
|
+
}
|
|
996
|
+
function declaredToolSurface(frontmatter, key, filePath, diagnostics) {
|
|
997
|
+
const declared = rawToolListField(frontmatter, key);
|
|
998
|
+
if (declared === void 0) return void 0;
|
|
999
|
+
const { tools, unrecognized } = resolveDeclaredTools(declared);
|
|
1000
|
+
if (unrecognized.length > 0) {
|
|
1001
|
+
diagnostics.push({
|
|
1002
|
+
type: "warning",
|
|
1003
|
+
message: `${key} names ${unrecognized.length === 1 ? "a tool" : "tools"} Clio does not have: ${unrecognized.join(", ")}`,
|
|
1004
|
+
path: filePath
|
|
1005
|
+
});
|
|
1006
|
+
}
|
|
1007
|
+
if (tools.length === 0 && key === "allowed-tools") {
|
|
1008
|
+
diagnostics.push({
|
|
1009
|
+
type: "warning",
|
|
1010
|
+
message: "allowed-tools names no tool Clio has, so it narrows nothing; declare Clio tool names to confine this skill",
|
|
1011
|
+
path: filePath
|
|
1012
|
+
});
|
|
1013
|
+
return void 0;
|
|
1014
|
+
}
|
|
1015
|
+
return tools.length > 0 ? tools : void 0;
|
|
1016
|
+
}
|
|
1017
|
+
function validationSubject(filePath) {
|
|
1018
|
+
return path4.basename(filePath) === "SKILL.md" ? path4.basename(path4.dirname(filePath)) : path4.basename(filePath, ".md");
|
|
1019
|
+
}
|
|
1020
|
+
function validateNameFormat(name) {
|
|
1021
|
+
const errors = [];
|
|
1022
|
+
if (name.length > MAX_NAME_LENGTH) errors.push(`name exceeds ${MAX_NAME_LENGTH} characters (${name.length})`);
|
|
1023
|
+
if (!/^[a-z0-9-]+$/.test(name)) {
|
|
1024
|
+
errors.push("name contains invalid characters (must be lowercase a-z, 0-9, hyphens only)");
|
|
1025
|
+
}
|
|
1026
|
+
if (name.startsWith("-") || name.endsWith("-")) errors.push("name must not start or end with a hyphen");
|
|
1027
|
+
if (name.includes("--")) errors.push("name must not contain consecutive hyphens");
|
|
1028
|
+
return errors;
|
|
1029
|
+
}
|
|
1030
|
+
function validateDescription(description) {
|
|
1031
|
+
if (!description) return ["description is required"];
|
|
1032
|
+
if (description.length > MAX_DESCRIPTION_LENGTH) {
|
|
1033
|
+
return [`description exceeds ${MAX_DESCRIPTION_LENGTH} characters (${description.length})`];
|
|
1034
|
+
}
|
|
1035
|
+
return [];
|
|
1036
|
+
}
|
|
1037
|
+
function warnLegacySkillMetadata(filePath) {
|
|
1038
|
+
warnLegacyNaming(`clio: skill metadata in ${filePath}`, "clio-coder: skill metadata");
|
|
1039
|
+
}
|
|
1040
|
+
function extractMetadata(frontmatter, filePath) {
|
|
1041
|
+
const metadata = {};
|
|
1042
|
+
for (const [key, value] of Object.entries(frontmatter)) {
|
|
1043
|
+
if (CORE_FRONTMATTER_KEYS.has(key)) continue;
|
|
1044
|
+
if (key === "clio-coder") {
|
|
1045
|
+
metadata.clioCoder = value;
|
|
1046
|
+
continue;
|
|
1047
|
+
}
|
|
1048
|
+
if (key === "clio") {
|
|
1049
|
+
warnLegacySkillMetadata(filePath);
|
|
1050
|
+
if (!("clio-coder" in frontmatter)) metadata.clioCoder = value;
|
|
1051
|
+
continue;
|
|
1052
|
+
}
|
|
1053
|
+
metadata[key] = value;
|
|
1054
|
+
}
|
|
1055
|
+
return metadata;
|
|
1056
|
+
}
|
|
1057
|
+
function extractProvenance(frontmatter, filePath) {
|
|
1058
|
+
const canonicalRaw = frontmatter["clio-coder"];
|
|
1059
|
+
const legacyRaw = frontmatter.clio;
|
|
1060
|
+
if (legacyRaw !== void 0) warnLegacySkillMetadata(filePath);
|
|
1061
|
+
const clioCoderRaw = canonicalRaw ?? legacyRaw;
|
|
1062
|
+
const clioCoder = clioCoderRaw !== null && typeof clioCoderRaw === "object" && !Array.isArray(clioCoderRaw) ? clioCoderRaw : void 0;
|
|
1063
|
+
const field = (...keys) => {
|
|
1064
|
+
for (const key of keys) {
|
|
1065
|
+
if (clioCoder) {
|
|
1066
|
+
const nested = stringField(clioCoder, key);
|
|
1067
|
+
if (nested !== null) return nested;
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
for (const key of keys) {
|
|
1071
|
+
const flat = stringField(frontmatter, key);
|
|
1072
|
+
if (flat !== null) return flat;
|
|
1073
|
+
}
|
|
1074
|
+
return null;
|
|
1075
|
+
};
|
|
1076
|
+
const installUrl = field("source-url", "sourceUrl", "install-url");
|
|
1077
|
+
const registryId = field("registry-id", "registryId");
|
|
1078
|
+
const registryUrl = field("registry-url", "registryUrl");
|
|
1079
|
+
const installedAt = field("installed-at", "installedAt");
|
|
1080
|
+
const updatedAt = field("updated-at", "updatedAt");
|
|
1081
|
+
const installedHash = field("installed-hash", "installedHash");
|
|
1082
|
+
const auditRaw = field("audit");
|
|
1083
|
+
const audit = auditRaw === "pass" || auditRaw === "warn" || auditRaw === "fail" || auditRaw === "unknown" ? auditRaw : void 0;
|
|
1084
|
+
const installedByRaw = field("installed-by", "installedBy");
|
|
1085
|
+
const installedBy = installedByRaw === "worker" ? installedByRaw : void 0;
|
|
1086
|
+
if (!installUrl && !registryId && !registryUrl && !installedAt && !updatedAt && !installedHash && !audit && !installedBy)
|
|
1087
|
+
return void 0;
|
|
1088
|
+
return {
|
|
1089
|
+
...installUrl ? { installUrl } : {},
|
|
1090
|
+
...registryId ? { registryId } : {},
|
|
1091
|
+
...registryUrl ? { registryUrl } : {},
|
|
1092
|
+
...installedAt ? { installedAt } : {},
|
|
1093
|
+
...updatedAt ? { updatedAt } : {},
|
|
1094
|
+
...installedHash ? { installedHash } : {},
|
|
1095
|
+
...audit ? { audit } : {},
|
|
1096
|
+
...installedBy ? { installedBy } : {}
|
|
1097
|
+
};
|
|
1098
|
+
}
|
|
1099
|
+
function canonicalizePath(filePath) {
|
|
1100
|
+
try {
|
|
1101
|
+
return realpathSync2.native(filePath);
|
|
1102
|
+
} catch {
|
|
1103
|
+
return path4.resolve(filePath);
|
|
1104
|
+
}
|
|
1105
|
+
}
|
|
1106
|
+
function pathIsInside(candidate, anchor) {
|
|
1107
|
+
return candidate === anchor || candidate.startsWith(anchor + path4.sep);
|
|
1108
|
+
}
|
|
1109
|
+
function containmentAnchor(root) {
|
|
1110
|
+
if (root.containment === void 0) return null;
|
|
1111
|
+
const anchor = canonicalizePath(root.containment);
|
|
1112
|
+
const rootReal = canonicalizePath(root.path);
|
|
1113
|
+
return pathIsInside(rootReal, anchor) ? anchor : rootReal;
|
|
1114
|
+
}
|
|
1115
|
+
function escapesContainment(fullPath, anchor, diagnostics) {
|
|
1116
|
+
if (anchor === null) return false;
|
|
1117
|
+
const resolved = canonicalizePath(fullPath);
|
|
1118
|
+
if (pathIsInside(resolved, anchor)) return false;
|
|
1119
|
+
diagnostics.push({
|
|
1120
|
+
type: "warning",
|
|
1121
|
+
message: `skill path resolves to ${resolved}, outside ${anchor}; a skill root may not leave its scope through a symlink`,
|
|
1122
|
+
path: fullPath
|
|
1123
|
+
});
|
|
1124
|
+
return true;
|
|
1125
|
+
}
|
|
1126
|
+
function loadSkillFile(filePath, root) {
|
|
1127
|
+
const diagnostics = [];
|
|
1128
|
+
let bytes;
|
|
1129
|
+
try {
|
|
1130
|
+
bytes = readFileSync3(filePath);
|
|
1131
|
+
} catch (err) {
|
|
1132
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
1133
|
+
return {
|
|
1134
|
+
candidate: null,
|
|
1135
|
+
diagnostics: [{ type: "warning", message: `skill file could not be read: ${reason}`, path: filePath }]
|
|
1136
|
+
};
|
|
1137
|
+
}
|
|
1138
|
+
if (bytes.byteLength > MAX_SKILL_BYTES) {
|
|
1139
|
+
return {
|
|
1140
|
+
candidate: null,
|
|
1141
|
+
diagnostics: [
|
|
1142
|
+
{
|
|
1143
|
+
type: "warning",
|
|
1144
|
+
message: `skill file is ${bytes.byteLength} bytes, over the ${MAX_SKILL_BYTES}-byte limit for a SKILL.md`,
|
|
1145
|
+
path: filePath
|
|
1146
|
+
}
|
|
1147
|
+
]
|
|
1148
|
+
};
|
|
1149
|
+
}
|
|
1150
|
+
const raw = bytes.toString("utf8");
|
|
1151
|
+
if (bytes.includes(0) || !Buffer.from(raw, "utf8").equals(bytes)) {
|
|
1152
|
+
return {
|
|
1153
|
+
candidate: null,
|
|
1154
|
+
diagnostics: [
|
|
1155
|
+
{
|
|
1156
|
+
type: "warning",
|
|
1157
|
+
message: "skill file is not valid UTF-8 text; a SKILL.md is a document, not a binary payload",
|
|
1158
|
+
path: filePath
|
|
1159
|
+
}
|
|
1160
|
+
]
|
|
1161
|
+
};
|
|
1162
|
+
}
|
|
1163
|
+
if (bytes.byteLength > SKILL_ACTIVATION_BODY_CAP_BYTES) {
|
|
1164
|
+
diagnostics.push({
|
|
1165
|
+
type: "warning",
|
|
1166
|
+
message: `skill file is ${bytes.byteLength} bytes; activation delivers at most ${SKILL_ACTIVATION_BODY_CAP_BYTES}, so the model will not be shown the rest`,
|
|
1167
|
+
path: filePath
|
|
1168
|
+
});
|
|
1169
|
+
}
|
|
1170
|
+
let parsed;
|
|
1171
|
+
try {
|
|
1172
|
+
parsed = splitSkillFrontmatter(raw);
|
|
1173
|
+
} catch (err) {
|
|
1174
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
1175
|
+
return { candidate: null, diagnostics: [{ type: "warning", message: reason, path: filePath }] };
|
|
1176
|
+
}
|
|
1177
|
+
const pathSubject = validationSubject(filePath);
|
|
1178
|
+
const frontmatterName = stringField(parsed.frontmatter, "name");
|
|
1179
|
+
const rawName = frontmatterName ?? pathSubject;
|
|
1180
|
+
const name = rawName === "clio-dev" ? "clio-coder-dev" : rawName === "clio-test" ? "clio-coder-test" : rawName;
|
|
1181
|
+
if (name !== rawName) warnLegacyNaming(rawName, name);
|
|
1182
|
+
const description = stringField(parsed.frontmatter, "description");
|
|
1183
|
+
for (const message of validateDescription(description)) diagnostics.push({ type: "warning", message, path: filePath });
|
|
1184
|
+
if (frontmatterName && frontmatterName !== pathSubject) {
|
|
1185
|
+
diagnostics.push({
|
|
1186
|
+
type: "warning",
|
|
1187
|
+
message: `name "${frontmatterName}" differs from path subject "${pathSubject}"; using frontmatter name`,
|
|
1188
|
+
path: filePath
|
|
1189
|
+
});
|
|
1190
|
+
}
|
|
1191
|
+
for (const message of validateNameFormat(name)) diagnostics.push({ type: "warning", message, path: filePath });
|
|
1192
|
+
if (!description) return { candidate: null, diagnostics };
|
|
1193
|
+
const baseDir = path4.dirname(filePath);
|
|
1194
|
+
const scope = root.scope;
|
|
1195
|
+
const sourceInfo = {
|
|
1196
|
+
path: filePath,
|
|
1197
|
+
scope,
|
|
1198
|
+
...root.origin ? { source: root.origin } : {}
|
|
1199
|
+
};
|
|
1200
|
+
const provenance = extractProvenance(parsed.frontmatter, filePath);
|
|
1201
|
+
const allowedTools = declaredToolSurface(parsed.frontmatter, "allowed-tools", filePath, diagnostics);
|
|
1202
|
+
const disallowedTools = declaredToolSurface(parsed.frontmatter, "disallowed-tools", filePath, diagnostics);
|
|
1203
|
+
let content;
|
|
1204
|
+
try {
|
|
1205
|
+
content = resolvePackageReferences(parsed.body.trim(), root);
|
|
1206
|
+
} catch (error) {
|
|
1207
|
+
diagnostics.push({ type: "warning", message: String(error), path: filePath });
|
|
1208
|
+
return { candidate: null, diagnostics };
|
|
1209
|
+
}
|
|
1210
|
+
const skill = {
|
|
1211
|
+
name,
|
|
1212
|
+
description,
|
|
1213
|
+
filePath,
|
|
1214
|
+
baseDir,
|
|
1215
|
+
content,
|
|
1216
|
+
sourceInfo,
|
|
1217
|
+
disableModelInvocation: booleanField(parsed.frontmatter, "disable-model-invocation"),
|
|
1218
|
+
...allowedTools ? { allowedTools } : {},
|
|
1219
|
+
...disallowedTools ? { disallowedTools } : {},
|
|
1220
|
+
source: root.source ?? "clio-coder",
|
|
1221
|
+
scope,
|
|
1222
|
+
hash: sha256(raw),
|
|
1223
|
+
normalizedHash: normalizedSkillHash(raw),
|
|
1224
|
+
pathSubject,
|
|
1225
|
+
trusted: root.trusted ?? true,
|
|
1226
|
+
precedence: root.precedence ?? defaultPrecedenceForScope(scope),
|
|
1227
|
+
metadata: extractMetadata(parsed.frontmatter, filePath),
|
|
1228
|
+
diagnostics,
|
|
1229
|
+
...provenance ? { provenance } : {}
|
|
1230
|
+
};
|
|
1231
|
+
return { candidate: { skill, canonicalPath: canonicalizePath(filePath) }, diagnostics };
|
|
1232
|
+
}
|
|
1233
|
+
function isSkillMarkdownFile(entryName) {
|
|
1234
|
+
return entryName === "SKILL.md" || entryName.endsWith(".md");
|
|
1235
|
+
}
|
|
1236
|
+
function collectSkills(root, dir, diagnostics, includeRootFiles, anchor = containmentAnchor(root)) {
|
|
1237
|
+
if (!existsSync3(dir)) return [];
|
|
1238
|
+
if (escapesContainment(dir, anchor, diagnostics)) return [];
|
|
1239
|
+
let entries;
|
|
1240
|
+
try {
|
|
1241
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
1242
|
+
} catch (err) {
|
|
1243
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
1244
|
+
diagnostics.push({ type: "warning", message: `skill root could not be read: ${reason}`, path: dir });
|
|
1245
|
+
return [];
|
|
1246
|
+
}
|
|
1247
|
+
const skillEntry = entries.find((entry) => entry.name === "SKILL.md" && entry.isFile());
|
|
1248
|
+
if (skillEntry) {
|
|
1249
|
+
const skillPath = path4.join(dir, skillEntry.name);
|
|
1250
|
+
if (escapesContainment(skillPath, anchor, diagnostics)) return [];
|
|
1251
|
+
const loaded = loadSkillFile(skillPath, root);
|
|
1252
|
+
diagnostics.push(...loaded.diagnostics);
|
|
1253
|
+
return loaded.candidate ? [loaded.candidate] : [];
|
|
1254
|
+
}
|
|
1255
|
+
const candidates = [];
|
|
1256
|
+
for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
1257
|
+
if (entry.name.startsWith(".") || entry.name === "node_modules") continue;
|
|
1258
|
+
const fullPath = path4.join(dir, entry.name);
|
|
1259
|
+
if (entry.isDirectory() || entry.isSymbolicLink() && existsSync3(path4.join(fullPath, "SKILL.md"))) {
|
|
1260
|
+
candidates.push(...collectSkills(root, fullPath, diagnostics, false, anchor));
|
|
1261
|
+
continue;
|
|
1262
|
+
}
|
|
1263
|
+
if (!includeRootFiles || !entry.isFile() && !entry.isSymbolicLink() || !isSkillMarkdownFile(entry.name)) continue;
|
|
1264
|
+
if (escapesContainment(fullPath, anchor, diagnostics)) continue;
|
|
1265
|
+
const loaded = loadSkillFile(fullPath, root);
|
|
1266
|
+
diagnostics.push(...loaded.diagnostics);
|
|
1267
|
+
if (loaded.candidate) candidates.push(loaded.candidate);
|
|
1268
|
+
}
|
|
1269
|
+
return candidates;
|
|
1270
|
+
}
|
|
1271
|
+
function loadSkillRoot(root, diagnostics) {
|
|
1272
|
+
const entries = readRootEntries(root, "skill", diagnostics);
|
|
1273
|
+
if (entries.length === 0) return [];
|
|
1274
|
+
return collectSkills(root, root.path, diagnostics, true);
|
|
1275
|
+
}
|
|
1276
|
+
function explicitSkillRoot(filePath) {
|
|
1277
|
+
return {
|
|
1278
|
+
path: filePath,
|
|
1279
|
+
scope: "cli",
|
|
1280
|
+
source: "path",
|
|
1281
|
+
origin: "explicit-path",
|
|
1282
|
+
precedence: SKILL_PRECEDENCE.cli,
|
|
1283
|
+
trusted: true
|
|
1284
|
+
};
|
|
1285
|
+
}
|
|
1286
|
+
function loadExplicitSkillPath(inputPath, diagnostics, packageRoots, cwd) {
|
|
1287
|
+
const resolved = path4.resolve(inputPath);
|
|
1288
|
+
const identity = canonicalizePath(resolved);
|
|
1289
|
+
const owner = packageRoots.find((candidate) => {
|
|
1290
|
+
const relative = path4.relative(canonicalizePath(candidate.path), identity);
|
|
1291
|
+
return relative !== ".." && !relative.startsWith(`..${path4.sep}`) && !path4.isAbsolute(relative);
|
|
1292
|
+
});
|
|
1293
|
+
if (!owner && ["user", "project"].some((scope) => {
|
|
1294
|
+
const relative = path4.relative(canonicalizePath(pluginBaseDir(scope, cwd)), identity);
|
|
1295
|
+
return relative !== ".." && !relative.startsWith(`..${path4.sep}`) && !path4.isAbsolute(relative);
|
|
1296
|
+
})) {
|
|
1297
|
+
diagnostics.push({
|
|
1298
|
+
type: "warning",
|
|
1299
|
+
message: "explicit skill belongs to an inactive or undeclared plugin resource",
|
|
1300
|
+
path: resolved
|
|
1301
|
+
});
|
|
1302
|
+
return [];
|
|
1303
|
+
}
|
|
1304
|
+
const root = {
|
|
1305
|
+
...explicitSkillRoot(resolved),
|
|
1306
|
+
...owner ? {
|
|
1307
|
+
...owner.rootPath ? { rootPath: owner.rootPath, containment: owner.rootPath } : {},
|
|
1308
|
+
...owner.plugin !== void 0 ? { plugin: owner.plugin } : {},
|
|
1309
|
+
trusted: owner.trusted
|
|
1310
|
+
} : {}
|
|
1311
|
+
};
|
|
1312
|
+
if (!existsSync3(resolved)) {
|
|
1313
|
+
diagnostics.push({ type: "warning", message: `explicit skill path does not exist: ${resolved}`, path: resolved });
|
|
1314
|
+
return [];
|
|
1315
|
+
}
|
|
1316
|
+
const skillFile = path4.basename(resolved) === "SKILL.md" || resolved.endsWith(".md") ? resolved : path4.join(resolved, "SKILL.md");
|
|
1317
|
+
if (!existsSync3(skillFile)) {
|
|
1318
|
+
const packages = collectSkills(root, resolved, diagnostics, false);
|
|
1319
|
+
if (packages.length > 0) return packages;
|
|
1320
|
+
diagnostics.push({
|
|
1321
|
+
type: "warning",
|
|
1322
|
+
message: `explicit skill path is not a SKILL.md file, skill directory, or catalog of skill packages: ${resolved}`,
|
|
1323
|
+
path: resolved
|
|
1324
|
+
});
|
|
1325
|
+
return [];
|
|
1326
|
+
}
|
|
1327
|
+
const loaded = loadSkillFile(skillFile, root);
|
|
1328
|
+
diagnostics.push(...loaded.diagnostics);
|
|
1329
|
+
return loaded.candidate ? [loaded.candidate] : [];
|
|
1330
|
+
}
|
|
1331
|
+
function compareSkillCandidates(a, b) {
|
|
1332
|
+
const trust = Number(a.trusted) - Number(b.trusted);
|
|
1333
|
+
if (trust !== 0) return trust;
|
|
1334
|
+
const precedence = a.precedence - b.precedence;
|
|
1335
|
+
if (precedence !== 0) return precedence;
|
|
1336
|
+
const rank = interopSourceRank(b.source) - interopSourceRank(a.source);
|
|
1337
|
+
if (rank !== 0) return rank;
|
|
1338
|
+
return a.filePath.localeCompare(b.filePath);
|
|
1339
|
+
}
|
|
1340
|
+
function dedupeCanonicalSkillPaths(candidates, diagnostics) {
|
|
1341
|
+
const byPath = /* @__PURE__ */ new Map();
|
|
1342
|
+
for (const candidate of candidates) {
|
|
1343
|
+
const list = byPath.get(candidate.canonicalPath) ?? [];
|
|
1344
|
+
list.push(candidate);
|
|
1345
|
+
byPath.set(candidate.canonicalPath, list);
|
|
1346
|
+
}
|
|
1347
|
+
const winners = [];
|
|
1348
|
+
for (const entries of byPath.values()) {
|
|
1349
|
+
if (entries.length === 1) {
|
|
1350
|
+
const only = entries[0];
|
|
1351
|
+
if (only) winners.push(only);
|
|
1352
|
+
continue;
|
|
1353
|
+
}
|
|
1354
|
+
const sorted = [...entries].sort((a, b) => compareSkillCandidates(a.skill, b.skill));
|
|
1355
|
+
const winner = sorted[sorted.length - 1];
|
|
1356
|
+
if (!winner) continue;
|
|
1357
|
+
winners.push(winner);
|
|
1358
|
+
for (const loser of sorted.slice(0, -1)) {
|
|
1359
|
+
diagnostics.push({
|
|
1360
|
+
type: "warning",
|
|
1361
|
+
message: `${loser.skill.name} at ${loser.skill.filePath} resolves to the same canonical skill file as ${winner.skill.filePath}, which is the entry in use`,
|
|
1362
|
+
path: loser.skill.filePath
|
|
1363
|
+
});
|
|
1364
|
+
}
|
|
1365
|
+
}
|
|
1366
|
+
return winners;
|
|
1367
|
+
}
|
|
1368
|
+
function resolveSkillCollisions(candidates) {
|
|
1369
|
+
const byName = /* @__PURE__ */ new Map();
|
|
1370
|
+
for (const candidate of candidates) {
|
|
1371
|
+
const key = candidate.skill.name.trim();
|
|
1372
|
+
if (key.length === 0) continue;
|
|
1373
|
+
const list = byName.get(key) ?? [];
|
|
1374
|
+
list.push(candidate);
|
|
1375
|
+
byName.set(key, list);
|
|
1376
|
+
}
|
|
1377
|
+
const winners = [];
|
|
1378
|
+
const diagnostics = [];
|
|
1379
|
+
for (const [name, entries] of byName.entries()) {
|
|
1380
|
+
const sorted = [...entries].sort((a, b) => compareSkillCandidates(a.skill, b.skill));
|
|
1381
|
+
const winner = sorted[sorted.length - 1];
|
|
1382
|
+
if (!winner) continue;
|
|
1383
|
+
winners.push(winner.skill);
|
|
1384
|
+
for (const loser of sorted.slice(0, -1)) {
|
|
1385
|
+
diagnostics.push({
|
|
1386
|
+
type: "collision",
|
|
1387
|
+
message: `${name} from ${winner.skill.source}/${winner.skill.scope} overrides ${loser.skill.source}/${loser.skill.scope}`,
|
|
1388
|
+
path: loser.skill.filePath,
|
|
1389
|
+
collision: {
|
|
1390
|
+
name,
|
|
1391
|
+
winnerPath: winner.skill.filePath,
|
|
1392
|
+
loserPath: loser.skill.filePath,
|
|
1393
|
+
winnerScope: winner.skill.scope,
|
|
1394
|
+
loserScope: loser.skill.scope
|
|
1395
|
+
}
|
|
1396
|
+
});
|
|
1397
|
+
}
|
|
1398
|
+
}
|
|
1399
|
+
return { winners, diagnostics };
|
|
1400
|
+
}
|
|
1401
|
+
function requiresDiagnostics(winners) {
|
|
1402
|
+
const names = new Set(winners.map((skill) => skill.name));
|
|
1403
|
+
const out = [];
|
|
1404
|
+
for (const skill of winners) {
|
|
1405
|
+
const requires = skill.metadata.requires;
|
|
1406
|
+
if (!Array.isArray(requires)) continue;
|
|
1407
|
+
for (const entry of requires) {
|
|
1408
|
+
if (typeof entry !== "string" || !entry.startsWith("skill:")) continue;
|
|
1409
|
+
const dep = entry.slice("skill:".length).trim();
|
|
1410
|
+
if (dep.length === 0 || names.has(dep)) continue;
|
|
1411
|
+
out.push({
|
|
1412
|
+
type: "warning",
|
|
1413
|
+
message: `${skill.name} requires skill "${dep}" which is not available`,
|
|
1414
|
+
path: skill.filePath
|
|
1415
|
+
});
|
|
1416
|
+
}
|
|
1417
|
+
}
|
|
1418
|
+
return out;
|
|
1419
|
+
}
|
|
1420
|
+
function loadSkills(input = {}) {
|
|
1421
|
+
const roots = input.roots ?? (input.disableDiscovery === true ? [] : defaultSkillRoots(input));
|
|
1422
|
+
const diagnostics = [];
|
|
1423
|
+
const packageRoots = (input.explicitSkillPaths?.length ?? 0) > 0 ? defaultSkillRoots(input).filter((root) => root.scope === "package") : [];
|
|
1424
|
+
const candidates = [
|
|
1425
|
+
...roots.flatMap((root) => loadSkillRoot(root, diagnostics)),
|
|
1426
|
+
...(input.explicitSkillPaths ?? []).flatMap(
|
|
1427
|
+
(skillPath) => loadExplicitSkillPath(skillPath, diagnostics, packageRoots, input.cwd ?? process.cwd())
|
|
1428
|
+
)
|
|
1429
|
+
];
|
|
1430
|
+
const deduped = dedupeCanonicalSkillPaths(candidates, diagnostics);
|
|
1431
|
+
const resolved = resolveSkillCollisions(deduped);
|
|
1432
|
+
const winners = [...resolved.winners].sort((a, b) => a.name.localeCompare(b.name));
|
|
1433
|
+
return {
|
|
1434
|
+
items: winners,
|
|
1435
|
+
diagnostics: [...diagnostics, ...resolved.diagnostics, ...requiresDiagnostics(winners)]
|
|
1436
|
+
};
|
|
1437
|
+
}
|
|
1438
|
+
function modelVisibleSkills(skills) {
|
|
1439
|
+
return skills.filter((skill) => skill.trusted && !skill.disableModelInvocation);
|
|
1440
|
+
}
|
|
1441
|
+
function skillCatalogValidity(list) {
|
|
1442
|
+
if (list.diagnostics.some((diag) => diag.type === "error")) return { ok: false, reason: "load-error" };
|
|
1443
|
+
if (list.diagnostics.some((diag) => diag.type === "collision")) return { ok: false, reason: "collision" };
|
|
1444
|
+
const loadedPaths = new Set(list.items.map((skill) => skill.filePath));
|
|
1445
|
+
const unloadable = list.diagnostics.some(
|
|
1446
|
+
(diag) => diag.type === "warning" && diag.path !== void 0 && !loadedPaths.has(diag.path)
|
|
1447
|
+
);
|
|
1448
|
+
if (unloadable) return { ok: false, reason: "unloadable-file" };
|
|
1449
|
+
if (list.items.length === 0) return { ok: false, reason: "no-skills" };
|
|
1450
|
+
return { ok: true, reason: null };
|
|
1451
|
+
}
|
|
1452
|
+
var SKILL_SURFACE_CLEAR_ARG = "off";
|
|
1453
|
+
function parseSkillCommand(input) {
|
|
1454
|
+
const trimmed = input.trim();
|
|
1455
|
+
if (!trimmed.startsWith("/skill ")) return null;
|
|
1456
|
+
const rest = trimmed.slice("/skill ".length).trim();
|
|
1457
|
+
const separator = rest.search(/\s/);
|
|
1458
|
+
const name = separator === -1 ? rest : rest.slice(0, separator);
|
|
1459
|
+
if (name.length === 0) return null;
|
|
1460
|
+
const args = separator === -1 ? "" : rest.slice(separator).trim();
|
|
1461
|
+
return { name, args };
|
|
1462
|
+
}
|
|
1463
|
+
function expandSkillInvocationInput(input, skills, _options = {}) {
|
|
1464
|
+
const command = parseSkillCommand(input);
|
|
1465
|
+
if (!command) return { expanded: false, text: input, args: "", diagnostics: skills.diagnostics };
|
|
1466
|
+
const skill = skills.items.find((entry) => entry.name === command.name);
|
|
1467
|
+
const args = command.args;
|
|
1468
|
+
if (!skill) return { expanded: false, text: input, args, diagnostics: skills.diagnostics };
|
|
1469
|
+
return {
|
|
1470
|
+
expanded: true,
|
|
1471
|
+
text: args,
|
|
1472
|
+
args,
|
|
1473
|
+
skill,
|
|
1474
|
+
triggeredBy: "slash-command",
|
|
1475
|
+
diagnostics: skills.diagnostics
|
|
1476
|
+
};
|
|
1477
|
+
}
|
|
1478
|
+
function parsePendingSkillRequests(input, skills, options = {}) {
|
|
1479
|
+
const command = parseSkillCommand(input);
|
|
1480
|
+
if (command) {
|
|
1481
|
+
const name = command.name;
|
|
1482
|
+
const args = command.args;
|
|
1483
|
+
const installedSkill = skills.items.find((entry) => entry.name === name);
|
|
1484
|
+
if (installedSkill) {
|
|
1485
|
+
return {
|
|
1486
|
+
text: args,
|
|
1487
|
+
pendingSkillRequests: [
|
|
1488
|
+
{
|
|
1489
|
+
name,
|
|
1490
|
+
args,
|
|
1491
|
+
source: "slash-command",
|
|
1492
|
+
installed: true,
|
|
1493
|
+
filePath: installedSkill.filePath
|
|
1494
|
+
}
|
|
1495
|
+
]
|
|
1496
|
+
};
|
|
1497
|
+
}
|
|
1498
|
+
const marketplaceSkill = getMarketplaceSkills(options.cwd ? { cwd: options.cwd } : {}).find((s) => s.name === name);
|
|
1499
|
+
if (marketplaceSkill) {
|
|
1500
|
+
return {
|
|
1501
|
+
text: args,
|
|
1502
|
+
pendingSkillRequests: [
|
|
1503
|
+
{
|
|
1504
|
+
name,
|
|
1505
|
+
args,
|
|
1506
|
+
source: "marketplace",
|
|
1507
|
+
installed: false,
|
|
1508
|
+
marketplaceRef: marketplaceSkill.sourceUrl
|
|
1509
|
+
}
|
|
1510
|
+
]
|
|
1511
|
+
};
|
|
1512
|
+
}
|
|
1513
|
+
return {
|
|
1514
|
+
text: args,
|
|
1515
|
+
pendingSkillRequests: [
|
|
1516
|
+
{
|
|
1517
|
+
name,
|
|
1518
|
+
args,
|
|
1519
|
+
source: "slash-command",
|
|
1520
|
+
installed: false
|
|
1521
|
+
}
|
|
1522
|
+
]
|
|
1523
|
+
};
|
|
1524
|
+
}
|
|
1525
|
+
return {
|
|
1526
|
+
text: input,
|
|
1527
|
+
pendingSkillRequests: []
|
|
1528
|
+
};
|
|
1529
|
+
}
|
|
1530
|
+
|
|
1531
|
+
// src/domains/resources/skills/marketplace.ts
|
|
1532
|
+
var MARKETPLACE_UNCONFIGURED = "no local skill marketplace catalog or index configured";
|
|
1533
|
+
function packageCatalogDir() {
|
|
1534
|
+
try {
|
|
1535
|
+
return path5.join(resolvePackageRoot(), "library", "skills");
|
|
1536
|
+
} catch {
|
|
1537
|
+
return null;
|
|
1538
|
+
}
|
|
1539
|
+
}
|
|
1540
|
+
function packageIndexPath() {
|
|
1541
|
+
try {
|
|
1542
|
+
return path5.join(resolvePackageRoot(), "library", "skills", "skill-marketplace.json");
|
|
1543
|
+
} catch {
|
|
1544
|
+
return null;
|
|
1545
|
+
}
|
|
1546
|
+
}
|
|
1547
|
+
function defaultIndexPath() {
|
|
1548
|
+
try {
|
|
1549
|
+
const configured = path5.join(clioConfigDir(), "skill-marketplace.json");
|
|
1550
|
+
if (existsSync4(configured)) return configured;
|
|
1551
|
+
} catch {
|
|
1552
|
+
}
|
|
1553
|
+
const bundled = packageIndexPath();
|
|
1554
|
+
return bundled && existsSync4(bundled) ? bundled : null;
|
|
1555
|
+
}
|
|
1556
|
+
function isIndexSkill(value) {
|
|
1557
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) return false;
|
|
1558
|
+
const record = value;
|
|
1559
|
+
return typeof record.name === "string" && record.name.trim().length > 0 && typeof record.description === "string" && typeof record.sourceUrl === "string" && record.sourceUrl.trim().length > 0;
|
|
1560
|
+
}
|
|
1561
|
+
function optionalString(value) {
|
|
1562
|
+
return typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
|
|
1563
|
+
}
|
|
1564
|
+
function optionalTriggerList(value) {
|
|
1565
|
+
if (!Array.isArray(value)) return void 0;
|
|
1566
|
+
const triggers = value.filter((entry) => typeof entry === "string").map((entry) => entry.trim()).filter((entry) => entry.length > 0);
|
|
1567
|
+
return triggers.length > 0 ? triggers : void 0;
|
|
1568
|
+
}
|
|
1569
|
+
function indexAudit(value) {
|
|
1570
|
+
return value === "pass" || value === "warn" || value === "fail" || value === "unknown" ? value : void 0;
|
|
1571
|
+
}
|
|
1572
|
+
function parseMarketplaceIndex(indexPath, diagnostics = []) {
|
|
1573
|
+
try {
|
|
1574
|
+
const parsed = JSON.parse(readFileSync4(indexPath, "utf8"));
|
|
1575
|
+
const rawSkills = Array.isArray(parsed) ? parsed : parsed && typeof parsed === "object" && Array.isArray(parsed.skills) ? parsed.skills : [];
|
|
1576
|
+
return rawSkills.filter(isIndexSkill).flatMap((skill) => {
|
|
1577
|
+
const record = skill;
|
|
1578
|
+
const version = optionalString(record.version);
|
|
1579
|
+
const audit = indexAudit(record.audit);
|
|
1580
|
+
const category = optionalString(record.category);
|
|
1581
|
+
const triggers = optionalTriggerList(record.triggers);
|
|
1582
|
+
if (record.kind !== void 0 && !["skill", "agent", "prompt", "fleet"].includes(String(record.kind))) {
|
|
1583
|
+
diagnostics.push(`skill marketplace index entry has unsupported kind: ${skill.name}`);
|
|
1584
|
+
return [];
|
|
1585
|
+
}
|
|
1586
|
+
if (record.requires !== void 0 && (!Array.isArray(record.requires) || record.requires.some((entry) => typeof entry !== "string"))) {
|
|
1587
|
+
diagnostics.push(`library_requirement_malformed: ${skill.name}`);
|
|
1588
|
+
return [];
|
|
1589
|
+
}
|
|
1590
|
+
const kind = record.kind === "agent" || record.kind === "prompt" || record.kind === "fleet" ? record.kind : "skill";
|
|
1591
|
+
const requires = Array.isArray(record.requires) ? record.requires.filter((entry) => typeof entry === "string") : void 0;
|
|
1592
|
+
const overlay = optionalString(record.overlay);
|
|
1593
|
+
if (overlay && (path5.isAbsolute(overlay) || overlay.split("/").includes(".."))) {
|
|
1594
|
+
diagnostics.push(`skill marketplace index entry has an overlay outside the package: ${skill.name}`);
|
|
1595
|
+
return [];
|
|
1596
|
+
}
|
|
1597
|
+
const exclude = optionalTriggerList(record.exclude);
|
|
1598
|
+
return [
|
|
1599
|
+
{
|
|
1600
|
+
kind,
|
|
1601
|
+
name: skill.name.trim(),
|
|
1602
|
+
description: skill.description.trim(),
|
|
1603
|
+
sourceUrl: skill.sourceUrl.trim(),
|
|
1604
|
+
...version ? { version } : {},
|
|
1605
|
+
...audit ? { audit } : {},
|
|
1606
|
+
...category ? { category } : {},
|
|
1607
|
+
...triggers ? { triggers } : {},
|
|
1608
|
+
...requires ? { requires } : {},
|
|
1609
|
+
...overlay ? { overlay } : {},
|
|
1610
|
+
...exclude ? { exclude } : {},
|
|
1611
|
+
origin: "index"
|
|
1612
|
+
}
|
|
1613
|
+
];
|
|
1614
|
+
});
|
|
1615
|
+
} catch (err) {
|
|
1616
|
+
diagnostics.push(`skill marketplace index unreadable: ${err instanceof Error ? err.message : String(err)}`);
|
|
1617
|
+
return [];
|
|
1618
|
+
}
|
|
1619
|
+
}
|
|
1620
|
+
function looksLikeSkillCatalog(dir) {
|
|
1621
|
+
if (!existsSync4(dir)) return false;
|
|
1622
|
+
try {
|
|
1623
|
+
return readdirSync2(dir, { withFileTypes: true }).some((entry) => {
|
|
1624
|
+
if (!entry.isDirectory()) return false;
|
|
1625
|
+
const child = path5.join(dir, entry.name);
|
|
1626
|
+
if (existsSync4(path5.join(child, "SKILL.md"))) return true;
|
|
1627
|
+
try {
|
|
1628
|
+
return readdirSync2(child, { withFileTypes: true }).some(
|
|
1629
|
+
(inner) => inner.isDirectory() && existsSync4(path5.join(child, inner.name, "SKILL.md"))
|
|
1630
|
+
);
|
|
1631
|
+
} catch {
|
|
1632
|
+
return false;
|
|
1633
|
+
}
|
|
1634
|
+
});
|
|
1635
|
+
} catch {
|
|
1636
|
+
return false;
|
|
1637
|
+
}
|
|
1638
|
+
}
|
|
1639
|
+
function resolveCatalogDir(options) {
|
|
1640
|
+
if (options.catalogDir === null) return null;
|
|
1641
|
+
if (options.catalogDir) return path5.resolve(options.catalogDir);
|
|
1642
|
+
const fromEnv = process.env.CLIO_CODER_SKILL_CATALOG_DIR;
|
|
1643
|
+
if (fromEnv && fromEnv.trim().length > 0) return path5.resolve(fromEnv.trim());
|
|
1644
|
+
const repoLibraryCatalog = path5.join(options.cwd ?? process.cwd(), "library", "skills");
|
|
1645
|
+
if (looksLikeSkillCatalog(repoLibraryCatalog)) return repoLibraryCatalog;
|
|
1646
|
+
const repoCatalog = path5.join(options.cwd ?? process.cwd(), "skills");
|
|
1647
|
+
if (looksLikeSkillCatalog(repoCatalog)) return repoCatalog;
|
|
1648
|
+
const bundled = packageCatalogDir();
|
|
1649
|
+
return bundled && looksLikeSkillCatalog(bundled) ? bundled : null;
|
|
1650
|
+
}
|
|
1651
|
+
function catalogCategory(catalogDir, baseDir) {
|
|
1652
|
+
const rel = path5.relative(catalogDir, baseDir);
|
|
1653
|
+
const category = path5.dirname(rel);
|
|
1654
|
+
if (rel.length === 0 || rel.startsWith("..") || category === "." || category.startsWith("..")) return void 0;
|
|
1655
|
+
return category;
|
|
1656
|
+
}
|
|
1657
|
+
function catalogEntry(skill, catalogDir) {
|
|
1658
|
+
const version = typeof skill.metadata.version === "string" ? skill.metadata.version : void 0;
|
|
1659
|
+
const category = catalogCategory(catalogDir, skill.baseDir);
|
|
1660
|
+
const triggers = optionalTriggerList(skill.metadata.triggers);
|
|
1661
|
+
return {
|
|
1662
|
+
name: skill.name,
|
|
1663
|
+
description: skill.description,
|
|
1664
|
+
sourceUrl: skill.baseDir,
|
|
1665
|
+
...version ? { version } : {},
|
|
1666
|
+
...skill.provenance?.audit ? { audit: skill.provenance.audit } : {},
|
|
1667
|
+
...category ? { category } : {},
|
|
1668
|
+
...triggers ? { triggers } : {},
|
|
1669
|
+
origin: "catalog",
|
|
1670
|
+
kind: "skill"
|
|
1671
|
+
};
|
|
1672
|
+
}
|
|
1673
|
+
function catalogSkills(dir, diagnostics) {
|
|
1674
|
+
const list = loadSkills({ disableDiscovery: true, explicitSkillPaths: [dir] });
|
|
1675
|
+
for (const diag of list.diagnostics) {
|
|
1676
|
+
if (diag.type === "warning" || diag.type === "error") diagnostics.push(diag.message);
|
|
1677
|
+
}
|
|
1678
|
+
return list.items.map((skill) => catalogEntry(skill, dir));
|
|
1679
|
+
}
|
|
1680
|
+
function discoverMarketplaceSkills(options = {}) {
|
|
1681
|
+
if (options.indexPath === void 0 && options.catalogDir === void 0) {
|
|
1682
|
+
const library = discoverLibrary(options.cwd ? { cwd: options.cwd } : {});
|
|
1683
|
+
const skills2 = library.entries.filter((entry) => entry.kind === "skill" && entry.origin !== "installed").map((entry) => ({ ...entry, kind: "skill", origin: entry.origin === "index" ? "index" : "catalog" }));
|
|
1684
|
+
return { status: skills2.length ? "installable" : "unavailable", skills: skills2, diagnostics: library.diagnostics };
|
|
1685
|
+
}
|
|
1686
|
+
const diagnostics = [];
|
|
1687
|
+
const skills = [];
|
|
1688
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1689
|
+
const indexPath = options.indexPath === null ? null : options.indexPath ?? process.env.CLIO_CODER_SKILL_MARKETPLACE_INDEX ?? null;
|
|
1690
|
+
const resolvedIndexPath = indexPath ?? defaultIndexPath();
|
|
1691
|
+
const indexSkills = options.indexPath !== null && resolvedIndexPath && existsSync4(resolvedIndexPath) ? parseMarketplaceIndex(resolvedIndexPath, diagnostics) : [];
|
|
1692
|
+
const overlayNames = new Set(indexSkills.filter((skill) => skill.overlay).map((skill) => skill.name));
|
|
1693
|
+
const catalogDir = resolveCatalogDir(options);
|
|
1694
|
+
if (catalogDir) {
|
|
1695
|
+
for (const skill of catalogSkills(catalogDir, diagnostics)) {
|
|
1696
|
+
if (seen.has(skill.name) || overlayNames.has(skill.name)) continue;
|
|
1697
|
+
seen.add(skill.name);
|
|
1698
|
+
skills.push(skill);
|
|
1699
|
+
}
|
|
1700
|
+
}
|
|
1701
|
+
for (const skill of indexSkills) {
|
|
1702
|
+
if (seen.has(skill.name)) continue;
|
|
1703
|
+
seen.add(skill.name);
|
|
1704
|
+
skills.push(skill);
|
|
1705
|
+
}
|
|
1706
|
+
if (skills.length === 0 && diagnostics.length === 0) {
|
|
1707
|
+
diagnostics.push(MARKETPLACE_UNCONFIGURED);
|
|
1708
|
+
}
|
|
1709
|
+
return { status: skills.length > 0 ? "installable" : "unavailable", skills, diagnostics };
|
|
1710
|
+
}
|
|
1711
|
+
function getMarketplaceSkills(options = {}) {
|
|
1712
|
+
return discoverMarketplaceSkills(options).skills;
|
|
1713
|
+
}
|
|
1714
|
+
function marketplaceInstallShaping(skill) {
|
|
1715
|
+
const shaping = {};
|
|
1716
|
+
if (skill.overlay) shaping.overlay = path5.join(resolvePackageRoot(), skill.overlay);
|
|
1717
|
+
if (skill.exclude && skill.exclude.length > 0) shaping.exclude = [...skill.exclude];
|
|
1718
|
+
return shaping;
|
|
1719
|
+
}
|
|
1720
|
+
function resolveMarketplaceShaping(options = {}) {
|
|
1721
|
+
return (installed) => {
|
|
1722
|
+
const entry = getMarketplaceSkills(options).find(
|
|
1723
|
+
(skill) => skill.name === installed.name && skill.sourceUrl === installed.sourceUrl
|
|
1724
|
+
);
|
|
1725
|
+
if (!entry || !entry.overlay && !entry.exclude) return void 0;
|
|
1726
|
+
return marketplaceInstallShaping(entry);
|
|
1727
|
+
};
|
|
1728
|
+
}
|
|
1729
|
+
function installSkill(input) {
|
|
1730
|
+
const requested = input.source.trim();
|
|
1731
|
+
const source = requested === "clio-dev" ? "clio-coder-dev" : requested === "clio-test" ? "clio-coder-test" : requested;
|
|
1732
|
+
if (source !== requested) warnLegacyNaming(requested, source);
|
|
1733
|
+
if (input.overlay || input.exclude?.length || input.configDir)
|
|
1734
|
+
throw new Error("package installs use the prepared manifest tree and the active Clio profile");
|
|
1735
|
+
const entry = resolveLibraryPackage(source, input.cwd ? { cwd: input.cwd } : {});
|
|
1736
|
+
if (entry.kind !== "skill") throw new Error(`expected a skill package, found ${entry.kind}:${entry.name}`);
|
|
1737
|
+
if (input.name && input.name !== entry.name) throw new Error("package identities cannot be renamed at install");
|
|
1738
|
+
const plan = planLibraryInstall(entry, {
|
|
1739
|
+
...input.cwd ? { cwd: input.cwd } : {},
|
|
1740
|
+
scope: input.scope ?? "user",
|
|
1741
|
+
force: input.force ?? false
|
|
1742
|
+
});
|
|
1743
|
+
installLibraryPlan(plan);
|
|
1744
|
+
const candidate = readPluginManifest(plan.path);
|
|
1745
|
+
const component = candidate.manifest?.clio.components.find((item) => item.kind === "skill");
|
|
1746
|
+
if (!component) throw new Error("installed skill package has no skill component");
|
|
1747
|
+
return {
|
|
1748
|
+
name: entry.name,
|
|
1749
|
+
scope: input.scope ?? "user",
|
|
1750
|
+
path: pluginResourcePath(plan.path, component.path),
|
|
1751
|
+
sourceUrl: entry.sourceUrl,
|
|
1752
|
+
installedHash: plan.sha256,
|
|
1753
|
+
warnings: []
|
|
1754
|
+
};
|
|
1755
|
+
}
|
|
1756
|
+
|
|
1757
|
+
export {
|
|
1758
|
+
recipeIdFromPath,
|
|
1759
|
+
parseAgentRecipeSchema,
|
|
1760
|
+
parsePluginGithubSource,
|
|
1761
|
+
pluginLocalPath,
|
|
1762
|
+
fetchPluginSource,
|
|
1763
|
+
bundledLibraryIndexPath,
|
|
1764
|
+
libraryEntryRef,
|
|
1765
|
+
discoverLibrary,
|
|
1766
|
+
resolveLibraryRequirements,
|
|
1767
|
+
resolveInstalledLibraryEntry,
|
|
1768
|
+
registerLibraryPackage,
|
|
1769
|
+
libraryWorkspace,
|
|
1770
|
+
libraryInstallPath,
|
|
1771
|
+
libraryEntryInstalled,
|
|
1772
|
+
libraryEntryPin,
|
|
1773
|
+
classifyLibraryRequirements,
|
|
1774
|
+
planLibraryInstall,
|
|
1775
|
+
releaseLibraryPlan,
|
|
1776
|
+
commitLibraryInstallPlan,
|
|
1777
|
+
installLibraryPlan,
|
|
1778
|
+
resolveLibraryPackage,
|
|
1779
|
+
planLibraryUpdate,
|
|
1780
|
+
removeLibraryEntry,
|
|
1781
|
+
pinLibraryEntry,
|
|
1782
|
+
libraryEntryDrift,
|
|
1783
|
+
confirmLibraryRemote,
|
|
1784
|
+
syncLibrary,
|
|
1785
|
+
MARKETPLACE_UNCONFIGURED,
|
|
1786
|
+
discoverMarketplaceSkills,
|
|
1787
|
+
getMarketplaceSkills,
|
|
1788
|
+
marketplaceInstallShaping,
|
|
1789
|
+
resolveMarketplaceShaping,
|
|
1790
|
+
installSkill,
|
|
1791
|
+
projectCompatTrusted,
|
|
1792
|
+
defaultSkillRoots,
|
|
1793
|
+
loadSkills,
|
|
1794
|
+
modelVisibleSkills,
|
|
1795
|
+
skillCatalogValidity,
|
|
1796
|
+
SKILL_SURFACE_CLEAR_ARG,
|
|
1797
|
+
parseSkillCommand,
|
|
1798
|
+
expandSkillInvocationInput,
|
|
1799
|
+
parsePendingSkillRequests
|
|
1800
|
+
};
|
|
1801
|
+
//# sourceMappingURL=chunk-EXKUF426.js.map
|