@iowarp/clio-coder 0.4.5 → 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 (700) hide show
  1. package/.claude-plugin/marketplace.json +283 -0
  2. package/CHANGELOG.md +74 -0
  3. package/CONTRIBUTING.md +116 -38
  4. package/NOTICE +24 -0
  5. package/README.md +341 -682
  6. package/dist/{acp-H3CU2HBQ.js → acp-W3Y3TRHD.js} +12 -12
  7. package/dist/{agents-IXQQZ7BD.js → agents-J4ICNLQ3.js} +57 -56
  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-R7KYF7N3.js → auth-X2UJUMOC.js} +25 -25
  13. package/dist/{builtins-CRFDQUVP.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-SE4ZKILO.js → chunk-3XE4NRLF.js} +30 -9
  20. package/dist/{chunk-YYB3MC65.js → chunk-4MFBBY2Z.js} +3 -3
  21. package/dist/{chunk-5VTJP36Q.js → chunk-4N2RZ4TO.js} +2 -2
  22. package/dist/{chunk-FKIOX6DS.js → chunk-4QKAITQT.js} +10 -5
  23. package/dist/chunk-4UHVS5T7.js +207 -0
  24. package/dist/{chunk-VLPTKCKT.js → chunk-5AJPUR72.js} +6 -6
  25. package/dist/{chunk-5CY4Q6QI.js → chunk-5EQO5NWP.js} +105 -3
  26. package/dist/{chunk-RXIOCVBZ.js → chunk-65BGHOUR.js} +8 -5
  27. package/dist/{chunk-T53XI6I7.js → chunk-6CA2BHOR.js} +2 -2
  28. package/dist/{chunk-HL26ADLH.js → chunk-6CB2IL4N.js} +2 -1
  29. package/dist/{chunk-HR3HPQ76.js → chunk-6LRLOJHQ.js} +3 -3
  30. package/dist/{chunk-HXHFDHB6.js → chunk-6TAATXXH.js} +6 -6
  31. package/dist/{chunk-WFKDPU7U.js → chunk-6YHPAAZR.js} +3 -3
  32. package/dist/{chunk-ZMZQEBKI.js → chunk-7EEGBKV4.js} +11 -11
  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-MDU3C27C.js → chunk-BO4XV5VX.js} +8 -8
  36. package/dist/{chunk-KF6GFW6O.js → chunk-BQQ5MXUC.js} +11 -11
  37. package/dist/{chunk-K6RDB7IA.js → chunk-C3G5PNUO.js} +23 -23
  38. package/dist/{chunk-SRZOW5L2.js → chunk-C6GEXX4L.js} +1 -1
  39. package/dist/{chunk-U2JOLB7O.js → chunk-CE64C5K5.js} +227 -72
  40. package/dist/chunk-CP3HIR5H.js +2119 -0
  41. package/dist/{chunk-BBV5TKE6.js → chunk-CPXGJI2A.js} +2 -2
  42. package/dist/{chunk-5DDOTTG4.js → chunk-CULVKYTK.js} +5 -5
  43. package/dist/{chunk-F34AR6O3.js → chunk-D2T66PDV.js} +6 -6
  44. package/dist/{chunk-NF3BK5WR.js → chunk-DACXIVVF.js} +5 -5
  45. package/dist/{chunk-4SVIVOMC.js → chunk-DLIYANB7.js} +20 -15
  46. package/dist/{chunk-E3BQTQUP.js → chunk-DO7M3LSX.js} +9 -9
  47. package/dist/{chunk-2QPI3TR3.js → chunk-DVJL77SO.js} +2 -2
  48. package/dist/chunk-EM2WNQS2.js +93 -0
  49. package/dist/{chunk-ODUTYZIU.js → chunk-EUEXGXXR.js} +5 -5
  50. package/dist/{chunk-UL36QJX6.js → chunk-EUZRMP4Y.js} +18 -16
  51. package/dist/{chunk-R6MAYTMS.js → chunk-G4LGUTOE.js} +4 -4
  52. package/dist/{chunk-CBSKDFWL.js → chunk-GEVQNST4.js} +2 -2
  53. package/dist/{chunk-XXBQKW32.js → chunk-GFQ7P2UF.js} +7 -7
  54. package/dist/{chunk-SBZX6ARC.js → chunk-GI5RRMAH.js} +14 -14
  55. package/dist/{chunk-KDWLXVMN.js → chunk-GVZFCJHE.js} +343 -113
  56. package/dist/{chunk-633EXGZA.js → chunk-GXIWHXDB.js} +3 -3
  57. package/dist/{chunk-LUL5Z66S.js → chunk-HOX4YZ2K.js} +6 -5
  58. package/dist/chunk-HRAKUPIH.js +57 -0
  59. package/dist/{chunk-KYKNBD4Y.js → chunk-IJMW64DX.js} +978 -258
  60. package/dist/{chunk-DIMRLNIC.js → chunk-IMOD2YPV.js} +16 -9
  61. package/dist/{chunk-6CDNRHWH.js → chunk-IQCNVLO6.js} +28 -8
  62. package/dist/{chunk-UTUNT5QL.js → chunk-ISNCCX42.js} +9 -9
  63. package/dist/{chunk-RLTT5GVY.js → chunk-IZYTT3CD.js} +9 -5
  64. package/dist/{chunk-5ZMXGW7P.js → chunk-KAFMW7WM.js} +4 -85
  65. package/dist/chunk-KKEYGFX4.js +915 -0
  66. package/dist/{chunk-HHVJNVUJ.js → chunk-KS7ETA3P.js} +2 -2
  67. package/dist/{chunk-UXAC2FX4.js → chunk-L3Z5ANCV.js} +7 -7
  68. package/dist/{chunk-EHCPSZJF.js → chunk-LBFQMYS3.js} +2 -2
  69. package/dist/{chunk-QEQISF75.js → chunk-LK2FN5JY.js} +1 -1
  70. package/dist/{chunk-URBGEOH3.js → chunk-M6Z2V6YU.js} +5 -5
  71. package/dist/{chunk-DRD2A54W.js → chunk-MBJO5VNZ.js} +18 -18
  72. package/dist/chunk-MNQN3X6Y.js +595 -0
  73. package/dist/{chunk-GXCCHKN6.js → chunk-MZHXENL7.js} +7 -7
  74. package/dist/chunk-MZNWZUJM.js +1801 -0
  75. package/dist/{chunk-7YJWEF2L.js → chunk-N37QC5FV.js} +5 -5
  76. package/dist/{chunk-WLMSOT73.js → chunk-NCCQ6DVS.js} +7 -7
  77. package/dist/{chunk-TZ7MFRG4.js → chunk-NO7J45X6.js} +170 -53
  78. package/dist/chunk-OH3YYA3B.js +15 -0
  79. package/dist/{chunk-22PQ4TX4.js → chunk-P4DL2LM5.js} +16 -77
  80. package/dist/{chunk-R6MICQYU.js → chunk-PFLOULP3.js} +4 -4
  81. package/dist/{chunk-MC3JSVR6.js → chunk-QJMRYTCX.js} +7 -7
  82. package/dist/{chunk-ILJ7DWGE.js → chunk-QKWL7SYE.js} +12 -12
  83. package/dist/chunk-R2CT5YDO.js +66 -0
  84. package/dist/chunk-RFCKPS2V.js +26 -0
  85. package/dist/{chunk-ONRTXOZY.js → chunk-RTLNFZMD.js} +12 -4
  86. package/dist/{chunk-U7H5WRG5.js → chunk-RXFPB32E.js} +8 -6
  87. package/dist/{chunk-S32UQ5GL.js → chunk-SEDI5K5B.js} +18 -18
  88. package/dist/{chunk-ICO4TQ2F.js → chunk-SELG4SUR.js} +41 -25
  89. package/dist/{chunk-YEJIG7LN.js → chunk-SER7RRAE.js} +27 -832
  90. package/dist/{chunk-K2HL3GBL.js → chunk-T4TY5GG3.js} +165 -15
  91. package/dist/chunk-T7QQBNLH.js +691 -0
  92. package/dist/{chunk-HGSLRG33.js → chunk-TLTGZTXI.js} +3 -3
  93. package/dist/chunk-TZ6UVP2H.js +637 -0
  94. package/dist/{chunk-EWD5P3GK.js → chunk-TZHN5ITX.js} +13 -41
  95. package/dist/{chunk-7TKWWPD7.js → chunk-U3TPUXOQ.js} +398 -253
  96. package/dist/{chunk-GNQRWTMY.js → chunk-UA3W4FGC.js} +6 -6
  97. package/dist/{chunk-O2RQ7LCK.js → chunk-UA6W4XFJ.js} +2 -2
  98. package/dist/chunk-UWD3JD5X.js +709 -0
  99. package/dist/chunk-V4ZKOKRB.js +13433 -0
  100. package/dist/{chunk-NC4KV7EL.js → chunk-VCRVEDUC.js} +5 -5
  101. package/dist/{chunk-I7VLWRK2.js → chunk-VMATUZB6.js} +12 -10
  102. package/dist/{chunk-J2FYEQ5L.js → chunk-VTYHHQ57.js} +2 -2
  103. package/dist/chunk-WB7POC6M.js +891 -0
  104. package/dist/{chunk-GVYWZNRK.js → chunk-WBVKKTUT.js} +2 -2
  105. package/dist/{chunk-EHOSNVVM.js → chunk-WLHX3MM5.js} +6 -2
  106. package/dist/{chunk-SDWNDICN.js → chunk-WN552PKN.js} +573 -316
  107. package/dist/{chunk-TEG3RYVZ.js → chunk-WT5TRMO4.js} +51 -26
  108. package/dist/{chunk-NY6IWDVU.js → chunk-WURGVOZJ.js} +56 -12
  109. package/dist/{chunk-7WUZEB2M.js → chunk-XR3XJN2M.js} +2 -2
  110. package/dist/chunk-XW2UZICE.js +372 -0
  111. package/dist/{chunk-FSTIBAGM.js → chunk-XZ6UFQ52.js} +11 -11
  112. package/dist/chunk-Y3JU5RPK.js +8 -0
  113. package/dist/chunk-YKRJTYNP.js +1143 -0
  114. package/dist/{chunk-7HBHHVCK.js → chunk-YPRSNUTC.js} +2 -2
  115. package/dist/{chunk-PWWSIB2A.js → chunk-ZGIGW4ZG.js} +5 -5
  116. package/dist/cli/index.js +34 -36
  117. package/dist/{clio-5I2IBFYL.js → clio-L2P7S2R2.js} +9 -9
  118. package/dist/{code-nav-YXIAEZVS.js → code-nav-B5LNX4KU.js} +25 -25
  119. package/dist/{components-TNIKXCBH.js → components-63MMQKUT.js} +6 -6
  120. package/dist/{config-Y2JDJ3JJ.js → config-YXARKGTX.js} +81 -77
  121. package/dist/configure-LMVQJ46J.js +85 -0
  122. package/dist/{context-QQ53HSGJ.js → context-7HJEWTTP.js} +92 -48
  123. package/dist/{context-S2EEC3EJ.js → context-XSZKKFBW.js} +14 -14
  124. package/dist/{context-P5YSEO55.js → context-YG2LZDYZ.js} +67 -64
  125. package/dist/{context-clear-TMEQCOTH.js → context-clear-AC5NXHM2.js} +64 -61
  126. package/dist/{context-index-HP2JFUWA.js → context-index-KKTPRV5G.js} +3 -3
  127. package/dist/{context-map-INTXD54D.js → context-map-T7ROR5D5.js} +4 -4
  128. package/dist/{context-working-set-CNLSQN5K.js → context-working-set-F4Q4J3NS.js} +15 -12
  129. package/dist/{detail-5572VLBO.js → detail-H73BEF2N.js} +65 -62
  130. package/dist/{dispatch-runner-FRHD6P2O.js → dispatch-runner-3RY5FSJC.js} +83 -80
  131. package/dist/{doctor-N3LCM2LG.js → doctor-EQYJOGUG.js} +47 -32
  132. package/dist/{eval-BUU3ZOUZ.js → eval-4P7O6CCE.js} +114 -50
  133. package/dist/{evidence-DTGEN456.js → evidence-D6GUSYJW.js} +64 -61
  134. package/dist/{evidence-SQ5DNFEN.js → evidence-O76QF7TZ.js} +69 -65
  135. package/dist/{evolve-IJNUFZDS.js → evolve-H47BCETS.js} +65 -62
  136. package/dist/{extensions-YVRHX6ZI.js → extensions-NNL3ZOCU.js} +98 -20
  137. package/dist/{fleet-ZNNVSYFO.js → fleet-KMNS6NOM.js} +115 -107
  138. package/dist/{fleet-commands-5YE7NPJL.js → fleet-commands-DOWSYCBX.js} +15 -15
  139. package/dist/{fleet-decisions-3SBSCTCW.js → fleet-decisions-S3PTZV2D.js} +9 -9
  140. package/dist/{fleet-graph-6HHPWF5T.js → fleet-graph-F2DE2TME.js} +26 -24
  141. package/dist/{fleet-inspect-JEYMGCGC.js → fleet-inspect-EN2Q6IVB.js} +67 -63
  142. package/dist/{fleet-preflight-QRSHIIDE.js → fleet-preflight-FRLETDD3.js} +3 -3
  143. package/dist/{fleet-validate-4PM4GDDL.js → fleet-validate-B2XDLS57.js} +28 -29
  144. package/dist/{fleet-verify-NJDTHTO3.js → fleet-verify-4JKUWGJ7.js} +64 -61
  145. package/dist/{fleet-view-UP2BWQQY.js → fleet-view-BHJFW26B.js} +67 -63
  146. package/dist/{init-S3GZQ5ZF.js → init-XAT5N5YM.js} +86 -80
  147. package/dist/interop-FVECHFKG.js +246 -0
  148. package/dist/{inventory-K2OZ36YJ.js → inventory-7KFQGLCV.js} +67 -63
  149. package/dist/library-NY2XOT75.js +492 -0
  150. package/dist/library-QAPAO23R.js +306 -0
  151. package/dist/library-import-5Y6MAS3R.js +183 -0
  152. package/dist/library-inventory-JT6HWITQ.js +56 -0
  153. package/dist/library-validation-EQUH25DC.js +42 -0
  154. package/dist/{memory-OQOXQGYD.js → memory-DYVTTCP6.js} +65 -62
  155. package/dist/{models-3IK2Y5WE.js → models-MASFJ6Y2.js} +51 -38
  156. package/dist/{monitor-FTJLTKCQ.js → monitor-YMP4NXJJ.js} +73 -69
  157. package/dist/{orchestrator-N47O7SFD.js → orchestrator-AFQRRTEI.js} +4255 -2845
  158. package/dist/{panes-7BTYH3XQ.js → panes-D3Y2KFG5.js} +4 -4
  159. package/dist/{panes-WPOMEMRH.js → panes-NICTHQCV.js} +7 -7
  160. package/dist/{paths-J3KN7UAO.js → paths-PSFAUIGO.js} +5 -5
  161. package/dist/{preload-65U34NG6.js → preload-5Q7VXRFJ.js} +64 -61
  162. package/dist/{reset-MUVQDLNL.js → reset-7NKZK7JN.js} +11 -9
  163. package/dist/{resources-LM76COAO.js → resources-NILSIZAT.js} +94 -38
  164. package/dist/{run-3VFZQ33N.js → run-BPZGEBZV.js} +131 -114
  165. package/dist/{share-4JUB4BL7.js → share-EZ6ERBMH.js} +31 -28
  166. package/dist/skills-BTVVNYVM.js +100 -0
  167. package/dist/{skills-eval-G6T57L7M.js → skills-eval-UY34MNK7.js} +117 -78
  168. package/dist/{skills-inventory-WLM46PJH.js → skills-inventory-JDHSIA7I.js} +30 -25
  169. package/dist/{slash-commands-GBARG3Y7.js → slash-commands-K4FNQ2AT.js} +53 -49
  170. package/dist/{steer-S7D7IKPU.js → steer-2B3EQGFH.js} +4 -4
  171. package/dist/{support-5VAEC32W.js → support-L2SOL3IE.js} +7 -7
  172. package/dist/{targets-N5REUETU.js → targets-44VKGFLN.js} +69 -47
  173. package/dist/{tasks-6BVY5YZF.js → tasks-3KODKFU7.js} +14 -14
  174. package/dist/{terminal-lease-57UEOJKS.js → terminal-lease-LXA7MMPO.js} +32 -19
  175. package/dist/{tools-6OCQ6SVB.js → tools-3UB7TEVR.js} +7 -7
  176. package/dist/{trace-JHLXWUMN.js → trace-TAMIU4OJ.js} +5 -4
  177. package/dist/{tui-primitives-RCY2HN7G.js → tui-primitives-A6MUW32V.js} +3 -2
  178. package/dist/{uninstall-FXYMFFRT.js → uninstall-QYVRPEM4.js} +9 -9
  179. package/dist/{upgrade-4HD5HAIV.js → upgrade-7PMKM2JH.js} +17 -18
  180. package/dist/{usage-4GWM2WWP.js → usage-6EQV7EQK.js} +77 -73
  181. package/dist/{verifiers-GSKWKWVG.js → verifiers-JLITWSHU.js} +16 -16
  182. package/dist/{verify-3AS3ULCY.js → verify-T7NAEVIG.js} +13 -13
  183. package/dist/{web-fetch-MQN4FH3X.js → web-fetch-W4TNW4Q7.js} +4 -4
  184. package/dist/{wiki-generate-7BV7XWIY.js → wiki-generate-T2TJQJUA.js} +90 -84
  185. package/dist/{with-panes-OFTNAR4Y.js → with-panes-CHFC7HGI.js} +4 -4
  186. package/dist/worker/entry.js +297 -88
  187. package/docs/README.md +43 -0
  188. package/docs/architecture/architecture.md +8 -7
  189. package/docs/architecture/artifact-versions.md +3 -3
  190. package/docs/architecture/context-engine.md +36 -2
  191. package/docs/architecture/library.md +32 -0
  192. package/docs/architecture/middleware-and-components.md +1 -1
  193. package/docs/architecture/model-catalog.md +21 -1
  194. package/docs/architecture/pi-boundary.md +18 -0
  195. package/docs/architecture/prompt-envelope-and-tools.md +5 -5
  196. package/docs/architecture/safety-model.md +21 -2
  197. package/docs/architecture/session-lifecycle.md +12 -1
  198. package/docs/architecture/tui-design.md +153 -39
  199. package/docs/architecture/worker-context.md +106 -0
  200. package/docs/guide/authoring-plugins.md +160 -0
  201. package/docs/guide/built-in-agents.md +5 -5
  202. package/docs/guide/commands-and-modes.md +186 -80
  203. package/docs/guide/configuration-and-targets.md +123 -28
  204. package/docs/guide/configuration-reference.md +36 -38
  205. package/docs/guide/environment-variables.md +2 -2
  206. package/docs/guide/exit-codes-and-output.md +1 -1
  207. package/docs/guide/extensions-and-sharing.md +93 -53
  208. package/docs/guide/fleet-dispatch.md +32 -10
  209. package/docs/guide/glossary.md +2 -2
  210. package/docs/guide/harness-extensions.md +291 -0
  211. package/docs/guide/installation-and-lifecycle.md +53 -20
  212. package/docs/guide/interop.md +243 -0
  213. package/docs/guide/panes-and-files.md +3 -3
  214. package/docs/guide/plugins.md +80 -0
  215. package/docs/guide/resource-library.md +111 -45
  216. package/docs/guide/skills-marketplace.md +35 -72
  217. package/docs/guide/tool-usage.md +19 -7
  218. package/docs/guide/troubleshooting.md +1 -1
  219. package/docs/process/development-pipeline.md +15 -15
  220. package/docs/process/documentation-coverage.md +29 -2
  221. package/docs/process/documentation-guide.md +15 -7
  222. package/docs/process/eval-runner.md +8 -3
  223. package/docs/process/performance-methodology.md +1 -1
  224. package/docs/process/release-cut-checklist.md +22 -6
  225. package/docs/process/scientific-validation.md +23 -0
  226. package/evals/scalar-decision-machinery.ts +1 -1
  227. package/examples/extensions/README.md +67 -0
  228. package/examples/extensions/lab-status/clio-coder-extension.json +14 -0
  229. package/examples/extensions/lab-status/extension.mjs +68 -0
  230. package/examples/extensions/lab-status/jobs.synthetic.json +9 -0
  231. package/examples/extensions/measurements/clio-coder-extension.json +28 -0
  232. package/examples/extensions/measurements/summarize.cjs +23 -0
  233. package/library/README.md +109 -0
  234. package/library/_authoring/templates/agent/README.md +28 -0
  235. package/library/_authoring/templates/agent/agents/benchmark-scout.md +30 -0
  236. package/library/_authoring/templates/agent/plugin.json +23 -0
  237. package/library/_authoring/templates/fleet/README.md +29 -0
  238. package/library/_authoring/templates/fleet/fleets/pipeline-review.md +31 -0
  239. package/library/_authoring/templates/fleet/plugin.json +23 -0
  240. package/library/_authoring/templates/plugin/README.md +37 -0
  241. package/library/_authoring/templates/plugin/agents/data-curator.md +31 -0
  242. package/library/_authoring/templates/plugin/assets/curation-guide.md +22 -0
  243. package/library/_authoring/templates/plugin/plugin.json +42 -0
  244. package/library/_authoring/templates/plugin/prompts/inspect-dataset.md +15 -0
  245. package/library/_authoring/templates/plugin/skills/dataset-curation/SKILL.md +36 -0
  246. package/library/_authoring/templates/plugin/skills/dataset-curation/evals.md +17 -0
  247. package/library/_authoring/templates/prompt/README.md +28 -0
  248. package/library/_authoring/templates/prompt/plugin.json +23 -0
  249. package/library/_authoring/templates/prompt/prompts/paper-summary.md +26 -0
  250. package/library/_authoring/templates/skill/README.md +24 -0
  251. package/library/_authoring/templates/skill/SKILL.md +39 -0
  252. package/library/_authoring/templates/skill/evals.md +30 -0
  253. package/library/_authoring/templates/skill/plugin.json +23 -0
  254. package/library/agents/README.md +7 -0
  255. package/library/fleets/README.md +7 -0
  256. package/library/plugins/materio/README.md +137 -0
  257. package/library/plugins/materio/ai.iowarp.clio/agents/materio-lab-definer.md +208 -0
  258. package/library/plugins/materio/ai.iowarp.clio/agents/materio-literature-reviewer.md +308 -0
  259. package/library/plugins/materio/ai.iowarp.clio/agents/materio-research-explorer.md +249 -0
  260. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-executor.md +416 -0
  261. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-verifier.md +60 -0
  262. package/library/plugins/materio/ai.iowarp.clio/agents/materio-workflow-planner.md +238 -0
  263. package/library/plugins/materio/ai.iowarp.clio/fleets/materio-execute-task.md +50 -0
  264. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/add-task.md +66 -0
  265. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/archive-task.md +65 -0
  266. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/checkpoint.md +26 -0
  267. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-research-tasks.md +230 -0
  268. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-virtual-lab.md +181 -0
  269. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/execute-task.md +292 -0
  270. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/help.md +129 -0
  271. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/identify-research.md +206 -0
  272. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/literature-review.md +201 -0
  273. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/pause-research.md +12 -0
  274. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/progress.md +105 -0
  275. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/remove-task.md +63 -0
  276. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/resume-research.md +64 -0
  277. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/settings.md +16 -0
  278. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/status.md +92 -0
  279. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/upload-data.md +104 -0
  280. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/wtfp.md +145 -0
  281. package/library/plugins/materio/ai.iowarp.clio/references/execution.md +56 -0
  282. package/library/plugins/materio/ai.iowarp.portability/provenance.json +9 -0
  283. package/library/plugins/materio/assets/actions/add-task.md +86 -0
  284. package/library/plugins/materio/assets/actions/archive-task.md +84 -0
  285. package/library/plugins/materio/assets/actions/checkpoint.md +47 -0
  286. package/library/plugins/materio/assets/actions/define-research-tasks.md +228 -0
  287. package/library/plugins/materio/assets/actions/define-virtual-lab.md +179 -0
  288. package/library/plugins/materio/assets/actions/execute-task.md +290 -0
  289. package/library/plugins/materio/assets/actions/help.md +140 -0
  290. package/library/plugins/materio/assets/actions/identify-research.md +204 -0
  291. package/library/plugins/materio/assets/actions/literature-review.md +199 -0
  292. package/library/plugins/materio/assets/actions/pause-research.md +34 -0
  293. package/library/plugins/materio/assets/actions/progress.md +125 -0
  294. package/library/plugins/materio/assets/actions/remove-task.md +82 -0
  295. package/library/plugins/materio/assets/actions/resume-research.md +84 -0
  296. package/library/plugins/materio/assets/actions/settings.md +38 -0
  297. package/library/plugins/materio/assets/actions/status.md +112 -0
  298. package/library/plugins/materio/assets/actions/upload-data.md +123 -0
  299. package/library/plugins/materio/assets/actions/wtfp.md +179 -0
  300. package/library/plugins/materio/assets/references/research-domains.md +134 -0
  301. package/library/plugins/materio/assets/references/research-policy.md +77 -0
  302. package/library/plugins/materio/assets/references/traditional-workflows.md +146 -0
  303. package/library/plugins/materio/assets/scripts/check_physics.py +271 -0
  304. package/library/plugins/materio/assets/scripts/check_scripts.py +248 -0
  305. package/library/plugins/materio/assets/scripts/project_plugin.py +165 -0
  306. package/library/plugins/materio/assets/scripts/research_state.py +400 -0
  307. package/library/plugins/materio/assets/scripts/verify_citations.py +616 -0
  308. package/library/plugins/materio/assets/templates/RESEARCH.md +39 -0
  309. package/library/plugins/materio/assets/templates/VIRTUAL-LAB.md +120 -0
  310. package/library/plugins/materio/assets/templates/WORKFLOW.md +42 -0
  311. package/library/plugins/materio/assets/templates/config.json +5 -0
  312. package/library/plugins/materio/evals/scripts.yaml +29 -0
  313. package/library/plugins/materio/plugin.json +530 -0
  314. package/library/plugins/materio/skills/materio-lab-definer/SKILL.md +74 -0
  315. package/library/plugins/materio/skills/materio-literature-reviewer/SKILL.md +64 -0
  316. package/library/plugins/materio/skills/materio-research-explorer/SKILL.md +74 -0
  317. package/library/plugins/materio/skills/materio-task-executor/SKILL.md +214 -0
  318. package/library/plugins/materio/skills/materio-task-verifier/SKILL.md +46 -0
  319. package/library/plugins/materio/skills/materio-workflow-planner/SKILL.md +79 -0
  320. package/library/plugins/materio/tests/test_check_physics.py +139 -0
  321. package/library/plugins/materio/tests/test_check_scripts.py +140 -0
  322. package/library/plugins/materio/tests/test_research_state.py +291 -0
  323. package/library/plugins/materio/tests/test_verify_citations.py +337 -0
  324. package/library/prompts/README.md +7 -0
  325. package/library/registry.yaml +921 -0
  326. package/library/skills/README.md +120 -0
  327. package/{skills → library/skills}/coding/ast-grep/SKILL.md +1 -1
  328. package/{skills → library/skills}/coding/ast-grep/evals.md +1 -1
  329. package/library/skills/coding/ast-grep/plugin.json +23 -0
  330. package/{skills → library/skills}/coding/coding-standards/SKILL.md +1 -1
  331. package/{skills → library/skills}/coding/coding-standards/evals.md +1 -1
  332. package/library/skills/coding/coding-standards/plugin.json +23 -0
  333. package/{skills → library/skills}/coding/prototype/SKILL.md +1 -1
  334. package/{skills → library/skills}/coding/prototype/evals.md +1 -1
  335. package/library/skills/coding/prototype/plugin.json +23 -0
  336. package/{skills → library/skills}/coding/tdd/SKILL.md +1 -1
  337. package/{skills → library/skills}/coding/tdd/evals.md +1 -1
  338. package/library/skills/coding/tdd/plugin.json +23 -0
  339. package/{skills → library/skills}/context/context-handoff/SKILL.md +1 -1
  340. package/{skills → library/skills}/context/context-handoff/evals.md +1 -1
  341. package/library/skills/context/context-handoff/plugin.json +23 -0
  342. package/{skills → library/skills}/context/context-prime/SKILL.md +1 -1
  343. package/{skills → library/skills}/context/context-prime/evals.md +1 -1
  344. package/library/skills/context/context-prime/plugin.json +23 -0
  345. package/{skills → library/skills}/git/branch-closeout/SKILL.md +1 -1
  346. package/library/skills/git/branch-closeout/plugin.json +23 -0
  347. package/{skills → library/skills}/git/file-ticket/SKILL.md +1 -1
  348. package/library/skills/git/file-ticket/plugin.json +23 -0
  349. package/{skills → library/skills}/git/fix-issue/SKILL.md +1 -1
  350. package/library/skills/git/fix-issue/plugin.json +23 -0
  351. package/{skills → library/skills}/git/resolve-merge-conflicts/SKILL.md +1 -1
  352. package/{skills → library/skills}/git/resolve-merge-conflicts/evals.md +1 -1
  353. package/library/skills/git/resolve-merge-conflicts/plugin.json +23 -0
  354. package/{skills → library/skills}/git/ship/SKILL.md +1 -1
  355. package/library/skills/git/ship/plugin.json +23 -0
  356. package/{skills → library/skills}/git/worktree-create/SKILL.md +1 -1
  357. package/library/skills/git/worktree-create/plugin.json +23 -0
  358. package/{skills → library/skills}/git/worktree-merge/SKILL.md +1 -1
  359. package/library/skills/git/worktree-merge/plugin.json +23 -0
  360. package/{skills → library/skills}/meta/clio-coder-dev/SKILL.md +1 -1
  361. package/{skills → library/skills}/meta/clio-coder-dev/evals.md +1 -1
  362. package/library/skills/meta/clio-coder-dev/plugin.json +23 -0
  363. package/{skills → library/skills}/meta/clio-coder-test/SKILL.md +1 -1
  364. package/{skills → library/skills}/meta/clio-coder-test/evals.md +1 -1
  365. package/library/skills/meta/clio-coder-test/plugin.json +23 -0
  366. package/{skills → library/skills}/meta/credentials/SKILL.md +1 -1
  367. package/{skills → library/skills}/meta/credentials/evals.md +1 -1
  368. package/library/skills/meta/credentials/plugin.json +23 -0
  369. package/library/skills/meta/find-skills/SKILL.md +85 -0
  370. package/library/skills/meta/find-skills/evals.md +65 -0
  371. package/library/skills/meta/find-skills/plugin.json +23 -0
  372. package/{skills → library/skills}/meta/herdr/SKILL.md +1 -1
  373. package/{skills → library/skills}/meta/herdr/evals.md +1 -1
  374. package/library/skills/meta/herdr/plugin.json +23 -0
  375. package/{skills → library/skills}/meta/skill-craft/SKILL.md +23 -9
  376. package/{skills → library/skills}/meta/skill-craft/evals.md +11 -3
  377. package/library/skills/meta/skill-craft/plugin.json +23 -0
  378. package/{skills → library/skills}/planning/archify/SKILL.md +13 -13
  379. package/library/skills/planning/archify/plugin.json +23 -0
  380. package/{skills → library/skills}/planning/architecture/SKILL.md +1 -1
  381. package/{skills → library/skills}/planning/architecture/evals.md +1 -1
  382. package/library/skills/planning/architecture/plugin.json +23 -0
  383. package/{skills → library/skills}/planning/backlog/SKILL.md +1 -1
  384. package/{skills → library/skills}/planning/backlog/evals.md +1 -1
  385. package/library/skills/planning/backlog/plugin.json +23 -0
  386. package/{skills → library/skills}/planning/prd/SKILL.md +1 -1
  387. package/{skills → library/skills}/planning/prd/evals.md +1 -1
  388. package/library/skills/planning/prd/plugin.json +23 -0
  389. package/{skills → library/skills}/planning/product-intent/SKILL.md +1 -1
  390. package/{skills → library/skills}/planning/product-intent/evals.md +1 -1
  391. package/library/skills/planning/product-intent/plugin.json +23 -0
  392. package/{skills → library/skills}/planning/tech-spec/SKILL.md +1 -1
  393. package/{skills → library/skills}/planning/tech-spec/evals.md +1 -1
  394. package/library/skills/planning/tech-spec/plugin.json +23 -0
  395. package/{skills → library/skills}/registry.yaml +7 -7
  396. package/{skills → library/skills}/remote.yaml +1 -1
  397. package/{skills → library/skills}/research/arxiv-literature/SKILL.md +1 -1
  398. package/{skills → library/skills}/research/arxiv-literature/evals.md +1 -1
  399. package/library/skills/research/arxiv-literature/plugin.json +23 -0
  400. package/{skills → library/skills}/research/experiment-protocol/SKILL.md +1 -1
  401. package/{skills → library/skills}/research/experiment-protocol/evals.md +1 -1
  402. package/library/skills/research/experiment-protocol/plugin.json +23 -0
  403. package/{skills → library/skills}/research/scientific-debugging/SKILL.md +1 -1
  404. package/{skills → library/skills}/research/scientific-debugging/evals.md +1 -1
  405. package/library/skills/research/scientific-debugging/plugin.json +23 -0
  406. package/{skills → library/skills}/research/scientific-modernization/SKILL.md +1 -1
  407. package/{skills → library/skills}/research/scientific-modernization/evals.md +1 -1
  408. package/library/skills/research/scientific-modernization/plugin.json +23 -0
  409. package/{skills → library/skills}/skill-marketplace.json +37 -37
  410. package/{skills → library/skills}/workflow/cut-it/SKILL.md +1 -1
  411. package/{skills → library/skills}/workflow/cut-it/evals.md +1 -1
  412. package/library/skills/workflow/cut-it/plugin.json +23 -0
  413. package/{skills → library/skills}/workflow/design-council/SKILL.md +1 -1
  414. package/{skills → library/skills}/workflow/design-council/evals.md +1 -1
  415. package/library/skills/workflow/design-council/plugin.json +23 -0
  416. package/{skills → library/skills}/workflow/grill-me/SKILL.md +1 -1
  417. package/{skills → library/skills}/workflow/grill-me/evals.md +1 -1
  418. package/library/skills/workflow/grill-me/plugin.json +23 -0
  419. package/{skills → library/skills}/workflow/workflow-distiller/SKILL.md +14 -11
  420. package/{skills → library/skills}/workflow/workflow-distiller/evals.md +14 -6
  421. package/library/skills/workflow/workflow-distiller/plugin.json +23 -0
  422. package/package.json +12 -5
  423. package/src/cli/agents.ts +1 -1
  424. package/src/cli/ask.ts +10 -10
  425. package/src/cli/config-inspect.ts +1 -1
  426. package/src/cli/configure-editor.ts +51 -0
  427. package/src/cli/configure-interop.ts +1 -1
  428. package/src/cli/configure-oauth.ts +1 -1
  429. package/src/cli/configure-onboarding.ts +232 -96
  430. package/src/cli/configure-prompts.ts +76 -0
  431. package/src/cli/configure-quick.ts +274 -0
  432. package/src/cli/configure-target.ts +14 -2
  433. package/src/cli/configure.ts +415 -176
  434. package/src/cli/eval.ts +40 -6
  435. package/src/cli/extensions.ts +74 -8
  436. package/src/cli/fleet-preflight.ts +2 -0
  437. package/src/cli/fleet.ts +2 -0
  438. package/src/cli/index.ts +1 -3
  439. package/src/cli/interop-inspect.ts +61 -33
  440. package/src/cli/interop.ts +79 -9
  441. package/src/cli/library-import.ts +139 -0
  442. package/src/cli/library.ts +418 -120
  443. package/src/cli/oauth-manual-input.ts +1 -1
  444. package/src/cli/reset.ts +2 -0
  445. package/src/cli/run.ts +26 -9
  446. package/src/cli/select.ts +35 -4
  447. package/src/cli/skills-eval.ts +43 -6
  448. package/src/cli/skills-inventory.ts +6 -2
  449. package/src/cli/skills.ts +44 -491
  450. package/src/cli/upgrade.ts +2 -2
  451. package/src/core/bus-events.ts +5 -0
  452. package/src/core/config.ts +6 -1
  453. package/src/core/defaults.ts +34 -12
  454. package/src/{interactive → core}/external-editor.ts +4 -4
  455. package/src/core/recent-models.ts +2 -2
  456. package/src/core/session-routing.ts +3 -3
  457. package/src/core/state-file-lock.ts +1 -1
  458. package/src/core/tool-names.ts +5 -0
  459. package/src/domains/agents/extension.ts +42 -6
  460. package/src/domains/agents/fleet-commands.ts +92 -1
  461. package/src/domains/agents/fleet-contract.ts +87 -19
  462. package/src/domains/agents/recipe.ts +5 -4
  463. package/src/domains/agents/registry.ts +80 -24
  464. package/src/domains/config/classify.ts +1 -1
  465. package/src/domains/config/keybindings.ts +156 -124
  466. package/src/domains/context/worker/contract.ts +91 -0
  467. package/src/domains/context/worker/pressure.ts +120 -0
  468. package/src/domains/context/worker/recall.ts +62 -0
  469. package/src/domains/context/worker/select.ts +164 -0
  470. package/src/domains/context/worker/snapshot.ts +35 -0
  471. package/src/domains/context/worker/store.ts +16 -0
  472. package/src/domains/context/working-set/replay/synthetic.ts +2 -1
  473. package/src/domains/dispatch/active-route-planner.ts +2 -0
  474. package/src/domains/dispatch/backoff.ts +1 -0
  475. package/src/domains/dispatch/code-step.ts +12 -2
  476. package/src/domains/dispatch/contract.ts +3 -0
  477. package/src/domains/dispatch/execution-plan.ts +2 -0
  478. package/src/domains/dispatch/extension.ts +109 -27
  479. package/src/domains/dispatch/fleet-plan.ts +10 -0
  480. package/src/domains/dispatch/fleet-run.ts +1 -0
  481. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  482. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  483. package/src/domains/dispatch/state.ts +1 -0
  484. package/src/domains/dispatch/types.ts +5 -0
  485. package/src/domains/dispatch/validation.ts +12 -0
  486. package/src/domains/dispatch/workspace-checkpoint.ts +1 -1
  487. package/src/domains/evidence/failure-attribution.ts +1 -0
  488. package/src/domains/evidence/trust-status.ts +22 -3
  489. package/src/domains/extensions/command-schema.ts +145 -0
  490. package/src/domains/extensions/command-tools.ts +15 -0
  491. package/src/domains/extensions/compatibility.ts +7 -0
  492. package/src/domains/extensions/contract.ts +0 -4
  493. package/src/domains/extensions/discovery.ts +69 -205
  494. package/src/domains/extensions/extension.ts +0 -4
  495. package/src/domains/extensions/index.ts +1 -5
  496. package/src/domains/extensions/manager.ts +1 -6
  497. package/src/domains/extensions/operator-commands.ts +29 -0
  498. package/src/domains/extensions/operator-runtime.ts +483 -0
  499. package/src/domains/extensions/public-api.ts +53 -0
  500. package/src/domains/extensions/runtime-child.mjs +114 -0
  501. package/src/domains/extensions/runtime-process.ts +306 -0
  502. package/src/domains/extensions/runtime-schema.ts +146 -0
  503. package/src/domains/extensions/{resources.ts → snapshot-access.ts} +1 -17
  504. package/src/domains/extensions/snapshot.ts +4 -32
  505. package/src/domains/extensions/state.ts +5 -83
  506. package/src/domains/extensions/types.ts +33 -34
  507. package/src/domains/interop/adopt.ts +546 -0
  508. package/src/domains/interop/detect.ts +50 -12
  509. package/src/domains/interop/foreign.ts +554 -0
  510. package/src/domains/interop/import.ts +277 -0
  511. package/src/domains/interop/index.ts +24 -0
  512. package/src/domains/interop/install.ts +6 -0
  513. package/src/domains/interop/inventory.ts +351 -0
  514. package/src/domains/interop/projection.ts +360 -0
  515. package/src/domains/interop/registry.ts +106 -3
  516. package/src/domains/interop/types.ts +51 -0
  517. package/src/domains/lifecycle/migrations/index.ts +0 -2
  518. package/src/domains/lifecycle/naming-resources.ts +1 -1
  519. package/src/domains/middleware/marketplace-offer.ts +1 -1
  520. package/src/domains/mux/contract.ts +1 -1
  521. package/src/domains/plugins/catalog.ts +204 -0
  522. package/src/domains/plugins/contract.ts +24 -0
  523. package/src/domains/plugins/discovery.ts +316 -0
  524. package/src/domains/plugins/extension.ts +40 -0
  525. package/src/domains/plugins/index.ts +77 -0
  526. package/src/domains/plugins/integrity.ts +6 -0
  527. package/src/domains/plugins/manifest.ts +3 -0
  528. package/src/domains/plugins/resources.ts +102 -0
  529. package/src/domains/plugins/state.ts +753 -0
  530. package/src/domains/plugins/types.ts +217 -0
  531. package/src/domains/prompts/extension.ts +9 -2
  532. package/src/domains/prompts/fragments/operating/skills.md +10 -10
  533. package/src/domains/providers/probe/fingerprint.ts +13 -6
  534. package/src/domains/providers/probe/reasoning.ts +2 -0
  535. package/src/domains/providers/runtimes/common/probe-helpers.ts +23 -7
  536. package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +7 -2
  537. package/src/domains/providers/runtimes/protocol/openai-compat.ts +10 -4
  538. package/src/domains/resources/common-loader.ts +9 -6
  539. package/src/domains/resources/index.ts +67 -0
  540. package/src/domains/resources/library-actions.ts +836 -0
  541. package/src/domains/resources/library-evals.ts +38 -0
  542. package/src/domains/resources/library-inventory.ts +1048 -0
  543. package/src/domains/resources/library-types.ts +50 -0
  544. package/src/domains/resources/library-validation.ts +634 -0
  545. package/src/domains/resources/library.ts +437 -156
  546. package/src/domains/resources/package-references.ts +66 -0
  547. package/src/domains/resources/prompts/loader.ts +75 -41
  548. package/src/domains/resources/skills/install.ts +2 -2
  549. package/src/domains/resources/skills/loader.ts +77 -22
  550. package/src/domains/resources/skills/marketplace.ts +48 -57
  551. package/src/domains/resources/skills/promotion.ts +2 -2
  552. package/src/domains/resources/skills/provenance-pin.ts +17 -4
  553. package/src/domains/safety/action-classifier.ts +2 -2
  554. package/src/domains/safety/default-path-policy.ts +3 -1
  555. package/src/domains/safety/policy-engine.ts +1 -1
  556. package/src/domains/safety/protected-artifacts.ts +21 -5
  557. package/src/domains/safety/skill-authority.ts +5 -2
  558. package/src/domains/share/archive.ts +1 -1
  559. package/src/engine/apis/openai-completions.ts +52 -2
  560. package/src/engine/notices/pi-tui-LICENSE +21 -0
  561. package/src/engine/tui.ts +3 -0
  562. package/src/engine/worker-runtime.ts +58 -14
  563. package/src/engine/worker-tools.ts +5 -0
  564. package/src/entry/orchestrator.ts +26 -5
  565. package/src/entry/plugin-reload.ts +18 -0
  566. package/src/interactive/application-controller.ts +68 -52
  567. package/src/interactive/chat-loop.ts +32 -5
  568. package/src/interactive/chat-panel.ts +168 -638
  569. package/src/interactive/chat-renderer.ts +13 -30
  570. package/src/interactive/clio-editor.ts +53 -21
  571. package/src/interactive/command-output.ts +56 -1
  572. package/src/interactive/dispatch-board.ts +1 -3
  573. package/src/interactive/editor-submit.ts +73 -59
  574. package/src/interactive/fleet-run-preview.ts +2 -0
  575. package/src/interactive/follow-up-queue-panel.ts +3 -3
  576. package/src/interactive/footer/dashboard.ts +12 -4
  577. package/src/interactive/footer/notifications.ts +2 -2
  578. package/src/interactive/footer/widgets.ts +52 -93
  579. package/src/interactive/interactive-application.ts +225 -63
  580. package/src/interactive/interactive-event-projection.ts +2 -44
  581. package/src/interactive/interactive-input-runtime.ts +257 -35
  582. package/src/interactive/interactive-presentation.ts +71 -21
  583. package/src/interactive/interactive-slash-runtime.ts +40 -48
  584. package/src/interactive/keybinding-manager.ts +156 -79
  585. package/src/interactive/keyboard-owner.ts +37 -0
  586. package/src/interactive/layout.ts +29 -4
  587. package/src/interactive/leader-key.ts +49 -102
  588. package/src/interactive/leader-menu.ts +45 -0
  589. package/src/interactive/overlay-ask-user-lifecycle.ts +9 -1
  590. package/src/interactive/overlay-frame.ts +15 -0
  591. package/src/interactive/overlay-general-openers.ts +2 -0
  592. package/src/interactive/overlay-key-routing.ts +46 -47
  593. package/src/interactive/overlay-lifecycle.ts +31 -15
  594. package/src/interactive/overlay-resource-openers.ts +56 -46
  595. package/src/interactive/overlay-session-lifecycle.ts +1 -1
  596. package/src/interactive/overlays/ask-user.ts +630 -556
  597. package/src/interactive/overlays/extension-panel.ts +70 -0
  598. package/src/interactive/overlays/extensions.ts +28 -5
  599. package/src/interactive/overlays/fleet-run-approval.ts +7 -3
  600. package/src/interactive/overlays/help-reference.ts +89 -40
  601. package/src/interactive/overlays/interop.ts +122 -3
  602. package/src/interactive/overlays/keybinding-detail.ts +2 -2
  603. package/src/interactive/overlays/library-lifecycle.ts +90 -0
  604. package/src/interactive/overlays/library-model.ts +574 -0
  605. package/src/interactive/overlays/library-review.ts +557 -0
  606. package/src/interactive/overlays/library-tabs.ts +3 -15
  607. package/src/interactive/overlays/library.ts +602 -0
  608. package/src/interactive/overlays/list-overlay.ts +218 -39
  609. package/src/interactive/overlays/model-selector.ts +28 -25
  610. package/src/interactive/overlays/session-selector.ts +9 -3
  611. package/src/interactive/overlays/settings.ts +34 -26
  612. package/src/interactive/overlays/tree-selector.ts +16 -11
  613. package/src/interactive/permission-hint.ts +13 -0
  614. package/src/interactive/permission-overlay.ts +77 -28
  615. package/src/interactive/prompt-source-label.ts +21 -0
  616. package/src/interactive/renderers/preview.ts +16 -0
  617. package/src/interactive/renderers/reference-card.ts +35 -0
  618. package/src/interactive/renderers/tool-execution.ts +67 -160
  619. package/src/interactive/renderers/worker-entry.ts +90 -42
  620. package/src/interactive/slash-autocomplete.ts +100 -7
  621. package/src/interactive/slash-commands.ts +396 -105
  622. package/src/interactive/slash-spec.ts +0 -1
  623. package/src/interactive/status/controller.ts +0 -5
  624. package/src/interactive/status/state-machine.ts +44 -26
  625. package/src/interactive/status/types.ts +3 -0
  626. package/src/interactive/status/verbs.ts +13 -12
  627. package/src/interactive/terminal-lease.ts +44 -12
  628. package/src/interactive/transcript-detail.ts +50 -112
  629. package/src/interactive/turn-queues.ts +8 -7
  630. package/src/interactive/turn-runtime.ts +1 -1
  631. package/src/interactive/view/artifacts.ts +4 -0
  632. package/src/interactive/view/view-overlay.ts +58 -43
  633. package/src/interactive/welcome-dashboard.ts +525 -408
  634. package/src/tools/bootstrap.ts +8 -0
  635. package/src/tools/builtin-tool-catalog.ts +7 -2
  636. package/src/tools/context/index.ts +58 -5
  637. package/src/tools/context/library.ts +465 -0
  638. package/src/tools/context/surface.ts +20 -6
  639. package/src/tools/core-bootstrap.ts +3 -0
  640. package/src/tools/dispatch-admission.ts +24 -1
  641. package/src/tools/dispatch-arguments.ts +8 -0
  642. package/src/tools/dispatch-plan.ts +32 -0
  643. package/src/tools/dispatch-schema.ts +31 -1
  644. package/src/tools/dispatch-types.ts +3 -0
  645. package/src/tools/dispatch.ts +1 -1
  646. package/src/tools/harness-extensions.ts +169 -0
  647. package/src/tools/observation.ts +4 -0
  648. package/src/tools/policy.ts +7 -1
  649. package/src/tools/presentation.ts +1 -1
  650. package/src/tools/registry.ts +20 -2
  651. package/src/tools/verify/numeric.ts +4 -4
  652. package/src/tools/worker-evidence.ts +5 -0
  653. package/src/worker/context-seed.ts +192 -0
  654. package/src/worker/entry.ts +1 -0
  655. package/src/worker/spec-contract.ts +8 -1
  656. package/dist/chunk-3UW3KU4A.js +0 -21
  657. package/dist/chunk-6SYEGZI3.js +0 -433
  658. package/dist/chunk-CXQ37WJH.js +0 -45
  659. package/dist/chunk-EQEJJ53P.js +0 -399
  660. package/dist/chunk-KTFSFCVN.js +0 -46
  661. package/dist/chunk-QRFXEO6Y.js +0 -17
  662. package/dist/chunk-T7FDXNRU.js +0 -1257
  663. package/dist/chunk-U7VQ4NI4.js +0 -911
  664. package/dist/configure-SML6UBZ5.js +0 -55
  665. package/dist/interop-YOTGXFJM.js +0 -115
  666. package/dist/library-GJI6W6OK.js +0 -226
  667. package/dist/skills-S36AAJHU.js +0 -510
  668. package/skills/README.md +0 -418
  669. package/skills/meta/find-skills/SKILL.md +0 -78
  670. package/skills/meta/find-skills/evals.md +0 -47
  671. package/src/domains/extensions/resource-path.ts +0 -27
  672. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +0 -27
  673. package/src/interactive/overlays/agents.ts +0 -70
  674. package/src/interactive/overlays/library-install-confirm.ts +0 -152
  675. package/src/interactive/overlays/prompts.ts +0 -89
  676. package/src/interactive/overlays/skills-hub.ts +0 -615
  677. /package/{skills → library/skills}/coding/ast-grep/references/rule_reference.md +0 -0
  678. /package/{skills → library/skills}/coding/prototype/references/LOGIC.md +0 -0
  679. /package/{skills → library/skills}/coding/prototype/references/UI.md +0 -0
  680. /package/{skills → library/skills}/coding/tdd/references/mocking.md +0 -0
  681. /package/{skills → library/skills}/coding/tdd/references/tests.md +0 -0
  682. /package/{skills → library/skills}/context/context-handoff/scripts/new-handoff.sh +0 -0
  683. /package/{skills → library/skills}/git/branch-closeout/evals.md +0 -0
  684. /package/{skills → library/skills}/git/branch-closeout/references/closeout-checklist.md +0 -0
  685. /package/{skills → library/skills}/git/file-ticket/assets/issue-template.md +0 -0
  686. /package/{skills → library/skills}/git/file-ticket/evals.md +0 -0
  687. /package/{skills → library/skills}/git/file-ticket/references/issue-discovery.md +0 -0
  688. /package/{skills → library/skills}/git/fix-issue/evals.md +0 -0
  689. /package/{skills → library/skills}/git/fix-issue/references/diagnosis-and-rca.md +0 -0
  690. /package/{skills → library/skills}/git/resolve-merge-conflicts/references/conflict-matrix.md +0 -0
  691. /package/{skills → library/skills}/git/ship/assets/pr-template.md +0 -0
  692. /package/{skills → library/skills}/git/ship/evals.md +0 -0
  693. /package/{skills → library/skills}/git/ship/references/remote-and-branch-policy.md +0 -0
  694. /package/{skills → library/skills}/git/worktree-create/evals.md +0 -0
  695. /package/{skills → library/skills}/git/worktree-create/references/worktree-setup.md +0 -0
  696. /package/{skills → library/skills}/git/worktree-merge/evals.md +0 -0
  697. /package/{skills → library/skills}/git/worktree-merge/references/merge-strategies.md +0 -0
  698. /package/{skills → library/skills}/meta/clio-coder-test/references/harness.md +0 -0
  699. /package/{skills → library/skills}/meta/clio-coder-test/references/test-map.md +0 -0
  700. /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"] };