@iowarp/clio-coder 0.4.5 → 0.4.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (700) hide show
  1. package/.claude-plugin/marketplace.json +283 -0
  2. package/CHANGELOG.md +74 -0
  3. package/CONTRIBUTING.md +116 -38
  4. package/NOTICE +24 -0
  5. package/README.md +341 -682
  6. package/dist/{acp-H3CU2HBQ.js → acp-W3Y3TRHD.js} +12 -12
  7. package/dist/{agents-IXQQZ7BD.js → agents-J4ICNLQ3.js} +57 -56
  8. package/dist/assets/codewiki.json +1 -1
  9. package/dist/assets/tui-notices/get-east-asian-width-LICENSE +9 -0
  10. package/dist/assets/tui-notices/marked-LICENSE +44 -0
  11. package/dist/assets/tui-notices/pi-tui-LICENSE +21 -0
  12. package/dist/{auth-R7KYF7N3.js → auth-X2UJUMOC.js} +25 -25
  13. package/dist/{builtins-CRFDQUVP.js → builtins-XLXWWSRF.js} +6 -6
  14. package/dist/{chunk-DZK63TZJ.js → chunk-24S3DN22.js} +336 -612
  15. package/dist/{chunk-NTK3WTHM.js → chunk-24TOGHPO.js} +2 -2
  16. package/dist/{chunk-M6TAYK66.js → chunk-2O2LVQQK.js} +11 -4
  17. package/dist/{chunk-OQM5IVJY.js → chunk-34XHRVKG.js} +3 -3
  18. package/dist/{chunk-LY4N4TTL.js → chunk-3LXJOICS.js} +2 -2
  19. package/dist/{chunk-SE4ZKILO.js → chunk-3XE4NRLF.js} +30 -9
  20. package/dist/{chunk-YYB3MC65.js → chunk-4MFBBY2Z.js} +3 -3
  21. package/dist/{chunk-5VTJP36Q.js → chunk-4N2RZ4TO.js} +2 -2
  22. package/dist/{chunk-FKIOX6DS.js → chunk-4QKAITQT.js} +10 -5
  23. package/dist/chunk-4UHVS5T7.js +207 -0
  24. package/dist/{chunk-VLPTKCKT.js → chunk-5AJPUR72.js} +6 -6
  25. package/dist/{chunk-5CY4Q6QI.js → chunk-5EQO5NWP.js} +105 -3
  26. package/dist/{chunk-RXIOCVBZ.js → chunk-65BGHOUR.js} +8 -5
  27. package/dist/{chunk-T53XI6I7.js → chunk-6CA2BHOR.js} +2 -2
  28. package/dist/{chunk-HL26ADLH.js → chunk-6CB2IL4N.js} +2 -1
  29. package/dist/{chunk-HR3HPQ76.js → chunk-6LRLOJHQ.js} +3 -3
  30. package/dist/{chunk-HXHFDHB6.js → chunk-6TAATXXH.js} +6 -6
  31. package/dist/{chunk-WFKDPU7U.js → chunk-6YHPAAZR.js} +3 -3
  32. package/dist/{chunk-ZMZQEBKI.js → chunk-7EEGBKV4.js} +11 -11
  33. package/dist/{chunk-BS4GAMUB.js → chunk-A67NR5AT.js} +2 -2
  34. package/dist/{chunk-WJIMKGD6.js → chunk-BAU36233.js} +8 -8
  35. package/dist/{chunk-MDU3C27C.js → chunk-BO4XV5VX.js} +8 -8
  36. package/dist/{chunk-KF6GFW6O.js → chunk-BQQ5MXUC.js} +11 -11
  37. package/dist/{chunk-K6RDB7IA.js → chunk-C3G5PNUO.js} +23 -23
  38. package/dist/{chunk-SRZOW5L2.js → chunk-C6GEXX4L.js} +1 -1
  39. package/dist/{chunk-U2JOLB7O.js → chunk-CE64C5K5.js} +227 -72
  40. package/dist/chunk-CP3HIR5H.js +2119 -0
  41. package/dist/{chunk-BBV5TKE6.js → chunk-CPXGJI2A.js} +2 -2
  42. package/dist/{chunk-5DDOTTG4.js → chunk-CULVKYTK.js} +5 -5
  43. package/dist/{chunk-F34AR6O3.js → chunk-D2T66PDV.js} +6 -6
  44. package/dist/{chunk-NF3BK5WR.js → chunk-DACXIVVF.js} +5 -5
  45. package/dist/{chunk-4SVIVOMC.js → chunk-DLIYANB7.js} +20 -15
  46. package/dist/{chunk-E3BQTQUP.js → chunk-DO7M3LSX.js} +9 -9
  47. package/dist/{chunk-2QPI3TR3.js → chunk-DVJL77SO.js} +2 -2
  48. package/dist/chunk-EM2WNQS2.js +93 -0
  49. package/dist/{chunk-ODUTYZIU.js → chunk-EUEXGXXR.js} +5 -5
  50. package/dist/{chunk-UL36QJX6.js → chunk-EUZRMP4Y.js} +18 -16
  51. package/dist/{chunk-R6MAYTMS.js → chunk-G4LGUTOE.js} +4 -4
  52. package/dist/{chunk-CBSKDFWL.js → chunk-GEVQNST4.js} +2 -2
  53. package/dist/{chunk-XXBQKW32.js → chunk-GFQ7P2UF.js} +7 -7
  54. package/dist/{chunk-SBZX6ARC.js → chunk-GI5RRMAH.js} +14 -14
  55. package/dist/{chunk-KDWLXVMN.js → chunk-GVZFCJHE.js} +343 -113
  56. package/dist/{chunk-633EXGZA.js → chunk-GXIWHXDB.js} +3 -3
  57. package/dist/{chunk-LUL5Z66S.js → chunk-HOX4YZ2K.js} +6 -5
  58. package/dist/chunk-HRAKUPIH.js +57 -0
  59. package/dist/{chunk-KYKNBD4Y.js → chunk-IJMW64DX.js} +978 -258
  60. package/dist/{chunk-DIMRLNIC.js → chunk-IMOD2YPV.js} +16 -9
  61. package/dist/{chunk-6CDNRHWH.js → chunk-IQCNVLO6.js} +28 -8
  62. package/dist/{chunk-UTUNT5QL.js → chunk-ISNCCX42.js} +9 -9
  63. package/dist/{chunk-RLTT5GVY.js → chunk-IZYTT3CD.js} +9 -5
  64. package/dist/{chunk-5ZMXGW7P.js → chunk-KAFMW7WM.js} +4 -85
  65. package/dist/chunk-KKEYGFX4.js +915 -0
  66. package/dist/{chunk-HHVJNVUJ.js → chunk-KS7ETA3P.js} +2 -2
  67. package/dist/{chunk-UXAC2FX4.js → chunk-L3Z5ANCV.js} +7 -7
  68. package/dist/{chunk-EHCPSZJF.js → chunk-LBFQMYS3.js} +2 -2
  69. package/dist/{chunk-QEQISF75.js → chunk-LK2FN5JY.js} +1 -1
  70. package/dist/{chunk-URBGEOH3.js → chunk-M6Z2V6YU.js} +5 -5
  71. package/dist/{chunk-DRD2A54W.js → chunk-MBJO5VNZ.js} +18 -18
  72. package/dist/chunk-MNQN3X6Y.js +595 -0
  73. package/dist/{chunk-GXCCHKN6.js → chunk-MZHXENL7.js} +7 -7
  74. package/dist/chunk-MZNWZUJM.js +1801 -0
  75. package/dist/{chunk-7YJWEF2L.js → chunk-N37QC5FV.js} +5 -5
  76. package/dist/{chunk-WLMSOT73.js → chunk-NCCQ6DVS.js} +7 -7
  77. package/dist/{chunk-TZ7MFRG4.js → chunk-NO7J45X6.js} +170 -53
  78. package/dist/chunk-OH3YYA3B.js +15 -0
  79. package/dist/{chunk-22PQ4TX4.js → chunk-P4DL2LM5.js} +16 -77
  80. package/dist/{chunk-R6MICQYU.js → chunk-PFLOULP3.js} +4 -4
  81. package/dist/{chunk-MC3JSVR6.js → chunk-QJMRYTCX.js} +7 -7
  82. package/dist/{chunk-ILJ7DWGE.js → chunk-QKWL7SYE.js} +12 -12
  83. package/dist/chunk-R2CT5YDO.js +66 -0
  84. package/dist/chunk-RFCKPS2V.js +26 -0
  85. package/dist/{chunk-ONRTXOZY.js → chunk-RTLNFZMD.js} +12 -4
  86. package/dist/{chunk-U7H5WRG5.js → chunk-RXFPB32E.js} +8 -6
  87. package/dist/{chunk-S32UQ5GL.js → chunk-SEDI5K5B.js} +18 -18
  88. package/dist/{chunk-ICO4TQ2F.js → chunk-SELG4SUR.js} +41 -25
  89. package/dist/{chunk-YEJIG7LN.js → chunk-SER7RRAE.js} +27 -832
  90. package/dist/{chunk-K2HL3GBL.js → chunk-T4TY5GG3.js} +165 -15
  91. package/dist/chunk-T7QQBNLH.js +691 -0
  92. package/dist/{chunk-HGSLRG33.js → chunk-TLTGZTXI.js} +3 -3
  93. package/dist/chunk-TZ6UVP2H.js +637 -0
  94. package/dist/{chunk-EWD5P3GK.js → chunk-TZHN5ITX.js} +13 -41
  95. package/dist/{chunk-7TKWWPD7.js → chunk-U3TPUXOQ.js} +398 -253
  96. package/dist/{chunk-GNQRWTMY.js → chunk-UA3W4FGC.js} +6 -6
  97. package/dist/{chunk-O2RQ7LCK.js → chunk-UA6W4XFJ.js} +2 -2
  98. package/dist/chunk-UWD3JD5X.js +709 -0
  99. package/dist/chunk-V4ZKOKRB.js +13433 -0
  100. package/dist/{chunk-NC4KV7EL.js → chunk-VCRVEDUC.js} +5 -5
  101. package/dist/{chunk-I7VLWRK2.js → chunk-VMATUZB6.js} +12 -10
  102. package/dist/{chunk-J2FYEQ5L.js → chunk-VTYHHQ57.js} +2 -2
  103. package/dist/chunk-WB7POC6M.js +891 -0
  104. package/dist/{chunk-GVYWZNRK.js → chunk-WBVKKTUT.js} +2 -2
  105. package/dist/{chunk-EHOSNVVM.js → chunk-WLHX3MM5.js} +6 -2
  106. package/dist/{chunk-SDWNDICN.js → chunk-WN552PKN.js} +573 -316
  107. package/dist/{chunk-TEG3RYVZ.js → chunk-WT5TRMO4.js} +51 -26
  108. package/dist/{chunk-NY6IWDVU.js → chunk-WURGVOZJ.js} +56 -12
  109. package/dist/{chunk-7WUZEB2M.js → chunk-XR3XJN2M.js} +2 -2
  110. package/dist/chunk-XW2UZICE.js +372 -0
  111. package/dist/{chunk-FSTIBAGM.js → chunk-XZ6UFQ52.js} +11 -11
  112. package/dist/chunk-Y3JU5RPK.js +8 -0
  113. package/dist/chunk-YKRJTYNP.js +1143 -0
  114. package/dist/{chunk-7HBHHVCK.js → chunk-YPRSNUTC.js} +2 -2
  115. package/dist/{chunk-PWWSIB2A.js → chunk-ZGIGW4ZG.js} +5 -5
  116. package/dist/cli/index.js +34 -36
  117. package/dist/{clio-5I2IBFYL.js → clio-L2P7S2R2.js} +9 -9
  118. package/dist/{code-nav-YXIAEZVS.js → code-nav-B5LNX4KU.js} +25 -25
  119. package/dist/{components-TNIKXCBH.js → components-63MMQKUT.js} +6 -6
  120. package/dist/{config-Y2JDJ3JJ.js → config-YXARKGTX.js} +81 -77
  121. package/dist/configure-LMVQJ46J.js +85 -0
  122. package/dist/{context-QQ53HSGJ.js → context-7HJEWTTP.js} +92 -48
  123. package/dist/{context-S2EEC3EJ.js → context-XSZKKFBW.js} +14 -14
  124. package/dist/{context-P5YSEO55.js → context-YG2LZDYZ.js} +67 -64
  125. package/dist/{context-clear-TMEQCOTH.js → context-clear-AC5NXHM2.js} +64 -61
  126. package/dist/{context-index-HP2JFUWA.js → context-index-KKTPRV5G.js} +3 -3
  127. package/dist/{context-map-INTXD54D.js → context-map-T7ROR5D5.js} +4 -4
  128. package/dist/{context-working-set-CNLSQN5K.js → context-working-set-F4Q4J3NS.js} +15 -12
  129. package/dist/{detail-5572VLBO.js → detail-H73BEF2N.js} +65 -62
  130. package/dist/{dispatch-runner-FRHD6P2O.js → dispatch-runner-3RY5FSJC.js} +83 -80
  131. package/dist/{doctor-N3LCM2LG.js → doctor-EQYJOGUG.js} +47 -32
  132. package/dist/{eval-BUU3ZOUZ.js → eval-4P7O6CCE.js} +114 -50
  133. package/dist/{evidence-DTGEN456.js → evidence-D6GUSYJW.js} +64 -61
  134. package/dist/{evidence-SQ5DNFEN.js → evidence-O76QF7TZ.js} +69 -65
  135. package/dist/{evolve-IJNUFZDS.js → evolve-H47BCETS.js} +65 -62
  136. package/dist/{extensions-YVRHX6ZI.js → extensions-NNL3ZOCU.js} +98 -20
  137. package/dist/{fleet-ZNNVSYFO.js → fleet-KMNS6NOM.js} +115 -107
  138. package/dist/{fleet-commands-5YE7NPJL.js → fleet-commands-DOWSYCBX.js} +15 -15
  139. package/dist/{fleet-decisions-3SBSCTCW.js → fleet-decisions-S3PTZV2D.js} +9 -9
  140. package/dist/{fleet-graph-6HHPWF5T.js → fleet-graph-F2DE2TME.js} +26 -24
  141. package/dist/{fleet-inspect-JEYMGCGC.js → fleet-inspect-EN2Q6IVB.js} +67 -63
  142. package/dist/{fleet-preflight-QRSHIIDE.js → fleet-preflight-FRLETDD3.js} +3 -3
  143. package/dist/{fleet-validate-4PM4GDDL.js → fleet-validate-B2XDLS57.js} +28 -29
  144. package/dist/{fleet-verify-NJDTHTO3.js → fleet-verify-4JKUWGJ7.js} +64 -61
  145. package/dist/{fleet-view-UP2BWQQY.js → fleet-view-BHJFW26B.js} +67 -63
  146. package/dist/{init-S3GZQ5ZF.js → init-XAT5N5YM.js} +86 -80
  147. package/dist/interop-FVECHFKG.js +246 -0
  148. package/dist/{inventory-K2OZ36YJ.js → inventory-7KFQGLCV.js} +67 -63
  149. package/dist/library-NY2XOT75.js +492 -0
  150. package/dist/library-QAPAO23R.js +306 -0
  151. package/dist/library-import-5Y6MAS3R.js +183 -0
  152. package/dist/library-inventory-JT6HWITQ.js +56 -0
  153. package/dist/library-validation-EQUH25DC.js +42 -0
  154. package/dist/{memory-OQOXQGYD.js → memory-DYVTTCP6.js} +65 -62
  155. package/dist/{models-3IK2Y5WE.js → models-MASFJ6Y2.js} +51 -38
  156. package/dist/{monitor-FTJLTKCQ.js → monitor-YMP4NXJJ.js} +73 -69
  157. package/dist/{orchestrator-N47O7SFD.js → orchestrator-AFQRRTEI.js} +4255 -2845
  158. package/dist/{panes-7BTYH3XQ.js → panes-D3Y2KFG5.js} +4 -4
  159. package/dist/{panes-WPOMEMRH.js → panes-NICTHQCV.js} +7 -7
  160. package/dist/{paths-J3KN7UAO.js → paths-PSFAUIGO.js} +5 -5
  161. package/dist/{preload-65U34NG6.js → preload-5Q7VXRFJ.js} +64 -61
  162. package/dist/{reset-MUVQDLNL.js → reset-7NKZK7JN.js} +11 -9
  163. package/dist/{resources-LM76COAO.js → resources-NILSIZAT.js} +94 -38
  164. package/dist/{run-3VFZQ33N.js → run-BPZGEBZV.js} +131 -114
  165. package/dist/{share-4JUB4BL7.js → share-EZ6ERBMH.js} +31 -28
  166. package/dist/skills-BTVVNYVM.js +100 -0
  167. package/dist/{skills-eval-G6T57L7M.js → skills-eval-UY34MNK7.js} +117 -78
  168. package/dist/{skills-inventory-WLM46PJH.js → skills-inventory-JDHSIA7I.js} +30 -25
  169. package/dist/{slash-commands-GBARG3Y7.js → slash-commands-K4FNQ2AT.js} +53 -49
  170. package/dist/{steer-S7D7IKPU.js → steer-2B3EQGFH.js} +4 -4
  171. package/dist/{support-5VAEC32W.js → support-L2SOL3IE.js} +7 -7
  172. package/dist/{targets-N5REUETU.js → targets-44VKGFLN.js} +69 -47
  173. package/dist/{tasks-6BVY5YZF.js → tasks-3KODKFU7.js} +14 -14
  174. package/dist/{terminal-lease-57UEOJKS.js → terminal-lease-LXA7MMPO.js} +32 -19
  175. package/dist/{tools-6OCQ6SVB.js → tools-3UB7TEVR.js} +7 -7
  176. package/dist/{trace-JHLXWUMN.js → trace-TAMIU4OJ.js} +5 -4
  177. package/dist/{tui-primitives-RCY2HN7G.js → tui-primitives-A6MUW32V.js} +3 -2
  178. package/dist/{uninstall-FXYMFFRT.js → uninstall-QYVRPEM4.js} +9 -9
  179. package/dist/{upgrade-4HD5HAIV.js → upgrade-7PMKM2JH.js} +17 -18
  180. package/dist/{usage-4GWM2WWP.js → usage-6EQV7EQK.js} +77 -73
  181. package/dist/{verifiers-GSKWKWVG.js → verifiers-JLITWSHU.js} +16 -16
  182. package/dist/{verify-3AS3ULCY.js → verify-T7NAEVIG.js} +13 -13
  183. package/dist/{web-fetch-MQN4FH3X.js → web-fetch-W4TNW4Q7.js} +4 -4
  184. package/dist/{wiki-generate-7BV7XWIY.js → wiki-generate-T2TJQJUA.js} +90 -84
  185. package/dist/{with-panes-OFTNAR4Y.js → with-panes-CHFC7HGI.js} +4 -4
  186. package/dist/worker/entry.js +297 -88
  187. package/docs/README.md +43 -0
  188. package/docs/architecture/architecture.md +8 -7
  189. package/docs/architecture/artifact-versions.md +3 -3
  190. package/docs/architecture/context-engine.md +36 -2
  191. package/docs/architecture/library.md +32 -0
  192. package/docs/architecture/middleware-and-components.md +1 -1
  193. package/docs/architecture/model-catalog.md +21 -1
  194. package/docs/architecture/pi-boundary.md +18 -0
  195. package/docs/architecture/prompt-envelope-and-tools.md +5 -5
  196. package/docs/architecture/safety-model.md +21 -2
  197. package/docs/architecture/session-lifecycle.md +12 -1
  198. package/docs/architecture/tui-design.md +153 -39
  199. package/docs/architecture/worker-context.md +106 -0
  200. package/docs/guide/authoring-plugins.md +160 -0
  201. package/docs/guide/built-in-agents.md +5 -5
  202. package/docs/guide/commands-and-modes.md +186 -80
  203. package/docs/guide/configuration-and-targets.md +123 -28
  204. package/docs/guide/configuration-reference.md +36 -38
  205. package/docs/guide/environment-variables.md +2 -2
  206. package/docs/guide/exit-codes-and-output.md +1 -1
  207. package/docs/guide/extensions-and-sharing.md +93 -53
  208. package/docs/guide/fleet-dispatch.md +32 -10
  209. package/docs/guide/glossary.md +2 -2
  210. package/docs/guide/harness-extensions.md +291 -0
  211. package/docs/guide/installation-and-lifecycle.md +53 -20
  212. package/docs/guide/interop.md +243 -0
  213. package/docs/guide/panes-and-files.md +3 -3
  214. package/docs/guide/plugins.md +80 -0
  215. package/docs/guide/resource-library.md +111 -45
  216. package/docs/guide/skills-marketplace.md +35 -72
  217. package/docs/guide/tool-usage.md +19 -7
  218. package/docs/guide/troubleshooting.md +1 -1
  219. package/docs/process/development-pipeline.md +15 -15
  220. package/docs/process/documentation-coverage.md +29 -2
  221. package/docs/process/documentation-guide.md +15 -7
  222. package/docs/process/eval-runner.md +8 -3
  223. package/docs/process/performance-methodology.md +1 -1
  224. package/docs/process/release-cut-checklist.md +22 -6
  225. package/docs/process/scientific-validation.md +23 -0
  226. package/evals/scalar-decision-machinery.ts +1 -1
  227. package/examples/extensions/README.md +67 -0
  228. package/examples/extensions/lab-status/clio-coder-extension.json +14 -0
  229. package/examples/extensions/lab-status/extension.mjs +68 -0
  230. package/examples/extensions/lab-status/jobs.synthetic.json +9 -0
  231. package/examples/extensions/measurements/clio-coder-extension.json +28 -0
  232. package/examples/extensions/measurements/summarize.cjs +23 -0
  233. package/library/README.md +109 -0
  234. package/library/_authoring/templates/agent/README.md +28 -0
  235. package/library/_authoring/templates/agent/agents/benchmark-scout.md +30 -0
  236. package/library/_authoring/templates/agent/plugin.json +23 -0
  237. package/library/_authoring/templates/fleet/README.md +29 -0
  238. package/library/_authoring/templates/fleet/fleets/pipeline-review.md +31 -0
  239. package/library/_authoring/templates/fleet/plugin.json +23 -0
  240. package/library/_authoring/templates/plugin/README.md +37 -0
  241. package/library/_authoring/templates/plugin/agents/data-curator.md +31 -0
  242. package/library/_authoring/templates/plugin/assets/curation-guide.md +22 -0
  243. package/library/_authoring/templates/plugin/plugin.json +42 -0
  244. package/library/_authoring/templates/plugin/prompts/inspect-dataset.md +15 -0
  245. package/library/_authoring/templates/plugin/skills/dataset-curation/SKILL.md +36 -0
  246. package/library/_authoring/templates/plugin/skills/dataset-curation/evals.md +17 -0
  247. package/library/_authoring/templates/prompt/README.md +28 -0
  248. package/library/_authoring/templates/prompt/plugin.json +23 -0
  249. package/library/_authoring/templates/prompt/prompts/paper-summary.md +26 -0
  250. package/library/_authoring/templates/skill/README.md +24 -0
  251. package/library/_authoring/templates/skill/SKILL.md +39 -0
  252. package/library/_authoring/templates/skill/evals.md +30 -0
  253. package/library/_authoring/templates/skill/plugin.json +23 -0
  254. package/library/agents/README.md +7 -0
  255. package/library/fleets/README.md +7 -0
  256. package/library/plugins/materio/README.md +137 -0
  257. package/library/plugins/materio/ai.iowarp.clio/agents/materio-lab-definer.md +208 -0
  258. package/library/plugins/materio/ai.iowarp.clio/agents/materio-literature-reviewer.md +308 -0
  259. package/library/plugins/materio/ai.iowarp.clio/agents/materio-research-explorer.md +249 -0
  260. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-executor.md +416 -0
  261. package/library/plugins/materio/ai.iowarp.clio/agents/materio-task-verifier.md +60 -0
  262. package/library/plugins/materio/ai.iowarp.clio/agents/materio-workflow-planner.md +238 -0
  263. package/library/plugins/materio/ai.iowarp.clio/fleets/materio-execute-task.md +50 -0
  264. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/add-task.md +66 -0
  265. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/archive-task.md +65 -0
  266. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/checkpoint.md +26 -0
  267. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-research-tasks.md +230 -0
  268. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/define-virtual-lab.md +181 -0
  269. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/execute-task.md +292 -0
  270. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/help.md +129 -0
  271. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/identify-research.md +206 -0
  272. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/literature-review.md +201 -0
  273. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/pause-research.md +12 -0
  274. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/progress.md +105 -0
  275. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/remove-task.md +63 -0
  276. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/resume-research.md +64 -0
  277. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/settings.md +16 -0
  278. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/status.md +92 -0
  279. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/upload-data.md +104 -0
  280. package/library/plugins/materio/ai.iowarp.clio/prompts/materio/wtfp.md +145 -0
  281. package/library/plugins/materio/ai.iowarp.clio/references/execution.md +56 -0
  282. package/library/plugins/materio/ai.iowarp.portability/provenance.json +9 -0
  283. package/library/plugins/materio/assets/actions/add-task.md +86 -0
  284. package/library/plugins/materio/assets/actions/archive-task.md +84 -0
  285. package/library/plugins/materio/assets/actions/checkpoint.md +47 -0
  286. package/library/plugins/materio/assets/actions/define-research-tasks.md +228 -0
  287. package/library/plugins/materio/assets/actions/define-virtual-lab.md +179 -0
  288. package/library/plugins/materio/assets/actions/execute-task.md +290 -0
  289. package/library/plugins/materio/assets/actions/help.md +140 -0
  290. package/library/plugins/materio/assets/actions/identify-research.md +204 -0
  291. package/library/plugins/materio/assets/actions/literature-review.md +199 -0
  292. package/library/plugins/materio/assets/actions/pause-research.md +34 -0
  293. package/library/plugins/materio/assets/actions/progress.md +125 -0
  294. package/library/plugins/materio/assets/actions/remove-task.md +82 -0
  295. package/library/plugins/materio/assets/actions/resume-research.md +84 -0
  296. package/library/plugins/materio/assets/actions/settings.md +38 -0
  297. package/library/plugins/materio/assets/actions/status.md +112 -0
  298. package/library/plugins/materio/assets/actions/upload-data.md +123 -0
  299. package/library/plugins/materio/assets/actions/wtfp.md +179 -0
  300. package/library/plugins/materio/assets/references/research-domains.md +134 -0
  301. package/library/plugins/materio/assets/references/research-policy.md +77 -0
  302. package/library/plugins/materio/assets/references/traditional-workflows.md +146 -0
  303. package/library/plugins/materio/assets/scripts/check_physics.py +271 -0
  304. package/library/plugins/materio/assets/scripts/check_scripts.py +248 -0
  305. package/library/plugins/materio/assets/scripts/project_plugin.py +165 -0
  306. package/library/plugins/materio/assets/scripts/research_state.py +400 -0
  307. package/library/plugins/materio/assets/scripts/verify_citations.py +616 -0
  308. package/library/plugins/materio/assets/templates/RESEARCH.md +39 -0
  309. package/library/plugins/materio/assets/templates/VIRTUAL-LAB.md +120 -0
  310. package/library/plugins/materio/assets/templates/WORKFLOW.md +42 -0
  311. package/library/plugins/materio/assets/templates/config.json +5 -0
  312. package/library/plugins/materio/evals/scripts.yaml +29 -0
  313. package/library/plugins/materio/plugin.json +530 -0
  314. package/library/plugins/materio/skills/materio-lab-definer/SKILL.md +74 -0
  315. package/library/plugins/materio/skills/materio-literature-reviewer/SKILL.md +64 -0
  316. package/library/plugins/materio/skills/materio-research-explorer/SKILL.md +74 -0
  317. package/library/plugins/materio/skills/materio-task-executor/SKILL.md +214 -0
  318. package/library/plugins/materio/skills/materio-task-verifier/SKILL.md +46 -0
  319. package/library/plugins/materio/skills/materio-workflow-planner/SKILL.md +79 -0
  320. package/library/plugins/materio/tests/test_check_physics.py +139 -0
  321. package/library/plugins/materio/tests/test_check_scripts.py +140 -0
  322. package/library/plugins/materio/tests/test_research_state.py +291 -0
  323. package/library/plugins/materio/tests/test_verify_citations.py +337 -0
  324. package/library/prompts/README.md +7 -0
  325. package/library/registry.yaml +921 -0
  326. package/library/skills/README.md +120 -0
  327. package/{skills → library/skills}/coding/ast-grep/SKILL.md +1 -1
  328. package/{skills → library/skills}/coding/ast-grep/evals.md +1 -1
  329. package/library/skills/coding/ast-grep/plugin.json +23 -0
  330. package/{skills → library/skills}/coding/coding-standards/SKILL.md +1 -1
  331. package/{skills → library/skills}/coding/coding-standards/evals.md +1 -1
  332. package/library/skills/coding/coding-standards/plugin.json +23 -0
  333. package/{skills → library/skills}/coding/prototype/SKILL.md +1 -1
  334. package/{skills → library/skills}/coding/prototype/evals.md +1 -1
  335. package/library/skills/coding/prototype/plugin.json +23 -0
  336. package/{skills → library/skills}/coding/tdd/SKILL.md +1 -1
  337. package/{skills → library/skills}/coding/tdd/evals.md +1 -1
  338. package/library/skills/coding/tdd/plugin.json +23 -0
  339. package/{skills → library/skills}/context/context-handoff/SKILL.md +1 -1
  340. package/{skills → library/skills}/context/context-handoff/evals.md +1 -1
  341. package/library/skills/context/context-handoff/plugin.json +23 -0
  342. package/{skills → library/skills}/context/context-prime/SKILL.md +1 -1
  343. package/{skills → library/skills}/context/context-prime/evals.md +1 -1
  344. package/library/skills/context/context-prime/plugin.json +23 -0
  345. package/{skills → library/skills}/git/branch-closeout/SKILL.md +1 -1
  346. package/library/skills/git/branch-closeout/plugin.json +23 -0
  347. package/{skills → library/skills}/git/file-ticket/SKILL.md +1 -1
  348. package/library/skills/git/file-ticket/plugin.json +23 -0
  349. package/{skills → library/skills}/git/fix-issue/SKILL.md +1 -1
  350. package/library/skills/git/fix-issue/plugin.json +23 -0
  351. package/{skills → library/skills}/git/resolve-merge-conflicts/SKILL.md +1 -1
  352. package/{skills → library/skills}/git/resolve-merge-conflicts/evals.md +1 -1
  353. package/library/skills/git/resolve-merge-conflicts/plugin.json +23 -0
  354. package/{skills → library/skills}/git/ship/SKILL.md +1 -1
  355. package/library/skills/git/ship/plugin.json +23 -0
  356. package/{skills → library/skills}/git/worktree-create/SKILL.md +1 -1
  357. package/library/skills/git/worktree-create/plugin.json +23 -0
  358. package/{skills → library/skills}/git/worktree-merge/SKILL.md +1 -1
  359. package/library/skills/git/worktree-merge/plugin.json +23 -0
  360. package/{skills → library/skills}/meta/clio-coder-dev/SKILL.md +1 -1
  361. package/{skills → library/skills}/meta/clio-coder-dev/evals.md +1 -1
  362. package/library/skills/meta/clio-coder-dev/plugin.json +23 -0
  363. package/{skills → library/skills}/meta/clio-coder-test/SKILL.md +1 -1
  364. package/{skills → library/skills}/meta/clio-coder-test/evals.md +1 -1
  365. package/library/skills/meta/clio-coder-test/plugin.json +23 -0
  366. package/{skills → library/skills}/meta/credentials/SKILL.md +1 -1
  367. package/{skills → library/skills}/meta/credentials/evals.md +1 -1
  368. package/library/skills/meta/credentials/plugin.json +23 -0
  369. package/library/skills/meta/find-skills/SKILL.md +85 -0
  370. package/library/skills/meta/find-skills/evals.md +65 -0
  371. package/library/skills/meta/find-skills/plugin.json +23 -0
  372. package/{skills → library/skills}/meta/herdr/SKILL.md +1 -1
  373. package/{skills → library/skills}/meta/herdr/evals.md +1 -1
  374. package/library/skills/meta/herdr/plugin.json +23 -0
  375. package/{skills → library/skills}/meta/skill-craft/SKILL.md +23 -9
  376. package/{skills → library/skills}/meta/skill-craft/evals.md +11 -3
  377. package/library/skills/meta/skill-craft/plugin.json +23 -0
  378. package/{skills → library/skills}/planning/archify/SKILL.md +13 -13
  379. package/library/skills/planning/archify/plugin.json +23 -0
  380. package/{skills → library/skills}/planning/architecture/SKILL.md +1 -1
  381. package/{skills → library/skills}/planning/architecture/evals.md +1 -1
  382. package/library/skills/planning/architecture/plugin.json +23 -0
  383. package/{skills → library/skills}/planning/backlog/SKILL.md +1 -1
  384. package/{skills → library/skills}/planning/backlog/evals.md +1 -1
  385. package/library/skills/planning/backlog/plugin.json +23 -0
  386. package/{skills → library/skills}/planning/prd/SKILL.md +1 -1
  387. package/{skills → library/skills}/planning/prd/evals.md +1 -1
  388. package/library/skills/planning/prd/plugin.json +23 -0
  389. package/{skills → library/skills}/planning/product-intent/SKILL.md +1 -1
  390. package/{skills → library/skills}/planning/product-intent/evals.md +1 -1
  391. package/library/skills/planning/product-intent/plugin.json +23 -0
  392. package/{skills → library/skills}/planning/tech-spec/SKILL.md +1 -1
  393. package/{skills → library/skills}/planning/tech-spec/evals.md +1 -1
  394. package/library/skills/planning/tech-spec/plugin.json +23 -0
  395. package/{skills → library/skills}/registry.yaml +7 -7
  396. package/{skills → library/skills}/remote.yaml +1 -1
  397. package/{skills → library/skills}/research/arxiv-literature/SKILL.md +1 -1
  398. package/{skills → library/skills}/research/arxiv-literature/evals.md +1 -1
  399. package/library/skills/research/arxiv-literature/plugin.json +23 -0
  400. package/{skills → library/skills}/research/experiment-protocol/SKILL.md +1 -1
  401. package/{skills → library/skills}/research/experiment-protocol/evals.md +1 -1
  402. package/library/skills/research/experiment-protocol/plugin.json +23 -0
  403. package/{skills → library/skills}/research/scientific-debugging/SKILL.md +1 -1
  404. package/{skills → library/skills}/research/scientific-debugging/evals.md +1 -1
  405. package/library/skills/research/scientific-debugging/plugin.json +23 -0
  406. package/{skills → library/skills}/research/scientific-modernization/SKILL.md +1 -1
  407. package/{skills → library/skills}/research/scientific-modernization/evals.md +1 -1
  408. package/library/skills/research/scientific-modernization/plugin.json +23 -0
  409. package/{skills → library/skills}/skill-marketplace.json +37 -37
  410. package/{skills → library/skills}/workflow/cut-it/SKILL.md +1 -1
  411. package/{skills → library/skills}/workflow/cut-it/evals.md +1 -1
  412. package/library/skills/workflow/cut-it/plugin.json +23 -0
  413. package/{skills → library/skills}/workflow/design-council/SKILL.md +1 -1
  414. package/{skills → library/skills}/workflow/design-council/evals.md +1 -1
  415. package/library/skills/workflow/design-council/plugin.json +23 -0
  416. package/{skills → library/skills}/workflow/grill-me/SKILL.md +1 -1
  417. package/{skills → library/skills}/workflow/grill-me/evals.md +1 -1
  418. package/library/skills/workflow/grill-me/plugin.json +23 -0
  419. package/{skills → library/skills}/workflow/workflow-distiller/SKILL.md +14 -11
  420. package/{skills → library/skills}/workflow/workflow-distiller/evals.md +14 -6
  421. package/library/skills/workflow/workflow-distiller/plugin.json +23 -0
  422. package/package.json +12 -5
  423. package/src/cli/agents.ts +1 -1
  424. package/src/cli/ask.ts +10 -10
  425. package/src/cli/config-inspect.ts +1 -1
  426. package/src/cli/configure-editor.ts +51 -0
  427. package/src/cli/configure-interop.ts +1 -1
  428. package/src/cli/configure-oauth.ts +1 -1
  429. package/src/cli/configure-onboarding.ts +232 -96
  430. package/src/cli/configure-prompts.ts +76 -0
  431. package/src/cli/configure-quick.ts +274 -0
  432. package/src/cli/configure-target.ts +14 -2
  433. package/src/cli/configure.ts +415 -176
  434. package/src/cli/eval.ts +40 -6
  435. package/src/cli/extensions.ts +74 -8
  436. package/src/cli/fleet-preflight.ts +2 -0
  437. package/src/cli/fleet.ts +2 -0
  438. package/src/cli/index.ts +1 -3
  439. package/src/cli/interop-inspect.ts +61 -33
  440. package/src/cli/interop.ts +79 -9
  441. package/src/cli/library-import.ts +139 -0
  442. package/src/cli/library.ts +418 -120
  443. package/src/cli/oauth-manual-input.ts +1 -1
  444. package/src/cli/reset.ts +2 -0
  445. package/src/cli/run.ts +26 -9
  446. package/src/cli/select.ts +35 -4
  447. package/src/cli/skills-eval.ts +43 -6
  448. package/src/cli/skills-inventory.ts +6 -2
  449. package/src/cli/skills.ts +44 -491
  450. package/src/cli/upgrade.ts +2 -2
  451. package/src/core/bus-events.ts +5 -0
  452. package/src/core/config.ts +6 -1
  453. package/src/core/defaults.ts +34 -12
  454. package/src/{interactive → core}/external-editor.ts +4 -4
  455. package/src/core/recent-models.ts +2 -2
  456. package/src/core/session-routing.ts +3 -3
  457. package/src/core/state-file-lock.ts +1 -1
  458. package/src/core/tool-names.ts +5 -0
  459. package/src/domains/agents/extension.ts +42 -6
  460. package/src/domains/agents/fleet-commands.ts +92 -1
  461. package/src/domains/agents/fleet-contract.ts +87 -19
  462. package/src/domains/agents/recipe.ts +5 -4
  463. package/src/domains/agents/registry.ts +80 -24
  464. package/src/domains/config/classify.ts +1 -1
  465. package/src/domains/config/keybindings.ts +156 -124
  466. package/src/domains/context/worker/contract.ts +91 -0
  467. package/src/domains/context/worker/pressure.ts +120 -0
  468. package/src/domains/context/worker/recall.ts +62 -0
  469. package/src/domains/context/worker/select.ts +164 -0
  470. package/src/domains/context/worker/snapshot.ts +35 -0
  471. package/src/domains/context/worker/store.ts +16 -0
  472. package/src/domains/context/working-set/replay/synthetic.ts +2 -1
  473. package/src/domains/dispatch/active-route-planner.ts +2 -0
  474. package/src/domains/dispatch/backoff.ts +1 -0
  475. package/src/domains/dispatch/code-step.ts +12 -2
  476. package/src/domains/dispatch/contract.ts +3 -0
  477. package/src/domains/dispatch/execution-plan.ts +2 -0
  478. package/src/domains/dispatch/extension.ts +109 -27
  479. package/src/domains/dispatch/fleet-plan.ts +10 -0
  480. package/src/domains/dispatch/fleet-run.ts +1 -0
  481. package/src/domains/dispatch/orphan-recovery.ts +1 -0
  482. package/src/domains/dispatch/receipt-integrity.ts +4 -0
  483. package/src/domains/dispatch/state.ts +1 -0
  484. package/src/domains/dispatch/types.ts +5 -0
  485. package/src/domains/dispatch/validation.ts +12 -0
  486. package/src/domains/dispatch/workspace-checkpoint.ts +1 -1
  487. package/src/domains/evidence/failure-attribution.ts +1 -0
  488. package/src/domains/evidence/trust-status.ts +22 -3
  489. package/src/domains/extensions/command-schema.ts +145 -0
  490. package/src/domains/extensions/command-tools.ts +15 -0
  491. package/src/domains/extensions/compatibility.ts +7 -0
  492. package/src/domains/extensions/contract.ts +0 -4
  493. package/src/domains/extensions/discovery.ts +69 -205
  494. package/src/domains/extensions/extension.ts +0 -4
  495. package/src/domains/extensions/index.ts +1 -5
  496. package/src/domains/extensions/manager.ts +1 -6
  497. package/src/domains/extensions/operator-commands.ts +29 -0
  498. package/src/domains/extensions/operator-runtime.ts +483 -0
  499. package/src/domains/extensions/public-api.ts +53 -0
  500. package/src/domains/extensions/runtime-child.mjs +114 -0
  501. package/src/domains/extensions/runtime-process.ts +306 -0
  502. package/src/domains/extensions/runtime-schema.ts +146 -0
  503. package/src/domains/extensions/{resources.ts → snapshot-access.ts} +1 -17
  504. package/src/domains/extensions/snapshot.ts +4 -32
  505. package/src/domains/extensions/state.ts +5 -83
  506. package/src/domains/extensions/types.ts +33 -34
  507. package/src/domains/interop/adopt.ts +546 -0
  508. package/src/domains/interop/detect.ts +50 -12
  509. package/src/domains/interop/foreign.ts +554 -0
  510. package/src/domains/interop/import.ts +277 -0
  511. package/src/domains/interop/index.ts +24 -0
  512. package/src/domains/interop/install.ts +6 -0
  513. package/src/domains/interop/inventory.ts +351 -0
  514. package/src/domains/interop/projection.ts +360 -0
  515. package/src/domains/interop/registry.ts +106 -3
  516. package/src/domains/interop/types.ts +51 -0
  517. package/src/domains/lifecycle/migrations/index.ts +0 -2
  518. package/src/domains/lifecycle/naming-resources.ts +1 -1
  519. package/src/domains/middleware/marketplace-offer.ts +1 -1
  520. package/src/domains/mux/contract.ts +1 -1
  521. package/src/domains/plugins/catalog.ts +204 -0
  522. package/src/domains/plugins/contract.ts +24 -0
  523. package/src/domains/plugins/discovery.ts +316 -0
  524. package/src/domains/plugins/extension.ts +40 -0
  525. package/src/domains/plugins/index.ts +77 -0
  526. package/src/domains/plugins/integrity.ts +6 -0
  527. package/src/domains/plugins/manifest.ts +3 -0
  528. package/src/domains/plugins/resources.ts +102 -0
  529. package/src/domains/plugins/state.ts +753 -0
  530. package/src/domains/plugins/types.ts +217 -0
  531. package/src/domains/prompts/extension.ts +9 -2
  532. package/src/domains/prompts/fragments/operating/skills.md +10 -10
  533. package/src/domains/providers/probe/fingerprint.ts +13 -6
  534. package/src/domains/providers/probe/reasoning.ts +2 -0
  535. package/src/domains/providers/runtimes/common/probe-helpers.ts +23 -7
  536. package/src/domains/providers/runtimes/protocol/anthropic-compat.ts +7 -2
  537. package/src/domains/providers/runtimes/protocol/openai-compat.ts +10 -4
  538. package/src/domains/resources/common-loader.ts +9 -6
  539. package/src/domains/resources/index.ts +67 -0
  540. package/src/domains/resources/library-actions.ts +836 -0
  541. package/src/domains/resources/library-evals.ts +38 -0
  542. package/src/domains/resources/library-inventory.ts +1048 -0
  543. package/src/domains/resources/library-types.ts +50 -0
  544. package/src/domains/resources/library-validation.ts +634 -0
  545. package/src/domains/resources/library.ts +437 -156
  546. package/src/domains/resources/package-references.ts +66 -0
  547. package/src/domains/resources/prompts/loader.ts +75 -41
  548. package/src/domains/resources/skills/install.ts +2 -2
  549. package/src/domains/resources/skills/loader.ts +77 -22
  550. package/src/domains/resources/skills/marketplace.ts +48 -57
  551. package/src/domains/resources/skills/promotion.ts +2 -2
  552. package/src/domains/resources/skills/provenance-pin.ts +17 -4
  553. package/src/domains/safety/action-classifier.ts +2 -2
  554. package/src/domains/safety/default-path-policy.ts +3 -1
  555. package/src/domains/safety/policy-engine.ts +1 -1
  556. package/src/domains/safety/protected-artifacts.ts +21 -5
  557. package/src/domains/safety/skill-authority.ts +5 -2
  558. package/src/domains/share/archive.ts +1 -1
  559. package/src/engine/apis/openai-completions.ts +52 -2
  560. package/src/engine/notices/pi-tui-LICENSE +21 -0
  561. package/src/engine/tui.ts +3 -0
  562. package/src/engine/worker-runtime.ts +58 -14
  563. package/src/engine/worker-tools.ts +5 -0
  564. package/src/entry/orchestrator.ts +26 -5
  565. package/src/entry/plugin-reload.ts +18 -0
  566. package/src/interactive/application-controller.ts +68 -52
  567. package/src/interactive/chat-loop.ts +32 -5
  568. package/src/interactive/chat-panel.ts +168 -638
  569. package/src/interactive/chat-renderer.ts +13 -30
  570. package/src/interactive/clio-editor.ts +53 -21
  571. package/src/interactive/command-output.ts +56 -1
  572. package/src/interactive/dispatch-board.ts +1 -3
  573. package/src/interactive/editor-submit.ts +73 -59
  574. package/src/interactive/fleet-run-preview.ts +2 -0
  575. package/src/interactive/follow-up-queue-panel.ts +3 -3
  576. package/src/interactive/footer/dashboard.ts +12 -4
  577. package/src/interactive/footer/notifications.ts +2 -2
  578. package/src/interactive/footer/widgets.ts +52 -93
  579. package/src/interactive/interactive-application.ts +225 -63
  580. package/src/interactive/interactive-event-projection.ts +2 -44
  581. package/src/interactive/interactive-input-runtime.ts +257 -35
  582. package/src/interactive/interactive-presentation.ts +71 -21
  583. package/src/interactive/interactive-slash-runtime.ts +40 -48
  584. package/src/interactive/keybinding-manager.ts +156 -79
  585. package/src/interactive/keyboard-owner.ts +37 -0
  586. package/src/interactive/layout.ts +29 -4
  587. package/src/interactive/leader-key.ts +49 -102
  588. package/src/interactive/leader-menu.ts +45 -0
  589. package/src/interactive/overlay-ask-user-lifecycle.ts +9 -1
  590. package/src/interactive/overlay-frame.ts +15 -0
  591. package/src/interactive/overlay-general-openers.ts +2 -0
  592. package/src/interactive/overlay-key-routing.ts +46 -47
  593. package/src/interactive/overlay-lifecycle.ts +31 -15
  594. package/src/interactive/overlay-resource-openers.ts +56 -46
  595. package/src/interactive/overlay-session-lifecycle.ts +1 -1
  596. package/src/interactive/overlays/ask-user.ts +630 -556
  597. package/src/interactive/overlays/extension-panel.ts +70 -0
  598. package/src/interactive/overlays/extensions.ts +28 -5
  599. package/src/interactive/overlays/fleet-run-approval.ts +7 -3
  600. package/src/interactive/overlays/help-reference.ts +89 -40
  601. package/src/interactive/overlays/interop.ts +122 -3
  602. package/src/interactive/overlays/keybinding-detail.ts +2 -2
  603. package/src/interactive/overlays/library-lifecycle.ts +90 -0
  604. package/src/interactive/overlays/library-model.ts +574 -0
  605. package/src/interactive/overlays/library-review.ts +557 -0
  606. package/src/interactive/overlays/library-tabs.ts +3 -15
  607. package/src/interactive/overlays/library.ts +602 -0
  608. package/src/interactive/overlays/list-overlay.ts +218 -39
  609. package/src/interactive/overlays/model-selector.ts +28 -25
  610. package/src/interactive/overlays/session-selector.ts +9 -3
  611. package/src/interactive/overlays/settings.ts +34 -26
  612. package/src/interactive/overlays/tree-selector.ts +16 -11
  613. package/src/interactive/permission-hint.ts +13 -0
  614. package/src/interactive/permission-overlay.ts +77 -28
  615. package/src/interactive/prompt-source-label.ts +21 -0
  616. package/src/interactive/renderers/preview.ts +16 -0
  617. package/src/interactive/renderers/reference-card.ts +35 -0
  618. package/src/interactive/renderers/tool-execution.ts +67 -160
  619. package/src/interactive/renderers/worker-entry.ts +90 -42
  620. package/src/interactive/slash-autocomplete.ts +100 -7
  621. package/src/interactive/slash-commands.ts +396 -105
  622. package/src/interactive/slash-spec.ts +0 -1
  623. package/src/interactive/status/controller.ts +0 -5
  624. package/src/interactive/status/state-machine.ts +44 -26
  625. package/src/interactive/status/types.ts +3 -0
  626. package/src/interactive/status/verbs.ts +13 -12
  627. package/src/interactive/terminal-lease.ts +44 -12
  628. package/src/interactive/transcript-detail.ts +50 -112
  629. package/src/interactive/turn-queues.ts +8 -7
  630. package/src/interactive/turn-runtime.ts +1 -1
  631. package/src/interactive/view/artifacts.ts +4 -0
  632. package/src/interactive/view/view-overlay.ts +58 -43
  633. package/src/interactive/welcome-dashboard.ts +525 -408
  634. package/src/tools/bootstrap.ts +8 -0
  635. package/src/tools/builtin-tool-catalog.ts +7 -2
  636. package/src/tools/context/index.ts +58 -5
  637. package/src/tools/context/library.ts +465 -0
  638. package/src/tools/context/surface.ts +20 -6
  639. package/src/tools/core-bootstrap.ts +3 -0
  640. package/src/tools/dispatch-admission.ts +24 -1
  641. package/src/tools/dispatch-arguments.ts +8 -0
  642. package/src/tools/dispatch-plan.ts +32 -0
  643. package/src/tools/dispatch-schema.ts +31 -1
  644. package/src/tools/dispatch-types.ts +3 -0
  645. package/src/tools/dispatch.ts +1 -1
  646. package/src/tools/harness-extensions.ts +169 -0
  647. package/src/tools/observation.ts +4 -0
  648. package/src/tools/policy.ts +7 -1
  649. package/src/tools/presentation.ts +1 -1
  650. package/src/tools/registry.ts +20 -2
  651. package/src/tools/verify/numeric.ts +4 -4
  652. package/src/tools/worker-evidence.ts +5 -0
  653. package/src/worker/context-seed.ts +192 -0
  654. package/src/worker/entry.ts +1 -0
  655. package/src/worker/spec-contract.ts +8 -1
  656. package/dist/chunk-3UW3KU4A.js +0 -21
  657. package/dist/chunk-6SYEGZI3.js +0 -433
  658. package/dist/chunk-CXQ37WJH.js +0 -45
  659. package/dist/chunk-EQEJJ53P.js +0 -399
  660. package/dist/chunk-KTFSFCVN.js +0 -46
  661. package/dist/chunk-QRFXEO6Y.js +0 -17
  662. package/dist/chunk-T7FDXNRU.js +0 -1257
  663. package/dist/chunk-U7VQ4NI4.js +0 -911
  664. package/dist/configure-SML6UBZ5.js +0 -55
  665. package/dist/interop-YOTGXFJM.js +0 -115
  666. package/dist/library-GJI6W6OK.js +0 -226
  667. package/dist/skills-S36AAJHU.js +0 -510
  668. package/skills/README.md +0 -418
  669. package/skills/meta/find-skills/SKILL.md +0 -78
  670. package/skills/meta/find-skills/evals.md +0 -47
  671. package/src/domains/extensions/resource-path.ts +0 -27
  672. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +0 -27
  673. package/src/interactive/overlays/agents.ts +0 -70
  674. package/src/interactive/overlays/library-install-confirm.ts +0 -152
  675. package/src/interactive/overlays/prompts.ts +0 -89
  676. package/src/interactive/overlays/skills-hub.ts +0 -615
  677. /package/{skills → library/skills}/coding/ast-grep/references/rule_reference.md +0 -0
  678. /package/{skills → library/skills}/coding/prototype/references/LOGIC.md +0 -0
  679. /package/{skills → library/skills}/coding/prototype/references/UI.md +0 -0
  680. /package/{skills → library/skills}/coding/tdd/references/mocking.md +0 -0
  681. /package/{skills → library/skills}/coding/tdd/references/tests.md +0 -0
  682. /package/{skills → library/skills}/context/context-handoff/scripts/new-handoff.sh +0 -0
  683. /package/{skills → library/skills}/git/branch-closeout/evals.md +0 -0
  684. /package/{skills → library/skills}/git/branch-closeout/references/closeout-checklist.md +0 -0
  685. /package/{skills → library/skills}/git/file-ticket/assets/issue-template.md +0 -0
  686. /package/{skills → library/skills}/git/file-ticket/evals.md +0 -0
  687. /package/{skills → library/skills}/git/file-ticket/references/issue-discovery.md +0 -0
  688. /package/{skills → library/skills}/git/fix-issue/evals.md +0 -0
  689. /package/{skills → library/skills}/git/fix-issue/references/diagnosis-and-rca.md +0 -0
  690. /package/{skills → library/skills}/git/resolve-merge-conflicts/references/conflict-matrix.md +0 -0
  691. /package/{skills → library/skills}/git/ship/assets/pr-template.md +0 -0
  692. /package/{skills → library/skills}/git/ship/evals.md +0 -0
  693. /package/{skills → library/skills}/git/ship/references/remote-and-branch-policy.md +0 -0
  694. /package/{skills → library/skills}/git/worktree-create/evals.md +0 -0
  695. /package/{skills → library/skills}/git/worktree-create/references/worktree-setup.md +0 -0
  696. /package/{skills → library/skills}/git/worktree-merge/evals.md +0 -0
  697. /package/{skills → library/skills}/git/worktree-merge/references/merge-strategies.md +0 -0
  698. /package/{skills → library/skills}/meta/clio-coder-test/references/harness.md +0 -0
  699. /package/{skills → library/skills}/meta/clio-coder-test/references/test-map.md +0 -0
  700. /package/{skills → library/skills}/planning/archify/evals.md +0 -0
@@ -0,0 +1,574 @@
1
+ /**
2
+ * The Library browser's projection: one inventory read becomes the rows, the
3
+ * status line and the detail panes the operator actually sees.
4
+ *
5
+ * Everything here is pure. The overlay owns the keyboard, the lifecycle port
6
+ * owns the writes, and this module owns what is true on screen, so the wording
7
+ * of an origin label or a disabled reason is testable without a terminal.
8
+ */
9
+
10
+ import type { PluginScope } from "../../domains/plugins/types.js";
11
+ import type {
12
+ LibraryCopy,
13
+ LibraryCopyInspection,
14
+ LibraryEntryKind,
15
+ LibraryInventory,
16
+ LibraryOrigin,
17
+ LibraryPackageRecord,
18
+ LibraryProvidedResource,
19
+ LibraryResource,
20
+ LibraryResourceKind,
21
+ } from "../../domains/resources/index.js";
22
+ import { clioTheme, GLYPH } from "../theme/index.js";
23
+ import type { ListOverlayItem } from "./list-overlay.js";
24
+
25
+ /** Browse lists install targets; Installed lists the copies and recipes that exist here. */
26
+ export type LibraryMode = "browse" | "installed";
27
+
28
+ export interface LibraryView {
29
+ category: LibraryEntryKind;
30
+ mode: LibraryMode;
31
+ scope: PluginScope;
32
+ /** Set while drilled into one package's members. */
33
+ member?: { ref: string; scope?: PluginScope } | undefined;
34
+ }
35
+
36
+ /** What one row is, so an action never has to re-parse a row id it printed. */
37
+ export type LibraryRowSubject =
38
+ | { kind: "package"; record: LibraryPackageRecord }
39
+ | { kind: "copy"; copy: LibraryCopy }
40
+ | { kind: "recipe"; resource: LibraryResource }
41
+ | { kind: "member"; owner: LibraryCopy; member: LibraryCopyInspection["resources"][number] }
42
+ | { kind: "hint"; record: LibraryPackageRecord; hint: LibraryProvidedResource }
43
+ | { kind: "notice"; message: string };
44
+
45
+ export const LIBRARY_GROUP_INSTALLED = "Installed";
46
+ export const LIBRARY_GROUP_AVAILABLE = "Available";
47
+ export const LIBRARY_GROUP_MEMBERS = "Members";
48
+ export const LIBRARY_GROUP_UNMANAGED = "Not a package";
49
+ export const LIBRARY_GROUP_NOTICES = "Notices";
50
+
51
+ /**
52
+ * Where the bytes came from, in words.
53
+ *
54
+ * Origin is evidence about location and adoption. Format, trust, scope and
55
+ * availability are four other facts and each gets its own column or line, which
56
+ * is why none of them is folded into this string.
57
+ */
58
+ export function libraryOriginLabel(origin: LibraryOrigin): string {
59
+ switch (origin.kind) {
60
+ case "bundled":
61
+ return "Bundled with Clio-Coder";
62
+ case "remote":
63
+ return "Remote";
64
+ case "local":
65
+ return "Local";
66
+ case "imported":
67
+ return `Imported from ${origin.agent}`;
68
+ case "core":
69
+ return "Core";
70
+ default:
71
+ return "Unknown origin";
72
+ }
73
+ }
74
+
75
+ /** The address behind the label: URL, path, catalog or marketplace, whichever the evidence carries. */
76
+ function libraryOriginDetail(origin: LibraryOrigin): string | undefined {
77
+ switch (origin.kind) {
78
+ case "bundled":
79
+ return origin.catalog;
80
+ case "remote":
81
+ return [origin.url, origin.catalog].filter(Boolean).join(" · ");
82
+ case "local":
83
+ return [origin.path, origin.catalog].filter(Boolean).join(" · ");
84
+ case "imported":
85
+ return [origin.path, origin.marketplace].filter(Boolean).join(" · ");
86
+ case "core":
87
+ return "src/domains/agents";
88
+ default:
89
+ return origin.detail;
90
+ }
91
+ }
92
+
93
+ /** Vendor packaging format, which is neither a location nor a trust decision. */
94
+ function libraryFormatLabel(format: string | undefined): string {
95
+ if (format === "claude-code") return "Claude Code format";
96
+ if (format === "codex") return "Codex format";
97
+ if (format === "portable") return "Portable format";
98
+ return "Format unknown";
99
+ }
100
+
101
+ /**
102
+ * The persistent mode/scope row, at the width it is drawn.
103
+ *
104
+ * Mode and scope survive every width, because they say what the action keys
105
+ * will do. The counts are what gets dropped first: they are useful, and they
106
+ * are not the thing an operator would be wrong about.
107
+ */
108
+ export function libraryStatusLine(
109
+ view: LibraryView,
110
+ counts: { rows: number; notices: number; truncated: boolean },
111
+ width: number,
112
+ ): string {
113
+ const theme = clioTheme();
114
+ const mode = view.mode === "browse" ? "Browse" : "Installed";
115
+ const scope = view.scope === "user" ? "User" : "Project";
116
+ const core = `${mode} · ${scope}`;
117
+ if (width < 34) return theme.fg("accent", `${mode}·${scope}`);
118
+ const parts = [theme.fg("accent", core)];
119
+ if (view.member) parts.push(theme.fg("dim", `members of ${view.member.ref}`));
120
+ if (width >= 56) parts.push(theme.fg("dim", `${counts.rows} row${counts.rows === 1 ? "" : "s"}`));
121
+ if (counts.notices > 0) parts.push(theme.fg("warning", `${counts.notices} notice${counts.notices === 1 ? "" : "s"}`));
122
+ if (counts.truncated) parts.push(theme.fg("warning", "incomplete results"));
123
+ return parts.join(theme.fg("frame", " │ "));
124
+ }
125
+
126
+ /** The composer text a `use` on this recipe writes, or null when its use is another surface. */
127
+ export function libraryUseInvocation(kind: LibraryResourceKind, name: string): string | null {
128
+ if (kind === "skill") return `/skill ${name} `;
129
+ if (kind === "agent") return `/run ${name} `;
130
+ if (kind === "prompt") return `/${name} `;
131
+ // A fleet's use is its `/fleet run` approval preview, not composer text.
132
+ return null;
133
+ }
134
+
135
+ /** Which keys this row offers, and why the others are absent. */
136
+ export interface LibraryRowActions {
137
+ install: boolean;
138
+ remove: boolean;
139
+ enable: boolean;
140
+ update: boolean;
141
+ use: boolean;
142
+ open: boolean;
143
+ /** One sentence per unavailable action, shown in the detail pane rather than as a dead key. */
144
+ reasons: string[];
145
+ }
146
+
147
+ function ownerScopeOf(record: LibraryPackageRecord, scope: PluginScope): { scope: PluginScope } | undefined {
148
+ return record.copies.find((copy) => copy.scope === scope);
149
+ }
150
+
151
+ /**
152
+ * A row's available actions, computed from the same records the row printed.
153
+ *
154
+ * Nothing here guesses. A core or loose recipe is not a package, so it offers
155
+ * no package lifecycle at all and says so; an unavailable recipe offers no
156
+ * `use`, because the invocation would fail; and a package with no copy in the
157
+ * selected scope offers install rather than update.
158
+ */
159
+ export function libraryRowActions(subject: LibraryRowSubject, view: LibraryView): LibraryRowActions {
160
+ const none: LibraryRowActions = {
161
+ install: false,
162
+ remove: false,
163
+ enable: false,
164
+ update: false,
165
+ use: false,
166
+ open: false,
167
+ reasons: [],
168
+ };
169
+ if (subject.kind === "notice") return none;
170
+ if (subject.kind === "package") {
171
+ const here = ownerScopeOf(subject.record, view.scope);
172
+ const reasons: string[] = [];
173
+ if (subject.record.refusal) reasons.push(subject.record.refusal);
174
+ if (!here) reasons.push(`No ${view.scope} copy; install writes one. Press s to select the other scope.`);
175
+ return {
176
+ install: !here && !subject.record.refusal,
177
+ remove: !!here,
178
+ enable: !!here,
179
+ update: !!here,
180
+ use: false,
181
+ open: true,
182
+ reasons,
183
+ };
184
+ }
185
+ if (subject.kind === "copy") {
186
+ const selected = subject.copy.scope === view.scope;
187
+ const reasons: string[] = [];
188
+ if (!selected)
189
+ reasons.push(
190
+ `This copy is ${subject.copy.scope} scope and actions select ${view.scope}. Press s to select ${subject.copy.scope}.`,
191
+ );
192
+ return {
193
+ install: false,
194
+ remove: selected,
195
+ enable: selected,
196
+ update: selected,
197
+ use: false,
198
+ open: true,
199
+ reasons,
200
+ };
201
+ }
202
+ if (subject.kind === "member") {
203
+ const selected = subject.owner.scope === view.scope;
204
+ const reasons = [`Actions here identify the whole owner ${subject.owner.ref} in ${view.scope} scope.`];
205
+ if (!selected) reasons.push(`The inspected copy is ${subject.owner.scope}; press s to select it.`);
206
+ if (!subject.member.valid) reasons.push("This member did not validate, so it has no use action.");
207
+ return {
208
+ install: false,
209
+ remove: selected,
210
+ enable: selected,
211
+ update: selected,
212
+ use: false,
213
+ open: false,
214
+ reasons,
215
+ };
216
+ }
217
+ if (subject.kind === "hint") {
218
+ return {
219
+ install: !ownerScopeOf(subject.record, view.scope),
220
+ remove: !!ownerScopeOf(subject.record, view.scope),
221
+ enable: false,
222
+ update: false,
223
+ use: false,
224
+ open: false,
225
+ reasons: [
226
+ `A catalog hint from ${subject.record.ref}. It describes what that package says it contains; nothing is loaded until it is installed and verified.`,
227
+ ],
228
+ };
229
+ }
230
+ const resource = subject.resource;
231
+ const owner = resource.owner;
232
+ const usable = resource.availability === "available";
233
+ const reasons: string[] = [];
234
+ if (!usable) reasons.push(resource.reason ?? `This resource is ${resource.availability} and cannot be used.`);
235
+ if (!owner)
236
+ reasons.push(
237
+ resource.source.class === "core"
238
+ ? "Core recipes ship with Clio-Coder and have no package to install, update or remove."
239
+ : "This file was found directly in a resource root, not installed as a package, so package lifecycle does not apply.",
240
+ );
241
+ const selected = owner?.scope === view.scope;
242
+ if (owner && !selected) reasons.push(`Owned by ${owner.ref} in ${owner.scope} scope; press s to select it.`);
243
+ return {
244
+ install: false,
245
+ remove: !!owner && selected,
246
+ enable: !!owner && selected,
247
+ update: !!owner && selected,
248
+ use: usable,
249
+ open: !!owner,
250
+ reasons,
251
+ };
252
+ }
253
+
254
+ function copyStateWord(copy: LibraryCopy): string {
255
+ const theme = clioTheme();
256
+ if (copy.state === "loadable") return theme.fg("success", "loadable");
257
+ if (copy.state === "disabled") return theme.fg("warning", "disabled");
258
+ if (copy.state === "shadowed") return theme.fg("dim", "shadowed");
259
+ return theme.fg("error", copy.state);
260
+ }
261
+
262
+ function availabilityWord(resource: LibraryResource): string {
263
+ const theme = clioTheme();
264
+ if (resource.availability === "available") return theme.fg("success", "available");
265
+ if (resource.availability === "untrusted") return theme.fg("warning", "untrusted");
266
+ if (resource.availability === "shadowed") return theme.fg("dim", "shadowed");
267
+ return theme.fg("error", resource.availability);
268
+ }
269
+
270
+ function metaOf(parts: ReadonlyArray<string | undefined>): string {
271
+ return parts.filter((part): part is string => !!part && part.length > 0).join(" · ");
272
+ }
273
+
274
+ function packageDetail(record: LibraryPackageRecord, view: LibraryView, actions: LibraryRowActions): string[] {
275
+ const lines = [`# ${record.name}`, `**Kind:** ${record.kind}`, `**Origin:** ${libraryOriginLabel(record.origin)}`];
276
+ const detail = libraryOriginDetail(record.origin);
277
+ if (detail) lines.push(`**Source:** \`${detail}\``);
278
+ lines.push(`**Format:** ${libraryFormatLabel(record.format)}`);
279
+ if (record.version) lines.push(`**Version:** ${record.version}`);
280
+ if (record.sha256) lines.push(`**Recorded digest:** \`${record.sha256.slice(0, 12)}\``);
281
+ lines.push(
282
+ `**Installed copies:** ${
283
+ record.copies.length === 0 ? "none" : record.copies.map((copy) => `${copy.scope} (${copy.state})`).join(", ")
284
+ }`,
285
+ );
286
+ lines.push(`**Selected scope:** ${view.scope}`);
287
+ if (record.requires?.length) lines.push(`**Requires:** ${record.requires.join(", ")}`);
288
+ if (record.provides?.length)
289
+ lines.push(`**Catalog hints:** ${record.provides.map((hint) => `${hint.kind}:${hint.name}`).join(", ")}`);
290
+ if (record.provides === undefined && record.copies.length === 0)
291
+ lines.push("**Contents:** unknown until this package is inspected or installed.");
292
+ for (const reason of actions.reasons) lines.push(`**Note:** ${reason}`);
293
+ lines.push("", "---", "", record.description);
294
+ return lines;
295
+ }
296
+
297
+ function copyDetail(copy: LibraryCopy, view: LibraryView, actions: LibraryRowActions): string[] {
298
+ const lines = [
299
+ `# ${copy.name}`,
300
+ `**Kind:** ${copy.kind}`,
301
+ `**Scope:** ${copy.scope}`,
302
+ `**State:** ${copy.state}`,
303
+ `**Enabled:** ${copy.enabled ? "yes" : "no"} · **Valid:** ${copy.valid ? "yes" : "no"} · **Compatible:** ${copy.compatible ? "yes" : "no"} · **Effective:** ${copy.effective ? "yes" : "no"}`,
304
+ `**Trust:** ${copy.trust}`,
305
+ `**Origin:** ${libraryOriginLabel(copy.origin)}`,
306
+ ];
307
+ const detail = libraryOriginDetail(copy.origin);
308
+ if (detail) lines.push(`**Source:** \`${detail}\``);
309
+ lines.push(`**Format:** ${libraryFormatLabel(copy.format)}`);
310
+ lines.push(`**Root:** \`${copy.root}\``);
311
+ if (copy.overriddenBy) lines.push(`**Overridden by:** the ${copy.overriddenBy} copy`);
312
+ if (copy.recordedDigest)
313
+ lines.push(
314
+ `**Integrity:** recorded \`${copy.recordedDigest.slice(0, 12)}\`${
315
+ copy.observedDigest
316
+ ? copy.observedDigest === copy.recordedDigest
317
+ ? ", observed identical"
318
+ : `, observed \`${copy.observedDigest.slice(0, 12)}\` (content changed)`
319
+ : ""
320
+ }`,
321
+ );
322
+ if (copy.installedAt) lines.push(`**Installed:** ${copy.installedAt}`);
323
+ lines.push(`**Selected scope:** ${view.scope}`);
324
+ for (const diagnostic of copy.diagnostics) lines.push(`**Diagnostic:** ${diagnostic}`);
325
+ for (const reason of actions.reasons) lines.push(`**Note:** ${reason}`);
326
+ lines.push("", "Press Enter to list this package's members.");
327
+ return lines;
328
+ }
329
+
330
+ function resourceDetail(resource: LibraryResource, actions: LibraryRowActions): string[] {
331
+ const lines = [
332
+ `# ${resource.name}`,
333
+ `**Kind:** ${resource.kind}`,
334
+ `**Use:** ${resource.invocation ? `\`${resource.invocation}\`` : "not invocable in this state"}`,
335
+ `**Availability:** ${resource.availability}`,
336
+ `**Source:** ${resource.source.class} (${resource.source.id}), ${resource.source.scope} scope`,
337
+ `**Origin:** ${libraryOriginLabel(resource.origin)}`,
338
+ ];
339
+ const detail = libraryOriginDetail(resource.origin);
340
+ if (detail) lines.push(`**Location:** \`${detail}\``);
341
+ if (resource.format) lines.push(`**Format:** ${libraryFormatLabel(resource.format)}`);
342
+ lines.push(`**Trusted:** ${resource.trusted ? "yes" : "no"}`);
343
+ if (resource.owner)
344
+ lines.push(
345
+ `**Owner:** ${resource.owner.ref} (${resource.owner.scope} scope)${
346
+ resource.owner.componentId ? `, declared component \`${resource.owner.componentId}\`` : ""
347
+ }`,
348
+ );
349
+ lines.push(`**Path:** \`${resource.path}\``);
350
+ if (resource.audience) lines.push(`**Audience:** ${resource.audience}`);
351
+ if (resource.reason) lines.push(`**Reason:** ${resource.reason}`);
352
+ for (const diagnostic of resource.diagnostics) lines.push(`**Diagnostic:** ${diagnostic}`);
353
+ for (const reason of actions.reasons) lines.push(`**Note:** ${reason}`);
354
+ lines.push("", "---", "", resource.description);
355
+ return lines;
356
+ }
357
+
358
+ function memberDetail(subject: Extract<LibraryRowSubject, { kind: "member" }>, actions: LibraryRowActions): string[] {
359
+ const lines = [
360
+ `# ${subject.member.name}`,
361
+ `**Kind:** ${subject.member.kind}`,
362
+ `**Owner:** ${subject.owner.ref} (${subject.owner.scope} scope, ${subject.owner.state})`,
363
+ `**Valid:** ${subject.member.valid ? "yes" : "no"}`,
364
+ ];
365
+ if (subject.member.componentId) lines.push(`**Declared component:** \`${subject.member.componentId}\``);
366
+ lines.push(`**Path:** \`${subject.member.path}\``);
367
+ lines.push(`**Origin:** ${libraryOriginLabel(subject.owner.origin)}`);
368
+ for (const diagnostic of subject.member.diagnostics) lines.push(`**Diagnostic:** ${diagnostic}`);
369
+ for (const reason of actions.reasons) lines.push(`**Note:** ${reason}`);
370
+ if (subject.member.description) lines.push("", "---", "", subject.member.description);
371
+ return lines;
372
+ }
373
+
374
+ /** The rows one view draws, with the subject behind each id. */
375
+ export interface LibraryRowSet {
376
+ items: ListOverlayItem[];
377
+ subjects: Map<string, LibraryRowSubject>;
378
+ notices: number;
379
+ truncated: boolean;
380
+ }
381
+
382
+ function push(set: LibraryRowSet, id: string, subject: LibraryRowSubject, item: Omit<ListOverlayItem, "id">): void {
383
+ set.subjects.set(id, subject);
384
+ set.items.push({ id, ...item });
385
+ }
386
+
387
+ /**
388
+ * Incomplete evidence, said out loud.
389
+ *
390
+ * A capped copy list cannot prove a package is absent, so the browser says the
391
+ * results are incomplete and names the narrower reads that can answer, rather
392
+ * than drawing an "available" row that means "we stopped looking".
393
+ */
394
+ export function libraryTruncationNotice(inventory: LibraryInventory): string | undefined {
395
+ const capped = [
396
+ inventory.truncated.packages ? "catalog packages" : undefined,
397
+ inventory.truncated.copies ? "installed copies" : undefined,
398
+ inventory.truncated.resources ? "recipes" : undefined,
399
+ ].filter((part): part is string => part !== undefined);
400
+ if (capped.length === 0) return undefined;
401
+ return `Incomplete results: ${capped.join(", ")} were capped, so an absent row does not prove a package is not installed. Narrow with / search, switch category, or run clio-coder library inspect <ref>.`;
402
+ }
403
+
404
+ /**
405
+ * Narrow one inventory read to the active category.
406
+ *
407
+ * The whole inventory is read once per rebuild rather than once per tab,
408
+ * because the loaders enumerate their roots for precedence either way and five
409
+ * filtered passes would repeat that work five times. Selection is therefore a
410
+ * projection here rather than a `kinds` argument there.
411
+ *
412
+ * Browse keeps a package whose own kind matches or whose catalog hints mention
413
+ * the category, so a bundle that contains the skill someone is looking for is
414
+ * findable before it is installed. Installed keeps the category's recipes, plus
415
+ * the copies of that package kind that produced no loadable resource, so a
416
+ * damaged package stays reachable for repair instead of vanishing with the
417
+ * recipes it failed to provide.
418
+ */
419
+ export function selectForCategory(inventory: LibraryInventory, view: LibraryView): LibraryInventory {
420
+ if (view.mode === "browse")
421
+ return {
422
+ ...inventory,
423
+ packages: inventory.packages.filter(
424
+ (record) => record.kind === view.category || (record.provides ?? []).some((hint) => hint.kind === view.category),
425
+ ),
426
+ copies: [],
427
+ resources: [],
428
+ };
429
+ if (view.category === "plugin")
430
+ return {
431
+ ...inventory,
432
+ packages: [],
433
+ copies: inventory.copies.filter((copy) => copy.kind === "plugin"),
434
+ resources: [],
435
+ };
436
+ const resources = inventory.resources.filter((resource) => resource.kind === view.category);
437
+ const provided = new Set(resources.map((resource) => resource.owner?.ref).filter(Boolean));
438
+ return {
439
+ ...inventory,
440
+ packages: [],
441
+ copies: inventory.copies.filter((copy) => copy.kind === view.category && !provided.has(copy.ref)),
442
+ resources,
443
+ };
444
+ }
445
+
446
+ export interface LibraryRowOptions {
447
+ inventory: LibraryInventory;
448
+ view: LibraryView;
449
+ /** Members of the drilled-into copy, read explicitly rather than during listing. */
450
+ inspection?: LibraryCopyInspection | undefined;
451
+ /** A one-line problem the last read hit, drawn as a notice row rather than swallowed. */
452
+ failure?: string | undefined;
453
+ }
454
+
455
+ /**
456
+ * Build one view's rows.
457
+ *
458
+ * The two modes answer different questions and so they list different records.
459
+ * Browse lists install targets, which is what an operator wanting something new
460
+ * is looking at. Installed lists what this machine actually has, which is what
461
+ * an operator repairing something is looking at. Neither hides the other's
462
+ * evidence: a browse row states its installed copies and an installed row
463
+ * states its origin.
464
+ */
465
+ export function buildLibraryRows(options: LibraryRowOptions): LibraryRowSet {
466
+ const { inventory, view } = options;
467
+ const theme = clioTheme();
468
+ const set: LibraryRowSet = { items: [], subjects: new Map(), notices: 0, truncated: false };
469
+
470
+ if (view.member && options.inspection) {
471
+ const owner = options.inspection.copy;
472
+ for (const member of options.inspection.resources) {
473
+ const subject: LibraryRowSubject = { kind: "member", owner, member };
474
+ const actions = libraryRowActions(subject, view);
475
+ push(set, `mem:${owner.ref}@${owner.scope}#${member.kind}:${member.name}`, subject, {
476
+ label: member.name,
477
+ meta: metaOf([
478
+ member.kind,
479
+ member.valid ? theme.fg("success", "valid") : theme.fg("error", "invalid"),
480
+ member.componentId ? `component ${member.componentId}` : undefined,
481
+ ]),
482
+ group: LIBRARY_GROUP_MEMBERS,
483
+ detail: () => memberDetail(subject, actions),
484
+ });
485
+ }
486
+ for (const item of options.inspection.ancillary) {
487
+ const subject: LibraryRowSubject = {
488
+ kind: "notice",
489
+ message: `${item.kind} ${item.id} is declared package metadata, not a recipe. It runs only on an explicit request.`,
490
+ };
491
+ push(set, `note:ancillary:${item.kind}:${item.id}`, subject, {
492
+ label: `${item.kind}: ${item.id}`,
493
+ meta: theme.fg("dim", "companion file"),
494
+ group: LIBRARY_GROUP_NOTICES,
495
+ detail: () => [`# ${item.id}`, `**Declared as:** ${item.kind}`, `**Path:** \`${item.path}\``, "", subject.message],
496
+ });
497
+ set.notices += 1;
498
+ }
499
+ for (const diagnostic of options.inspection.diagnostics) {
500
+ const subject: LibraryRowSubject = { kind: "notice", message: diagnostic };
501
+ push(set, `note:member-diag:${set.notices}`, subject, {
502
+ label: `${theme.fg("warning", GLYPH.warnInline)} ${diagnostic}`,
503
+ meta: theme.fg("dim", "inspection"),
504
+ group: LIBRARY_GROUP_NOTICES,
505
+ detail: () => ["# Inspection diagnostic", diagnostic],
506
+ });
507
+ set.notices += 1;
508
+ }
509
+ } else if (view.mode === "browse") {
510
+ for (const record of inventory.packages) {
511
+ const subject: LibraryRowSubject = { kind: "package", record };
512
+ const actions = libraryRowActions(subject, view);
513
+ const here = record.copies.find((copy) => copy.scope === view.scope);
514
+ const hints = (record.provides ?? []).filter((hint) => view.category === "plugin" || hint.kind === view.category);
515
+ push(set, `pkg:${record.ref}`, subject, {
516
+ label: record.name,
517
+ meta: metaOf([
518
+ libraryOriginLabel(record.origin),
519
+ record.version ? `v${record.version}` : undefined,
520
+ here ? theme.fg("success", `${here.scope} ${here.state}`) : theme.fg("dim", "not in this scope"),
521
+ hints.length > 0 ? `${hints.length} hinted` : undefined,
522
+ ]),
523
+ group: record.copies.length > 0 ? LIBRARY_GROUP_INSTALLED : LIBRARY_GROUP_AVAILABLE,
524
+ detail: () => packageDetail(record, view, actions),
525
+ });
526
+ }
527
+ } else {
528
+ for (const copy of inventory.copies) {
529
+ const subject: LibraryRowSubject = { kind: "copy", copy };
530
+ const actions = libraryRowActions(subject, view);
531
+ push(set, `copy:${copy.ref}@${copy.scope}`, subject, {
532
+ label: copy.name,
533
+ meta: metaOf([
534
+ libraryOriginLabel(copy.origin),
535
+ copy.scope,
536
+ copyStateWord(copy),
537
+ copy.trust === "foreign" ? theme.fg("warning", "foreign") : undefined,
538
+ ]),
539
+ group: LIBRARY_GROUP_INSTALLED,
540
+ detail: () => copyDetail(copy, view, actions),
541
+ });
542
+ }
543
+ for (const resource of inventory.resources) {
544
+ const subject: LibraryRowSubject = { kind: "recipe", resource };
545
+ const actions = libraryRowActions(subject, view);
546
+ push(set, `res:${resource.key}`, subject, {
547
+ label: resource.name,
548
+ meta: metaOf([
549
+ libraryOriginLabel(resource.origin),
550
+ resource.owner ? resource.owner.ref : resource.source.class,
551
+ availabilityWord(resource),
552
+ ]),
553
+ group: resource.owner ? LIBRARY_GROUP_INSTALLED : LIBRARY_GROUP_UNMANAGED,
554
+ detail: () => resourceDetail(resource, actions),
555
+ });
556
+ }
557
+ }
558
+
559
+ const truncation = libraryTruncationNotice(inventory);
560
+ set.truncated = truncation !== undefined;
561
+ for (const message of [options.failure, truncation, ...inventory.diagnostics].filter(
562
+ (entry): entry is string => entry !== undefined,
563
+ )) {
564
+ const subject: LibraryRowSubject = { kind: "notice", message };
565
+ push(set, `note:${set.notices}`, subject, {
566
+ label: `${theme.fg("warning", GLYPH.warnInline)} ${message}`,
567
+ meta: theme.fg("dim", "library"),
568
+ group: LIBRARY_GROUP_NOTICES,
569
+ detail: () => ["# Library notice", "", message],
570
+ });
571
+ set.notices += 1;
572
+ }
573
+ return set;
574
+ }