@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,145 @@
1
+ import { lstatSync, realpathSync } from "node:fs";
2
+ import path from "node:path";
3
+ import type { ExtensionCapabilities, ExtensionCommandTool } from "./types.js";
4
+
5
+ const TOOL_KEYS = new Set([
6
+ "name",
7
+ "description",
8
+ "runtime",
9
+ "entrypoint",
10
+ "inputSchema",
11
+ "timeoutMs",
12
+ "maxOutputBytes",
13
+ ]);
14
+ const SCHEMA_KEYS = new Set([
15
+ "type",
16
+ "description",
17
+ "properties",
18
+ "required",
19
+ "additionalProperties",
20
+ "items",
21
+ "enum",
22
+ "minimum",
23
+ "maximum",
24
+ "minLength",
25
+ "maxLength",
26
+ "minItems",
27
+ "maxItems",
28
+ ]);
29
+ const TYPES = new Set(["object", "array", "string", "number", "integer", "boolean", "null"]);
30
+
31
+ function record(value: unknown): value is Record<string, unknown> {
32
+ return value !== null && typeof value === "object" && !Array.isArray(value);
33
+ }
34
+
35
+ export function extensionToolName(id: string, name: string): string {
36
+ return `extension_${id}__${name}`;
37
+ }
38
+
39
+ function validateSchema(value: unknown, depth = 0): asserts value is Record<string, unknown> {
40
+ if (depth > 12 || !record(value))
41
+ throw new Error("inputSchema must be a JSON schema object with at most 12 nesting levels");
42
+ for (const key of Object.keys(value)) {
43
+ if (!SCHEMA_KEYS.has(key)) throw new Error(`unsupported inputSchema keyword '${key}'`);
44
+ }
45
+ if (typeof value.type !== "string" || !TYPES.has(value.type))
46
+ throw new Error("inputSchema.type must be a supported JSON type");
47
+ if (value.description !== undefined && typeof value.description !== "string")
48
+ throw new Error("inputSchema.description must be a string");
49
+ if (
50
+ value.enum !== undefined &&
51
+ (!Array.isArray(value.enum) ||
52
+ value.enum.length === 0 ||
53
+ value.enum.some((item) => item !== null && typeof item === "object"))
54
+ ) {
55
+ throw new Error("inputSchema.enum must contain JSON scalar values");
56
+ }
57
+ for (const key of ["minimum", "maximum", "minLength", "maxLength", "minItems", "maxItems"]) {
58
+ if (value[key] !== undefined && (typeof value[key] !== "number" || !Number.isFinite(value[key])))
59
+ throw new Error(`inputSchema.${key} must be finite`);
60
+ }
61
+ if (value.type === "object") {
62
+ if (!record(value.properties) || value.additionalProperties !== false)
63
+ throw new Error("object inputSchema requires properties and additionalProperties: false");
64
+ for (const [key, child] of Object.entries(value.properties)) {
65
+ if (["__proto__", "constructor", "prototype"].includes(key)) throw new Error("unsafe inputSchema property name");
66
+ validateSchema(child, depth + 1);
67
+ }
68
+ if (
69
+ value.required !== undefined &&
70
+ (!Array.isArray(value.required) ||
71
+ value.required.some((key) => typeof key !== "string" || !Object.hasOwn(value.properties as object, key)))
72
+ ) {
73
+ throw new Error("inputSchema.required must name declared properties");
74
+ }
75
+ } else if (value.type === "array") {
76
+ validateSchema(value.items, depth + 1);
77
+ }
78
+ }
79
+
80
+ export function parseExtensionCapabilities(value: unknown, id: string): ExtensionCapabilities {
81
+ if (
82
+ !record(value) ||
83
+ Object.keys(value).some((key) => key !== "tools") ||
84
+ !Array.isArray(value.tools) ||
85
+ value.tools.length === 0 ||
86
+ value.tools.length > 32
87
+ ) {
88
+ throw new Error("capabilities must contain tools with between 1 and 32 command declarations");
89
+ }
90
+ if (id.includes("__")) throw new Error("v2 extension id cannot contain double underscores");
91
+ const names = new Set<string>();
92
+ const tools: ExtensionCommandTool[] = value.tools.map((tool) => {
93
+ if (!record(tool)) throw new Error("capabilities.tools entries must be objects");
94
+ for (const key of Object.keys(tool)) if (!TOOL_KEYS.has(key)) throw new Error(`unknown command tool key '${key}'`);
95
+ if (typeof tool.name !== "string" || !/^[a-z][a-z0-9_]*$/.test(tool.name) || tool.name.includes("__"))
96
+ throw new Error("command tool name must use lowercase letters, digits, and single underscores");
97
+ const name = extensionToolName(id, tool.name);
98
+ if (name.length > 64 || !/^[a-zA-Z0-9_-]+$/.test(name))
99
+ throw new Error("qualified command tool name must use provider-safe characters and fit 64 characters");
100
+ if (names.has(name)) throw new Error(`duplicate command tool name '${name}'`);
101
+ names.add(name);
102
+ if (typeof tool.description !== "string" || tool.description.trim().length === 0 || tool.description.length > 2000)
103
+ throw new Error("command tool description must contain 1 to 2000 characters");
104
+ if (tool.runtime !== "node" && tool.runtime !== "python3")
105
+ throw new Error("command tool runtime must be node or python3");
106
+ if (
107
+ typeof tool.entrypoint !== "string" ||
108
+ tool.entrypoint.includes("\0") ||
109
+ tool.entrypoint.includes("\\") ||
110
+ path.isAbsolute(tool.entrypoint) ||
111
+ tool.entrypoint.split("/").some((part) => part === ".." || part === "." || part === "")
112
+ )
113
+ throw new Error("command tool entrypoint must be a contained relative file path");
114
+ validateSchema(tool.inputSchema);
115
+ if (tool.inputSchema.type !== "object") throw new Error("command tool inputSchema root must be object");
116
+ for (const [key, maximum] of [
117
+ ["timeoutMs", 300000],
118
+ ["maxOutputBytes", 1048576],
119
+ ] as const) {
120
+ const limit = tool[key];
121
+ if (limit !== undefined && (typeof limit !== "number" || !Number.isInteger(limit) || limit < 1 || limit > maximum))
122
+ throw new Error(`command tool ${key} must be between 1 and ${maximum}`);
123
+ }
124
+ return structuredClone(tool) as unknown as ExtensionCommandTool;
125
+ });
126
+ return { tools };
127
+ }
128
+
129
+ /** Entry paths must resolve to ordinary package files, including every parent directory. */
130
+ export function resolveExtensionEntrypoint(root: string, entrypoint: string): string {
131
+ const canonicalRoot = realpathSync(root);
132
+ let cursor = canonicalRoot;
133
+ for (const segment of entrypoint.split("/")) {
134
+ if (segment === ".." || segment === "." || segment.length === 0)
135
+ throw new Error("invalid command entrypoint segment");
136
+ cursor = path.join(cursor, segment);
137
+ if (lstatSync(cursor).isSymbolicLink()) throw new Error("command entrypoint cannot contain symbolic links");
138
+ }
139
+ const stat = lstatSync(cursor);
140
+ if (!stat.isFile() || stat.nlink !== 1) throw new Error("command entrypoint must be an ordinary file with one link");
141
+ const relative = path.relative(canonicalRoot, realpathSync(cursor));
142
+ if (relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative))
143
+ throw new Error("command entrypoint escapes extension root");
144
+ return cursor;
145
+ }
@@ -0,0 +1,15 @@
1
+ import type { DynamicToolName } from "../../core/tool-names.js";
2
+ import { extensionToolName } from "./command-schema.js";
3
+ import { listInstalledExtensions } from "./state.js";
4
+ import { isLoadableExtension } from "./types.js";
5
+
6
+ /** Available names for dispatch planning; registry construction re-verifies captured declarations. */
7
+ export function enabledHarnessExtensionToolNames(cwd = process.cwd()): ReadonlySet<DynamicToolName> {
8
+ return new Set(
9
+ listInstalledExtensions(cwd)
10
+ .filter(isLoadableExtension)
11
+ .flatMap((entry) =>
12
+ (entry.capabilities?.tools ?? []).map((tool) => extensionToolName(entry.id, tool.name) as DynamicToolName),
13
+ ),
14
+ );
15
+ }
@@ -66,6 +66,13 @@ function parseSemVer(value: string): SemVer | null {
66
66
  return { major, minor, patch, prerelease: parsedPrerelease };
67
67
  }
68
68
 
69
+ /** Exact, bounded manifest version; range conveniences such as a v prefix are excluded. */
70
+ export function isSemanticVersion(value: unknown): value is string {
71
+ return (
72
+ typeof value === "string" && value.length <= MAX_RANGE_CHARS && /^[0-9]/.test(value) && parseSemVer(value) !== null
73
+ );
74
+ }
75
+
69
76
  function parsePart(value: string | undefined): number | null {
70
77
  if (value === undefined || value === "x" || value === "X" || value === "*") return null;
71
78
  const parsed = Number(value);
@@ -6,8 +6,6 @@ import type {
6
6
  ExtensionListOptions,
7
7
  ExtensionMutationResult,
8
8
  ExtensionReloadPrepareResult,
9
- ExtensionResourceKind,
10
- ExtensionResourceRoot,
11
9
  ExtensionSnapshot,
12
10
  InstalledExtension,
13
11
  } from "./manager.js";
@@ -19,8 +17,6 @@ export interface ExtensionsContract extends DomainContract {
19
17
  enable(id: string, options?: ExtensionListOptions): ExtensionMutationResult;
20
18
  disable(id: string, options?: ExtensionListOptions): ExtensionMutationResult;
21
19
  remove(id: string, options?: ExtensionListOptions): ExtensionMutationResult;
22
- /** Committed projection for the bundle's cwd; ephemeral generation-0 build for any other cwd. */
23
- resourceRoots(kind: ExtensionResourceKind, cwd?: string): ExtensionResourceRoot[];
24
20
  snapshot(): ExtensionSnapshot | null;
25
21
  generation(): number;
26
22
  /**
@@ -1,28 +1,20 @@
1
- import { type Dirent, existsSync, lstatSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
1
+ import { type Dirent, existsSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
2
2
  import path from "node:path";
3
3
  import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
4
+ import { parseExtensionCapabilities, resolveExtensionEntrypoint } from "./command-schema.js";
4
5
  import { evaluateClioCompatibility } from "./compatibility.js";
5
- import type {
6
- ClioExtensionManifest,
7
- ExtensionCandidate,
8
- ExtensionDiagnostic,
9
- ExtensionManifestResources,
10
- } from "./types.js";
6
+ import { parseExtensionRuntime } from "./runtime-schema.js";
7
+ import type { ClioExtensionManifest, ExtensionCandidate, ExtensionDiagnostic } from "./types.js";
11
8
 
12
9
  const MANIFEST_NAMES = ["clio-coder-extension.yaml", "clio-coder-extension.yml", "clio-coder-extension.json"] as const;
13
- const MANIFEST_KEYS = new Set([
14
- "manifestVersion",
15
- "id",
16
- "name",
17
- "version",
18
- "description",
19
- "resources",
20
- "tools",
21
- "settings",
22
- "compatibility",
23
- ]);
24
- const RESOURCE_KEYS = new Set(["skills", "prompts", "agents", "fleets", "themes"]);
10
+ const MANIFEST_KEYS = new Set(["id", "name", "version", "description", "compatibility", "capabilities", "runtime"]);
25
11
  const COMPATIBILITY_KEYS = new Set(["clio"]);
12
+ /**
13
+ * Keys a domain package used to declare here. They are named so the refusal
14
+ * points at the plugin installer instead of reading as a typo.
15
+ */
16
+ const PLUGIN_OWNED_KEYS = new Set(["resources", "skills", "prompts", "agents", "fleets", "themes"]);
17
+ const PLUGIN_GUIDANCE = "domain resources belong in a plugin: clio-coder library install <path>";
26
18
 
27
19
  function compareNames(a: { name: string }, b: { name: string }): number {
28
20
  return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
@@ -66,183 +58,23 @@ function rejectUnknownKeys(
66
58
  }
67
59
  }
68
60
 
69
- function normalizeResources(
70
- value: unknown,
61
+ function rejectManifestKeys(
62
+ value: Record<string, unknown>,
71
63
  manifestPath: string,
72
64
  diagnostics: ExtensionDiagnostic[],
73
- ): ExtensionManifestResources {
74
- if (value === undefined) return {};
75
- if (!isRecord(value)) {
76
- diagnostics.push({ type: "error", message: "resources must be an object", path: manifestPath });
77
- return {};
78
- }
79
- rejectUnknownKeys(value, RESOURCE_KEYS, "resources", manifestPath, diagnostics);
80
- const out: ExtensionManifestResources = {};
81
- for (const kind of RESOURCE_KEYS) {
82
- if (value[kind] === undefined) continue;
83
- const resourcePath = trimString(value[kind]);
84
- if (!resourcePath) {
85
- diagnostics.push({
86
- type: "error",
87
- message: `resources.${kind} must be a non-empty string`,
88
- path: manifestPath,
89
- });
90
- continue;
91
- }
92
- out[kind as keyof ExtensionManifestResources] = resourcePath;
93
- }
94
- return out;
95
- }
96
-
97
- function contained(root: string, candidate: string): boolean {
98
- const relative = path.relative(root, candidate);
99
- return relative === "" || (!relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative));
100
- }
101
-
102
- function validateResourceTree(
103
- root: string,
104
- resourcePath: string,
105
- kind: string,
106
- diagnostics: ExtensionDiagnostic[],
107
65
  ): void {
108
- if (path.isAbsolute(resourcePath)) {
109
- diagnostics.push({ type: "error", message: `resources.${kind} must be relative`, path: resourcePath });
110
- return;
111
- }
112
- const resolvedRoot = path.resolve(root);
113
- const resolved = path.resolve(resolvedRoot, resourcePath);
114
- if (!contained(resolvedRoot, resolved) || resolved === resolvedRoot) {
115
- diagnostics.push({ type: "error", message: `resources.${kind} escapes the extension root`, path: resourcePath });
116
- return;
117
- }
118
- let canonicalRoot: string;
119
- let canonicalResource: string;
120
- try {
121
- canonicalRoot = realpathSync(resolvedRoot);
122
- canonicalResource = realpathSync(resolved);
123
- if (!statSync(resolved).isDirectory()) {
124
- diagnostics.push({ type: "error", message: `resources.${kind} is not a directory`, path: resolved });
125
- return;
126
- }
127
- } catch (error) {
66
+ for (const key of Object.keys(value).sort()) {
67
+ if (MANIFEST_KEYS.has(key)) continue;
128
68
  diagnostics.push({
129
69
  type: "error",
130
- message: `resources.${kind} cannot be resolved: ${error instanceof Error ? error.message : String(error)}`,
131
- path: resolved,
70
+ message: PLUGIN_OWNED_KEYS.has(key)
71
+ ? `harness extensions cannot declare '${key}'; ${PLUGIN_GUIDANCE}`
72
+ : `unknown manifest key '${key}'`,
73
+ path: manifestPath,
132
74
  });
133
- return;
134
- }
135
- if (!contained(canonicalRoot, canonicalResource)) {
136
- diagnostics.push({ type: "error", message: `resources.${kind} escapes through a symbolic link`, path: resolved });
137
- return;
138
- }
139
-
140
- const pending = [resolved];
141
- while (pending.length > 0) {
142
- const directory = pending.pop();
143
- if (!directory) continue;
144
- for (const entry of readdirSync(directory, { withFileTypes: true }).sort(compareNames)) {
145
- const candidate = path.join(directory, entry.name);
146
- if (entry.isSymbolicLink()) {
147
- try {
148
- const canonicalTarget = realpathSync(candidate);
149
- if (!contained(canonicalRoot, canonicalTarget)) {
150
- diagnostics.push({
151
- type: "error",
152
- message: `resources.${kind} contains an escaping symbolic link`,
153
- path: candidate,
154
- });
155
- continue;
156
- }
157
- const targetStat = statSync(candidate);
158
- if (!targetStat.isDirectory() && !targetStat.isFile()) {
159
- diagnostics.push({
160
- type: "error",
161
- message: `resources.${kind} contains a symbolic link to an unsupported filesystem entry`,
162
- path: candidate,
163
- });
164
- } else if (targetStat.isFile() && targetStat.nlink !== 1) {
165
- diagnostics.push({
166
- type: "error",
167
- message: `resources.${kind} contains a symbolic link to a hard-linked file`,
168
- path: candidate,
169
- });
170
- }
171
- } catch (error) {
172
- diagnostics.push({
173
- type: "error",
174
- message: `resources.${kind} contains an unresolved symbolic link: ${error instanceof Error ? error.message : String(error)}`,
175
- path: candidate,
176
- });
177
- }
178
- } else if (entry.isDirectory()) {
179
- pending.push(candidate);
180
- } else if (entry.isFile()) {
181
- try {
182
- if (lstatSync(candidate).nlink !== 1) {
183
- diagnostics.push({
184
- type: "error",
185
- message: `resources.${kind} contains a hard-linked file`,
186
- path: candidate,
187
- });
188
- }
189
- } catch (error) {
190
- diagnostics.push({
191
- type: "error",
192
- message: `resources.${kind} entry could not be inspected: ${error instanceof Error ? error.message : String(error)}`,
193
- path: candidate,
194
- });
195
- }
196
- } else {
197
- diagnostics.push({
198
- type: "error",
199
- message: `resources.${kind} contains an unsupported filesystem entry`,
200
- path: candidate,
201
- });
202
- }
203
- }
204
75
  }
205
76
  }
206
77
 
207
- function validateResourceRoots(
208
- root: string,
209
- resources: ExtensionManifestResources,
210
- diagnostics: ExtensionDiagnostic[],
211
- ): void {
212
- for (const [kind, resourcePath] of Object.entries(resources)) {
213
- if (resourcePath) validateResourceTree(root, resourcePath, kind, diagnostics);
214
- }
215
- }
216
-
217
- function stringArray(
218
- value: unknown,
219
- field: "tools" | "settings",
220
- manifestPath: string,
221
- diagnostics: ExtensionDiagnostic[],
222
- ): string[] | undefined {
223
- if (value === undefined) return undefined;
224
- if (!Array.isArray(value)) {
225
- diagnostics.push({ type: "error", message: `${field} must be an array of non-empty strings`, path: manifestPath });
226
- return undefined;
227
- }
228
- const out: string[] = [];
229
- const seen = new Set<string>();
230
- for (const entry of value) {
231
- const parsed = trimString(entry);
232
- if (!parsed) {
233
- diagnostics.push({ type: "error", message: `${field} must contain only non-empty strings`, path: manifestPath });
234
- continue;
235
- }
236
- if (seen.has(parsed)) {
237
- diagnostics.push({ type: "error", message: `${field} contains duplicate entry '${parsed}'`, path: manifestPath });
238
- continue;
239
- }
240
- seen.add(parsed);
241
- out.push(parsed);
242
- }
243
- return out.length > 0 ? out : undefined;
244
- }
245
-
246
78
  export function parseExtensionManifest(
247
79
  value: unknown,
248
80
  manifestPath: string,
@@ -254,10 +86,7 @@ export function parseExtensionManifest(
254
86
  if (!isRecord(value)) {
255
87
  return { diagnostics: [{ type: "error", message: "extension manifest must be an object", path: manifestPath }] };
256
88
  }
257
- rejectUnknownKeys(value, MANIFEST_KEYS, "manifest", manifestPath, diagnostics);
258
- if (value.manifestVersion !== 1) {
259
- diagnostics.push({ type: "error", message: "manifestVersion must be 1", path: manifestPath });
260
- }
89
+ rejectManifestKeys(value, manifestPath, diagnostics);
261
90
  const id = trimString(value.id);
262
91
  const name = trimString(value.name) ?? id;
263
92
  const version = trimString(value.version);
@@ -269,9 +98,30 @@ export function parseExtensionManifest(
269
98
  }
270
99
  if (!version) diagnostics.push({ type: "error", message: "version is required", path: manifestPath });
271
100
  if (!description) diagnostics.push({ type: "error", message: "description is required", path: manifestPath });
272
- const resources = normalizeResources(value.resources, manifestPath, diagnostics);
273
- const tools = stringArray(value.tools, "tools", manifestPath, diagnostics);
274
- const settings = stringArray(value.settings, "settings", manifestPath, diagnostics);
101
+ let capabilities: ClioExtensionManifest["capabilities"];
102
+ let runtime: ClioExtensionManifest["runtime"];
103
+ if (value.runtime !== undefined) {
104
+ try {
105
+ runtime = parseExtensionRuntime(value.runtime);
106
+ } catch (error) {
107
+ diagnostics.push({
108
+ type: "error",
109
+ message: error instanceof Error ? error.message : String(error),
110
+ path: manifestPath,
111
+ });
112
+ }
113
+ }
114
+ if (value.capabilities !== undefined) {
115
+ try {
116
+ capabilities = parseExtensionCapabilities(value.capabilities, id ?? "");
117
+ } catch (error) {
118
+ diagnostics.push({
119
+ type: "error",
120
+ message: error instanceof Error ? error.message : String(error),
121
+ path: manifestPath,
122
+ });
123
+ }
124
+ }
275
125
  let compatibility: ClioExtensionManifest["compatibility"];
276
126
  if (value.compatibility !== undefined) {
277
127
  if (!isRecord(value.compatibility)) {
@@ -306,16 +156,9 @@ export function parseExtensionManifest(
306
156
  if (!id || !name || !version || !description || diagnostics.some((diag) => diag.type === "error")) {
307
157
  return { diagnostics };
308
158
  }
309
- const manifest: ClioExtensionManifest = {
310
- manifestVersion: 1,
311
- id,
312
- name,
313
- version,
314
- description,
315
- resources,
316
- };
317
- if (tools) manifest.tools = tools;
318
- if (settings) manifest.settings = settings;
159
+ const manifest: ClioExtensionManifest = { id, name, version, description };
160
+ if (runtime) manifest.runtime = runtime;
161
+ if (capabilities) manifest.capabilities = capabilities;
319
162
  if (compatibility && Object.keys(compatibility).length > 0) manifest.compatibility = compatibility;
320
163
  const clioRange = manifest.compatibility?.clio;
321
164
  if (clioRange !== undefined) {
@@ -354,7 +197,28 @@ export function loadManifestFromRoot(root: string): ExtensionCandidate {
354
197
  }
355
198
  try {
356
199
  const parsed = parseExtensionManifest(readJsonOrYaml(manifestPath), manifestPath);
357
- if (parsed.manifest) validateResourceRoots(root, parsed.manifest.resources, parsed.diagnostics);
200
+ if (parsed.manifest?.runtime) {
201
+ try {
202
+ resolveExtensionEntrypoint(root, parsed.manifest.runtime.entrypoint);
203
+ } catch (error) {
204
+ parsed.diagnostics.push({
205
+ type: "error",
206
+ message: `runtime: ${error instanceof Error ? error.message : String(error)}`,
207
+ path: manifestPath,
208
+ });
209
+ }
210
+ }
211
+ for (const tool of parsed.manifest?.capabilities?.tools ?? []) {
212
+ try {
213
+ resolveExtensionEntrypoint(root, tool.entrypoint);
214
+ } catch (error) {
215
+ parsed.diagnostics.push({
216
+ type: "error",
217
+ message: `command tool ${tool.name}: ${error instanceof Error ? error.message : String(error)}`,
218
+ path: manifestPath,
219
+ });
220
+ }
221
+ }
358
222
  return {
359
223
  path: root,
360
224
  manifestPath,
@@ -3,7 +3,6 @@ import type { ExtensionsContract } from "./contract.js";
3
3
  import {
4
4
  disableExtension,
5
5
  discoverExtensionPackages,
6
- enabledExtensionResourceRoots,
7
6
  enableExtension,
8
7
  installExtension,
9
8
  listInstalledExtensions,
@@ -100,9 +99,6 @@ export function createExtensionsBundle(
100
99
  remove(id, options = {}) {
101
100
  return removeExtension(id, options);
102
101
  },
103
- resourceRoots(kind, requestedCwd) {
104
- return enabledExtensionResourceRoots(kind, requestedCwd ?? cwd());
105
- },
106
102
  snapshot() {
107
103
  return store.current();
108
104
  },
@@ -27,13 +27,9 @@ export {
27
27
  type ExtensionReloadRejection,
28
28
  type ExtensionReloadRejectionReason,
29
29
  type ExtensionReloadResult,
30
- type ExtensionResourceKind,
31
- type ExtensionResourceRoot,
32
30
  type ExtensionScope,
33
31
  type ExtensionSnapshot,
34
32
  type ExtensionSnapshotDiagnostics,
35
- type ExtensionStateUpgradeReport,
36
- enabledExtensionResourceRoots,
37
33
  enableExtension,
38
34
  extensionManifestYaml,
39
35
  extensionSnapshotFor,
@@ -46,7 +42,6 @@ export {
46
42
  listInstalledExtensions,
47
43
  parseExtensionManifest,
48
44
  removeExtension,
49
- upgradeLegacyExtensionInstallState,
50
45
  } from "./manager.js";
51
46
  export { ExtensionsManifest } from "./manifest.js";
52
47
  export {
@@ -56,3 +51,4 @@ export {
56
51
  EXTENSION_SNAPSHOT_DIAGNOSTIC_MESSAGE_CAP,
57
52
  EXTENSION_SNAPSHOT_DIAGNOSTIC_PER_PACKAGE_CAP,
58
53
  } from "./snapshot.js";
54
+ export type { ExtensionCapabilities, ExtensionCommandTool } from "./types.js";
@@ -4,7 +4,7 @@ export {
4
4
  findExtensionManifestPath,
5
5
  parseExtensionManifest,
6
6
  } from "./discovery.js";
7
- export { enabledExtensionResourceRoots, extensionResourcePath, extensionSnapshotFor } from "./resources.js";
7
+ export { extensionSnapshotFor } from "./snapshot-access.js";
8
8
  export type { InstalledExtensionRecord } from "./state.js";
9
9
  export {
10
10
  disableExtension,
@@ -14,7 +14,6 @@ export {
14
14
  listInstalledExtensionRecords,
15
15
  listInstalledExtensions,
16
16
  removeExtension,
17
- upgradeLegacyExtensionInstallState,
18
17
  } from "./state.js";
19
18
  export type {
20
19
  ClioExtensionManifest,
@@ -24,7 +23,6 @@ export type {
24
23
  ExtensionInstallOptions,
25
24
  ExtensionInstallResult,
26
25
  ExtensionListOptions,
27
- ExtensionManifestResources,
28
26
  ExtensionMutationResult,
29
27
  ExtensionProvenance,
30
28
  ExtensionReloadCandidate,
@@ -33,13 +31,10 @@ export type {
33
31
  ExtensionReloadRejection,
34
32
  ExtensionReloadRejectionReason,
35
33
  ExtensionReloadResult,
36
- ExtensionResourceKind,
37
- ExtensionResourceRoot,
38
34
  ExtensionScope,
39
35
  ExtensionSnapshot,
40
36
  ExtensionSnapshotDiagnostics,
41
37
  ExtensionState,
42
- ExtensionStateUpgradeReport,
43
38
  InstalledExtension,
44
39
  LoadableExtension,
45
40
  } from "./types.js";
@@ -0,0 +1,29 @@
1
+ export interface ExtensionCommandRow {
2
+ origin: "extension";
3
+ invocation: string;
4
+ extensionId: string;
5
+ scope: "user" | "project";
6
+ description: string;
7
+ generation: number;
8
+ available: boolean;
9
+ reason?: string;
10
+ }
11
+ export function extensionInvocation(id: string, command: string): string {
12
+ return `ext:${id}:${command}`;
13
+ }
14
+ /** Canonical commands, including existing dotted/underscored extension IDs. */
15
+ export function isExtensionCommandToken(token: string): boolean {
16
+ return /^ext:[^\s/]+$/u.test(token);
17
+ }
18
+ /** Same collision projection is consumed by completion, inspection, and submission. */
19
+ export function resolveExtensionCommands(
20
+ rows: readonly ExtensionCommandRow[],
21
+ promptNames: readonly string[],
22
+ ): ExtensionCommandRow[] {
23
+ const prompts = new Set(promptNames.map((name) => name.toLowerCase()));
24
+ return rows.map((row) =>
25
+ prompts.has(row.invocation.toLowerCase())
26
+ ? { ...row, available: false, reason: "invocation belongs to an existing prompt template" }
27
+ : row,
28
+ );
29
+ }