@iowarp/clio-coder 0.4.6 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (657) hide show
  1. package/.claude-plugin/marketplace.json +283 -0
  2. package/CHANGELOG.md +50 -0
  3. package/CONTRIBUTING.md +102 -29
  4. package/NOTICE +8 -0
  5. package/README.md +37 -5
  6. package/dist/{acp-UVEVWSDL.js → acp-W3Y3TRHD.js} +12 -12
  7. package/dist/{agents-VWY37DTK.js → agents-J4ICNLQ3.js} +52 -52
  8. package/dist/assets/codewiki.json +1 -1
  9. package/dist/assets/tui-notices/get-east-asian-width-LICENSE +9 -0
  10. package/dist/assets/tui-notices/marked-LICENSE +44 -0
  11. package/dist/assets/tui-notices/pi-tui-LICENSE +21 -0
  12. package/dist/{auth-PCV2XQDV.js → auth-X2UJUMOC.js} +24 -24
  13. package/dist/{builtins-PD652MTK.js → builtins-XLXWWSRF.js} +6 -6
  14. package/dist/{chunk-DZK63TZJ.js → chunk-24S3DN22.js} +336 -612
  15. package/dist/{chunk-NTK3WTHM.js → chunk-24TOGHPO.js} +2 -2
  16. package/dist/{chunk-M6TAYK66.js → chunk-2O2LVQQK.js} +11 -4
  17. package/dist/{chunk-OQM5IVJY.js → chunk-34XHRVKG.js} +3 -3
  18. package/dist/{chunk-LY4N4TTL.js → chunk-3LXJOICS.js} +2 -2
  19. package/dist/{chunk-3BJGMT2D.js → chunk-3XE4NRLF.js} +1 -1
  20. package/dist/{chunk-N2OKBREN.js → chunk-4MFBBY2Z.js} +3 -3
  21. package/dist/{chunk-5VTJP36Q.js → chunk-4N2RZ4TO.js} +2 -2
  22. package/dist/{chunk-WNGF5AJX.js → chunk-4QKAITQT.js} +3 -3
  23. package/dist/chunk-4UHVS5T7.js +207 -0
  24. package/dist/{chunk-GLYBJ4RQ.js → chunk-5AJPUR72.js} +6 -6
  25. package/dist/{chunk-5CY4Q6QI.js → chunk-5EQO5NWP.js} +105 -3
  26. package/dist/{chunk-6HAO6X5B.js → chunk-65BGHOUR.js} +8 -5
  27. package/dist/{chunk-6VRRJT7L.js → chunk-6CA2BHOR.js} +2 -2
  28. package/dist/{chunk-HL26ADLH.js → chunk-6CB2IL4N.js} +2 -1
  29. package/dist/{chunk-E7RF4KBO.js → chunk-6LRLOJHQ.js} +3 -3
  30. package/dist/{chunk-HXHFDHB6.js → chunk-6TAATXXH.js} +6 -6
  31. package/dist/{chunk-P6M7RKMI.js → chunk-6YHPAAZR.js} +3 -3
  32. package/dist/{chunk-5QRX7SLS.js → chunk-7EEGBKV4.js} +7 -7
  33. package/dist/{chunk-BS4GAMUB.js → chunk-A67NR5AT.js} +2 -2
  34. package/dist/{chunk-WJIMKGD6.js → chunk-BAU36233.js} +8 -8
  35. package/dist/{chunk-PZN2LQY6.js → chunk-BO4XV5VX.js} +4 -4
  36. package/dist/{chunk-I2K2NCZQ.js → chunk-BQQ5MXUC.js} +6 -6
  37. package/dist/{chunk-X3BI7HTV.js → chunk-C3G5PNUO.js} +21 -21
  38. package/dist/{chunk-SRZOW5L2.js → chunk-C6GEXX4L.js} +1 -1
  39. package/dist/{chunk-6RYDAVQT.js → chunk-CE64C5K5.js} +219 -64
  40. package/dist/chunk-CP3HIR5H.js +2119 -0
  41. package/dist/{chunk-BBV5TKE6.js → chunk-CPXGJI2A.js} +2 -2
  42. package/dist/{chunk-IGLVVNEG.js → chunk-CULVKYTK.js} +4 -4
  43. package/dist/{chunk-DXLUVUD4.js → chunk-D2T66PDV.js} +5 -5
  44. package/dist/{chunk-NF3BK5WR.js → chunk-DACXIVVF.js} +5 -5
  45. package/dist/{chunk-IKRWLEDA.js → chunk-DLIYANB7.js} +20 -15
  46. package/dist/{chunk-RGZNQ5CT.js → chunk-DO7M3LSX.js} +9 -9
  47. package/dist/{chunk-2QPI3TR3.js → chunk-DVJL77SO.js} +2 -2
  48. package/dist/{chunk-ODUTYZIU.js → chunk-EUEXGXXR.js} +5 -5
  49. package/dist/{chunk-WKUYQBCG.js → chunk-EUZRMP4Y.js} +18 -16
  50. package/dist/{chunk-JMPL7NUB.js → chunk-G4LGUTOE.js} +4 -4
  51. package/dist/{chunk-CBSKDFWL.js → chunk-GEVQNST4.js} +2 -2
  52. package/dist/{chunk-NNWJYUNO.js → chunk-GFQ7P2UF.js} +7 -7
  53. package/dist/{chunk-SXQKNKRA.js → chunk-GI5RRMAH.js} +14 -14
  54. package/dist/{chunk-HPTJF6DG.js → chunk-GVZFCJHE.js} +336 -83
  55. package/dist/{chunk-ACCKVSHU.js → chunk-GXIWHXDB.js} +3 -3
  56. package/dist/{chunk-LUL5Z66S.js → chunk-HOX4YZ2K.js} +6 -5
  57. package/dist/chunk-HRAKUPIH.js +57 -0
  58. package/dist/{chunk-F5Z7EWMN.js → chunk-IJMW64DX.js} +50 -50
  59. package/dist/{chunk-QNWRHOMF.js → chunk-IMOD2YPV.js} +16 -9
  60. package/dist/{chunk-HZ2T2YED.js → chunk-IQCNVLO6.js} +28 -8
  61. package/dist/{chunk-HZFBVU5X.js → chunk-ISNCCX42.js} +8 -8
  62. package/dist/{chunk-7JSSKXG2.js → chunk-IZYTT3CD.js} +7 -3
  63. package/dist/chunk-KKEYGFX4.js +915 -0
  64. package/dist/{chunk-HHVJNVUJ.js → chunk-KS7ETA3P.js} +2 -2
  65. package/dist/{chunk-BLTEAUCB.js → chunk-L3Z5ANCV.js} +7 -7
  66. package/dist/{chunk-4VMV6OS6.js → chunk-LBFQMYS3.js} +2 -2
  67. package/dist/{chunk-URBGEOH3.js → chunk-M6Z2V6YU.js} +5 -5
  68. package/dist/{chunk-BT7HGDOX.js → chunk-MBJO5VNZ.js} +12 -12
  69. package/dist/chunk-MNQN3X6Y.js +595 -0
  70. package/dist/{chunk-3QKXHCGS.js → chunk-MZHXENL7.js} +5 -5
  71. package/dist/chunk-MZNWZUJM.js +1801 -0
  72. package/dist/{chunk-7YJWEF2L.js → chunk-N37QC5FV.js} +5 -5
  73. package/dist/{chunk-TJFDL26W.js → chunk-NCCQ6DVS.js} +7 -7
  74. package/dist/{chunk-P5JMBPDJ.js → chunk-NO7J45X6.js} +162 -47
  75. package/dist/chunk-OH3YYA3B.js +15 -0
  76. package/dist/{chunk-22PQ4TX4.js → chunk-P4DL2LM5.js} +16 -77
  77. package/dist/{chunk-LIN2K3EL.js → chunk-PFLOULP3.js} +4 -4
  78. package/dist/{chunk-QXFBABFJ.js → chunk-QKWL7SYE.js} +11 -11
  79. package/dist/chunk-RFCKPS2V.js +26 -0
  80. package/dist/{chunk-ZS43Y2FT.js → chunk-RTLNFZMD.js} +12 -4
  81. package/dist/{chunk-U7H5WRG5.js → chunk-RXFPB32E.js} +8 -6
  82. package/dist/{chunk-Q7NNUHQV.js → chunk-SEDI5K5B.js} +16 -16
  83. package/dist/{chunk-WV6TDAPN.js → chunk-SELG4SUR.js} +7 -7
  84. package/dist/{chunk-3WBALRQH.js → chunk-SER7RRAE.js} +27 -832
  85. package/dist/{chunk-K2HL3GBL.js → chunk-T4TY5GG3.js} +165 -15
  86. package/dist/chunk-T7QQBNLH.js +691 -0
  87. package/dist/{chunk-6OII3LOK.js → chunk-TLTGZTXI.js} +3 -3
  88. package/dist/chunk-TZ6UVP2H.js +637 -0
  89. package/dist/{chunk-3JLFK5MW.js → chunk-TZHN5ITX.js} +13 -41
  90. package/dist/{chunk-VANN3GDP.js → chunk-U3TPUXOQ.js} +399 -234
  91. package/dist/{chunk-VHMX7SXF.js → chunk-UA3W4FGC.js} +6 -6
  92. package/dist/{chunk-3O2ZAUGQ.js → chunk-UA6W4XFJ.js} +2 -2
  93. package/dist/chunk-UWD3JD5X.js +709 -0
  94. package/dist/chunk-V4ZKOKRB.js +13433 -0
  95. package/dist/{chunk-NC4KV7EL.js → chunk-VCRVEDUC.js} +5 -5
  96. package/dist/{chunk-4DU2TVI4.js → chunk-VMATUZB6.js} +12 -10
  97. package/dist/{chunk-J2FYEQ5L.js → chunk-VTYHHQ57.js} +2 -2
  98. package/dist/chunk-WB7POC6M.js +891 -0
  99. package/dist/{chunk-3HQVBIKD.js → chunk-WBVKKTUT.js} +2 -2
  100. package/dist/{chunk-EHOSNVVM.js → chunk-WLHX3MM5.js} +6 -2
  101. package/dist/{chunk-24T2YZ7A.js → chunk-WN552PKN.js} +553 -298
  102. package/dist/{chunk-4U4TKZFR.js → chunk-WT5TRMO4.js} +51 -26
  103. package/dist/{chunk-XWMSPJYN.js → chunk-WURGVOZJ.js} +56 -12
  104. package/dist/{chunk-7WUZEB2M.js → chunk-XR3XJN2M.js} +2 -2
  105. package/dist/chunk-XW2UZICE.js +372 -0
  106. package/dist/{chunk-2AKYFREM.js → chunk-XZ6UFQ52.js} +11 -11
  107. package/dist/chunk-Y3JU5RPK.js +8 -0
  108. package/dist/chunk-YKRJTYNP.js +1143 -0
  109. package/dist/{chunk-PWWSIB2A.js → chunk-ZGIGW4ZG.js} +5 -5
  110. package/dist/cli/index.js +34 -36
  111. package/dist/{clio-QQCMTUZE.js → clio-L2P7S2R2.js} +9 -9
  112. package/dist/{code-nav-GUPM6766.js → code-nav-B5LNX4KU.js} +25 -25
  113. package/dist/{components-TNIKXCBH.js → components-63MMQKUT.js} +6 -6
  114. package/dist/{config-IIM7YOD3.js → config-YXARKGTX.js} +70 -67
  115. package/dist/{configure-4ZM5HWJX.js → configure-LMVQJ46J.js} +47 -35
  116. package/dist/{context-OL5P3HEP.js → context-7HJEWTTP.js} +87 -44
  117. package/dist/{context-44BZLJ3J.js → context-XSZKKFBW.js} +14 -14
  118. package/dist/{context-AIDVQKMW.js → context-YG2LZDYZ.js} +60 -58
  119. package/dist/{context-clear-OQV76MYP.js → context-clear-AC5NXHM2.js} +57 -55
  120. package/dist/{context-index-HP2JFUWA.js → context-index-KKTPRV5G.js} +3 -3
  121. package/dist/{context-map-INTXD54D.js → context-map-T7ROR5D5.js} +4 -4
  122. package/dist/{context-working-set-ZUW3EGLS.js → context-working-set-F4Q4J3NS.js} +12 -10
  123. package/dist/{detail-UXPWRANG.js → detail-H73BEF2N.js} +58 -56
  124. package/dist/{dispatch-runner-P3ZW6G77.js → dispatch-runner-3RY5FSJC.js} +74 -72
  125. package/dist/{doctor-JJVGPZWT.js → doctor-EQYJOGUG.js} +44 -30
  126. package/dist/{eval-V2RTN3UH.js → eval-4P7O6CCE.js} +109 -46
  127. package/dist/{evidence-35PYWGSO.js → evidence-D6GUSYJW.js} +57 -55
  128. package/dist/{evidence-CIGGKI6J.js → evidence-O76QF7TZ.js} +62 -59
  129. package/dist/{evolve-33SM3NJP.js → evolve-H47BCETS.js} +58 -56
  130. package/dist/{extensions-YVRHX6ZI.js → extensions-NNL3ZOCU.js} +98 -20
  131. package/dist/{fleet-LFO7SIPC.js → fleet-KMNS6NOM.js} +106 -99
  132. package/dist/{fleet-commands-RLK72GU3.js → fleet-commands-DOWSYCBX.js} +14 -14
  133. package/dist/{fleet-decisions-3SBSCTCW.js → fleet-decisions-S3PTZV2D.js} +9 -9
  134. package/dist/{fleet-graph-JZIBCGMW.js → fleet-graph-F2DE2TME.js} +26 -24
  135. package/dist/{fleet-inspect-2L5YGGZJ.js → fleet-inspect-EN2Q6IVB.js} +60 -57
  136. package/dist/{fleet-preflight-QRSHIIDE.js → fleet-preflight-FRLETDD3.js} +3 -3
  137. package/dist/{fleet-validate-LIAVKDUU.js → fleet-validate-B2XDLS57.js} +28 -29
  138. package/dist/{fleet-verify-JIK3OQZR.js → fleet-verify-4JKUWGJ7.js} +57 -55
  139. package/dist/{fleet-view-IWHYGQKK.js → fleet-view-BHJFW26B.js} +60 -57
  140. package/dist/{init-NJEDOTQW.js → init-XAT5N5YM.js} +79 -74
  141. package/dist/interop-FVECHFKG.js +246 -0
  142. package/dist/{inventory-74UL7UHU.js → inventory-7KFQGLCV.js} +60 -57
  143. package/dist/library-NY2XOT75.js +492 -0
  144. package/dist/library-QAPAO23R.js +306 -0
  145. package/dist/library-import-5Y6MAS3R.js +183 -0
  146. package/dist/library-inventory-JT6HWITQ.js +56 -0
  147. package/dist/library-validation-EQUH25DC.js +42 -0
  148. package/dist/{memory-I76I5VUH.js → memory-DYVTTCP6.js} +58 -56
  149. package/dist/{models-D4YDIQZQ.js → models-MASFJ6Y2.js} +48 -36
  150. package/dist/{monitor-NKVD55HX.js → monitor-YMP4NXJJ.js} +64 -61
  151. package/dist/{orchestrator-I6OATVPK.js → orchestrator-AFQRRTEI.js} +3685 -1841
  152. package/dist/{panes-7BTYH3XQ.js → panes-D3Y2KFG5.js} +4 -4
  153. package/dist/{panes-WPOMEMRH.js → panes-NICTHQCV.js} +7 -7
  154. package/dist/{paths-J3KN7UAO.js → paths-PSFAUIGO.js} +5 -5
  155. package/dist/{preload-EJAWJEIO.js → preload-5Q7VXRFJ.js} +57 -55
  156. package/dist/{reset-4XMQKDNZ.js → reset-7NKZK7JN.js} +9 -9
  157. package/dist/{resources-TVYVXK3Q.js → resources-NILSIZAT.js} +94 -38
  158. package/dist/{run-OWQNNSJU.js → run-BPZGEBZV.js} +121 -105
  159. package/dist/{share-NPZZMUXG.js → share-EZ6ERBMH.js} +31 -28
  160. package/dist/skills-BTVVNYVM.js +100 -0
  161. package/dist/{skills-eval-J5TCKSJA.js → skills-eval-UY34MNK7.js} +110 -72
  162. package/dist/{skills-inventory-7II4DM57.js → skills-inventory-JDHSIA7I.js} +30 -25
  163. package/dist/{slash-commands-MDSDSWYF.js → slash-commands-K4FNQ2AT.js} +49 -46
  164. package/dist/{steer-S7D7IKPU.js → steer-2B3EQGFH.js} +4 -4
  165. package/dist/{support-5VAEC32W.js → support-L2SOL3IE.js} +7 -7
  166. package/dist/{targets-KILZEOCE.js → targets-44VKGFLN.js} +64 -58
  167. package/dist/{tasks-R6P6OV22.js → tasks-3KODKFU7.js} +12 -12
  168. package/dist/{terminal-lease-LZCG2KN3.js → terminal-lease-LXA7MMPO.js} +32 -19
  169. package/dist/{tools-6OCQ6SVB.js → tools-3UB7TEVR.js} +7 -7
  170. package/dist/{trace-JHLXWUMN.js → trace-TAMIU4OJ.js} +5 -4
  171. package/dist/{tui-primitives-RCY2HN7G.js → tui-primitives-A6MUW32V.js} +3 -2
  172. package/dist/{uninstall-FXYMFFRT.js → uninstall-QYVRPEM4.js} +9 -9
  173. package/dist/{upgrade-D2OZH6IQ.js → upgrade-7PMKM2JH.js} +15 -16
  174. package/dist/{usage-PIASNUS4.js → usage-6EQV7EQK.js} +70 -67
  175. package/dist/{verifiers-LTHUY2PX.js → verifiers-JLITWSHU.js} +15 -15
  176. package/dist/{verify-HYF7KBVE.js → verify-T7NAEVIG.js} +13 -13
  177. package/dist/{web-fetch-MQN4FH3X.js → web-fetch-W4TNW4Q7.js} +4 -4
  178. package/dist/{wiki-generate-RK7JQ5NP.js → wiki-generate-T2TJQJUA.js} +81 -76
  179. package/dist/{with-panes-OFTNAR4Y.js → with-panes-CHFC7HGI.js} +4 -4
  180. package/dist/worker/entry.js +283 -76
  181. package/docs/README.md +43 -0
  182. package/docs/architecture/architecture.md +8 -7
  183. package/docs/architecture/artifact-versions.md +3 -3
  184. package/docs/architecture/context-engine.md +35 -1
  185. package/docs/architecture/library.md +32 -0
  186. package/docs/architecture/middleware-and-components.md +1 -1
  187. package/docs/architecture/model-catalog.md +21 -1
  188. package/docs/architecture/pi-boundary.md +18 -0
  189. package/docs/architecture/prompt-envelope-and-tools.md +5 -5
  190. package/docs/architecture/safety-model.md +21 -2
  191. package/docs/architecture/session-lifecycle.md +12 -1
  192. package/docs/architecture/tui-design.md +108 -9
  193. package/docs/architecture/worker-context.md +106 -0
  194. package/docs/guide/authoring-plugins.md +160 -0
  195. package/docs/guide/built-in-agents.md +5 -5
  196. package/docs/guide/commands-and-modes.md +161 -56
  197. package/docs/guide/configuration-and-targets.md +1 -1
  198. package/docs/guide/configuration-reference.md +27 -34
  199. package/docs/guide/environment-variables.md +2 -2
  200. package/docs/guide/exit-codes-and-output.md +1 -1
  201. package/docs/guide/extensions-and-sharing.md +93 -53
  202. package/docs/guide/fleet-dispatch.md +31 -4
  203. package/docs/guide/glossary.md +1 -1
  204. package/docs/guide/harness-extensions.md +291 -0
  205. package/docs/guide/installation-and-lifecycle.md +9 -9
  206. package/docs/guide/interop.md +243 -0
  207. package/docs/guide/panes-and-files.md +3 -3
  208. package/docs/guide/plugins.md +80 -0
  209. package/docs/guide/resource-library.md +111 -45
  210. package/docs/guide/skills-marketplace.md +35 -72
  211. package/docs/guide/tool-usage.md +19 -7
  212. package/docs/guide/troubleshooting.md +1 -1
  213. package/docs/process/development-pipeline.md +14 -14
  214. package/docs/process/documentation-coverage.md +28 -1
  215. package/docs/process/documentation-guide.md +15 -7
  216. package/docs/process/eval-runner.md +8 -3
  217. package/docs/process/performance-methodology.md +1 -1
  218. package/docs/process/release-cut-checklist.md +4 -0
  219. package/docs/process/scientific-validation.md +23 -0
  220. package/evals/scalar-decision-machinery.ts +1 -1
  221. package/examples/extensions/README.md +67 -0
  222. package/examples/extensions/lab-status/clio-coder-extension.json +14 -0
  223. package/examples/extensions/lab-status/extension.mjs +68 -0
  224. package/examples/extensions/lab-status/jobs.synthetic.json +9 -0
  225. package/examples/extensions/measurements/clio-coder-extension.json +28 -0
  226. package/examples/extensions/measurements/summarize.cjs +23 -0
  227. package/library/README.md +109 -0
  228. package/library/_authoring/templates/agent/README.md +28 -0
  229. package/library/_authoring/templates/agent/agents/benchmark-scout.md +30 -0
  230. package/library/_authoring/templates/agent/plugin.json +23 -0
  231. package/library/_authoring/templates/fleet/README.md +29 -0
  232. package/library/_authoring/templates/fleet/fleets/pipeline-review.md +31 -0
  233. package/library/_authoring/templates/fleet/plugin.json +23 -0
  234. package/library/_authoring/templates/plugin/README.md +37 -0
  235. package/library/_authoring/templates/plugin/agents/data-curator.md +31 -0
  236. package/library/_authoring/templates/plugin/assets/curation-guide.md +22 -0
  237. package/library/_authoring/templates/plugin/plugin.json +42 -0
  238. package/library/_authoring/templates/plugin/prompts/inspect-dataset.md +15 -0
  239. package/library/_authoring/templates/plugin/skills/dataset-curation/SKILL.md +36 -0
  240. package/library/_authoring/templates/plugin/skills/dataset-curation/evals.md +17 -0
  241. package/library/_authoring/templates/prompt/README.md +28 -0
  242. package/library/_authoring/templates/prompt/plugin.json +23 -0
  243. package/library/_authoring/templates/prompt/prompts/paper-summary.md +26 -0
  244. package/library/_authoring/templates/skill/README.md +24 -0
  245. package/library/_authoring/templates/skill/SKILL.md +39 -0
  246. package/library/_authoring/templates/skill/evals.md +30 -0
  247. package/library/_authoring/templates/skill/plugin.json +23 -0
  248. package/library/agents/README.md +7 -0
  249. package/library/fleets/README.md +7 -0
  250. package/library/plugins/materio/README.md +137 -0
  251. package/library/plugins/materio/ai.iowarp.clio/agents/materio-lab-definer.md +208 -0
  252. package/library/plugins/materio/ai.iowarp.clio/agents/materio-literature-reviewer.md +308 -0
  253. package/library/plugins/materio/ai.iowarp.clio/agents/materio-research-explorer.md +249 -0
  254. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-executor.md +416 -0
  255. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-verifier.md +60 -0
  256. package/library/plugins/materio/ai.iowarp.clio/agents/materio-workflow-planner.md +238 -0
  257. package/library/plugins/materio/ai.iowarp.clio/fleets/materio-execute-task.md +50 -0
  258. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/add-task.md +66 -0
  259. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/archive-task.md +65 -0
  260. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/checkpoint.md +26 -0
  261. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-research-tasks.md +230 -0
  262. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-virtual-lab.md +181 -0
  263. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/execute-task.md +292 -0
  264. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/help.md +129 -0
  265. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/identify-research.md +206 -0
  266. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/literature-review.md +201 -0
  267. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/pause-research.md +12 -0
  268. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/progress.md +105 -0
  269. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/remove-task.md +63 -0
  270. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/resume-research.md +64 -0
  271. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/settings.md +16 -0
  272. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/status.md +92 -0
  273. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/upload-data.md +104 -0
  274. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/wtfp.md +145 -0
  275. package/library/plugins/materio/ai.iowarp.clio/references/execution.md +56 -0
  276. package/library/plugins/materio/ai.iowarp.portability/provenance.json +9 -0
  277. package/library/plugins/materio/assets/actions/add-task.md +86 -0
  278. package/library/plugins/materio/assets/actions/archive-task.md +84 -0
  279. package/library/plugins/materio/assets/actions/checkpoint.md +47 -0
  280. package/library/plugins/materio/assets/actions/define-research-tasks.md +228 -0
  281. package/library/plugins/materio/assets/actions/define-virtual-lab.md +179 -0
  282. package/library/plugins/materio/assets/actions/execute-task.md +290 -0
  283. package/library/plugins/materio/assets/actions/help.md +140 -0
  284. package/library/plugins/materio/assets/actions/identify-research.md +204 -0
  285. package/library/plugins/materio/assets/actions/literature-review.md +199 -0
  286. package/library/plugins/materio/assets/actions/pause-research.md +34 -0
  287. package/library/plugins/materio/assets/actions/progress.md +125 -0
  288. package/library/plugins/materio/assets/actions/remove-task.md +82 -0
  289. package/library/plugins/materio/assets/actions/resume-research.md +84 -0
  290. package/library/plugins/materio/assets/actions/settings.md +38 -0
  291. package/library/plugins/materio/assets/actions/status.md +112 -0
  292. package/library/plugins/materio/assets/actions/upload-data.md +123 -0
  293. package/library/plugins/materio/assets/actions/wtfp.md +179 -0
  294. package/library/plugins/materio/assets/references/research-domains.md +134 -0
  295. package/library/plugins/materio/assets/references/research-policy.md +77 -0
  296. package/library/plugins/materio/assets/references/traditional-workflows.md +146 -0
  297. package/library/plugins/materio/assets/scripts/check_physics.py +271 -0
  298. package/library/plugins/materio/assets/scripts/check_scripts.py +248 -0
  299. package/library/plugins/materio/assets/scripts/project_plugin.py +165 -0
  300. package/library/plugins/materio/assets/scripts/research_state.py +400 -0
  301. package/library/plugins/materio/assets/scripts/verify_citations.py +616 -0
  302. package/library/plugins/materio/assets/templates/RESEARCH.md +39 -0
  303. package/library/plugins/materio/assets/templates/VIRTUAL-LAB.md +120 -0
  304. package/library/plugins/materio/assets/templates/WORKFLOW.md +42 -0
  305. package/library/plugins/materio/assets/templates/config.json +5 -0
  306. package/library/plugins/materio/evals/scripts.yaml +29 -0
  307. package/library/plugins/materio/plugin.json +530 -0
  308. package/library/plugins/materio/skills/materio-lab-definer/SKILL.md +74 -0
  309. package/library/plugins/materio/skills/materio-literature-reviewer/SKILL.md +64 -0
  310. package/library/plugins/materio/skills/materio-research-explorer/SKILL.md +74 -0
  311. package/library/plugins/materio/skills/materio-task-executor/SKILL.md +214 -0
  312. package/library/plugins/materio/skills/materio-task-verifier/SKILL.md +46 -0
  313. package/library/plugins/materio/skills/materio-workflow-planner/SKILL.md +79 -0
  314. package/library/plugins/materio/tests/test_check_physics.py +139 -0
  315. package/library/plugins/materio/tests/test_check_scripts.py +140 -0
  316. package/library/plugins/materio/tests/test_research_state.py +291 -0
  317. package/library/plugins/materio/tests/test_verify_citations.py +337 -0
  318. package/library/prompts/README.md +7 -0
  319. package/library/registry.yaml +921 -0
  320. package/library/skills/README.md +120 -0
  321. package/{skills → library/skills}/coding/ast-grep/SKILL.md +1 -1
  322. package/{skills → library/skills}/coding/ast-grep/evals.md +1 -1
  323. package/library/skills/coding/ast-grep/plugin.json +23 -0
  324. package/{skills → library/skills}/coding/coding-standards/SKILL.md +1 -1
  325. package/{skills → library/skills}/coding/coding-standards/evals.md +1 -1
  326. package/library/skills/coding/coding-standards/plugin.json +23 -0
  327. package/{skills → library/skills}/coding/prototype/SKILL.md +1 -1
  328. package/{skills → library/skills}/coding/prototype/evals.md +1 -1
  329. package/library/skills/coding/prototype/plugin.json +23 -0
  330. package/{skills → library/skills}/coding/tdd/SKILL.md +1 -1
  331. package/{skills → library/skills}/coding/tdd/evals.md +1 -1
  332. package/library/skills/coding/tdd/plugin.json +23 -0
  333. package/{skills → library/skills}/context/context-handoff/SKILL.md +1 -1
  334. package/{skills → library/skills}/context/context-handoff/evals.md +1 -1
  335. package/library/skills/context/context-handoff/plugin.json +23 -0
  336. package/{skills → library/skills}/context/context-prime/SKILL.md +1 -1
  337. package/{skills → library/skills}/context/context-prime/evals.md +1 -1
  338. package/library/skills/context/context-prime/plugin.json +23 -0
  339. package/{skills → library/skills}/git/branch-closeout/SKILL.md +1 -1
  340. package/library/skills/git/branch-closeout/plugin.json +23 -0
  341. package/{skills → library/skills}/git/file-ticket/SKILL.md +1 -1
  342. package/library/skills/git/file-ticket/plugin.json +23 -0
  343. package/{skills → library/skills}/git/fix-issue/SKILL.md +1 -1
  344. package/library/skills/git/fix-issue/plugin.json +23 -0
  345. package/{skills → library/skills}/git/resolve-merge-conflicts/SKILL.md +1 -1
  346. package/{skills → library/skills}/git/resolve-merge-conflicts/evals.md +1 -1
  347. package/library/skills/git/resolve-merge-conflicts/plugin.json +23 -0
  348. package/{skills → library/skills}/git/ship/SKILL.md +1 -1
  349. package/library/skills/git/ship/plugin.json +23 -0
  350. package/{skills → library/skills}/git/worktree-create/SKILL.md +1 -1
  351. package/library/skills/git/worktree-create/plugin.json +23 -0
  352. package/{skills → library/skills}/git/worktree-merge/SKILL.md +1 -1
  353. package/library/skills/git/worktree-merge/plugin.json +23 -0
  354. package/{skills → library/skills}/meta/clio-coder-dev/SKILL.md +1 -1
  355. package/{skills → library/skills}/meta/clio-coder-dev/evals.md +1 -1
  356. package/library/skills/meta/clio-coder-dev/plugin.json +23 -0
  357. package/{skills → library/skills}/meta/clio-coder-test/SKILL.md +1 -1
  358. package/{skills → library/skills}/meta/clio-coder-test/evals.md +1 -1
  359. package/library/skills/meta/clio-coder-test/plugin.json +23 -0
  360. package/{skills → library/skills}/meta/credentials/SKILL.md +1 -1
  361. package/{skills → library/skills}/meta/credentials/evals.md +1 -1
  362. package/library/skills/meta/credentials/plugin.json +23 -0
  363. package/library/skills/meta/find-skills/SKILL.md +85 -0
  364. package/library/skills/meta/find-skills/evals.md +65 -0
  365. package/library/skills/meta/find-skills/plugin.json +23 -0
  366. package/{skills → library/skills}/meta/herdr/SKILL.md +1 -1
  367. package/{skills → library/skills}/meta/herdr/evals.md +1 -1
  368. package/library/skills/meta/herdr/plugin.json +23 -0
  369. package/{skills → library/skills}/meta/skill-craft/SKILL.md +23 -9
  370. package/{skills → library/skills}/meta/skill-craft/evals.md +11 -3
  371. package/library/skills/meta/skill-craft/plugin.json +23 -0
  372. package/{skills → library/skills}/planning/archify/SKILL.md +13 -13
  373. package/library/skills/planning/archify/plugin.json +23 -0
  374. package/{skills → library/skills}/planning/architecture/SKILL.md +1 -1
  375. package/{skills → library/skills}/planning/architecture/evals.md +1 -1
  376. package/library/skills/planning/architecture/plugin.json +23 -0
  377. package/{skills → library/skills}/planning/backlog/SKILL.md +1 -1
  378. package/{skills → library/skills}/planning/backlog/evals.md +1 -1
  379. package/library/skills/planning/backlog/plugin.json +23 -0
  380. package/{skills → library/skills}/planning/prd/SKILL.md +1 -1
  381. package/{skills → library/skills}/planning/prd/evals.md +1 -1
  382. package/library/skills/planning/prd/plugin.json +23 -0
  383. package/{skills → library/skills}/planning/product-intent/SKILL.md +1 -1
  384. package/{skills → library/skills}/planning/product-intent/evals.md +1 -1
  385. package/library/skills/planning/product-intent/plugin.json +23 -0
  386. package/{skills → library/skills}/planning/tech-spec/SKILL.md +1 -1
  387. package/{skills → library/skills}/planning/tech-spec/evals.md +1 -1
  388. package/library/skills/planning/tech-spec/plugin.json +23 -0
  389. package/{skills → library/skills}/registry.yaml +7 -7
  390. package/{skills → library/skills}/remote.yaml +1 -1
  391. package/{skills → library/skills}/research/arxiv-literature/SKILL.md +1 -1
  392. package/{skills → library/skills}/research/arxiv-literature/evals.md +1 -1
  393. package/library/skills/research/arxiv-literature/plugin.json +23 -0
  394. package/{skills → library/skills}/research/experiment-protocol/SKILL.md +1 -1
  395. package/{skills → library/skills}/research/experiment-protocol/evals.md +1 -1
  396. package/library/skills/research/experiment-protocol/plugin.json +23 -0
  397. package/{skills → library/skills}/research/scientific-debugging/SKILL.md +1 -1
  398. package/{skills → library/skills}/research/scientific-debugging/evals.md +1 -1
  399. package/library/skills/research/scientific-debugging/plugin.json +23 -0
  400. package/{skills → library/skills}/research/scientific-modernization/SKILL.md +1 -1
  401. package/{skills → library/skills}/research/scientific-modernization/evals.md +1 -1
  402. package/library/skills/research/scientific-modernization/plugin.json +23 -0
  403. package/{skills → library/skills}/skill-marketplace.json +37 -37
  404. package/{skills → library/skills}/workflow/cut-it/SKILL.md +1 -1
  405. package/{skills → library/skills}/workflow/cut-it/evals.md +1 -1
  406. package/library/skills/workflow/cut-it/plugin.json +23 -0
  407. package/{skills → library/skills}/workflow/design-council/SKILL.md +1 -1
  408. package/{skills → library/skills}/workflow/design-council/evals.md +1 -1
  409. package/library/skills/workflow/design-council/plugin.json +23 -0
  410. package/{skills → library/skills}/workflow/grill-me/SKILL.md +1 -1
  411. package/{skills → library/skills}/workflow/grill-me/evals.md +1 -1
  412. package/library/skills/workflow/grill-me/plugin.json +23 -0
  413. package/{skills → library/skills}/workflow/workflow-distiller/SKILL.md +14 -11
  414. package/{skills → library/skills}/workflow/workflow-distiller/evals.md +14 -6
  415. package/library/skills/workflow/workflow-distiller/plugin.json +23 -0
  416. package/package.json +12 -5
  417. package/src/cli/agents.ts +1 -1
  418. package/src/cli/config-inspect.ts +1 -1
  419. package/src/cli/configure.ts +2 -2
  420. package/src/cli/eval.ts +40 -6
  421. package/src/cli/extensions.ts +74 -8
  422. package/src/cli/fleet-preflight.ts +2 -0
  423. package/src/cli/fleet.ts +2 -0
  424. package/src/cli/index.ts +1 -3
  425. package/src/cli/interop-inspect.ts +61 -33
  426. package/src/cli/interop.ts +79 -9
  427. package/src/cli/library-import.ts +139 -0
  428. package/src/cli/library.ts +418 -120
  429. package/src/cli/run.ts +26 -9
  430. package/src/cli/skills-eval.ts +43 -6
  431. package/src/cli/skills-inventory.ts +6 -2
  432. package/src/cli/skills.ts +44 -491
  433. package/src/core/bus-events.ts +5 -0
  434. package/src/core/defaults.ts +1 -1
  435. package/src/core/recent-models.ts +2 -2
  436. package/src/core/session-routing.ts +3 -3
  437. package/src/core/state-file-lock.ts +1 -1
  438. package/src/core/tool-names.ts +5 -0
  439. package/src/domains/agents/extension.ts +42 -6
  440. package/src/domains/agents/fleet-commands.ts +92 -1
  441. package/src/domains/agents/fleet-contract.ts +87 -19
  442. package/src/domains/agents/recipe.ts +5 -4
  443. package/src/domains/agents/registry.ts +80 -24
  444. package/src/domains/config/keybindings.ts +155 -95
  445. package/src/domains/context/worker/contract.ts +91 -0
  446. package/src/domains/context/worker/pressure.ts +120 -0
  447. package/src/domains/context/worker/recall.ts +62 -0
  448. package/src/domains/context/worker/select.ts +164 -0
  449. package/src/domains/context/worker/snapshot.ts +35 -0
  450. package/src/domains/context/worker/store.ts +16 -0
  451. package/src/domains/context/working-set/replay/synthetic.ts +2 -1
  452. package/src/domains/dispatch/active-route-planner.ts +2 -0
  453. package/src/domains/dispatch/backoff.ts +1 -0
  454. package/src/domains/dispatch/code-step.ts +12 -2
  455. package/src/domains/dispatch/contract.ts +3 -0
  456. package/src/domains/dispatch/execution-plan.ts +2 -0
  457. package/src/domains/dispatch/extension.ts +109 -27
  458. package/src/domains/dispatch/fleet-plan.ts +10 -0
  459. package/src/domains/dispatch/fleet-run.ts +1 -0
  460. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  461. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  462. package/src/domains/dispatch/state.ts +1 -0
  463. package/src/domains/dispatch/types.ts +5 -0
  464. package/src/domains/dispatch/validation.ts +12 -0
  465. package/src/domains/dispatch/workspace-checkpoint.ts +1 -1
  466. package/src/domains/evidence/failure-attribution.ts +1 -0
  467. package/src/domains/evidence/trust-status.ts +22 -3
  468. package/src/domains/extensions/command-schema.ts +145 -0
  469. package/src/domains/extensions/command-tools.ts +15 -0
  470. package/src/domains/extensions/compatibility.ts +7 -0
  471. package/src/domains/extensions/contract.ts +0 -4
  472. package/src/domains/extensions/discovery.ts +69 -205
  473. package/src/domains/extensions/extension.ts +0 -4
  474. package/src/domains/extensions/index.ts +1 -5
  475. package/src/domains/extensions/manager.ts +1 -6
  476. package/src/domains/extensions/operator-commands.ts +29 -0
  477. package/src/domains/extensions/operator-runtime.ts +483 -0
  478. package/src/domains/extensions/public-api.ts +53 -0
  479. package/src/domains/extensions/runtime-child.mjs +114 -0
  480. package/src/domains/extensions/runtime-process.ts +306 -0
  481. package/src/domains/extensions/runtime-schema.ts +146 -0
  482. package/src/domains/extensions/{resources.ts → snapshot-access.ts} +1 -17
  483. package/src/domains/extensions/snapshot.ts +4 -32
  484. package/src/domains/extensions/state.ts +5 -83
  485. package/src/domains/extensions/types.ts +33 -34
  486. package/src/domains/interop/adopt.ts +546 -0
  487. package/src/domains/interop/detect.ts +50 -12
  488. package/src/domains/interop/foreign.ts +554 -0
  489. package/src/domains/interop/import.ts +277 -0
  490. package/src/domains/interop/index.ts +24 -0
  491. package/src/domains/interop/install.ts +6 -0
  492. package/src/domains/interop/inventory.ts +351 -0
  493. package/src/domains/interop/projection.ts +360 -0
  494. package/src/domains/interop/registry.ts +106 -3
  495. package/src/domains/interop/types.ts +51 -0
  496. package/src/domains/lifecycle/migrations/index.ts +0 -2
  497. package/src/domains/lifecycle/naming-resources.ts +1 -1
  498. package/src/domains/middleware/marketplace-offer.ts +1 -1
  499. package/src/domains/mux/contract.ts +1 -1
  500. package/src/domains/plugins/catalog.ts +204 -0
  501. package/src/domains/plugins/contract.ts +24 -0
  502. package/src/domains/plugins/discovery.ts +316 -0
  503. package/src/domains/plugins/extension.ts +40 -0
  504. package/src/domains/plugins/index.ts +77 -0
  505. package/src/domains/plugins/integrity.ts +6 -0
  506. package/src/domains/plugins/manifest.ts +3 -0
  507. package/src/domains/plugins/resources.ts +102 -0
  508. package/src/domains/plugins/state.ts +753 -0
  509. package/src/domains/plugins/types.ts +217 -0
  510. package/src/domains/prompts/extension.ts +9 -2
  511. package/src/domains/prompts/fragments/operating/skills.md +10 -10
  512. package/src/domains/resources/common-loader.ts +9 -6
  513. package/src/domains/resources/index.ts +67 -0
  514. package/src/domains/resources/library-actions.ts +836 -0
  515. package/src/domains/resources/library-evals.ts +38 -0
  516. package/src/domains/resources/library-inventory.ts +1048 -0
  517. package/src/domains/resources/library-types.ts +50 -0
  518. package/src/domains/resources/library-validation.ts +634 -0
  519. package/src/domains/resources/library.ts +437 -156
  520. package/src/domains/resources/package-references.ts +66 -0
  521. package/src/domains/resources/prompts/loader.ts +75 -41
  522. package/src/domains/resources/skills/install.ts +2 -2
  523. package/src/domains/resources/skills/loader.ts +77 -22
  524. package/src/domains/resources/skills/marketplace.ts +48 -57
  525. package/src/domains/resources/skills/promotion.ts +2 -2
  526. package/src/domains/resources/skills/provenance-pin.ts +17 -4
  527. package/src/domains/safety/action-classifier.ts +2 -2
  528. package/src/domains/safety/default-path-policy.ts +3 -1
  529. package/src/domains/safety/policy-engine.ts +1 -1
  530. package/src/domains/safety/protected-artifacts.ts +21 -5
  531. package/src/domains/safety/skill-authority.ts +5 -2
  532. package/src/domains/share/archive.ts +1 -1
  533. package/src/engine/apis/openai-completions.ts +52 -2
  534. package/src/engine/notices/pi-tui-LICENSE +21 -0
  535. package/src/engine/tui.ts +3 -0
  536. package/src/engine/worker-runtime.ts +58 -14
  537. package/src/engine/worker-tools.ts +5 -0
  538. package/src/entry/orchestrator.ts +26 -5
  539. package/src/entry/plugin-reload.ts +18 -0
  540. package/src/interactive/application-controller.ts +67 -21
  541. package/src/interactive/chat-loop.ts +32 -5
  542. package/src/interactive/chat-panel.ts +5 -1
  543. package/src/interactive/clio-editor.ts +53 -21
  544. package/src/interactive/command-output.ts +56 -1
  545. package/src/interactive/editor-submit.ts +65 -28
  546. package/src/interactive/fleet-run-preview.ts +2 -0
  547. package/src/interactive/follow-up-queue-panel.ts +3 -3
  548. package/src/interactive/footer/dashboard.ts +4 -1
  549. package/src/interactive/footer/notifications.ts +2 -2
  550. package/src/interactive/footer/widgets.ts +2 -2
  551. package/src/interactive/interactive-application.ts +209 -21
  552. package/src/interactive/interactive-input-runtime.ts +254 -7
  553. package/src/interactive/interactive-presentation.ts +41 -12
  554. package/src/interactive/interactive-slash-runtime.ts +37 -8
  555. package/src/interactive/keybinding-manager.ts +156 -79
  556. package/src/interactive/keyboard-owner.ts +37 -0
  557. package/src/interactive/leader-key.ts +49 -102
  558. package/src/interactive/leader-menu.ts +45 -0
  559. package/src/interactive/overlay-ask-user-lifecycle.ts +9 -1
  560. package/src/interactive/overlay-frame.ts +15 -0
  561. package/src/interactive/overlay-key-routing.ts +46 -47
  562. package/src/interactive/overlay-lifecycle.ts +30 -15
  563. package/src/interactive/overlay-resource-openers.ts +56 -46
  564. package/src/interactive/overlays/ask-user.ts +630 -556
  565. package/src/interactive/overlays/extension-panel.ts +70 -0
  566. package/src/interactive/overlays/extensions.ts +28 -5
  567. package/src/interactive/overlays/fleet-run-approval.ts +7 -3
  568. package/src/interactive/overlays/help-reference.ts +89 -40
  569. package/src/interactive/overlays/interop.ts +122 -3
  570. package/src/interactive/overlays/keybinding-detail.ts +2 -2
  571. package/src/interactive/overlays/library-lifecycle.ts +90 -0
  572. package/src/interactive/overlays/library-model.ts +574 -0
  573. package/src/interactive/overlays/library-review.ts +557 -0
  574. package/src/interactive/overlays/library-tabs.ts +3 -15
  575. package/src/interactive/overlays/library.ts +602 -0
  576. package/src/interactive/overlays/list-overlay.ts +218 -39
  577. package/src/interactive/overlays/model-selector.ts +28 -25
  578. package/src/interactive/overlays/session-selector.ts +9 -3
  579. package/src/interactive/overlays/settings.ts +25 -18
  580. package/src/interactive/overlays/tree-selector.ts +16 -11
  581. package/src/interactive/permission-hint.ts +13 -0
  582. package/src/interactive/permission-overlay.ts +77 -28
  583. package/src/interactive/prompt-source-label.ts +21 -0
  584. package/src/interactive/renderers/reference-card.ts +35 -0
  585. package/src/interactive/renderers/worker-entry.ts +35 -3
  586. package/src/interactive/slash-autocomplete.ts +99 -1
  587. package/src/interactive/slash-commands.ts +390 -67
  588. package/src/interactive/slash-spec.ts +0 -1
  589. package/src/interactive/terminal-lease.ts +44 -12
  590. package/src/interactive/turn-queues.ts +8 -7
  591. package/src/interactive/turn-runtime.ts +1 -1
  592. package/src/interactive/view/view-overlay.ts +19 -14
  593. package/src/interactive/welcome-dashboard.ts +525 -408
  594. package/src/tools/bootstrap.ts +8 -0
  595. package/src/tools/builtin-tool-catalog.ts +7 -2
  596. package/src/tools/context/index.ts +58 -5
  597. package/src/tools/context/library.ts +465 -0
  598. package/src/tools/context/surface.ts +20 -6
  599. package/src/tools/core-bootstrap.ts +3 -0
  600. package/src/tools/dispatch-admission.ts +24 -1
  601. package/src/tools/dispatch-arguments.ts +8 -0
  602. package/src/tools/dispatch-plan.ts +32 -0
  603. package/src/tools/dispatch-schema.ts +31 -1
  604. package/src/tools/dispatch-types.ts +3 -0
  605. package/src/tools/dispatch.ts +1 -1
  606. package/src/tools/harness-extensions.ts +169 -0
  607. package/src/tools/observation.ts +4 -0
  608. package/src/tools/policy.ts +7 -1
  609. package/src/tools/registry.ts +19 -1
  610. package/src/tools/worker-evidence.ts +5 -0
  611. package/src/worker/context-seed.ts +192 -0
  612. package/src/worker/entry.ts +1 -0
  613. package/src/worker/spec-contract.ts +8 -1
  614. package/dist/chunk-3UW3KU4A.js +0 -21
  615. package/dist/chunk-536HXRFE.js +0 -1257
  616. package/dist/chunk-B3MOMLJ4.js +0 -433
  617. package/dist/chunk-CXQ37WJH.js +0 -45
  618. package/dist/chunk-KTFSFCVN.js +0 -46
  619. package/dist/chunk-QCOV5DFY.js +0 -911
  620. package/dist/chunk-QRFXEO6Y.js +0 -17
  621. package/dist/chunk-VAHLPXPY.js +0 -399
  622. package/dist/interop-RVCAYECG.js +0 -115
  623. package/dist/library-CTKZA7K3.js +0 -226
  624. package/dist/skills-OXFEAWMT.js +0 -510
  625. package/skills/README.md +0 -418
  626. package/skills/meta/find-skills/SKILL.md +0 -78
  627. package/skills/meta/find-skills/evals.md +0 -47
  628. package/src/domains/extensions/resource-path.ts +0 -27
  629. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +0 -27
  630. package/src/interactive/overlays/agents.ts +0 -70
  631. package/src/interactive/overlays/library-install-confirm.ts +0 -152
  632. package/src/interactive/overlays/prompts.ts +0 -89
  633. package/src/interactive/overlays/skills-hub.ts +0 -615
  634. /package/{skills → library/skills}/coding/ast-grep/references/rule_reference.md +0 -0
  635. /package/{skills → library/skills}/coding/prototype/references/LOGIC.md +0 -0
  636. /package/{skills → library/skills}/coding/prototype/references/UI.md +0 -0
  637. /package/{skills → library/skills}/coding/tdd/references/mocking.md +0 -0
  638. /package/{skills → library/skills}/coding/tdd/references/tests.md +0 -0
  639. /package/{skills → library/skills}/context/context-handoff/scripts/new-handoff.sh +0 -0
  640. /package/{skills → library/skills}/git/branch-closeout/evals.md +0 -0
  641. /package/{skills → library/skills}/git/branch-closeout/references/closeout-checklist.md +0 -0
  642. /package/{skills → library/skills}/git/file-ticket/assets/issue-template.md +0 -0
  643. /package/{skills → library/skills}/git/file-ticket/evals.md +0 -0
  644. /package/{skills → library/skills}/git/file-ticket/references/issue-discovery.md +0 -0
  645. /package/{skills → library/skills}/git/fix-issue/evals.md +0 -0
  646. /package/{skills → library/skills}/git/fix-issue/references/diagnosis-and-rca.md +0 -0
  647. /package/{skills → library/skills}/git/resolve-merge-conflicts/references/conflict-matrix.md +0 -0
  648. /package/{skills → library/skills}/git/ship/assets/pr-template.md +0 -0
  649. /package/{skills → library/skills}/git/ship/evals.md +0 -0
  650. /package/{skills → library/skills}/git/ship/references/remote-and-branch-policy.md +0 -0
  651. /package/{skills → library/skills}/git/worktree-create/evals.md +0 -0
  652. /package/{skills → library/skills}/git/worktree-create/references/worktree-setup.md +0 -0
  653. /package/{skills → library/skills}/git/worktree-merge/evals.md +0 -0
  654. /package/{skills → library/skills}/git/worktree-merge/references/merge-strategies.md +0 -0
  655. /package/{skills → library/skills}/meta/clio-coder-test/references/harness.md +0 -0
  656. /package/{skills → library/skills}/meta/clio-coder-test/references/test-map.md +0 -0
  657. /package/{skills → library/skills}/planning/archify/evals.md +0 -0
@@ -1,615 +0,0 @@
1
- import type {
2
- LibraryDiscoveryResult,
3
- LibraryEntry,
4
- LibraryEntryKind,
5
- LibraryInstallPlan,
6
- LibraryRequirementStatus,
7
- MarketplaceDiscoveryResult,
8
- MarketplaceSkill,
9
- ResourceList,
10
- Skill,
11
- } from "../../domains/resources/index.js";
12
- import {
13
- classifyLibraryRequirements,
14
- discoverLibrary,
15
- discoverMarketplaceSkills,
16
- installLibraryPlan,
17
- libraryEntryInstalled,
18
- libraryEntryPin,
19
- libraryEntryRef,
20
- libraryInstallPath,
21
- MARKETPLACE_UNCONFIGURED,
22
- planLibraryInstall,
23
- } from "../../domains/resources/index.js";
24
- import type { OverlayHandle, TUI } from "../../engine/tui.js";
25
- import type { NoticeLevel } from "../command-output.js";
26
- import { clioTheme, GLYPH } from "../theme/index.js";
27
- import type { LibraryInstallConfirmSubject } from "./library-install-confirm.js";
28
- import { openLibraryInstallConfirmOverlay } from "./library-install-confirm.js";
29
- import { isLibraryTab, LIBRARY_TABS } from "./library-tabs.js";
30
- import { type ListOverlayItem, type ListOverlayTab, openListOverlay } from "./list-overlay.js";
31
-
32
- /**
33
- * The Skills Hub: one multipane surface for every resource Clio can reach.
34
- *
35
- * The Skills tab is the original view. Installed skills group by scope,
36
- * marketplace rows come from the same local marketplace lookup the installer
37
- * and `/skill <name>` resolve through, Enter inserts the invocation into the
38
- * editor, and `i` installs in place. The hub lists nothing the resolver cannot
39
- * resolve; when the lookup is empty the hub says so and names the remedy
40
- * instead of drawing an inventory.
41
- *
42
- * The Agents, Prompts, and Fleets tabs are the interactive half of the resource
43
- * library. Their rows come from the same `discoverLibrary()` the CLI's
44
- * `library list --kind` reads, their install runs the same plan-then-write pair
45
- * `library add` runs behind the same confirmation the `--yes` gate expresses,
46
- * and their requirement gate is the same classifier. Nothing here reaches
47
- * around the library domain into a private path.
48
- */
49
-
50
- const GROUP_PROJECT = "Project";
51
- const GROUP_USER = "User";
52
- const GROUP_MARKETPLACE = "Marketplace";
53
- const GROUP_DIAGNOSTICS = "Diagnostics";
54
- const GROUP_INSTALLED = "Installed";
55
- const GROUP_AVAILABLE = "Available";
56
-
57
- export { isLibraryTab, LIBRARY_TABS };
58
-
59
- export const SKILLS_HUB_TITLE = "Skills Hub";
60
-
61
- /** Row id prefix for a library row, which is how an action tells the tabs apart. */
62
- export const LIBRARY_ROW_PREFIX = "library:";
63
-
64
- /** @internal exported for contract tests */
65
- export const SKILLS_HUB_EMPTY =
66
- "no skills installed and no local marketplace configured. install one with `clio-coder skills install <path|github-url>`, or point CLIO_CODER_SKILL_CATALOG_DIR at a skills/ catalog.";
67
-
68
- export interface SkillsHubDeps {
69
- listSkills: () => ResourceList<Skill>;
70
- setEditorText: (text: string) => void;
71
- notice: (level: NoticeLevel, text: string) => void;
72
- /** Installs a marketplace skill by name; rejection text reaches the user. */
73
- installSkill: (name: string) => Promise<{ name: string; path: string; warnings: string[] }>;
74
- onClose: () => void;
75
- /** Injectable for tests; defaults to the local marketplace the installer uses. */
76
- discoverMarketplace?: () => MarketplaceDiscoveryResult;
77
- /** Tab the hub opens on. `/skills` opens on Skills, `/library <kind>` on that kind. */
78
- initialTab?: LibraryEntryKind;
79
- /** Injectable for tests; defaults to the discovery `library list` reads. */
80
- discoverLibrary?: () => LibraryDiscoveryResult;
81
- /** Injectable for tests; defaults to the classifier `library add` gates on. */
82
- classifyRequirements?: (entry: LibraryEntry, catalog: ReadonlyArray<LibraryEntry>) => LibraryRequirementStatus;
83
- /** Injectable for tests; defaults to the planner `library add` prints from. */
84
- planInstall?: (entry: LibraryEntry) => LibraryInstallPlan;
85
- /** Injectable for tests; defaults to the writer `library add --yes` runs. */
86
- installPlan?: (plan: LibraryInstallPlan) => void;
87
- /** Injectable for tests; defaults to the pin-and-destination check the domain owns. */
88
- entryInstalled?: (entry: LibraryEntry) => boolean;
89
- /** Injectable for tests; defaults to the recorded pin for this entry. */
90
- entryPin?: (entry: LibraryEntry) => { sha256: string; sourceUrl: string } | undefined;
91
- /**
92
- * The confirmation gate. Resolves true only when the operator accepted, and
93
- * nothing is written before it does. Defaults to the framed confirmation
94
- * overlay, which is the TUI spelling of `library add`'s `--yes`.
95
- */
96
- confirmInstall?: (subject: LibraryInstallConfirmSubject) => Promise<boolean>;
97
- /** Opens the `/fleet run` approval preview for an installed fleet. */
98
- openFleetRun?: (name: string) => void;
99
- }
100
-
101
- /** Row and action context for one library tab, resolved once per rebuild. */
102
- interface LibraryTabContext {
103
- discovery: LibraryDiscoveryResult;
104
- installed: (entry: LibraryEntry) => boolean;
105
- pin: (entry: LibraryEntry) => { sha256: string; sourceUrl: string } | undefined;
106
- unresolved: (entry: LibraryEntry) => LibraryEntry[];
107
- }
108
-
109
- /**
110
- * The composer text or the surface a `use` on this entry leads to.
111
- *
112
- * A fleet has no composer spelling because its `use` opens the `/fleet run`
113
- * approval preview instead, so this returns null for one and the caller routes
114
- * it there.
115
- */
116
- function libraryUseInvocation(entry: Pick<LibraryEntry, "kind" | "name">): string | null {
117
- if (entry.kind === "fleet") return null;
118
- if (entry.kind === "agent") return `/run ${entry.name} `;
119
- if (entry.kind === "prompt") return `/${entry.name} `;
120
- return `/skill ${entry.name} `;
121
- }
122
-
123
- function groupForScope(scope: string): string {
124
- if (scope === "project") return GROUP_PROJECT;
125
- if (scope === "user") return GROUP_USER;
126
- return scope.charAt(0).toUpperCase() + scope.slice(1);
127
- }
128
-
129
- function diagnosticTouchesSkill(diagnosticPath: string | undefined, skill: Skill): boolean {
130
- if (!diagnosticPath) return false;
131
- return diagnosticPath === skill.filePath || diagnosticPath.startsWith(skill.baseDir);
132
- }
133
-
134
- /**
135
- * The SKILL.md body without its frontmatter block. A file with no frontmatter,
136
- * or an unterminated one, is all body; the loader has already reported those as
137
- * diagnostics, so the detail pane shows the text rather than an error.
138
- */
139
- function skillBody(content: string): string {
140
- const lines = content.split(/\r?\n/);
141
- if (lines[0]?.trim() !== "---") return content;
142
- const end = lines.findIndex((line, index) => index > 0 && line.trim() === "---");
143
- if (end === -1) return content;
144
- return lines
145
- .slice(end + 1)
146
- .join("\n")
147
- .trim();
148
- }
149
-
150
- /** @internal exported for contract tests */
151
- function buildInstalledItems(list: ResourceList<Skill>): ListOverlayItem[] {
152
- return list.items.map((skill) => {
153
- const theme = clioTheme();
154
- const flagged = list.diagnostics.some((diag) => diagnosticTouchesSkill(diag.path, skill));
155
- const metaParts = [`${skill.scope}/${skill.source}`];
156
- if (!skill.trusted) metaParts.push("untrusted");
157
- if (flagged) metaParts.push(theme.fg("warning", GLYPH.warnInline));
158
- return {
159
- id: skill.name,
160
- label: skill.name,
161
- meta: metaParts.join(" · "),
162
- group: groupForScope(skill.scope),
163
- detail: () => {
164
- const lines = [
165
- `# ${skill.name}`,
166
- `**Invoke:** \`/skill ${skill.name} [task]\``,
167
- `**Source:** \`${skill.filePath}\``,
168
- `**Scope:** ${skill.scope}/${skill.source}${skill.trusted ? "" : " (untrusted)"}`,
169
- ];
170
- if (flagged) {
171
- const messages = list.diagnostics
172
- .filter((diag) => diagnosticTouchesSkill(diag.path, skill))
173
- .map((diag) => `- ${diag.type}: ${diag.message}`);
174
- lines.push("", "**Diagnostics:**", ...messages);
175
- }
176
- const body = skillBody(skill.content);
177
- lines.push("", "---", "", body.length > 0 ? body : skill.description);
178
- return lines;
179
- },
180
- };
181
- });
182
- }
183
-
184
- /** @internal exported for contract tests */
185
- function buildMarketplaceItems(
186
- skills: ReadonlyArray<MarketplaceSkill>,
187
- installed: ReadonlySet<string>,
188
- ): ListOverlayItem[] {
189
- const items: ListOverlayItem[] = [];
190
- const seen = new Set<string>();
191
- for (const skill of skills) {
192
- if (installed.has(skill.name) || seen.has(skill.name)) continue;
193
- seen.add(skill.name);
194
- const metaParts: string[] = [skill.origin];
195
- if (skill.version) metaParts.push(`v${skill.version}`);
196
- items.push({
197
- id: `marketplace:${skill.name}`,
198
- label: skill.name,
199
- meta: metaParts.join(" · "),
200
- group: GROUP_MARKETPLACE,
201
- detail: () => [
202
- `# ${skill.name}`,
203
- `**Invoke:** \`/skill ${skill.name} [task]\` (prompts to install first)`,
204
- "**Install now:** press `i`",
205
- `**Source:** \`${skill.sourceUrl}\``,
206
- `**Origin:** ${skill.origin}${skill.category ? ` (${skill.category})` : ""}${skill.audit ? ` · audit ${skill.audit}` : ""}`,
207
- "",
208
- "---",
209
- "",
210
- skill.description,
211
- ],
212
- });
213
- }
214
- return items;
215
- }
216
-
217
- /** @internal exported for contract tests */
218
- function buildDiagnosticItems(
219
- list: ResourceList<Skill>,
220
- marketplaceDiagnostics: ReadonlyArray<string> = [],
221
- ): ListOverlayItem[] {
222
- const theme = clioTheme();
223
- const items = list.diagnostics.map((diag, index) => {
224
- const marker = diag.type === "error" ? theme.fg("error", GLYPH.error) : theme.fg("warning", GLYPH.warnInline);
225
- return {
226
- id: `diagnostic-${index}`,
227
- label: `${marker} ${diag.message}`,
228
- ...(diag.path ? { meta: diag.path } : {}),
229
- group: GROUP_DIAGNOSTICS,
230
- detail: () => [
231
- "# Skill diagnostic",
232
- `**Severity:** ${diag.type}`,
233
- `**Message:** ${diag.message}`,
234
- `**File:** ${diag.path ?? "(unknown)"}`,
235
- ],
236
- };
237
- });
238
- // An unconfigured marketplace is the empty state, not a diagnostic; anything
239
- // else the lookup reports (an unreadable index, a broken catalog package) is
240
- // a real failure and gets its own row.
241
- for (const message of marketplaceDiagnostics) {
242
- if (message === MARKETPLACE_UNCONFIGURED) continue;
243
- items.push({
244
- id: `marketplace-diagnostic-${items.length}`,
245
- label: `${theme.fg("warning", GLYPH.warnInline)} ${message}`,
246
- meta: "marketplace",
247
- group: GROUP_DIAGNOSTICS,
248
- detail: () => ["# Marketplace diagnostic", `**Message:** ${message}`],
249
- });
250
- }
251
- return items;
252
- }
253
-
254
- /** @internal exported for contract tests */
255
- function libraryRowId(entry: Pick<LibraryEntry, "kind" | "name">): string {
256
- return `${LIBRARY_ROW_PREFIX}${libraryEntryRef(entry)}`;
257
- }
258
-
259
- /**
260
- * One kind's rows: the same columns the Skills tab shows where they apply, plus
261
- * the requirements this entry still needs.
262
- *
263
- * The requires column carries the names rather than a count, because the names
264
- * are what the refusal will say and what the second confirmation will install.
265
- * It renders in the warning token: an entry with an unmet requirement is
266
- * listable and readable but not installable on its own.
267
- *
268
- * @internal exported for contract tests
269
- */
270
- function buildLibraryItems(kind: LibraryEntryKind, context: LibraryTabContext): ListOverlayItem[] {
271
- const theme = clioTheme();
272
- return context.discovery.entries
273
- .filter((entry) => entry.kind === kind)
274
- .map((entry) => {
275
- const installed = context.installed(entry);
276
- const pin = context.pin(entry);
277
- const unresolved = context.unresolved(entry).map(libraryEntryRef);
278
- const metaParts: string[] = [entry.origin];
279
- if (entry.version) metaParts.push(`v${entry.version}`);
280
- metaParts.push(installed ? "installed" : "available");
281
- metaParts.push(pin ? `pin ${pin.sha256.slice(0, 8)}` : "unpinned");
282
- if (unresolved.length > 0) metaParts.push(theme.fg("warning", `requires ${unresolved.join(", ")}`));
283
- return {
284
- id: libraryRowId(entry),
285
- label: entry.name,
286
- meta: metaParts.join(" · "),
287
- group: installed ? GROUP_INSTALLED : GROUP_AVAILABLE,
288
- detail: () => {
289
- const use = libraryUseInvocation(entry);
290
- const lines = [
291
- `# ${entry.name}`,
292
- `**Kind:** ${entry.kind}`,
293
- `**Use:** ${use === null ? "`Enter` opens the /fleet run approval preview" : `\`${use.trim()}\``}`,
294
- `**State:** ${installed ? "installed" : "available"}${pin ? ` · pinned ${pin.sha256.slice(0, 12)}` : " · unpinned"}`,
295
- `**Destination:** \`${libraryInstallPath(entry)}\``,
296
- `**Source:** \`${entry.sourceUrl}\``,
297
- `**Origin:** ${entry.origin}`,
298
- ];
299
- if ((entry.requires ?? []).length > 0) {
300
- lines.push(`**Requires:** ${(entry.requires ?? []).join(", ")}`);
301
- }
302
- if (unresolved.length > 0) {
303
- lines.push(`**Unresolved:** ${unresolved.join(", ")}`, "", "Press `i` twice to install them with it.");
304
- } else if (!installed) {
305
- lines.push("", "**Install now:** press `i`");
306
- }
307
- lines.push("", "---", "", entry.description);
308
- return lines;
309
- },
310
- };
311
- });
312
- }
313
-
314
- /**
315
- * Diagnostic rows for a library tab. `discoverLibrary` drops an entry whose
316
- * requirements are missing, malformed, or cyclic and records why; a tab that
317
- * silently omitted those would be the inventory this hub refuses to draw.
318
- *
319
- * @internal exported for contract tests
320
- */
321
- function buildLibraryDiagnosticItems(discovery: LibraryDiscoveryResult): ListOverlayItem[] {
322
- const theme = clioTheme();
323
- return discovery.diagnostics
324
- .filter((message) => message !== MARKETPLACE_UNCONFIGURED)
325
- .map((message, index) => ({
326
- id: `library-diagnostic-${index}`,
327
- label: `${theme.fg("warning", GLYPH.warnInline)} ${message}`,
328
- meta: "library",
329
- group: GROUP_DIAGNOSTICS,
330
- detail: () => ["# Library diagnostic", `**Message:** ${message}`],
331
- }));
332
- }
333
-
334
- /** What one attempted library install did, in the terms the hub reports it. */
335
- export type LibraryInstallOutcome =
336
- | { status: "installed"; refs: string[] }
337
- | { status: "cancelled" }
338
- | { status: "refused"; unresolved: string[] }
339
- | { status: "already-installed" }
340
- | { status: "failed"; message: string };
341
-
342
- /** The library domain calls one install needs, resolved before it runs. */
343
- export interface LibraryInstallRunner {
344
- discovery: LibraryDiscoveryResult;
345
- classify: (entry: LibraryEntry, catalog: ReadonlyArray<LibraryEntry>) => LibraryRequirementStatus;
346
- plan: (entry: LibraryEntry) => LibraryInstallPlan;
347
- write: (plan: LibraryInstallPlan) => void;
348
- installed: (entry: LibraryEntry) => boolean;
349
- confirm: (subject: LibraryInstallConfirmSubject) => Promise<boolean>;
350
- }
351
-
352
- /**
353
- * Install one library entry through the same sequence `library add` runs.
354
- *
355
- * The order is the CLI's order and the refusals are the CLI's refusals: an
356
- * entry with an unmet requirement is refused by name and nothing is planned, a
357
- * plan is built and shown before anything is written, and the writes happen
358
- * only after the confirmation resolves true. A cancelled confirmation is a run
359
- * in which no file changed.
360
- *
361
- * @internal exported for contract tests
362
- */
363
- async function runLibraryInstall(
364
- entry: LibraryEntry,
365
- runner: LibraryInstallRunner,
366
- options: { withRequirements: boolean },
367
- ): Promise<LibraryInstallOutcome> {
368
- if (runner.installed(entry)) return { status: "already-installed" };
369
- let requirements: LibraryRequirementStatus;
370
- let plans: LibraryInstallPlan[];
371
- try {
372
- requirements = runner.classify(entry, runner.discovery.entries);
373
- if (requirements.unsatisfied.length > 0 && !options.withRequirements) {
374
- return { status: "refused", unresolved: requirements.unsatisfied.map(libraryEntryRef) };
375
- }
376
- plans = [...(options.withRequirements ? requirements.unsatisfied : []), entry].map(runner.plan);
377
- } catch (error) {
378
- return { status: "failed", message: error instanceof Error ? error.message : String(error) };
379
- }
380
- const accepted = await runner.confirm({
381
- entryRef: libraryEntryRef(entry),
382
- writes: plans.map((plan) => ({ ref: libraryEntryRef(plan.entry), path: plan.path, sha256: plan.sha256 })),
383
- requirements: options.withRequirements ? requirements.unsatisfied.map(libraryEntryRef) : [],
384
- satisfied: requirements.satisfied.map(libraryEntryRef),
385
- });
386
- if (!accepted) return { status: "cancelled" };
387
- const written: string[] = [];
388
- try {
389
- for (const plan of plans) {
390
- runner.write(plan);
391
- written.push(libraryEntryRef(plan.entry));
392
- }
393
- } catch (error) {
394
- return { status: "failed", message: error instanceof Error ? error.message : String(error) };
395
- }
396
- return { status: "installed", refs: written };
397
- }
398
-
399
- export function openSkillsHub(tui: TUI, deps: SkillsHubDeps): OverlayHandle {
400
- const discoverMarketplace = deps.discoverMarketplace ?? (() => discoverMarketplaceSkills());
401
- const readLibrary = deps.discoverLibrary ?? (() => discoverLibrary());
402
- const classify = deps.classifyRequirements ?? classifyLibraryRequirements;
403
- const plan = deps.planInstall ?? planLibraryInstall;
404
- const write = deps.installPlan ?? installLibraryPlan;
405
- const installed = deps.entryInstalled ?? libraryEntryInstalled;
406
- const pin = deps.entryPin ?? libraryEntryPin;
407
-
408
- // Rebuilt rather than mutated in place: the view memoizes its frame on the row
409
- // set, so a spliced array leaves an installed skill drawn as installable.
410
- const buildRows = (): ListOverlayItem[] => {
411
- const list = deps.listSkills();
412
- const discovery = discoverMarketplace();
413
- const installedNames = new Set(list.items.map((skill) => skill.name));
414
- return [
415
- ...buildInstalledItems(list),
416
- ...buildMarketplaceItems(discovery.skills, installedNames),
417
- ...buildDiagnosticItems(list, discovery.diagnostics),
418
- ];
419
- };
420
-
421
- // One discovery pass feeds all three library tabs. The tab bar asks every tab
422
- // for its rows on each rebuild, and four independent catalog reads per
423
- // keystroke would be four answers to the same question.
424
- let libraryCache: LibraryTabContext | null = null;
425
- const libraryContext = (): LibraryTabContext => {
426
- if (libraryCache) return libraryCache;
427
- const discovery = readLibrary();
428
- libraryCache = {
429
- discovery,
430
- installed,
431
- pin,
432
- unresolved: (entry) => {
433
- try {
434
- return classify(entry, discovery.entries).unsatisfied;
435
- } catch {
436
- // A requirement that will not resolve is already a diagnostic row on
437
- // this tab; a row that cannot answer the question reports none rather
438
- // than taking the whole rebuild down.
439
- return [];
440
- }
441
- },
442
- };
443
- return libraryCache;
444
- };
445
- const invalidateLibrary = (): void => {
446
- libraryCache = null;
447
- };
448
-
449
- const buildLibraryRows = (kind: LibraryEntryKind): ListOverlayItem[] => {
450
- const context = libraryContext();
451
- return [...buildLibraryItems(kind, context), ...buildLibraryDiagnosticItems(context.discovery)];
452
- };
453
-
454
- const entryForRow = (item: ListOverlayItem): LibraryEntry | undefined => {
455
- if (!item.id.startsWith(LIBRARY_ROW_PREFIX)) return undefined;
456
- const ref = item.id.slice(LIBRARY_ROW_PREFIX.length);
457
- return libraryContext().discovery.entries.find((candidate) => libraryEntryRef(candidate) === ref);
458
- };
459
-
460
- const tabs: ListOverlayTab[] = LIBRARY_TABS.map((tab) => ({
461
- id: tab.id,
462
- label: tab.label,
463
- items: tab.id === "skill" ? buildRows : () => buildLibraryRows(tab.id),
464
- }));
465
-
466
- let closed = false;
467
- let installInFlight = false;
468
- /**
469
- * The row whose requirements were just refused. A second `i` on that row is
470
- * the install-with-requirements offer, so the refusal names what is missing
471
- * before any confirmation lists what would be written.
472
- */
473
- let pendingWithRequirements: string | null = null;
474
-
475
- const columns = (): number => (typeof process.stdout.columns === "number" ? process.stdout.columns : 100);
476
-
477
- // eslint-disable-next-line prefer-const -- the confirmation closure needs the handle it is opened from.
478
- let handle: ReturnType<typeof openListOverlay>;
479
-
480
- const confirmInstall =
481
- deps.confirmInstall ??
482
- ((subject: LibraryInstallConfirmSubject): Promise<boolean> =>
483
- new Promise<boolean>((resolve) => {
484
- handle.setHidden(true);
485
- const settle = (accepted: boolean): void => {
486
- if (!closed) {
487
- handle.setHidden(false);
488
- handle.focus();
489
- }
490
- resolve(accepted);
491
- };
492
- const confirmation = openLibraryInstallConfirmOverlay(tui, {
493
- subject,
494
- columns: columns(),
495
- onAccept: () => {
496
- settle(true);
497
- confirmation.hide();
498
- },
499
- onCancel: () => {
500
- settle(false);
501
- confirmation.hide();
502
- },
503
- });
504
- }));
505
-
506
- const useEntry = (entry: LibraryEntry): void => {
507
- if (!installed(entry)) {
508
- deps.notice("warn", `${libraryEntryRef(entry)} is not installed; press i to install it`);
509
- return;
510
- }
511
- if (entry.kind === "fleet") {
512
- deps.openFleetRun?.(entry.name);
513
- return;
514
- }
515
- const invocation = libraryUseInvocation(entry);
516
- if (invocation === null) return;
517
- deps.setEditorText(invocation);
518
- deps.onClose();
519
- };
520
-
521
- const installEntry = (entry: LibraryEntry): void => {
522
- const ref = libraryEntryRef(entry);
523
- const withRequirements = pendingWithRequirements === ref;
524
- installInFlight = true;
525
- void (async () => {
526
- const outcome = await runLibraryInstall(
527
- entry,
528
- { discovery: libraryContext().discovery, classify, plan, write, installed, confirm: confirmInstall },
529
- { withRequirements },
530
- );
531
- installInFlight = false;
532
- if (outcome.status === "refused") {
533
- pendingWithRequirements = ref;
534
- deps.notice("error", `${ref} needs ${outcome.unresolved.join(", ")}; press i again to install them with it`);
535
- return;
536
- }
537
- pendingWithRequirements = null;
538
- if (outcome.status === "already-installed") deps.notice("info", `${ref} is already installed`);
539
- else if (outcome.status === "cancelled") deps.notice("info", `${ref}: cancelled; nothing was written`);
540
- else if (outcome.status === "failed") deps.notice("error", `library install failed: ${outcome.message}`);
541
- else deps.notice("success", `installed ${outcome.refs.join(", ")}`);
542
- // An install that lands after the hub closed has nothing to redraw.
543
- if (!closed && outcome.status === "installed") {
544
- invalidateLibrary();
545
- handle.refreshTabs();
546
- }
547
- })();
548
- };
549
-
550
- handle = openListOverlay(tui, {
551
- markerId: "skills-hub",
552
- title: SKILLS_HUB_TITLE,
553
- items: [],
554
- tabs,
555
- ...(deps.initialTab ? { activeTabId: deps.initialTab } : {}),
556
- onTabChange: () => {
557
- pendingWithRequirements = null;
558
- },
559
- filterable: true,
560
- layout: "split",
561
- emptyMessage: SKILLS_HUB_EMPTY,
562
- hints: [
563
- { key: "Enter", verb: "use" },
564
- { key: "i", verb: "install" },
565
- ],
566
- onSelect: (item) => {
567
- if (item.group === GROUP_DIAGNOSTICS) return;
568
- const entry = entryForRow(item);
569
- if (entry) {
570
- useEntry(entry);
571
- return;
572
- }
573
- const name = item.id.startsWith("marketplace:") ? item.id.slice("marketplace:".length) : item.id;
574
- deps.setEditorText(`/skill ${name} `);
575
- deps.onClose();
576
- },
577
- actions: {
578
- i: (item) => {
579
- if (installInFlight) return;
580
- const entry = entryForRow(item);
581
- if (entry) {
582
- installEntry(entry);
583
- return;
584
- }
585
- if (!item.id.startsWith("marketplace:")) return;
586
- const name = item.id.slice("marketplace:".length);
587
- installInFlight = true;
588
- void (async () => {
589
- try {
590
- const result = await deps.installSkill(name);
591
- for (const warning of result.warnings) deps.notice("warn", `skill ${name}: ${warning}`);
592
- deps.notice("success", `installed skill ${name} at ${result.path}`);
593
- } catch (err) {
594
- deps.notice("error", `skill install failed: ${err instanceof Error ? err.message : String(err)}`);
595
- } finally {
596
- installInFlight = false;
597
- if (!closed) {
598
- invalidateLibrary();
599
- handle.refreshTabs();
600
- }
601
- }
602
- })();
603
- },
604
- },
605
- onClose: deps.onClose,
606
- });
607
-
608
- return {
609
- ...handle,
610
- hide(): void {
611
- closed = true;
612
- handle.hide();
613
- },
614
- };
615
- }
File without changes