@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,1048 @@
1
+ import { existsSync, realpathSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import path from "node:path";
4
+ import { readSettings } from "../../core/config.js";
5
+ import { resolvePackageRoot } from "../../core/package-root.js";
6
+ import { clioConfigDir } from "../../core/xdg.js";
7
+ import { listFleetContracts } from "../agents/fleet-contract.js";
8
+ import type { AgentRecipe } from "../agents/recipe.js";
9
+ import { type AgentRecipeDiagnostic, discoverAgentRecipes } from "../agents/registry.js";
10
+ import type { AgentAudience } from "../agents/spec.js";
11
+ import { INTEROP_AGENT_KINDS } from "../interop/registry.js";
12
+ import { bundledLibraryIndexPath, parsePluginGithubSource } from "../plugins/catalog.js";
13
+ import { listInstalledPlugins, readPluginInstallRecord } from "../plugins/state.js";
14
+ import type { InstalledPlugin, PluginInstallRecord, PluginScope } from "../plugins/types.js";
15
+ import type { ResourceDiagnostic } from "./collision.js";
16
+ import { discoverLibrary } from "./library.js";
17
+ import type {
18
+ LibraryEntryKind,
19
+ LibraryPackageEntry,
20
+ LibraryProvidedResource,
21
+ LibraryRequirementRef,
22
+ LibraryResourceKind,
23
+ } from "./library-types.js";
24
+ import { isLibraryKind, isLibraryResourceKind } from "./library-types.js";
25
+ import { type LibraryValidationPrerequisite, validateLibraryPackage } from "./library-validation.js";
26
+ import { loadPromptTemplates, type PromptTemplate } from "./prompts/loader.js";
27
+ import { loadSkills, type Skill } from "./skills/loader.js";
28
+
29
+ /**
30
+ * One body-free projection of three separate facts: catalog packages (install
31
+ * targets), installed scoped copies (state), and actual recipe resources (what
32
+ * the loaders really see). It composes the existing readers and never fetches,
33
+ * executes, reloads or writes. Package and recipe readers never call back into
34
+ * this module.
35
+ */
36
+
37
+ export type LibraryPackageFormat = "portable" | "claude-code" | "codex";
38
+
39
+ /** Where the bytes came from, derived from discovery, install and adoption evidence only. */
40
+ export type LibraryOrigin =
41
+ | { kind: "bundled"; catalog: string }
42
+ | { kind: "remote"; url: string; catalog?: string; host?: string }
43
+ | { kind: "local"; path: string; catalog?: string; host?: string }
44
+ | { kind: "imported"; agent: string; path: string; marketplace?: string }
45
+ | { kind: "core" }
46
+ | { kind: "unknown"; detail?: string };
47
+
48
+ /**
49
+ * `loadable` means the package engine admits the copy's resource roots. It says
50
+ * nothing about whether every recipe inside parsed or is trusted; that is the
51
+ * resource row's availability.
52
+ */
53
+ export type LibraryCopyState = "loadable" | "disabled" | "shadowed" | "invalid" | "incompatible" | "damaged";
54
+
55
+ export interface LibraryCopy {
56
+ ref: LibraryRequirementRef;
57
+ kind: LibraryEntryKind;
58
+ name: string;
59
+ scope: PluginScope;
60
+ root: string;
61
+ version: string;
62
+ state: LibraryCopyState;
63
+ enabled: boolean;
64
+ valid: boolean;
65
+ compatible: boolean;
66
+ effective: boolean;
67
+ loadable: boolean;
68
+ trust: "trusted" | "foreign";
69
+ overriddenBy?: PluginScope;
70
+ origin: LibraryOrigin;
71
+ format?: LibraryPackageFormat;
72
+ recordedDigest?: string;
73
+ observedDigest?: string;
74
+ installedAt?: string;
75
+ diagnostics: string[];
76
+ }
77
+
78
+ export interface LibraryPackageRecord {
79
+ ref: LibraryRequirementRef;
80
+ kind: LibraryEntryKind;
81
+ name: string;
82
+ description: string;
83
+ version?: string;
84
+ sha256?: string;
85
+ sourceUrl: string;
86
+ requires?: LibraryRequirementRef[];
87
+ origin: LibraryOrigin;
88
+ format?: LibraryPackageFormat;
89
+ /** Hints only; absent means contents are unknown until inspection. */
90
+ provides?: LibraryProvidedResource[];
91
+ /** Which reader produced the row: a catalog, a scoped index, or install state alone. */
92
+ catalogOrigin: LibraryPackageEntry["origin"];
93
+ copies: Array<{ scope: PluginScope; state: LibraryCopyState }>;
94
+ refusal?: string;
95
+ }
96
+
97
+ export type LibraryResourceSourceClass = "core" | "package" | "user" | "project" | "compat";
98
+ export type LibraryResourceAvailability = "available" | "untrusted" | "invalid" | "shadowed" | "unavailable";
99
+
100
+ export interface LibraryResource {
101
+ /** `${kind}:${name}@${sourceId}#${relativePath}`; two same-name files under one root stay distinct. */
102
+ key: string;
103
+ kind: LibraryResourceKind;
104
+ /** Actual runtime name: skill frontmatter name, agent file id, prompt path with colons, fleet contract name. */
105
+ name: string;
106
+ description: string;
107
+ invocation?: string;
108
+ path: string;
109
+ source: { class: LibraryResourceSourceClass; id: string; scope: "package" | "user" | "project" };
110
+ owner?: { ref: LibraryRequirementRef; scope: PluginScope; componentId?: string };
111
+ origin: LibraryOrigin;
112
+ format?: LibraryPackageFormat;
113
+ availability: LibraryResourceAvailability;
114
+ reason?: string;
115
+ trusted: boolean;
116
+ modelInvocable?: boolean;
117
+ audience?: AgentAudience;
118
+ diagnostics: string[];
119
+ }
120
+
121
+ export interface LibraryInventory {
122
+ version: 1;
123
+ generatedAt: string;
124
+ cwd: string;
125
+ audience: "operator" | "model";
126
+ packages: LibraryPackageRecord[];
127
+ copies: LibraryCopy[];
128
+ resources: LibraryResource[];
129
+ diagnostics: string[];
130
+ truncated: { packages: boolean; copies: boolean; resources: boolean };
131
+ }
132
+
133
+ export const LIBRARY_INVENTORY_LIMITS = {
134
+ packages: 512,
135
+ copies: 256,
136
+ resources: 1024,
137
+ diagnostics: 64,
138
+ copyDiagnostics: 16,
139
+ resourceDiagnostics: 8,
140
+ description: 512,
141
+ message: 512,
142
+ } as const;
143
+
144
+ function clip(value: string, limit: number = LIBRARY_INVENTORY_LIMITS.description): string {
145
+ return value.length > limit ? `${value.slice(0, limit - 1)}…` : value;
146
+ }
147
+
148
+ /** Append-only list that refuses rows past its cap so traversal, not a final slice, enforces the bound. */
149
+ class Bounded<T> {
150
+ readonly items: T[] = [];
151
+ truncated = false;
152
+ constructor(private readonly limit: number) {}
153
+ push(item: T): boolean {
154
+ if (this.items.length >= this.limit) {
155
+ this.truncated = true;
156
+ return false;
157
+ }
158
+ this.items.push(item);
159
+ return true;
160
+ }
161
+ }
162
+
163
+ export interface LibraryInventoryOptions {
164
+ cwd?: string;
165
+ catalog?: string;
166
+ /** `model` hides internal/shadow agents and every resource the model may not invoke. Default operator. */
167
+ audience?: "operator" | "model";
168
+ /** Operator only: include shadow/internal agents. */
169
+ all?: boolean;
170
+ /** Packages match their own kind or a provided hint kind; resources match exactly. */
171
+ kinds?: ReadonlyArray<LibraryEntryKind>;
172
+ query?: string;
173
+ /** `kind:name` package ref, a resource key, or a bare runtime name. */
174
+ ref?: string;
175
+ sources?: ReadonlyArray<LibraryResourceSourceClass>;
176
+ /** Skip a whole reader when a caller does not need it. */
177
+ include?: { packages?: boolean; copies?: boolean; resources?: boolean };
178
+ trustProjectCompatRoots?: boolean;
179
+ /** Testing seam: the config dir used for user roots. */
180
+ configDir?: string;
181
+ /** Testing seam: the home directory used for compatibility roots. */
182
+ home?: string;
183
+ }
184
+
185
+ // ---------------------------------------------------------------------------
186
+ // Keys
187
+ // ---------------------------------------------------------------------------
188
+
189
+ export function libraryResourceKey(
190
+ kind: LibraryResourceKind,
191
+ name: string,
192
+ sourceId: string,
193
+ relativePath: string,
194
+ ): string {
195
+ return `${kind}:${name}@${sourceId}#${relativePath}`;
196
+ }
197
+
198
+ export interface LibraryResourceKeyParts {
199
+ kind: LibraryResourceKind;
200
+ name: string;
201
+ sourceId: string;
202
+ /** Absent when a caller addresses every file with that name under that source. */
203
+ relativePath?: string;
204
+ }
205
+
206
+ export function parseLibraryResourceKey(key: string): LibraryResourceKeyParts | undefined {
207
+ const hash = key.indexOf("#");
208
+ const head = hash >= 0 ? key.slice(0, hash) : key;
209
+ const at = head.lastIndexOf("@");
210
+ const colon = head.indexOf(":");
211
+ if (at <= 0 || colon <= 0 || colon > at) return undefined;
212
+ const kind = head.slice(0, colon);
213
+ const name = head.slice(colon + 1, at);
214
+ const sourceId = head.slice(at + 1);
215
+ if (!isLibraryResourceKind(kind) || !name || !sourceId) return undefined;
216
+ const relativePath = hash >= 0 ? key.slice(hash + 1) : undefined;
217
+ return { kind, name, sourceId, ...(relativePath ? { relativePath } : {}) };
218
+ }
219
+
220
+ function keyMatches(key: string, parts: LibraryResourceKeyParts): boolean {
221
+ const own = parseLibraryResourceKey(key);
222
+ if (!own) return false;
223
+ return (
224
+ own.kind === parts.kind &&
225
+ own.name === parts.name &&
226
+ own.sourceId === parts.sourceId &&
227
+ (parts.relativePath === undefined || own.relativePath === parts.relativePath)
228
+ );
229
+ }
230
+
231
+ /** Anchors that turn an absolute file path into the contained relative path a key carries. */
232
+ interface KeyAnchors {
233
+ cwd: string;
234
+ home: string;
235
+ configDir?: string;
236
+ packageRoot?: string;
237
+ }
238
+
239
+ function relativeTo(anchor: string | undefined, filePath: string): string | undefined {
240
+ if (!anchor) return undefined;
241
+ const relative = path.relative(canonical(anchor), canonical(filePath));
242
+ return contained(canonical(anchor), canonical(filePath)) ? relative.split(path.sep).join("/") : undefined;
243
+ }
244
+
245
+ function keyPath(anchors: KeyAnchors, sourceId: string, filePath: string, owner: LibraryCopy | undefined): string {
246
+ const candidate =
247
+ (owner ? relativeTo(owner.root, filePath) : undefined) ??
248
+ (sourceId === "core" ? relativeTo(anchors.packageRoot, filePath) : undefined) ??
249
+ (sourceId === "config" ? relativeTo(anchors.configDir, filePath) : undefined) ??
250
+ (sourceId === "project" || sourceId.endsWith("-project") ? relativeTo(anchors.cwd, filePath) : undefined) ??
251
+ relativeTo(anchors.home, filePath);
252
+ return candidate ?? path.basename(filePath);
253
+ }
254
+
255
+ // ---------------------------------------------------------------------------
256
+ // Origin classification
257
+ // ---------------------------------------------------------------------------
258
+
259
+ function bundledLibraryDir(): string | undefined {
260
+ try {
261
+ return path.join(resolvePackageRoot(), "library");
262
+ } catch {
263
+ return undefined;
264
+ }
265
+ }
266
+
267
+ function contained(root: string, target: string): boolean {
268
+ const relative = path.relative(root, target);
269
+ return relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative);
270
+ }
271
+
272
+ function canonical(value: string): string {
273
+ try {
274
+ return realpathSync(value);
275
+ } catch {
276
+ return path.resolve(value);
277
+ }
278
+ }
279
+
280
+ function underBundledLibrary(candidate: string): boolean {
281
+ const dir = bundledLibraryDir();
282
+ if (!dir || !path.isAbsolute(candidate)) return false;
283
+ return contained(canonical(dir), canonical(candidate));
284
+ }
285
+
286
+ function bundledIndex(): string | undefined {
287
+ try {
288
+ return bundledLibraryIndexPath();
289
+ } catch {
290
+ return undefined;
291
+ }
292
+ }
293
+
294
+ /** Loose-file source ids look like `claude-user`, `codex-project`; the prefix is the local agent. */
295
+ function compatHost(sourceId: string): string | undefined {
296
+ const match = /^(.+)-(user|project)$/.exec(sourceId);
297
+ const host = match?.[1];
298
+ return host && host !== "unknown" ? host : undefined;
299
+ }
300
+
301
+ function formatForHost(host: string | undefined): LibraryPackageFormat | undefined {
302
+ if (host === "claude" || host === "claude-code") return "claude-code";
303
+ if (host === "codex") return "codex";
304
+ return undefined;
305
+ }
306
+
307
+ export type LibraryOriginEvidence =
308
+ | { kind: "catalog-row"; entry: LibraryPackageEntry }
309
+ | { kind: "install-record"; record: PluginInstallRecord | undefined; rootPath: string }
310
+ | { kind: "resource-root"; sourceId: string; path: string };
311
+
312
+ /** One rule shared by CLI, context and UI. Author metadata never reaches it. */
313
+ export function classifyLibraryOrigin(evidence: LibraryOriginEvidence): {
314
+ origin: LibraryOrigin;
315
+ format?: LibraryPackageFormat;
316
+ } {
317
+ if (evidence.kind === "catalog-row") {
318
+ const { entry } = evidence;
319
+ if (entry.origin === "installed") return { origin: { kind: "unknown", detail: "no catalog row" } };
320
+ const catalog = entry.index;
321
+ const bundled = bundledIndex();
322
+ if (catalog && bundled && canonical(catalog) === canonical(bundled))
323
+ return { origin: { kind: "bundled", catalog }, format: "portable" };
324
+ if (parsePluginGithubSource(entry.sourceUrl))
325
+ return { origin: { kind: "remote", url: entry.sourceUrl, ...(catalog ? { catalog } : {}) }, format: "portable" };
326
+ return { origin: { kind: "local", path: entry.sourceUrl, ...(catalog ? { catalog } : {}) }, format: "portable" };
327
+ }
328
+ if (evidence.kind === "install-record") {
329
+ const { record } = evidence;
330
+ if (!record) return { origin: { kind: "unknown", detail: "install record unavailable" } };
331
+ const origin = record.origin;
332
+ if (origin === undefined || typeof origin === "string") {
333
+ const source = origin ?? record.source;
334
+ if (parsePluginGithubSource(source)) return { origin: { kind: "remote", url: source }, format: "portable" };
335
+ if (path.isAbsolute(source))
336
+ return underBundledLibrary(source)
337
+ ? { origin: { kind: "bundled", catalog: bundledIndex() ?? source }, format: "portable" }
338
+ : { origin: { kind: "local", path: source }, format: "portable" };
339
+ return { origin: { kind: "unknown", detail: `unclassified source: ${source}` } };
340
+ }
341
+ switch (origin.kind) {
342
+ case "catalog": {
343
+ if (parsePluginGithubSource(origin.source))
344
+ return { origin: { kind: "remote", url: origin.source }, format: "portable" };
345
+ if (underBundledLibrary(origin.source))
346
+ return { origin: { kind: "bundled", catalog: bundledIndex() ?? origin.source }, format: "portable" };
347
+ return { origin: { kind: "local", path: origin.source }, format: "portable" };
348
+ }
349
+ case "github":
350
+ return { origin: { kind: "remote", url: origin.source }, format: "portable" };
351
+ case "local":
352
+ return { origin: { kind: "local", path: origin.source }, format: "portable" };
353
+ case "interop":
354
+ return {
355
+ origin: {
356
+ kind: "imported",
357
+ agent: origin.host,
358
+ path: origin.source,
359
+ ...(origin.marketplace ? { marketplace: origin.marketplace } : {}),
360
+ },
361
+ format: origin.format ?? "portable",
362
+ };
363
+ case "import":
364
+ return {
365
+ origin:
366
+ origin.transport === "github"
367
+ ? { kind: "remote", url: origin.source, ...(origin.host ? { host: origin.host } : {}) }
368
+ : { kind: "local", path: origin.source, ...(origin.host ? { host: origin.host } : {}) },
369
+ format: origin.format,
370
+ };
371
+ default:
372
+ return { origin: { kind: "unknown", detail: "unrecognized origin record" } };
373
+ }
374
+ }
375
+ const { sourceId } = evidence;
376
+ if (sourceId === "core") return { origin: { kind: "core" } };
377
+ if (sourceId.startsWith("plugin:"))
378
+ return { origin: { kind: "unknown", detail: "package origin requires its installed copy record" } };
379
+ if (sourceId === "config" || sourceId === "project")
380
+ return { origin: { kind: "local", path: evidence.path }, format: "portable" };
381
+ const host = compatHost(sourceId);
382
+ const format = formatForHost(host);
383
+ return {
384
+ origin: { kind: "local", path: evidence.path, ...(host ? { host } : {}) },
385
+ ...(format ? { format } : {}),
386
+ };
387
+ }
388
+
389
+ // ---------------------------------------------------------------------------
390
+ // Copies
391
+ // ---------------------------------------------------------------------------
392
+
393
+ /** The one copy-state projection, shared with lifecycle verification. */
394
+ export function libraryCopyState(plugin: InstalledPlugin): LibraryCopyState {
395
+ if (plugin.loadable) return "loadable";
396
+ if (!plugin.compatible) return "incompatible";
397
+ // No parsed manifest means the copy is not a package any more; drift only
398
+ // describes a package whose recorded bytes changed.
399
+ if (!plugin.manifest) return "invalid";
400
+ if (plugin.diagnostics.some((item) => item.message.includes("content drift"))) return "damaged";
401
+ if (!plugin.valid) return "invalid";
402
+ if (!plugin.enabled) return "disabled";
403
+ if (!plugin.effective) return "shadowed";
404
+ return "invalid";
405
+ }
406
+
407
+ function safeInstallRecord(plugin: InstalledPlugin, cwd: string): PluginInstallRecord | undefined {
408
+ try {
409
+ return readPluginInstallRecord(plugin.id, { cwd, scope: plugin.scope });
410
+ } catch {
411
+ return undefined;
412
+ }
413
+ }
414
+
415
+ function projectCopy(plugin: InstalledPlugin, cwd: string): LibraryCopy {
416
+ const kind = plugin.kind ?? "plugin";
417
+ const record = safeInstallRecord(plugin, cwd);
418
+ const classified = classifyLibraryOrigin({ kind: "install-record", record, rootPath: plugin.rootPath });
419
+ return {
420
+ ref: `${kind}:${plugin.id}`,
421
+ kind,
422
+ name: plugin.id,
423
+ scope: plugin.scope,
424
+ root: plugin.rootPath,
425
+ version: plugin.version,
426
+ state: libraryCopyState(plugin),
427
+ enabled: plugin.enabled,
428
+ valid: plugin.valid,
429
+ compatible: plugin.compatible,
430
+ effective: plugin.effective,
431
+ loadable: plugin.loadable,
432
+ trust: plugin.trust ?? "trusted",
433
+ ...(plugin.overriddenBy ? { overriddenBy: plugin.overriddenBy } : {}),
434
+ origin: classified.origin,
435
+ ...(classified.format ? { format: classified.format } : {}),
436
+ ...(record?.contentDigest ? { recordedDigest: record.contentDigest } : {}),
437
+ ...(plugin.observedContentDigest ? { observedDigest: plugin.observedContentDigest } : {}),
438
+ ...(record?.installedAt ? { installedAt: record.installedAt } : {}),
439
+ diagnostics: plugin.diagnostics
440
+ .slice(0, LIBRARY_INVENTORY_LIMITS.copyDiagnostics)
441
+ .map((item) => clip(item.message, LIBRARY_INVENTORY_LIMITS.message)),
442
+ };
443
+ }
444
+
445
+ // ---------------------------------------------------------------------------
446
+ // Resources
447
+ // ---------------------------------------------------------------------------
448
+
449
+ interface OwnerIndex {
450
+ /** `plugin:<scope>:<id>` → copy */
451
+ bySourceId: Map<string, LibraryCopy>;
452
+ /** canonical root → copy, for readers that only expose a file path */
453
+ roots: Array<{ root: string; copy: LibraryCopy }>;
454
+ anchors: KeyAnchors;
455
+ }
456
+
457
+ function ownerIndex(copies: ReadonlyArray<LibraryCopy>, anchors: KeyAnchors): OwnerIndex {
458
+ const bySourceId = new Map<string, LibraryCopy>();
459
+ const roots: OwnerIndex["roots"] = [];
460
+ for (const copy of copies) {
461
+ bySourceId.set(`plugin:${copy.scope}:${copy.name}`, copy);
462
+ roots.push({ root: canonical(copy.root), copy });
463
+ }
464
+ // Longest root first so a nested package root wins containment.
465
+ roots.sort((a, b) => b.root.length - a.root.length);
466
+ return { bySourceId, roots, anchors };
467
+ }
468
+
469
+ function ownerByPath(index: OwnerIndex, filePath: string): LibraryCopy | undefined {
470
+ const target = canonical(filePath);
471
+ return index.roots.find((item) => contained(item.root, target))?.copy;
472
+ }
473
+
474
+ function ownerOf(copy: LibraryCopy): NonNullable<LibraryResource["owner"]> {
475
+ return { ref: copy.ref, scope: copy.scope };
476
+ }
477
+
478
+ function sourceClassFor(sourceId: string): LibraryResourceSourceClass {
479
+ if (sourceId === "core") return "core";
480
+ if (sourceId.startsWith("plugin:")) return "package";
481
+ if (sourceId === "config") return "user";
482
+ if (sourceId === "project") return "project";
483
+ return "compat";
484
+ }
485
+
486
+ function resourceOrigin(
487
+ sourceId: string,
488
+ filePath: string,
489
+ owner: LibraryCopy | undefined,
490
+ ): { origin: LibraryOrigin; format?: LibraryPackageFormat } {
491
+ if (owner) return { origin: owner.origin, ...(owner.format ? { format: owner.format } : {}) };
492
+ return classifyLibraryOrigin({ kind: "resource-root", sourceId, path: filePath });
493
+ }
494
+
495
+ function bounded(diagnostics: ReadonlyArray<string>): string[] {
496
+ return diagnostics
497
+ .slice(0, LIBRARY_INVENTORY_LIMITS.resourceDiagnostics)
498
+ .map((message) => clip(message, LIBRARY_INVENTORY_LIMITS.message));
499
+ }
500
+
501
+ function fromSkill(skill: Skill, index: OwnerIndex): LibraryResource {
502
+ const sourceId = skill.sourceInfo.source ?? `${skill.source}-${skill.scope}`;
503
+ const owner =
504
+ index.bySourceId.get(sourceId) ?? (skill.scope === "package" ? ownerByPath(index, skill.filePath) : undefined);
505
+ const hard = skill.diagnostics.some((item) => item.type === "error" || item.type === "collision");
506
+ const availability: LibraryResourceAvailability = hard ? "invalid" : skill.trusted ? "available" : "untrusted";
507
+ const reason = hard
508
+ ? skill.diagnostics.find((item) => item.type === "error" || item.type === "collision")?.message
509
+ : !skill.trusted
510
+ ? "root is not trusted; enable integrations.projectResources.trustProjectImports or install the package"
511
+ : undefined;
512
+ const scope = skill.scope === "cli" ? "user" : skill.scope;
513
+ return {
514
+ key: libraryResourceKey("skill", skill.name, sourceId, keyPath(index.anchors, sourceId, skill.filePath, owner)),
515
+ kind: "skill",
516
+ name: skill.name,
517
+ description: clip(skill.description),
518
+ ...(availability === "available" ? { invocation: `/skill ${skill.name}` } : {}),
519
+ path: skill.filePath,
520
+ source: { class: sourceClassFor(sourceId), id: sourceId, scope },
521
+ ...(owner ? { owner: ownerOf(owner) } : {}),
522
+ ...resourceOrigin(sourceId, skill.filePath, owner),
523
+ availability,
524
+ ...(reason ? { reason: clip(reason, LIBRARY_INVENTORY_LIMITS.message) } : {}),
525
+ trusted: skill.trusted,
526
+ modelInvocable: skill.trusted && !skill.disableModelInvocation && !hard,
527
+ diagnostics: bounded(skill.diagnostics.map((item) => item.message)),
528
+ };
529
+ }
530
+
531
+ function fromPrompt(template: PromptTemplate, index: OwnerIndex): LibraryResource {
532
+ const scope = template.sourceInfo.scope === "cli" ? "user" : template.sourceInfo.scope;
533
+ const sourceId = template.sourceInfo.source ?? scope;
534
+ const owner =
535
+ index.bySourceId.get(sourceId) ?? (scope === "package" ? ownerByPath(index, template.filePath) : undefined);
536
+ const availability: LibraryResourceAvailability = template.unavailable
537
+ ? "unavailable"
538
+ : template.trusted
539
+ ? "available"
540
+ : "untrusted";
541
+ const reason = template.unavailable
542
+ ? template.unavailable
543
+ : !template.trusted
544
+ ? "root is not trusted; enable integrations.projectResources.trustProjectImports or install the package"
545
+ : undefined;
546
+ return {
547
+ key: libraryResourceKey(
548
+ "prompt",
549
+ template.name,
550
+ sourceId,
551
+ keyPath(index.anchors, sourceId, template.filePath, owner),
552
+ ),
553
+ kind: "prompt",
554
+ name: template.name,
555
+ description: clip(template.description),
556
+ ...(availability === "available" ? { invocation: `/${template.name}` } : {}),
557
+ path: template.filePath,
558
+ source: { class: sourceClassFor(sourceId), id: sourceId, scope },
559
+ ...(owner ? { owner: ownerOf(owner) } : {}),
560
+ ...resourceOrigin(sourceId, template.filePath, owner),
561
+ availability,
562
+ ...(reason ? { reason: clip(reason, LIBRARY_INVENTORY_LIMITS.message) } : {}),
563
+ trusted: template.trusted,
564
+ diagnostics: [],
565
+ };
566
+ }
567
+
568
+ function agentSourceId(
569
+ recipe: Pick<AgentRecipe, "source" | "filepath">,
570
+ index: OwnerIndex,
571
+ ): { sourceId: string; owner?: LibraryCopy } {
572
+ if (recipe.source === "builtin") return { sourceId: "core" };
573
+ if (recipe.source === "user") return { sourceId: "config" };
574
+ if (recipe.source === "project") return { sourceId: "project" };
575
+ const owner = ownerByPath(index, recipe.filepath);
576
+ return owner ? { sourceId: `plugin:${owner.scope}:${owner.name}`, owner } : { sourceId: "plugin:unknown" };
577
+ }
578
+
579
+ function agentScope(source: AgentRecipe["source"]): "package" | "user" | "project" {
580
+ return source === "user" ? "user" : source === "project" ? "project" : "package";
581
+ }
582
+
583
+ function fromAgent(recipe: AgentRecipe, index: OwnerIndex): LibraryResource {
584
+ const { sourceId, owner } = agentSourceId(recipe, index);
585
+ const scope = agentScope(recipe.source);
586
+ return {
587
+ key: libraryResourceKey("agent", recipe.id, sourceId, keyPath(index.anchors, sourceId, recipe.filepath, owner)),
588
+ kind: "agent",
589
+ name: recipe.id,
590
+ description: clip(recipe.description),
591
+ invocation: `dispatch(agent="${recipe.id}")`,
592
+ path: recipe.filepath,
593
+ source: { class: sourceClassFor(sourceId), id: sourceId, scope },
594
+ ...(owner ? { owner: ownerOf(owner) } : {}),
595
+ ...resourceOrigin(sourceId, recipe.filepath, owner),
596
+ availability: "available",
597
+ trusted: true,
598
+ audience: recipe.audience,
599
+ diagnostics: [],
600
+ };
601
+ }
602
+
603
+ function fromAgentDiagnostic(diagnostic: AgentRecipeDiagnostic, index: OwnerIndex): LibraryResource {
604
+ const { sourceId, owner } = agentSourceId({ source: diagnostic.source, filepath: diagnostic.filepath }, index);
605
+ const scope = agentScope(diagnostic.source);
606
+ const name = diagnostic.id ?? path.basename(diagnostic.filepath, ".md");
607
+ const availability: LibraryResourceAvailability =
608
+ diagnostic.kind === "overridden" ? "shadowed" : diagnostic.kind === "ignored" ? "unavailable" : "invalid";
609
+ return {
610
+ key: libraryResourceKey("agent", name, sourceId, keyPath(index.anchors, sourceId, diagnostic.filepath, owner)),
611
+ kind: "agent",
612
+ name,
613
+ description: "",
614
+ path: diagnostic.filepath,
615
+ source: { class: sourceClassFor(sourceId), id: sourceId, scope },
616
+ ...(owner ? { owner: ownerOf(owner) } : {}),
617
+ ...resourceOrigin(sourceId, diagnostic.filepath, owner),
618
+ availability,
619
+ reason: clip(diagnostic.message, LIBRARY_INVENTORY_LIMITS.message),
620
+ trusted: true,
621
+ ...(diagnostic.audience ? { audience: diagnostic.audience } : {}),
622
+ diagnostics: bounded([diagnostic.message]),
623
+ };
624
+ }
625
+
626
+ function fromFleet(listing: ReturnType<typeof listFleetContracts>[number], index: OwnerIndex): LibraryResource {
627
+ const { sourceId, owner } = agentSourceId({ source: listing.source, filepath: listing.path }, index);
628
+ const scope = agentScope(listing.source);
629
+ const name = listing.contract?.name ?? listing.name;
630
+ const availability: LibraryResourceAvailability = listing.contract
631
+ ? "available"
632
+ : listing.needsCommands
633
+ ? "unavailable"
634
+ : "invalid";
635
+ const reason = listing.error ?? undefined;
636
+ return {
637
+ key: libraryResourceKey("fleet", name, sourceId, keyPath(index.anchors, sourceId, listing.path, owner)),
638
+ kind: "fleet",
639
+ name,
640
+ description: clip(listing.contract?.description ?? ""),
641
+ ...(availability === "available" ? { invocation: `/fleet run ${name}` } : {}),
642
+ path: listing.path,
643
+ source: { class: sourceClassFor(sourceId), id: sourceId, scope },
644
+ ...(owner ? { owner: ownerOf(owner) } : {}),
645
+ ...resourceOrigin(sourceId, listing.path, owner),
646
+ availability,
647
+ ...(reason ? { reason: clip(reason, LIBRARY_INVENTORY_LIMITS.message) } : {}),
648
+ trusted: true,
649
+ diagnostics: reason ? bounded([reason]) : [],
650
+ };
651
+ }
652
+
653
+ /** A collision loser is a real file the loader read and discarded; it stays inspectable. */
654
+ function fromCollisionLoser(
655
+ kind: LibraryResourceKind,
656
+ diagnostic: ResourceDiagnostic,
657
+ winners: ReadonlyArray<LibraryResource>,
658
+ index: OwnerIndex,
659
+ sourceIdFor: (filePath: string, scope: "package" | "user" | "project") => string,
660
+ ): LibraryResource | undefined {
661
+ const collision = diagnostic.collision;
662
+ if (!collision) return undefined;
663
+ if (winners.some((item) => item.path === collision.loserPath)) return undefined;
664
+ const scope = collision.loserScope === "cli" ? "user" : collision.loserScope;
665
+ const owner = scope === "package" ? ownerByPath(index, collision.loserPath) : undefined;
666
+ const sourceId = owner ? `plugin:${owner.scope}:${owner.name}` : sourceIdFor(collision.loserPath, scope);
667
+ return {
668
+ key: libraryResourceKey(kind, collision.name, sourceId, keyPath(index.anchors, sourceId, collision.loserPath, owner)),
669
+ kind,
670
+ name: collision.name,
671
+ description: "",
672
+ path: collision.loserPath,
673
+ source: { class: sourceClassFor(sourceId), id: sourceId, scope },
674
+ ...(owner ? { owner: ownerOf(owner) } : {}),
675
+ ...resourceOrigin(sourceId, collision.loserPath, owner),
676
+ availability: "shadowed",
677
+ reason: clip(diagnostic.message, LIBRARY_INVENTORY_LIMITS.message),
678
+ trusted: false,
679
+ diagnostics: bounded([diagnostic.message]),
680
+ };
681
+ }
682
+
683
+ /**
684
+ * Source id for a file the loaders only named in a collision diagnostic. Clio's
685
+ * own roots map to `config`/`project`; a compatibility root maps to the id the
686
+ * loader itself assigns (`claude-user` for skills, `claude-code-user` for
687
+ * prompts) by containment in the interop registry's declared roots. A file
688
+ * under no known root gets `unknown-<scope>`, never an invented vendor.
689
+ */
690
+ function looseSourceId(anchors: KeyAnchors, kind: "skill" | "prompt") {
691
+ return (filePath: string, scope: "package" | "user" | "project"): string => {
692
+ if (scope === "package") return "plugin:unknown";
693
+ const target = canonical(filePath);
694
+ if (scope === "project" && contained(canonical(path.join(anchors.cwd, ".clio-coder")), target)) return "project";
695
+ if (scope === "user" && anchors.configDir && contained(canonical(anchors.configDir), target)) return "config";
696
+ const base = scope === "user" ? anchors.home : anchors.cwd;
697
+ for (const agent of INTEROP_AGENT_KINDS) {
698
+ const root =
699
+ kind === "skill"
700
+ ? scope === "user"
701
+ ? agent.userSkillRoot
702
+ : agent.projectSkillRoot
703
+ : scope === "user"
704
+ ? agent.userPromptRoot
705
+ : agent.projectPromptRoot;
706
+ const id = kind === "skill" ? agent.skillSource : agent.id;
707
+ if (root && id && contained(canonical(path.join(base, root)), target)) return `${id}-${scope}`;
708
+ }
709
+ return `unknown-${scope}`;
710
+ };
711
+ }
712
+
713
+ // ---------------------------------------------------------------------------
714
+ // Filters
715
+ // ---------------------------------------------------------------------------
716
+
717
+ interface Selection {
718
+ packageRef?: LibraryRequirementRef;
719
+ resourceKey?: ReturnType<typeof parseLibraryResourceKey>;
720
+ name?: string;
721
+ }
722
+
723
+ function parseSelection(ref: string | undefined): Selection {
724
+ if (!ref) return {};
725
+ const key = parseLibraryResourceKey(ref);
726
+ if (key) return { resourceKey: key };
727
+ const colon = ref.indexOf(":");
728
+ if (colon > 0 && isLibraryKind(ref.slice(0, colon))) return { packageRef: ref as LibraryRequirementRef };
729
+ return { name: ref };
730
+ }
731
+
732
+ function matchesQuery(query: string | undefined, ...fields: ReadonlyArray<string | undefined>): boolean {
733
+ if (!query) return true;
734
+ const needle = query.toLowerCase();
735
+ return fields.some((field) => field?.toLowerCase().includes(needle));
736
+ }
737
+
738
+ function packageMatches(record: LibraryPackageRecord, options: LibraryInventoryOptions, selection: Selection): boolean {
739
+ if (selection.packageRef && record.ref !== selection.packageRef) return false;
740
+ if (selection.name && record.name !== selection.name && !record.provides?.some((hint) => hint.name === selection.name))
741
+ return false;
742
+ if (selection.resourceKey) {
743
+ // An exact key names one file under one source. Only its owner answers;
744
+ // hints in other packages never match a key that already has an owner.
745
+ const key = selection.resourceKey;
746
+ if (!key.sourceId.startsWith("plugin:") || key.sourceId.split(":")[2] !== record.name) return false;
747
+ }
748
+ if (options.kinds?.length) {
749
+ const kinds = options.kinds;
750
+ if (!kinds.includes(record.kind) && !record.provides?.some((hint) => kinds.includes(hint.kind))) return false;
751
+ }
752
+ return matchesQuery(
753
+ options.query,
754
+ record.name,
755
+ record.description,
756
+ ...(record.provides ?? []).map((hint) => hint.name),
757
+ );
758
+ }
759
+
760
+ function copyMatches(copy: LibraryCopy, options: LibraryInventoryOptions, selection: Selection): boolean {
761
+ if (selection.packageRef && copy.ref !== selection.packageRef) return false;
762
+ if (selection.name && copy.name !== selection.name) return false;
763
+ if (selection.resourceKey && selection.resourceKey.sourceId !== `plugin:${copy.scope}:${copy.name}`) return false;
764
+ if (options.kinds?.length && !options.kinds.includes(copy.kind)) return false;
765
+ return true;
766
+ }
767
+
768
+ function resourceMatches(resource: LibraryResource, options: LibraryInventoryOptions, selection: Selection): boolean {
769
+ if (selection.packageRef && resource.owner?.ref !== selection.packageRef) {
770
+ const [kind, name] = selection.packageRef.split(":", 2);
771
+ if (!(kind === resource.kind && name === resource.name)) return false;
772
+ }
773
+ if (selection.name && resource.name !== selection.name) return false;
774
+ if (selection.resourceKey && !keyMatches(resource.key, selection.resourceKey)) return false;
775
+ if (options.kinds?.length && !options.kinds.includes(resource.kind)) return false;
776
+ if (options.sources?.length && !options.sources.includes(resource.source.class)) return false;
777
+ return matchesQuery(options.query, resource.name, resource.description);
778
+ }
779
+
780
+ function audienceAdmits(resource: LibraryResource, options: LibraryInventoryOptions): boolean {
781
+ const model = options.audience === "model";
782
+ if (resource.kind === "agent" && (resource.audience === "shadow" || resource.audience === "internal"))
783
+ return !model && options.all === true;
784
+ if (model) return resource.availability === "available" && resource.modelInvocable !== false;
785
+ return true;
786
+ }
787
+
788
+ // ---------------------------------------------------------------------------
789
+ // Read
790
+ // ---------------------------------------------------------------------------
791
+
792
+ function trustSetting(explicit: boolean | undefined): boolean {
793
+ if (explicit !== undefined) return explicit;
794
+ try {
795
+ return readSettings().integrations.projectResources.trustProjectImports;
796
+ } catch {
797
+ return false;
798
+ }
799
+ }
800
+
801
+ function sortResources(items: LibraryResource[]): LibraryResource[] {
802
+ const order: Record<LibraryResourceKind, number> = { skill: 0, agent: 1, prompt: 2, fleet: 3 };
803
+ return items.sort(
804
+ (a, b) =>
805
+ order[a.kind] - order[b.kind] ||
806
+ a.name.localeCompare(b.name) ||
807
+ a.source.id.localeCompare(b.source.id) ||
808
+ a.key.localeCompare(b.key),
809
+ );
810
+ }
811
+
812
+ export function readLibraryInventory(options: LibraryInventoryOptions = {}): LibraryInventory {
813
+ const cwd = path.resolve(options.cwd ?? process.cwd());
814
+ const include = { packages: true, copies: true, resources: true, ...(options.include ?? {}) };
815
+ const selection = parseSelection(options.ref);
816
+ const diagnostics = new Bounded<string>(LIBRARY_INVENTORY_LIMITS.diagnostics);
817
+ const note = (message: string): void => {
818
+ const text = clip(message, LIBRARY_INVENTORY_LIMITS.message);
819
+ if (!diagnostics.items.includes(text)) diagnostics.push(text);
820
+ };
821
+ const wants = (kind: LibraryResourceKind): boolean => !options.kinds?.length || options.kinds.includes(kind);
822
+
823
+ // Copies underpin package state and resource ownership, so they are read
824
+ // whenever either of those is requested. The package engine enumerates every
825
+ // scoped copy for precedence; only the projection is capped here.
826
+ const installed =
827
+ include.copies || include.packages || include.resources ? listInstalledPlugins(cwd, { all: true }) : [];
828
+ const copyRows = new Bounded<LibraryCopy>(LIBRARY_INVENTORY_LIMITS.copies);
829
+ for (const plugin of installed) if (!copyRows.push(projectCopy(plugin, cwd))) break;
830
+ if (copyRows.truncated) note("installed copies truncated; later copies have no owner rows");
831
+ const copies = copyRows.items;
832
+ const copiesByRef = new Map<string, LibraryCopy[]>();
833
+ for (const copy of copies) copiesByRef.set(copy.ref, [...(copiesByRef.get(copy.ref) ?? []), copy]);
834
+
835
+ const packages = new Bounded<LibraryPackageRecord>(LIBRARY_INVENTORY_LIMITS.packages);
836
+ if (include.packages) {
837
+ const discovery = discoverLibrary({ cwd, ...(options.catalog ? { catalog: options.catalog } : {}) });
838
+ for (const message of discovery.diagnostics) note(message);
839
+ for (const entry of discovery.entries) {
840
+ const ref: LibraryRequirementRef = `${entry.kind}:${entry.name}`;
841
+ const own = copiesByRef.get(ref) ?? [];
842
+ const classified =
843
+ entry.origin === "installed" && own[0]
844
+ ? { origin: own[0].origin, ...(own[0].format ? { format: own[0].format } : {}) }
845
+ : classifyLibraryOrigin({ kind: "catalog-row", entry });
846
+ const refusal = discovery.refusals[ref];
847
+ const record: LibraryPackageRecord = {
848
+ ref,
849
+ kind: entry.kind,
850
+ name: entry.name,
851
+ description: clip(entry.description),
852
+ ...(entry.version ? { version: entry.version } : {}),
853
+ ...(entry.sha256 ? { sha256: entry.sha256 } : {}),
854
+ sourceUrl: entry.sourceUrl,
855
+ ...(entry.requires ? { requires: entry.requires } : {}),
856
+ origin: classified.origin,
857
+ ...(classified.format ? { format: classified.format } : {}),
858
+ ...(entry.provides ? { provides: entry.provides } : {}),
859
+ catalogOrigin: entry.origin,
860
+ copies: own.map((copy) => ({ scope: copy.scope, state: copy.state })),
861
+ ...(refusal ? { refusal } : {}),
862
+ };
863
+ // discoverLibrary already sorts by ref; selection is applied before the cap.
864
+ if (packageMatches(record, options, selection) && !packages.push(record)) break;
865
+ }
866
+ }
867
+
868
+ const resources = new Bounded<LibraryResource>(LIBRARY_INVENTORY_LIMITS.resources);
869
+ if (include.resources) {
870
+ let configDir = options.configDir;
871
+ if (!configDir) {
872
+ try {
873
+ configDir = clioConfigDir();
874
+ } catch {
875
+ configDir = undefined;
876
+ }
877
+ }
878
+ let packageRoot: string | undefined;
879
+ try {
880
+ packageRoot = resolvePackageRoot();
881
+ } catch {
882
+ packageRoot = undefined;
883
+ }
884
+ const index = ownerIndex(copies, {
885
+ cwd,
886
+ home: options.home ?? homedir(),
887
+ ...(configDir ? { configDir } : {}),
888
+ ...(packageRoot ? { packageRoot } : {}),
889
+ });
890
+ const trustProjectCompatRoots = trustSetting(options.trustProjectCompatRoots);
891
+ // Each loader enumerates its whole root set because precedence needs every
892
+ // candidate. What is bounded here is which loaders run and what is projected.
893
+ const skillRows: LibraryResource[] = [];
894
+ if (wants("skill")) {
895
+ const skills = loadSkills({
896
+ cwd,
897
+ trustProjectCompatRoots,
898
+ ...(options.configDir ? { configDir: options.configDir } : {}),
899
+ ...(options.home ? { home: options.home } : {}),
900
+ });
901
+ const loose = looseSourceId(index.anchors, "skill");
902
+ for (const skill of skills.items) skillRows.push(fromSkill(skill, index));
903
+ for (const diagnostic of skills.diagnostics) {
904
+ const loser =
905
+ diagnostic.type === "collision" ? fromCollisionLoser("skill", diagnostic, skillRows, index, loose) : undefined;
906
+ if (loser) skillRows.push(loser);
907
+ else if (diagnostic.type !== "collision")
908
+ note(`skill: ${diagnostic.message}${diagnostic.path ? ` (${diagnostic.path})` : ""}`);
909
+ }
910
+ }
911
+ const promptRows: LibraryResource[] = [];
912
+ if (wants("prompt")) {
913
+ const prompts = loadPromptTemplates({
914
+ cwd,
915
+ trustProjectCompatRoots,
916
+ ...(options.home ? { home: options.home } : {}),
917
+ });
918
+ const loose = looseSourceId(index.anchors, "prompt");
919
+ for (const template of prompts.items) promptRows.push(fromPrompt(template, index));
920
+ for (const diagnostic of prompts.diagnostics) {
921
+ const loser =
922
+ diagnostic.type === "collision" ? fromCollisionLoser("prompt", diagnostic, promptRows, index, loose) : undefined;
923
+ if (loser) promptRows.push(loser);
924
+ else if (diagnostic.type !== "collision")
925
+ note(`prompt: ${diagnostic.message}${diagnostic.path ? ` (${diagnostic.path})` : ""}`);
926
+ }
927
+ }
928
+ const agentRows: LibraryResource[] = [];
929
+ if (wants("agent")) {
930
+ const agentDiagnostics: AgentRecipeDiagnostic[] = [];
931
+ try {
932
+ for (const recipe of discoverAgentRecipes(cwd, agentDiagnostics)) agentRows.push(fromAgent(recipe, index));
933
+ } catch (error) {
934
+ note(`agent: discovery failed: ${error instanceof Error ? error.message : String(error)}`);
935
+ }
936
+ for (const diagnostic of agentDiagnostics) agentRows.push(fromAgentDiagnostic(diagnostic, index));
937
+ }
938
+ const fleetRows: LibraryResource[] = [];
939
+ if (wants("fleet")) {
940
+ try {
941
+ for (const listing of listFleetContracts(cwd)) fleetRows.push(fromFleet(listing, index));
942
+ } catch (error) {
943
+ note(`fleet: discovery failed: ${error instanceof Error ? error.message : String(error)}`);
944
+ }
945
+ }
946
+ // Audience and selection are applied per row while collecting, so the cap
947
+ // bounds admitted rows rather than a superset that is sliced afterwards.
948
+ for (const row of sortResources([...skillRows, ...promptRows, ...agentRows, ...fleetRows])) {
949
+ if (!audienceAdmits(row, options) || !resourceMatches(row, options, selection)) continue;
950
+ if (!resources.push(row)) break;
951
+ }
952
+ }
953
+
954
+ const selectedCopies = include.copies
955
+ ? copies
956
+ .filter((copy) => copyMatches(copy, options, selection))
957
+ .sort((a, b) => a.ref.localeCompare(b.ref) || a.scope.localeCompare(b.scope))
958
+ : [];
959
+ return {
960
+ version: 1,
961
+ generatedAt: new Date().toISOString(),
962
+ cwd,
963
+ audience: options.audience ?? "operator",
964
+ packages: packages.items,
965
+ copies: selectedCopies,
966
+ resources: resources.items,
967
+ diagnostics: diagnostics.items,
968
+ truncated: {
969
+ packages: packages.truncated,
970
+ // Copies also supply package status and resource ownership when omitted
971
+ // from the public copy list. Consumers must know when that evidence is partial.
972
+ copies: copyRows.truncated,
973
+ resources: resources.truncated,
974
+ },
975
+ };
976
+ }
977
+
978
+ // ---------------------------------------------------------------------------
979
+ // Explicit deeper read for one copy
980
+ // ---------------------------------------------------------------------------
981
+
982
+ export interface LibraryCopyInspection {
983
+ copy: LibraryCopy;
984
+ resources: Array<{
985
+ kind: LibraryResourceKind;
986
+ name: string;
987
+ path: string;
988
+ componentId?: string;
989
+ description?: string;
990
+ valid: boolean;
991
+ diagnostics: string[];
992
+ }>;
993
+ ancillary: Array<{ kind: string; id: string; path: string; valid: boolean }>;
994
+ prerequisites: LibraryValidationPrerequisite[];
995
+ diagnostics: string[];
996
+ }
997
+
998
+ /**
999
+ * Enumerate one installed copy's members through the shared validator. This
1000
+ * reads a disabled, shadowed or damaged copy too, which the runtime loaders
1001
+ * never do; it is the explicit inspection the listing deliberately avoids.
1002
+ */
1003
+ export function inspectLibraryCopy(
1004
+ ref: string,
1005
+ options: { cwd?: string; scope?: PluginScope } = {},
1006
+ ): LibraryCopyInspection {
1007
+ const cwd = path.resolve(options.cwd ?? process.cwd());
1008
+ // Resolve precedence across both scopes before selecting the copy to inspect.
1009
+ const candidates = listInstalledPlugins(cwd, { all: true })
1010
+ .filter((item) => !options.scope || item.scope === options.scope)
1011
+ .filter((item) => (ref.includes(":") ? `${item.kind ?? "plugin"}:${item.id}` === ref : item.id === ref))
1012
+ .sort((a, b) => Number(b.scope === "project") - Number(a.scope === "project"));
1013
+ const plugin = candidates[0];
1014
+ if (!plugin) throw new Error(`package not installed: ${ref}`);
1015
+ const copy = projectCopy(plugin, cwd);
1016
+ if (!existsSync(plugin.rootPath))
1017
+ return { copy, resources: [], ancillary: [], prerequisites: [], diagnostics: ["package root is missing"] };
1018
+ const result = validateLibraryPackage(plugin.rootPath, { cwd });
1019
+ const components = new Map(
1020
+ (result.manifest?.clio.components ?? []).map((component) => [`${component.kind}:${component.id}`, component.id]),
1021
+ );
1022
+ const resources: LibraryCopyInspection["resources"] = [];
1023
+ const ancillary: LibraryCopyInspection["ancillary"] = [];
1024
+ for (const record of result.validation.resources) {
1025
+ if (isLibraryResourceKind(record.kind)) {
1026
+ const componentId = record.componentRef ? components.get(record.componentRef) : undefined;
1027
+ resources.push({
1028
+ kind: record.kind,
1029
+ name: record.name,
1030
+ path: record.path,
1031
+ ...(componentId && componentId !== record.name ? { componentId } : {}),
1032
+ ...(record.description !== undefined ? { description: record.description } : {}),
1033
+ valid: record.valid,
1034
+ diagnostics: bounded(record.diagnostics.map((item) => item.message)),
1035
+ });
1036
+ } else ancillary.push({ kind: record.kind, id: record.name, path: record.path, valid: record.valid });
1037
+ }
1038
+ return {
1039
+ copy,
1040
+ resources,
1041
+ ancillary,
1042
+ prerequisites: result.validation.prerequisites,
1043
+ diagnostics: [
1044
+ ...result.diagnostics.map((item) => item.message),
1045
+ ...result.validation.diagnostics.map((item) => `[${item.code}] ${item.message}`),
1046
+ ].slice(0, LIBRARY_INVENTORY_LIMITS.copyDiagnostics),
1047
+ };
1048
+ }