@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
@@ -12,8 +12,8 @@
12
12
  * it once answered, and leaves one row on the rail saying what was chosen, so
13
13
  * the screen is the answers so far plus the question at hand. Escape moves the
14
14
  * cursor back one step and rewinds the rail to that step's row, which is what
15
- * makes going back cheap: nothing is written to disk until the last step, so
16
- * there is never a half-configured home to undo.
15
+ * keeps target edits in a draft until Save. Browser sign-in stores credentials
16
+ * when it succeeds; optional peer review has its own save after target setup.
17
17
  *
18
18
  * Steps that do not apply are stepped over in whichever direction the cursor is
19
19
  * moving, so a runtime with no URL and no credential is three questions and a
@@ -27,10 +27,13 @@ import {
27
27
  bindAgentProfileInSettings,
28
28
  type ClioSettings,
29
29
  readSettings,
30
+ SettingsValidationError,
30
31
  settingsPath,
31
32
  updateSettings,
33
+ validateSettings,
32
34
  } from "../core/config.js";
33
35
  import { THINKING_LEVELS, type ThinkingLevel } from "../core/defaults.js";
36
+ import { initializeClioHome } from "../core/init.js";
34
37
  import { resolveOnPath } from "../domains/interop/detect.js";
35
38
  import { authStoragePath, openAuthStorage, targetRequiresAuth } from "../domains/providers/auth/index.js";
36
39
  import {
@@ -69,6 +72,7 @@ import {
69
72
  setOrchestratorPointer,
70
73
  setWorkerDefaultPointer,
71
74
  setWorkerProfilePointer,
75
+ targetApiKeyRef,
72
76
  type WireModelInventory,
73
77
  } from "./configure-target.js";
74
78
  import { createLifecyclePresenter, type LifecyclePresenter, shortenPath } from "./lifecycle-presenter.js";
@@ -99,6 +103,10 @@ type CredentialSource = "env" | "stored" | "keep" | "skip" | "oauth-connect" | "
99
103
  // with exactOptionalPropertyTypes, and going back a step clears the answers
100
104
  // that depended on the one being changed by assigning undefined to them.
101
105
  interface Answers {
106
+ mode: "first" | "add" | "edit";
107
+ fixedRuntime?: boolean;
108
+ existing?: TargetDescriptor | undefined;
109
+ contextWindow?: number | undefined;
102
110
  category?: ConfigureCategory | undefined;
103
111
  runtime?: RuntimeDescriptor | undefined;
104
112
  targetId?: string | undefined;
@@ -115,10 +123,9 @@ interface Answers {
115
123
  thinking?: ThinkingLevel | undefined;
116
124
  probe?: ProbeResult | null | undefined;
117
125
  antigravity?: { targetId: string; model: string } | undefined;
118
- wiredPeers?: string[] | undefined;
119
126
  }
120
127
 
121
- type StepOutcome = "next" | "back" | "quit";
128
+ type StepOutcome = "next" | "back" | "quit" | "cancel";
122
129
 
123
130
  interface Wizard {
124
131
  streams: OnboardingStreams;
@@ -181,19 +188,37 @@ function allEntries(): ProviderSupportEntry[] {
181
188
 
182
189
  /** The descriptor as it stands mid-wizard, for a probe or a model read. */
183
190
  function draftDescriptor(answers: Answers, runtime: RuntimeDescriptor, withModel: boolean): TargetDescriptor {
184
- const apiKeyRef = answers.credential === "stored" || answers.credential === "keep" ? runtime.id : undefined;
185
- return buildDescriptor(runtime, answers.targetId ?? runtime.id, {
191
+ const apiKeyRef =
192
+ answers.credential === "stored"
193
+ ? targetApiKeyRef(answers.targetId ?? runtime.id, readSettings().targets)
194
+ : answers.credential === "keep"
195
+ ? (answers.existing?.auth?.apiKeyRef ?? runtime.id)
196
+ : undefined;
197
+ const configured = buildDescriptor(runtime, answers.targetId ?? runtime.id, {
186
198
  ...(answers.url !== undefined ? { url: answers.url } : {}),
187
199
  ...(withModel && answers.model !== undefined ? { model: answers.model } : {}),
188
200
  ...(answers.apiKeyEnv !== undefined ? { apiKeyEnv: answers.apiKeyEnv } : {}),
189
201
  ...(apiKeyRef !== undefined ? { apiKeyRef } : {}),
190
- ...(runtime.auth === "oauth" ? { oauthProfile: runtime.oauthProviderId ?? runtime.id } : {}),
202
+ ...(runtime.auth === "oauth"
203
+ ? { oauthProfile: answers.existing?.auth?.oauthProfile ?? runtime.oauthProviderId ?? runtime.id }
204
+ : {}),
191
205
  });
206
+ const descriptor = { ...answers.existing, ...configured };
207
+ if (!withModel) delete descriptor.defaultModel;
208
+ if (answers.existing?.auth || configured.auth) {
209
+ descriptor.auth = { ...answers.existing?.auth, ...configured.auth };
210
+ if (runtime.auth === "api-key") {
211
+ if (answers.credential !== "env") delete descriptor.auth.apiKeyEnvVar;
212
+ if (answers.credential !== "stored" && answers.credential !== "keep") delete descriptor.auth.apiKeyRef;
213
+ }
214
+ if (Object.keys(descriptor.auth).length === 0) delete descriptor.auth;
215
+ }
216
+ return descriptor;
192
217
  }
193
218
 
194
219
  const CATEGORY_STEP: Step = {
195
220
  id: "category",
196
- applies: () => true,
221
+ applies: (answers) => answers.mode !== "edit" && !answers.fixedRuntime,
197
222
  run: async (wizard, answers) => {
198
223
  const current = CONFIGURE_CATEGORY_CHOICES.findIndex((choice) => choice.category === answers.category);
199
224
  const result = await promptSelect<ConfigureCategory>({
@@ -225,12 +250,12 @@ const CATEGORY_STEP: Step = {
225
250
 
226
251
  const RUNTIME_STEP: Step = {
227
252
  id: "runtime",
228
- applies: () => true,
253
+ applies: (answers) => answers.mode !== "edit" && !answers.fixedRuntime,
229
254
  run: async (wizard, answers) => {
230
255
  const registry = getRuntimeRegistry();
231
256
  const chatEntries = allEntries().filter((entry) => {
232
257
  const runtime = registry.get(entry.runtimeId);
233
- return runtime !== null && isOrchestratorEligibleRuntime(runtime);
258
+ return runtime !== null && (answers.mode !== "first" || isOrchestratorEligibleRuntime(runtime));
234
259
  });
235
260
  const entries = answers.category ? runtimesForCategory(chatEntries, answers.category) : chatEntries;
236
261
  const usable = entries.length > 0 ? entries : chatEntries;
@@ -258,6 +283,9 @@ const RUNTIME_STEP: Step = {
258
283
  answers.apiKeyEnv = undefined;
259
284
  answers.apiKeyLiteral = undefined;
260
285
  answers.model = undefined;
286
+ answers.thinking = undefined;
287
+ answers.contextWindow = undefined;
288
+ answers.probe = undefined;
261
289
  answers.inventory = undefined;
262
290
  answers.inventoryKey = undefined;
263
291
  }
@@ -269,7 +297,7 @@ const RUNTIME_STEP: Step = {
269
297
 
270
298
  const TARGET_ID_STEP: Step = {
271
299
  id: "target-id",
272
- applies: () => true,
300
+ applies: (answers) => answers.mode !== "edit",
273
301
  run: async (wizard, answers) => {
274
302
  const runtime = answers.runtime;
275
303
  if (!runtime) return "back";
@@ -283,6 +311,8 @@ const TARGET_ID_STEP: Step = {
283
311
  validate: (value) => {
284
312
  if (value.length === 0) return "a target id is required";
285
313
  if (/\s/u.test(value)) return "a target id cannot contain spaces";
314
+ if (readSettings().targets.some((target) => target.id === value))
315
+ return "that target id already exists; choose another or use Edit a target";
286
316
  return null;
287
317
  },
288
318
  input: wizard.input,
@@ -373,7 +403,7 @@ async function reportReachability(
373
403
 
374
404
  const DETECTED_RUNTIME_STEP: Step = {
375
405
  id: "detected-runtime",
376
- applies: (answers) => answers.detected !== undefined && answers.runtime !== undefined,
406
+ applies: (answers) => answers.mode !== "edit" && answers.detected !== undefined && answers.runtime !== undefined,
377
407
  run: async (wizard, answers) => {
378
408
  const detected = answers.detected;
379
409
  const runtime = answers.runtime;
@@ -443,10 +473,15 @@ const CREDENTIAL_STEP: Step = {
443
473
  run: async (wizard, answers) => {
444
474
  const runtime = answers.runtime;
445
475
  if (!runtime) return "back";
446
- const stored = describeAuthStatus(runtime);
476
+ const stored = describeAuthStatus(runtime, answers.existing);
447
477
  if (runtime.auth === "oauth") {
448
478
  const result = await promptSelect<CredentialSource>({
449
- heading: ["", chalk.bold(`Sign in to ${runtime.displayName}`), chalk.dim(`credential: ${stored}`)],
479
+ heading: [
480
+ "",
481
+ chalk.bold(`Sign in to ${runtime.displayName}`),
482
+ chalk.dim(`credential: ${stored}`),
483
+ "Sign-in stores credentials immediately; target settings wait for Save.",
484
+ ],
450
485
  choices: [
451
486
  { value: "oauth-connect", label: "Connect now", hint: "opens your browser and waits for the callback" },
452
487
  {
@@ -479,7 +514,7 @@ const CREDENTIAL_STEP: Step = {
479
514
  return "next";
480
515
  }
481
516
 
482
- const hasStored = stored !== "none stored";
517
+ const hasStored = answers.existing?.auth?.apiKeyRef !== undefined || stored !== "none stored";
483
518
  const choices = [
484
519
  {
485
520
  value: "env" as CredentialSource,
@@ -513,6 +548,7 @@ const CREDENTIAL_STEP: Step = {
513
548
  if (result.kind === "back") return "back";
514
549
  answers.credential = result.value;
515
550
  if (result.value !== "env") answers.apiKeyEnv = undefined;
551
+ answers.inventoryKey = undefined;
516
552
  if (result.value !== "stored") answers.apiKeyLiteral = undefined;
517
553
  if (result.value === "keep") wizard.answer("Credential", stored);
518
554
  if (result.value === "skip") wizard.answer("Credential", "none");
@@ -534,6 +570,10 @@ const CREDENTIAL_VALUE_STEP: Step = {
534
570
  ? "Clio reads it every time it calls the provider, so the key never lands on disk"
535
571
  : `stored at ${shortenPath(authStoragePath())}`,
536
572
  ...(wantsEnv ? {} : { mask: true }),
573
+ validate: (value) =>
574
+ value.length > 0
575
+ ? null
576
+ : `Enter ${wantsEnv ? "an environment variable" : "a key"}, or press Escape to choose No key.`,
537
577
  railPrefix: wizard.rail,
538
578
  backLabel: "back",
539
579
  clearOnExit: true,
@@ -670,7 +710,7 @@ const MODEL_STEP: Step = {
670
710
  */
671
711
  async function readModelCapabilities(answers: Answers, runtime: RuntimeDescriptor): Promise<void> {
672
712
  const descriptor = draftDescriptor(answers, runtime, true);
673
- const probe = await runtimeProbe(runtime, descriptor);
713
+ const probe = await runtimeProbe(runtime, descriptor, answers.apiKeyLiteral);
674
714
  answers.probe = probe;
675
715
  if (probe?.ok && probe.models) {
676
716
  recordTargetModelSnapshot(descriptor, probe.models, probe.modelLabels ? { modelLabels: probe.modelLabels } : {});
@@ -690,6 +730,7 @@ const THINKING_HINTS: Readonly<Record<ThinkingLevel, string>> = {
690
730
  const THINKING_STEP: Step = {
691
731
  id: "thinking",
692
732
  applies: (answers) => {
733
+ if (answers.mode !== "first" && !PROTOCOL_COMPAT_RUNTIME_IDS.has(answers.runtime?.id ?? "")) return false;
693
734
  const runtime = answers.runtime;
694
735
  if (!runtime || answers.model === undefined) return false;
695
736
  // A generic OpenAI/Anthropic-compatible endpoint reports nothing about
@@ -701,7 +742,15 @@ const THINKING_STEP: Step = {
701
742
  run: async (wizard, answers) => {
702
743
  const current = THINKING_LEVELS.indexOf(answers.thinking ?? "low");
703
744
  const result = await promptSelect<ThinkingLevel>({
704
- heading: ["", chalk.bold("How hard should it think?"), chalk.dim("changeable any time in `clio-coder configure`")],
745
+ heading: [
746
+ "",
747
+ chalk.bold("How hard should it think?"),
748
+ chalk.dim(
749
+ answers.mode === "first"
750
+ ? "changeable any time in `clio-coder configure`"
751
+ : "off disables reasoning for this target; chat and fleet thinking defaults stay unchanged",
752
+ ),
753
+ ],
705
754
  choices: THINKING_LEVELS.map((level) => ({ value: level, label: level, hint: THINKING_HINTS[level] })),
706
755
  initialIndex: current >= 0 ? current : 0,
707
756
  railPrefix: wizard.rail,
@@ -721,6 +770,7 @@ const THINKING_STEP: Step = {
721
770
  const ANTIGRAVITY_COLLEAGUE_STEP: Step = {
722
771
  id: "antigravity-colleague",
723
772
  applies: (answers) =>
773
+ answers.mode === "first" &&
724
774
  answers.runtime !== undefined &&
725
775
  isOrchestratorEligibleRuntime(answers.runtime) &&
726
776
  resolveOnPath(["agy"]).presence === "present" &&
@@ -785,25 +835,61 @@ const ANTIGRAVITY_COLLEAGUE_STEP: Step = {
785
835
  },
786
836
  };
787
837
 
788
- const PEERS_STEP: Step = {
789
- id: "peers",
790
- applies: () => true,
838
+ const CONTEXT_STEP: Step = {
839
+ id: "context-window",
840
+ applies: (answers) => PROTOCOL_COMPAT_RUNTIME_IDS.has(answers.runtime?.id ?? "") || answers.mode === "edit",
791
841
  run: async (wizard, answers) => {
792
- // No readline: the multi-select reads keys directly, and an interface left
793
- // open would echo them over the frame it is drawing.
794
- const outcome = await reviewInteropAgents({
795
- rl: null,
796
- streams: wizard.streams,
797
- presenter: wizard.presenter,
798
- rail: wizard.rail,
799
- quiet: true,
842
+ const result = await promptText({
843
+ heading: ["", chalk.bold("Context window in tokens")],
844
+ initial: answers.contextWindow === undefined ? "" : String(answers.contextWindow),
845
+ hint: "optional override; blank uses detected capabilities or the runtime default",
846
+ validate: (value) =>
847
+ value === "" || (Number.isSafeInteger(Number(value)) && Number(value) > 0)
848
+ ? null
849
+ : "enter a positive whole number, or leave blank",
850
+ railPrefix: wizard.rail,
851
+ backLabel: "back",
852
+ clearOnExit: true,
853
+ input: wizard.input,
854
+ output: wizard.output,
800
855
  });
801
- if (outcome.back) return "back";
802
- answers.wiredPeers = outcome.wired;
856
+ if (result.kind !== "value") return result.kind;
857
+ answers.contextWindow = result.value ? Number(result.value) : undefined;
858
+ wizard.answer("Context", result.value || "detected / runtime default");
803
859
  return "next";
804
860
  },
805
861
  };
806
862
 
863
+ const REVIEW_STEP: Step = {
864
+ id: "review",
865
+ applies: () => true,
866
+ run: async (wizard, answers) => {
867
+ const result = await promptSelect({
868
+ heading: [
869
+ "",
870
+ chalk.bold("Review target"),
871
+ `${answers.targetId} · ${answers.runtime?.id} · ${answers.model}`,
872
+ answers.mode === "first"
873
+ ? "Use for chat and fleet."
874
+ : "Existing chat, fleet, memory, and profile defaults stay in place.",
875
+ "Escape returns to the previous step; settings are saved only when you choose Save.",
876
+ ],
877
+ choices: [
878
+ { value: "save", label: "Save target" },
879
+ { value: "back", label: "Back" },
880
+ { value: "cancel", label: "Cancel setup" },
881
+ ],
882
+ railPrefix: wizard.rail,
883
+ backLabel: "back",
884
+ clearOnExit: true,
885
+ input: wizard.input,
886
+ output: wizard.output,
887
+ });
888
+ if (result.kind !== "selected") return result.kind;
889
+ return result.value === "save" ? "next" : result.value === "back" ? "back" : "cancel";
890
+ },
891
+ };
892
+
807
893
  // Credential steps come before the URL step: a runtime that needs or may need a
808
894
  // key (litellm, every cloud runtime, keyed openai-compat) has to have one in
809
895
  // hand before the URL step probes reachability, or the probe reads as
@@ -820,37 +906,51 @@ const STEPS: ReadonlyArray<Step> = [
820
906
  DETECTED_RUNTIME_STEP,
821
907
  MODEL_STEP,
822
908
  THINKING_STEP,
909
+ CONTEXT_STEP,
823
910
  ANTIGRAVITY_COLLEAGUE_STEP,
824
- PEERS_STEP,
911
+ REVIEW_STEP,
825
912
  ];
826
913
 
827
914
  /** Write everything the wizard collected, in one settings update. */
828
- function persist(answers: Answers, descriptor: TargetDescriptor, chatEligible: boolean): void {
829
- updateSettings((settings: ClioSettings): void => {
830
- applyTarget(settings, descriptor);
831
- // The first target is the one everything points at. A second target is a
832
- // choice, and that is what the settings menu is for; asking a new user
833
- // which of their one target should answer chat is not a question.
834
- if (chatEligible) setOrchestratorPointer(settings, descriptor, answers.model ?? null);
835
- setWorkerDefaultPointer(settings, descriptor, answers.model ?? null);
836
- if (answers.thinking !== undefined) {
837
- settings.chat.thinkingLevel = answers.thinking;
838
- settings.fleet.default.thinkingLevel = answers.thinking;
839
- }
840
- if (answers.antigravity !== undefined) {
841
- const antigravityRuntime = getRuntimeRegistry().get("antigravity-code");
842
- if (!antigravityRuntime) throw new Error("Antigravity runtime disappeared before settings were written");
843
- const external = buildDescriptor(antigravityRuntime, answers.antigravity.targetId, {
844
- model: answers.antigravity.model,
845
- });
846
- applyTarget(settings, external);
847
- setWorkerProfilePointer(settings, "world-knowledge-external", external, answers.antigravity.model);
848
- bindAgentProfileInSettings(settings, "world-knowledge", "world-knowledge-external");
849
- }
850
- });
915
+ function applyAnswers(
916
+ settings: ClioSettings,
917
+ answers: Answers,
918
+ descriptor: TargetDescriptor,
919
+ chatEligible: boolean,
920
+ ): void {
921
+ const current = settings.targets.find((target) => target.id === descriptor.id);
922
+ if (answers.mode === "edit") {
923
+ if (JSON.stringify(current) !== JSON.stringify(answers.existing))
924
+ throw new Error("This target changed during setup; reopen Edit to keep those changes.");
925
+ } else if (current) throw new Error(`Target '${descriptor.id}' already exists; use Edit a target.`);
926
+ applyTarget(settings, descriptor);
927
+ // The first target is the one everything points at. A second target is a
928
+ // choice, and that is what the settings menu is for; asking a new user
929
+ // which of their one target should answer chat is not a question.
930
+ if (answers.mode === "first" && chatEligible) setOrchestratorPointer(settings, descriptor, answers.model ?? null);
931
+ if (answers.mode === "first") setWorkerDefaultPointer(settings, descriptor, answers.model ?? null);
932
+ if (answers.mode === "first" && answers.thinking !== undefined) {
933
+ settings.chat.thinkingLevel = answers.thinking;
934
+ settings.fleet.default.thinkingLevel = answers.thinking;
935
+ }
936
+ if (answers.antigravity !== undefined) {
937
+ const antigravityRuntime = getRuntimeRegistry().get("antigravity-code");
938
+ if (!antigravityRuntime) throw new Error("Antigravity runtime disappeared before settings were written");
939
+ const external = buildDescriptor(antigravityRuntime, answers.antigravity.targetId, {
940
+ model: answers.antigravity.model,
941
+ });
942
+ applyTarget(settings, external);
943
+ setWorkerProfilePointer(settings, "world-knowledge-external", external, answers.antigravity.model);
944
+ bindAgentProfileInSettings(settings, "world-knowledge", "world-knowledge-external");
945
+ }
851
946
  }
852
947
 
853
- export async function runOnboardingWizard(streams: OnboardingStreams): Promise<number> {
948
+ export async function runOnboardingWizard(
949
+ streams: OnboardingStreams,
950
+ options: { mode: "first" | "add"; runtime?: RuntimeDescriptor } | { mode: "edit"; target: TargetDescriptor } = {
951
+ mode: "first",
952
+ },
953
+ ): Promise<number> {
854
954
  const writer = railWriter(streams.out);
855
955
  const presenter = createLifecyclePresenter({ stream: writer.stream });
856
956
  const rail = railPrefix(presenter.isPlain());
@@ -866,11 +966,39 @@ export async function runOnboardingWizard(streams: OnboardingStreams): Promise<n
866
966
  },
867
967
  };
868
968
 
869
- presenter.header("Welcome to Clio Coder", "configure");
870
- presenter.note("Pick the model you want Clio to talk to; escape goes back a step and changes nothing.");
969
+ presenter.header(
970
+ options.mode === "edit"
971
+ ? `Edit target: ${options.target.id}`
972
+ : options.mode === "first"
973
+ ? "Welcome to Clio Coder"
974
+ : "Add a target",
975
+ "configure",
976
+ );
977
+ presenter.note("Pick a model; escape goes back. Review and save when ready.");
871
978
  presenter.note(`Result: ${shortenPath(settingsPath())}`);
872
979
 
873
- const answers: Answers = {};
980
+ const existing = options.mode === "edit" ? options.target : undefined;
981
+ const answers: Answers = {
982
+ mode: options.mode,
983
+ existing,
984
+ runtime: existing
985
+ ? (getRuntimeRegistry().get(existing.runtime) ?? undefined)
986
+ : options.mode !== "edit"
987
+ ? options.runtime
988
+ : undefined,
989
+ fixedRuntime: options.mode !== "edit" && options.runtime !== undefined,
990
+ targetId: existing?.id,
991
+ url: existing?.url,
992
+ model: existing?.defaultModel,
993
+ credential: existing?.auth?.apiKeyEnvVar ? "env" : existing?.auth?.apiKeyRef ? "keep" : undefined,
994
+ apiKeyEnv: existing?.auth?.apiKeyEnvVar,
995
+ contextWindow: existing?.capabilities?.contextWindow,
996
+ thinking: existing?.capabilities?.reasoning === false ? "off" : undefined,
997
+ };
998
+ if (existing && !answers.runtime) {
999
+ presenter.fail(`Unknown runtime: ${existing.runtime}`);
1000
+ return 2;
1001
+ }
874
1002
  const marks = new Array<number>(STEPS.length).fill(writer.mark());
875
1003
  let cursor = 0;
876
1004
  let direction = 1;
@@ -880,19 +1008,19 @@ export async function runOnboardingWizard(streams: OnboardingStreams): Promise<n
880
1008
  if (step === undefined) break;
881
1009
  if (!step.applies(answers)) {
882
1010
  cursor += direction;
883
- if (cursor < 0) return cancel(presenter);
1011
+ if (cursor < 0) return cancel(presenter, answers);
884
1012
  continue;
885
1013
  }
886
1014
  marks[cursor] = writer.mark();
887
1015
  const outcome = await step.run(wizard, answers);
888
- if (outcome === "quit") return cancel(presenter);
1016
+ if (outcome === "quit" || outcome === "cancel") return cancel(presenter, answers, outcome === "quit");
889
1017
  if (outcome === "back") {
890
1018
  direction = -1;
891
1019
  cursor -= 1;
892
1020
  // Rewind past the row the step we are returning to left behind, so it
893
1021
  // can ask again in the same place rather than under its own answer.
894
1022
  while (cursor >= 0 && !(STEPS[cursor]?.applies(answers) ?? false)) cursor -= 1;
895
- if (cursor < 0) return cancel(presenter);
1023
+ if (cursor < 0) return cancel(presenter, answers);
896
1024
  writer.rewindTo(marks[cursor] ?? writer.mark());
897
1025
  continue;
898
1026
  }
@@ -900,66 +1028,74 @@ export async function runOnboardingWizard(streams: OnboardingStreams): Promise<n
900
1028
  cursor += 1;
901
1029
  }
902
1030
 
903
- return finish(wizard, answers);
1031
+ const code = finish(wizard, answers);
1032
+ if (code === 0 && answers.mode === "first") {
1033
+ await reviewInteropAgents({ rl: null, streams, presenter, rail, quiet: true });
1034
+ }
1035
+ return code;
904
1036
  }
905
1037
 
906
- function cancel(presenter: LifecyclePresenter): number {
1038
+ function cancel(presenter: LifecyclePresenter, answers: Answers, quit = false): number {
907
1039
  // A first-run cancel really does leave Clio unconfigured, which is why this
908
1040
  // exits 130 where leaving the settings menu exits 0.
909
- presenter.done("Cancelled, nothing written");
910
- printError("configuration cancelled");
911
- return 130;
1041
+ presenter.done("Cancelled; target settings not saved");
1042
+ if (answers.mode === "first") printError("configuration cancelled");
1043
+ return answers.mode === "first" || quit ? 130 : 0;
912
1044
  }
913
1045
 
914
1046
  function finish(wizard: Wizard, answers: Answers): number {
915
1047
  const runtime = answers.runtime;
916
1048
  const targetId = answers.targetId;
917
- if (!runtime || targetId === undefined) return cancel(wizard.presenter);
1049
+ if (!runtime || targetId === undefined) return cancel(wizard.presenter, answers);
918
1050
  const presenter = wizard.presenter;
919
1051
 
920
- if (answers.apiKeyLiteral !== undefined) {
921
- const auth = openAuthStorage();
922
- auth.setApiKey(runtime.id, answers.apiKeyLiteral);
923
- // The settings write is still ahead of us, so refusing here leaves the
924
- // whole run without an effect rather than half of one.
925
- if (credentialWriteFailed(auth, `credential for ${runtime.id} was not stored; target '${targetId}' not saved`)) {
926
- presenter.done("Nothing written");
927
- return 1;
928
- }
929
- printPlaintextCredentialWarning();
930
- }
931
-
932
1052
  const reasoning =
933
1053
  PROTOCOL_COMPAT_RUNTIME_IDS.has(runtime.id) && answers.thinking !== undefined
934
1054
  ? answers.thinking !== "off"
935
1055
  : undefined;
936
- const descriptor = buildDescriptor(runtime, targetId, {
937
- ...(answers.url !== undefined ? { url: answers.url } : {}),
938
- ...(answers.model !== undefined ? { model: answers.model } : {}),
939
- ...(answers.apiKeyEnv !== undefined ? { apiKeyEnv: answers.apiKeyEnv } : {}),
940
- ...(answers.credential === "stored" || answers.credential === "keep" ? { apiKeyRef: runtime.id } : {}),
941
- ...(runtime.auth === "oauth" ? { oauthProfile: runtime.oauthProviderId ?? runtime.id } : {}),
942
- ...(reasoning === undefined ? {} : { reasoning }),
943
- });
1056
+ const descriptor = draftDescriptor(answers, runtime, true);
1057
+ descriptor.capabilities = { ...descriptor.capabilities };
1058
+ if (reasoning !== undefined) descriptor.capabilities.reasoning = reasoning;
1059
+ // Clearing the field removes only that capability override.
1060
+ if (answers.contextWindow === undefined) delete descriptor.capabilities.contextWindow;
1061
+ else descriptor.capabilities.contextWindow = answers.contextWindow;
944
1062
  const chatEligible = isOrchestratorEligibleRuntime(runtime);
945
1063
 
946
1064
  try {
947
- persist(answers, descriptor, chatEligible);
1065
+ const preview = readSettings();
1066
+ applyAnswers(preview, answers, descriptor, chatEligible);
1067
+ const validated = validateSettings(preview);
1068
+ if (validated.issues.length) throw new SettingsValidationError(validated.issues);
1069
+ initializeClioHome();
1070
+
1071
+ if (answers.apiKeyLiteral !== undefined && descriptor.auth?.apiKeyRef) {
1072
+ const auth = openAuthStorage();
1073
+ auth.setApiKey(descriptor.auth.apiKeyRef, answers.apiKeyLiteral);
1074
+ // The settings write is still ahead of us, so refusing here leaves the
1075
+ // whole run without an effect rather than half of one.
1076
+ if (credentialWriteFailed(auth, `credential for ${runtime.id} was not stored; target '${targetId}' not saved`)) {
1077
+ presenter.done("Nothing written");
1078
+ return 1;
1079
+ }
1080
+ printPlaintextCredentialWarning();
1081
+ }
1082
+
1083
+ updateSettings((settings) => applyAnswers(settings, answers, descriptor, chatEligible));
948
1084
  } catch (error) {
949
1085
  presenter.fail("settings were not written", error instanceof Error ? error.message : String(error));
950
- presenter.done("Nothing written");
1086
+ presenter.done("Target settings not saved");
951
1087
  return 1;
952
1088
  }
953
1089
 
954
1090
  presenter.completedStep(`target ${targetId} saved, runtime ${runtime.id}`);
955
- if (chatEligible)
1091
+ if (answers.mode === "first" && chatEligible)
956
1092
  presenter.completedStep(`chat runs on ${targetId}${answers.model ? `, model ${answers.model}` : ""}`);
957
- else presenter.completedStep(`${runtime.id} cannot answer chat; ${targetId} is registered for dispatch only`);
958
- presenter.completedStep(`fleet default is ${targetId}`);
959
- if (answers.thinking !== undefined) presenter.completedStep(`thinking level ${answers.thinking}`);
960
- for (const peer of answers.wiredPeers ?? []) {
961
- presenter.completedStep(`delegation agent ${peer} added; use \`/delegate ${peer} <task>\``);
962
- }
1093
+ else if (!chatEligible)
1094
+ presenter.completedStep(`${runtime.id} cannot answer chat; ${targetId} is registered for dispatch only`);
1095
+ if (answers.mode === "first") presenter.completedStep(`fleet default is ${targetId}`);
1096
+ else presenter.note("Use Targets & Auth to change chat, fleet, or background defaults.");
1097
+ if (answers.mode === "first" && answers.thinking !== undefined)
1098
+ presenter.completedStep(`thinking level ${answers.thinking}`);
963
1099
  if (answers.antigravity !== undefined) {
964
1100
  presenter.completedStep(
965
1101
  `world-knowledge bound read-only to ${answers.antigravity.targetId}/${answers.antigravity.model}`,
@@ -0,0 +1,76 @@
1
+ import { createInterface, type Interface } from "node:readline/promises";
2
+ import { railPrefix } from "./configure-target.js";
3
+ import { createLifecyclePresenter } from "./lifecycle-presenter.js";
4
+ import { canSelect, promptSelect, promptText } from "./select.js";
5
+
6
+ export class ConfigureNavigation extends Error {
7
+ constructor(readonly kind: "back" | "quit") {
8
+ super(kind);
9
+ }
10
+ }
11
+
12
+ /** Own stdin only while a question is active. Menus and editors own it otherwise. */
13
+ export class ConfigurePrompts {
14
+ constructor(
15
+ readonly input: NodeJS.ReadableStream,
16
+ readonly output: NodeJS.WritableStream,
17
+ ) {}
18
+
19
+ get interactive(): boolean {
20
+ return canSelect(this.input as NodeJS.ReadStream, this.output as NodeJS.WriteStream);
21
+ }
22
+
23
+ clearScreen(): void {
24
+ if (this.interactive) this.output.write("\x1b[H\x1b[2J");
25
+ }
26
+
27
+ async question(query: string, options?: Parameters<Interface["question"]>[1]): Promise<string> {
28
+ const rl = createInterface({ input: this.input, output: this.output });
29
+ try {
30
+ return await new Promise<string>((resolve, reject) => {
31
+ rl.once("close", () => reject(new ConfigureNavigation("quit")));
32
+ rl.once("SIGINT", () => reject(new ConfigureNavigation("quit")));
33
+ rl.question(query, options ?? {}).then(resolve, reject);
34
+ });
35
+ } finally {
36
+ rl.close();
37
+ }
38
+ }
39
+
40
+ async text(label: string, initial = "", mask = false): Promise<string> {
41
+ if (!this.interactive) {
42
+ const value = (await this.question(`${label}${initial ? ` [${initial}]` : ""}: `)).trim();
43
+ if (/^(q|quit)$/iu.test(value)) throw new ConfigureNavigation("quit");
44
+ return value || initial;
45
+ }
46
+ const result = await promptText({
47
+ heading: ["", label],
48
+ railPrefix: railPrefix(createLifecyclePresenter({ stream: this.output }).isPlain()),
49
+ initial,
50
+ mask,
51
+ backLabel: "back",
52
+ clearOnExit: true,
53
+ input: this.input as NodeJS.ReadStream,
54
+ output: this.output as NodeJS.WriteStream,
55
+ });
56
+ if (result.kind !== "value") throw new ConfigureNavigation(result.kind);
57
+ return result.value;
58
+ }
59
+
60
+ async choose(label: string, choices: ReadonlyArray<string>, current: string, searchable = false): Promise<string> {
61
+ if (!this.interactive) return this.text(`${label} [${choices.join("|")}]`, current);
62
+ const result = await promptSelect({
63
+ heading: ["", label],
64
+ railPrefix: railPrefix(createLifecyclePresenter({ stream: this.output }).isPlain()),
65
+ choices: choices.map((value) => ({ value, label: value })),
66
+ initialIndex: Math.max(0, choices.indexOf(current)),
67
+ ...(searchable ? { searchable: true, maxVisible: 8 } : {}),
68
+ backLabel: "back",
69
+ clearOnExit: true,
70
+ input: this.input as NodeJS.ReadStream,
71
+ output: this.output as NodeJS.WriteStream,
72
+ });
73
+ if (result.kind !== "selected") throw new ConfigureNavigation(result.kind);
74
+ return result.value;
75
+ }
76
+ }