@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,2120 @@
|
|
|
1
|
+
import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
loadPromptTemplates,
|
|
4
|
+
validateLibraryPackage
|
|
5
|
+
} from "./chunk-OEMFEL26.js";
|
|
6
|
+
import {
|
|
7
|
+
fetchPluginSource,
|
|
8
|
+
loadSkills,
|
|
9
|
+
parseAgentRecipeSchema,
|
|
10
|
+
parsePluginGithubSource,
|
|
11
|
+
pluginLocalPath
|
|
12
|
+
} from "./chunk-EXKUF426.js";
|
|
13
|
+
import {
|
|
14
|
+
normalizedSkillHash
|
|
15
|
+
} from "./chunk-DNCE23JJ.js";
|
|
16
|
+
import {
|
|
17
|
+
PLUGIN_EXTENSION_KEY,
|
|
18
|
+
PLUGIN_SCHEMA,
|
|
19
|
+
installLibraryPackage,
|
|
20
|
+
isPluginId,
|
|
21
|
+
listInstalledPlugins,
|
|
22
|
+
pluginBaseDir,
|
|
23
|
+
readPluginInstallRecord,
|
|
24
|
+
readPluginManifest
|
|
25
|
+
} from "./chunk-6UJ7RDI7.js";
|
|
26
|
+
import {
|
|
27
|
+
isSemanticVersion
|
|
28
|
+
} from "./chunk-XW2UZICE.js";
|
|
29
|
+
import {
|
|
30
|
+
readSettings,
|
|
31
|
+
updateSettings
|
|
32
|
+
} from "./chunk-PGEFOTJB.js";
|
|
33
|
+
import {
|
|
34
|
+
INTEROP_AGENT_KINDS,
|
|
35
|
+
interopAgentKind
|
|
36
|
+
} from "./chunk-5EQO5NWP.js";
|
|
37
|
+
import {
|
|
38
|
+
require_dist
|
|
39
|
+
} from "./chunk-B5GGDIHT.js";
|
|
40
|
+
import {
|
|
41
|
+
runCommandVector
|
|
42
|
+
} from "./chunk-GJ24ODAX.js";
|
|
43
|
+
import {
|
|
44
|
+
withStateFileLockSync
|
|
45
|
+
} from "./chunk-DVJL77SO.js";
|
|
46
|
+
import {
|
|
47
|
+
clioConfigDir,
|
|
48
|
+
clioStateDir
|
|
49
|
+
} from "./chunk-CTTI7G3T.js";
|
|
50
|
+
import {
|
|
51
|
+
safeResourceWrite
|
|
52
|
+
} from "./chunk-ZZFWWYLX.js";
|
|
53
|
+
import {
|
|
54
|
+
__toESM,
|
|
55
|
+
init_esm_shims
|
|
56
|
+
} from "./chunk-ECBHH7LU.js";
|
|
57
|
+
|
|
58
|
+
// src/domains/interop/inventory.ts
|
|
59
|
+
init_esm_shims();
|
|
60
|
+
var import_yaml = __toESM(require_dist(), 1);
|
|
61
|
+
import { lstatSync, readdirSync, readFileSync } from "node:fs";
|
|
62
|
+
import path from "node:path";
|
|
63
|
+
import { parse as parseToml } from "smol-toml";
|
|
64
|
+
var MAX_FILES = 4096;
|
|
65
|
+
var MAX_BYTES = 2 * 1024 * 1024;
|
|
66
|
+
function inventoryText(file) {
|
|
67
|
+
const stat = lstatSync(file);
|
|
68
|
+
if (!stat.isFile() || stat.isSymbolicLink() || stat.size > MAX_BYTES) throw new Error("not a bounded regular file");
|
|
69
|
+
return readFileSync(file, "utf8");
|
|
70
|
+
}
|
|
71
|
+
function object(value) {
|
|
72
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
73
|
+
}
|
|
74
|
+
function discoverInteropInventory(kind, home, cwd, env = {}) {
|
|
75
|
+
const layout = kind.inventory;
|
|
76
|
+
const result = { status: "known", items: [], diagnostics: [], listing: "unknown" };
|
|
77
|
+
if (!layout) return { ...result, status: "unknown", diagnostics: ["Inventory is not extended for this host."] };
|
|
78
|
+
const seen = /* @__PURE__ */ new Set();
|
|
79
|
+
let visited = 0;
|
|
80
|
+
const unknown = (message) => {
|
|
81
|
+
result.status = "unknown";
|
|
82
|
+
result.diagnostics.push(message);
|
|
83
|
+
};
|
|
84
|
+
const entries = (dir) => {
|
|
85
|
+
try {
|
|
86
|
+
if (lstatSync(dir).isSymbolicLink()) {
|
|
87
|
+
unknown(`Symbolic-link root was not traversed: ${dir}`);
|
|
88
|
+
return [];
|
|
89
|
+
}
|
|
90
|
+
return readdirSync(dir).sort();
|
|
91
|
+
} catch (error) {
|
|
92
|
+
if (error.code !== "ENOENT") unknown(`Cannot inspect ${dir}`);
|
|
93
|
+
return [];
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
const json = (file) => {
|
|
97
|
+
try {
|
|
98
|
+
const value = JSON.parse(inventoryText(file));
|
|
99
|
+
if (!object(value)) throw new Error("not object");
|
|
100
|
+
return value;
|
|
101
|
+
} catch (error) {
|
|
102
|
+
if (error.code !== "ENOENT") unknown(`Cannot parse ${file}`);
|
|
103
|
+
return void 0;
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
const add = (file, resourceKind, scope, plugin2, metadata = {}) => {
|
|
107
|
+
const key = `${scope}:${resourceKind}:${file}:${metadata.name ?? ""}`;
|
|
108
|
+
if (seen.has(key)) return;
|
|
109
|
+
seen.add(key);
|
|
110
|
+
let declaredName;
|
|
111
|
+
if (["skill", "agent", "prompt"].includes(resourceKind)) {
|
|
112
|
+
try {
|
|
113
|
+
const raw = inventoryText(file);
|
|
114
|
+
const frontmatter = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)/.exec(raw);
|
|
115
|
+
const data = file.endsWith(".toml") ? parseToml(raw) : frontmatter ? (0, import_yaml.parse)(frontmatter[1] ?? "") : void 0;
|
|
116
|
+
if (object(data) && typeof data.name === "string") declaredName = data.name;
|
|
117
|
+
} catch {
|
|
118
|
+
unknown(`Resource metadata is unknown: ${file}`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
result.items.push({
|
|
122
|
+
kind: resourceKind,
|
|
123
|
+
name: declaredName ?? (resourceKind === "skill" ? path.basename(path.dirname(file)) : path.basename(file, path.extname(file))),
|
|
124
|
+
path: file,
|
|
125
|
+
scope,
|
|
126
|
+
...plugin2 ? { plugin: plugin2 } : {},
|
|
127
|
+
...metadata
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
const walk = (dir, visit, depth = 0) => {
|
|
131
|
+
if (depth > 12) {
|
|
132
|
+
unknown(`Depth limit reached: ${dir}`);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
for (const name of entries(dir)) {
|
|
136
|
+
if (++visited > MAX_FILES) {
|
|
137
|
+
unknown("Inventory file limit reached.");
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
const file = path.join(dir, name);
|
|
141
|
+
try {
|
|
142
|
+
const stat = lstatSync(file);
|
|
143
|
+
if (stat.isSymbolicLink()) {
|
|
144
|
+
unknown(`Symbolic link was not traversed: ${file}`);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (stat.isDirectory()) walk(file, visit, depth + 1);
|
|
148
|
+
else if (stat.isFile()) visit(file);
|
|
149
|
+
} catch {
|
|
150
|
+
unknown(`Cannot inspect ${file}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
const scan = (root, scope, plugin2, declarations = layout.declarations, resourceRoots = layout.roots) => {
|
|
155
|
+
for (const entry of resourceRoots) {
|
|
156
|
+
walk(path.join(root, entry.path), (file) => {
|
|
157
|
+
if (entry.kind === "skill" ? path.basename(file) === "SKILL.md" : entry.extensions.some((ext) => file.endsWith(ext)))
|
|
158
|
+
add(file, entry.kind, scope, plugin2);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
for (const entry of declarations) {
|
|
162
|
+
const file = path.join(root, entry.path);
|
|
163
|
+
if (entry.path.endsWith(".toml")) {
|
|
164
|
+
try {
|
|
165
|
+
const data = parseToml(inventoryText(file));
|
|
166
|
+
if (object(data.mcp_servers))
|
|
167
|
+
for (const name of Object.keys(data.mcp_servers)) add(file, "mcp", scope, plugin2, { name });
|
|
168
|
+
} catch (error) {
|
|
169
|
+
if (error.code !== "ENOENT") unknown(`Cannot read ${file}`);
|
|
170
|
+
}
|
|
171
|
+
} else {
|
|
172
|
+
const data = json(file);
|
|
173
|
+
if (!data) continue;
|
|
174
|
+
const value = entry.key ? data[entry.key] : data;
|
|
175
|
+
if (value === void 0) continue;
|
|
176
|
+
if (object(value))
|
|
177
|
+
for (const name of Object.keys(value)) {
|
|
178
|
+
const key = `${scope}:${entry.kind}:${file}:${name}`;
|
|
179
|
+
if (!seen.has(key)) {
|
|
180
|
+
seen.add(key);
|
|
181
|
+
result.items.push({ kind: entry.kind, name, path: file, scope, ...plugin2 ? { plugin: plugin2 } : {} });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else unknown(`Unsupported declaration shape in ${file}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
scan(home, "user", void 0, layout.userDeclarations ?? [], []);
|
|
189
|
+
scan(cwd, "project", void 0, layout.projectDeclarations ?? [], []);
|
|
190
|
+
if (layout.projectModuleConfig) {
|
|
191
|
+
const file = path.join(cwd, layout.projectModuleConfig);
|
|
192
|
+
const data = json(file);
|
|
193
|
+
if (Array.isArray(data?.plugin))
|
|
194
|
+
for (const value of data.plugin) {
|
|
195
|
+
const name = typeof value === "string" ? value : Array.isArray(value) && typeof value[0] === "string" ? value[0] : void 0;
|
|
196
|
+
if (name)
|
|
197
|
+
add(file, "executable", "project", void 0, {
|
|
198
|
+
name: name.startsWith("file:") || path.isAbsolute(name) ? path.basename(name) : name
|
|
199
|
+
});
|
|
200
|
+
else unknown("Unsupported project executable plugin declaration.");
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const userRoot = env[layout.homeEnv ?? ""] ?? (layout.xdgConfigSubdir && env.XDG_CONFIG_HOME ? path.join(env.XDG_CONFIG_HOME, layout.xdgConfigSubdir) : path.join(home, layout.userRoot));
|
|
204
|
+
const roots = [
|
|
205
|
+
{ root: userRoot, scope: "user" },
|
|
206
|
+
...(layout.additionalUserRoots ?? []).map((root) => ({ root: path.join(home, root), scope: "user" })),
|
|
207
|
+
...layout.projectRoots.map((root) => ({ root: path.join(cwd, root), scope: "project" }))
|
|
208
|
+
];
|
|
209
|
+
const pluginRoots = /* @__PURE__ */ new Set();
|
|
210
|
+
const plugin = (root, scope, metadata = {}) => {
|
|
211
|
+
if (pluginRoots.has(`${scope}:${root}`)) return;
|
|
212
|
+
pluginRoots.add(`${scope}:${root}`);
|
|
213
|
+
let manifest;
|
|
214
|
+
for (const manifestPath of layout.pluginManifests) {
|
|
215
|
+
manifest = json(path.join(root, manifestPath));
|
|
216
|
+
if (manifest) break;
|
|
217
|
+
}
|
|
218
|
+
add(root, "plugin", scope, void 0, {
|
|
219
|
+
name: typeof manifest?.name === "string" ? manifest.name : path.basename(root),
|
|
220
|
+
version: typeof manifest?.version === "string" ? manifest.version : "unknown",
|
|
221
|
+
marketplace: "unknown",
|
|
222
|
+
installation: "unknown",
|
|
223
|
+
...metadata
|
|
224
|
+
});
|
|
225
|
+
scan(root, scope, root);
|
|
226
|
+
for (const directory of ["scripts", "tools"])
|
|
227
|
+
walk(path.join(root, directory), (file) => add(file, "executable", scope, root));
|
|
228
|
+
};
|
|
229
|
+
for (const { root, scope } of roots) {
|
|
230
|
+
scan(root, scope);
|
|
231
|
+
if (layout.moduleConfig) {
|
|
232
|
+
const data = json(path.join(root, layout.moduleConfig));
|
|
233
|
+
if (Array.isArray(data?.plugin))
|
|
234
|
+
for (const name of data.plugin) {
|
|
235
|
+
const source = typeof name === "string" ? name : Array.isArray(name) && typeof name[0] === "string" ? name[0] : void 0;
|
|
236
|
+
if (source)
|
|
237
|
+
add(path.join(root, layout.moduleConfig), "executable", scope, void 0, {
|
|
238
|
+
name: path.isAbsolute(source) ? path.basename(source) : source.startsWith("file:") ? path.basename(source) : source
|
|
239
|
+
});
|
|
240
|
+
else unknown("Unsupported executable plugin declaration.");
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (layout.settingsRegistry === "copilot") {
|
|
244
|
+
const settings = json(path.join(root, "settings.json"));
|
|
245
|
+
if (object(settings?.enabledPlugins))
|
|
246
|
+
for (const [id, enabled] of Object.entries(settings.enabledPlugins)) {
|
|
247
|
+
const [name, market] = id.split("@");
|
|
248
|
+
const markets = settings.extraKnownMarketplaces;
|
|
249
|
+
const entry = object(markets) && market ? markets[market] : void 0;
|
|
250
|
+
const source = object(entry) ? entry.source : void 0;
|
|
251
|
+
if (!name || !object(source) || source.source !== "directory" || typeof source.path !== "string") {
|
|
252
|
+
unknown(`Plugin source path is unknown: ${id}`);
|
|
253
|
+
add(path.join(root, "settings.json"), "plugin", scope, void 0, {
|
|
254
|
+
name: id,
|
|
255
|
+
installation: "installed",
|
|
256
|
+
marketplace: market ?? "unknown",
|
|
257
|
+
version: "unknown"
|
|
258
|
+
});
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
const marketManifest = json(path.join(source.path, ".claude-plugin/marketplace.json")) ?? json(path.join(source.path, "marketplace.json"));
|
|
262
|
+
const declaration = Array.isArray(marketManifest?.plugins) ? marketManifest.plugins.find((entry2) => object(entry2) && entry2.name === name) : void 0;
|
|
263
|
+
if (!object(declaration) || typeof declaration.source !== "string" || !declaration.source.startsWith(".")) {
|
|
264
|
+
unknown(`Plugin local source is unknown: ${id}`);
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
plugin(path.resolve(source.path, declaration.source), scope, {
|
|
268
|
+
name,
|
|
269
|
+
marketplace: market ?? "unknown",
|
|
270
|
+
installation: "installed",
|
|
271
|
+
...typeof enabled === "boolean" ? { enabled } : {}
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (layout.installedRegistry) {
|
|
276
|
+
const data = json(path.join(root, layout.installedRegistry));
|
|
277
|
+
if (object(data?.plugins)) {
|
|
278
|
+
for (const [id, records] of Object.entries(data.plugins)) {
|
|
279
|
+
if (!Array.isArray(records)) {
|
|
280
|
+
unknown("Unsupported installed plugin registry record.");
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
for (const record2 of records) {
|
|
284
|
+
if (!object(record2) || typeof record2.installPath !== "string") {
|
|
285
|
+
unknown("Plugin install path is unknown.");
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
if (record2.scope !== "user" && record2.scope !== "project" && record2.scope !== "local") {
|
|
289
|
+
unknown("Plugin scope is unknown.");
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
if (record2.scope !== "user" && record2.projectPath !== cwd) continue;
|
|
293
|
+
plugin(record2.installPath, record2.scope === "user" ? "user" : "project", {
|
|
294
|
+
name: id.split("@")[0] ?? id,
|
|
295
|
+
marketplace: id.split("@")[1] ?? "unknown",
|
|
296
|
+
version: typeof record2.version === "string" ? record2.version : "unknown",
|
|
297
|
+
installation: "installed"
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
for (const directory of layout.pluginDirs) {
|
|
304
|
+
const search = (dir, depth) => {
|
|
305
|
+
if (depth > 4) {
|
|
306
|
+
unknown(`Plugin search depth reached: ${dir}`);
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
const names = entries(dir);
|
|
310
|
+
if (layout.pluginManifests.some((name) => {
|
|
311
|
+
try {
|
|
312
|
+
return lstatSync(path.join(dir, name)).isFile();
|
|
313
|
+
} catch {
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
})) {
|
|
317
|
+
const relative = path.relative(path.join(root, directory), dir).split(path.sep);
|
|
318
|
+
plugin(dir, scope, layout.cacheMarketplace ? { marketplace: relative[0] ?? "unknown" } : {});
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
for (const name of names) {
|
|
322
|
+
if (++visited > MAX_FILES) {
|
|
323
|
+
unknown("Inventory file limit reached.");
|
|
324
|
+
return;
|
|
325
|
+
}
|
|
326
|
+
try {
|
|
327
|
+
if (lstatSync(path.join(dir, name)).isDirectory()) search(path.join(dir, name), depth + 1);
|
|
328
|
+
} catch {
|
|
329
|
+
unknown(`Cannot inspect ${dir}`);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
search(path.join(root, directory), 0);
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
if (layout.settingsRegistry === "codex") {
|
|
337
|
+
try {
|
|
338
|
+
const data = parseToml(inventoryText(path.join(userRoot, "config.toml")));
|
|
339
|
+
if (object(data.plugins))
|
|
340
|
+
for (const item of result.items.filter((item2) => item2.kind === "plugin" && item2.scope === "user")) {
|
|
341
|
+
const state = data.plugins[`${item.name}@${item.marketplace}`];
|
|
342
|
+
if (object(state) && typeof state.enabled === "boolean") {
|
|
343
|
+
item.enabled = state.enabled;
|
|
344
|
+
item.installation = "installed";
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
} catch (error) {
|
|
348
|
+
if (error.code !== "ENOENT") unknown("Cannot parse Codex plugin settings.");
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
if (layout.settingsRegistry === "antigravity") {
|
|
352
|
+
const manifest = json(path.join(userRoot, "import_manifest.json"));
|
|
353
|
+
if (Array.isArray(manifest?.imports))
|
|
354
|
+
for (const item of result.items.filter((item2) => item2.kind === "plugin")) {
|
|
355
|
+
if (manifest.imports.some((entry) => object(entry) && entry.name === item.name)) item.installation = "installed";
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return result;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
// src/domains/interop/detect.ts
|
|
362
|
+
init_esm_shims();
|
|
363
|
+
import { createHash } from "node:crypto";
|
|
364
|
+
import { accessSync, constants, existsSync as existsSync2, mkdirSync, mkdtempSync, rmSync, statSync } from "node:fs";
|
|
365
|
+
import { homedir, tmpdir } from "node:os";
|
|
366
|
+
import path3 from "node:path";
|
|
367
|
+
|
|
368
|
+
// src/domains/interop/state.ts
|
|
369
|
+
init_esm_shims();
|
|
370
|
+
import { existsSync, readFileSync as readFileSync2 } from "node:fs";
|
|
371
|
+
import path2 from "node:path";
|
|
372
|
+
var KNOWN_IDS = new Set(INTEROP_AGENT_KINDS.map((kind) => kind.id));
|
|
373
|
+
var PRESENCES = /* @__PURE__ */ new Set(["present", "absent", "unknown"]);
|
|
374
|
+
function interopStatePath() {
|
|
375
|
+
return path2.join(clioStateDir(), "interop.json");
|
|
376
|
+
}
|
|
377
|
+
function isRecord(value) {
|
|
378
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
379
|
+
}
|
|
380
|
+
function stringField(raw, key) {
|
|
381
|
+
const value = raw[key];
|
|
382
|
+
return typeof value === "string" && value.length > 0 ? value : void 0;
|
|
383
|
+
}
|
|
384
|
+
function countField(raw, key) {
|
|
385
|
+
const value = raw[key];
|
|
386
|
+
return typeof value === "number" && Number.isInteger(value) && value >= 0 ? value : 0;
|
|
387
|
+
}
|
|
388
|
+
function presenceField(raw, key) {
|
|
389
|
+
const value = raw[key];
|
|
390
|
+
return typeof value === "string" && PRESENCES.has(value) ? value : void 0;
|
|
391
|
+
}
|
|
392
|
+
function parseAgent(raw) {
|
|
393
|
+
if (!isRecord(raw)) return null;
|
|
394
|
+
const kind = stringField(raw, "kind");
|
|
395
|
+
const fingerprint = stringField(raw, "fingerprint");
|
|
396
|
+
const presence = presenceField(raw, "presence");
|
|
397
|
+
if (kind === void 0 || !KNOWN_IDS.has(kind) || fingerprint === void 0 || presence === void 0) return null;
|
|
398
|
+
const decision = stringField(raw, "decision");
|
|
399
|
+
const adapter = presenceField(raw, "adapter");
|
|
400
|
+
const binary = stringField(raw, "binary");
|
|
401
|
+
const version = stringField(raw, "version");
|
|
402
|
+
const installDir = stringField(raw, "installDir");
|
|
403
|
+
const decidedAt = stringField(raw, "decidedAt");
|
|
404
|
+
const decidedFingerprint = stringField(raw, "decidedFingerprint");
|
|
405
|
+
const hintedFingerprint = stringField(raw, "hintedFingerprint");
|
|
406
|
+
return {
|
|
407
|
+
kind,
|
|
408
|
+
presence,
|
|
409
|
+
fingerprint,
|
|
410
|
+
skillCount: countField(raw, "skillCount"),
|
|
411
|
+
projectArtifacts: countField(raw, "projectArtifacts"),
|
|
412
|
+
...binary !== void 0 ? { binary } : {},
|
|
413
|
+
...version !== void 0 ? { version } : {},
|
|
414
|
+
...installDir !== void 0 ? { installDir } : {},
|
|
415
|
+
...adapter !== void 0 ? { adapter } : {},
|
|
416
|
+
...decision === "accepted" || decision === "declined" ? { decision } : {},
|
|
417
|
+
...decidedAt !== void 0 ? { decidedAt } : {},
|
|
418
|
+
...decidedFingerprint !== void 0 ? { decidedFingerprint } : {},
|
|
419
|
+
...hintedFingerprint !== void 0 ? { hintedFingerprint } : {}
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
function readInteropReport() {
|
|
423
|
+
let filePath;
|
|
424
|
+
try {
|
|
425
|
+
filePath = interopStatePath();
|
|
426
|
+
} catch {
|
|
427
|
+
return null;
|
|
428
|
+
}
|
|
429
|
+
if (!existsSync(filePath)) return null;
|
|
430
|
+
try {
|
|
431
|
+
const parsed = JSON.parse(readFileSync2(filePath, "utf8"));
|
|
432
|
+
if (!isRecord(parsed) || parsed.version !== 1) return null;
|
|
433
|
+
const detectedAt = stringField(parsed, "detectedAt");
|
|
434
|
+
if (detectedAt === void 0 || !Array.isArray(parsed.agents)) return null;
|
|
435
|
+
const agents = parsed.agents.map(parseAgent).filter((agent) => agent !== null);
|
|
436
|
+
return { version: 1, detectedAt, agents };
|
|
437
|
+
} catch {
|
|
438
|
+
return null;
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
function writeInteropReport(report) {
|
|
442
|
+
safeResourceWrite(interopStatePath(), `${JSON.stringify(report, null, 2)}
|
|
443
|
+
`, { encoding: "utf8" });
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// src/domains/interop/detect.ts
|
|
447
|
+
var VERSION_PROBE_TIMEOUT_MS = 2e3;
|
|
448
|
+
var VERSION_PROBE_MAX_OUTPUT_BYTES = 4096;
|
|
449
|
+
function resolveOnPath(binaryNames) {
|
|
450
|
+
if (binaryNames.length === 0) return { presence: "absent" };
|
|
451
|
+
const rawPath = process.env.PATH;
|
|
452
|
+
if (rawPath === void 0 || rawPath.length === 0) return { presence: "unknown" };
|
|
453
|
+
let unreadable = false;
|
|
454
|
+
try {
|
|
455
|
+
for (const dir of rawPath.split(path3.delimiter)) {
|
|
456
|
+
if (dir.length === 0) continue;
|
|
457
|
+
for (const name of binaryNames) {
|
|
458
|
+
const candidate = path3.join(dir, name);
|
|
459
|
+
try {
|
|
460
|
+
accessSync(candidate, constants.X_OK);
|
|
461
|
+
if (statSync(candidate).isFile()) return { presence: "present", binary: candidate };
|
|
462
|
+
} catch (error) {
|
|
463
|
+
if (["EACCES", "EPERM"].includes(error.code ?? "")) unreadable = true;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
} catch {
|
|
468
|
+
return { presence: "unknown" };
|
|
469
|
+
}
|
|
470
|
+
return { presence: unreadable ? "unknown" : "absent" };
|
|
471
|
+
}
|
|
472
|
+
function adapterPresence(kind, cwd, binaryPresence) {
|
|
473
|
+
const recipe = kind.acp;
|
|
474
|
+
if (recipe === void 0) return "absent";
|
|
475
|
+
if (recipe.npmPackage === void 0) return binaryPresence;
|
|
476
|
+
try {
|
|
477
|
+
if (existsSync2(path3.join(cwd, "node_modules", recipe.npmPackage))) return "present";
|
|
478
|
+
} catch {
|
|
479
|
+
return "unknown";
|
|
480
|
+
}
|
|
481
|
+
if (recipe.npmPackageBin === void 0) return "absent";
|
|
482
|
+
return resolveOnPath([recipe.npmPackageBin]).presence;
|
|
483
|
+
}
|
|
484
|
+
function installDirOf(kind, home) {
|
|
485
|
+
const dir = path3.join(home, kind.userDir);
|
|
486
|
+
try {
|
|
487
|
+
return existsSync2(dir) ? dir : void 0;
|
|
488
|
+
} catch {
|
|
489
|
+
return void 0;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
function parseVersion(output) {
|
|
493
|
+
return /\b\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?\b/.exec(output)?.[0];
|
|
494
|
+
}
|
|
495
|
+
async function probeVersion(binary) {
|
|
496
|
+
let scratch;
|
|
497
|
+
try {
|
|
498
|
+
scratch = mkdtempSync(path3.join(tmpdir(), "clio-coder-interop-version-"));
|
|
499
|
+
const env = { HOME: scratch, USERPROFILE: scratch };
|
|
500
|
+
for (const key of [
|
|
501
|
+
"XDG_CONFIG_HOME",
|
|
502
|
+
"XDG_CACHE_HOME",
|
|
503
|
+
"XDG_STATE_HOME",
|
|
504
|
+
"XDG_DATA_HOME",
|
|
505
|
+
"APPDATA",
|
|
506
|
+
"LOCALAPPDATA",
|
|
507
|
+
"CLAUDE_CONFIG_DIR",
|
|
508
|
+
"CODEX_HOME",
|
|
509
|
+
"ANTIGRAVITY_HOME",
|
|
510
|
+
"OPENCODE_CONFIG_DIR",
|
|
511
|
+
"COPILOT_HOME",
|
|
512
|
+
"GEMINI_CLI_HOME"
|
|
513
|
+
]) {
|
|
514
|
+
const directory = path3.join(scratch, key.toLowerCase());
|
|
515
|
+
mkdirSync(directory);
|
|
516
|
+
env[key] = directory;
|
|
517
|
+
}
|
|
518
|
+
const result = await runCommandVector(binary, ["--version"], {
|
|
519
|
+
cwd: scratch,
|
|
520
|
+
workspaceRoot: scratch,
|
|
521
|
+
env,
|
|
522
|
+
timeoutMs: VERSION_PROBE_TIMEOUT_MS,
|
|
523
|
+
maxOutputBytes: VERSION_PROBE_MAX_OUTPUT_BYTES
|
|
524
|
+
});
|
|
525
|
+
if (result.timedOut || result.outputCapped || result.exitCode !== 0) return void 0;
|
|
526
|
+
return parseVersion(`${result.stdout}
|
|
527
|
+
${result.stderr}`);
|
|
528
|
+
} catch {
|
|
529
|
+
return void 0;
|
|
530
|
+
} finally {
|
|
531
|
+
if (scratch) rmSync(scratch, { recursive: true, force: true });
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
function interopFingerprint(kind, facts) {
|
|
535
|
+
const recipe = kind.acp;
|
|
536
|
+
const parts = [
|
|
537
|
+
kind.id,
|
|
538
|
+
facts.binary ?? "",
|
|
539
|
+
facts.version ?? "",
|
|
540
|
+
recipe === void 0 ? "" : `${recipe.command} ${recipe.args.join(" ")}`
|
|
541
|
+
];
|
|
542
|
+
return `sha256:${createHash("sha256").update(parts.join("\0")).digest("hex")}`;
|
|
543
|
+
}
|
|
544
|
+
function countBy(values, match) {
|
|
545
|
+
if (values === void 0 || match === void 0) return 0;
|
|
546
|
+
return values.filter((value) => value === match).length;
|
|
547
|
+
}
|
|
548
|
+
function detected(facts) {
|
|
549
|
+
return facts.presence === "present" || facts.installDir !== void 0 || facts.skillCount > 0 || facts.projectArtifacts > 0;
|
|
550
|
+
}
|
|
551
|
+
async function detectInteropAgents(input = {}, previous) {
|
|
552
|
+
const cwd = path3.resolve(input.cwd ?? process.cwd());
|
|
553
|
+
const home = input.home ?? homedir();
|
|
554
|
+
const priorByKind = new Map((previous ?? readInteropReport()?.agents ?? []).map((record2) => [record2.kind, record2]));
|
|
555
|
+
const agents = [];
|
|
556
|
+
for (const kind of INTEROP_AGENT_KINDS) {
|
|
557
|
+
const resolved = resolveOnPath(kind.binaryNames);
|
|
558
|
+
const prior = priorByKind.get(kind.id);
|
|
559
|
+
const inventoryRoot = input.inventory && kind.inventory ? (input.home === void 0 ? process.env[kind.inventory.homeEnv ?? ""] : void 0) ?? path3.join(home, kind.inventory.userRoot) : void 0;
|
|
560
|
+
const installDir = inventoryRoot && existsSync2(inventoryRoot) ? inventoryRoot : installDirOf(kind, home);
|
|
561
|
+
const facts = {
|
|
562
|
+
kind: kind.id,
|
|
563
|
+
presence: resolved.presence,
|
|
564
|
+
...resolved.binary !== void 0 ? { binary: resolved.binary } : {},
|
|
565
|
+
...installDir !== void 0 ? { installDir } : {},
|
|
566
|
+
...kind.acp !== void 0 ? { adapter: adapterPresence(kind, cwd, resolved.presence) } : {},
|
|
567
|
+
skillCount: countBy(input.skillSources, kind.skillSource),
|
|
568
|
+
projectArtifacts: countBy(input.artifactProviders, kind.adoptionProvider)
|
|
569
|
+
};
|
|
570
|
+
if (resolved.binary !== void 0) {
|
|
571
|
+
const version = input.probeVersion === true ? await probeVersion(resolved.binary) : (
|
|
572
|
+
// A run that did not probe keeps the last version seen for the same
|
|
573
|
+
// binary, so the fingerprint does not flip between probing callers.
|
|
574
|
+
prior?.binary === resolved.binary ? prior.version : void 0
|
|
575
|
+
);
|
|
576
|
+
if (version !== void 0) facts.version = version;
|
|
577
|
+
}
|
|
578
|
+
if (input.inventory === true && kind.inventory) {
|
|
579
|
+
facts.inventory = discoverInteropInventory(kind, home, cwd, input.home === void 0 ? process.env : {});
|
|
580
|
+
facts.skillCount = facts.inventory.items.filter((item) => item.kind === "skill").length;
|
|
581
|
+
facts.projectArtifacts = facts.inventory.items.filter((item) => item.scope === "project").length;
|
|
582
|
+
}
|
|
583
|
+
if (!detected(facts) && !(input.inventory && kind.inventory)) continue;
|
|
584
|
+
agents.push({
|
|
585
|
+
...facts,
|
|
586
|
+
fingerprint: interopFingerprint(kind, facts),
|
|
587
|
+
...prior?.decision !== void 0 ? { decision: prior.decision } : {},
|
|
588
|
+
...prior?.decidedAt !== void 0 ? { decidedAt: prior.decidedAt } : {},
|
|
589
|
+
...prior?.decidedFingerprint !== void 0 ? { decidedFingerprint: prior.decidedFingerprint } : {},
|
|
590
|
+
...prior?.hintedFingerprint !== void 0 ? { hintedFingerprint: prior.hintedFingerprint } : {}
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
return { version: 1, detectedAt: (/* @__PURE__ */ new Date()).toISOString(), agents };
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
// src/domains/interop/adopt.ts
|
|
597
|
+
init_esm_shims();
|
|
598
|
+
import { mkdirSync as mkdirSync2, mkdtempSync as mkdtempSync2, rmSync as rmSync2, writeFileSync } from "node:fs";
|
|
599
|
+
import { tmpdir as tmpdir2 } from "node:os";
|
|
600
|
+
import path6 from "node:path";
|
|
601
|
+
|
|
602
|
+
// src/domains/interop/foreign.ts
|
|
603
|
+
init_esm_shims();
|
|
604
|
+
import { existsSync as existsSync3, lstatSync as lstatSync3, readdirSync as readdirSync3 } from "node:fs";
|
|
605
|
+
import path5 from "node:path";
|
|
606
|
+
|
|
607
|
+
// src/domains/interop/projection.ts
|
|
608
|
+
init_esm_shims();
|
|
609
|
+
var import_yaml2 = __toESM(require_dist(), 1);
|
|
610
|
+
import { createHash as createHash2 } from "node:crypto";
|
|
611
|
+
import { lstatSync as lstatSync2, readdirSync as readdirSync2, readFileSync as readFileSync3, readlinkSync } from "node:fs";
|
|
612
|
+
import path4 from "node:path";
|
|
613
|
+
import { parse as parseToml2 } from "smol-toml";
|
|
614
|
+
var DATA_EXTENSIONS = /* @__PURE__ */ new Set([".md", ".txt", ".rst", ".csv", ".bib"]);
|
|
615
|
+
var FORBIDDEN_PARTS = /* @__PURE__ */ new Set([
|
|
616
|
+
"hooks",
|
|
617
|
+
"output-styles",
|
|
618
|
+
"scripts",
|
|
619
|
+
"tools",
|
|
620
|
+
"node_modules",
|
|
621
|
+
".git",
|
|
622
|
+
".claude-plugin",
|
|
623
|
+
".codex-plugin"
|
|
624
|
+
]);
|
|
625
|
+
var HOST_SKILL_KEYS = [
|
|
626
|
+
"audit",
|
|
627
|
+
"installed-hash",
|
|
628
|
+
"source-url",
|
|
629
|
+
"installed-by",
|
|
630
|
+
"hooks",
|
|
631
|
+
"mcpServers",
|
|
632
|
+
"allowed-tools",
|
|
633
|
+
"tools",
|
|
634
|
+
"context",
|
|
635
|
+
"agent",
|
|
636
|
+
"model",
|
|
637
|
+
"effort",
|
|
638
|
+
"user-invocable",
|
|
639
|
+
"disable-model-invocation",
|
|
640
|
+
"argument-hint",
|
|
641
|
+
"paths",
|
|
642
|
+
"when_to_use"
|
|
643
|
+
];
|
|
644
|
+
var PROMPT_KEYS = /* @__PURE__ */ new Set(["description", "argument-hint", "argumentHint"]);
|
|
645
|
+
function safeName(name) {
|
|
646
|
+
const value = name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 45).replace(/-$/u, "");
|
|
647
|
+
if (!value) throw new Error("No safe resource identifier.");
|
|
648
|
+
return value;
|
|
649
|
+
}
|
|
650
|
+
function safeData(file) {
|
|
651
|
+
return !file.split("/").some((part) => FORBIDDEN_PARTS.has(part)) && DATA_EXTENSIONS.has(path4.extname(file));
|
|
652
|
+
}
|
|
653
|
+
function listFiles(root, dir, out, depth = 0) {
|
|
654
|
+
if (depth > 12 || out.length > 4096) return;
|
|
655
|
+
let names;
|
|
656
|
+
try {
|
|
657
|
+
names = readdirSync2(dir).sort();
|
|
658
|
+
} catch {
|
|
659
|
+
return;
|
|
660
|
+
}
|
|
661
|
+
for (const name of names) {
|
|
662
|
+
const file = path4.join(dir, name);
|
|
663
|
+
const relative = path4.relative(root, file).split(path4.sep).join("/");
|
|
664
|
+
try {
|
|
665
|
+
const stat = lstatSync2(file);
|
|
666
|
+
if (stat.isDirectory()) listFiles(root, file, out, depth + 1);
|
|
667
|
+
else out.push(relative);
|
|
668
|
+
} catch {
|
|
669
|
+
out.push(relative);
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
function tree(root, dataOnly = false, omitted = []) {
|
|
674
|
+
const files = {};
|
|
675
|
+
let bytes = 0;
|
|
676
|
+
const visit = (dir, depth) => {
|
|
677
|
+
if (depth > 12) throw new Error("Source tree exceeds depth limit.");
|
|
678
|
+
if (lstatSync2(dir).isSymbolicLink()) throw new Error("Symbolic links are not adoptable.");
|
|
679
|
+
for (const name of readdirSync2(dir).sort()) {
|
|
680
|
+
const file = path4.join(dir, name);
|
|
681
|
+
const relative = path4.relative(root, file).split(path4.sep).join("/");
|
|
682
|
+
if (dataOnly && relative.split("/").some((part) => FORBIDDEN_PARTS.has(part) || part === "fleets")) {
|
|
683
|
+
let isDirectory = false;
|
|
684
|
+
try {
|
|
685
|
+
isDirectory = lstatSync2(file).isDirectory();
|
|
686
|
+
} catch {
|
|
687
|
+
}
|
|
688
|
+
if (isDirectory) listFiles(root, file, omitted);
|
|
689
|
+
else omitted.push(relative);
|
|
690
|
+
continue;
|
|
691
|
+
}
|
|
692
|
+
const stat = lstatSync2(file);
|
|
693
|
+
if (stat.isSymbolicLink() || !stat.isDirectory() && !stat.isFile())
|
|
694
|
+
throw new Error("Symbolic links and special files are not adoptable.");
|
|
695
|
+
if (stat.isDirectory()) visit(file, depth + 1);
|
|
696
|
+
else {
|
|
697
|
+
if (dataOnly && relative !== "plugin.json" && (!safeData(relative) || (stat.mode & 73) !== 0)) {
|
|
698
|
+
omitted.push(relative);
|
|
699
|
+
continue;
|
|
700
|
+
}
|
|
701
|
+
if ((stat.mode & 73) !== 0) throw new Error(`Executable file is not adoptable: ${path4.relative(root, file)}`);
|
|
702
|
+
const text = inventoryText(file);
|
|
703
|
+
bytes += Buffer.byteLength(text);
|
|
704
|
+
if (bytes > 16 * 1024 * 1024 || Object.keys(files).length >= 2048)
|
|
705
|
+
throw new Error("Source tree exceeds adoption limits.");
|
|
706
|
+
files[relative] = text;
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
};
|
|
710
|
+
visit(root, 0);
|
|
711
|
+
return files;
|
|
712
|
+
}
|
|
713
|
+
function reviewFingerprint(root) {
|
|
714
|
+
const hash = createHash2("sha256");
|
|
715
|
+
let budget = 64 * 1024 * 1024;
|
|
716
|
+
let count = 0;
|
|
717
|
+
const visit = (dir, depth) => {
|
|
718
|
+
if (depth > 12) throw new Error("Source tree exceeds depth limit.");
|
|
719
|
+
for (const name of readdirSync2(dir).sort()) {
|
|
720
|
+
if (++count > 8192) throw new Error("Source tree exceeds review limits.");
|
|
721
|
+
const file = path4.join(dir, name);
|
|
722
|
+
const relative = path4.relative(root, file).split(path4.sep).join("/");
|
|
723
|
+
const stat = lstatSync2(file);
|
|
724
|
+
hash.update(relative).update("\0");
|
|
725
|
+
if (stat.isSymbolicLink()) hash.update(`symlink:${readlinkSync(file)}`);
|
|
726
|
+
else if (stat.isDirectory()) {
|
|
727
|
+
hash.update("dir");
|
|
728
|
+
visit(file, depth + 1);
|
|
729
|
+
} else if (stat.isFile()) {
|
|
730
|
+
hash.update(`file:${stat.mode & 511}:${stat.size}:`);
|
|
731
|
+
budget -= stat.size;
|
|
732
|
+
if (budget < 0) throw new Error("Source tree exceeds review limits.");
|
|
733
|
+
hash.update(readFileSync3(file));
|
|
734
|
+
} else hash.update("special");
|
|
735
|
+
hash.update("\0");
|
|
736
|
+
}
|
|
737
|
+
};
|
|
738
|
+
visit(root, 0);
|
|
739
|
+
return hash.digest("hex");
|
|
740
|
+
}
|
|
741
|
+
function digest(files) {
|
|
742
|
+
const hash = createHash2("sha256");
|
|
743
|
+
for (const key of Object.keys(files).sort())
|
|
744
|
+
hash.update(key).update("\0").update(files[key] ?? "").update("\0");
|
|
745
|
+
return hash.digest("hex");
|
|
746
|
+
}
|
|
747
|
+
function prose(text) {
|
|
748
|
+
const match = /^---\r?\n([\s\S]*?)\r?\n---(?:\r?\n|$)([\s\S]*)$/.exec(text);
|
|
749
|
+
if (!match) return { metadata: {}, body: text };
|
|
750
|
+
const metadata = (0, import_yaml2.parse)(match[1] ?? "");
|
|
751
|
+
if (!metadata || typeof metadata !== "object" || Array.isArray(metadata))
|
|
752
|
+
throw new Error("Invalid resource frontmatter.");
|
|
753
|
+
return { metadata, body: match[2] ?? "" };
|
|
754
|
+
}
|
|
755
|
+
function projectSkill(input) {
|
|
756
|
+
const rawOmitted = [];
|
|
757
|
+
const rawSource = input.lenient ? tree(input.skillDir, true, rawOmitted) : tree(input.skillDir);
|
|
758
|
+
const foreign = (file) => input.excludeTopLevel?.has(file.split("/")[0] ?? "") === true;
|
|
759
|
+
const source = Object.fromEntries(Object.entries(rawSource).filter(([file]) => !foreign(file)));
|
|
760
|
+
const omittedFiles = rawOmitted.filter((file) => !foreign(file));
|
|
761
|
+
delete source["plugin.json"];
|
|
762
|
+
if (!input.lenient && Object.keys(source).some((file) => !safeData(file)))
|
|
763
|
+
throw new Error("Not adoptable: skill contains executable or non-text companion files.");
|
|
764
|
+
const raw = source["SKILL.md"];
|
|
765
|
+
if (raw === void 0) throw new Error("Skill directory has no SKILL.md.");
|
|
766
|
+
const skill = prose(raw);
|
|
767
|
+
const name = typeof skill.metadata.name === "string" && skill.metadata.name.trim() ? skill.metadata.name.trim() : "";
|
|
768
|
+
if (!input.lenient && (!name || typeof skill.metadata.description !== "string"))
|
|
769
|
+
throw new Error("Skill requires name and description frontmatter.");
|
|
770
|
+
if (typeof skill.metadata.description !== "string" || !skill.metadata.description.trim())
|
|
771
|
+
throw new Error("Skill requires description frontmatter.");
|
|
772
|
+
const actualName = name || input.fallbackName;
|
|
773
|
+
const omittedFields = [];
|
|
774
|
+
for (const key of ["clio-coder", "clio"]) if (key in skill.metadata) delete skill.metadata[key];
|
|
775
|
+
for (const key of HOST_SKILL_KEYS)
|
|
776
|
+
if (key in skill.metadata) {
|
|
777
|
+
omittedFields.push(key);
|
|
778
|
+
delete skill.metadata[key];
|
|
779
|
+
}
|
|
780
|
+
const id = safeName(actualName);
|
|
781
|
+
const body = skill.body;
|
|
782
|
+
const retained = [
|
|
783
|
+
body,
|
|
784
|
+
...Object.entries(source).filter(([file]) => file !== "SKILL.md").map(([, text]) => text)
|
|
785
|
+
];
|
|
786
|
+
const requiredOmissions = omittedFiles.filter((file) => {
|
|
787
|
+
const base = path4.basename(file);
|
|
788
|
+
return retained.some((text) => text.includes(file) || base.includes(".") && text.includes(base));
|
|
789
|
+
});
|
|
790
|
+
source["SKILL.md"] = `---
|
|
791
|
+
${(0, import_yaml2.stringify)({ ...skill.metadata, name: actualName, "clio-coder": { audit: "unknown" } })}---
|
|
792
|
+
${body}`;
|
|
793
|
+
return {
|
|
794
|
+
id,
|
|
795
|
+
name: actualName,
|
|
796
|
+
files: Object.fromEntries(Object.entries(source).map(([file, text]) => [`skills/${id}/${file}`, text])),
|
|
797
|
+
componentPath: `skills/${id}/SKILL.md`,
|
|
798
|
+
omittedFields,
|
|
799
|
+
omittedFiles,
|
|
800
|
+
requiredOmissions,
|
|
801
|
+
bindings: []
|
|
802
|
+
};
|
|
803
|
+
}
|
|
804
|
+
function projectAgent(input) {
|
|
805
|
+
if (input.text === void 0 && (lstatSync2(input.file).mode & 73) !== 0)
|
|
806
|
+
throw new Error("Executable files are not adoptable.");
|
|
807
|
+
const raw = input.text ?? inventoryText(input.file);
|
|
808
|
+
const parsed = input.file.endsWith(".toml") ? (() => {
|
|
809
|
+
const data = parseToml2(raw);
|
|
810
|
+
if (typeof data.developer_instructions !== "string") throw new Error("Agent developer_instructions is unknown.");
|
|
811
|
+
return { metadata: data, body: data.developer_instructions };
|
|
812
|
+
})() : prose(raw);
|
|
813
|
+
if (!parsed.body.trim()) throw new Error("Empty resource body.");
|
|
814
|
+
const name = typeof parsed.metadata.name === "string" && parsed.metadata.name.trim() ? parsed.metadata.name.trim() : input.name;
|
|
815
|
+
const id = safeName(name);
|
|
816
|
+
const omittedFields = Object.keys(parsed.metadata).filter(
|
|
817
|
+
(key) => !["name", "description", "developer_instructions", ...input.bindSkills ? ["skills"] : []].includes(key)
|
|
818
|
+
);
|
|
819
|
+
const metadata = {
|
|
820
|
+
description: typeof parsed.metadata.description === "string" ? parsed.metadata.description : `Adopted agent ${name}`,
|
|
821
|
+
version: 1,
|
|
822
|
+
name,
|
|
823
|
+
tools: { required: ["read"], optional: ["grep", "find", "ls"] },
|
|
824
|
+
skills: [...input.bindSkills ?? []],
|
|
825
|
+
audience: "custom",
|
|
826
|
+
category: "research",
|
|
827
|
+
capabilityClass: "read-only",
|
|
828
|
+
latencyClass: "balanced",
|
|
829
|
+
projectContextTier: "bounded",
|
|
830
|
+
budget: { toolCalls: 24, readReserve: 4, synthesis: true },
|
|
831
|
+
resultContract: { kind: "artifact-report" },
|
|
832
|
+
tags: ["interop"]
|
|
833
|
+
};
|
|
834
|
+
parseAgentRecipeSchema({
|
|
835
|
+
id,
|
|
836
|
+
source: "plugin",
|
|
837
|
+
filepath: input.file,
|
|
838
|
+
body: parsed.body,
|
|
839
|
+
frontmatter: metadata
|
|
840
|
+
});
|
|
841
|
+
const componentPath = `agents/${id}.md`;
|
|
842
|
+
const declaredSkills = parsed.metadata.skills;
|
|
843
|
+
const bindings = Array.isArray(declaredSkills) ? declaredSkills.filter((skill) => typeof skill === "string") : typeof declaredSkills === "string" ? declaredSkills.split(",").map((skill) => skill.trim()).filter(Boolean) : [];
|
|
844
|
+
return {
|
|
845
|
+
id,
|
|
846
|
+
name,
|
|
847
|
+
files: { [componentPath]: `---
|
|
848
|
+
${(0, import_yaml2.stringify)(metadata)}---
|
|
849
|
+
${parsed.body}` },
|
|
850
|
+
componentPath,
|
|
851
|
+
omittedFields,
|
|
852
|
+
omittedFiles: [],
|
|
853
|
+
requiredOmissions: [],
|
|
854
|
+
bindings
|
|
855
|
+
};
|
|
856
|
+
}
|
|
857
|
+
function projectPrompt(input) {
|
|
858
|
+
if (input.text === void 0 && (lstatSync2(input.file).mode & 73) !== 0)
|
|
859
|
+
throw new Error("Executable files are not adoptable.");
|
|
860
|
+
const parsed = prose(input.text ?? inventoryText(input.file));
|
|
861
|
+
if (!parsed.body.trim()) throw new Error("Empty resource body.");
|
|
862
|
+
const name = input.name;
|
|
863
|
+
const id = safeName(name);
|
|
864
|
+
const omittedFields = Object.keys(parsed.metadata).filter((key) => !PROMPT_KEYS.has(key));
|
|
865
|
+
const metadata = {
|
|
866
|
+
description: typeof parsed.metadata.description === "string" ? parsed.metadata.description : `Adopted prompt ${name}`
|
|
867
|
+
};
|
|
868
|
+
const hint = parsed.metadata["argument-hint"] ?? parsed.metadata.argumentHint;
|
|
869
|
+
if (typeof hint === "string") metadata["argument-hint"] = hint;
|
|
870
|
+
const componentPath = `prompts/${id}.md`;
|
|
871
|
+
return {
|
|
872
|
+
id,
|
|
873
|
+
name,
|
|
874
|
+
files: { [componentPath]: `---
|
|
875
|
+
${(0, import_yaml2.stringify)(metadata)}---
|
|
876
|
+
${parsed.body}` },
|
|
877
|
+
componentPath,
|
|
878
|
+
omittedFields,
|
|
879
|
+
omittedFiles: [],
|
|
880
|
+
requiredOmissions: [],
|
|
881
|
+
bindings: []
|
|
882
|
+
};
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
// src/domains/interop/foreign.ts
|
|
886
|
+
var FOREIGN_MANIFESTS = [
|
|
887
|
+
{ format: "portable", path: "plugin.json" },
|
|
888
|
+
{ format: "claude-code", path: ".claude-plugin/plugin.json" },
|
|
889
|
+
{ format: "codex", path: ".codex-plugin/plugin.json" }
|
|
890
|
+
];
|
|
891
|
+
function detectForeignPlugin(root, explicit) {
|
|
892
|
+
const present = (relative) => {
|
|
893
|
+
try {
|
|
894
|
+
lstatSync3(path5.join(root, relative));
|
|
895
|
+
return true;
|
|
896
|
+
} catch {
|
|
897
|
+
return false;
|
|
898
|
+
}
|
|
899
|
+
};
|
|
900
|
+
const candidates = FOREIGN_MANIFESTS.filter(({ path: relative }) => present(relative));
|
|
901
|
+
const diagnostics = [];
|
|
902
|
+
const portable = candidates.find((candidate) => candidate.format === "portable");
|
|
903
|
+
if (portable) {
|
|
904
|
+
if (!lstatSync3(path5.join(root, "plugin.json")).isFile())
|
|
905
|
+
diagnostics.push("Root plugin.json exists but is not a regular file; the portable manifest is invalid.");
|
|
906
|
+
if (explicit)
|
|
907
|
+
diagnostics.push(`Root plugin.json is portable; --format ${explicit} is ignored and no foreign fallback runs.`);
|
|
908
|
+
for (const other of candidates.filter((candidate) => candidate.format !== "portable"))
|
|
909
|
+
diagnostics.push(`Ignoring ${other.path}: the portable root plugin.json takes precedence.`);
|
|
910
|
+
return { format: "portable", manifestPath: portable.path, candidates, ambiguous: false, diagnostics };
|
|
911
|
+
}
|
|
912
|
+
const hidden = candidates.filter((candidate) => candidate.format !== "portable");
|
|
913
|
+
if (hidden.length === 0)
|
|
914
|
+
return {
|
|
915
|
+
format: "none",
|
|
916
|
+
candidates,
|
|
917
|
+
ambiguous: false,
|
|
918
|
+
diagnostics: [
|
|
919
|
+
"No plugin manifest found: expected plugin.json, .claude-plugin/plugin.json or .codex-plugin/plugin.json."
|
|
920
|
+
]
|
|
921
|
+
};
|
|
922
|
+
if (explicit) {
|
|
923
|
+
const chosen = hidden.find((candidate) => candidate.format === explicit);
|
|
924
|
+
if (!chosen)
|
|
925
|
+
return {
|
|
926
|
+
format: "none",
|
|
927
|
+
candidates,
|
|
928
|
+
ambiguous: false,
|
|
929
|
+
diagnostics: [`No ${explicit} manifest present; found ${hidden.map((item) => item.path).join(", ")}.`]
|
|
930
|
+
};
|
|
931
|
+
return { format: chosen.format, manifestPath: chosen.path, candidates, ambiguous: false, diagnostics };
|
|
932
|
+
}
|
|
933
|
+
if (hidden.length > 1)
|
|
934
|
+
return {
|
|
935
|
+
format: "none",
|
|
936
|
+
candidates,
|
|
937
|
+
ambiguous: true,
|
|
938
|
+
diagnostics: [
|
|
939
|
+
`Both ${hidden.map((item) => item.path).join(" and ")} are present; choose --format claude or --format codex.`
|
|
940
|
+
]
|
|
941
|
+
};
|
|
942
|
+
const only = hidden[0];
|
|
943
|
+
return { format: only.format, manifestPath: only.path, candidates, ambiguous: false, diagnostics };
|
|
944
|
+
}
|
|
945
|
+
function record(value) {
|
|
946
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
947
|
+
}
|
|
948
|
+
function pathList(value, field, problems) {
|
|
949
|
+
if (value === void 0) return [];
|
|
950
|
+
const items = typeof value === "string" ? [value] : Array.isArray(value) ? value : void 0;
|
|
951
|
+
if (!items || items.some((item) => typeof item !== "string")) {
|
|
952
|
+
problems.push(`Manifest ${field} must be a path or list of paths; ignored.`);
|
|
953
|
+
return [];
|
|
954
|
+
}
|
|
955
|
+
return items;
|
|
956
|
+
}
|
|
957
|
+
function contained(root, relative) {
|
|
958
|
+
if (relative.includes("\\") || relative.includes("\0") || path5.isAbsolute(relative))
|
|
959
|
+
throw new Error(`Manifest path is not relative: ${relative}`);
|
|
960
|
+
const full = path5.resolve(root, relative);
|
|
961
|
+
const rel = path5.relative(root, full);
|
|
962
|
+
if (rel === ".." || rel.startsWith(`..${path5.sep}`)) throw new Error(`Manifest path escapes the package: ${relative}`);
|
|
963
|
+
let cursor = root;
|
|
964
|
+
for (const part of rel.split(path5.sep).filter(Boolean)) {
|
|
965
|
+
cursor = path5.join(cursor, part);
|
|
966
|
+
if (lstatSync3(cursor).isSymbolicLink()) throw new Error(`Manifest path crosses a symbolic link: ${relative}`);
|
|
967
|
+
}
|
|
968
|
+
return full;
|
|
969
|
+
}
|
|
970
|
+
function relativeTo(root, file) {
|
|
971
|
+
return path5.relative(root, file).split(path5.sep).join("/");
|
|
972
|
+
}
|
|
973
|
+
function isDir(file) {
|
|
974
|
+
try {
|
|
975
|
+
return lstatSync3(file).isDirectory();
|
|
976
|
+
} catch {
|
|
977
|
+
return false;
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
function isFile(file) {
|
|
981
|
+
try {
|
|
982
|
+
return lstatSync3(file).isFile();
|
|
983
|
+
} catch {
|
|
984
|
+
return false;
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
function skillDirectories(root, declared) {
|
|
988
|
+
const base = contained(root, declared);
|
|
989
|
+
if (!isDir(base)) return [];
|
|
990
|
+
if (isFile(path5.join(base, "SKILL.md"))) return [base];
|
|
991
|
+
return readdirSync3(base).sort().map((name) => path5.join(base, name)).filter((dir) => !lstatSync3(dir).isSymbolicLink() && isDir(dir) && isFile(path5.join(dir, "SKILL.md")));
|
|
992
|
+
}
|
|
993
|
+
function markdownFiles(root, declared, extensions) {
|
|
994
|
+
const base = contained(root, declared);
|
|
995
|
+
if (isFile(base)) return extensions.some((ext) => base.endsWith(ext)) ? [base] : [];
|
|
996
|
+
if (!isDir(base)) return [];
|
|
997
|
+
const found = [];
|
|
998
|
+
const walk = (dir, depth) => {
|
|
999
|
+
if (depth > 6) return;
|
|
1000
|
+
for (const name of readdirSync3(dir).sort()) {
|
|
1001
|
+
const file = path5.join(dir, name);
|
|
1002
|
+
const stat = lstatSync3(file);
|
|
1003
|
+
if (stat.isSymbolicLink()) continue;
|
|
1004
|
+
if (stat.isDirectory()) walk(file, depth + 1);
|
|
1005
|
+
else if (extensions.some((ext) => name.endsWith(ext))) found.push(file);
|
|
1006
|
+
}
|
|
1007
|
+
};
|
|
1008
|
+
walk(base, 0);
|
|
1009
|
+
return found;
|
|
1010
|
+
}
|
|
1011
|
+
var CLAUDE_UNSUPPORTED_FIELDS = [
|
|
1012
|
+
"hooks",
|
|
1013
|
+
"mcpServers",
|
|
1014
|
+
"lspServers",
|
|
1015
|
+
"outputStyles",
|
|
1016
|
+
"workflows",
|
|
1017
|
+
"experimental",
|
|
1018
|
+
"userConfig",
|
|
1019
|
+
"channels",
|
|
1020
|
+
"defaultEnabled"
|
|
1021
|
+
];
|
|
1022
|
+
var CODEX_UNSUPPORTED_FIELDS = ["apps", "hooks", "mcpServers", "interface"];
|
|
1023
|
+
var UNSUPPORTED_FILES = [
|
|
1024
|
+
"hooks/hooks.json",
|
|
1025
|
+
".mcp.json",
|
|
1026
|
+
"mcp.json",
|
|
1027
|
+
".lsp.json",
|
|
1028
|
+
".app.json",
|
|
1029
|
+
"monitors/monitors.json",
|
|
1030
|
+
"output-styles",
|
|
1031
|
+
"scripts",
|
|
1032
|
+
"tools"
|
|
1033
|
+
];
|
|
1034
|
+
function projectForeignPlugin(input) {
|
|
1035
|
+
const root = path5.resolve(input.root);
|
|
1036
|
+
const manifestPath = input.manifestPath ?? (input.format === "claude-code" ? ".claude-plugin/plugin.json" : ".codex-plugin/plugin.json");
|
|
1037
|
+
const manifestFile = contained(root, manifestPath);
|
|
1038
|
+
if (!isFile(manifestFile)) throw new Error(`Missing ${manifestPath}.`);
|
|
1039
|
+
const parsed = JSON.parse(inventoryText(manifestFile));
|
|
1040
|
+
if (!record(parsed)) throw new Error(`${manifestPath} must be a JSON object.`);
|
|
1041
|
+
const notes = [];
|
|
1042
|
+
const unsupported = [];
|
|
1043
|
+
const outcomes = [];
|
|
1044
|
+
const rawName = typeof parsed.name === "string" && parsed.name.trim() ? parsed.name.trim() : "";
|
|
1045
|
+
if (!rawName) throw new Error(`${manifestPath} requires a name.`);
|
|
1046
|
+
const id = isPluginId(rawName) ? rawName : safeName(rawName);
|
|
1047
|
+
if (id !== rawName) notes.push(`Package name "${rawName}" normalized to Clio id "${id}".`);
|
|
1048
|
+
let version = "0.0.0";
|
|
1049
|
+
if (parsed.version === void 0) notes.push("Vendor manifest declares no version; projected as 0.0.0.");
|
|
1050
|
+
else if (isSemanticVersion(parsed.version)) version = parsed.version;
|
|
1051
|
+
else throw new Error(`${manifestPath} version ${JSON.stringify(parsed.version)} is not a Semantic Version.`);
|
|
1052
|
+
notes.push(
|
|
1053
|
+
`Vendor identity: ${manifestPath} name ${JSON.stringify(rawName)}, version ${parsed.version === void 0 ? "absent" : JSON.stringify(parsed.version)}.`
|
|
1054
|
+
);
|
|
1055
|
+
const description = typeof parsed.description === "string" ? parsed.description : `Imported ${input.format === "claude-code" ? "Claude Code" : "Codex"} plugin ${rawName}`;
|
|
1056
|
+
const fieldList = input.format === "claude-code" ? CLAUDE_UNSUPPORTED_FIELDS : CODEX_UNSUPPORTED_FIELDS;
|
|
1057
|
+
for (const field of fieldList)
|
|
1058
|
+
if (parsed[field] !== void 0) unsupported.push(`${manifestPath}#${field}: never activated by Clio import.`);
|
|
1059
|
+
const requirements = [];
|
|
1060
|
+
if (parsed.dependencies !== void 0) {
|
|
1061
|
+
if (!Array.isArray(parsed.dependencies)) throw new Error(`${manifestPath} dependencies must be an array.`);
|
|
1062
|
+
for (const dependency of parsed.dependencies) {
|
|
1063
|
+
const name = typeof dependency === "string" ? dependency : record(dependency) ? dependency.name : void 0;
|
|
1064
|
+
if (typeof name !== "string" || !name.trim())
|
|
1065
|
+
throw new Error(`${manifestPath} declares a dependency without a name; the package cannot be imported.`);
|
|
1066
|
+
if (record(dependency) && dependency.version !== void 0)
|
|
1067
|
+
throw new Error(
|
|
1068
|
+
`${manifestPath} dependency ${name} declares version constraint ${JSON.stringify(dependency.version)}; version-constrained vendor dependencies are not supported. Import ${name} first and remove the constraint in a reviewed copy, or skip this package.`
|
|
1069
|
+
);
|
|
1070
|
+
if (record(dependency)) {
|
|
1071
|
+
const unknown = Object.keys(dependency).filter((key) => !["name", "version"].includes(key));
|
|
1072
|
+
if (unknown.length)
|
|
1073
|
+
throw new Error(
|
|
1074
|
+
`${manifestPath} dependency ${name} declares unsupported fields ${unknown.join(", ")}; source or marketplace constrained dependencies cannot be imported.`
|
|
1075
|
+
);
|
|
1076
|
+
}
|
|
1077
|
+
if (!isPluginId(name))
|
|
1078
|
+
throw new Error(
|
|
1079
|
+
`${manifestPath} dependency ${JSON.stringify(name)} is not a portable identifier; it cannot be matched to an imported package.`
|
|
1080
|
+
);
|
|
1081
|
+
requirements.push(`plugin:${name}`);
|
|
1082
|
+
notes.push(
|
|
1083
|
+
`Vendor dependency ${name} requires plugin:${name} imported from the same ${input.format} format; native packages with that id do not satisfy it.`
|
|
1084
|
+
);
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
for (const file of UNSUPPORTED_FILES)
|
|
1088
|
+
if (existsSync3(path5.join(root, file))) unsupported.push(`${file}: host runtime content is not imported.`);
|
|
1089
|
+
const omittedTree = [];
|
|
1090
|
+
const sourceFiles = tree(root, true, omittedTree);
|
|
1091
|
+
const projected = /* @__PURE__ */ new Set();
|
|
1092
|
+
const files = {};
|
|
1093
|
+
const components = [];
|
|
1094
|
+
const resources = {};
|
|
1095
|
+
const usedIds = /* @__PURE__ */ new Map();
|
|
1096
|
+
const claim = (resource, kind, source) => {
|
|
1097
|
+
const key = `${kind}:${resource.id}`;
|
|
1098
|
+
const previous = usedIds.get(key);
|
|
1099
|
+
if (previous) {
|
|
1100
|
+
outcomes.push({
|
|
1101
|
+
kind,
|
|
1102
|
+
name: resource.name,
|
|
1103
|
+
source,
|
|
1104
|
+
status: "unsupported",
|
|
1105
|
+
reason: `Resource id ${resource.id} already provided by ${previous}.`
|
|
1106
|
+
});
|
|
1107
|
+
return false;
|
|
1108
|
+
}
|
|
1109
|
+
usedIds.set(key, source);
|
|
1110
|
+
return true;
|
|
1111
|
+
};
|
|
1112
|
+
const declaredSkills = [];
|
|
1113
|
+
const declaredCommands = [];
|
|
1114
|
+
const declaredAgents = [];
|
|
1115
|
+
const problems = [];
|
|
1116
|
+
const skillsField = pathList(parsed.skills, "skills", problems);
|
|
1117
|
+
if (input.format === "claude-code") {
|
|
1118
|
+
declaredSkills.push("skills", ...skillsField);
|
|
1119
|
+
const commands = pathList(parsed.commands, "commands", problems);
|
|
1120
|
+
declaredCommands.push(...commands.length ? commands : ["commands"]);
|
|
1121
|
+
if (commands.length && isDir(path5.join(root, "commands")) && !commands.some((c) => path5.resolve(root, c) === path5.join(root, "commands")))
|
|
1122
|
+
notes.push("Manifest commands replaces the default commands/ directory; the default folder is not scanned.");
|
|
1123
|
+
const agents = pathList(parsed.agents, "agents", problems);
|
|
1124
|
+
declaredAgents.push(...agents.length ? agents : ["agents"]);
|
|
1125
|
+
if (agents.length && isDir(path5.join(root, "agents")) && !agents.some((a) => path5.resolve(root, a) === path5.join(root, "agents")))
|
|
1126
|
+
notes.push("Manifest agents replaces the default agents/ directory; the default folder is not scanned.");
|
|
1127
|
+
} else {
|
|
1128
|
+
declaredSkills.push(...skillsField.length ? skillsField : ["skills"]);
|
|
1129
|
+
if (isDir(path5.join(root, "commands")) || isDir(path5.join(root, "agents")))
|
|
1130
|
+
notes.push("commands/ and agents/ are not Codex plugin components and were not imported.");
|
|
1131
|
+
}
|
|
1132
|
+
notes.push(...problems);
|
|
1133
|
+
const seenSkillDirs = /* @__PURE__ */ new Set();
|
|
1134
|
+
const skillDirs = [];
|
|
1135
|
+
for (const declared of declaredSkills) {
|
|
1136
|
+
try {
|
|
1137
|
+
for (const dir of skillDirectories(root, declared))
|
|
1138
|
+
if (!seenSkillDirs.has(dir)) {
|
|
1139
|
+
seenSkillDirs.add(dir);
|
|
1140
|
+
skillDirs.push(dir);
|
|
1141
|
+
}
|
|
1142
|
+
} catch (error) {
|
|
1143
|
+
unsupported.push(`skills path ${declared}: ${error instanceof Error ? error.message : String(error)}`);
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
if (input.format === "claude-code" && skillDirs.length === 0 && !isDir(path5.join(root, "skills")) && skillsField.length === 0 && isFile(path5.join(root, "SKILL.md"))) {
|
|
1147
|
+
skillDirs.push(root);
|
|
1148
|
+
notes.push("Root SKILL.md loaded as the plugin's single skill (documented Claude Code fallback).");
|
|
1149
|
+
}
|
|
1150
|
+
const siblingRoots = new Set(
|
|
1151
|
+
[
|
|
1152
|
+
".claude-plugin",
|
|
1153
|
+
".codex-plugin",
|
|
1154
|
+
"skills",
|
|
1155
|
+
"commands",
|
|
1156
|
+
"agents",
|
|
1157
|
+
...declaredCommands,
|
|
1158
|
+
...declaredAgents,
|
|
1159
|
+
...skillsField
|
|
1160
|
+
].map((entry) => entry.replace(/^\.\//u, "").split("/")[0] ?? "").filter((entry) => entry && entry !== ".")
|
|
1161
|
+
);
|
|
1162
|
+
for (const dir of skillDirs) {
|
|
1163
|
+
const source = dir === root ? "SKILL.md" : `${relativeTo(root, dir)}/SKILL.md`;
|
|
1164
|
+
const fallbackName = dir === root ? rawName : path5.basename(dir);
|
|
1165
|
+
const prefix = dir === root ? "" : `${relativeTo(root, dir)}/`;
|
|
1166
|
+
try {
|
|
1167
|
+
const resource = projectSkill({
|
|
1168
|
+
skillDir: dir,
|
|
1169
|
+
fallbackName,
|
|
1170
|
+
lenient: true,
|
|
1171
|
+
...dir === root ? { excludeTopLevel: siblingRoots } : {}
|
|
1172
|
+
});
|
|
1173
|
+
const omittedFiles = resource.omittedFiles.map((file) => `${prefix}${file}`);
|
|
1174
|
+
if (resource.requiredOmissions.length) {
|
|
1175
|
+
outcomes.push({
|
|
1176
|
+
kind: "skill",
|
|
1177
|
+
name: resource.name,
|
|
1178
|
+
source,
|
|
1179
|
+
status: "unsupported",
|
|
1180
|
+
reason: `Instructions reference omitted companions: ${resource.requiredOmissions.join(", ")}.`,
|
|
1181
|
+
omittedFields: resource.omittedFields,
|
|
1182
|
+
omittedFiles
|
|
1183
|
+
});
|
|
1184
|
+
continue;
|
|
1185
|
+
}
|
|
1186
|
+
if (!claim(resource, "skill", source)) continue;
|
|
1187
|
+
Object.assign(files, resource.files);
|
|
1188
|
+
components.push({ kind: "skill", id: resource.id, path: resource.componentPath });
|
|
1189
|
+
resources.skills = "skills";
|
|
1190
|
+
for (const file of Object.keys(resource.files))
|
|
1191
|
+
projected.add(`${prefix}${file.slice(`skills/${resource.id}/`.length)}`);
|
|
1192
|
+
outcomes.push({
|
|
1193
|
+
kind: "skill",
|
|
1194
|
+
name: resource.name,
|
|
1195
|
+
source,
|
|
1196
|
+
status: "converted",
|
|
1197
|
+
id: resource.id,
|
|
1198
|
+
destination: resource.componentPath,
|
|
1199
|
+
...resource.omittedFields.length ? { omittedFields: resource.omittedFields } : {},
|
|
1200
|
+
...omittedFiles.length ? { omittedFiles } : {}
|
|
1201
|
+
});
|
|
1202
|
+
} catch (error) {
|
|
1203
|
+
outcomes.push({
|
|
1204
|
+
kind: "skill",
|
|
1205
|
+
name: fallbackName,
|
|
1206
|
+
source,
|
|
1207
|
+
status: "unsupported",
|
|
1208
|
+
reason: error instanceof Error ? error.message : String(error)
|
|
1209
|
+
});
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
const collect = (declared, kind, extensions, convert) => {
|
|
1213
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1214
|
+
for (const entry of declared) {
|
|
1215
|
+
let found;
|
|
1216
|
+
try {
|
|
1217
|
+
found = markdownFiles(root, entry, extensions);
|
|
1218
|
+
} catch (error) {
|
|
1219
|
+
unsupported.push(`${kind} path ${entry}: ${error instanceof Error ? error.message : String(error)}`);
|
|
1220
|
+
continue;
|
|
1221
|
+
}
|
|
1222
|
+
for (const file of found) {
|
|
1223
|
+
if (seen.has(file)) continue;
|
|
1224
|
+
seen.add(file);
|
|
1225
|
+
const source = relativeTo(root, file);
|
|
1226
|
+
const name = path5.basename(file, path5.extname(file));
|
|
1227
|
+
try {
|
|
1228
|
+
const resource = convert(file, name);
|
|
1229
|
+
if (!claim(resource, kind, source)) continue;
|
|
1230
|
+
Object.assign(files, resource.files);
|
|
1231
|
+
components.push({ kind, id: resource.id, path: resource.componentPath });
|
|
1232
|
+
resources[`${kind}s`] = `${kind}s`;
|
|
1233
|
+
projected.add(source);
|
|
1234
|
+
outcomes.push({
|
|
1235
|
+
kind,
|
|
1236
|
+
name: resource.name,
|
|
1237
|
+
source,
|
|
1238
|
+
status: "converted",
|
|
1239
|
+
id: resource.id,
|
|
1240
|
+
destination: resource.componentPath,
|
|
1241
|
+
...resource.omittedFields.length ? { omittedFields: resource.omittedFields } : {}
|
|
1242
|
+
});
|
|
1243
|
+
} catch (error) {
|
|
1244
|
+
outcomes.push({
|
|
1245
|
+
kind,
|
|
1246
|
+
name,
|
|
1247
|
+
source,
|
|
1248
|
+
status: "unsupported",
|
|
1249
|
+
reason: error instanceof Error ? error.message : String(error)
|
|
1250
|
+
});
|
|
1251
|
+
}
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
};
|
|
1255
|
+
if (input.format === "claude-code") {
|
|
1256
|
+
collect(declaredCommands, "prompt", [".md"], (file, name) => projectPrompt({ file, name }));
|
|
1257
|
+
const convertedSkills = new Set(
|
|
1258
|
+
outcomes.filter((o) => o.kind === "skill" && o.status === "converted").map((o) => o.name)
|
|
1259
|
+
);
|
|
1260
|
+
collect(declaredAgents, "agent", [".md"], (file, name) => {
|
|
1261
|
+
const declared = projectAgent({ file, name }).bindings;
|
|
1262
|
+
const bound = declared.filter((skill) => !convertedSkills.has(skill));
|
|
1263
|
+
if (bound.length)
|
|
1264
|
+
throw new Error(`Agent binds skills that were not converted: ${bound.join(", ")}; Clio cannot honor the binding.`);
|
|
1265
|
+
return projectAgent({ file, name, bindSkills: declared });
|
|
1266
|
+
});
|
|
1267
|
+
}
|
|
1268
|
+
const omitted = [
|
|
1269
|
+
...omittedTree,
|
|
1270
|
+
...Object.keys(sourceFiles).filter((file) => !projected.has(file) && file !== manifestPath)
|
|
1271
|
+
].sort();
|
|
1272
|
+
files["plugin.json"] = `${JSON.stringify(
|
|
1273
|
+
{
|
|
1274
|
+
$schema: PLUGIN_SCHEMA,
|
|
1275
|
+
name: id,
|
|
1276
|
+
version,
|
|
1277
|
+
description,
|
|
1278
|
+
...record(parsed.author) && Object.values(parsed.author).every((v) => typeof v === "string") ? {
|
|
1279
|
+
author: Object.fromEntries(
|
|
1280
|
+
Object.entries(parsed.author).filter(([key]) => ["name", "email", "url"].includes(key))
|
|
1281
|
+
)
|
|
1282
|
+
} : {},
|
|
1283
|
+
...typeof parsed.homepage === "string" ? { homepage: parsed.homepage } : {},
|
|
1284
|
+
...typeof parsed.repository === "string" ? { repository: parsed.repository } : {},
|
|
1285
|
+
...typeof parsed.license === "string" ? { license: parsed.license } : {},
|
|
1286
|
+
...Array.isArray(parsed.keywords) && parsed.keywords.every((k) => typeof k === "string") ? { keywords: parsed.keywords } : {},
|
|
1287
|
+
extensions: {
|
|
1288
|
+
[PLUGIN_EXTENSION_KEY]: {
|
|
1289
|
+
manifestVersion: 1,
|
|
1290
|
+
...requirements.length ? { requires: requirements } : {},
|
|
1291
|
+
resources,
|
|
1292
|
+
components
|
|
1293
|
+
}
|
|
1294
|
+
}
|
|
1295
|
+
},
|
|
1296
|
+
null,
|
|
1297
|
+
2
|
|
1298
|
+
)}
|
|
1299
|
+
`;
|
|
1300
|
+
return {
|
|
1301
|
+
format: input.format,
|
|
1302
|
+
manifestPath,
|
|
1303
|
+
id,
|
|
1304
|
+
version,
|
|
1305
|
+
description,
|
|
1306
|
+
files,
|
|
1307
|
+
requirements,
|
|
1308
|
+
outcomes,
|
|
1309
|
+
unsupported: [...new Set(unsupported)],
|
|
1310
|
+
omitted: [...new Set(omitted)],
|
|
1311
|
+
notes
|
|
1312
|
+
};
|
|
1313
|
+
}
|
|
1314
|
+
|
|
1315
|
+
// src/domains/interop/install.ts
|
|
1316
|
+
init_esm_shims();
|
|
1317
|
+
function installInteropPackage(input) {
|
|
1318
|
+
return installLibraryPackage(input);
|
|
1319
|
+
}
|
|
1320
|
+
|
|
1321
|
+
// src/domains/interop/adopt.ts
|
|
1322
|
+
function preparePortablePackage(root) {
|
|
1323
|
+
const candidate = readPluginManifest(root);
|
|
1324
|
+
if (!candidate.valid || !candidate.manifest)
|
|
1325
|
+
throw new Error(
|
|
1326
|
+
`Not adoptable: invalid portable root plugin.json (${candidate.diagnostics.map((d) => d.message).join("; ")}).`
|
|
1327
|
+
);
|
|
1328
|
+
const manifest = candidate.manifest;
|
|
1329
|
+
const omitted = [];
|
|
1330
|
+
const files = tree(root, true, omitted);
|
|
1331
|
+
const raw = JSON.parse(files["plugin.json"] ?? "{}");
|
|
1332
|
+
const resources = Object.fromEntries(
|
|
1333
|
+
Object.entries(manifest.clio.resources).filter(([key]) => ["skills", "agents", "prompts"].includes(key))
|
|
1334
|
+
);
|
|
1335
|
+
const components = manifest.clio.components.filter(
|
|
1336
|
+
(component) => ["skill", "agent", "prompt", "resource"].includes(component.kind) && files[component.path] !== void 0
|
|
1337
|
+
);
|
|
1338
|
+
const retained = new Set(components.map((component) => `${component.kind}:${component.id}`));
|
|
1339
|
+
if (components.some((component) => component.requires?.some((ref) => !retained.has(ref))))
|
|
1340
|
+
throw new Error("Not adoptable: retained resources require omitted executable components.");
|
|
1341
|
+
const kind = manifest.clio.kind ?? "plugin";
|
|
1342
|
+
if (!["plugin", "skill", "agent", "prompt"].includes(kind))
|
|
1343
|
+
throw new Error(
|
|
1344
|
+
`Not adoptable: ${kind} packages have no data-only projection; install them through the library instead.`
|
|
1345
|
+
);
|
|
1346
|
+
if (kind !== "plugin" && !components.some((component) => component.kind === kind))
|
|
1347
|
+
throw new Error(`Not adoptable: the ${kind} package's public ${kind} component is not projectable.`);
|
|
1348
|
+
const validation = validateLibraryPackage(root);
|
|
1349
|
+
if (!validation.valid)
|
|
1350
|
+
throw new Error(
|
|
1351
|
+
`Not adoptable: invalid recipe content (${validation.validation.diagnostics.filter((item) => item.severity === "error").map((item) => item.message).join("; ")}).`
|
|
1352
|
+
);
|
|
1353
|
+
const recipes = validation.validation.resources.filter(
|
|
1354
|
+
(resource) => ["skill", "agent", "prompt"].includes(resource.kind) && files[resource.path] !== void 0
|
|
1355
|
+
);
|
|
1356
|
+
if (recipes.length === 0) throw new Error("Not adoptable: the portable package has no supported data-only recipes.");
|
|
1357
|
+
const outcomes = [];
|
|
1358
|
+
for (const resource of recipes) {
|
|
1359
|
+
const component = components.find((item) => item.kind === resource.kind && item.path === resource.path);
|
|
1360
|
+
const skillDir = resource.kind === "skill" ? path6.posix.dirname(resource.path) : void 0;
|
|
1361
|
+
const dir = skillDir === void 0 ? void 0 : skillDir === "." ? "" : `${skillDir}/`;
|
|
1362
|
+
const texts = Object.entries(files).filter(([file]) => file !== "plugin.json" && (dir === void 0 ? file === resource.path : file.startsWith(dir))).map(([, text]) => text);
|
|
1363
|
+
const needed = omitted.filter((file) => {
|
|
1364
|
+
const own = dir !== void 0 && file.startsWith(dir);
|
|
1365
|
+
const base = path6.posix.basename(file);
|
|
1366
|
+
return texts.some((text) => text.includes(file) || own && base.includes(".") && text.includes(base));
|
|
1367
|
+
});
|
|
1368
|
+
if (needed.length)
|
|
1369
|
+
throw new Error(
|
|
1370
|
+
`Not adoptable: ${resource.kind} ${resource.name} references omitted companions (${needed.join(", ")}); the data-only import cannot claim it works. Use library install for script-bearing packages.`
|
|
1371
|
+
);
|
|
1372
|
+
outcomes.push({
|
|
1373
|
+
kind: resource.kind,
|
|
1374
|
+
name: resource.name,
|
|
1375
|
+
source: resource.path,
|
|
1376
|
+
status: "converted",
|
|
1377
|
+
...component ? { id: component.id } : {},
|
|
1378
|
+
destination: resource.path
|
|
1379
|
+
});
|
|
1380
|
+
}
|
|
1381
|
+
raw.extensions = {
|
|
1382
|
+
[PLUGIN_EXTENSION_KEY]: {
|
|
1383
|
+
manifestVersion: 1,
|
|
1384
|
+
...kind !== "plugin" ? { kind } : {},
|
|
1385
|
+
...manifest.clio.requires ? { requires: manifest.clio.requires } : {},
|
|
1386
|
+
resources,
|
|
1387
|
+
components,
|
|
1388
|
+
...manifest.clio.compatibility ? { compatibility: manifest.clio.compatibility } : {}
|
|
1389
|
+
}
|
|
1390
|
+
};
|
|
1391
|
+
files["plugin.json"] = JSON.stringify(raw, null, 2);
|
|
1392
|
+
return {
|
|
1393
|
+
id: manifest.name,
|
|
1394
|
+
version: manifest.version ?? "0.0.0",
|
|
1395
|
+
files,
|
|
1396
|
+
note: "Data-only portable projection; hooks, MCP, scripts, tools, fleets and host settings are skipped. References to omitted files are unavailable.",
|
|
1397
|
+
omitted,
|
|
1398
|
+
requirements: [...manifest.clio.requires ?? []],
|
|
1399
|
+
format: "portable",
|
|
1400
|
+
outcomes
|
|
1401
|
+
};
|
|
1402
|
+
}
|
|
1403
|
+
function prepareForeignPackage(root, format) {
|
|
1404
|
+
const detection = detectForeignPlugin(root, format);
|
|
1405
|
+
if (detection.format === "portable") throw new Error("Portable root plugin.json present; use the portable route.");
|
|
1406
|
+
if (detection.format === "none") throw new Error(`Not adoptable: ${detection.diagnostics.join(" ")}`);
|
|
1407
|
+
const projection = projectForeignPlugin({
|
|
1408
|
+
root,
|
|
1409
|
+
format: detection.format,
|
|
1410
|
+
...detection.manifestPath ? { manifestPath: detection.manifestPath } : {}
|
|
1411
|
+
});
|
|
1412
|
+
if (!projection.outcomes.some((outcome) => outcome.status === "converted"))
|
|
1413
|
+
throw new Error(
|
|
1414
|
+
`Not adoptable: no supported recipe converted from ${detection.manifestPath}${projection.outcomes.length ? ` (${projection.outcomes.map((o) => `${o.kind} ${o.name}: ${o.reason ?? "unsupported"}`).join("; ")})` : ""}.`
|
|
1415
|
+
);
|
|
1416
|
+
return {
|
|
1417
|
+
id: projection.id,
|
|
1418
|
+
version: projection.version,
|
|
1419
|
+
files: projection.files,
|
|
1420
|
+
note: `${detection.format === "claude-code" ? "Claude Code" : "Codex"} plugin normalized to a portable Clio package; hooks, MCP, LSP, scripts and host settings are never activated.${projection.notes.length ? ` ${projection.notes.join(" ")}` : ""}`,
|
|
1421
|
+
omitted: projection.omitted,
|
|
1422
|
+
requirements: projection.requirements,
|
|
1423
|
+
format: detection.format,
|
|
1424
|
+
outcomes: projection.outcomes,
|
|
1425
|
+
unsupported: projection.unsupported
|
|
1426
|
+
};
|
|
1427
|
+
}
|
|
1428
|
+
function prepared(item, host) {
|
|
1429
|
+
let value;
|
|
1430
|
+
if (item.kind === "plugin") {
|
|
1431
|
+
const detection = detectForeignPlugin(item.path);
|
|
1432
|
+
value = detection.format === "portable" || detection.format === "none" ? preparePortablePackage(item.path) : prepareForeignPackage(item.path, detection.format);
|
|
1433
|
+
} else {
|
|
1434
|
+
const id = safeName(`${host}-${item.kind}-${item.name}`);
|
|
1435
|
+
const plural = `${item.kind}s`;
|
|
1436
|
+
let note = "Text only; foreign execution settings are not imported.";
|
|
1437
|
+
const resource = item.kind === "skill" ? projectSkill({ skillDir: path6.dirname(item.path), fallbackName: item.name }) : item.kind === "agent" ? projectAgent({ file: item.path, name: item.name }) : projectPrompt({ file: item.path, name: item.name });
|
|
1438
|
+
if (item.kind === "agent")
|
|
1439
|
+
note = "Persona copied into a read-only Clio recipe; host tools, permissions, model, hooks and skill bindings are omitted.";
|
|
1440
|
+
const files = { ...resource.files };
|
|
1441
|
+
files["plugin.json"] = JSON.stringify(
|
|
1442
|
+
{
|
|
1443
|
+
$schema: PLUGIN_SCHEMA,
|
|
1444
|
+
name: id,
|
|
1445
|
+
version: "0.0.0",
|
|
1446
|
+
description: `Adopted ${item.kind} from ${host}`,
|
|
1447
|
+
extensions: {
|
|
1448
|
+
[PLUGIN_EXTENSION_KEY]: {
|
|
1449
|
+
manifestVersion: 1,
|
|
1450
|
+
kind: item.kind,
|
|
1451
|
+
resources: { [plural]: plural },
|
|
1452
|
+
components: [{ kind: item.kind, id: resource.id, path: resource.componentPath }]
|
|
1453
|
+
}
|
|
1454
|
+
}
|
|
1455
|
+
},
|
|
1456
|
+
null,
|
|
1457
|
+
2
|
|
1458
|
+
);
|
|
1459
|
+
value = {
|
|
1460
|
+
id,
|
|
1461
|
+
version: "0.0.0",
|
|
1462
|
+
files,
|
|
1463
|
+
note,
|
|
1464
|
+
omitted: [],
|
|
1465
|
+
requirements: [],
|
|
1466
|
+
...resource.omittedFields.length ? {
|
|
1467
|
+
outcomes: [
|
|
1468
|
+
{
|
|
1469
|
+
kind: item.kind,
|
|
1470
|
+
name: resource.name,
|
|
1471
|
+
source: item.path,
|
|
1472
|
+
status: "converted",
|
|
1473
|
+
id: resource.id,
|
|
1474
|
+
destination: resource.componentPath,
|
|
1475
|
+
omittedFields: resource.omittedFields
|
|
1476
|
+
}
|
|
1477
|
+
]
|
|
1478
|
+
} : {}
|
|
1479
|
+
};
|
|
1480
|
+
}
|
|
1481
|
+
const manifest = JSON.parse(value.files["plugin.json"] ?? "{}");
|
|
1482
|
+
manifest.extensions = {
|
|
1483
|
+
...manifest.extensions,
|
|
1484
|
+
"ai.iowarp.clio.interop": {
|
|
1485
|
+
host,
|
|
1486
|
+
source: item.path,
|
|
1487
|
+
sourceScope: item.scope,
|
|
1488
|
+
untrusted: true,
|
|
1489
|
+
...value.format ? { format: value.format } : {}
|
|
1490
|
+
}
|
|
1491
|
+
};
|
|
1492
|
+
value.files["plugin.json"] = `${JSON.stringify(manifest, null, 2)}
|
|
1493
|
+
`;
|
|
1494
|
+
return value;
|
|
1495
|
+
}
|
|
1496
|
+
function vendorOf(format) {
|
|
1497
|
+
return format === "claude-code" || format === "codex" ? format : void 0;
|
|
1498
|
+
}
|
|
1499
|
+
function unmetRequirements(requirements, cwd, scope, vendor) {
|
|
1500
|
+
if (requirements.length === 0) return [];
|
|
1501
|
+
const available = new Map(
|
|
1502
|
+
listInstalledPlugins(cwd, { all: true, ...scope === "user" ? { scope } : {} }).filter((pkg) => pkg.loadable).map((pkg) => [`${pkg.kind ?? "plugin"}:${pkg.id}`, pkg])
|
|
1503
|
+
);
|
|
1504
|
+
const problems = /* @__PURE__ */ new Set();
|
|
1505
|
+
if (vendor)
|
|
1506
|
+
for (const ref of requirements) {
|
|
1507
|
+
const pkg = available.get(ref);
|
|
1508
|
+
if (!pkg) continue;
|
|
1509
|
+
const origin = readPluginInstallRecord(pkg.id, { cwd, scope: pkg.scope })?.origin;
|
|
1510
|
+
const provenance = typeof origin === "object" && (origin.kind === "import" || origin.kind === "interop") ? origin.format : void 0;
|
|
1511
|
+
if (provenance !== vendor)
|
|
1512
|
+
problems.add(
|
|
1513
|
+
`${ref} (installed package is not an imported ${vendor} plugin; a same-named native package does not satisfy a vendor dependency)`
|
|
1514
|
+
);
|
|
1515
|
+
}
|
|
1516
|
+
const visiting = /* @__PURE__ */ new Set();
|
|
1517
|
+
const checked = /* @__PURE__ */ new Set();
|
|
1518
|
+
const visit = (ref) => {
|
|
1519
|
+
if (visiting.has(ref)) {
|
|
1520
|
+
problems.add(`${ref} (dependency cycle)`);
|
|
1521
|
+
return;
|
|
1522
|
+
}
|
|
1523
|
+
if (checked.has(ref)) return;
|
|
1524
|
+
const dependency = available.get(ref);
|
|
1525
|
+
if (!dependency) {
|
|
1526
|
+
problems.add(`${ref} (missing, inactive, or unavailable in ${scope} scope)`);
|
|
1527
|
+
return;
|
|
1528
|
+
}
|
|
1529
|
+
visiting.add(ref);
|
|
1530
|
+
for (const nested of dependency.manifest?.clio.requires ?? []) visit(nested);
|
|
1531
|
+
visiting.delete(ref);
|
|
1532
|
+
checked.add(ref);
|
|
1533
|
+
};
|
|
1534
|
+
for (const ref of requirements) visit(ref);
|
|
1535
|
+
return [...problems];
|
|
1536
|
+
}
|
|
1537
|
+
function planInteropAdoption(input) {
|
|
1538
|
+
const cwd = path6.resolve(input.cwd ?? process.cwd());
|
|
1539
|
+
const scope = input.scope ?? "user";
|
|
1540
|
+
const installed = listInstalledPlugins(cwd, { all: true });
|
|
1541
|
+
const installedSkills = loadSkills({
|
|
1542
|
+
cwd,
|
|
1543
|
+
roots: [
|
|
1544
|
+
{ path: path6.join(clioConfigDir(), "skills"), scope: "user" },
|
|
1545
|
+
{ path: path6.join(cwd, ".clio-coder/skills"), scope: "project" },
|
|
1546
|
+
...installed.flatMap(
|
|
1547
|
+
(pkg) => pkg.resources.skills ? [{ path: path6.join(pkg.rootPath, pkg.resources.skills), rootPath: pkg.rootPath, scope: "package" }] : []
|
|
1548
|
+
)
|
|
1549
|
+
]
|
|
1550
|
+
}).items;
|
|
1551
|
+
const installedPrompts = loadPromptTemplates({
|
|
1552
|
+
cwd,
|
|
1553
|
+
roots: [
|
|
1554
|
+
{ path: path6.join(clioConfigDir(), "prompts"), scope: "user" },
|
|
1555
|
+
{ path: path6.join(cwd, ".clio-coder/prompts"), scope: "project" },
|
|
1556
|
+
...installed.flatMap(
|
|
1557
|
+
(pkg) => pkg.resources.prompts ? [{ path: path6.join(pkg.rootPath, pkg.resources.prompts), rootPath: pkg.rootPath, scope: "package" }] : []
|
|
1558
|
+
)
|
|
1559
|
+
]
|
|
1560
|
+
}).items;
|
|
1561
|
+
const promptBodies = new Set(
|
|
1562
|
+
installedPrompts.flatMap((prompt) => {
|
|
1563
|
+
try {
|
|
1564
|
+
return [prose(inventoryText(prompt.filePath)).body];
|
|
1565
|
+
} catch {
|
|
1566
|
+
return [];
|
|
1567
|
+
}
|
|
1568
|
+
})
|
|
1569
|
+
);
|
|
1570
|
+
const installedContent = new Set(
|
|
1571
|
+
installed.flatMap((pkg) => {
|
|
1572
|
+
try {
|
|
1573
|
+
const files = tree(pkg.rootPath);
|
|
1574
|
+
delete files["plugin.json"];
|
|
1575
|
+
return [digest(files)];
|
|
1576
|
+
} catch {
|
|
1577
|
+
return [];
|
|
1578
|
+
}
|
|
1579
|
+
})
|
|
1580
|
+
);
|
|
1581
|
+
const planned = /* @__PURE__ */ new Set();
|
|
1582
|
+
const plan = { host: input.host, cwd, scope, entries: [] };
|
|
1583
|
+
for (const item of input.inventory.items) {
|
|
1584
|
+
const skip = (reason) => {
|
|
1585
|
+
plan.entries.push({ item, action: "skip", reason });
|
|
1586
|
+
};
|
|
1587
|
+
if (!["skill", "agent", "prompt", "plugin"].includes(item.kind)) {
|
|
1588
|
+
skip(`Not adoptable: ${item.kind} is executable configuration or unsupported presentation data.`);
|
|
1589
|
+
continue;
|
|
1590
|
+
}
|
|
1591
|
+
if (input.kind && item.kind !== input.kind) {
|
|
1592
|
+
skip(`Excluded by --kind ${input.kind}.`);
|
|
1593
|
+
continue;
|
|
1594
|
+
}
|
|
1595
|
+
if (item.plugin && !input.kind && planned.has(item.plugin)) {
|
|
1596
|
+
skip("Provided by an installed or planned portable plugin.");
|
|
1597
|
+
continue;
|
|
1598
|
+
}
|
|
1599
|
+
try {
|
|
1600
|
+
if (item.kind === "skill" && installedSkills.some((skill) => skill.normalizedHash === normalizedSkillHash(inventoryText(item.path)))) {
|
|
1601
|
+
skip("Already installed: same skill content digest.");
|
|
1602
|
+
continue;
|
|
1603
|
+
}
|
|
1604
|
+
if (item.kind === "prompt" && promptBodies.has(prose(inventoryText(item.path)).body)) {
|
|
1605
|
+
skip("Already installed: same prompt content digest.");
|
|
1606
|
+
continue;
|
|
1607
|
+
}
|
|
1608
|
+
const value = prepared(item, input.host);
|
|
1609
|
+
const missing = unmetRequirements(value.requirements, cwd, scope, vendorOf(value.format));
|
|
1610
|
+
if (missing.length) {
|
|
1611
|
+
skip(
|
|
1612
|
+
`Unsatisfied package requirements: ${missing.join(", ")}. Install dependencies through the library and review a new plan; no extra resources are imported.`
|
|
1613
|
+
);
|
|
1614
|
+
continue;
|
|
1615
|
+
}
|
|
1616
|
+
const hash = digest(value.files);
|
|
1617
|
+
if (item.kind === "plugin" && installed.some((pkg) => pkg.id === value.id && pkg.version === value.version)) {
|
|
1618
|
+
planned.add(item.path);
|
|
1619
|
+
skip("Already installed: same package id and version.");
|
|
1620
|
+
continue;
|
|
1621
|
+
}
|
|
1622
|
+
const resourceFiles = { ...value.files };
|
|
1623
|
+
delete resourceFiles["plugin.json"];
|
|
1624
|
+
if (Object.keys(resourceFiles).length > 0 && installedContent.has(digest(resourceFiles))) {
|
|
1625
|
+
skip("Already installed: same content digest.");
|
|
1626
|
+
continue;
|
|
1627
|
+
}
|
|
1628
|
+
if (installed.some((pkg) => pkg.id === value.id && pkg.scope === scope) || planned.has(value.id)) {
|
|
1629
|
+
skip("Package identifier collision; existing content will not be replaced.");
|
|
1630
|
+
continue;
|
|
1631
|
+
}
|
|
1632
|
+
planned.add(value.id);
|
|
1633
|
+
if (item.kind === "plugin") planned.add(item.path);
|
|
1634
|
+
plan.entries.push({
|
|
1635
|
+
item,
|
|
1636
|
+
action: "install",
|
|
1637
|
+
id: value.id,
|
|
1638
|
+
destination: path6.join(pluginBaseDir(scope, cwd), value.id),
|
|
1639
|
+
files: value.files,
|
|
1640
|
+
digest: hash,
|
|
1641
|
+
reason: value.note,
|
|
1642
|
+
omitted: value.omitted,
|
|
1643
|
+
requirements: value.requirements,
|
|
1644
|
+
...value.format ? { format: value.format } : {},
|
|
1645
|
+
...value.outcomes?.length ? { outcomes: value.outcomes } : {},
|
|
1646
|
+
...value.unsupported?.length ? { unsupported: value.unsupported } : {}
|
|
1647
|
+
});
|
|
1648
|
+
} catch (error) {
|
|
1649
|
+
skip(error instanceof Error ? error.message : String(error));
|
|
1650
|
+
}
|
|
1651
|
+
}
|
|
1652
|
+
return plan;
|
|
1653
|
+
}
|
|
1654
|
+
function renderOutcomes(outcomes) {
|
|
1655
|
+
return (outcomes ?? []).map((outcome) => {
|
|
1656
|
+
const detail = [
|
|
1657
|
+
...outcome.omittedFields?.length ? [`omitted frontmatter: ${outcome.omittedFields.join(", ")}`] : [],
|
|
1658
|
+
...outcome.omittedFiles?.length ? [`omitted files: ${outcome.omittedFiles.join(", ")}`] : [],
|
|
1659
|
+
...outcome.reason ? [outcome.reason] : []
|
|
1660
|
+
];
|
|
1661
|
+
return outcome.status === "converted" ? ` CONVERT ${outcome.kind} ${outcome.name} -> ${outcome.destination}${detail.length ? ` (${detail.join("; ")})` : ""}` : ` UNSUPPORTED ${outcome.kind} ${outcome.name} (${outcome.source}): ${detail.join("; ")}`;
|
|
1662
|
+
});
|
|
1663
|
+
}
|
|
1664
|
+
function renderInteropAdoptionPlan(plan) {
|
|
1665
|
+
return [
|
|
1666
|
+
`Adopt resources from ${plan.host} into Clio (${plan.scope})?`,
|
|
1667
|
+
...plan.entries.flatMap((entry) => [
|
|
1668
|
+
`${entry.action.toUpperCase()} ${entry.item.kind} ${entry.item.name} (${entry.item.scope})`,
|
|
1669
|
+
` Source: ${entry.item.path}`,
|
|
1670
|
+
...entry.destination ? [` Destination: ${entry.destination}`, ` SHA-256: ${entry.digest}`] : [],
|
|
1671
|
+
` ${entry.reason}`,
|
|
1672
|
+
...entry.format && entry.format !== "portable" ? [` Format: ${entry.format} (normalized to a portable Clio package)`] : [],
|
|
1673
|
+
...entry.requirements?.length ? [` Requires installed packages: ${entry.requirements.join(", ")}`] : [],
|
|
1674
|
+
...renderOutcomes(entry.outcomes),
|
|
1675
|
+
...(entry.unsupported ?? []).map((feature) => ` UNSUPPORTED ${feature}`),
|
|
1676
|
+
...(entry.omitted ?? []).map((file) => ` SKIP ${file}: executable, host-specific, or non-text data.`)
|
|
1677
|
+
]),
|
|
1678
|
+
"Foreign resources remain untrusted until the project-import trust setting is enabled.",
|
|
1679
|
+
"Host files are never changed. Approval applies only to the displayed content."
|
|
1680
|
+
].join("\n");
|
|
1681
|
+
}
|
|
1682
|
+
function interopOrigin(host, entry) {
|
|
1683
|
+
const marketplace = entry.item.marketplace && entry.item.marketplace !== "unknown" ? entry.item.marketplace : void 0;
|
|
1684
|
+
return {
|
|
1685
|
+
kind: "interop",
|
|
1686
|
+
host,
|
|
1687
|
+
source: path6.resolve(entry.item.path),
|
|
1688
|
+
...entry.format ? { format: entry.format } : {},
|
|
1689
|
+
...marketplace ? { marketplace } : {}
|
|
1690
|
+
};
|
|
1691
|
+
}
|
|
1692
|
+
function applyInteropAdoption(plan, approved) {
|
|
1693
|
+
const result = { installed: [], diagnostics: [] };
|
|
1694
|
+
if (!approved) {
|
|
1695
|
+
result.diagnostics.push("Approval required; nothing installed.");
|
|
1696
|
+
return result;
|
|
1697
|
+
}
|
|
1698
|
+
for (const entry of plan.entries) {
|
|
1699
|
+
if (entry.action !== "install" || !entry.files || !entry.id) continue;
|
|
1700
|
+
let staging;
|
|
1701
|
+
try {
|
|
1702
|
+
const current = prepared(entry.item, plan.host);
|
|
1703
|
+
if (digest(entry.files) !== entry.digest || digest(current.files) !== entry.digest)
|
|
1704
|
+
throw new Error("Source or plan changed after review; inspect a new plan.");
|
|
1705
|
+
const missing = unmetRequirements(current.requirements, plan.cwd, plan.scope, vendorOf(current.format));
|
|
1706
|
+
if (missing.length)
|
|
1707
|
+
throw new Error(
|
|
1708
|
+
`Unsatisfied package requirements after review: ${missing.join(", ")}. No extra resources are imported.`
|
|
1709
|
+
);
|
|
1710
|
+
staging = mkdtempSync2(path6.join(tmpdir2(), "clio-coder-interop-adopt-"));
|
|
1711
|
+
for (const [file, text] of Object.entries(entry.files)) {
|
|
1712
|
+
const target = path6.join(staging, file);
|
|
1713
|
+
mkdirSync2(path6.dirname(target), { recursive: true });
|
|
1714
|
+
writeFileSync(target, text, { mode: 420 });
|
|
1715
|
+
}
|
|
1716
|
+
const candidate = readPluginManifest(staging);
|
|
1717
|
+
if (!candidate.valid || !candidate.contentDigest)
|
|
1718
|
+
throw new Error(candidate.diagnostics.map((d) => d.message).join("; "));
|
|
1719
|
+
const installed = installInteropPackage({
|
|
1720
|
+
sourcePath: staging,
|
|
1721
|
+
kind: entry.item.kind,
|
|
1722
|
+
trust: "foreign",
|
|
1723
|
+
cwd: plan.cwd,
|
|
1724
|
+
scope: plan.scope,
|
|
1725
|
+
expectedId: entry.id,
|
|
1726
|
+
expectedDigest: candidate.contentDigest,
|
|
1727
|
+
origin: interopOrigin(plan.host, entry)
|
|
1728
|
+
});
|
|
1729
|
+
if (installed.plugin) result.installed.push(installed.plugin.id);
|
|
1730
|
+
result.diagnostics.push(...installed.diagnostics.map((d) => d.message));
|
|
1731
|
+
} catch (error) {
|
|
1732
|
+
result.diagnostics.push(`${entry.item.name}: ${error instanceof Error ? error.message : String(error)}`);
|
|
1733
|
+
} finally {
|
|
1734
|
+
if (staging) rmSync2(staging, { recursive: true, force: true });
|
|
1735
|
+
}
|
|
1736
|
+
}
|
|
1737
|
+
return result;
|
|
1738
|
+
}
|
|
1739
|
+
|
|
1740
|
+
// src/domains/interop/import.ts
|
|
1741
|
+
init_esm_shims();
|
|
1742
|
+
import { mkdirSync as mkdirSync3, mkdtempSync as mkdtempSync3, rmSync as rmSync3, writeFileSync as writeFileSync2 } from "node:fs";
|
|
1743
|
+
import { tmpdir as tmpdir3 } from "node:os";
|
|
1744
|
+
import path7 from "node:path";
|
|
1745
|
+
function prepare(root, format) {
|
|
1746
|
+
const detection = detectForeignPlugin(root, format);
|
|
1747
|
+
if (detection.format === "portable") return { detection, value: preparePortablePackage(root) };
|
|
1748
|
+
if (detection.format === "none") throw new Error(detection.diagnostics.join(" "));
|
|
1749
|
+
return { detection, value: prepareForeignPackage(root, detection.format) };
|
|
1750
|
+
}
|
|
1751
|
+
function planLibraryImport(input, options = {}) {
|
|
1752
|
+
const cwd = path7.resolve(options.cwd ?? process.cwd());
|
|
1753
|
+
const scope = options.scope ?? "user";
|
|
1754
|
+
const remote = parsePluginGithubSource(input);
|
|
1755
|
+
const local = pluginLocalPath(input, cwd);
|
|
1756
|
+
const fetched = fetchPluginSource(input, cwd);
|
|
1757
|
+
const source = remote ? { input, transport: "github", root: fetched.root, url: input } : { input, transport: "local", root: fetched.root, path: local };
|
|
1758
|
+
const originSource = remote ? input : path7.resolve(local);
|
|
1759
|
+
try {
|
|
1760
|
+
const raw = reviewFingerprint(fetched.root);
|
|
1761
|
+
let detection;
|
|
1762
|
+
let value;
|
|
1763
|
+
const reasons = [];
|
|
1764
|
+
try {
|
|
1765
|
+
({ detection, value } = prepare(fetched.root, options.format));
|
|
1766
|
+
} catch (error) {
|
|
1767
|
+
detection = detectForeignPlugin(fetched.root, options.format);
|
|
1768
|
+
reasons.push(error instanceof Error ? error.message : String(error));
|
|
1769
|
+
}
|
|
1770
|
+
reasons.push(...detection.diagnostics);
|
|
1771
|
+
const format = value?.format ?? (detection.format === "none" ? void 0 : detection.format);
|
|
1772
|
+
const origin = {
|
|
1773
|
+
kind: "import",
|
|
1774
|
+
source: originSource,
|
|
1775
|
+
transport: remote ? "github" : "local",
|
|
1776
|
+
format: format ?? "portable",
|
|
1777
|
+
...options.host ? { host: options.host } : {},
|
|
1778
|
+
...options.marketplace ? { marketplace: options.marketplace } : {}
|
|
1779
|
+
};
|
|
1780
|
+
const base = {
|
|
1781
|
+
source,
|
|
1782
|
+
detection,
|
|
1783
|
+
...format ? { format } : {},
|
|
1784
|
+
scope,
|
|
1785
|
+
cwd,
|
|
1786
|
+
outcomes: value?.outcomes ?? [],
|
|
1787
|
+
unsupported: value?.unsupported ?? [],
|
|
1788
|
+
omitted: value?.omitted ?? [],
|
|
1789
|
+
requirements: value?.requirements ?? [],
|
|
1790
|
+
origin,
|
|
1791
|
+
reviewFingerprint: raw,
|
|
1792
|
+
cleanup: fetched.cleanup
|
|
1793
|
+
};
|
|
1794
|
+
if (!value) return { ...base, action: "blocked", reasons };
|
|
1795
|
+
const missing = unmetRequirements(value.requirements, cwd, scope, vendorOf(value.format));
|
|
1796
|
+
if (missing.length)
|
|
1797
|
+
reasons.push(
|
|
1798
|
+
`Unsatisfied package requirements: ${missing.join(", ")}. Install or import those packages first; no extra resources are imported.`
|
|
1799
|
+
);
|
|
1800
|
+
const installed = listInstalledPlugins(cwd, { all: true });
|
|
1801
|
+
if (installed.some((pkg) => pkg.id === value.id && pkg.scope === scope))
|
|
1802
|
+
reasons.push(`Package ${value.id} is already installed in ${scope} scope; remove it before importing again.`);
|
|
1803
|
+
const blocked = missing.length > 0 || installed.some((pkg) => pkg.id === value.id && pkg.scope === scope);
|
|
1804
|
+
return {
|
|
1805
|
+
...base,
|
|
1806
|
+
action: blocked ? "blocked" : "install",
|
|
1807
|
+
reasons: [value.note, ...reasons],
|
|
1808
|
+
id: value.id,
|
|
1809
|
+
version: value.version,
|
|
1810
|
+
destination: path7.join(pluginBaseDir(scope, cwd), value.id),
|
|
1811
|
+
digest: digest(value.files),
|
|
1812
|
+
files: value.files
|
|
1813
|
+
};
|
|
1814
|
+
} catch (error) {
|
|
1815
|
+
fetched.cleanup();
|
|
1816
|
+
throw error;
|
|
1817
|
+
}
|
|
1818
|
+
}
|
|
1819
|
+
function releaseLibraryImport(plan) {
|
|
1820
|
+
plan.cleanup();
|
|
1821
|
+
}
|
|
1822
|
+
function applyLibraryImport(plan, approved, options = {}) {
|
|
1823
|
+
const admission = {
|
|
1824
|
+
trust: "foreign",
|
|
1825
|
+
gate: "integrations.projectResources.trustProjectImports",
|
|
1826
|
+
gateEnabled: options.trustProjectImports === void 0 ? "unknown" : options.trustProjectImports
|
|
1827
|
+
};
|
|
1828
|
+
const result = { published: false, admission, diagnostics: [] };
|
|
1829
|
+
let staging;
|
|
1830
|
+
try {
|
|
1831
|
+
if (!approved) {
|
|
1832
|
+
result.diagnostics.push("Approval required; nothing installed.");
|
|
1833
|
+
return result;
|
|
1834
|
+
}
|
|
1835
|
+
if (plan.action !== "install" || !plan.files || !plan.id || !plan.digest) {
|
|
1836
|
+
result.diagnostics.push(...plan.reasons.length ? plan.reasons : ["Plan is not installable."]);
|
|
1837
|
+
return result;
|
|
1838
|
+
}
|
|
1839
|
+
if (reviewFingerprint(plan.source.root) !== plan.reviewFingerprint)
|
|
1840
|
+
throw new Error("Source changed after review; inspect a new plan.");
|
|
1841
|
+
const current = prepare(plan.source.root, plan.format === "portable" ? void 0 : plan.format).value;
|
|
1842
|
+
if (digest(plan.files) !== plan.digest || digest(current.files) !== plan.digest)
|
|
1843
|
+
throw new Error("Plan changed after review; inspect a new plan.");
|
|
1844
|
+
const missing = unmetRequirements(current.requirements, plan.cwd, plan.scope, vendorOf(current.format));
|
|
1845
|
+
if (missing.length)
|
|
1846
|
+
throw new Error(
|
|
1847
|
+
`Unsatisfied package requirements after review: ${missing.join(", ")}. No extra resources are imported.`
|
|
1848
|
+
);
|
|
1849
|
+
staging = mkdtempSync3(path7.join(tmpdir3(), "clio-coder-library-import-"));
|
|
1850
|
+
for (const [file, text] of Object.entries(plan.files)) {
|
|
1851
|
+
const target = path7.join(staging, file);
|
|
1852
|
+
mkdirSync3(path7.dirname(target), { recursive: true });
|
|
1853
|
+
writeFileSync2(target, text, { mode: 420 });
|
|
1854
|
+
}
|
|
1855
|
+
const candidate = readPluginManifest(staging);
|
|
1856
|
+
if (!candidate.valid || !candidate.contentDigest)
|
|
1857
|
+
throw new Error(candidate.diagnostics.map((d) => d.message).join("; "));
|
|
1858
|
+
const installed = installInteropPackage({
|
|
1859
|
+
sourcePath: staging,
|
|
1860
|
+
kind: candidate.manifest?.clio.kind ?? "plugin",
|
|
1861
|
+
trust: "foreign",
|
|
1862
|
+
cwd: plan.cwd,
|
|
1863
|
+
scope: plan.scope,
|
|
1864
|
+
expectedId: plan.id,
|
|
1865
|
+
expectedDigest: candidate.contentDigest,
|
|
1866
|
+
origin: plan.origin
|
|
1867
|
+
});
|
|
1868
|
+
result.diagnostics.push(...installed.diagnostics.map((d) => d.message));
|
|
1869
|
+
if (installed.plugin) {
|
|
1870
|
+
result.published = true;
|
|
1871
|
+
result.installed = installed.plugin.id;
|
|
1872
|
+
result.destination = installed.plugin.rootPath;
|
|
1873
|
+
result.validation = validateLibraryPackage(installed.plugin.rootPath, { cwd: plan.cwd });
|
|
1874
|
+
}
|
|
1875
|
+
return result;
|
|
1876
|
+
} catch (error) {
|
|
1877
|
+
result.diagnostics.push(error instanceof Error ? error.message : String(error));
|
|
1878
|
+
return result;
|
|
1879
|
+
} finally {
|
|
1880
|
+
if (staging) rmSync3(staging, { recursive: true, force: true });
|
|
1881
|
+
releaseLibraryImport(plan);
|
|
1882
|
+
}
|
|
1883
|
+
}
|
|
1884
|
+
function libraryImportPlanSummary(plan) {
|
|
1885
|
+
const { files: _files, cleanup: _cleanup, ...summary } = plan;
|
|
1886
|
+
return summary;
|
|
1887
|
+
}
|
|
1888
|
+
function renderLibraryImportPlan(plan) {
|
|
1889
|
+
const lines = [
|
|
1890
|
+
`Import ${plan.source.transport === "github" ? plan.source.url : plan.source.path} into Clio (${plan.scope})?`,
|
|
1891
|
+
` Format: ${plan.format ?? "unknown"}${plan.detection.manifestPath ? ` (${plan.detection.manifestPath})` : ""}`,
|
|
1892
|
+
...plan.action === "install" ? [` Package: ${plan.id} ${plan.version}`, ` Destination: ${plan.destination}`, ` SHA-256: ${plan.digest}`] : [" BLOCKED"],
|
|
1893
|
+
...plan.reasons.map((reason) => ` ${reason}`),
|
|
1894
|
+
...plan.requirements.length ? [` Requires installed packages: ${plan.requirements.join(", ")}`] : [],
|
|
1895
|
+
...plan.outcomes.map((outcome) => {
|
|
1896
|
+
const detail = [
|
|
1897
|
+
...outcome.omittedFields?.length ? [`omitted frontmatter: ${outcome.omittedFields.join(", ")}`] : [],
|
|
1898
|
+
...outcome.omittedFiles?.length ? [`omitted files: ${outcome.omittedFiles.join(", ")}`] : [],
|
|
1899
|
+
...outcome.reason ? [outcome.reason] : []
|
|
1900
|
+
];
|
|
1901
|
+
return outcome.status === "converted" ? ` CONVERT ${outcome.kind} ${outcome.name} -> ${outcome.destination}${detail.length ? ` (${detail.join("; ")})` : ""}` : ` UNSUPPORTED ${outcome.kind} ${outcome.name} (${outcome.source}): ${detail.join("; ")}`;
|
|
1902
|
+
}),
|
|
1903
|
+
...plan.unsupported.map((feature) => ` UNSUPPORTED ${feature}`),
|
|
1904
|
+
...plan.omitted.map((file) => ` SKIP ${file}: executable, host-specific, or non-text data.`),
|
|
1905
|
+
"Imported resources keep foreign trust and stay behind the project-import trust setting.",
|
|
1906
|
+
"Source files are never changed. Approval applies only to the displayed content."
|
|
1907
|
+
];
|
|
1908
|
+
return lines.join("\n");
|
|
1909
|
+
}
|
|
1910
|
+
|
|
1911
|
+
// src/domains/interop/index.ts
|
|
1912
|
+
init_esm_shims();
|
|
1913
|
+
|
|
1914
|
+
// src/domains/interop/extension.ts
|
|
1915
|
+
init_esm_shims();
|
|
1916
|
+
|
|
1917
|
+
// src/domains/interop/consent.ts
|
|
1918
|
+
init_esm_shims();
|
|
1919
|
+
var import_yaml3 = __toESM(require_dist(), 1);
|
|
1920
|
+
var INHERITED_PROJECT_CONTEXT = "none";
|
|
1921
|
+
function delegationEntryForKind(kind, defaults) {
|
|
1922
|
+
const recipe = kind.acp;
|
|
1923
|
+
if (recipe === void 0) throw new Error(`interop kind ${kind.id} has no ACP recipe`);
|
|
1924
|
+
return {
|
|
1925
|
+
id: kind.id,
|
|
1926
|
+
command: recipe.command,
|
|
1927
|
+
args: [...recipe.args],
|
|
1928
|
+
connectTimeoutMs: defaults.connectTimeoutMs,
|
|
1929
|
+
turnTimeoutMs: defaults.turnTimeoutMs,
|
|
1930
|
+
permissionTimeoutMs: defaults.permissionTimeoutMs,
|
|
1931
|
+
toolGovernance: "clio-coder-policy"
|
|
1932
|
+
};
|
|
1933
|
+
}
|
|
1934
|
+
function interopProposals(report, settings) {
|
|
1935
|
+
const configured = new Set(settings.integrations.externalAgents.entries.map((agent) => agent.id));
|
|
1936
|
+
const proposals = [];
|
|
1937
|
+
for (const record2 of report.agents) {
|
|
1938
|
+
const kind = interopAgentKind(record2.kind);
|
|
1939
|
+
if (kind?.acp === void 0) continue;
|
|
1940
|
+
if (record2.presence !== "present") continue;
|
|
1941
|
+
if (configured.has(kind.id)) continue;
|
|
1942
|
+
if (record2.decision !== void 0 && record2.decidedFingerprint === record2.fingerprint) continue;
|
|
1943
|
+
proposals.push({
|
|
1944
|
+
kind: kind.id,
|
|
1945
|
+
label: kind.label,
|
|
1946
|
+
fingerprint: record2.fingerprint,
|
|
1947
|
+
entry: delegationEntryForKind(kind, settings.integrations.externalAgents.defaults),
|
|
1948
|
+
needsNetworkInstall: record2.adapter !== "present"
|
|
1949
|
+
});
|
|
1950
|
+
}
|
|
1951
|
+
return proposals;
|
|
1952
|
+
}
|
|
1953
|
+
function renderProposalEntry(proposal) {
|
|
1954
|
+
return (0, import_yaml3.stringify)([proposal.entry]).trimEnd();
|
|
1955
|
+
}
|
|
1956
|
+
function withStoredDecision(stored, fresh) {
|
|
1957
|
+
if (stored === void 0) return fresh;
|
|
1958
|
+
return {
|
|
1959
|
+
...fresh,
|
|
1960
|
+
...stored.decision !== void 0 ? { decision: stored.decision } : {},
|
|
1961
|
+
...stored.decidedAt !== void 0 ? { decidedAt: stored.decidedAt } : {},
|
|
1962
|
+
...stored.decidedFingerprint !== void 0 ? { decidedFingerprint: stored.decidedFingerprint } : {},
|
|
1963
|
+
...stored.hintedFingerprint !== void 0 ? { hintedFingerprint: stored.hintedFingerprint } : {}
|
|
1964
|
+
};
|
|
1965
|
+
}
|
|
1966
|
+
function updateRecords(ids, report, patch) {
|
|
1967
|
+
const wanted = new Set(ids);
|
|
1968
|
+
const touched = [];
|
|
1969
|
+
withStateFileLockSync(interopStatePath(), () => {
|
|
1970
|
+
const stored = readInteropReport();
|
|
1971
|
+
const storedByKind = new Map(
|
|
1972
|
+
(stored?.agents ?? []).map((record2) => [record2.kind, record2])
|
|
1973
|
+
);
|
|
1974
|
+
const byKind = new Map(storedByKind);
|
|
1975
|
+
for (const record2 of report.agents) {
|
|
1976
|
+
byKind.set(record2.kind, withStoredDecision(storedByKind.get(record2.kind), record2));
|
|
1977
|
+
}
|
|
1978
|
+
for (const id of wanted) {
|
|
1979
|
+
const record2 = byKind.get(id);
|
|
1980
|
+
if (record2 === void 0) continue;
|
|
1981
|
+
byKind.set(id, patch(record2));
|
|
1982
|
+
touched.push(id);
|
|
1983
|
+
}
|
|
1984
|
+
writeInteropReport({ version: 1, detectedAt: report.detectedAt, agents: [...byKind.values()] });
|
|
1985
|
+
});
|
|
1986
|
+
return touched;
|
|
1987
|
+
}
|
|
1988
|
+
function recordDecisions(ids, report, decision) {
|
|
1989
|
+
const decidedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
1990
|
+
return updateRecords(ids, report, (record2) => ({
|
|
1991
|
+
...record2,
|
|
1992
|
+
decision,
|
|
1993
|
+
decidedAt,
|
|
1994
|
+
decidedFingerprint: record2.fingerprint
|
|
1995
|
+
}));
|
|
1996
|
+
}
|
|
1997
|
+
function interopBootHint(report, settings) {
|
|
1998
|
+
const fresh = interopProposals(report, settings).filter(
|
|
1999
|
+
(proposal) => report.agents.find((agent) => agent.kind === proposal.kind)?.hintedFingerprint !== proposal.fingerprint
|
|
2000
|
+
);
|
|
2001
|
+
if (fresh.length === 0) return null;
|
|
2002
|
+
updateRecords(
|
|
2003
|
+
fresh.map((proposal) => proposal.kind),
|
|
2004
|
+
report,
|
|
2005
|
+
(record2) => ({ ...record2, hintedFingerprint: record2.fingerprint })
|
|
2006
|
+
);
|
|
2007
|
+
const names = fresh.map((proposal) => proposal.entry.id).join(", ");
|
|
2008
|
+
return `clio-coder: ${names} detected on PATH and not configured. Run /interop to review.`;
|
|
2009
|
+
}
|
|
2010
|
+
function acceptInteropAgents(ids, report) {
|
|
2011
|
+
const proposals = interopProposals(report, readSettings()).filter((proposal) => ids.includes(proposal.kind));
|
|
2012
|
+
const diagnostics = [];
|
|
2013
|
+
for (const id of ids) {
|
|
2014
|
+
if (!proposals.some((proposal) => proposal.kind === id)) diagnostics.push(`${id} is not a pending proposal`);
|
|
2015
|
+
}
|
|
2016
|
+
if (proposals.length === 0) return { decided: [], wired: [], diagnostics };
|
|
2017
|
+
const wired = [];
|
|
2018
|
+
updateSettings((settings) => {
|
|
2019
|
+
for (const proposal of proposals) {
|
|
2020
|
+
if (settings.integrations.externalAgents.entries.some((agent) => agent.id === proposal.entry.id)) continue;
|
|
2021
|
+
settings.integrations.externalAgents.entries.push({ ...proposal.entry, args: [...proposal.entry.args] });
|
|
2022
|
+
wired.push(proposal.entry.id);
|
|
2023
|
+
}
|
|
2024
|
+
});
|
|
2025
|
+
const decided = recordDecisions(
|
|
2026
|
+
proposals.map((proposal) => proposal.kind),
|
|
2027
|
+
report,
|
|
2028
|
+
"accepted"
|
|
2029
|
+
);
|
|
2030
|
+
return { decided, wired, diagnostics };
|
|
2031
|
+
}
|
|
2032
|
+
function declineInteropAgents(ids, report) {
|
|
2033
|
+
return { decided: recordDecisions(ids, report, "declined"), wired: [], diagnostics: [] };
|
|
2034
|
+
}
|
|
2035
|
+
|
|
2036
|
+
// src/domains/interop/extension.ts
|
|
2037
|
+
var EMPTY_REPORT = { version: 1, detectedAt: (/* @__PURE__ */ new Date(0)).toISOString(), agents: [] };
|
|
2038
|
+
function createInteropBundle(_context) {
|
|
2039
|
+
let detected2 = null;
|
|
2040
|
+
const extension = {
|
|
2041
|
+
start() {
|
|
2042
|
+
return void 0;
|
|
2043
|
+
}
|
|
2044
|
+
};
|
|
2045
|
+
const contract = {
|
|
2046
|
+
kinds() {
|
|
2047
|
+
return INTEROP_AGENT_KINDS;
|
|
2048
|
+
},
|
|
2049
|
+
async detect(input = {}) {
|
|
2050
|
+
detected2 = await detectInteropAgents(input, detected2?.agents);
|
|
2051
|
+
return detected2;
|
|
2052
|
+
},
|
|
2053
|
+
// A decision is written and read back, so the report an overlay rebuilds
|
|
2054
|
+
// from carries it: a declined row leaves the proposal list on the
|
|
2055
|
+
// keystroke rather than on the next detection.
|
|
2056
|
+
lastReport() {
|
|
2057
|
+
return detected2 ?? readInteropReport();
|
|
2058
|
+
},
|
|
2059
|
+
proposals(report) {
|
|
2060
|
+
return interopProposals(report, readSettings());
|
|
2061
|
+
},
|
|
2062
|
+
// Read here, not from the hot settings snapshot the TUI holds: that one is
|
|
2063
|
+
// refreshed by the config watcher a tick after the write, and the overlay
|
|
2064
|
+
// rebuilds its rows the moment accept returns. An accepted peer was gone
|
|
2065
|
+
// from the proposals, which read the file, and not yet in the configured
|
|
2066
|
+
// list, which read the snapshot, so it was in neither until a reopen.
|
|
2067
|
+
configured() {
|
|
2068
|
+
return readSettings().integrations.externalAgents.entries;
|
|
2069
|
+
},
|
|
2070
|
+
accept(ids) {
|
|
2071
|
+
const result = acceptInteropAgents(ids, detected2 ?? readInteropReport() ?? EMPTY_REPORT);
|
|
2072
|
+
detected2 = readInteropReport() ?? detected2;
|
|
2073
|
+
return result;
|
|
2074
|
+
},
|
|
2075
|
+
decline(ids) {
|
|
2076
|
+
const result = declineInteropAgents(ids, detected2 ?? readInteropReport() ?? EMPTY_REPORT);
|
|
2077
|
+
detected2 = readInteropReport() ?? detected2;
|
|
2078
|
+
return result;
|
|
2079
|
+
},
|
|
2080
|
+
bootHint(report) {
|
|
2081
|
+
return interopBootHint(report, readSettings());
|
|
2082
|
+
}
|
|
2083
|
+
};
|
|
2084
|
+
return { extension, contract };
|
|
2085
|
+
}
|
|
2086
|
+
|
|
2087
|
+
// src/domains/interop/manifest.ts
|
|
2088
|
+
init_esm_shims();
|
|
2089
|
+
var InteropManifest = {
|
|
2090
|
+
name: "interop",
|
|
2091
|
+
dependsOn: ["config"]
|
|
2092
|
+
};
|
|
2093
|
+
|
|
2094
|
+
// src/domains/interop/index.ts
|
|
2095
|
+
var InteropDomainModule = {
|
|
2096
|
+
manifest: InteropManifest,
|
|
2097
|
+
createExtension: createInteropBundle
|
|
2098
|
+
};
|
|
2099
|
+
|
|
2100
|
+
export {
|
|
2101
|
+
INHERITED_PROJECT_CONTEXT,
|
|
2102
|
+
delegationEntryForKind,
|
|
2103
|
+
interopProposals,
|
|
2104
|
+
renderProposalEntry,
|
|
2105
|
+
acceptInteropAgents,
|
|
2106
|
+
declineInteropAgents,
|
|
2107
|
+
discoverInteropInventory,
|
|
2108
|
+
resolveOnPath,
|
|
2109
|
+
detectInteropAgents,
|
|
2110
|
+
planInteropAdoption,
|
|
2111
|
+
renderInteropAdoptionPlan,
|
|
2112
|
+
applyInteropAdoption,
|
|
2113
|
+
planLibraryImport,
|
|
2114
|
+
releaseLibraryImport,
|
|
2115
|
+
applyLibraryImport,
|
|
2116
|
+
libraryImportPlanSummary,
|
|
2117
|
+
renderLibraryImportPlan,
|
|
2118
|
+
InteropDomainModule
|
|
2119
|
+
};
|
|
2120
|
+
//# sourceMappingURL=chunk-GJBJHJNY.js.map
|