@iowarp/clio-coder 0.4.6 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (657) hide show
  1. package/.claude-plugin/marketplace.json +283 -0
  2. package/CHANGELOG.md +50 -0
  3. package/CONTRIBUTING.md +102 -29
  4. package/NOTICE +8 -0
  5. package/README.md +37 -5
  6. package/dist/{acp-UVEVWSDL.js → acp-W3Y3TRHD.js} +12 -12
  7. package/dist/{agents-VWY37DTK.js → agents-J4ICNLQ3.js} +52 -52
  8. package/dist/assets/codewiki.json +1 -1
  9. package/dist/assets/tui-notices/get-east-asian-width-LICENSE +9 -0
  10. package/dist/assets/tui-notices/marked-LICENSE +44 -0
  11. package/dist/assets/tui-notices/pi-tui-LICENSE +21 -0
  12. package/dist/{auth-PCV2XQDV.js → auth-X2UJUMOC.js} +24 -24
  13. package/dist/{builtins-PD652MTK.js → builtins-XLXWWSRF.js} +6 -6
  14. package/dist/{chunk-DZK63TZJ.js → chunk-24S3DN22.js} +336 -612
  15. package/dist/{chunk-NTK3WTHM.js → chunk-24TOGHPO.js} +2 -2
  16. package/dist/{chunk-M6TAYK66.js → chunk-2O2LVQQK.js} +11 -4
  17. package/dist/{chunk-OQM5IVJY.js → chunk-34XHRVKG.js} +3 -3
  18. package/dist/{chunk-LY4N4TTL.js → chunk-3LXJOICS.js} +2 -2
  19. package/dist/{chunk-3BJGMT2D.js → chunk-3XE4NRLF.js} +1 -1
  20. package/dist/{chunk-N2OKBREN.js → chunk-4MFBBY2Z.js} +3 -3
  21. package/dist/{chunk-5VTJP36Q.js → chunk-4N2RZ4TO.js} +2 -2
  22. package/dist/{chunk-WNGF5AJX.js → chunk-4QKAITQT.js} +3 -3
  23. package/dist/chunk-4UHVS5T7.js +207 -0
  24. package/dist/{chunk-GLYBJ4RQ.js → chunk-5AJPUR72.js} +6 -6
  25. package/dist/{chunk-5CY4Q6QI.js → chunk-5EQO5NWP.js} +105 -3
  26. package/dist/{chunk-6HAO6X5B.js → chunk-65BGHOUR.js} +8 -5
  27. package/dist/{chunk-6VRRJT7L.js → chunk-6CA2BHOR.js} +2 -2
  28. package/dist/{chunk-HL26ADLH.js → chunk-6CB2IL4N.js} +2 -1
  29. package/dist/{chunk-E7RF4KBO.js → chunk-6LRLOJHQ.js} +3 -3
  30. package/dist/{chunk-HXHFDHB6.js → chunk-6TAATXXH.js} +6 -6
  31. package/dist/{chunk-P6M7RKMI.js → chunk-6YHPAAZR.js} +3 -3
  32. package/dist/{chunk-5QRX7SLS.js → chunk-7EEGBKV4.js} +7 -7
  33. package/dist/{chunk-BS4GAMUB.js → chunk-A67NR5AT.js} +2 -2
  34. package/dist/{chunk-WJIMKGD6.js → chunk-BAU36233.js} +8 -8
  35. package/dist/{chunk-PZN2LQY6.js → chunk-BO4XV5VX.js} +4 -4
  36. package/dist/{chunk-I2K2NCZQ.js → chunk-BQQ5MXUC.js} +6 -6
  37. package/dist/{chunk-X3BI7HTV.js → chunk-C3G5PNUO.js} +21 -21
  38. package/dist/{chunk-SRZOW5L2.js → chunk-C6GEXX4L.js} +1 -1
  39. package/dist/{chunk-6RYDAVQT.js → chunk-CE64C5K5.js} +219 -64
  40. package/dist/chunk-CP3HIR5H.js +2119 -0
  41. package/dist/{chunk-BBV5TKE6.js → chunk-CPXGJI2A.js} +2 -2
  42. package/dist/{chunk-IGLVVNEG.js → chunk-CULVKYTK.js} +4 -4
  43. package/dist/{chunk-DXLUVUD4.js → chunk-D2T66PDV.js} +5 -5
  44. package/dist/{chunk-NF3BK5WR.js → chunk-DACXIVVF.js} +5 -5
  45. package/dist/{chunk-IKRWLEDA.js → chunk-DLIYANB7.js} +20 -15
  46. package/dist/{chunk-RGZNQ5CT.js → chunk-DO7M3LSX.js} +9 -9
  47. package/dist/{chunk-2QPI3TR3.js → chunk-DVJL77SO.js} +2 -2
  48. package/dist/{chunk-ODUTYZIU.js → chunk-EUEXGXXR.js} +5 -5
  49. package/dist/{chunk-WKUYQBCG.js → chunk-EUZRMP4Y.js} +18 -16
  50. package/dist/{chunk-JMPL7NUB.js → chunk-G4LGUTOE.js} +4 -4
  51. package/dist/{chunk-CBSKDFWL.js → chunk-GEVQNST4.js} +2 -2
  52. package/dist/{chunk-NNWJYUNO.js → chunk-GFQ7P2UF.js} +7 -7
  53. package/dist/{chunk-SXQKNKRA.js → chunk-GI5RRMAH.js} +14 -14
  54. package/dist/{chunk-HPTJF6DG.js → chunk-GVZFCJHE.js} +336 -83
  55. package/dist/{chunk-ACCKVSHU.js → chunk-GXIWHXDB.js} +3 -3
  56. package/dist/{chunk-LUL5Z66S.js → chunk-HOX4YZ2K.js} +6 -5
  57. package/dist/chunk-HRAKUPIH.js +57 -0
  58. package/dist/{chunk-F5Z7EWMN.js → chunk-IJMW64DX.js} +50 -50
  59. package/dist/{chunk-QNWRHOMF.js → chunk-IMOD2YPV.js} +16 -9
  60. package/dist/{chunk-HZ2T2YED.js → chunk-IQCNVLO6.js} +28 -8
  61. package/dist/{chunk-HZFBVU5X.js → chunk-ISNCCX42.js} +8 -8
  62. package/dist/{chunk-7JSSKXG2.js → chunk-IZYTT3CD.js} +7 -3
  63. package/dist/chunk-KKEYGFX4.js +915 -0
  64. package/dist/{chunk-HHVJNVUJ.js → chunk-KS7ETA3P.js} +2 -2
  65. package/dist/{chunk-BLTEAUCB.js → chunk-L3Z5ANCV.js} +7 -7
  66. package/dist/{chunk-4VMV6OS6.js → chunk-LBFQMYS3.js} +2 -2
  67. package/dist/{chunk-URBGEOH3.js → chunk-M6Z2V6YU.js} +5 -5
  68. package/dist/{chunk-BT7HGDOX.js → chunk-MBJO5VNZ.js} +12 -12
  69. package/dist/chunk-MNQN3X6Y.js +595 -0
  70. package/dist/{chunk-3QKXHCGS.js → chunk-MZHXENL7.js} +5 -5
  71. package/dist/chunk-MZNWZUJM.js +1801 -0
  72. package/dist/{chunk-7YJWEF2L.js → chunk-N37QC5FV.js} +5 -5
  73. package/dist/{chunk-TJFDL26W.js → chunk-NCCQ6DVS.js} +7 -7
  74. package/dist/{chunk-P5JMBPDJ.js → chunk-NO7J45X6.js} +162 -47
  75. package/dist/chunk-OH3YYA3B.js +15 -0
  76. package/dist/{chunk-22PQ4TX4.js → chunk-P4DL2LM5.js} +16 -77
  77. package/dist/{chunk-LIN2K3EL.js → chunk-PFLOULP3.js} +4 -4
  78. package/dist/{chunk-QXFBABFJ.js → chunk-QKWL7SYE.js} +11 -11
  79. package/dist/chunk-RFCKPS2V.js +26 -0
  80. package/dist/{chunk-ZS43Y2FT.js → chunk-RTLNFZMD.js} +12 -4
  81. package/dist/{chunk-U7H5WRG5.js → chunk-RXFPB32E.js} +8 -6
  82. package/dist/{chunk-Q7NNUHQV.js → chunk-SEDI5K5B.js} +16 -16
  83. package/dist/{chunk-WV6TDAPN.js → chunk-SELG4SUR.js} +7 -7
  84. package/dist/{chunk-3WBALRQH.js → chunk-SER7RRAE.js} +27 -832
  85. package/dist/{chunk-K2HL3GBL.js → chunk-T4TY5GG3.js} +165 -15
  86. package/dist/chunk-T7QQBNLH.js +691 -0
  87. package/dist/{chunk-6OII3LOK.js → chunk-TLTGZTXI.js} +3 -3
  88. package/dist/chunk-TZ6UVP2H.js +637 -0
  89. package/dist/{chunk-3JLFK5MW.js → chunk-TZHN5ITX.js} +13 -41
  90. package/dist/{chunk-VANN3GDP.js → chunk-U3TPUXOQ.js} +399 -234
  91. package/dist/{chunk-VHMX7SXF.js → chunk-UA3W4FGC.js} +6 -6
  92. package/dist/{chunk-3O2ZAUGQ.js → chunk-UA6W4XFJ.js} +2 -2
  93. package/dist/chunk-UWD3JD5X.js +709 -0
  94. package/dist/chunk-V4ZKOKRB.js +13433 -0
  95. package/dist/{chunk-NC4KV7EL.js → chunk-VCRVEDUC.js} +5 -5
  96. package/dist/{chunk-4DU2TVI4.js → chunk-VMATUZB6.js} +12 -10
  97. package/dist/{chunk-J2FYEQ5L.js → chunk-VTYHHQ57.js} +2 -2
  98. package/dist/chunk-WB7POC6M.js +891 -0
  99. package/dist/{chunk-3HQVBIKD.js → chunk-WBVKKTUT.js} +2 -2
  100. package/dist/{chunk-EHOSNVVM.js → chunk-WLHX3MM5.js} +6 -2
  101. package/dist/{chunk-24T2YZ7A.js → chunk-WN552PKN.js} +553 -298
  102. package/dist/{chunk-4U4TKZFR.js → chunk-WT5TRMO4.js} +51 -26
  103. package/dist/{chunk-XWMSPJYN.js → chunk-WURGVOZJ.js} +56 -12
  104. package/dist/{chunk-7WUZEB2M.js → chunk-XR3XJN2M.js} +2 -2
  105. package/dist/chunk-XW2UZICE.js +372 -0
  106. package/dist/{chunk-2AKYFREM.js → chunk-XZ6UFQ52.js} +11 -11
  107. package/dist/chunk-Y3JU5RPK.js +8 -0
  108. package/dist/chunk-YKRJTYNP.js +1143 -0
  109. package/dist/{chunk-PWWSIB2A.js → chunk-ZGIGW4ZG.js} +5 -5
  110. package/dist/cli/index.js +34 -36
  111. package/dist/{clio-QQCMTUZE.js → clio-L2P7S2R2.js} +9 -9
  112. package/dist/{code-nav-GUPM6766.js → code-nav-B5LNX4KU.js} +25 -25
  113. package/dist/{components-TNIKXCBH.js → components-63MMQKUT.js} +6 -6
  114. package/dist/{config-IIM7YOD3.js → config-YXARKGTX.js} +70 -67
  115. package/dist/{configure-4ZM5HWJX.js → configure-LMVQJ46J.js} +47 -35
  116. package/dist/{context-OL5P3HEP.js → context-7HJEWTTP.js} +87 -44
  117. package/dist/{context-44BZLJ3J.js → context-XSZKKFBW.js} +14 -14
  118. package/dist/{context-AIDVQKMW.js → context-YG2LZDYZ.js} +60 -58
  119. package/dist/{context-clear-OQV76MYP.js → context-clear-AC5NXHM2.js} +57 -55
  120. package/dist/{context-index-HP2JFUWA.js → context-index-KKTPRV5G.js} +3 -3
  121. package/dist/{context-map-INTXD54D.js → context-map-T7ROR5D5.js} +4 -4
  122. package/dist/{context-working-set-ZUW3EGLS.js → context-working-set-F4Q4J3NS.js} +12 -10
  123. package/dist/{detail-UXPWRANG.js → detail-H73BEF2N.js} +58 -56
  124. package/dist/{dispatch-runner-P3ZW6G77.js → dispatch-runner-3RY5FSJC.js} +74 -72
  125. package/dist/{doctor-JJVGPZWT.js → doctor-EQYJOGUG.js} +44 -30
  126. package/dist/{eval-V2RTN3UH.js → eval-4P7O6CCE.js} +109 -46
  127. package/dist/{evidence-35PYWGSO.js → evidence-D6GUSYJW.js} +57 -55
  128. package/dist/{evidence-CIGGKI6J.js → evidence-O76QF7TZ.js} +62 -59
  129. package/dist/{evolve-33SM3NJP.js → evolve-H47BCETS.js} +58 -56
  130. package/dist/{extensions-YVRHX6ZI.js → extensions-NNL3ZOCU.js} +98 -20
  131. package/dist/{fleet-LFO7SIPC.js → fleet-KMNS6NOM.js} +106 -99
  132. package/dist/{fleet-commands-RLK72GU3.js → fleet-commands-DOWSYCBX.js} +14 -14
  133. package/dist/{fleet-decisions-3SBSCTCW.js → fleet-decisions-S3PTZV2D.js} +9 -9
  134. package/dist/{fleet-graph-JZIBCGMW.js → fleet-graph-F2DE2TME.js} +26 -24
  135. package/dist/{fleet-inspect-2L5YGGZJ.js → fleet-inspect-EN2Q6IVB.js} +60 -57
  136. package/dist/{fleet-preflight-QRSHIIDE.js → fleet-preflight-FRLETDD3.js} +3 -3
  137. package/dist/{fleet-validate-LIAVKDUU.js → fleet-validate-B2XDLS57.js} +28 -29
  138. package/dist/{fleet-verify-JIK3OQZR.js → fleet-verify-4JKUWGJ7.js} +57 -55
  139. package/dist/{fleet-view-IWHYGQKK.js → fleet-view-BHJFW26B.js} +60 -57
  140. package/dist/{init-NJEDOTQW.js → init-XAT5N5YM.js} +79 -74
  141. package/dist/interop-FVECHFKG.js +246 -0
  142. package/dist/{inventory-74UL7UHU.js → inventory-7KFQGLCV.js} +60 -57
  143. package/dist/library-NY2XOT75.js +492 -0
  144. package/dist/library-QAPAO23R.js +306 -0
  145. package/dist/library-import-5Y6MAS3R.js +183 -0
  146. package/dist/library-inventory-JT6HWITQ.js +56 -0
  147. package/dist/library-validation-EQUH25DC.js +42 -0
  148. package/dist/{memory-I76I5VUH.js → memory-DYVTTCP6.js} +58 -56
  149. package/dist/{models-D4YDIQZQ.js → models-MASFJ6Y2.js} +48 -36
  150. package/dist/{monitor-NKVD55HX.js → monitor-YMP4NXJJ.js} +64 -61
  151. package/dist/{orchestrator-I6OATVPK.js → orchestrator-AFQRRTEI.js} +3685 -1841
  152. package/dist/{panes-7BTYH3XQ.js → panes-D3Y2KFG5.js} +4 -4
  153. package/dist/{panes-WPOMEMRH.js → panes-NICTHQCV.js} +7 -7
  154. package/dist/{paths-J3KN7UAO.js → paths-PSFAUIGO.js} +5 -5
  155. package/dist/{preload-EJAWJEIO.js → preload-5Q7VXRFJ.js} +57 -55
  156. package/dist/{reset-4XMQKDNZ.js → reset-7NKZK7JN.js} +9 -9
  157. package/dist/{resources-TVYVXK3Q.js → resources-NILSIZAT.js} +94 -38
  158. package/dist/{run-OWQNNSJU.js → run-BPZGEBZV.js} +121 -105
  159. package/dist/{share-NPZZMUXG.js → share-EZ6ERBMH.js} +31 -28
  160. package/dist/skills-BTVVNYVM.js +100 -0
  161. package/dist/{skills-eval-J5TCKSJA.js → skills-eval-UY34MNK7.js} +110 -72
  162. package/dist/{skills-inventory-7II4DM57.js → skills-inventory-JDHSIA7I.js} +30 -25
  163. package/dist/{slash-commands-MDSDSWYF.js → slash-commands-K4FNQ2AT.js} +49 -46
  164. package/dist/{steer-S7D7IKPU.js → steer-2B3EQGFH.js} +4 -4
  165. package/dist/{support-5VAEC32W.js → support-L2SOL3IE.js} +7 -7
  166. package/dist/{targets-KILZEOCE.js → targets-44VKGFLN.js} +64 -58
  167. package/dist/{tasks-R6P6OV22.js → tasks-3KODKFU7.js} +12 -12
  168. package/dist/{terminal-lease-LZCG2KN3.js → terminal-lease-LXA7MMPO.js} +32 -19
  169. package/dist/{tools-6OCQ6SVB.js → tools-3UB7TEVR.js} +7 -7
  170. package/dist/{trace-JHLXWUMN.js → trace-TAMIU4OJ.js} +5 -4
  171. package/dist/{tui-primitives-RCY2HN7G.js → tui-primitives-A6MUW32V.js} +3 -2
  172. package/dist/{uninstall-FXYMFFRT.js → uninstall-QYVRPEM4.js} +9 -9
  173. package/dist/{upgrade-D2OZH6IQ.js → upgrade-7PMKM2JH.js} +15 -16
  174. package/dist/{usage-PIASNUS4.js → usage-6EQV7EQK.js} +70 -67
  175. package/dist/{verifiers-LTHUY2PX.js → verifiers-JLITWSHU.js} +15 -15
  176. package/dist/{verify-HYF7KBVE.js → verify-T7NAEVIG.js} +13 -13
  177. package/dist/{web-fetch-MQN4FH3X.js → web-fetch-W4TNW4Q7.js} +4 -4
  178. package/dist/{wiki-generate-RK7JQ5NP.js → wiki-generate-T2TJQJUA.js} +81 -76
  179. package/dist/{with-panes-OFTNAR4Y.js → with-panes-CHFC7HGI.js} +4 -4
  180. package/dist/worker/entry.js +283 -76
  181. package/docs/README.md +43 -0
  182. package/docs/architecture/architecture.md +8 -7
  183. package/docs/architecture/artifact-versions.md +3 -3
  184. package/docs/architecture/context-engine.md +35 -1
  185. package/docs/architecture/library.md +32 -0
  186. package/docs/architecture/middleware-and-components.md +1 -1
  187. package/docs/architecture/model-catalog.md +21 -1
  188. package/docs/architecture/pi-boundary.md +18 -0
  189. package/docs/architecture/prompt-envelope-and-tools.md +5 -5
  190. package/docs/architecture/safety-model.md +21 -2
  191. package/docs/architecture/session-lifecycle.md +12 -1
  192. package/docs/architecture/tui-design.md +108 -9
  193. package/docs/architecture/worker-context.md +106 -0
  194. package/docs/guide/authoring-plugins.md +160 -0
  195. package/docs/guide/built-in-agents.md +5 -5
  196. package/docs/guide/commands-and-modes.md +161 -56
  197. package/docs/guide/configuration-and-targets.md +1 -1
  198. package/docs/guide/configuration-reference.md +27 -34
  199. package/docs/guide/environment-variables.md +2 -2
  200. package/docs/guide/exit-codes-and-output.md +1 -1
  201. package/docs/guide/extensions-and-sharing.md +93 -53
  202. package/docs/guide/fleet-dispatch.md +31 -4
  203. package/docs/guide/glossary.md +1 -1
  204. package/docs/guide/harness-extensions.md +291 -0
  205. package/docs/guide/installation-and-lifecycle.md +9 -9
  206. package/docs/guide/interop.md +243 -0
  207. package/docs/guide/panes-and-files.md +3 -3
  208. package/docs/guide/plugins.md +80 -0
  209. package/docs/guide/resource-library.md +111 -45
  210. package/docs/guide/skills-marketplace.md +35 -72
  211. package/docs/guide/tool-usage.md +19 -7
  212. package/docs/guide/troubleshooting.md +1 -1
  213. package/docs/process/development-pipeline.md +14 -14
  214. package/docs/process/documentation-coverage.md +28 -1
  215. package/docs/process/documentation-guide.md +15 -7
  216. package/docs/process/eval-runner.md +8 -3
  217. package/docs/process/performance-methodology.md +1 -1
  218. package/docs/process/release-cut-checklist.md +4 -0
  219. package/docs/process/scientific-validation.md +23 -0
  220. package/evals/scalar-decision-machinery.ts +1 -1
  221. package/examples/extensions/README.md +67 -0
  222. package/examples/extensions/lab-status/clio-coder-extension.json +14 -0
  223. package/examples/extensions/lab-status/extension.mjs +68 -0
  224. package/examples/extensions/lab-status/jobs.synthetic.json +9 -0
  225. package/examples/extensions/measurements/clio-coder-extension.json +28 -0
  226. package/examples/extensions/measurements/summarize.cjs +23 -0
  227. package/library/README.md +109 -0
  228. package/library/_authoring/templates/agent/README.md +28 -0
  229. package/library/_authoring/templates/agent/agents/benchmark-scout.md +30 -0
  230. package/library/_authoring/templates/agent/plugin.json +23 -0
  231. package/library/_authoring/templates/fleet/README.md +29 -0
  232. package/library/_authoring/templates/fleet/fleets/pipeline-review.md +31 -0
  233. package/library/_authoring/templates/fleet/plugin.json +23 -0
  234. package/library/_authoring/templates/plugin/README.md +37 -0
  235. package/library/_authoring/templates/plugin/agents/data-curator.md +31 -0
  236. package/library/_authoring/templates/plugin/assets/curation-guide.md +22 -0
  237. package/library/_authoring/templates/plugin/plugin.json +42 -0
  238. package/library/_authoring/templates/plugin/prompts/inspect-dataset.md +15 -0
  239. package/library/_authoring/templates/plugin/skills/dataset-curation/SKILL.md +36 -0
  240. package/library/_authoring/templates/plugin/skills/dataset-curation/evals.md +17 -0
  241. package/library/_authoring/templates/prompt/README.md +28 -0
  242. package/library/_authoring/templates/prompt/plugin.json +23 -0
  243. package/library/_authoring/templates/prompt/prompts/paper-summary.md +26 -0
  244. package/library/_authoring/templates/skill/README.md +24 -0
  245. package/library/_authoring/templates/skill/SKILL.md +39 -0
  246. package/library/_authoring/templates/skill/evals.md +30 -0
  247. package/library/_authoring/templates/skill/plugin.json +23 -0
  248. package/library/agents/README.md +7 -0
  249. package/library/fleets/README.md +7 -0
  250. package/library/plugins/materio/README.md +137 -0
  251. package/library/plugins/materio/ai.iowarp.clio/agents/materio-lab-definer.md +208 -0
  252. package/library/plugins/materio/ai.iowarp.clio/agents/materio-literature-reviewer.md +308 -0
  253. package/library/plugins/materio/ai.iowarp.clio/agents/materio-research-explorer.md +249 -0
  254. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-executor.md +416 -0
  255. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-verifier.md +60 -0
  256. package/library/plugins/materio/ai.iowarp.clio/agents/materio-workflow-planner.md +238 -0
  257. package/library/plugins/materio/ai.iowarp.clio/fleets/materio-execute-task.md +50 -0
  258. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/add-task.md +66 -0
  259. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/archive-task.md +65 -0
  260. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/checkpoint.md +26 -0
  261. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-research-tasks.md +230 -0
  262. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-virtual-lab.md +181 -0
  263. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/execute-task.md +292 -0
  264. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/help.md +129 -0
  265. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/identify-research.md +206 -0
  266. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/literature-review.md +201 -0
  267. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/pause-research.md +12 -0
  268. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/progress.md +105 -0
  269. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/remove-task.md +63 -0
  270. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/resume-research.md +64 -0
  271. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/settings.md +16 -0
  272. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/status.md +92 -0
  273. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/upload-data.md +104 -0
  274. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/wtfp.md +145 -0
  275. package/library/plugins/materio/ai.iowarp.clio/references/execution.md +56 -0
  276. package/library/plugins/materio/ai.iowarp.portability/provenance.json +9 -0
  277. package/library/plugins/materio/assets/actions/add-task.md +86 -0
  278. package/library/plugins/materio/assets/actions/archive-task.md +84 -0
  279. package/library/plugins/materio/assets/actions/checkpoint.md +47 -0
  280. package/library/plugins/materio/assets/actions/define-research-tasks.md +228 -0
  281. package/library/plugins/materio/assets/actions/define-virtual-lab.md +179 -0
  282. package/library/plugins/materio/assets/actions/execute-task.md +290 -0
  283. package/library/plugins/materio/assets/actions/help.md +140 -0
  284. package/library/plugins/materio/assets/actions/identify-research.md +204 -0
  285. package/library/plugins/materio/assets/actions/literature-review.md +199 -0
  286. package/library/plugins/materio/assets/actions/pause-research.md +34 -0
  287. package/library/plugins/materio/assets/actions/progress.md +125 -0
  288. package/library/plugins/materio/assets/actions/remove-task.md +82 -0
  289. package/library/plugins/materio/assets/actions/resume-research.md +84 -0
  290. package/library/plugins/materio/assets/actions/settings.md +38 -0
  291. package/library/plugins/materio/assets/actions/status.md +112 -0
  292. package/library/plugins/materio/assets/actions/upload-data.md +123 -0
  293. package/library/plugins/materio/assets/actions/wtfp.md +179 -0
  294. package/library/plugins/materio/assets/references/research-domains.md +134 -0
  295. package/library/plugins/materio/assets/references/research-policy.md +77 -0
  296. package/library/plugins/materio/assets/references/traditional-workflows.md +146 -0
  297. package/library/plugins/materio/assets/scripts/check_physics.py +271 -0
  298. package/library/plugins/materio/assets/scripts/check_scripts.py +248 -0
  299. package/library/plugins/materio/assets/scripts/project_plugin.py +165 -0
  300. package/library/plugins/materio/assets/scripts/research_state.py +400 -0
  301. package/library/plugins/materio/assets/scripts/verify_citations.py +616 -0
  302. package/library/plugins/materio/assets/templates/RESEARCH.md +39 -0
  303. package/library/plugins/materio/assets/templates/VIRTUAL-LAB.md +120 -0
  304. package/library/plugins/materio/assets/templates/WORKFLOW.md +42 -0
  305. package/library/plugins/materio/assets/templates/config.json +5 -0
  306. package/library/plugins/materio/evals/scripts.yaml +29 -0
  307. package/library/plugins/materio/plugin.json +530 -0
  308. package/library/plugins/materio/skills/materio-lab-definer/SKILL.md +74 -0
  309. package/library/plugins/materio/skills/materio-literature-reviewer/SKILL.md +64 -0
  310. package/library/plugins/materio/skills/materio-research-explorer/SKILL.md +74 -0
  311. package/library/plugins/materio/skills/materio-task-executor/SKILL.md +214 -0
  312. package/library/plugins/materio/skills/materio-task-verifier/SKILL.md +46 -0
  313. package/library/plugins/materio/skills/materio-workflow-planner/SKILL.md +79 -0
  314. package/library/plugins/materio/tests/test_check_physics.py +139 -0
  315. package/library/plugins/materio/tests/test_check_scripts.py +140 -0
  316. package/library/plugins/materio/tests/test_research_state.py +291 -0
  317. package/library/plugins/materio/tests/test_verify_citations.py +337 -0
  318. package/library/prompts/README.md +7 -0
  319. package/library/registry.yaml +921 -0
  320. package/library/skills/README.md +120 -0
  321. package/{skills → library/skills}/coding/ast-grep/SKILL.md +1 -1
  322. package/{skills → library/skills}/coding/ast-grep/evals.md +1 -1
  323. package/library/skills/coding/ast-grep/plugin.json +23 -0
  324. package/{skills → library/skills}/coding/coding-standards/SKILL.md +1 -1
  325. package/{skills → library/skills}/coding/coding-standards/evals.md +1 -1
  326. package/library/skills/coding/coding-standards/plugin.json +23 -0
  327. package/{skills → library/skills}/coding/prototype/SKILL.md +1 -1
  328. package/{skills → library/skills}/coding/prototype/evals.md +1 -1
  329. package/library/skills/coding/prototype/plugin.json +23 -0
  330. package/{skills → library/skills}/coding/tdd/SKILL.md +1 -1
  331. package/{skills → library/skills}/coding/tdd/evals.md +1 -1
  332. package/library/skills/coding/tdd/plugin.json +23 -0
  333. package/{skills → library/skills}/context/context-handoff/SKILL.md +1 -1
  334. package/{skills → library/skills}/context/context-handoff/evals.md +1 -1
  335. package/library/skills/context/context-handoff/plugin.json +23 -0
  336. package/{skills → library/skills}/context/context-prime/SKILL.md +1 -1
  337. package/{skills → library/skills}/context/context-prime/evals.md +1 -1
  338. package/library/skills/context/context-prime/plugin.json +23 -0
  339. package/{skills → library/skills}/git/branch-closeout/SKILL.md +1 -1
  340. package/library/skills/git/branch-closeout/plugin.json +23 -0
  341. package/{skills → library/skills}/git/file-ticket/SKILL.md +1 -1
  342. package/library/skills/git/file-ticket/plugin.json +23 -0
  343. package/{skills → library/skills}/git/fix-issue/SKILL.md +1 -1
  344. package/library/skills/git/fix-issue/plugin.json +23 -0
  345. package/{skills → library/skills}/git/resolve-merge-conflicts/SKILL.md +1 -1
  346. package/{skills → library/skills}/git/resolve-merge-conflicts/evals.md +1 -1
  347. package/library/skills/git/resolve-merge-conflicts/plugin.json +23 -0
  348. package/{skills → library/skills}/git/ship/SKILL.md +1 -1
  349. package/library/skills/git/ship/plugin.json +23 -0
  350. package/{skills → library/skills}/git/worktree-create/SKILL.md +1 -1
  351. package/library/skills/git/worktree-create/plugin.json +23 -0
  352. package/{skills → library/skills}/git/worktree-merge/SKILL.md +1 -1
  353. package/library/skills/git/worktree-merge/plugin.json +23 -0
  354. package/{skills → library/skills}/meta/clio-coder-dev/SKILL.md +1 -1
  355. package/{skills → library/skills}/meta/clio-coder-dev/evals.md +1 -1
  356. package/library/skills/meta/clio-coder-dev/plugin.json +23 -0
  357. package/{skills → library/skills}/meta/clio-coder-test/SKILL.md +1 -1
  358. package/{skills → library/skills}/meta/clio-coder-test/evals.md +1 -1
  359. package/library/skills/meta/clio-coder-test/plugin.json +23 -0
  360. package/{skills → library/skills}/meta/credentials/SKILL.md +1 -1
  361. package/{skills → library/skills}/meta/credentials/evals.md +1 -1
  362. package/library/skills/meta/credentials/plugin.json +23 -0
  363. package/library/skills/meta/find-skills/SKILL.md +85 -0
  364. package/library/skills/meta/find-skills/evals.md +65 -0
  365. package/library/skills/meta/find-skills/plugin.json +23 -0
  366. package/{skills → library/skills}/meta/herdr/SKILL.md +1 -1
  367. package/{skills → library/skills}/meta/herdr/evals.md +1 -1
  368. package/library/skills/meta/herdr/plugin.json +23 -0
  369. package/{skills → library/skills}/meta/skill-craft/SKILL.md +23 -9
  370. package/{skills → library/skills}/meta/skill-craft/evals.md +11 -3
  371. package/library/skills/meta/skill-craft/plugin.json +23 -0
  372. package/{skills → library/skills}/planning/archify/SKILL.md +13 -13
  373. package/library/skills/planning/archify/plugin.json +23 -0
  374. package/{skills → library/skills}/planning/architecture/SKILL.md +1 -1
  375. package/{skills → library/skills}/planning/architecture/evals.md +1 -1
  376. package/library/skills/planning/architecture/plugin.json +23 -0
  377. package/{skills → library/skills}/planning/backlog/SKILL.md +1 -1
  378. package/{skills → library/skills}/planning/backlog/evals.md +1 -1
  379. package/library/skills/planning/backlog/plugin.json +23 -0
  380. package/{skills → library/skills}/planning/prd/SKILL.md +1 -1
  381. package/{skills → library/skills}/planning/prd/evals.md +1 -1
  382. package/library/skills/planning/prd/plugin.json +23 -0
  383. package/{skills → library/skills}/planning/product-intent/SKILL.md +1 -1
  384. package/{skills → library/skills}/planning/product-intent/evals.md +1 -1
  385. package/library/skills/planning/product-intent/plugin.json +23 -0
  386. package/{skills → library/skills}/planning/tech-spec/SKILL.md +1 -1
  387. package/{skills → library/skills}/planning/tech-spec/evals.md +1 -1
  388. package/library/skills/planning/tech-spec/plugin.json +23 -0
  389. package/{skills → library/skills}/registry.yaml +7 -7
  390. package/{skills → library/skills}/remote.yaml +1 -1
  391. package/{skills → library/skills}/research/arxiv-literature/SKILL.md +1 -1
  392. package/{skills → library/skills}/research/arxiv-literature/evals.md +1 -1
  393. package/library/skills/research/arxiv-literature/plugin.json +23 -0
  394. package/{skills → library/skills}/research/experiment-protocol/SKILL.md +1 -1
  395. package/{skills → library/skills}/research/experiment-protocol/evals.md +1 -1
  396. package/library/skills/research/experiment-protocol/plugin.json +23 -0
  397. package/{skills → library/skills}/research/scientific-debugging/SKILL.md +1 -1
  398. package/{skills → library/skills}/research/scientific-debugging/evals.md +1 -1
  399. package/library/skills/research/scientific-debugging/plugin.json +23 -0
  400. package/{skills → library/skills}/research/scientific-modernization/SKILL.md +1 -1
  401. package/{skills → library/skills}/research/scientific-modernization/evals.md +1 -1
  402. package/library/skills/research/scientific-modernization/plugin.json +23 -0
  403. package/{skills → library/skills}/skill-marketplace.json +37 -37
  404. package/{skills → library/skills}/workflow/cut-it/SKILL.md +1 -1
  405. package/{skills → library/skills}/workflow/cut-it/evals.md +1 -1
  406. package/library/skills/workflow/cut-it/plugin.json +23 -0
  407. package/{skills → library/skills}/workflow/design-council/SKILL.md +1 -1
  408. package/{skills → library/skills}/workflow/design-council/evals.md +1 -1
  409. package/library/skills/workflow/design-council/plugin.json +23 -0
  410. package/{skills → library/skills}/workflow/grill-me/SKILL.md +1 -1
  411. package/{skills → library/skills}/workflow/grill-me/evals.md +1 -1
  412. package/library/skills/workflow/grill-me/plugin.json +23 -0
  413. package/{skills → library/skills}/workflow/workflow-distiller/SKILL.md +14 -11
  414. package/{skills → library/skills}/workflow/workflow-distiller/evals.md +14 -6
  415. package/library/skills/workflow/workflow-distiller/plugin.json +23 -0
  416. package/package.json +12 -5
  417. package/src/cli/agents.ts +1 -1
  418. package/src/cli/config-inspect.ts +1 -1
  419. package/src/cli/configure.ts +2 -2
  420. package/src/cli/eval.ts +40 -6
  421. package/src/cli/extensions.ts +74 -8
  422. package/src/cli/fleet-preflight.ts +2 -0
  423. package/src/cli/fleet.ts +2 -0
  424. package/src/cli/index.ts +1 -3
  425. package/src/cli/interop-inspect.ts +61 -33
  426. package/src/cli/interop.ts +79 -9
  427. package/src/cli/library-import.ts +139 -0
  428. package/src/cli/library.ts +418 -120
  429. package/src/cli/run.ts +26 -9
  430. package/src/cli/skills-eval.ts +43 -6
  431. package/src/cli/skills-inventory.ts +6 -2
  432. package/src/cli/skills.ts +44 -491
  433. package/src/core/bus-events.ts +5 -0
  434. package/src/core/defaults.ts +1 -1
  435. package/src/core/recent-models.ts +2 -2
  436. package/src/core/session-routing.ts +3 -3
  437. package/src/core/state-file-lock.ts +1 -1
  438. package/src/core/tool-names.ts +5 -0
  439. package/src/domains/agents/extension.ts +42 -6
  440. package/src/domains/agents/fleet-commands.ts +92 -1
  441. package/src/domains/agents/fleet-contract.ts +87 -19
  442. package/src/domains/agents/recipe.ts +5 -4
  443. package/src/domains/agents/registry.ts +80 -24
  444. package/src/domains/config/keybindings.ts +155 -95
  445. package/src/domains/context/worker/contract.ts +91 -0
  446. package/src/domains/context/worker/pressure.ts +120 -0
  447. package/src/domains/context/worker/recall.ts +62 -0
  448. package/src/domains/context/worker/select.ts +164 -0
  449. package/src/domains/context/worker/snapshot.ts +35 -0
  450. package/src/domains/context/worker/store.ts +16 -0
  451. package/src/domains/context/working-set/replay/synthetic.ts +2 -1
  452. package/src/domains/dispatch/active-route-planner.ts +2 -0
  453. package/src/domains/dispatch/backoff.ts +1 -0
  454. package/src/domains/dispatch/code-step.ts +12 -2
  455. package/src/domains/dispatch/contract.ts +3 -0
  456. package/src/domains/dispatch/execution-plan.ts +2 -0
  457. package/src/domains/dispatch/extension.ts +109 -27
  458. package/src/domains/dispatch/fleet-plan.ts +10 -0
  459. package/src/domains/dispatch/fleet-run.ts +1 -0
  460. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  461. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  462. package/src/domains/dispatch/state.ts +1 -0
  463. package/src/domains/dispatch/types.ts +5 -0
  464. package/src/domains/dispatch/validation.ts +12 -0
  465. package/src/domains/dispatch/workspace-checkpoint.ts +1 -1
  466. package/src/domains/evidence/failure-attribution.ts +1 -0
  467. package/src/domains/evidence/trust-status.ts +22 -3
  468. package/src/domains/extensions/command-schema.ts +145 -0
  469. package/src/domains/extensions/command-tools.ts +15 -0
  470. package/src/domains/extensions/compatibility.ts +7 -0
  471. package/src/domains/extensions/contract.ts +0 -4
  472. package/src/domains/extensions/discovery.ts +69 -205
  473. package/src/domains/extensions/extension.ts +0 -4
  474. package/src/domains/extensions/index.ts +1 -5
  475. package/src/domains/extensions/manager.ts +1 -6
  476. package/src/domains/extensions/operator-commands.ts +29 -0
  477. package/src/domains/extensions/operator-runtime.ts +483 -0
  478. package/src/domains/extensions/public-api.ts +53 -0
  479. package/src/domains/extensions/runtime-child.mjs +114 -0
  480. package/src/domains/extensions/runtime-process.ts +306 -0
  481. package/src/domains/extensions/runtime-schema.ts +146 -0
  482. package/src/domains/extensions/{resources.ts → snapshot-access.ts} +1 -17
  483. package/src/domains/extensions/snapshot.ts +4 -32
  484. package/src/domains/extensions/state.ts +5 -83
  485. package/src/domains/extensions/types.ts +33 -34
  486. package/src/domains/interop/adopt.ts +546 -0
  487. package/src/domains/interop/detect.ts +50 -12
  488. package/src/domains/interop/foreign.ts +554 -0
  489. package/src/domains/interop/import.ts +277 -0
  490. package/src/domains/interop/index.ts +24 -0
  491. package/src/domains/interop/install.ts +6 -0
  492. package/src/domains/interop/inventory.ts +351 -0
  493. package/src/domains/interop/projection.ts +360 -0
  494. package/src/domains/interop/registry.ts +106 -3
  495. package/src/domains/interop/types.ts +51 -0
  496. package/src/domains/lifecycle/migrations/index.ts +0 -2
  497. package/src/domains/lifecycle/naming-resources.ts +1 -1
  498. package/src/domains/middleware/marketplace-offer.ts +1 -1
  499. package/src/domains/mux/contract.ts +1 -1
  500. package/src/domains/plugins/catalog.ts +204 -0
  501. package/src/domains/plugins/contract.ts +24 -0
  502. package/src/domains/plugins/discovery.ts +316 -0
  503. package/src/domains/plugins/extension.ts +40 -0
  504. package/src/domains/plugins/index.ts +77 -0
  505. package/src/domains/plugins/integrity.ts +6 -0
  506. package/src/domains/plugins/manifest.ts +3 -0
  507. package/src/domains/plugins/resources.ts +102 -0
  508. package/src/domains/plugins/state.ts +753 -0
  509. package/src/domains/plugins/types.ts +217 -0
  510. package/src/domains/prompts/extension.ts +9 -2
  511. package/src/domains/prompts/fragments/operating/skills.md +10 -10
  512. package/src/domains/resources/common-loader.ts +9 -6
  513. package/src/domains/resources/index.ts +67 -0
  514. package/src/domains/resources/library-actions.ts +836 -0
  515. package/src/domains/resources/library-evals.ts +38 -0
  516. package/src/domains/resources/library-inventory.ts +1048 -0
  517. package/src/domains/resources/library-types.ts +50 -0
  518. package/src/domains/resources/library-validation.ts +634 -0
  519. package/src/domains/resources/library.ts +437 -156
  520. package/src/domains/resources/package-references.ts +66 -0
  521. package/src/domains/resources/prompts/loader.ts +75 -41
  522. package/src/domains/resources/skills/install.ts +2 -2
  523. package/src/domains/resources/skills/loader.ts +77 -22
  524. package/src/domains/resources/skills/marketplace.ts +48 -57
  525. package/src/domains/resources/skills/promotion.ts +2 -2
  526. package/src/domains/resources/skills/provenance-pin.ts +17 -4
  527. package/src/domains/safety/action-classifier.ts +2 -2
  528. package/src/domains/safety/default-path-policy.ts +3 -1
  529. package/src/domains/safety/policy-engine.ts +1 -1
  530. package/src/domains/safety/protected-artifacts.ts +21 -5
  531. package/src/domains/safety/skill-authority.ts +5 -2
  532. package/src/domains/share/archive.ts +1 -1
  533. package/src/engine/apis/openai-completions.ts +52 -2
  534. package/src/engine/notices/pi-tui-LICENSE +21 -0
  535. package/src/engine/tui.ts +3 -0
  536. package/src/engine/worker-runtime.ts +58 -14
  537. package/src/engine/worker-tools.ts +5 -0
  538. package/src/entry/orchestrator.ts +26 -5
  539. package/src/entry/plugin-reload.ts +18 -0
  540. package/src/interactive/application-controller.ts +67 -21
  541. package/src/interactive/chat-loop.ts +32 -5
  542. package/src/interactive/chat-panel.ts +5 -1
  543. package/src/interactive/clio-editor.ts +53 -21
  544. package/src/interactive/command-output.ts +56 -1
  545. package/src/interactive/editor-submit.ts +65 -28
  546. package/src/interactive/fleet-run-preview.ts +2 -0
  547. package/src/interactive/follow-up-queue-panel.ts +3 -3
  548. package/src/interactive/footer/dashboard.ts +4 -1
  549. package/src/interactive/footer/notifications.ts +2 -2
  550. package/src/interactive/footer/widgets.ts +2 -2
  551. package/src/interactive/interactive-application.ts +209 -21
  552. package/src/interactive/interactive-input-runtime.ts +254 -7
  553. package/src/interactive/interactive-presentation.ts +41 -12
  554. package/src/interactive/interactive-slash-runtime.ts +37 -8
  555. package/src/interactive/keybinding-manager.ts +156 -79
  556. package/src/interactive/keyboard-owner.ts +37 -0
  557. package/src/interactive/leader-key.ts +49 -102
  558. package/src/interactive/leader-menu.ts +45 -0
  559. package/src/interactive/overlay-ask-user-lifecycle.ts +9 -1
  560. package/src/interactive/overlay-frame.ts +15 -0
  561. package/src/interactive/overlay-key-routing.ts +46 -47
  562. package/src/interactive/overlay-lifecycle.ts +30 -15
  563. package/src/interactive/overlay-resource-openers.ts +56 -46
  564. package/src/interactive/overlays/ask-user.ts +630 -556
  565. package/src/interactive/overlays/extension-panel.ts +70 -0
  566. package/src/interactive/overlays/extensions.ts +28 -5
  567. package/src/interactive/overlays/fleet-run-approval.ts +7 -3
  568. package/src/interactive/overlays/help-reference.ts +89 -40
  569. package/src/interactive/overlays/interop.ts +122 -3
  570. package/src/interactive/overlays/keybinding-detail.ts +2 -2
  571. package/src/interactive/overlays/library-lifecycle.ts +90 -0
  572. package/src/interactive/overlays/library-model.ts +574 -0
  573. package/src/interactive/overlays/library-review.ts +557 -0
  574. package/src/interactive/overlays/library-tabs.ts +3 -15
  575. package/src/interactive/overlays/library.ts +602 -0
  576. package/src/interactive/overlays/list-overlay.ts +218 -39
  577. package/src/interactive/overlays/model-selector.ts +28 -25
  578. package/src/interactive/overlays/session-selector.ts +9 -3
  579. package/src/interactive/overlays/settings.ts +25 -18
  580. package/src/interactive/overlays/tree-selector.ts +16 -11
  581. package/src/interactive/permission-hint.ts +13 -0
  582. package/src/interactive/permission-overlay.ts +77 -28
  583. package/src/interactive/prompt-source-label.ts +21 -0
  584. package/src/interactive/renderers/reference-card.ts +35 -0
  585. package/src/interactive/renderers/worker-entry.ts +35 -3
  586. package/src/interactive/slash-autocomplete.ts +99 -1
  587. package/src/interactive/slash-commands.ts +390 -67
  588. package/src/interactive/slash-spec.ts +0 -1
  589. package/src/interactive/terminal-lease.ts +44 -12
  590. package/src/interactive/turn-queues.ts +8 -7
  591. package/src/interactive/turn-runtime.ts +1 -1
  592. package/src/interactive/view/view-overlay.ts +19 -14
  593. package/src/interactive/welcome-dashboard.ts +525 -408
  594. package/src/tools/bootstrap.ts +8 -0
  595. package/src/tools/builtin-tool-catalog.ts +7 -2
  596. package/src/tools/context/index.ts +58 -5
  597. package/src/tools/context/library.ts +465 -0
  598. package/src/tools/context/surface.ts +20 -6
  599. package/src/tools/core-bootstrap.ts +3 -0
  600. package/src/tools/dispatch-admission.ts +24 -1
  601. package/src/tools/dispatch-arguments.ts +8 -0
  602. package/src/tools/dispatch-plan.ts +32 -0
  603. package/src/tools/dispatch-schema.ts +31 -1
  604. package/src/tools/dispatch-types.ts +3 -0
  605. package/src/tools/dispatch.ts +1 -1
  606. package/src/tools/harness-extensions.ts +169 -0
  607. package/src/tools/observation.ts +4 -0
  608. package/src/tools/policy.ts +7 -1
  609. package/src/tools/registry.ts +19 -1
  610. package/src/tools/worker-evidence.ts +5 -0
  611. package/src/worker/context-seed.ts +192 -0
  612. package/src/worker/entry.ts +1 -0
  613. package/src/worker/spec-contract.ts +8 -1
  614. package/dist/chunk-3UW3KU4A.js +0 -21
  615. package/dist/chunk-536HXRFE.js +0 -1257
  616. package/dist/chunk-B3MOMLJ4.js +0 -433
  617. package/dist/chunk-CXQ37WJH.js +0 -45
  618. package/dist/chunk-KTFSFCVN.js +0 -46
  619. package/dist/chunk-QCOV5DFY.js +0 -911
  620. package/dist/chunk-QRFXEO6Y.js +0 -17
  621. package/dist/chunk-VAHLPXPY.js +0 -399
  622. package/dist/interop-RVCAYECG.js +0 -115
  623. package/dist/library-CTKZA7K3.js +0 -226
  624. package/dist/skills-OXFEAWMT.js +0 -510
  625. package/skills/README.md +0 -418
  626. package/skills/meta/find-skills/SKILL.md +0 -78
  627. package/skills/meta/find-skills/evals.md +0 -47
  628. package/src/domains/extensions/resource-path.ts +0 -27
  629. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +0 -27
  630. package/src/interactive/overlays/agents.ts +0 -70
  631. package/src/interactive/overlays/library-install-confirm.ts +0 -152
  632. package/src/interactive/overlays/prompts.ts +0 -89
  633. package/src/interactive/overlays/skills-hub.ts +0 -615
  634. /package/{skills → library/skills}/coding/ast-grep/references/rule_reference.md +0 -0
  635. /package/{skills → library/skills}/coding/prototype/references/LOGIC.md +0 -0
  636. /package/{skills → library/skills}/coding/prototype/references/UI.md +0 -0
  637. /package/{skills → library/skills}/coding/tdd/references/mocking.md +0 -0
  638. /package/{skills → library/skills}/coding/tdd/references/tests.md +0 -0
  639. /package/{skills → library/skills}/context/context-handoff/scripts/new-handoff.sh +0 -0
  640. /package/{skills → library/skills}/git/branch-closeout/evals.md +0 -0
  641. /package/{skills → library/skills}/git/branch-closeout/references/closeout-checklist.md +0 -0
  642. /package/{skills → library/skills}/git/file-ticket/assets/issue-template.md +0 -0
  643. /package/{skills → library/skills}/git/file-ticket/evals.md +0 -0
  644. /package/{skills → library/skills}/git/file-ticket/references/issue-discovery.md +0 -0
  645. /package/{skills → library/skills}/git/fix-issue/evals.md +0 -0
  646. /package/{skills → library/skills}/git/fix-issue/references/diagnosis-and-rca.md +0 -0
  647. /package/{skills → library/skills}/git/resolve-merge-conflicts/references/conflict-matrix.md +0 -0
  648. /package/{skills → library/skills}/git/ship/assets/pr-template.md +0 -0
  649. /package/{skills → library/skills}/git/ship/evals.md +0 -0
  650. /package/{skills → library/skills}/git/ship/references/remote-and-branch-policy.md +0 -0
  651. /package/{skills → library/skills}/git/worktree-create/evals.md +0 -0
  652. /package/{skills → library/skills}/git/worktree-create/references/worktree-setup.md +0 -0
  653. /package/{skills → library/skills}/git/worktree-merge/evals.md +0 -0
  654. /package/{skills → library/skills}/git/worktree-merge/references/merge-strategies.md +0 -0
  655. /package/{skills → library/skills}/meta/clio-coder-test/references/harness.md +0 -0
  656. /package/{skills → library/skills}/meta/clio-coder-test/references/test-map.md +0 -0
  657. /package/{skills → library/skills}/planning/archify/evals.md +0 -0
@@ -0,0 +1,546 @@
1
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { tmpdir } from "node:os";
3
+ import path from "node:path";
4
+ import { clioConfigDir } from "../../core/xdg.js";
5
+ import {
6
+ listInstalledPlugins,
7
+ PLUGIN_EXTENSION_KEY,
8
+ PLUGIN_SCHEMA,
9
+ pluginBaseDir,
10
+ readPluginInstallRecord,
11
+ readPluginManifest,
12
+ } from "../plugins/index.js";
13
+ import type { PluginOrigin } from "../plugins/types.js";
14
+ import { validateLibraryPackage } from "../resources/library-validation.js";
15
+ import { loadPromptTemplates } from "../resources/prompts/loader.js";
16
+ import { normalizedSkillHash } from "../resources/skills/content-hash.js";
17
+ import { loadSkills } from "../resources/skills/loader.js";
18
+ import { detectForeignPlugin, type ForeignResourceOutcome, projectForeignPlugin } from "./foreign.js";
19
+ import { installInteropPackage } from "./install.js";
20
+ import { inventoryText } from "./inventory.js";
21
+ import { digest, projectAgent, projectPrompt, projectSkill, prose, safeName, tree } from "./projection.js";
22
+ import type { InteropAgentId, InteropInventory, InteropInventoryItem } from "./types.js";
23
+
24
+ export type AdoptionKind = "skill" | "agent" | "prompt" | "plugin";
25
+ export interface InteropAdoptionEntry {
26
+ item: InteropInventoryItem;
27
+ action: "install" | "skip";
28
+ reason: string;
29
+ id?: string;
30
+ destination?: string;
31
+ digest?: string;
32
+ omitted?: string[];
33
+ requirements?: string[];
34
+ /** Manifest format the package was read as; absent for loose resources. */
35
+ format?: "portable" | "claude-code" | "codex";
36
+ /** Per-resource conversion results for foreign-format packages. */
37
+ outcomes?: ForeignResourceOutcome[];
38
+ /** Host features present in the source that adoption never activates. */
39
+ unsupported?: string[];
40
+ /** Immutable bytes reviewed by the operator. Never serialized by the CLI. */
41
+ files?: Readonly<Record<string, string>>;
42
+ }
43
+ export interface InteropAdoptionPlan {
44
+ host: InteropAgentId;
45
+ cwd: string;
46
+ scope: "user" | "project";
47
+ entries: InteropAdoptionEntry[];
48
+ }
49
+ export interface PreparedAdoption {
50
+ id: string;
51
+ version: string;
52
+ files: Record<string, string>;
53
+ note: string;
54
+ omitted: string[];
55
+ requirements: string[];
56
+ format?: "portable" | "claude-code" | "codex";
57
+ outcomes?: ForeignResourceOutcome[];
58
+ unsupported?: string[];
59
+ }
60
+ /** Portable data-only projection shared by local adoption and explicit import. */
61
+ export function preparePortablePackage(root: string): PreparedAdoption {
62
+ const candidate = readPluginManifest(root);
63
+ if (!candidate.valid || !candidate.manifest)
64
+ throw new Error(
65
+ `Not adoptable: invalid portable root plugin.json (${candidate.diagnostics.map((d) => d.message).join("; ")}).`,
66
+ );
67
+ const manifest = candidate.manifest;
68
+ const omitted: string[] = [];
69
+ // Do not silently change the meaning of portable packages by removing dependencies.
70
+ const files = tree(root, true, omitted);
71
+ const raw = JSON.parse(files["plugin.json"] ?? "{}") as Record<string, unknown>;
72
+ const resources = Object.fromEntries(
73
+ Object.entries(manifest.clio.resources).filter(([key]) => ["skills", "agents", "prompts"].includes(key)),
74
+ );
75
+ const components = manifest.clio.components.filter(
76
+ (component) =>
77
+ ["skill", "agent", "prompt", "resource"].includes(component.kind) && files[component.path] !== undefined,
78
+ );
79
+ const retained = new Set(components.map((component) => `${component.kind}:${component.id}`));
80
+ if (components.some((component) => component.requires?.some((ref) => !retained.has(ref))))
81
+ throw new Error("Not adoptable: retained resources require omitted executable components.");
82
+ // Preserve the declared package kind; a kind whose only public component is dropped is not a useful plugin.
83
+ const kind = manifest.clio.kind ?? "plugin";
84
+ if (!["plugin", "skill", "agent", "prompt"].includes(kind))
85
+ throw new Error(
86
+ `Not adoptable: ${kind} packages have no data-only projection; install them through the library instead.`,
87
+ );
88
+ if (kind !== "plugin" && !components.some((component) => component.kind === kind))
89
+ throw new Error(`Not adoptable: the ${kind} package's public ${kind} component is not projectable.`);
90
+ // The portable skills/ convention needs no Clio component graph. Enumerate
91
+ // through the shared readers so implicit recipes and actual runtime names
92
+ // get the same checks as explicitly declared components.
93
+ const validation = validateLibraryPackage(root);
94
+ if (!validation.valid)
95
+ throw new Error(
96
+ `Not adoptable: invalid recipe content (${validation.validation.diagnostics
97
+ .filter((item) => item.severity === "error")
98
+ .map((item) => item.message)
99
+ .join("; ")}).`,
100
+ );
101
+ const recipes = validation.validation.resources.filter(
102
+ (resource) => ["skill", "agent", "prompt"].includes(resource.kind) && files[resource.path] !== undefined,
103
+ );
104
+ if (recipes.length === 0) throw new Error("Not adoptable: the portable package has no supported data-only recipes.");
105
+ // Retained recipe text that names an omitted companion cannot be claimed working.
106
+ const outcomes: ForeignResourceOutcome[] = [];
107
+ for (const resource of recipes) {
108
+ const component = components.find((item) => item.kind === resource.kind && item.path === resource.path);
109
+ // A root SKILL.md owns the whole package as its companion scope.
110
+ const skillDir = resource.kind === "skill" ? path.posix.dirname(resource.path) : undefined;
111
+ const dir = skillDir === undefined ? undefined : skillDir === "." ? "" : `${skillDir}/`;
112
+ const texts = Object.entries(files)
113
+ .filter(([file]) => file !== "plugin.json" && (dir === undefined ? file === resource.path : file.startsWith(dir)))
114
+ .map(([, text]) => text);
115
+ // Own companions match by package path or basename; shared assets elsewhere only by explicit package path.
116
+ const needed = omitted.filter((file) => {
117
+ const own = dir !== undefined && file.startsWith(dir);
118
+ const base = path.posix.basename(file);
119
+ return texts.some((text) => text.includes(file) || (own && base.includes(".") && text.includes(base)));
120
+ });
121
+ if (needed.length)
122
+ throw new Error(
123
+ `Not adoptable: ${resource.kind} ${resource.name} references omitted companions (${needed.join(", ")}); the data-only import cannot claim it works. Use library install for script-bearing packages.`,
124
+ );
125
+ outcomes.push({
126
+ kind: resource.kind as ForeignResourceOutcome["kind"],
127
+ name: resource.name,
128
+ source: resource.path,
129
+ status: "converted",
130
+ ...(component ? { id: component.id } : {}),
131
+ destination: resource.path,
132
+ });
133
+ }
134
+ raw.extensions = {
135
+ [PLUGIN_EXTENSION_KEY]: {
136
+ manifestVersion: 1,
137
+ ...(kind !== "plugin" ? { kind } : {}),
138
+ ...(manifest.clio.requires ? { requires: manifest.clio.requires } : {}),
139
+ resources,
140
+ components,
141
+ ...(manifest.clio.compatibility ? { compatibility: manifest.clio.compatibility } : {}),
142
+ },
143
+ };
144
+ files["plugin.json"] = JSON.stringify(raw, null, 2);
145
+ return {
146
+ id: manifest.name,
147
+ version: manifest.version ?? "0.0.0",
148
+ files,
149
+ note:
150
+ "Data-only portable projection; hooks, MCP, scripts, tools, fleets and host settings are skipped. References to omitted files are unavailable.",
151
+ omitted,
152
+ requirements: [...(manifest.clio.requires ?? [])],
153
+ format: "portable",
154
+ outcomes,
155
+ };
156
+ }
157
+ /** Foreign-format (Claude Code / Codex) package normalized at the import boundary. */
158
+ export function prepareForeignPackage(
159
+ root: string,
160
+ format?: "claude-code" | "codex",
161
+ ): PreparedAdoption & { format: "claude-code" | "codex" } {
162
+ const detection = detectForeignPlugin(root, format);
163
+ if (detection.format === "portable") throw new Error("Portable root plugin.json present; use the portable route.");
164
+ if (detection.format === "none") throw new Error(`Not adoptable: ${detection.diagnostics.join(" ")}`);
165
+ const projection = projectForeignPlugin({
166
+ root,
167
+ format: detection.format,
168
+ ...(detection.manifestPath ? { manifestPath: detection.manifestPath } : {}),
169
+ });
170
+ if (!projection.outcomes.some((outcome) => outcome.status === "converted"))
171
+ throw new Error(
172
+ `Not adoptable: no supported recipe converted from ${detection.manifestPath}${
173
+ projection.outcomes.length
174
+ ? ` (${projection.outcomes.map((o) => `${o.kind} ${o.name}: ${o.reason ?? "unsupported"}`).join("; ")})`
175
+ : ""
176
+ }.`,
177
+ );
178
+ return {
179
+ id: projection.id,
180
+ version: projection.version,
181
+ files: projection.files,
182
+ note: `${detection.format === "claude-code" ? "Claude Code" : "Codex"} plugin normalized to a portable Clio package; hooks, MCP, LSP, scripts and host settings are never activated.${
183
+ projection.notes.length ? ` ${projection.notes.join(" ")}` : ""
184
+ }`,
185
+ omitted: projection.omitted,
186
+ requirements: projection.requirements,
187
+ format: detection.format,
188
+ outcomes: projection.outcomes,
189
+ unsupported: projection.unsupported,
190
+ };
191
+ }
192
+ function prepared(item: InteropInventoryItem, host: InteropAgentId): PreparedAdoption {
193
+ let value: PreparedAdoption;
194
+ if (item.kind === "plugin") {
195
+ const detection = detectForeignPlugin(item.path);
196
+ // An invalid portable manifest is diagnosed; it is never hidden by a foreign fallback.
197
+ value =
198
+ detection.format === "portable" || detection.format === "none"
199
+ ? preparePortablePackage(item.path)
200
+ : prepareForeignPackage(item.path, detection.format);
201
+ } else {
202
+ const id = safeName(`${host}-${item.kind}-${item.name}`);
203
+ const plural = `${item.kind}s`;
204
+ let note = "Text only; foreign execution settings are not imported.";
205
+ const resource =
206
+ item.kind === "skill"
207
+ ? projectSkill({ skillDir: path.dirname(item.path), fallbackName: item.name })
208
+ : item.kind === "agent"
209
+ ? projectAgent({ file: item.path, name: item.name })
210
+ : projectPrompt({ file: item.path, name: item.name });
211
+ if (item.kind === "agent")
212
+ note =
213
+ "Persona copied into a read-only Clio recipe; host tools, permissions, model, hooks and skill bindings are omitted.";
214
+ const files = { ...resource.files };
215
+ files["plugin.json"] = JSON.stringify(
216
+ {
217
+ $schema: PLUGIN_SCHEMA,
218
+ name: id,
219
+ version: "0.0.0",
220
+ description: `Adopted ${item.kind} from ${host}`,
221
+ extensions: {
222
+ [PLUGIN_EXTENSION_KEY]: {
223
+ manifestVersion: 1,
224
+ kind: item.kind,
225
+ resources: { [plural]: plural },
226
+ components: [{ kind: item.kind, id: resource.id, path: resource.componentPath }],
227
+ },
228
+ },
229
+ },
230
+ null,
231
+ 2,
232
+ );
233
+ value = {
234
+ id,
235
+ version: "0.0.0",
236
+ files,
237
+ note,
238
+ omitted: [],
239
+ requirements: [],
240
+ ...(resource.omittedFields.length
241
+ ? {
242
+ outcomes: [
243
+ {
244
+ kind: item.kind as "skill" | "agent" | "prompt",
245
+ name: resource.name,
246
+ source: item.path,
247
+ status: "converted",
248
+ id: resource.id,
249
+ destination: resource.componentPath,
250
+ omittedFields: resource.omittedFields,
251
+ },
252
+ ],
253
+ }
254
+ : {}),
255
+ };
256
+ }
257
+ const manifest = JSON.parse(value.files["plugin.json"] ?? "{}") as { extensions?: Record<string, unknown> };
258
+ manifest.extensions = {
259
+ ...manifest.extensions,
260
+ "ai.iowarp.clio.interop": {
261
+ host,
262
+ source: item.path,
263
+ sourceScope: item.scope,
264
+ untrusted: true,
265
+ ...(value.format ? { format: value.format } : {}),
266
+ },
267
+ };
268
+ value.files["plugin.json"] = `${JSON.stringify(manifest, null, 2)}\n`;
269
+ return value;
270
+ }
271
+ /** Requirements must already be usable; adoption never expands the reviewed import set. */
272
+ export function vendorOf(format: PreparedAdoption["format"]): "claude-code" | "codex" | undefined {
273
+ return format === "claude-code" || format === "codex" ? format : undefined;
274
+ }
275
+ export function unmetRequirements(
276
+ requirements: ReadonlyArray<string>,
277
+ cwd: string,
278
+ scope: "user" | "project",
279
+ /** When set, direct requirements came from vendor dependencies and need matching import provenance. */
280
+ vendor?: "claude-code" | "codex",
281
+ ): string[] {
282
+ if (requirements.length === 0) return [];
283
+ const available = new Map(
284
+ listInstalledPlugins(cwd, { all: true, ...(scope === "user" ? { scope } : {}) })
285
+ .filter((pkg) => pkg.loadable)
286
+ .map((pkg) => [`${pkg.kind ?? "plugin"}:${pkg.id}`, pkg]),
287
+ );
288
+ const problems = new Set<string>();
289
+ if (vendor)
290
+ for (const ref of requirements) {
291
+ const pkg = available.get(ref);
292
+ if (!pkg) continue;
293
+ const origin = readPluginInstallRecord(pkg.id, { cwd, scope: pkg.scope })?.origin;
294
+ const provenance =
295
+ typeof origin === "object" && (origin.kind === "import" || origin.kind === "interop") ? origin.format : undefined;
296
+ if (provenance !== vendor)
297
+ problems.add(
298
+ `${ref} (installed package is not an imported ${vendor} plugin; a same-named native package does not satisfy a vendor dependency)`,
299
+ );
300
+ }
301
+ const visiting = new Set<string>();
302
+ const checked = new Set<string>();
303
+ const visit = (ref: string): void => {
304
+ if (visiting.has(ref)) {
305
+ problems.add(`${ref} (dependency cycle)`);
306
+ return;
307
+ }
308
+ if (checked.has(ref)) return;
309
+ const dependency = available.get(ref);
310
+ if (!dependency) {
311
+ problems.add(`${ref} (missing, inactive, or unavailable in ${scope} scope)`);
312
+ return;
313
+ }
314
+ visiting.add(ref);
315
+ for (const nested of dependency.manifest?.clio.requires ?? []) visit(nested);
316
+ visiting.delete(ref);
317
+ checked.add(ref);
318
+ };
319
+ for (const ref of requirements) visit(ref);
320
+ return [...problems];
321
+ }
322
+
323
+ export function planInteropAdoption(input: {
324
+ host: InteropAgentId;
325
+ inventory: InteropInventory;
326
+ cwd?: string;
327
+ scope?: "user" | "project";
328
+ kind?: AdoptionKind;
329
+ }): InteropAdoptionPlan {
330
+ const cwd = path.resolve(input.cwd ?? process.cwd());
331
+ const scope = input.scope ?? "user";
332
+ const installed = listInstalledPlugins(cwd, { all: true });
333
+ const installedSkills = loadSkills({
334
+ cwd,
335
+ roots: [
336
+ { path: path.join(clioConfigDir(), "skills"), scope: "user" },
337
+ { path: path.join(cwd, ".clio-coder/skills"), scope: "project" },
338
+ ...installed.flatMap((pkg) =>
339
+ pkg.resources.skills
340
+ ? [{ path: path.join(pkg.rootPath, pkg.resources.skills), rootPath: pkg.rootPath, scope: "package" as const }]
341
+ : [],
342
+ ),
343
+ ],
344
+ }).items;
345
+ const installedPrompts = loadPromptTemplates({
346
+ cwd,
347
+ roots: [
348
+ { path: path.join(clioConfigDir(), "prompts"), scope: "user" },
349
+ { path: path.join(cwd, ".clio-coder/prompts"), scope: "project" },
350
+ ...installed.flatMap((pkg) =>
351
+ pkg.resources.prompts
352
+ ? [{ path: path.join(pkg.rootPath, pkg.resources.prompts), rootPath: pkg.rootPath, scope: "package" as const }]
353
+ : [],
354
+ ),
355
+ ],
356
+ }).items;
357
+ const promptBodies = new Set(
358
+ installedPrompts.flatMap((prompt) => {
359
+ try {
360
+ return [prose(inventoryText(prompt.filePath)).body];
361
+ } catch {
362
+ return [];
363
+ }
364
+ }),
365
+ );
366
+ const installedContent = new Set(
367
+ installed.flatMap((pkg) => {
368
+ try {
369
+ const files = tree(pkg.rootPath);
370
+ delete files["plugin.json"];
371
+ return [digest(files)];
372
+ } catch {
373
+ return [];
374
+ }
375
+ }),
376
+ );
377
+ const planned = new Set<string>();
378
+ const plan: InteropAdoptionPlan = { host: input.host, cwd, scope, entries: [] };
379
+ for (const item of input.inventory.items) {
380
+ const skip = (reason: string): void => {
381
+ plan.entries.push({ item, action: "skip", reason });
382
+ };
383
+ if (!["skill", "agent", "prompt", "plugin"].includes(item.kind)) {
384
+ skip(`Not adoptable: ${item.kind} is executable configuration or unsupported presentation data.`);
385
+ continue;
386
+ }
387
+ if (input.kind && item.kind !== input.kind) {
388
+ skip(`Excluded by --kind ${input.kind}.`);
389
+ continue;
390
+ }
391
+ if (item.plugin && !input.kind && planned.has(item.plugin)) {
392
+ skip("Provided by an installed or planned portable plugin.");
393
+ continue;
394
+ }
395
+ try {
396
+ if (
397
+ item.kind === "skill" &&
398
+ installedSkills.some((skill) => skill.normalizedHash === normalizedSkillHash(inventoryText(item.path)))
399
+ ) {
400
+ skip("Already installed: same skill content digest.");
401
+ continue;
402
+ }
403
+ if (item.kind === "prompt" && promptBodies.has(prose(inventoryText(item.path)).body)) {
404
+ skip("Already installed: same prompt content digest.");
405
+ continue;
406
+ }
407
+ const value = prepared(item, input.host);
408
+ const missing = unmetRequirements(value.requirements, cwd, scope, vendorOf(value.format));
409
+ if (missing.length) {
410
+ skip(
411
+ `Unsatisfied package requirements: ${missing.join(", ")}. Install dependencies through the library and review a new plan; no extra resources are imported.`,
412
+ );
413
+ continue;
414
+ }
415
+ const hash = digest(value.files);
416
+ if (item.kind === "plugin" && installed.some((pkg) => pkg.id === value.id && pkg.version === value.version)) {
417
+ planned.add(item.path);
418
+ skip("Already installed: same package id and version.");
419
+ continue;
420
+ }
421
+ const resourceFiles = { ...value.files };
422
+ delete resourceFiles["plugin.json"];
423
+ if (Object.keys(resourceFiles).length > 0 && installedContent.has(digest(resourceFiles))) {
424
+ skip("Already installed: same content digest.");
425
+ continue;
426
+ }
427
+
428
+ if (installed.some((pkg) => pkg.id === value.id && pkg.scope === scope) || planned.has(value.id)) {
429
+ skip("Package identifier collision; existing content will not be replaced.");
430
+ continue;
431
+ }
432
+ planned.add(value.id);
433
+ if (item.kind === "plugin") planned.add(item.path);
434
+ plan.entries.push({
435
+ item,
436
+ action: "install",
437
+ id: value.id,
438
+ destination: path.join(pluginBaseDir(scope, cwd), value.id),
439
+ files: value.files,
440
+ digest: hash,
441
+ reason: value.note,
442
+ omitted: value.omitted,
443
+ requirements: value.requirements,
444
+ ...(value.format ? { format: value.format } : {}),
445
+ ...(value.outcomes?.length ? { outcomes: value.outcomes } : {}),
446
+ ...(value.unsupported?.length ? { unsupported: value.unsupported } : {}),
447
+ });
448
+ } catch (error) {
449
+ skip(error instanceof Error ? error.message : String(error));
450
+ }
451
+ }
452
+ return plan;
453
+ }
454
+ function renderOutcomes(outcomes: ReadonlyArray<ForeignResourceOutcome> | undefined): string[] {
455
+ return (outcomes ?? []).map((outcome) => {
456
+ const detail = [
457
+ ...(outcome.omittedFields?.length ? [`omitted frontmatter: ${outcome.omittedFields.join(", ")}`] : []),
458
+ ...(outcome.omittedFiles?.length ? [`omitted files: ${outcome.omittedFiles.join(", ")}`] : []),
459
+ ...(outcome.reason ? [outcome.reason] : []),
460
+ ];
461
+ return outcome.status === "converted"
462
+ ? ` CONVERT ${outcome.kind} ${outcome.name} -> ${outcome.destination}${detail.length ? ` (${detail.join("; ")})` : ""}`
463
+ : ` UNSUPPORTED ${outcome.kind} ${outcome.name} (${outcome.source}): ${detail.join("; ")}`;
464
+ });
465
+ }
466
+ export function renderInteropAdoptionPlan(plan: InteropAdoptionPlan): string {
467
+ return [
468
+ `Adopt resources from ${plan.host} into Clio (${plan.scope})?`,
469
+ ...plan.entries.flatMap((entry) => [
470
+ `${entry.action.toUpperCase()} ${entry.item.kind} ${entry.item.name} (${entry.item.scope})`,
471
+ ` Source: ${entry.item.path}`,
472
+ ...(entry.destination ? [` Destination: ${entry.destination}`, ` SHA-256: ${entry.digest}`] : []),
473
+ ` ${entry.reason}`,
474
+ ...(entry.format && entry.format !== "portable"
475
+ ? [` Format: ${entry.format} (normalized to a portable Clio package)`]
476
+ : []),
477
+ ...(entry.requirements?.length ? [` Requires installed packages: ${entry.requirements.join(", ")}`] : []),
478
+ ...renderOutcomes(entry.outcomes),
479
+ ...(entry.unsupported ?? []).map((feature) => ` UNSUPPORTED ${feature}`),
480
+ ...(entry.omitted ?? []).map((file) => ` SKIP ${file}: executable, host-specific, or non-text data.`),
481
+ ]),
482
+ "Foreign resources remain untrusted until the project-import trust setting is enabled.",
483
+ "Host files are never changed. Approval applies only to the displayed content.",
484
+ ].join("\n");
485
+ }
486
+ function interopOrigin(host: InteropAgentId, entry: InteropAdoptionEntry): PluginOrigin {
487
+ const marketplace =
488
+ entry.item.marketplace && entry.item.marketplace !== "unknown" ? entry.item.marketplace : undefined;
489
+ return {
490
+ kind: "interop",
491
+ host,
492
+ source: path.resolve(entry.item.path),
493
+ ...(entry.format ? { format: entry.format } : {}),
494
+ ...(marketplace ? { marketplace } : {}),
495
+ };
496
+ }
497
+ export function applyInteropAdoption(
498
+ plan: InteropAdoptionPlan,
499
+ approved: boolean,
500
+ ): { installed: string[]; diagnostics: string[] } {
501
+ const result = { installed: [] as string[], diagnostics: [] as string[] };
502
+ if (!approved) {
503
+ result.diagnostics.push("Approval required; nothing installed.");
504
+ return result;
505
+ }
506
+ for (const entry of plan.entries) {
507
+ if (entry.action !== "install" || !entry.files || !entry.id) continue;
508
+ let staging: string | undefined;
509
+ try {
510
+ const current = prepared(entry.item, plan.host);
511
+ if (digest(entry.files) !== entry.digest || digest(current.files) !== entry.digest)
512
+ throw new Error("Source or plan changed after review; inspect a new plan.");
513
+ const missing = unmetRequirements(current.requirements, plan.cwd, plan.scope, vendorOf(current.format));
514
+ if (missing.length)
515
+ throw new Error(
516
+ `Unsatisfied package requirements after review: ${missing.join(", ")}. No extra resources are imported.`,
517
+ );
518
+ staging = mkdtempSync(path.join(tmpdir(), "clio-coder-interop-adopt-"));
519
+ for (const [file, text] of Object.entries(entry.files)) {
520
+ const target = path.join(staging, file);
521
+ mkdirSync(path.dirname(target), { recursive: true });
522
+ writeFileSync(target, text, { mode: 0o644 });
523
+ }
524
+ const candidate = readPluginManifest(staging);
525
+ if (!candidate.valid || !candidate.contentDigest)
526
+ throw new Error(candidate.diagnostics.map((d) => d.message).join("; "));
527
+ const installed = installInteropPackage({
528
+ sourcePath: staging,
529
+ kind: entry.item.kind as AdoptionKind,
530
+ trust: "foreign",
531
+ cwd: plan.cwd,
532
+ scope: plan.scope,
533
+ expectedId: entry.id,
534
+ expectedDigest: candidate.contentDigest,
535
+ origin: interopOrigin(plan.host, entry),
536
+ });
537
+ if (installed.plugin) result.installed.push(installed.plugin.id);
538
+ result.diagnostics.push(...installed.diagnostics.map((d) => d.message));
539
+ } catch (error) {
540
+ result.diagnostics.push(`${entry.item.name}: ${error instanceof Error ? error.message : String(error)}`);
541
+ } finally {
542
+ if (staging) rmSync(staging, { recursive: true, force: true });
543
+ }
544
+ }
545
+ return result;
546
+ }
@@ -1,8 +1,9 @@
1
1
  import { createHash } from "node:crypto";
2
- import { accessSync, constants, existsSync } from "node:fs";
3
- import { homedir } from "node:os";
2
+ import { accessSync, constants, existsSync, mkdirSync, mkdtempSync, rmSync, statSync } from "node:fs";
3
+ import { homedir, tmpdir } from "node:os";
4
4
  import path from "node:path";
5
5
  import { runCommandVector } from "../../core/safe-exec.js";
6
+ import { discoverInteropInventory } from "./inventory.js";
6
7
  import { INTEROP_AGENT_KINDS } from "./registry.js";
7
8
  import { readInteropReport } from "./state.js";
8
9
  import type {
@@ -22,6 +23,7 @@ export function resolveOnPath(binaryNames: ReadonlyArray<string>): { presence: I
22
23
  if (binaryNames.length === 0) return { presence: "absent" };
23
24
  const rawPath = process.env.PATH;
24
25
  if (rawPath === undefined || rawPath.length === 0) return { presence: "unknown" };
26
+ let unreadable = false;
25
27
  try {
26
28
  for (const dir of rawPath.split(path.delimiter)) {
27
29
  if (dir.length === 0) continue;
@@ -29,8 +31,9 @@ export function resolveOnPath(binaryNames: ReadonlyArray<string>): { presence: I
29
31
  const candidate = path.join(dir, name);
30
32
  try {
31
33
  accessSync(candidate, constants.X_OK);
32
- return { presence: "present", binary: candidate };
33
- } catch {
34
+ if (statSync(candidate).isFile()) return { presence: "present", binary: candidate };
35
+ } catch (error) {
36
+ if (["EACCES", "EPERM"].includes((error as NodeJS.ErrnoException).code ?? "")) unreadable = true;
34
37
  // Not this entry. A directory Clio cannot traverse is not evidence of absence,
35
38
  // but it is also not evidence of presence, so the sweep simply continues.
36
39
  }
@@ -39,7 +42,7 @@ export function resolveOnPath(binaryNames: ReadonlyArray<string>): { presence: I
39
42
  } catch {
40
43
  return { presence: "unknown" };
41
44
  }
42
- return { presence: "absent" };
45
+ return { presence: unreadable ? "unknown" : "absent" };
43
46
  }
44
47
 
45
48
  /**
@@ -74,18 +77,43 @@ function parseVersion(output: string): string | undefined {
74
77
  return /\b\d+\.\d+(?:\.\d+)?(?:[-+][0-9A-Za-z.-]+)?\b/.exec(output)?.[0];
75
78
  }
76
79
 
77
- async function probeVersion(binary: string, cwd: string): Promise<string | undefined> {
80
+ async function probeVersion(binary: string): Promise<string | undefined> {
81
+ let scratch: string | undefined;
78
82
  try {
83
+ // Even --version may create aliases or logs. Keep host and project profiles read-only.
84
+ scratch = mkdtempSync(path.join(tmpdir(), "clio-coder-interop-version-"));
85
+ const env: Record<string, string> = { HOME: scratch, USERPROFILE: scratch };
86
+ for (const key of [
87
+ "XDG_CONFIG_HOME",
88
+ "XDG_CACHE_HOME",
89
+ "XDG_STATE_HOME",
90
+ "XDG_DATA_HOME",
91
+ "APPDATA",
92
+ "LOCALAPPDATA",
93
+ "CLAUDE_CONFIG_DIR",
94
+ "CODEX_HOME",
95
+ "ANTIGRAVITY_HOME",
96
+ "OPENCODE_CONFIG_DIR",
97
+ "COPILOT_HOME",
98
+ "GEMINI_CLI_HOME",
99
+ ]) {
100
+ const directory = path.join(scratch, key.toLowerCase());
101
+ mkdirSync(directory);
102
+ env[key] = directory;
103
+ }
79
104
  const result = await runCommandVector(binary, ["--version"], {
80
- cwd,
81
- workspaceRoot: cwd,
105
+ cwd: scratch,
106
+ workspaceRoot: scratch,
107
+ env,
82
108
  timeoutMs: VERSION_PROBE_TIMEOUT_MS,
83
109
  maxOutputBytes: VERSION_PROBE_MAX_OUTPUT_BYTES,
84
110
  });
85
- if (result.timedOut || result.exitCode !== 0) return undefined;
111
+ if (result.timedOut || result.outputCapped || result.exitCode !== 0) return undefined;
86
112
  return parseVersion(`${result.stdout}\n${result.stderr}`);
87
113
  } catch {
88
114
  return undefined;
115
+ } finally {
116
+ if (scratch) rmSync(scratch, { recursive: true, force: true });
89
117
  }
90
118
  }
91
119
 
@@ -137,7 +165,12 @@ export async function detectInteropAgents(
137
165
  for (const kind of INTEROP_AGENT_KINDS) {
138
166
  const resolved = resolveOnPath(kind.binaryNames);
139
167
  const prior = priorByKind.get(kind.id);
140
- const installDir = installDirOf(kind, home);
168
+ const inventoryRoot =
169
+ input.inventory && kind.inventory
170
+ ? ((input.home === undefined ? process.env[kind.inventory.homeEnv ?? ""] : undefined) ??
171
+ path.join(home, kind.inventory.userRoot))
172
+ : undefined;
173
+ const installDir = inventoryRoot && existsSync(inventoryRoot) ? inventoryRoot : installDirOf(kind, home);
141
174
  const facts: InteropAgentFacts = {
142
175
  kind: kind.id,
143
176
  presence: resolved.presence,
@@ -150,7 +183,7 @@ export async function detectInteropAgents(
150
183
  if (resolved.binary !== undefined) {
151
184
  const version =
152
185
  input.probeVersion === true
153
- ? await probeVersion(resolved.binary, cwd)
186
+ ? await probeVersion(resolved.binary)
154
187
  : // A run that did not probe keeps the last version seen for the same
155
188
  // binary, so the fingerprint does not flip between probing callers.
156
189
  prior?.binary === resolved.binary
@@ -158,7 +191,12 @@ export async function detectInteropAgents(
158
191
  : undefined;
159
192
  if (version !== undefined) facts.version = version;
160
193
  }
161
- if (!detected(facts)) continue;
194
+ if (input.inventory === true && kind.inventory) {
195
+ facts.inventory = discoverInteropInventory(kind, home, cwd, input.home === undefined ? process.env : {});
196
+ facts.skillCount = facts.inventory.items.filter((item) => item.kind === "skill").length;
197
+ facts.projectArtifacts = facts.inventory.items.filter((item) => item.scope === "project").length;
198
+ }
199
+ if (!detected(facts) && !(input.inventory && kind.inventory)) continue;
162
200
  agents.push({
163
201
  ...facts,
164
202
  fingerprint: interopFingerprint(kind, facts),