@iowarp/clio-coder 0.4.6 → 0.4.7

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.
Files changed (657) hide show
  1. package/.claude-plugin/marketplace.json +283 -0
  2. package/CHANGELOG.md +50 -0
  3. package/CONTRIBUTING.md +102 -29
  4. package/NOTICE +8 -0
  5. package/README.md +37 -5
  6. package/dist/{acp-UVEVWSDL.js → acp-W3Y3TRHD.js} +12 -12
  7. package/dist/{agents-VWY37DTK.js → agents-J4ICNLQ3.js} +52 -52
  8. package/dist/assets/codewiki.json +1 -1
  9. package/dist/assets/tui-notices/get-east-asian-width-LICENSE +9 -0
  10. package/dist/assets/tui-notices/marked-LICENSE +44 -0
  11. package/dist/assets/tui-notices/pi-tui-LICENSE +21 -0
  12. package/dist/{auth-PCV2XQDV.js → auth-X2UJUMOC.js} +24 -24
  13. package/dist/{builtins-PD652MTK.js → builtins-XLXWWSRF.js} +6 -6
  14. package/dist/{chunk-DZK63TZJ.js → chunk-24S3DN22.js} +336 -612
  15. package/dist/{chunk-NTK3WTHM.js → chunk-24TOGHPO.js} +2 -2
  16. package/dist/{chunk-M6TAYK66.js → chunk-2O2LVQQK.js} +11 -4
  17. package/dist/{chunk-OQM5IVJY.js → chunk-34XHRVKG.js} +3 -3
  18. package/dist/{chunk-LY4N4TTL.js → chunk-3LXJOICS.js} +2 -2
  19. package/dist/{chunk-3BJGMT2D.js → chunk-3XE4NRLF.js} +1 -1
  20. package/dist/{chunk-N2OKBREN.js → chunk-4MFBBY2Z.js} +3 -3
  21. package/dist/{chunk-5VTJP36Q.js → chunk-4N2RZ4TO.js} +2 -2
  22. package/dist/{chunk-WNGF5AJX.js → chunk-4QKAITQT.js} +3 -3
  23. package/dist/chunk-4UHVS5T7.js +207 -0
  24. package/dist/{chunk-GLYBJ4RQ.js → chunk-5AJPUR72.js} +6 -6
  25. package/dist/{chunk-5CY4Q6QI.js → chunk-5EQO5NWP.js} +105 -3
  26. package/dist/{chunk-6HAO6X5B.js → chunk-65BGHOUR.js} +8 -5
  27. package/dist/{chunk-6VRRJT7L.js → chunk-6CA2BHOR.js} +2 -2
  28. package/dist/{chunk-HL26ADLH.js → chunk-6CB2IL4N.js} +2 -1
  29. package/dist/{chunk-E7RF4KBO.js → chunk-6LRLOJHQ.js} +3 -3
  30. package/dist/{chunk-HXHFDHB6.js → chunk-6TAATXXH.js} +6 -6
  31. package/dist/{chunk-P6M7RKMI.js → chunk-6YHPAAZR.js} +3 -3
  32. package/dist/{chunk-5QRX7SLS.js → chunk-7EEGBKV4.js} +7 -7
  33. package/dist/{chunk-BS4GAMUB.js → chunk-A67NR5AT.js} +2 -2
  34. package/dist/{chunk-WJIMKGD6.js → chunk-BAU36233.js} +8 -8
  35. package/dist/{chunk-PZN2LQY6.js → chunk-BO4XV5VX.js} +4 -4
  36. package/dist/{chunk-I2K2NCZQ.js → chunk-BQQ5MXUC.js} +6 -6
  37. package/dist/{chunk-X3BI7HTV.js → chunk-C3G5PNUO.js} +21 -21
  38. package/dist/{chunk-SRZOW5L2.js → chunk-C6GEXX4L.js} +1 -1
  39. package/dist/{chunk-6RYDAVQT.js → chunk-CE64C5K5.js} +219 -64
  40. package/dist/chunk-CP3HIR5H.js +2119 -0
  41. package/dist/{chunk-BBV5TKE6.js → chunk-CPXGJI2A.js} +2 -2
  42. package/dist/{chunk-IGLVVNEG.js → chunk-CULVKYTK.js} +4 -4
  43. package/dist/{chunk-DXLUVUD4.js → chunk-D2T66PDV.js} +5 -5
  44. package/dist/{chunk-NF3BK5WR.js → chunk-DACXIVVF.js} +5 -5
  45. package/dist/{chunk-IKRWLEDA.js → chunk-DLIYANB7.js} +20 -15
  46. package/dist/{chunk-RGZNQ5CT.js → chunk-DO7M3LSX.js} +9 -9
  47. package/dist/{chunk-2QPI3TR3.js → chunk-DVJL77SO.js} +2 -2
  48. package/dist/{chunk-ODUTYZIU.js → chunk-EUEXGXXR.js} +5 -5
  49. package/dist/{chunk-WKUYQBCG.js → chunk-EUZRMP4Y.js} +18 -16
  50. package/dist/{chunk-JMPL7NUB.js → chunk-G4LGUTOE.js} +4 -4
  51. package/dist/{chunk-CBSKDFWL.js → chunk-GEVQNST4.js} +2 -2
  52. package/dist/{chunk-NNWJYUNO.js → chunk-GFQ7P2UF.js} +7 -7
  53. package/dist/{chunk-SXQKNKRA.js → chunk-GI5RRMAH.js} +14 -14
  54. package/dist/{chunk-HPTJF6DG.js → chunk-GVZFCJHE.js} +336 -83
  55. package/dist/{chunk-ACCKVSHU.js → chunk-GXIWHXDB.js} +3 -3
  56. package/dist/{chunk-LUL5Z66S.js → chunk-HOX4YZ2K.js} +6 -5
  57. package/dist/chunk-HRAKUPIH.js +57 -0
  58. package/dist/{chunk-F5Z7EWMN.js → chunk-IJMW64DX.js} +50 -50
  59. package/dist/{chunk-QNWRHOMF.js → chunk-IMOD2YPV.js} +16 -9
  60. package/dist/{chunk-HZ2T2YED.js → chunk-IQCNVLO6.js} +28 -8
  61. package/dist/{chunk-HZFBVU5X.js → chunk-ISNCCX42.js} +8 -8
  62. package/dist/{chunk-7JSSKXG2.js → chunk-IZYTT3CD.js} +7 -3
  63. package/dist/chunk-KKEYGFX4.js +915 -0
  64. package/dist/{chunk-HHVJNVUJ.js → chunk-KS7ETA3P.js} +2 -2
  65. package/dist/{chunk-BLTEAUCB.js → chunk-L3Z5ANCV.js} +7 -7
  66. package/dist/{chunk-4VMV6OS6.js → chunk-LBFQMYS3.js} +2 -2
  67. package/dist/{chunk-URBGEOH3.js → chunk-M6Z2V6YU.js} +5 -5
  68. package/dist/{chunk-BT7HGDOX.js → chunk-MBJO5VNZ.js} +12 -12
  69. package/dist/chunk-MNQN3X6Y.js +595 -0
  70. package/dist/{chunk-3QKXHCGS.js → chunk-MZHXENL7.js} +5 -5
  71. package/dist/chunk-MZNWZUJM.js +1801 -0
  72. package/dist/{chunk-7YJWEF2L.js → chunk-N37QC5FV.js} +5 -5
  73. package/dist/{chunk-TJFDL26W.js → chunk-NCCQ6DVS.js} +7 -7
  74. package/dist/{chunk-P5JMBPDJ.js → chunk-NO7J45X6.js} +162 -47
  75. package/dist/chunk-OH3YYA3B.js +15 -0
  76. package/dist/{chunk-22PQ4TX4.js → chunk-P4DL2LM5.js} +16 -77
  77. package/dist/{chunk-LIN2K3EL.js → chunk-PFLOULP3.js} +4 -4
  78. package/dist/{chunk-QXFBABFJ.js → chunk-QKWL7SYE.js} +11 -11
  79. package/dist/chunk-RFCKPS2V.js +26 -0
  80. package/dist/{chunk-ZS43Y2FT.js → chunk-RTLNFZMD.js} +12 -4
  81. package/dist/{chunk-U7H5WRG5.js → chunk-RXFPB32E.js} +8 -6
  82. package/dist/{chunk-Q7NNUHQV.js → chunk-SEDI5K5B.js} +16 -16
  83. package/dist/{chunk-WV6TDAPN.js → chunk-SELG4SUR.js} +7 -7
  84. package/dist/{chunk-3WBALRQH.js → chunk-SER7RRAE.js} +27 -832
  85. package/dist/{chunk-K2HL3GBL.js → chunk-T4TY5GG3.js} +165 -15
  86. package/dist/chunk-T7QQBNLH.js +691 -0
  87. package/dist/{chunk-6OII3LOK.js → chunk-TLTGZTXI.js} +3 -3
  88. package/dist/chunk-TZ6UVP2H.js +637 -0
  89. package/dist/{chunk-3JLFK5MW.js → chunk-TZHN5ITX.js} +13 -41
  90. package/dist/{chunk-VANN3GDP.js → chunk-U3TPUXOQ.js} +399 -234
  91. package/dist/{chunk-VHMX7SXF.js → chunk-UA3W4FGC.js} +6 -6
  92. package/dist/{chunk-3O2ZAUGQ.js → chunk-UA6W4XFJ.js} +2 -2
  93. package/dist/chunk-UWD3JD5X.js +709 -0
  94. package/dist/chunk-V4ZKOKRB.js +13433 -0
  95. package/dist/{chunk-NC4KV7EL.js → chunk-VCRVEDUC.js} +5 -5
  96. package/dist/{chunk-4DU2TVI4.js → chunk-VMATUZB6.js} +12 -10
  97. package/dist/{chunk-J2FYEQ5L.js → chunk-VTYHHQ57.js} +2 -2
  98. package/dist/chunk-WB7POC6M.js +891 -0
  99. package/dist/{chunk-3HQVBIKD.js → chunk-WBVKKTUT.js} +2 -2
  100. package/dist/{chunk-EHOSNVVM.js → chunk-WLHX3MM5.js} +6 -2
  101. package/dist/{chunk-24T2YZ7A.js → chunk-WN552PKN.js} +553 -298
  102. package/dist/{chunk-4U4TKZFR.js → chunk-WT5TRMO4.js} +51 -26
  103. package/dist/{chunk-XWMSPJYN.js → chunk-WURGVOZJ.js} +56 -12
  104. package/dist/{chunk-7WUZEB2M.js → chunk-XR3XJN2M.js} +2 -2
  105. package/dist/chunk-XW2UZICE.js +372 -0
  106. package/dist/{chunk-2AKYFREM.js → chunk-XZ6UFQ52.js} +11 -11
  107. package/dist/chunk-Y3JU5RPK.js +8 -0
  108. package/dist/chunk-YKRJTYNP.js +1143 -0
  109. package/dist/{chunk-PWWSIB2A.js → chunk-ZGIGW4ZG.js} +5 -5
  110. package/dist/cli/index.js +34 -36
  111. package/dist/{clio-QQCMTUZE.js → clio-L2P7S2R2.js} +9 -9
  112. package/dist/{code-nav-GUPM6766.js → code-nav-B5LNX4KU.js} +25 -25
  113. package/dist/{components-TNIKXCBH.js → components-63MMQKUT.js} +6 -6
  114. package/dist/{config-IIM7YOD3.js → config-YXARKGTX.js} +70 -67
  115. package/dist/{configure-4ZM5HWJX.js → configure-LMVQJ46J.js} +47 -35
  116. package/dist/{context-OL5P3HEP.js → context-7HJEWTTP.js} +87 -44
  117. package/dist/{context-44BZLJ3J.js → context-XSZKKFBW.js} +14 -14
  118. package/dist/{context-AIDVQKMW.js → context-YG2LZDYZ.js} +60 -58
  119. package/dist/{context-clear-OQV76MYP.js → context-clear-AC5NXHM2.js} +57 -55
  120. package/dist/{context-index-HP2JFUWA.js → context-index-KKTPRV5G.js} +3 -3
  121. package/dist/{context-map-INTXD54D.js → context-map-T7ROR5D5.js} +4 -4
  122. package/dist/{context-working-set-ZUW3EGLS.js → context-working-set-F4Q4J3NS.js} +12 -10
  123. package/dist/{detail-UXPWRANG.js → detail-H73BEF2N.js} +58 -56
  124. package/dist/{dispatch-runner-P3ZW6G77.js → dispatch-runner-3RY5FSJC.js} +74 -72
  125. package/dist/{doctor-JJVGPZWT.js → doctor-EQYJOGUG.js} +44 -30
  126. package/dist/{eval-V2RTN3UH.js → eval-4P7O6CCE.js} +109 -46
  127. package/dist/{evidence-35PYWGSO.js → evidence-D6GUSYJW.js} +57 -55
  128. package/dist/{evidence-CIGGKI6J.js → evidence-O76QF7TZ.js} +62 -59
  129. package/dist/{evolve-33SM3NJP.js → evolve-H47BCETS.js} +58 -56
  130. package/dist/{extensions-YVRHX6ZI.js → extensions-NNL3ZOCU.js} +98 -20
  131. package/dist/{fleet-LFO7SIPC.js → fleet-KMNS6NOM.js} +106 -99
  132. package/dist/{fleet-commands-RLK72GU3.js → fleet-commands-DOWSYCBX.js} +14 -14
  133. package/dist/{fleet-decisions-3SBSCTCW.js → fleet-decisions-S3PTZV2D.js} +9 -9
  134. package/dist/{fleet-graph-JZIBCGMW.js → fleet-graph-F2DE2TME.js} +26 -24
  135. package/dist/{fleet-inspect-2L5YGGZJ.js → fleet-inspect-EN2Q6IVB.js} +60 -57
  136. package/dist/{fleet-preflight-QRSHIIDE.js → fleet-preflight-FRLETDD3.js} +3 -3
  137. package/dist/{fleet-validate-LIAVKDUU.js → fleet-validate-B2XDLS57.js} +28 -29
  138. package/dist/{fleet-verify-JIK3OQZR.js → fleet-verify-4JKUWGJ7.js} +57 -55
  139. package/dist/{fleet-view-IWHYGQKK.js → fleet-view-BHJFW26B.js} +60 -57
  140. package/dist/{init-NJEDOTQW.js → init-XAT5N5YM.js} +79 -74
  141. package/dist/interop-FVECHFKG.js +246 -0
  142. package/dist/{inventory-74UL7UHU.js → inventory-7KFQGLCV.js} +60 -57
  143. package/dist/library-NY2XOT75.js +492 -0
  144. package/dist/library-QAPAO23R.js +306 -0
  145. package/dist/library-import-5Y6MAS3R.js +183 -0
  146. package/dist/library-inventory-JT6HWITQ.js +56 -0
  147. package/dist/library-validation-EQUH25DC.js +42 -0
  148. package/dist/{memory-I76I5VUH.js → memory-DYVTTCP6.js} +58 -56
  149. package/dist/{models-D4YDIQZQ.js → models-MASFJ6Y2.js} +48 -36
  150. package/dist/{monitor-NKVD55HX.js → monitor-YMP4NXJJ.js} +64 -61
  151. package/dist/{orchestrator-I6OATVPK.js → orchestrator-AFQRRTEI.js} +3685 -1841
  152. package/dist/{panes-7BTYH3XQ.js → panes-D3Y2KFG5.js} +4 -4
  153. package/dist/{panes-WPOMEMRH.js → panes-NICTHQCV.js} +7 -7
  154. package/dist/{paths-J3KN7UAO.js → paths-PSFAUIGO.js} +5 -5
  155. package/dist/{preload-EJAWJEIO.js → preload-5Q7VXRFJ.js} +57 -55
  156. package/dist/{reset-4XMQKDNZ.js → reset-7NKZK7JN.js} +9 -9
  157. package/dist/{resources-TVYVXK3Q.js → resources-NILSIZAT.js} +94 -38
  158. package/dist/{run-OWQNNSJU.js → run-BPZGEBZV.js} +121 -105
  159. package/dist/{share-NPZZMUXG.js → share-EZ6ERBMH.js} +31 -28
  160. package/dist/skills-BTVVNYVM.js +100 -0
  161. package/dist/{skills-eval-J5TCKSJA.js → skills-eval-UY34MNK7.js} +110 -72
  162. package/dist/{skills-inventory-7II4DM57.js → skills-inventory-JDHSIA7I.js} +30 -25
  163. package/dist/{slash-commands-MDSDSWYF.js → slash-commands-K4FNQ2AT.js} +49 -46
  164. package/dist/{steer-S7D7IKPU.js → steer-2B3EQGFH.js} +4 -4
  165. package/dist/{support-5VAEC32W.js → support-L2SOL3IE.js} +7 -7
  166. package/dist/{targets-KILZEOCE.js → targets-44VKGFLN.js} +64 -58
  167. package/dist/{tasks-R6P6OV22.js → tasks-3KODKFU7.js} +12 -12
  168. package/dist/{terminal-lease-LZCG2KN3.js → terminal-lease-LXA7MMPO.js} +32 -19
  169. package/dist/{tools-6OCQ6SVB.js → tools-3UB7TEVR.js} +7 -7
  170. package/dist/{trace-JHLXWUMN.js → trace-TAMIU4OJ.js} +5 -4
  171. package/dist/{tui-primitives-RCY2HN7G.js → tui-primitives-A6MUW32V.js} +3 -2
  172. package/dist/{uninstall-FXYMFFRT.js → uninstall-QYVRPEM4.js} +9 -9
  173. package/dist/{upgrade-D2OZH6IQ.js → upgrade-7PMKM2JH.js} +15 -16
  174. package/dist/{usage-PIASNUS4.js → usage-6EQV7EQK.js} +70 -67
  175. package/dist/{verifiers-LTHUY2PX.js → verifiers-JLITWSHU.js} +15 -15
  176. package/dist/{verify-HYF7KBVE.js → verify-T7NAEVIG.js} +13 -13
  177. package/dist/{web-fetch-MQN4FH3X.js → web-fetch-W4TNW4Q7.js} +4 -4
  178. package/dist/{wiki-generate-RK7JQ5NP.js → wiki-generate-T2TJQJUA.js} +81 -76
  179. package/dist/{with-panes-OFTNAR4Y.js → with-panes-CHFC7HGI.js} +4 -4
  180. package/dist/worker/entry.js +283 -76
  181. package/docs/README.md +43 -0
  182. package/docs/architecture/architecture.md +8 -7
  183. package/docs/architecture/artifact-versions.md +3 -3
  184. package/docs/architecture/context-engine.md +35 -1
  185. package/docs/architecture/library.md +32 -0
  186. package/docs/architecture/middleware-and-components.md +1 -1
  187. package/docs/architecture/model-catalog.md +21 -1
  188. package/docs/architecture/pi-boundary.md +18 -0
  189. package/docs/architecture/prompt-envelope-and-tools.md +5 -5
  190. package/docs/architecture/safety-model.md +21 -2
  191. package/docs/architecture/session-lifecycle.md +12 -1
  192. package/docs/architecture/tui-design.md +108 -9
  193. package/docs/architecture/worker-context.md +106 -0
  194. package/docs/guide/authoring-plugins.md +160 -0
  195. package/docs/guide/built-in-agents.md +5 -5
  196. package/docs/guide/commands-and-modes.md +161 -56
  197. package/docs/guide/configuration-and-targets.md +1 -1
  198. package/docs/guide/configuration-reference.md +27 -34
  199. package/docs/guide/environment-variables.md +2 -2
  200. package/docs/guide/exit-codes-and-output.md +1 -1
  201. package/docs/guide/extensions-and-sharing.md +93 -53
  202. package/docs/guide/fleet-dispatch.md +31 -4
  203. package/docs/guide/glossary.md +1 -1
  204. package/docs/guide/harness-extensions.md +291 -0
  205. package/docs/guide/installation-and-lifecycle.md +9 -9
  206. package/docs/guide/interop.md +243 -0
  207. package/docs/guide/panes-and-files.md +3 -3
  208. package/docs/guide/plugins.md +80 -0
  209. package/docs/guide/resource-library.md +111 -45
  210. package/docs/guide/skills-marketplace.md +35 -72
  211. package/docs/guide/tool-usage.md +19 -7
  212. package/docs/guide/troubleshooting.md +1 -1
  213. package/docs/process/development-pipeline.md +14 -14
  214. package/docs/process/documentation-coverage.md +28 -1
  215. package/docs/process/documentation-guide.md +15 -7
  216. package/docs/process/eval-runner.md +8 -3
  217. package/docs/process/performance-methodology.md +1 -1
  218. package/docs/process/release-cut-checklist.md +4 -0
  219. package/docs/process/scientific-validation.md +23 -0
  220. package/evals/scalar-decision-machinery.ts +1 -1
  221. package/examples/extensions/README.md +67 -0
  222. package/examples/extensions/lab-status/clio-coder-extension.json +14 -0
  223. package/examples/extensions/lab-status/extension.mjs +68 -0
  224. package/examples/extensions/lab-status/jobs.synthetic.json +9 -0
  225. package/examples/extensions/measurements/clio-coder-extension.json +28 -0
  226. package/examples/extensions/measurements/summarize.cjs +23 -0
  227. package/library/README.md +109 -0
  228. package/library/_authoring/templates/agent/README.md +28 -0
  229. package/library/_authoring/templates/agent/agents/benchmark-scout.md +30 -0
  230. package/library/_authoring/templates/agent/plugin.json +23 -0
  231. package/library/_authoring/templates/fleet/README.md +29 -0
  232. package/library/_authoring/templates/fleet/fleets/pipeline-review.md +31 -0
  233. package/library/_authoring/templates/fleet/plugin.json +23 -0
  234. package/library/_authoring/templates/plugin/README.md +37 -0
  235. package/library/_authoring/templates/plugin/agents/data-curator.md +31 -0
  236. package/library/_authoring/templates/plugin/assets/curation-guide.md +22 -0
  237. package/library/_authoring/templates/plugin/plugin.json +42 -0
  238. package/library/_authoring/templates/plugin/prompts/inspect-dataset.md +15 -0
  239. package/library/_authoring/templates/plugin/skills/dataset-curation/SKILL.md +36 -0
  240. package/library/_authoring/templates/plugin/skills/dataset-curation/evals.md +17 -0
  241. package/library/_authoring/templates/prompt/README.md +28 -0
  242. package/library/_authoring/templates/prompt/plugin.json +23 -0
  243. package/library/_authoring/templates/prompt/prompts/paper-summary.md +26 -0
  244. package/library/_authoring/templates/skill/README.md +24 -0
  245. package/library/_authoring/templates/skill/SKILL.md +39 -0
  246. package/library/_authoring/templates/skill/evals.md +30 -0
  247. package/library/_authoring/templates/skill/plugin.json +23 -0
  248. package/library/agents/README.md +7 -0
  249. package/library/fleets/README.md +7 -0
  250. package/library/plugins/materio/README.md +137 -0
  251. package/library/plugins/materio/ai.iowarp.clio/agents/materio-lab-definer.md +208 -0
  252. package/library/plugins/materio/ai.iowarp.clio/agents/materio-literature-reviewer.md +308 -0
  253. package/library/plugins/materio/ai.iowarp.clio/agents/materio-research-explorer.md +249 -0
  254. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-executor.md +416 -0
  255. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-verifier.md +60 -0
  256. package/library/plugins/materio/ai.iowarp.clio/agents/materio-workflow-planner.md +238 -0
  257. package/library/plugins/materio/ai.iowarp.clio/fleets/materio-execute-task.md +50 -0
  258. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/add-task.md +66 -0
  259. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/archive-task.md +65 -0
  260. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/checkpoint.md +26 -0
  261. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-research-tasks.md +230 -0
  262. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-virtual-lab.md +181 -0
  263. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/execute-task.md +292 -0
  264. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/help.md +129 -0
  265. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/identify-research.md +206 -0
  266. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/literature-review.md +201 -0
  267. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/pause-research.md +12 -0
  268. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/progress.md +105 -0
  269. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/remove-task.md +63 -0
  270. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/resume-research.md +64 -0
  271. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/settings.md +16 -0
  272. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/status.md +92 -0
  273. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/upload-data.md +104 -0
  274. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/wtfp.md +145 -0
  275. package/library/plugins/materio/ai.iowarp.clio/references/execution.md +56 -0
  276. package/library/plugins/materio/ai.iowarp.portability/provenance.json +9 -0
  277. package/library/plugins/materio/assets/actions/add-task.md +86 -0
  278. package/library/plugins/materio/assets/actions/archive-task.md +84 -0
  279. package/library/plugins/materio/assets/actions/checkpoint.md +47 -0
  280. package/library/plugins/materio/assets/actions/define-research-tasks.md +228 -0
  281. package/library/plugins/materio/assets/actions/define-virtual-lab.md +179 -0
  282. package/library/plugins/materio/assets/actions/execute-task.md +290 -0
  283. package/library/plugins/materio/assets/actions/help.md +140 -0
  284. package/library/plugins/materio/assets/actions/identify-research.md +204 -0
  285. package/library/plugins/materio/assets/actions/literature-review.md +199 -0
  286. package/library/plugins/materio/assets/actions/pause-research.md +34 -0
  287. package/library/plugins/materio/assets/actions/progress.md +125 -0
  288. package/library/plugins/materio/assets/actions/remove-task.md +82 -0
  289. package/library/plugins/materio/assets/actions/resume-research.md +84 -0
  290. package/library/plugins/materio/assets/actions/settings.md +38 -0
  291. package/library/plugins/materio/assets/actions/status.md +112 -0
  292. package/library/plugins/materio/assets/actions/upload-data.md +123 -0
  293. package/library/plugins/materio/assets/actions/wtfp.md +179 -0
  294. package/library/plugins/materio/assets/references/research-domains.md +134 -0
  295. package/library/plugins/materio/assets/references/research-policy.md +77 -0
  296. package/library/plugins/materio/assets/references/traditional-workflows.md +146 -0
  297. package/library/plugins/materio/assets/scripts/check_physics.py +271 -0
  298. package/library/plugins/materio/assets/scripts/check_scripts.py +248 -0
  299. package/library/plugins/materio/assets/scripts/project_plugin.py +165 -0
  300. package/library/plugins/materio/assets/scripts/research_state.py +400 -0
  301. package/library/plugins/materio/assets/scripts/verify_citations.py +616 -0
  302. package/library/plugins/materio/assets/templates/RESEARCH.md +39 -0
  303. package/library/plugins/materio/assets/templates/VIRTUAL-LAB.md +120 -0
  304. package/library/plugins/materio/assets/templates/WORKFLOW.md +42 -0
  305. package/library/plugins/materio/assets/templates/config.json +5 -0
  306. package/library/plugins/materio/evals/scripts.yaml +29 -0
  307. package/library/plugins/materio/plugin.json +530 -0
  308. package/library/plugins/materio/skills/materio-lab-definer/SKILL.md +74 -0
  309. package/library/plugins/materio/skills/materio-literature-reviewer/SKILL.md +64 -0
  310. package/library/plugins/materio/skills/materio-research-explorer/SKILL.md +74 -0
  311. package/library/plugins/materio/skills/materio-task-executor/SKILL.md +214 -0
  312. package/library/plugins/materio/skills/materio-task-verifier/SKILL.md +46 -0
  313. package/library/plugins/materio/skills/materio-workflow-planner/SKILL.md +79 -0
  314. package/library/plugins/materio/tests/test_check_physics.py +139 -0
  315. package/library/plugins/materio/tests/test_check_scripts.py +140 -0
  316. package/library/plugins/materio/tests/test_research_state.py +291 -0
  317. package/library/plugins/materio/tests/test_verify_citations.py +337 -0
  318. package/library/prompts/README.md +7 -0
  319. package/library/registry.yaml +921 -0
  320. package/library/skills/README.md +120 -0
  321. package/{skills → library/skills}/coding/ast-grep/SKILL.md +1 -1
  322. package/{skills → library/skills}/coding/ast-grep/evals.md +1 -1
  323. package/library/skills/coding/ast-grep/plugin.json +23 -0
  324. package/{skills → library/skills}/coding/coding-standards/SKILL.md +1 -1
  325. package/{skills → library/skills}/coding/coding-standards/evals.md +1 -1
  326. package/library/skills/coding/coding-standards/plugin.json +23 -0
  327. package/{skills → library/skills}/coding/prototype/SKILL.md +1 -1
  328. package/{skills → library/skills}/coding/prototype/evals.md +1 -1
  329. package/library/skills/coding/prototype/plugin.json +23 -0
  330. package/{skills → library/skills}/coding/tdd/SKILL.md +1 -1
  331. package/{skills → library/skills}/coding/tdd/evals.md +1 -1
  332. package/library/skills/coding/tdd/plugin.json +23 -0
  333. package/{skills → library/skills}/context/context-handoff/SKILL.md +1 -1
  334. package/{skills → library/skills}/context/context-handoff/evals.md +1 -1
  335. package/library/skills/context/context-handoff/plugin.json +23 -0
  336. package/{skills → library/skills}/context/context-prime/SKILL.md +1 -1
  337. package/{skills → library/skills}/context/context-prime/evals.md +1 -1
  338. package/library/skills/context/context-prime/plugin.json +23 -0
  339. package/{skills → library/skills}/git/branch-closeout/SKILL.md +1 -1
  340. package/library/skills/git/branch-closeout/plugin.json +23 -0
  341. package/{skills → library/skills}/git/file-ticket/SKILL.md +1 -1
  342. package/library/skills/git/file-ticket/plugin.json +23 -0
  343. package/{skills → library/skills}/git/fix-issue/SKILL.md +1 -1
  344. package/library/skills/git/fix-issue/plugin.json +23 -0
  345. package/{skills → library/skills}/git/resolve-merge-conflicts/SKILL.md +1 -1
  346. package/{skills → library/skills}/git/resolve-merge-conflicts/evals.md +1 -1
  347. package/library/skills/git/resolve-merge-conflicts/plugin.json +23 -0
  348. package/{skills → library/skills}/git/ship/SKILL.md +1 -1
  349. package/library/skills/git/ship/plugin.json +23 -0
  350. package/{skills → library/skills}/git/worktree-create/SKILL.md +1 -1
  351. package/library/skills/git/worktree-create/plugin.json +23 -0
  352. package/{skills → library/skills}/git/worktree-merge/SKILL.md +1 -1
  353. package/library/skills/git/worktree-merge/plugin.json +23 -0
  354. package/{skills → library/skills}/meta/clio-coder-dev/SKILL.md +1 -1
  355. package/{skills → library/skills}/meta/clio-coder-dev/evals.md +1 -1
  356. package/library/skills/meta/clio-coder-dev/plugin.json +23 -0
  357. package/{skills → library/skills}/meta/clio-coder-test/SKILL.md +1 -1
  358. package/{skills → library/skills}/meta/clio-coder-test/evals.md +1 -1
  359. package/library/skills/meta/clio-coder-test/plugin.json +23 -0
  360. package/{skills → library/skills}/meta/credentials/SKILL.md +1 -1
  361. package/{skills → library/skills}/meta/credentials/evals.md +1 -1
  362. package/library/skills/meta/credentials/plugin.json +23 -0
  363. package/library/skills/meta/find-skills/SKILL.md +85 -0
  364. package/library/skills/meta/find-skills/evals.md +65 -0
  365. package/library/skills/meta/find-skills/plugin.json +23 -0
  366. package/{skills → library/skills}/meta/herdr/SKILL.md +1 -1
  367. package/{skills → library/skills}/meta/herdr/evals.md +1 -1
  368. package/library/skills/meta/herdr/plugin.json +23 -0
  369. package/{skills → library/skills}/meta/skill-craft/SKILL.md +23 -9
  370. package/{skills → library/skills}/meta/skill-craft/evals.md +11 -3
  371. package/library/skills/meta/skill-craft/plugin.json +23 -0
  372. package/{skills → library/skills}/planning/archify/SKILL.md +13 -13
  373. package/library/skills/planning/archify/plugin.json +23 -0
  374. package/{skills → library/skills}/planning/architecture/SKILL.md +1 -1
  375. package/{skills → library/skills}/planning/architecture/evals.md +1 -1
  376. package/library/skills/planning/architecture/plugin.json +23 -0
  377. package/{skills → library/skills}/planning/backlog/SKILL.md +1 -1
  378. package/{skills → library/skills}/planning/backlog/evals.md +1 -1
  379. package/library/skills/planning/backlog/plugin.json +23 -0
  380. package/{skills → library/skills}/planning/prd/SKILL.md +1 -1
  381. package/{skills → library/skills}/planning/prd/evals.md +1 -1
  382. package/library/skills/planning/prd/plugin.json +23 -0
  383. package/{skills → library/skills}/planning/product-intent/SKILL.md +1 -1
  384. package/{skills → library/skills}/planning/product-intent/evals.md +1 -1
  385. package/library/skills/planning/product-intent/plugin.json +23 -0
  386. package/{skills → library/skills}/planning/tech-spec/SKILL.md +1 -1
  387. package/{skills → library/skills}/planning/tech-spec/evals.md +1 -1
  388. package/library/skills/planning/tech-spec/plugin.json +23 -0
  389. package/{skills → library/skills}/registry.yaml +7 -7
  390. package/{skills → library/skills}/remote.yaml +1 -1
  391. package/{skills → library/skills}/research/arxiv-literature/SKILL.md +1 -1
  392. package/{skills → library/skills}/research/arxiv-literature/evals.md +1 -1
  393. package/library/skills/research/arxiv-literature/plugin.json +23 -0
  394. package/{skills → library/skills}/research/experiment-protocol/SKILL.md +1 -1
  395. package/{skills → library/skills}/research/experiment-protocol/evals.md +1 -1
  396. package/library/skills/research/experiment-protocol/plugin.json +23 -0
  397. package/{skills → library/skills}/research/scientific-debugging/SKILL.md +1 -1
  398. package/{skills → library/skills}/research/scientific-debugging/evals.md +1 -1
  399. package/library/skills/research/scientific-debugging/plugin.json +23 -0
  400. package/{skills → library/skills}/research/scientific-modernization/SKILL.md +1 -1
  401. package/{skills → library/skills}/research/scientific-modernization/evals.md +1 -1
  402. package/library/skills/research/scientific-modernization/plugin.json +23 -0
  403. package/{skills → library/skills}/skill-marketplace.json +37 -37
  404. package/{skills → library/skills}/workflow/cut-it/SKILL.md +1 -1
  405. package/{skills → library/skills}/workflow/cut-it/evals.md +1 -1
  406. package/library/skills/workflow/cut-it/plugin.json +23 -0
  407. package/{skills → library/skills}/workflow/design-council/SKILL.md +1 -1
  408. package/{skills → library/skills}/workflow/design-council/evals.md +1 -1
  409. package/library/skills/workflow/design-council/plugin.json +23 -0
  410. package/{skills → library/skills}/workflow/grill-me/SKILL.md +1 -1
  411. package/{skills → library/skills}/workflow/grill-me/evals.md +1 -1
  412. package/library/skills/workflow/grill-me/plugin.json +23 -0
  413. package/{skills → library/skills}/workflow/workflow-distiller/SKILL.md +14 -11
  414. package/{skills → library/skills}/workflow/workflow-distiller/evals.md +14 -6
  415. package/library/skills/workflow/workflow-distiller/plugin.json +23 -0
  416. package/package.json +12 -5
  417. package/src/cli/agents.ts +1 -1
  418. package/src/cli/config-inspect.ts +1 -1
  419. package/src/cli/configure.ts +2 -2
  420. package/src/cli/eval.ts +40 -6
  421. package/src/cli/extensions.ts +74 -8
  422. package/src/cli/fleet-preflight.ts +2 -0
  423. package/src/cli/fleet.ts +2 -0
  424. package/src/cli/index.ts +1 -3
  425. package/src/cli/interop-inspect.ts +61 -33
  426. package/src/cli/interop.ts +79 -9
  427. package/src/cli/library-import.ts +139 -0
  428. package/src/cli/library.ts +418 -120
  429. package/src/cli/run.ts +26 -9
  430. package/src/cli/skills-eval.ts +43 -6
  431. package/src/cli/skills-inventory.ts +6 -2
  432. package/src/cli/skills.ts +44 -491
  433. package/src/core/bus-events.ts +5 -0
  434. package/src/core/defaults.ts +1 -1
  435. package/src/core/recent-models.ts +2 -2
  436. package/src/core/session-routing.ts +3 -3
  437. package/src/core/state-file-lock.ts +1 -1
  438. package/src/core/tool-names.ts +5 -0
  439. package/src/domains/agents/extension.ts +42 -6
  440. package/src/domains/agents/fleet-commands.ts +92 -1
  441. package/src/domains/agents/fleet-contract.ts +87 -19
  442. package/src/domains/agents/recipe.ts +5 -4
  443. package/src/domains/agents/registry.ts +80 -24
  444. package/src/domains/config/keybindings.ts +155 -95
  445. package/src/domains/context/worker/contract.ts +91 -0
  446. package/src/domains/context/worker/pressure.ts +120 -0
  447. package/src/domains/context/worker/recall.ts +62 -0
  448. package/src/domains/context/worker/select.ts +164 -0
  449. package/src/domains/context/worker/snapshot.ts +35 -0
  450. package/src/domains/context/worker/store.ts +16 -0
  451. package/src/domains/context/working-set/replay/synthetic.ts +2 -1
  452. package/src/domains/dispatch/active-route-planner.ts +2 -0
  453. package/src/domains/dispatch/backoff.ts +1 -0
  454. package/src/domains/dispatch/code-step.ts +12 -2
  455. package/src/domains/dispatch/contract.ts +3 -0
  456. package/src/domains/dispatch/execution-plan.ts +2 -0
  457. package/src/domains/dispatch/extension.ts +109 -27
  458. package/src/domains/dispatch/fleet-plan.ts +10 -0
  459. package/src/domains/dispatch/fleet-run.ts +1 -0
  460. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  461. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  462. package/src/domains/dispatch/state.ts +1 -0
  463. package/src/domains/dispatch/types.ts +5 -0
  464. package/src/domains/dispatch/validation.ts +12 -0
  465. package/src/domains/dispatch/workspace-checkpoint.ts +1 -1
  466. package/src/domains/evidence/failure-attribution.ts +1 -0
  467. package/src/domains/evidence/trust-status.ts +22 -3
  468. package/src/domains/extensions/command-schema.ts +145 -0
  469. package/src/domains/extensions/command-tools.ts +15 -0
  470. package/src/domains/extensions/compatibility.ts +7 -0
  471. package/src/domains/extensions/contract.ts +0 -4
  472. package/src/domains/extensions/discovery.ts +69 -205
  473. package/src/domains/extensions/extension.ts +0 -4
  474. package/src/domains/extensions/index.ts +1 -5
  475. package/src/domains/extensions/manager.ts +1 -6
  476. package/src/domains/extensions/operator-commands.ts +29 -0
  477. package/src/domains/extensions/operator-runtime.ts +483 -0
  478. package/src/domains/extensions/public-api.ts +53 -0
  479. package/src/domains/extensions/runtime-child.mjs +114 -0
  480. package/src/domains/extensions/runtime-process.ts +306 -0
  481. package/src/domains/extensions/runtime-schema.ts +146 -0
  482. package/src/domains/extensions/{resources.ts → snapshot-access.ts} +1 -17
  483. package/src/domains/extensions/snapshot.ts +4 -32
  484. package/src/domains/extensions/state.ts +5 -83
  485. package/src/domains/extensions/types.ts +33 -34
  486. package/src/domains/interop/adopt.ts +546 -0
  487. package/src/domains/interop/detect.ts +50 -12
  488. package/src/domains/interop/foreign.ts +554 -0
  489. package/src/domains/interop/import.ts +277 -0
  490. package/src/domains/interop/index.ts +24 -0
  491. package/src/domains/interop/install.ts +6 -0
  492. package/src/domains/interop/inventory.ts +351 -0
  493. package/src/domains/interop/projection.ts +360 -0
  494. package/src/domains/interop/registry.ts +106 -3
  495. package/src/domains/interop/types.ts +51 -0
  496. package/src/domains/lifecycle/migrations/index.ts +0 -2
  497. package/src/domains/lifecycle/naming-resources.ts +1 -1
  498. package/src/domains/middleware/marketplace-offer.ts +1 -1
  499. package/src/domains/mux/contract.ts +1 -1
  500. package/src/domains/plugins/catalog.ts +204 -0
  501. package/src/domains/plugins/contract.ts +24 -0
  502. package/src/domains/plugins/discovery.ts +316 -0
  503. package/src/domains/plugins/extension.ts +40 -0
  504. package/src/domains/plugins/index.ts +77 -0
  505. package/src/domains/plugins/integrity.ts +6 -0
  506. package/src/domains/plugins/manifest.ts +3 -0
  507. package/src/domains/plugins/resources.ts +102 -0
  508. package/src/domains/plugins/state.ts +753 -0
  509. package/src/domains/plugins/types.ts +217 -0
  510. package/src/domains/prompts/extension.ts +9 -2
  511. package/src/domains/prompts/fragments/operating/skills.md +10 -10
  512. package/src/domains/resources/common-loader.ts +9 -6
  513. package/src/domains/resources/index.ts +67 -0
  514. package/src/domains/resources/library-actions.ts +836 -0
  515. package/src/domains/resources/library-evals.ts +38 -0
  516. package/src/domains/resources/library-inventory.ts +1048 -0
  517. package/src/domains/resources/library-types.ts +50 -0
  518. package/src/domains/resources/library-validation.ts +634 -0
  519. package/src/domains/resources/library.ts +437 -156
  520. package/src/domains/resources/package-references.ts +66 -0
  521. package/src/domains/resources/prompts/loader.ts +75 -41
  522. package/src/domains/resources/skills/install.ts +2 -2
  523. package/src/domains/resources/skills/loader.ts +77 -22
  524. package/src/domains/resources/skills/marketplace.ts +48 -57
  525. package/src/domains/resources/skills/promotion.ts +2 -2
  526. package/src/domains/resources/skills/provenance-pin.ts +17 -4
  527. package/src/domains/safety/action-classifier.ts +2 -2
  528. package/src/domains/safety/default-path-policy.ts +3 -1
  529. package/src/domains/safety/policy-engine.ts +1 -1
  530. package/src/domains/safety/protected-artifacts.ts +21 -5
  531. package/src/domains/safety/skill-authority.ts +5 -2
  532. package/src/domains/share/archive.ts +1 -1
  533. package/src/engine/apis/openai-completions.ts +52 -2
  534. package/src/engine/notices/pi-tui-LICENSE +21 -0
  535. package/src/engine/tui.ts +3 -0
  536. package/src/engine/worker-runtime.ts +58 -14
  537. package/src/engine/worker-tools.ts +5 -0
  538. package/src/entry/orchestrator.ts +26 -5
  539. package/src/entry/plugin-reload.ts +18 -0
  540. package/src/interactive/application-controller.ts +67 -21
  541. package/src/interactive/chat-loop.ts +32 -5
  542. package/src/interactive/chat-panel.ts +5 -1
  543. package/src/interactive/clio-editor.ts +53 -21
  544. package/src/interactive/command-output.ts +56 -1
  545. package/src/interactive/editor-submit.ts +65 -28
  546. package/src/interactive/fleet-run-preview.ts +2 -0
  547. package/src/interactive/follow-up-queue-panel.ts +3 -3
  548. package/src/interactive/footer/dashboard.ts +4 -1
  549. package/src/interactive/footer/notifications.ts +2 -2
  550. package/src/interactive/footer/widgets.ts +2 -2
  551. package/src/interactive/interactive-application.ts +209 -21
  552. package/src/interactive/interactive-input-runtime.ts +254 -7
  553. package/src/interactive/interactive-presentation.ts +41 -12
  554. package/src/interactive/interactive-slash-runtime.ts +37 -8
  555. package/src/interactive/keybinding-manager.ts +156 -79
  556. package/src/interactive/keyboard-owner.ts +37 -0
  557. package/src/interactive/leader-key.ts +49 -102
  558. package/src/interactive/leader-menu.ts +45 -0
  559. package/src/interactive/overlay-ask-user-lifecycle.ts +9 -1
  560. package/src/interactive/overlay-frame.ts +15 -0
  561. package/src/interactive/overlay-key-routing.ts +46 -47
  562. package/src/interactive/overlay-lifecycle.ts +30 -15
  563. package/src/interactive/overlay-resource-openers.ts +56 -46
  564. package/src/interactive/overlays/ask-user.ts +630 -556
  565. package/src/interactive/overlays/extension-panel.ts +70 -0
  566. package/src/interactive/overlays/extensions.ts +28 -5
  567. package/src/interactive/overlays/fleet-run-approval.ts +7 -3
  568. package/src/interactive/overlays/help-reference.ts +89 -40
  569. package/src/interactive/overlays/interop.ts +122 -3
  570. package/src/interactive/overlays/keybinding-detail.ts +2 -2
  571. package/src/interactive/overlays/library-lifecycle.ts +90 -0
  572. package/src/interactive/overlays/library-model.ts +574 -0
  573. package/src/interactive/overlays/library-review.ts +557 -0
  574. package/src/interactive/overlays/library-tabs.ts +3 -15
  575. package/src/interactive/overlays/library.ts +602 -0
  576. package/src/interactive/overlays/list-overlay.ts +218 -39
  577. package/src/interactive/overlays/model-selector.ts +28 -25
  578. package/src/interactive/overlays/session-selector.ts +9 -3
  579. package/src/interactive/overlays/settings.ts +25 -18
  580. package/src/interactive/overlays/tree-selector.ts +16 -11
  581. package/src/interactive/permission-hint.ts +13 -0
  582. package/src/interactive/permission-overlay.ts +77 -28
  583. package/src/interactive/prompt-source-label.ts +21 -0
  584. package/src/interactive/renderers/reference-card.ts +35 -0
  585. package/src/interactive/renderers/worker-entry.ts +35 -3
  586. package/src/interactive/slash-autocomplete.ts +99 -1
  587. package/src/interactive/slash-commands.ts +390 -67
  588. package/src/interactive/slash-spec.ts +0 -1
  589. package/src/interactive/terminal-lease.ts +44 -12
  590. package/src/interactive/turn-queues.ts +8 -7
  591. package/src/interactive/turn-runtime.ts +1 -1
  592. package/src/interactive/view/view-overlay.ts +19 -14
  593. package/src/interactive/welcome-dashboard.ts +525 -408
  594. package/src/tools/bootstrap.ts +8 -0
  595. package/src/tools/builtin-tool-catalog.ts +7 -2
  596. package/src/tools/context/index.ts +58 -5
  597. package/src/tools/context/library.ts +465 -0
  598. package/src/tools/context/surface.ts +20 -6
  599. package/src/tools/core-bootstrap.ts +3 -0
  600. package/src/tools/dispatch-admission.ts +24 -1
  601. package/src/tools/dispatch-arguments.ts +8 -0
  602. package/src/tools/dispatch-plan.ts +32 -0
  603. package/src/tools/dispatch-schema.ts +31 -1
  604. package/src/tools/dispatch-types.ts +3 -0
  605. package/src/tools/dispatch.ts +1 -1
  606. package/src/tools/harness-extensions.ts +169 -0
  607. package/src/tools/observation.ts +4 -0
  608. package/src/tools/policy.ts +7 -1
  609. package/src/tools/registry.ts +19 -1
  610. package/src/tools/worker-evidence.ts +5 -0
  611. package/src/worker/context-seed.ts +192 -0
  612. package/src/worker/entry.ts +1 -0
  613. package/src/worker/spec-contract.ts +8 -1
  614. package/dist/chunk-3UW3KU4A.js +0 -21
  615. package/dist/chunk-536HXRFE.js +0 -1257
  616. package/dist/chunk-B3MOMLJ4.js +0 -433
  617. package/dist/chunk-CXQ37WJH.js +0 -45
  618. package/dist/chunk-KTFSFCVN.js +0 -46
  619. package/dist/chunk-QCOV5DFY.js +0 -911
  620. package/dist/chunk-QRFXEO6Y.js +0 -17
  621. package/dist/chunk-VAHLPXPY.js +0 -399
  622. package/dist/interop-RVCAYECG.js +0 -115
  623. package/dist/library-CTKZA7K3.js +0 -226
  624. package/dist/skills-OXFEAWMT.js +0 -510
  625. package/skills/README.md +0 -418
  626. package/skills/meta/find-skills/SKILL.md +0 -78
  627. package/skills/meta/find-skills/evals.md +0 -47
  628. package/src/domains/extensions/resource-path.ts +0 -27
  629. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +0 -27
  630. package/src/interactive/overlays/agents.ts +0 -70
  631. package/src/interactive/overlays/library-install-confirm.ts +0 -152
  632. package/src/interactive/overlays/prompts.ts +0 -89
  633. package/src/interactive/overlays/skills-hub.ts +0 -615
  634. /package/{skills → library/skills}/coding/ast-grep/references/rule_reference.md +0 -0
  635. /package/{skills → library/skills}/coding/prototype/references/LOGIC.md +0 -0
  636. /package/{skills → library/skills}/coding/prototype/references/UI.md +0 -0
  637. /package/{skills → library/skills}/coding/tdd/references/mocking.md +0 -0
  638. /package/{skills → library/skills}/coding/tdd/references/tests.md +0 -0
  639. /package/{skills → library/skills}/context/context-handoff/scripts/new-handoff.sh +0 -0
  640. /package/{skills → library/skills}/git/branch-closeout/evals.md +0 -0
  641. /package/{skills → library/skills}/git/branch-closeout/references/closeout-checklist.md +0 -0
  642. /package/{skills → library/skills}/git/file-ticket/assets/issue-template.md +0 -0
  643. /package/{skills → library/skills}/git/file-ticket/evals.md +0 -0
  644. /package/{skills → library/skills}/git/file-ticket/references/issue-discovery.md +0 -0
  645. /package/{skills → library/skills}/git/fix-issue/evals.md +0 -0
  646. /package/{skills → library/skills}/git/fix-issue/references/diagnosis-and-rca.md +0 -0
  647. /package/{skills → library/skills}/git/resolve-merge-conflicts/references/conflict-matrix.md +0 -0
  648. /package/{skills → library/skills}/git/ship/assets/pr-template.md +0 -0
  649. /package/{skills → library/skills}/git/ship/evals.md +0 -0
  650. /package/{skills → library/skills}/git/ship/references/remote-and-branch-policy.md +0 -0
  651. /package/{skills → library/skills}/git/worktree-create/evals.md +0 -0
  652. /package/{skills → library/skills}/git/worktree-create/references/worktree-setup.md +0 -0
  653. /package/{skills → library/skills}/git/worktree-merge/evals.md +0 -0
  654. /package/{skills → library/skills}/git/worktree-merge/references/merge-strategies.md +0 -0
  655. /package/{skills → library/skills}/meta/clio-coder-test/references/harness.md +0 -0
  656. /package/{skills → library/skills}/meta/clio-coder-test/references/test-map.md +0 -0
  657. /package/{skills → library/skills}/planning/archify/evals.md +0 -0
@@ -0,0 +1,204 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { existsSync, mkdtempSync, readFileSync, realpathSync, rmSync, statSync } from "node:fs";
3
+ import { homedir, tmpdir } from "node:os";
4
+ import path from "node:path";
5
+ import { parse as parseYaml } from "yaml";
6
+ import { resolvePackageRoot } from "../../core/package-root.js";
7
+ import { buildSafeToolEnv } from "../../core/safe-exec.js";
8
+ import { isSemanticVersion } from "../extensions/compatibility.js";
9
+ import {
10
+ isLibraryKind,
11
+ isLibraryResourceKind,
12
+ LIBRARY_PROVIDES_LIMITS,
13
+ type LibraryPackageEntry,
14
+ type LibraryProvidedResource,
15
+ type LibraryRequirementRef,
16
+ } from "../resources/library-types.js";
17
+ import { isPluginId } from "./discovery.js";
18
+
19
+ export type PluginCatalogEntry = LibraryPackageEntry;
20
+
21
+ export interface PluginSource {
22
+ root: string;
23
+ cleanup: () => void;
24
+ }
25
+
26
+ /** Explicit GitHub tree URLs identify both the revision and the bundle directory. */
27
+ export function parsePluginGithubSource(source: string): { url: string; ref: string; subdir: string } | undefined {
28
+ const match =
29
+ /^https:\/\/github\.com\/([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)\/tree\/([A-Za-z0-9_.-]+)(?:\/(.*?))?\/?$/.exec(source);
30
+ if (!match?.[1] || !match[2] || !match[3]) return undefined;
31
+ const subdir = match[4] ?? "";
32
+ if (subdir.split("/").some((part) => part === ".." || part === ".") || subdir.includes("\\") || subdir.includes("\0"))
33
+ return undefined;
34
+ return { url: `https://github.com/${match[1]}/${match[2]}.git`, ref: match[3], subdir };
35
+ }
36
+
37
+ export function pluginLocalPath(source: string, cwd = process.cwd()): string {
38
+ return path.resolve(cwd, source.startsWith("~/") ? path.join(homedir(), source.slice(2)) : source);
39
+ }
40
+
41
+ /** The same bounded, vector-only Git transport used by the skill installer. */
42
+ export function fetchPluginSource(source: string, cwd = process.cwd()): PluginSource {
43
+ const local = pluginLocalPath(source, cwd);
44
+ if (existsSync(local)) return { root: local, cleanup: () => {} };
45
+ const remote = parsePluginGithubSource(source);
46
+ if (!remote)
47
+ throw new Error(
48
+ `unsupported plugin source: ${source}; use a local directory or https://github.com/owner/repo/tree/ref/path`,
49
+ );
50
+ const temp = mkdtempSync(path.join(tmpdir(), "clio-coder-plugin-"));
51
+ const cleanup = (): void => rmSync(temp, { recursive: true, force: true });
52
+ try {
53
+ execFileSync(
54
+ "git",
55
+ ["-c", "core.hooksPath=/dev/null", "clone", "--depth", "1", "--branch", remote.ref, "--", remote.url, temp],
56
+ {
57
+ stdio: "pipe",
58
+ timeout: 120_000,
59
+ maxBuffer: 1_000_000,
60
+ env: buildSafeToolEnv({ GIT_TERMINAL_PROMPT: "0", GIT_CONFIG_NOSYSTEM: "1" }),
61
+ },
62
+ );
63
+ const root = path.join(temp, remote.subdir);
64
+ if (!existsSync(root) || !statSync(root).isDirectory())
65
+ throw new Error(`plugin source has no directory ${remote.subdir || "."}: ${source}`);
66
+ const relative = path.relative(realpathSync(temp), realpathSync(root));
67
+ if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))
68
+ throw new Error("plugin source escapes repository");
69
+ // Repository metadata is transport state, not part of a root-level package.
70
+ if (!remote.subdir) rmSync(path.join(temp, ".git"), { recursive: true, force: true });
71
+ return { root, cleanup };
72
+ } catch (error) {
73
+ cleanup();
74
+ throw error;
75
+ }
76
+ }
77
+
78
+ const PROVIDED_NAME = /^[A-Za-z0-9][A-Za-z0-9._:-]*$/;
79
+
80
+ /**
81
+ * Parse optional `provides` hints. A malformed hint list is dropped with a
82
+ * diagnostic and the row stays valid: hints support discovery, never admission,
83
+ * so a bad hint must not hide an otherwise installable package.
84
+ */
85
+ function providedResources(value: unknown, name: string, diagnostics: string[]): LibraryProvidedResource[] | undefined {
86
+ if (value === undefined) return undefined;
87
+ if (!Array.isArray(value) || value.length > LIBRARY_PROVIDES_LIMITS.entries) {
88
+ diagnostics.push(`library index provides ignored (not a bounded list): ${name}`);
89
+ return undefined;
90
+ }
91
+ const hints: LibraryProvidedResource[] = [];
92
+ const seen = new Set<string>();
93
+ for (const raw of value) {
94
+ const item = raw && typeof raw === "object" ? (raw as Record<string, unknown>) : undefined;
95
+ if (
96
+ !item ||
97
+ !isLibraryResourceKind(item.kind) ||
98
+ typeof item.name !== "string" ||
99
+ item.name.length > LIBRARY_PROVIDES_LIMITS.name ||
100
+ !PROVIDED_NAME.test(item.name) ||
101
+ (item.description !== undefined &&
102
+ (typeof item.description !== "string" || item.description.length > LIBRARY_PROVIDES_LIMITS.description))
103
+ ) {
104
+ diagnostics.push(`library index provides ignored (malformed hint): ${name}`);
105
+ return undefined;
106
+ }
107
+ const key = `${item.kind}:${item.name}`;
108
+ if (seen.has(key)) continue;
109
+ seen.add(key);
110
+ hints.push({
111
+ kind: item.kind,
112
+ name: item.name,
113
+ ...(typeof item.description === "string" ? { description: item.description } : {}),
114
+ });
115
+ }
116
+ return hints;
117
+ }
118
+
119
+ export function readPluginCatalog(file: string, diagnostics: string[]): LibraryPackageEntry[] {
120
+ if (!existsSync(file)) return [];
121
+ try {
122
+ const parsed: unknown = parseYaml(readFileSync(file, "utf8"));
123
+ const rows: unknown[] | undefined = Array.isArray(parsed)
124
+ ? parsed
125
+ : parsed && typeof parsed === "object" && Array.isArray((parsed as { entries?: unknown }).entries)
126
+ ? (parsed as { entries: unknown[] }).entries
127
+ : undefined;
128
+ if (!rows) throw new Error("library index must be a list or contain an entries list");
129
+ return rows.flatMap((row): LibraryPackageEntry[] => {
130
+ if (!row || typeof row !== "object") {
131
+ diagnostics.push(`library index entry malformed: ${file}`);
132
+ return [];
133
+ }
134
+ const item = row as Record<string, unknown>;
135
+ if (
136
+ !isLibraryKind(item.kind) ||
137
+ typeof item.name !== "string" ||
138
+ !isPluginId(item.name) ||
139
+ typeof item.description !== "string" ||
140
+ typeof item.sourceUrl !== "string" ||
141
+ item.sourceUrl.trim().length === 0 ||
142
+ !isSemanticVersion(item.version) ||
143
+ typeof item.sha256 !== "string" ||
144
+ !/^[a-f0-9]{64}$/.test(item.sha256)
145
+ ) {
146
+ diagnostics.push(
147
+ `library index entry requires name, description, sourceUrl, version, and full-tree sha256: ${String(item.name ?? file)}`,
148
+ );
149
+ return [];
150
+ }
151
+ if (
152
+ item.requires !== undefined &&
153
+ (!Array.isArray(item.requires) || item.requires.some((ref) => typeof ref !== "string"))
154
+ ) {
155
+ diagnostics.push(`library_requirement_malformed: ${item.name}`);
156
+ return [];
157
+ }
158
+ const remote = /^(?:[a-z][a-z0-9+.-]*:\/\/|git@)/i.test(item.sourceUrl);
159
+ if (remote && !parsePluginGithubSource(item.sourceUrl)) {
160
+ diagnostics.push(`unsupported library index source: ${item.sourceUrl}`);
161
+ return [];
162
+ }
163
+ const provides = providedResources(item.provides, item.name, diagnostics);
164
+ return [
165
+ {
166
+ kind: item.kind,
167
+ name: item.name,
168
+ description: item.description,
169
+ sourceUrl: remote ? item.sourceUrl : path.resolve(path.dirname(file), item.sourceUrl),
170
+ version: item.version,
171
+ sha256: item.sha256,
172
+ origin: "catalog",
173
+ ...(typeof item.category === "string" ? { category: item.category } : {}),
174
+ ...(["pass", "warn", "fail", "unknown"].includes(String(item.audit))
175
+ ? { audit: item.audit as NonNullable<LibraryPackageEntry["audit"]> }
176
+ : {}),
177
+ ...(Array.isArray(item.triggers)
178
+ ? { triggers: item.triggers.filter((value): value is string => typeof value === "string") }
179
+ : {}),
180
+ ...(Array.isArray(item.requires) ? { requires: item.requires as LibraryRequirementRef[] } : {}),
181
+ ...(provides ? { provides } : {}),
182
+ index: path.resolve(file),
183
+ },
184
+ ];
185
+ });
186
+ } catch (error) {
187
+ diagnostics.push(`library index unreadable: ${error instanceof Error ? error.message : String(error)}`);
188
+ return [];
189
+ }
190
+ }
191
+
192
+ /** The index shipped inside this Clio-Coder package; rows from it are the only "bundled" evidence. */
193
+ export function bundledLibraryIndexPath(): string {
194
+ return path.join(resolvePackageRoot(), "library", "registry.yaml");
195
+ }
196
+
197
+ export function bundledPluginCatalog(diagnostics: string[]): LibraryPackageEntry[] {
198
+ try {
199
+ return readPluginCatalog(bundledLibraryIndexPath(), diagnostics);
200
+ } catch (error) {
201
+ diagnostics.push(`library index unavailable: ${error instanceof Error ? error.message : String(error)}`);
202
+ return [];
203
+ }
204
+ }
@@ -0,0 +1,24 @@
1
+ import type { DomainContract } from "../../core/domain-loader.js";
2
+ import type {
3
+ InstalledPlugin,
4
+ PluginCandidate,
5
+ PluginInstallOptions,
6
+ PluginListOptions,
7
+ PluginMutationResult,
8
+ PluginResourceKind,
9
+ PluginResourceRoot,
10
+ PluginSnapshot,
11
+ } from "./types.js";
12
+
13
+ export interface PluginsContract extends DomainContract {
14
+ list(cwd?: string, options?: PluginListOptions): InstalledPlugin[];
15
+ discover(root: string): PluginCandidate[];
16
+ install(source: string, options?: PluginInstallOptions): PluginMutationResult;
17
+ update(id: string, options?: PluginInstallOptions): PluginMutationResult;
18
+ enable(id: string, options?: PluginListOptions): PluginMutationResult;
19
+ disable(id: string, options?: PluginListOptions): PluginMutationResult;
20
+ remove(id: string, options?: PluginListOptions): PluginMutationResult;
21
+ resourceRoots(kind: PluginResourceKind, cwd?: string): PluginResourceRoot[];
22
+ snapshot(cwd?: string): PluginSnapshot;
23
+ reload(cwd?: string): PluginSnapshot;
24
+ }
@@ -0,0 +1,316 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync, lstatSync, readdirSync, realpathSync, statSync } from "node:fs";
3
+ import path from "node:path";
4
+ import { evaluateClioCompatibility, isSemanticVersion } from "../extensions/compatibility.js";
5
+ import { isLibraryKind, type LibraryRequirementRef } from "../resources/library-types.js";
6
+ import { pluginContentDigestWithCapture } from "./integrity.js";
7
+ import type {
8
+ ClioPluginConfiguration,
9
+ PluginCandidate,
10
+ PluginComponent,
11
+ PluginComponentKind,
12
+ PluginDiagnostic,
13
+ PluginManifest,
14
+ PluginResourceKind,
15
+ PluginResources,
16
+ } from "./types.js";
17
+
18
+ export const PLUGIN_SCHEMA = "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json";
19
+ export const PLUGIN_EXTENSION_KEY = "ai.iowarp.clio";
20
+ export const PLUGIN_RESOURCE_KINDS: readonly PluginResourceKind[] = ["skills", "prompts", "agents", "fleets", "themes"];
21
+ const COMPONENT_KINDS = new Set(["prompt", "agent", "skill", "fleet", "script", "resource", "tool"]);
22
+ const ROOT_KEYS = new Set([
23
+ "$schema",
24
+ "name",
25
+ "version",
26
+ "description",
27
+ "author",
28
+ "homepage",
29
+ "repository",
30
+ "license",
31
+ "keywords",
32
+ "extensions",
33
+ ]);
34
+
35
+ export function isPluginId(value: string): boolean {
36
+ return (
37
+ value.length <= 64 && /^(?!.*(?:--|\.\.))[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$/u.test(value) && value !== "state.json"
38
+ );
39
+ }
40
+
41
+ export function pluginPathContained(root: string, target: string): boolean {
42
+ const relative = path.relative(root, target);
43
+ return relative === "" || (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
44
+ }
45
+
46
+ /** Resolve a declared file or directory against the canonical installed root. */
47
+ export function pluginResourcePath(root: string, value: string, allowRoot = false): string {
48
+ if (!value || value.includes("\\") || path.isAbsolute(value))
49
+ throw new Error(`plugin path must be relative: ${value}`);
50
+ const lexicalRoot = path.resolve(root);
51
+ const lexical = path.resolve(lexicalRoot, value);
52
+ if ((!allowRoot && lexical === lexicalRoot) || !pluginPathContained(lexicalRoot, lexical))
53
+ throw new Error(`plugin path escapes root: ${value}`);
54
+ const canonicalRoot = realpathSync(lexicalRoot);
55
+ const canonical = realpathSync(lexical);
56
+ if (!pluginPathContained(canonicalRoot, canonical) || (!allowRoot && canonical === canonicalRoot))
57
+ throw new Error(`plugin path escapes through a symbolic link: ${value}`);
58
+ return canonical;
59
+ }
60
+
61
+ function record(value: unknown): value is Record<string, unknown> {
62
+ return value !== null && typeof value === "object" && !Array.isArray(value);
63
+ }
64
+
65
+ function requireKeys(value: Record<string, unknown>, allowed: ReadonlySet<string>, label: string): void {
66
+ for (const key of Object.keys(value)) if (!allowed.has(key)) throw new Error(`unknown ${label} key '${key}'`);
67
+ }
68
+
69
+ function components(value: unknown, root: string): PluginComponent[] {
70
+ if (value === undefined) return [];
71
+ if (!Array.isArray(value) || value.length > 1024)
72
+ throw new Error("components must be an array of at most 1024 entries");
73
+ const refs = new Map<string, PluginComponent>();
74
+ for (const raw of value) {
75
+ if (!record(raw)) throw new Error("component must be an object");
76
+ requireKeys(raw, new Set(["kind", "id", "path", "requires"]), "component");
77
+ if (typeof raw.kind !== "string" || !COMPONENT_KINDS.has(raw.kind)) throw new Error("unsupported component kind");
78
+ if (typeof raw.id !== "string" || raw.id.length > 80 || !/^[a-z0-9][a-z0-9._-]*$/u.test(raw.id))
79
+ throw new Error("component id must be a stable lowercase identifier");
80
+ if (typeof raw.path !== "string") throw new Error(`component ${raw.id} must have a relative path`);
81
+ const file = pluginResourcePath(root, raw.path);
82
+ if (!statSync(file).isFile()) throw new Error(`component ${raw.id} path must be a file`);
83
+ if (raw.kind === "skill" && path.basename(file) !== "SKILL.md")
84
+ throw new Error(`skill component ${raw.id} must point to SKILL.md`);
85
+ if (
86
+ raw.requires !== undefined &&
87
+ (!Array.isArray(raw.requires) || raw.requires.some((ref) => typeof ref !== "string"))
88
+ )
89
+ throw new Error(`component ${raw.id} requires must be an array of component references`);
90
+ const item: PluginComponent = {
91
+ kind: raw.kind as PluginComponentKind,
92
+ id: raw.id,
93
+ path: raw.path,
94
+ ...(raw.requires !== undefined ? { requires: raw.requires as string[] } : {}),
95
+ };
96
+ const ref = `${item.kind}:${item.id}`;
97
+ if (refs.has(ref)) throw new Error(`duplicate component reference: ${ref}`);
98
+ refs.set(ref, item);
99
+ }
100
+ const visiting = new Set<string>();
101
+ const visited = new Set<string>();
102
+ const visit = (ref: string): void => {
103
+ if (visiting.has(ref)) throw new Error(`component dependency cycle at ${ref}`);
104
+ if (visited.has(ref)) return;
105
+ const item = refs.get(ref);
106
+ if (!item) throw new Error(`missing component reference: ${ref}`);
107
+ visiting.add(ref);
108
+ for (const dependency of item.requires ?? []) visit(dependency);
109
+ visiting.delete(ref);
110
+ visited.add(ref);
111
+ };
112
+ for (const ref of refs.keys()) visit(ref);
113
+ return [...refs.values()];
114
+ }
115
+
116
+ function clioConfiguration(value: unknown, root: string): ClioPluginConfiguration {
117
+ if (value !== undefined && !record(value)) throw new Error(`${PLUGIN_EXTENSION_KEY} must be an object`);
118
+ const raw = value ?? {};
119
+ requireKeys(
120
+ raw,
121
+ new Set(["manifestVersion", "kind", "requires", "evals", "compatibility", "resources", "components"]),
122
+ PLUGIN_EXTENSION_KEY,
123
+ );
124
+ if (value !== undefined && raw.manifestVersion !== 1) throw new Error("Clio plugin manifestVersion must be 1");
125
+ const kind = raw.kind ?? "plugin";
126
+ if (!isLibraryKind(kind)) throw new Error("package kind must be plugin, skill, agent, prompt, or fleet");
127
+ if (
128
+ raw.requires !== undefined &&
129
+ (!Array.isArray(raw.requires) ||
130
+ raw.requires.some(
131
+ (ref) => typeof ref !== "string" || !/^(plugin|skill|agent|prompt|fleet):[a-z0-9][a-z0-9.-]*$/.test(ref),
132
+ ))
133
+ )
134
+ throw new Error("package requires must contain kind:name references");
135
+ const evals: Record<string, string> = {};
136
+ if (raw.evals !== undefined) {
137
+ if (!record(raw.evals)) throw new Error("package evals must map names to Suite v2 files");
138
+ for (const [id, file] of Object.entries(raw.evals)) {
139
+ if (!isPluginId(id) || typeof file !== "string" || !statSync(pluginResourcePath(root, file)).isFile())
140
+ throw new Error(`invalid package eval: ${id}`);
141
+ evals[id] = file;
142
+ }
143
+ }
144
+ let compatibility: ClioPluginConfiguration["compatibility"];
145
+ if (raw.compatibility !== undefined) {
146
+ if (!record(raw.compatibility)) throw new Error("compatibility must be an object");
147
+ requireKeys(raw.compatibility, new Set(["clio"]), "compatibility");
148
+ if (
149
+ raw.compatibility.clio !== undefined &&
150
+ (typeof raw.compatibility.clio !== "string" || !evaluateClioCompatibility(raw.compatibility.clio).rangeValid)
151
+ )
152
+ throw new Error("compatibility.clio must be a valid SemVer range");
153
+ compatibility = raw.compatibility as { clio?: string };
154
+ }
155
+ const resources: PluginResources = {};
156
+ if (existsSync(path.join(root, "skills"))) resources.skills = "skills";
157
+ if (raw.resources !== undefined) {
158
+ if (!record(raw.resources)) throw new Error("resources must be an object");
159
+ requireKeys(raw.resources, new Set(PLUGIN_RESOURCE_KINDS), "resources");
160
+ for (const kind of PLUGIN_RESOURCE_KINDS) {
161
+ const resource = raw.resources[kind];
162
+ if (resource === undefined) continue;
163
+ if (typeof resource !== "string") throw new Error(`resources.${kind} must be a relative directory`);
164
+ resources[kind] = resource;
165
+ }
166
+ }
167
+ for (const [resourceKind, relative] of Object.entries(resources)) {
168
+ const full = pluginResourcePath(root, relative, kind === "skill" && relative === ".");
169
+ if (!statSync(full).isDirectory()) throw new Error(`resources.${resourceKind} must be a directory`);
170
+ if (
171
+ resourceKind === "skills" &&
172
+ relative !== "." &&
173
+ path.resolve(root, relative) !== path.join(path.resolve(root), "skills")
174
+ )
175
+ throw new Error("portable skills must use the root skills directory");
176
+ }
177
+ const inventory = components(raw.components, root);
178
+ const componentRoots: Partial<Record<PluginComponentKind, PluginResourceKind>> = {
179
+ prompt: "prompts",
180
+ agent: "agents",
181
+ skill: "skills",
182
+ fleet: "fleets",
183
+ };
184
+ for (const item of inventory) {
185
+ const resourceKind = componentRoots[item.kind];
186
+ if (!resourceKind) continue;
187
+ const resource = resources[resourceKind];
188
+ if (
189
+ !resource ||
190
+ !pluginPathContained(
191
+ pluginResourcePath(root, resource, kind === "skill" && resource === "."),
192
+ pluginResourcePath(root, item.path),
193
+ )
194
+ )
195
+ throw new Error(`component ${item.kind}:${item.id} is outside its declared resource root`);
196
+ }
197
+ if (kind !== "plugin") {
198
+ const publicItems = inventory.filter((item) => ["prompt", "agent", "skill", "fleet"].includes(item.kind));
199
+ if (publicItems.length !== 1 || publicItems[0]?.kind !== kind)
200
+ throw new Error(`a ${kind} package must declare exactly one public ${kind} component`);
201
+ if (Object.keys(resources).some((resource) => resource !== `${kind}s`))
202
+ throw new Error(`a ${kind} package may only declare its ${kind}s resource root`);
203
+ const resource = resources[`${kind}s` as PluginResourceKind];
204
+ if (!resource) throw new Error(`a ${kind} package must declare its resource root`);
205
+ const discovered: string[] = [];
206
+ const scan = (directory: string, ancestors: Set<string>): void => {
207
+ const canonical = realpathSync(directory);
208
+ if (ancestors.has(canonical)) throw new Error("cyclic package resource directory");
209
+ const visited = new Set([...ancestors, canonical]);
210
+ for (const item of readdirSync(directory)) {
211
+ const file = path.join(directory, item);
212
+ if (statSync(file).isDirectory()) scan(file, visited);
213
+ else if (kind === "skill" ? item === "SKILL.md" : item.endsWith(".md")) discovered.push(file);
214
+ }
215
+ };
216
+ scan(pluginResourcePath(root, resource, kind === "skill" && resource === "."), new Set());
217
+ const declared = publicItems[0];
218
+ if (
219
+ discovered.length !== 1 ||
220
+ !declared ||
221
+ path.resolve(discovered[0] as string) !== pluginResourcePath(root, declared.path)
222
+ )
223
+ throw new Error(`a ${kind} package must expose only its declared ${kind} file`);
224
+ }
225
+ return {
226
+ manifestVersion: 1,
227
+ kind,
228
+ resources,
229
+ components: inventory,
230
+ ...(raw.requires ? { requires: raw.requires as LibraryRequirementRef[] } : {}),
231
+ ...(raw.evals ? { evals } : {}),
232
+ ...(compatibility ? { compatibility } : {}),
233
+ };
234
+ }
235
+
236
+ export function parsePluginManifest(raw: string, root: string): PluginManifest {
237
+ const value: unknown = JSON.parse(raw);
238
+ if (!record(value)) throw new Error("plugin manifest must be an object");
239
+ requireKeys(value, ROOT_KEYS, "plugin manifest");
240
+ if (value.$schema !== PLUGIN_SCHEMA) throw new Error(`plugin $schema must be ${PLUGIN_SCHEMA}`);
241
+ if (typeof value.name !== "string" || !isPluginId(value.name))
242
+ throw new Error("plugin name must be a portable identifier of 1 to 64 characters and may not be state.json");
243
+ for (const field of ["version", "description", "homepage", "repository", "license"]) {
244
+ if (value[field] !== undefined && typeof value[field] !== "string") throw new Error(`${field} must be a string`);
245
+ }
246
+ if (!isSemanticVersion(value.version))
247
+ throw new Error("package version must be an explicit Semantic Version (for example 1.0.0)");
248
+ if (value.author !== undefined) {
249
+ if (!record(value.author)) throw new Error("author must be an object");
250
+ requireKeys(value.author, new Set(["name", "email", "url"]), "author");
251
+ if (Object.values(value.author).some((field) => typeof field !== "string"))
252
+ throw new Error("author fields must be strings");
253
+ }
254
+ if (
255
+ value.keywords !== undefined &&
256
+ (!Array.isArray(value.keywords) || value.keywords.some((field) => typeof field !== "string"))
257
+ )
258
+ throw new Error("keywords must be an array of strings");
259
+ if (
260
+ value.extensions !== undefined &&
261
+ (!record(value.extensions) || Object.values(value.extensions).some((field) => !record(field)))
262
+ )
263
+ throw new Error("extensions must contain namespaced objects");
264
+ const extensions = value.extensions as Record<string, Record<string, unknown>> | undefined;
265
+ const clio = clioConfiguration(extensions?.[PLUGIN_EXTENSION_KEY], root);
266
+ return { ...(value as unknown as Omit<PluginManifest, "clio">), clio };
267
+ }
268
+
269
+ /** Hash once, then parse the exact manifest bytes covered by that digest. */
270
+ export function readPluginManifest(root: string): PluginCandidate {
271
+ const resolved = path.resolve(root);
272
+ const manifestPath = path.join(resolved, "plugin.json");
273
+ const diagnostics: PluginDiagnostic[] = [];
274
+ try {
275
+ if (existsSync(path.join(resolved, "state.json")))
276
+ throw new Error("root state.json is reserved for plugin installation state");
277
+ const digest = pluginContentDigestWithCapture(resolved, { capture: ["plugin.json"] });
278
+ const bytes = digest.captured.get("plugin.json");
279
+ if (!bytes) throw new Error("plugin.json must be a regular file at the plugin root");
280
+ const manifest = parsePluginManifest(bytes.toString("utf8"), resolved);
281
+ if (existsSync(path.join(resolved, "mcp.json")))
282
+ diagnostics.push({
283
+ type: "warning",
284
+ message: "MCP declarations are preserved; this Clio version does not execute MCP servers",
285
+ path: path.join(resolved, "mcp.json"),
286
+ });
287
+ return {
288
+ path: resolved,
289
+ manifestPath,
290
+ manifest,
291
+ valid: true,
292
+ diagnostics,
293
+ contentDigest: digest.digest,
294
+ manifestDigest: createHash("sha256").update(bytes).digest("hex"),
295
+ };
296
+ } catch (error) {
297
+ diagnostics.push({
298
+ type: "error",
299
+ message: error instanceof Error ? error.message : String(error),
300
+ path: manifestPath,
301
+ });
302
+ return { path: resolved, manifestPath, valid: false, diagnostics };
303
+ }
304
+ }
305
+
306
+ export function discoverPluginPackages(root: string): PluginCandidate[] {
307
+ if (existsSync(path.join(root, "plugin.json"))) return [readPluginManifest(root)];
308
+ try {
309
+ return readdirSync(root)
310
+ .sort()
311
+ .filter((name) => !name.startsWith(".") && lstatSync(path.join(root, name)).isDirectory())
312
+ .map((name) => readPluginManifest(path.join(root, name)));
313
+ } catch {
314
+ return [readPluginManifest(root)];
315
+ }
316
+ }
@@ -0,0 +1,40 @@
1
+ import type { DomainBundle, DomainContext } from "../../core/domain-loader.js";
2
+ import type { PluginsContract } from "./contract.js";
3
+ import { discoverPluginPackages } from "./discovery.js";
4
+ import {
5
+ clearPluginSnapshots,
6
+ enabledPluginResourceRoots,
7
+ pluginSnapshotFor,
8
+ reloadPluginResources,
9
+ } from "./resources.js";
10
+ import {
11
+ disablePlugin,
12
+ enablePlugin,
13
+ installPlugin,
14
+ listInstalledPlugins,
15
+ removePlugin,
16
+ updatePlugin,
17
+ } from "./state.js";
18
+
19
+ export function createPluginsBundle(_context: DomainContext): DomainBundle<PluginsContract> {
20
+ return {
21
+ extension: {
22
+ start() {},
23
+ stop() {
24
+ clearPluginSnapshots();
25
+ },
26
+ },
27
+ contract: {
28
+ list: listInstalledPlugins,
29
+ discover: discoverPluginPackages,
30
+ install: installPlugin,
31
+ update: updatePlugin,
32
+ enable: enablePlugin,
33
+ disable: disablePlugin,
34
+ remove: removePlugin,
35
+ resourceRoots: enabledPluginResourceRoots,
36
+ snapshot: pluginSnapshotFor,
37
+ reload: reloadPluginResources,
38
+ },
39
+ };
40
+ }
@@ -0,0 +1,77 @@
1
+ import type { DomainModule } from "../../core/domain-loader.js";
2
+ import type { PluginsContract } from "./contract.js";
3
+ import { createPluginsBundle } from "./extension.js";
4
+ import { PluginsManifest } from "./manifest.js";
5
+
6
+ export const PluginsDomainModule: DomainModule<PluginsContract> = {
7
+ manifest: PluginsManifest,
8
+ createExtension: createPluginsBundle,
9
+ };
10
+ export type { PluginsContract } from "./contract.js";
11
+ export {
12
+ discoverPluginPackages,
13
+ isPluginId,
14
+ PLUGIN_EXTENSION_KEY,
15
+ PLUGIN_RESOURCE_KINDS,
16
+ PLUGIN_SCHEMA,
17
+ parsePluginManifest,
18
+ pluginPathContained,
19
+ pluginResourcePath,
20
+ readPluginManifest,
21
+ } from "./discovery.js";
22
+ export { pluginContentDigest, pluginContentDigestWithCapture } from "./integrity.js";
23
+ export {
24
+ buildPluginSnapshot,
25
+ clearPluginSnapshots,
26
+ enabledPluginResourceRoots,
27
+ pluginSnapshotFor,
28
+ reloadPluginResources,
29
+ } from "./resources.js";
30
+ export {
31
+ disablePlugin,
32
+ enablePlugin,
33
+ installLibraryPackage,
34
+ installPlugin,
35
+ listInstalledPlugins,
36
+ newlyBrokenDependents,
37
+ observePluginCopy,
38
+ type PluginDependentBreak,
39
+ PluginWriterRefusal,
40
+ pluginBaseDir,
41
+ pluginStatePath,
42
+ readPluginInstallRecord,
43
+ removePlugin,
44
+ resolvePluginPrecedence,
45
+ updatePlugin,
46
+ withPluginScopeLock,
47
+ } from "./state.js";
48
+ export type {
49
+ ClioPluginConfiguration,
50
+ ForeignPackageFormat,
51
+ InstalledPlugin,
52
+ LibraryPackageInstallInput,
53
+ PackageTrust,
54
+ PluginCandidate,
55
+ PluginComponent,
56
+ PluginComponentKind,
57
+ PluginDiagnostic,
58
+ PluginDiagnosticCode,
59
+ PluginExpectedCopy,
60
+ PluginExpectedState,
61
+ PluginInstallOptions,
62
+ PluginInstallRecord,
63
+ PluginInstallResult,
64
+ PluginListOptions,
65
+ PluginManifest,
66
+ PluginMutationOptions,
67
+ PluginMutationResult,
68
+ PluginOrigin,
69
+ PluginProvenance,
70
+ PluginResourceKind,
71
+ PluginResourceRoot,
72
+ PluginResources,
73
+ PluginScope,
74
+ PluginSnapshot,
75
+ PluginState,
76
+ } from "./types.js";
77
+ export { isForeignPluginOrigin } from "./types.js";
@@ -0,0 +1,6 @@
1
+ // Both package engines use the same exact-tree framing, so a digest computed
2
+ // for one is directly comparable to a digest computed for the other.
3
+ export {
4
+ extensionContentDigest as pluginContentDigest,
5
+ extensionContentDigestWithCapture as pluginContentDigestWithCapture,
6
+ } from "../extensions/integrity.js";
@@ -0,0 +1,3 @@
1
+ import type { DomainManifest } from "../../core/domain-loader.js";
2
+
3
+ export const PluginsManifest: DomainManifest = { name: "plugins", dependsOn: ["config"] };