@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
@@ -1,30 +1,36 @@
1
- import { createHash } from "node:crypto";
2
- import { existsSync, readFileSync, statSync } from "node:fs";
1
+ import { existsSync, readFileSync } from "node:fs";
3
2
  import path from "node:path";
4
- import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
3
+ import { stringify as stringifyYaml } from "yaml";
5
4
  import { readSettings, updateSettings } from "../../core/config.js";
6
5
  import { runCommandVector, type SafeCommandResult } from "../../core/safe-exec.js";
7
6
  import { safeResourceWrite } from "../../core/safe-resource-write.js";
7
+ import { withStateFileLockSync } from "../../core/state-file-lock.js";
8
8
  import { clioConfigDir } from "../../core/xdg.js";
9
- import { parseFrontmatter } from "../agents/frontmatter.js";
10
9
  import {
11
- assertAgentSpecPolicy,
12
- normalizeAgentSpec,
13
- parseAgentRecipeSchema,
14
- parseFleetContract,
15
- } from "../agents/index.js";
16
- import { loadPromptTemplates } from "./prompts/loader.js";
17
- import { normalizedSkillHash } from "./skills/install.js";
10
+ bundledPluginCatalog,
11
+ fetchPluginSource,
12
+ type PluginCatalogEntry,
13
+ parsePluginGithubSource,
14
+ pluginLocalPath,
15
+ readPluginCatalog,
16
+ } from "../plugins/catalog.js";
18
17
  import {
19
- type DiscoverMarketplaceOptions,
20
- discoverMarketplaceSkills,
21
- installSkill,
22
- type LibraryEntryKind,
23
- type LibraryRequirementRef,
24
- type MarketplaceSkill,
25
- } from "./skills/marketplace.js";
18
+ installPlugin,
19
+ listInstalledPlugins,
20
+ type PluginExpectedState,
21
+ type PluginMutationResult,
22
+ type PluginScope,
23
+ pluginBaseDir,
24
+ pluginContentDigest,
25
+ pluginResourcePath,
26
+ readPluginInstallRecord,
27
+ readPluginManifest,
28
+ removePlugin,
29
+ } from "../plugins/index.js";
30
+ import { splitYamlFrontmatter } from "./common-loader.js";
31
+ import type { LibraryPackageEntry, LibraryRequirementRef } from "./library-types.js";
26
32
 
27
- export type LibraryEntry = MarketplaceSkill;
33
+ export type LibraryEntry = LibraryPackageEntry;
28
34
 
29
35
  export interface LibraryDiscoveryResult {
30
36
  entries: LibraryEntry[];
@@ -32,69 +38,23 @@ export interface LibraryDiscoveryResult {
32
38
  refusals: Readonly<Record<string, string>>;
33
39
  }
34
40
 
35
- function isRecord(value: unknown): value is Record<string, unknown> {
36
- return typeof value === "object" && value !== null && !Array.isArray(value);
37
- }
38
-
39
41
  function catalogPath(): string {
40
42
  const configured = readSettings().integrations.library.catalog;
41
43
  return path.resolve(configured ?? path.join(clioConfigDir(), "library.yaml"));
42
44
  }
43
45
 
44
46
  function parseCatalog(filePath: string, diagnostics: string[]): LibraryEntry[] {
45
- if (!existsSync(filePath)) return [];
47
+ return readPluginCatalog(filePath, diagnostics).map((entry) => ({ ...entry, origin: "index" }));
48
+ }
49
+
50
+ /** Discovery retains damaged copies even when their provenance record cannot be read. */
51
+ function displayInstallRecord(id: string, options: LibraryScopeOptions, diagnostics: string[]) {
46
52
  try {
47
- const raw = readFileSync(filePath, "utf8");
48
- const parsed = filePath.endsWith(".json") ? JSON.parse(raw) : parseYaml(raw);
49
- const rows = Array.isArray(parsed) ? parsed : isRecord(parsed) && Array.isArray(parsed.skills) ? parsed.skills : [];
50
- return rows.flatMap((value): LibraryEntry[] => {
51
- if (
52
- !isRecord(value) ||
53
- typeof value.name !== "string" ||
54
- typeof value.description !== "string" ||
55
- typeof value.sourceUrl !== "string"
56
- ) {
57
- diagnostics.push(`library catalog entry malformed: ${filePath}`);
58
- return [];
59
- }
60
- const kind: LibraryEntryKind =
61
- value.kind === undefined || value.kind === "skill"
62
- ? "skill"
63
- : value.kind === "agent" || value.kind === "prompt" || value.kind === "fleet"
64
- ? value.kind
65
- : "skill";
66
- if (value.kind !== undefined && !["skill", "agent", "prompt", "fleet"].includes(String(value.kind))) {
67
- diagnostics.push(`library catalog entry has unsupported kind: ${value.name}`);
68
- return [];
69
- }
70
- if (
71
- value.requires !== undefined &&
72
- (!Array.isArray(value.requires) || value.requires.some((item) => typeof item !== "string"))
73
- ) {
74
- diagnostics.push(`library_requirement_malformed: ${value.name}`);
75
- return [];
76
- }
77
- const sourceUrl = /^(?:https?:\/\/|git@)/.test(value.sourceUrl)
78
- ? value.sourceUrl
79
- : path.resolve(path.dirname(filePath), value.sourceUrl);
80
- const requires = Array.isArray(value.requires)
81
- ? value.requires.filter((item): item is LibraryRequirementRef => typeof item === "string")
82
- : undefined;
83
- return [
84
- {
85
- kind,
86
- name: value.name.trim(),
87
- description: value.description.trim(),
88
- sourceUrl,
89
- origin: "index",
90
- ...(typeof value.version === "string" ? { version: value.version } : {}),
91
- ...(requires ? { requires } : {}),
92
- },
93
- ];
94
- });
53
+ return readPluginInstallRecord(id, options);
95
54
  } catch (error) {
96
- diagnostics.push(`library catalog unreadable: ${error instanceof Error ? error.message : String(error)}`);
97
- return [];
55
+ const message = `package state unavailable (${options.scope}:${id}): ${error instanceof Error ? error.message : String(error)}`;
56
+ if (!diagnostics.includes(message)) diagnostics.push(message);
57
+ return undefined;
98
58
  }
99
59
  }
100
60
 
@@ -102,31 +62,48 @@ export function libraryEntryRef(entry: Pick<LibraryEntry, "kind" | "name">): Lib
102
62
  return `${entry.kind}:${entry.name}`;
103
63
  }
104
64
 
105
- export function discoverLibrary(
106
- options: { catalog?: string; cwd?: string; marketplace?: DiscoverMarketplaceOptions } = {},
107
- ): LibraryDiscoveryResult {
108
- const marketplace = discoverMarketplaceSkills({
109
- ...(options.marketplace ?? {}),
110
- ...(options.cwd ? { cwd: options.cwd } : {}),
111
- });
112
- const diagnostics = [...marketplace.diagnostics.filter((item) => !item.includes("no local skill marketplace"))];
65
+ export function discoverLibrary(options: { catalog?: string; cwd?: string } = {}): LibraryDiscoveryResult {
66
+ const diagnostics: string[] = [];
67
+ const bundledPlugins = bundledPluginCatalog(diagnostics);
113
68
  const privatePath = catalogPath();
114
69
  const primary = options.catalog ? parseCatalog(path.resolve(options.catalog), diagnostics) : [];
115
70
  const privateEntries = parseCatalog(privatePath, diagnostics);
116
71
  const byRef = new Map<string, LibraryEntry>();
117
- for (const entry of [...marketplace.skills, ...primary, ...privateEntries]) byRef.set(libraryEntryRef(entry), entry);
72
+ for (const entry of [
73
+ ...bundledPlugins,
74
+ ...privateEntries,
75
+ ...parseCatalog(path.join(options.cwd ?? process.cwd(), ".clio-coder", "library.yaml"), diagnostics),
76
+ ...primary,
77
+ ])
78
+ byRef.set(libraryEntryRef(entry), entry);
79
+ for (const plugin of listInstalledPlugins(options.cwd ?? process.cwd(), { all: true })) {
80
+ const ref = `${plugin.kind ?? "plugin"}:${plugin.id}`;
81
+ if (byRef.has(ref)) continue;
82
+ const record = displayInstallRecord(
83
+ plugin.id,
84
+ { ...(options.cwd ? { cwd: options.cwd } : {}), scope: plugin.scope },
85
+ diagnostics,
86
+ );
87
+ byRef.set(ref, {
88
+ kind: plugin.kind ?? "plugin",
89
+ name: plugin.id,
90
+ version: plugin.version,
91
+ description: plugin.description,
92
+ sourceUrl: record?.source ?? plugin.rootPath,
93
+ origin: "installed",
94
+ });
95
+ }
118
96
  const refusals: Record<string, string> = {};
119
- const entries = [...byRef.values()].filter((entry) => {
97
+ const entries = [...byRef.values()];
98
+ for (const entry of entries) {
120
99
  try {
121
100
  resolveLibraryRequirements(entry, [...byRef.values()]);
122
- return true;
123
101
  } catch (error) {
124
102
  const message = error instanceof Error ? error.message : String(error);
125
103
  refusals[libraryEntryRef(entry)] = message;
126
104
  if (!diagnostics.includes(message)) diagnostics.push(message);
127
- return false;
128
105
  }
129
- });
106
+ }
130
107
  return {
131
108
  entries: entries.sort((a, b) => libraryEntryRef(a).localeCompare(libraryEntryRef(b))),
132
109
  diagnostics,
@@ -134,7 +111,7 @@ export function discoverLibrary(
134
111
  };
135
112
  }
136
113
 
137
- const REQUIREMENT_PATTERN = /^(skill|agent|prompt|fleet):([A-Za-z0-9][A-Za-z0-9._-]*)$/;
114
+ const REQUIREMENT_PATTERN = /^(skill|agent|prompt|fleet|plugin):([A-Za-z0-9][A-Za-z0-9._-]*)$/;
138
115
 
139
116
  export function resolveLibraryRequirements(entry: LibraryEntry, catalog: ReadonlyArray<LibraryEntry>): LibraryEntry[] {
140
117
  const byRef = new Map(catalog.map((item) => [libraryEntryRef(item), item]));
@@ -162,64 +139,170 @@ export function resolveLibraryRequirements(entry: LibraryEntry, catalog: Readonl
162
139
  return ordered;
163
140
  }
164
141
 
165
- function sourceFile(entry: LibraryEntry): string {
166
- const source = path.resolve(entry.sourceUrl);
167
- if (entry.kind === "skill") return source;
168
- if (!existsSync(source)) throw new Error(`library source path does not exist: ${source}`);
169
- return source;
170
- }
171
-
172
- function validateEntry(entry: LibraryEntry, raw: string, filePath: string): void {
173
- if (entry.kind === "fleet") {
174
- parseFleetContract(raw, filePath);
175
- return;
176
- }
177
- if (entry.kind === "agent") {
178
- const parsed = parseFrontmatter(raw, filePath);
179
- const recipe = parseAgentRecipeSchema({ id: entry.name, source: "user", filepath: filePath, ...parsed });
180
- assertAgentSpecPolicy(normalizeAgentSpec(recipe));
181
- return;
182
- }
183
- if (entry.kind === "prompt") {
184
- const loaded = loadPromptTemplates({ roots: [{ path: path.dirname(filePath), scope: "user", source: "library" }] });
185
- if (!loaded.items.some((item) => item.filePath === filePath))
186
- throw new Error(`prompt template is malformed: ${filePath}`);
187
- }
188
- }
189
-
190
142
  export interface LibraryInstallPlan {
191
143
  entry: LibraryEntry;
192
144
  path: string;
193
145
  sha256: string;
146
+ /** Plugin source retained until acceptance; release a cancelled plan. */
147
+ sourceRoot?: string;
148
+ cleanup?: () => void;
149
+ cwd?: string;
150
+ scope?: PluginScope;
151
+ force?: boolean;
152
+ expectedInstalledDigest?: string;
153
+ /** Reviewed facts rechecked inside the writer's lock. */
154
+ expect?: PluginExpectedState;
155
+ }
156
+
157
+ export interface LibraryScopeOptions {
158
+ cwd?: string;
159
+ scope?: PluginScope;
194
160
  }
195
161
 
196
- export function libraryInstallPath(entry: Pick<LibraryEntry, "kind" | "name">): string {
197
- if (entry.kind === "skill") return path.join(clioConfigDir(), "skills", entry.name, "SKILL.md");
198
- const root = entry.kind === "agent" ? "agents" : entry.kind === "fleet" ? "fleets" : "prompts";
199
- return path.join(clioConfigDir(), root, `${entry.name}.md`);
162
+ /** Installed state remains addressable after its index entry is removed. */
163
+ export function resolveInstalledLibraryEntry(
164
+ ref: string,
165
+ options: LibraryScopeOptions = {},
166
+ ): LibraryEntry & { scope: PluginScope } {
167
+ const copies = listInstalledPlugins(options.cwd ?? process.cwd(), { ...options, all: true })
168
+ .filter((item) => (ref.includes(":") ? `${item.kind ?? "plugin"}:${item.id}` === ref : item.id === ref))
169
+ .sort((a, b) => Number(b.scope === "project") - Number(a.scope === "project"));
170
+ const item = copies[0];
171
+ if (!item) throw new Error(`package not installed: ${ref}`);
172
+ const saved = readPluginInstallRecord(item.id, { ...options, scope: item.scope });
173
+ return {
174
+ scope: item.scope,
175
+ kind: item.kind ?? "plugin",
176
+ name: item.id,
177
+ description: item.description,
178
+ version: item.version,
179
+ sourceUrl: saved?.source ?? item.rootPath,
180
+ origin: "installed",
181
+ ...(item.manifest?.clio.requires ? { requires: item.manifest.clio.requires } : {}),
182
+ };
183
+ }
184
+
185
+ /** Register verified bytes in one scoped index without installing or enabling them. */
186
+ export function registerLibraryPackage(
187
+ source: string,
188
+ options: LibraryScopeOptions & { force?: boolean } = {},
189
+ ): LibraryEntry {
190
+ const local = pluginLocalPath(source, options.cwd);
191
+ const candidate = readPluginManifest(local);
192
+ if (!candidate.valid || !candidate.manifest || !candidate.contentDigest)
193
+ throw new Error(candidate.diagnostics.map((item) => item.message).join("; "));
194
+ const manifest = candidate.manifest;
195
+ const entry: LibraryEntry = {
196
+ kind: manifest.clio.kind ?? "plugin",
197
+ name: manifest.name,
198
+ description: manifest.description ?? "",
199
+ ...(manifest.version ? { version: manifest.version } : {}),
200
+ sha256: candidate.contentDigest,
201
+ sourceUrl: local,
202
+ origin: "index",
203
+ ...(manifest.clio.requires ? { requires: manifest.clio.requires } : {}),
204
+ };
205
+ const file =
206
+ options.scope === "project" ? path.join(options.cwd ?? process.cwd(), ".clio-coder", "library.yaml") : catalogPath();
207
+ withStateFileLockSync(file, () => {
208
+ const diagnostics: string[] = [];
209
+ const before = existsSync(file) ? readFileSync(file, "utf8") : undefined;
210
+ const entries = readPluginCatalog(file, diagnostics);
211
+ if (diagnostics.length) throw new Error(diagnostics.join("; "));
212
+ const previous = entries.find((item) => item.name === entry.name);
213
+ if (previous && !options.force)
214
+ throw new Error(`package already registered: ${entry.name}; use --force to replace its pin`);
215
+ const next = [...entries.filter((item) => item.name !== entry.name), entry].sort((a, b) =>
216
+ a.name.localeCompare(b.name),
217
+ );
218
+ if ((existsSync(file) ? readFileSync(file, "utf8") : undefined) !== before)
219
+ throw new Error("library index changed during registration");
220
+ safeResourceWrite(file, stringifyYaml({ entries: next.map(({ origin: _origin, index: _index, ...item }) => item) }), {
221
+ encoding: "utf8",
222
+ });
223
+ });
224
+ return entry;
225
+ }
226
+
227
+ /** One workspace view includes available packages and every installed scope. */
228
+ export function libraryWorkspace(options: LibraryScopeOptions & { catalog?: string } = {}) {
229
+ const discovery = discoverLibrary(options);
230
+ const installed = listInstalledPlugins(options.cwd ?? process.cwd(), { ...options, all: true });
231
+ return {
232
+ ...discovery,
233
+ entries: discovery.entries.map((entry) => ({
234
+ ...entry,
235
+ installed: installed
236
+ .filter((item) => item.id === entry.name && (item.kind ?? "plugin") === entry.kind)
237
+ .map((item) => ({
238
+ ...item,
239
+ origin: displayInstallRecord(item.id, { ...options, scope: item.scope }, discovery.diagnostics)?.origin,
240
+ })),
241
+ })),
242
+ };
243
+ }
244
+
245
+ /** Resolve the authored invocation identity; package names do not rewrite resource IDs. */
246
+ export function libraryRuntimeName(
247
+ entry: Pick<LibraryEntry, "kind" | "name">,
248
+ options: LibraryScopeOptions = {},
249
+ ): string | undefined {
250
+ const installed = installedPlugin(entry, options);
251
+ if (!installed?.loadable || entry.kind === "plugin") return undefined;
252
+ const manifest = installed.manifest;
253
+ const component = manifest?.clio.components.find((item) => item.kind === entry.kind);
254
+ if (!manifest || !component) return undefined;
255
+ const file = pluginResourcePath(installed.rootPath, component.path);
256
+ if (entry.kind === "agent") return path.basename(file, ".md");
257
+ if (entry.kind === "prompt")
258
+ return path
259
+ .relative(pluginResourcePath(installed.rootPath, manifest.clio.resources.prompts as string), file)
260
+ .replace(/\.md$/, "")
261
+ .split(path.sep)
262
+ .join(":");
263
+ const parsed = splitYamlFrontmatter(readFileSync(file, "utf8"));
264
+ if (!parsed.ok) return undefined;
265
+ const metadata = parsed.frontmatter;
266
+ return typeof metadata.name === "string" ? metadata.name : undefined;
200
267
  }
201
268
 
202
- function readLibraryPins(): Record<string, { sha256: string; sourceUrl: string }> {
203
- const pinPath = path.join(clioConfigDir(), "library-pins.yaml");
204
- if (!existsSync(pinPath)) return {};
205
- const parsed = parseYaml(readFileSync(pinPath, "utf8"));
206
- return isRecord(parsed) ? (parsed as Record<string, { sha256: string; sourceUrl: string }>) : {};
269
+ function installedPlugin(entry: Pick<LibraryEntry, "kind" | "name">, options: LibraryScopeOptions = {}) {
270
+ return listInstalledPlugins(options.cwd ?? process.cwd(), {
271
+ all: true,
272
+ ...(options.scope ? { scope: options.scope } : {}),
273
+ })
274
+ .filter((plugin) => plugin.id === entry.name && (plugin.kind ?? "plugin") === entry.kind)
275
+ .sort((left, right) => Number(right.scope === "project") - Number(left.scope === "project"))[0];
276
+ }
277
+
278
+ export function libraryInstallPath(
279
+ entry: Pick<LibraryEntry, "kind" | "name">,
280
+ options: LibraryScopeOptions = {},
281
+ ): string {
282
+ if (!/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(entry.name)) throw new Error(`invalid library entry name: ${entry.name}`);
283
+ return (
284
+ installedPlugin(entry, options)?.rootPath ??
285
+ path.join(pluginBaseDir(options.scope ?? "user", options.cwd ?? process.cwd()), entry.name)
286
+ );
207
287
  }
208
288
 
209
289
  export interface LibraryRequirementStatus {
210
290
  ordered: LibraryEntry[];
211
291
  satisfied: LibraryEntry[];
212
292
  unsatisfied: LibraryEntry[];
293
+ /** Installed dependencies requiring explicit enable or repair before use. */
294
+ inactive?: LibraryEntry[];
213
295
  }
214
296
 
215
297
  /**
216
- * Whether this entry is already on disk for this operator. A kind-qualified pin
217
- * and a kind-specific destination are each sufficient, which is the same rule
218
- * the requirement classifier applies, so a surface that draws an installed or
219
- * available column never disagrees with the gate that refuses an install.
298
+ * Whether this entry has an installed copy, including disabled or damaged copies.
299
+ * Requirement checks separately require a verified, loadable copy.
220
300
  */
221
- export function libraryEntryInstalled(entry: Pick<LibraryEntry, "kind" | "name">): boolean {
222
- return readLibraryPins()[libraryEntryRef(entry)] !== undefined || existsSync(libraryInstallPath(entry));
301
+ export function libraryEntryInstalled(
302
+ entry: Pick<LibraryEntry, "kind" | "name">,
303
+ options: LibraryScopeOptions = {},
304
+ ): boolean {
305
+ return installedPlugin(entry, options) !== undefined;
223
306
  }
224
307
 
225
308
  /**
@@ -229,57 +312,255 @@ export function libraryEntryInstalled(entry: Pick<LibraryEntry, "kind" | "name">
229
312
  */
230
313
  export function libraryEntryPin(
231
314
  entry: Pick<LibraryEntry, "kind" | "name">,
315
+ options: LibraryScopeOptions = {},
232
316
  ): { sha256: string; sourceUrl: string } | undefined {
233
- return readLibraryPins()[libraryEntryRef(entry)];
317
+ const plugin = installedPlugin(entry, options);
318
+ if (!plugin) return undefined;
319
+ const record = displayInstallRecord(entry.name, { ...options, scope: plugin.scope }, []);
320
+ return record ? { sha256: record.contentDigest, sourceUrl: record.source } : undefined;
234
321
  }
235
322
 
236
323
  export function classifyLibraryRequirements(
237
324
  entry: LibraryEntry,
238
325
  catalog: ReadonlyArray<LibraryEntry>,
326
+ options: LibraryScopeOptions = {},
239
327
  ): LibraryRequirementStatus {
240
328
  const ordered = resolveLibraryRequirements(entry, catalog).slice(0, -1);
241
- const satisfied = ordered.filter((requirement) => libraryEntryInstalled(requirement));
329
+ const inactive = ordered.filter(
330
+ (requirement) =>
331
+ libraryEntryInstalled(requirement, options) &&
332
+ !listInstalledPlugins(options.cwd ?? process.cwd(), options).some(
333
+ (plugin) => plugin.id === requirement.name && (plugin.kind ?? "plugin") === requirement.kind && plugin.loadable,
334
+ ),
335
+ );
336
+ const inactiveRefs = new Set(inactive.map(libraryEntryRef));
337
+ const satisfied = ordered.filter(
338
+ (requirement) => libraryEntryInstalled(requirement, options) && !inactiveRefs.has(libraryEntryRef(requirement)),
339
+ );
242
340
  const satisfiedRefs = new Set(satisfied.map(libraryEntryRef));
243
341
  return {
244
342
  ordered,
245
343
  satisfied,
344
+ ...(inactive.length ? { inactive } : {}),
246
345
  unsatisfied: ordered.filter((requirement) => !satisfiedRefs.has(libraryEntryRef(requirement))),
247
346
  };
248
347
  }
249
348
 
250
- export function planLibraryInstall(entry: LibraryEntry): LibraryInstallPlan {
251
- if (entry.kind === "skill") {
252
- const source = sourceFile(entry);
253
- const file = statSync(source).isDirectory() ? path.join(source, "SKILL.md") : source;
254
- const raw = readFileSync(file);
349
+ export function planLibraryInstall(
350
+ entry: LibraryEntry,
351
+ options: { cwd?: string; scope?: PluginScope; force?: boolean } = {},
352
+ ): LibraryInstallPlan {
353
+ const fetched = fetchPluginSource(entry.sourceUrl, options.cwd);
354
+ try {
355
+ const candidate = readPluginManifest(fetched.root);
356
+ if (!candidate.valid || !candidate.manifest)
357
+ throw new Error(`invalid plugin: ${candidate.diagnostics.map((item) => item.message).join("; ")}`);
358
+ if ((candidate.manifest.clio.kind ?? "plugin") !== entry.kind)
359
+ throw new Error(`package kind mismatch: expected ${entry.kind}`);
360
+ if (candidate.manifest.name !== entry.name)
361
+ throw new Error(`plugin identity mismatch: expected ${entry.name}, found ${candidate.manifest.name}`);
362
+ if (entry.version && candidate.manifest.version !== entry.version)
363
+ throw new Error(`plugin version mismatch: expected ${entry.version}, found ${candidate.manifest.version}`);
364
+ const declaredRequirements = candidate.manifest.clio.requires ?? [];
365
+ if (JSON.stringify([...declaredRequirements].sort()) !== JSON.stringify([...(entry.requires ?? [])].sort()))
366
+ throw new Error(
367
+ `library_requirement_mismatch: ${entry.name}; index and manifest must declare the same requirements`,
368
+ );
369
+ const sha256 = pluginContentDigest(fetched.root);
370
+ if (entry.sha256 && sha256 !== entry.sha256) throw new Error(`plugin_pin_mismatch: ${entry.name}`);
255
371
  return {
256
- entry,
257
- path: libraryInstallPath(entry),
258
- sha256: normalizedSkillHash(raw.toString("utf8")),
372
+ entry: { ...entry, ...(candidate.manifest.version ? { version: candidate.manifest.version } : {}) },
373
+ path: path.join(pluginBaseDir(options.scope ?? "user", options.cwd ?? process.cwd()), entry.name),
374
+ sha256,
375
+ sourceRoot: fetched.root,
376
+ cleanup: fetched.cleanup,
377
+ ...options,
259
378
  };
379
+ } catch (error) {
380
+ fetched.cleanup();
381
+ throw error;
260
382
  }
261
- const source = sourceFile(entry);
262
- const raw = readFileSync(source, "utf8");
263
- validateEntry(entry, raw, source);
264
- return {
265
- entry,
266
- path: libraryInstallPath(entry),
267
- sha256: createHash("sha256").update(raw).digest("hex"),
268
- };
269
383
  }
270
384
 
271
- function recordPin(plan: LibraryInstallPlan): void {
272
- const pinPath = path.join(clioConfigDir(), "library-pins.yaml");
273
- const pins = readLibraryPins();
274
- pins[libraryEntryRef(plan.entry)] = { sha256: plan.sha256, sourceUrl: plan.entry.sourceUrl };
275
- safeResourceWrite(pinPath, stringifyYaml(Object.fromEntries(Object.entries(pins).sort())), { encoding: "utf8" });
385
+ export function releaseLibraryPlan(plan: LibraryInstallPlan): void {
386
+ plan.cleanup?.();
387
+ }
388
+
389
+ /** All surfaces commit the reviewed digest, including every bundle asset. */
390
+ export interface LibraryInstallResult {
391
+ recovery?: { stateBackup?: string; packageBackup?: string };
392
+ }
393
+
394
+ /**
395
+ * Commit a staged plan through the package writer without releasing it. The
396
+ * destination digest reviewed before the lock is also rechecked inside it when
397
+ * the plan carries `expect`. Returns the writer's structured result.
398
+ */
399
+ export function commitLibraryInstallPlan(plan: LibraryInstallPlan): PluginMutationResult {
400
+ if (existsSync(plan.path) && !plan.force) throw new Error(`library destination already exists: ${plan.path}`);
401
+ if (!plan.sourceRoot) throw new Error("plugin install plan has no staged source");
402
+ if (plan.expectedInstalledDigest && pluginContentDigest(plan.path) !== plan.expectedInstalledDigest)
403
+ throw new Error(`plugin_destination_changed: ${plan.entry.name}`);
404
+ const expect: PluginExpectedState | undefined =
405
+ plan.expect ??
406
+ (plan.expectedInstalledDigest
407
+ ? {
408
+ copies: [
409
+ {
410
+ scope: plan.scope ?? "user",
411
+ id: plan.entry.name,
412
+ partial: true,
413
+ recorded: true,
414
+ tree: plan.expectedInstalledDigest,
415
+ },
416
+ ],
417
+ }
418
+ : undefined);
419
+ return installPlugin(plan.sourceRoot, {
420
+ ...(plan.cwd ? { cwd: plan.cwd } : {}),
421
+ scope: plan.scope ?? "user",
422
+ force: plan.force ?? false,
423
+ expectedDigest: plan.sha256,
424
+ expectedId: plan.entry.name,
425
+ expectedKind: plan.entry.kind,
426
+ ...(plan.entry.version ? { expectedVersion: plan.entry.version } : {}),
427
+ ...(expect ? { expect } : {}),
428
+ origin: {
429
+ kind:
430
+ plan.entry.origin === "catalog" || plan.entry.origin === "index"
431
+ ? "catalog"
432
+ : parsePluginGithubSource(plan.entry.sourceUrl)
433
+ ? "github"
434
+ : "local",
435
+ source: plan.entry.sourceUrl,
436
+ },
437
+ });
438
+ }
439
+
440
+ export function installLibraryPlan(plan: LibraryInstallPlan): LibraryInstallResult {
441
+ let recovery: LibraryInstallResult["recovery"];
442
+ try {
443
+ const result = commitLibraryInstallPlan(plan);
444
+ if (!result.plugin || result.diagnostics.some((item) => item.type === "error"))
445
+ throw new Error(
446
+ `${result.diagnostics.map((item) => item.message).join("; ") || "plugin install failed"}${result.recovery ? `; recovery: ${JSON.stringify(result.recovery)}` : ""}`,
447
+ );
448
+ recovery = result.recovery;
449
+ return recovery ? { recovery } : {};
450
+ } finally {
451
+ releaseLibraryPlan(plan);
452
+ }
276
453
  }
277
454
 
278
- export function installLibraryPlan(plan: LibraryInstallPlan): void {
279
- if (existsSync(plan.path)) throw new Error(`library destination already exists: ${plan.path}`);
280
- if (plan.entry.kind === "skill") installSkill({ source: plan.entry.sourceUrl, scope: "user", name: plan.entry.name });
281
- else safeResourceWrite(plan.path, readFileSync(sourceFile(plan.entry)));
282
- recordPin(plan);
455
+ /** Existing paths beat catalog IDs, including a directory named like a curated plugin. */
456
+ export function resolveLibraryPackage(
457
+ source: string,
458
+ options: { cwd?: string; catalog?: string } = {},
459
+ ): PluginCatalogEntry {
460
+ const local = pluginLocalPath(source, options.cwd);
461
+ if (existsSync(local)) {
462
+ const candidate = readPluginManifest(local);
463
+ if (!candidate.valid || !candidate.manifest)
464
+ throw new Error(`invalid plugin: ${candidate.diagnostics.map((item) => item.message).join("; ")}`);
465
+ return {
466
+ kind: candidate.manifest.clio.kind ?? "plugin",
467
+ name: candidate.manifest.name,
468
+ ...(candidate.manifest.clio.requires ? { requires: candidate.manifest.clio.requires } : {}),
469
+ description: candidate.manifest.description ?? "",
470
+ ...(candidate.manifest.version ? { version: candidate.manifest.version } : {}),
471
+ sourceUrl: local,
472
+ origin: "installed",
473
+ };
474
+ }
475
+ const matches = discoverLibrary(options).entries.filter((item) =>
476
+ source.includes(":") ? libraryEntryRef(item) === source : item.name === source,
477
+ );
478
+ if (matches.length > 1) throw new Error(`ambiguous package: ${source}; use kind:name`);
479
+ const entry = matches[0];
480
+ if (entry) return entry;
481
+ if (parsePluginGithubSource(source))
482
+ throw new Error("remote plugin installation requires a catalog entry with version and full-tree sha256 pin");
483
+ throw new Error(`plugin source is neither an existing local directory nor a catalog entry: ${source}`);
484
+ }
485
+
486
+ export function planLibraryUpdate(
487
+ id: string,
488
+ options: { cwd?: string; scope?: PluginScope; force?: boolean; catalog?: string } = {},
489
+ ): LibraryInstallPlan {
490
+ const identity = resolveInstalledLibraryEntry(id, options);
491
+ const plugin = installedPlugin(identity, options);
492
+ if (!plugin) throw new Error(`plugin not installed: ${id}`);
493
+ const pin = libraryEntryPin(identity, { ...options, scope: plugin.scope });
494
+ if (!options.force && pin && pluginContentDigest(plugin.rootPath) !== pin.sha256)
495
+ throw new Error(`plugin_local_changes: ${id}; use --force to replace local changes`);
496
+ const record = readPluginInstallRecord(identity.name, { ...options, scope: plugin.scope });
497
+ if (typeof record?.origin === "object" && record.origin.kind === "interop")
498
+ throw new Error("interop packages require a new reviewed adoption; remove the installed copy and adopt it again");
499
+ const catalogOrigin = record?.origin && typeof record.origin === "object" && record.origin.kind === "catalog";
500
+ const discovery = discoverLibrary(options);
501
+ const catalog = catalogOrigin
502
+ ? discovery.entries.find(
503
+ (entry) => entry.kind === identity.kind && entry.name === identity.name && entry.origin !== "installed",
504
+ )
505
+ : undefined;
506
+ if (catalogOrigin && !catalog)
507
+ throw new Error(
508
+ `plugin catalog source unavailable: ${id}; restore its pinned catalog entry or explicitly install a new source`,
509
+ );
510
+ const entry = catalog ?? (pin ? resolveLibraryPackage(pin.sourceUrl, options) : undefined);
511
+ if (!entry) throw new Error(`plugin has no update source: ${id}`);
512
+ if (entry.name !== identity.name || entry.kind !== identity.kind)
513
+ throw new Error(`package identity mismatch: expected ${id}, found ${libraryEntryRef(entry)}`);
514
+ const requirements = classifyLibraryRequirements(entry, discovery.entries, options);
515
+ if (requirements.inactive?.length)
516
+ throw new Error(
517
+ `library_requirement_inactive: ${requirements.inactive.map(libraryEntryRef).join(", ")}; enable or repair these plugins explicitly`,
518
+ );
519
+ if (requirements.unsatisfied.length)
520
+ throw new Error(
521
+ `library_requirement_missing: ${requirements.unsatisfied.map(libraryEntryRef).join(", ")}; install required resources before updating`,
522
+ );
523
+ const plan = planLibraryInstall(entry, { ...options, scope: plugin.scope, force: true });
524
+ if (!options.force) plan.expectedInstalledDigest = pluginContentDigest(plugin.rootPath);
525
+ return plan;
526
+ }
527
+
528
+ export function removeLibraryEntry(
529
+ entry: Pick<LibraryEntry, "kind" | "name">,
530
+ options: { cwd?: string; scope?: PluginScope; expect?: PluginExpectedState } = {},
531
+ ): LibraryInstallResult {
532
+ const installed = installedPlugin(entry, options);
533
+ if (!installed) throw new Error(`package not installed: ${libraryEntryRef(entry)}`);
534
+ const result = removePlugin(entry.name, { ...options, scope: installed.scope });
535
+ if (result.diagnostics.some((item) => item.type === "error"))
536
+ throw new Error(
537
+ `${result.diagnostics.map((item) => item.message).join("; ")}${result.recovery ? `; recovery: ${JSON.stringify(result.recovery)}` : ""}`,
538
+ );
539
+ return result.recovery ? { recovery: result.recovery } : {};
540
+ }
541
+
542
+ export function pinLibraryEntry(
543
+ entry: LibraryEntry,
544
+ options: LibraryScopeOptions = {},
545
+ ): { sha256: string; sourceUrl: string } {
546
+ const installed = libraryInstallPath(entry, options);
547
+ const pin = libraryEntryPin(entry, options);
548
+ if (!pin) throw new Error(`plugin is not installed with a verified pin: ${entry.name}`);
549
+ if (pluginContentDigest(installed) !== pin.sha256)
550
+ throw new Error(`plugin_local_changes: ${entry.name}; reinstall explicitly to accept changed content`);
551
+ return pin;
552
+ }
553
+
554
+ export function libraryEntryDrift(
555
+ entry: Pick<LibraryEntry, "kind" | "name">,
556
+ options: LibraryScopeOptions = {},
557
+ ): { status: "clean" | "changed" | "missing" | "unpinned"; expected?: string; observed?: string } {
558
+ const installed = libraryInstallPath(entry, options);
559
+ if (!existsSync(installed)) return { status: "missing" };
560
+ const pin = libraryEntryPin(entry, options);
561
+ if (!pin) return { status: "unpinned" };
562
+ const observed = pluginContentDigest(installed);
563
+ return { status: observed === pin.sha256 ? "clean" : "changed", expected: pin.sha256, observed };
283
564
  }
284
565
 
285
566
  function confirmedRemote(): string {