@iowarp/clio-coder 0.4.0 → 0.4.1

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 (581) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +116 -16
  3. package/dist/{acp-G5WJBNCT.js → acp-ZILU3AUO.js} +14 -14
  4. package/dist/{agents-FMV2Q5G4.js → agents-HYWGBGQR.js} +40 -29
  5. package/dist/assets/codewiki.json +1 -1
  6. package/dist/{auth-3IDSJEIK.js → auth-N3QT7CBO.js} +21 -19
  7. package/dist/{builtins-XCZWXSC7.js → builtins-UJLMOVOV.js} +6 -6
  8. package/dist/{chunk-PQEFIJ36.js → chunk-2LEAKD4C.js} +1 -2
  9. package/dist/{chunk-3BT2XMV4.js → chunk-2NM363SV.js} +50 -57
  10. package/dist/{chunk-J4W7KFM7.js → chunk-2VG7KLYV.js} +24 -279
  11. package/dist/{chunk-SST6Z5JA.js → chunk-336NSSKI.js} +1 -1
  12. package/dist/{chunk-K5C3NCBD.js → chunk-3I5NY75V.js} +5 -5
  13. package/dist/{chunk-VAZSBTKF.js → chunk-3QSOM6PA.js} +2 -2
  14. package/dist/{chunk-TZ3SGWZZ.js → chunk-5QIAJV2D.js} +2 -2
  15. package/dist/{chunk-OQBA45DZ.js → chunk-5YHDIDBP.js} +2 -2
  16. package/dist/{chunk-NHLBIGRH.js → chunk-6CCS4G3W.js} +40 -17
  17. package/dist/{chunk-2JDWVJND.js → chunk-6DWBAZ5U.js} +2 -2
  18. package/dist/{chunk-LDQ2ZF2M.js → chunk-6FN3E6KX.js} +5 -5
  19. package/dist/{chunk-X3YGUTOB.js → chunk-6HMJX2VU.js} +59 -59
  20. package/dist/{chunk-VEO4AP2K.js → chunk-6I5ILFOF.js} +3 -2
  21. package/dist/{chunk-B7OBL7PK.js → chunk-6NJQITNH.js} +18 -11
  22. package/dist/{chunk-IQ7KR472.js → chunk-6VC4OV3Z.js} +6 -3
  23. package/dist/{chunk-P3FOHJT4.js → chunk-72GZI5EV.js} +2 -2
  24. package/dist/{chunk-AB44T6BB.js → chunk-74YWRRU5.js} +8 -7
  25. package/dist/{chunk-SJ5ZKQ4S.js → chunk-7EPLI7VL.js} +2 -2
  26. package/dist/{chunk-HWHKMHUA.js → chunk-7OBGU7UB.js} +3 -3
  27. package/dist/{chunk-2OQE55CK.js → chunk-7PWAODYW.js} +2 -2
  28. package/dist/{chunk-IBEBSCYA.js → chunk-7RY5VZPH.js} +42 -33
  29. package/dist/{chunk-LQ3DZAMX.js → chunk-ABLSQ6JX.js} +2 -2
  30. package/dist/{chunk-QLFS5GO2.js → chunk-AFKWHWXF.js} +12 -22
  31. package/dist/{chunk-FWDFM5ZU.js → chunk-AK5XEFVZ.js} +3 -3
  32. package/dist/{chunk-O6TL7WWY.js → chunk-AKB4GYDL.js} +4 -4
  33. package/dist/chunk-AP73CFDC.js +308 -0
  34. package/dist/{chunk-JDG2WCRO.js → chunk-BBTJOK6Y.js} +5 -5
  35. package/dist/{chunk-SP2RXXYO.js → chunk-BDPT6GTK.js} +10 -10
  36. package/dist/{chunk-NQQH3YT7.js → chunk-BJGUKIG4.js} +3 -3
  37. package/dist/{chunk-O4XIVISU.js → chunk-BTGG6BG2.js} +79 -38
  38. package/dist/chunk-BTK3SSSK.js +67 -0
  39. package/dist/{chunk-M6L6IDJG.js → chunk-BWH6N36D.js} +1 -1
  40. package/dist/chunk-BWW4HLO4.js +301 -0
  41. package/dist/{chunk-I5VEOC6I.js → chunk-C537JADH.js} +10 -10
  42. package/dist/{chunk-HI63TFOG.js → chunk-CDNVLKUX.js} +3 -3
  43. package/dist/{chunk-UM7N4G5A.js → chunk-CWVRRIEI.js} +2 -2
  44. package/dist/{chunk-BKFM6EJV.js → chunk-D4CJV46V.js} +2 -2
  45. package/dist/chunk-D7E7WCDF.js +27 -0
  46. package/dist/{chunk-WZR7K7ZX.js → chunk-E67WX76H.js} +6 -6
  47. package/dist/{chunk-FQ4SKYE4.js → chunk-EBY63B7G.js} +2 -5
  48. package/dist/chunk-EIMVLWB3.js +1842 -0
  49. package/dist/{chunk-RAPCMZL4.js → chunk-FSP7CMNU.js} +9 -1
  50. package/dist/{chunk-MLKNTWH2.js → chunk-FYUN5KZ3.js} +21 -21
  51. package/dist/{chunk-YJX4SHTD.js → chunk-GIZNH63R.js} +1 -1
  52. package/dist/{chunk-X75E3D2N.js → chunk-GPPB3JBE.js} +18 -16
  53. package/dist/{chunk-GR5G2PVF.js → chunk-GVQJ5CCZ.js} +15 -10
  54. package/dist/chunk-HJWWJ6IL.js +184 -0
  55. package/dist/{chunk-VO67MWHC.js → chunk-HRQMFLJP.js} +3 -3
  56. package/dist/{chunk-VYMXRQI6.js → chunk-HUAS7ITX.js} +89 -93
  57. package/dist/{chunk-BKFJHQCA.js → chunk-I66EAJFY.js} +2 -2
  58. package/dist/{chunk-DYJP44XW.js → chunk-IG7BCQBA.js} +1 -1
  59. package/dist/{chunk-32KWKNSF.js → chunk-IXJT6DCX.js} +3 -3
  60. package/dist/{chunk-C2LTL2W6.js → chunk-J4HBWF6Y.js} +360 -172
  61. package/dist/chunk-J5LZHVIT.js +284 -0
  62. package/dist/{chunk-QLL7ILRG.js → chunk-JA5QWE4Z.js} +510 -202
  63. package/dist/{chunk-BBVJUZHB.js → chunk-JIEGK6UF.js} +5 -173
  64. package/dist/{chunk-36EJLSQQ.js → chunk-JZWT5J3Y.js} +4 -4
  65. package/dist/{chunk-HZHHCK24.js → chunk-K6BF4U2H.js} +476 -322
  66. package/dist/{chunk-Z2RR6MAK.js → chunk-MA3H6DM5.js} +6 -6
  67. package/dist/{chunk-CODPRO7Q.js → chunk-MOPSG2X7.js} +6 -6
  68. package/dist/{chunk-76ONBSIA.js → chunk-MQXIVJ35.js} +14 -5
  69. package/dist/{chunk-YDFRH54B.js → chunk-N5UK64DP.js} +4 -4
  70. package/dist/chunk-NDDGJUXD.js +81 -0
  71. package/dist/{chunk-4ZG3XFUR.js → chunk-NLFAQR7Z.js} +12 -1
  72. package/dist/{chunk-VO2LKSTM.js → chunk-O42A54GG.js} +2 -2
  73. package/dist/{chunk-W5VSYASO.js → chunk-OJTRZGR3.js} +46 -87
  74. package/dist/{chunk-NHCZP4K7.js → chunk-PBP4B7XR.js} +2 -2
  75. package/dist/{chunk-3URVFKWK.js → chunk-PJJ6MY27.js} +5 -5
  76. package/dist/{chunk-ZGVHUX3M.js → chunk-PMZVFWSR.js} +2 -2
  77. package/dist/{chunk-GKF55TAZ.js → chunk-PVAMAVBB.js} +3 -2
  78. package/dist/{chunk-6DB53AJS.js → chunk-QKIFBZKT.js} +7 -7
  79. package/dist/{chunk-HJJTYUHX.js → chunk-QMXC4JB7.js} +20 -20
  80. package/dist/chunk-QTFGO774.js +644 -0
  81. package/dist/{chunk-CY6FY24N.js → chunk-R23Z6K6I.js} +2 -2
  82. package/dist/{chunk-ULC6OTWO.js → chunk-R32CLGZ6.js} +13 -13
  83. package/dist/{chunk-KMVISBZR.js → chunk-RKSR6VSF.js} +1 -1
  84. package/dist/{chunk-F4CKPOEQ.js → chunk-SCYB3HA4.js} +72 -26
  85. package/dist/{chunk-LY4S7GJC.js → chunk-SINK3QR6.js} +18 -16
  86. package/dist/{chunk-U77AMWDL.js → chunk-TD3PGPQA.js} +43 -22
  87. package/dist/{chunk-QBJA7R7N.js → chunk-THYWACCR.js} +2 -2
  88. package/dist/{chunk-QREDIESB.js → chunk-TVH4ONAM.js} +14 -8
  89. package/dist/chunk-U2WB7TZS.js +271 -0
  90. package/dist/{chunk-KFZI4NIL.js → chunk-UAPGZHYC.js} +145 -31
  91. package/dist/{chunk-DQITNCXG.js → chunk-UEDMSP56.js} +29 -14
  92. package/dist/{chunk-3XML7CDN.js → chunk-UXN6JT4W.js} +2 -2
  93. package/dist/{chunk-CMZWFGD2.js → chunk-VAVR4IJY.js} +19 -15
  94. package/dist/{chunk-BPKCPIL7.js → chunk-VEGN6WIQ.js} +2 -2
  95. package/dist/chunk-VKFQTNDV.js +66 -0
  96. package/dist/{chunk-7MCTRUCE.js → chunk-VKRH2TCS.js} +2 -2
  97. package/dist/{chunk-5LXZXPKX.js → chunk-VN3SHNBN.js} +2 -2
  98. package/dist/{chunk-UOSL25KY.js → chunk-VXMFAE2W.js} +1 -1
  99. package/dist/{chunk-BBVYXMFO.js → chunk-WNP7O5WZ.js} +2 -2
  100. package/dist/{chunk-SUCTJL45.js → chunk-WR6U3OVP.js} +3 -3
  101. package/dist/{chunk-BUMFYQFY.js → chunk-XKA2ICR3.js} +124 -113
  102. package/dist/{chunk-UXMFQ54G.js → chunk-Y45G3AXC.js} +39 -39
  103. package/dist/{chunk-J5Q24KAG.js → chunk-Y4CAGMM6.js} +2 -2
  104. package/dist/{chunk-NYS75XW5.js → chunk-YAKGTXEV.js} +5 -3
  105. package/dist/{chunk-V5DHCITQ.js → chunk-ZAZB4JMW.js} +23 -12
  106. package/dist/{chunk-Z4TXYIEG.js → chunk-ZJLUDYFY.js} +9 -9
  107. package/dist/{chunk-HKIYEGME.js → chunk-ZTJUVLTU.js} +2 -2
  108. package/dist/{chunk-2ANTL7MR.js → chunk-ZW55JB7N.js} +2 -2
  109. package/dist/cli/index.js +36 -36
  110. package/dist/{clio-2JXHBBY5.js → clio-IT3G3VQH.js} +12 -13
  111. package/dist/{code-nav-3YYRMYNF.js → code-nav-RK6S7F6E.js} +5 -5
  112. package/dist/codewiki/build-worker.js +1 -1
  113. package/dist/{compile-cache-7FPE6PS3.js → compile-cache-OQAVB7Y5.js} +2 -4
  114. package/dist/{components-RYZV4JGP.js → components-UBWCQSRW.js} +4 -4
  115. package/dist/{config-QZPCMYSO.js → config-3QZRWZJF.js} +53 -49
  116. package/dist/{configure-TEGEBYCA.js → configure-FL7Y3KJF.js} +25 -22
  117. package/dist/{context-E6H5RNMC.js → context-5HE7ODYK.js} +47 -43
  118. package/dist/{context-AV7OEZ4D.js → context-KYQFRVDC.js} +11 -11
  119. package/dist/{context-GSXUE4CT.js → context-XNHL75JV.js} +32 -19
  120. package/dist/{context-clear-SHIBYK6T.js → context-clear-N545L53A.js} +47 -43
  121. package/dist/{context-working-set-5ZGKPGZQ.js → context-working-set-QHKXSV2F.js} +10 -9
  122. package/dist/{dispatch-runner-EFMJT4LD.js → dispatch-runner-RGIE5PCT.js} +56 -47
  123. package/dist/{docs-23KQS3XK.js → docs-5NAF6AU7.js} +5 -11
  124. package/dist/doctor-ZGPEGHIP.js +772 -0
  125. package/dist/{eval-TFBYQH4H.js → eval-GXLL44RD.js} +63 -45
  126. package/dist/{eval-inventory-SXH7PDKX.js → eval-inventory-HBWSWQOK.js} +7 -8
  127. package/dist/{evidence-ERGESKGN.js → evidence-HWLBRH3Q.js} +44 -40
  128. package/dist/{evolve-VDXTSYCJ.js → evolve-FTZBMNVW.js} +43 -39
  129. package/dist/{extensions-7BGBHN57.js → extensions-VHRBEID7.js} +4 -4
  130. package/dist/{fleet-2RRVDF2V.js → fleet-CKZHJWZJ.js} +86 -73
  131. package/dist/{fleet-commands-VJ726XIA.js → fleet-commands-EXDXBMV6.js} +10 -9
  132. package/dist/{fleet-decisions-EPAPM3XJ.js → fleet-decisions-OTHB6KRL.js} +5 -5
  133. package/dist/{fleet-graph-JF5QOATM.js → fleet-graph-YTEZUCUT.js} +13 -11
  134. package/dist/{fleet-inspect-VLY4S7QM.js → fleet-inspect-SS6YMDCK.js} +44 -41
  135. package/dist/{fleet-preflight-AIZUEJOY.js → fleet-preflight-PBY4VYOM.js} +5 -9
  136. package/dist/{fleet-validate-AJRPDMDV.js → fleet-validate-KMEM5L3S.js} +16 -13
  137. package/dist/{fleet-verify-JFEL2L3H.js → fleet-verify-QD5M7E7Q.js} +42 -39
  138. package/dist/{fleet-view-ZCON35AG.js → fleet-view-WAMJYNDT.js} +44 -52
  139. package/dist/{init-DN2WWLFE.js → init-5XQRBOFV.js} +63 -58
  140. package/dist/{install-XGLBQY5E.js → install-NKNG7KD4.js} +2 -2
  141. package/dist/{interop-OZBKXAYL.js → interop-34TVO25M.js} +13 -11
  142. package/dist/{library-YWZG7IMW.js → library-3QY6KF57.js} +17 -14
  143. package/dist/{memory-I4C4HMLW.js → memory-L4UTIIIW.js} +45 -41
  144. package/dist/{models-CEYXJBO6.js → models-ZVX3QOWE.js} +39 -31
  145. package/dist/{monitor-NZ6GCI3P.js → monitor-CEKVSYTS.js} +50 -46
  146. package/dist/{orchestrator-GCGQ4N5I.js → orchestrator-77BAP6BC.js} +1807 -1039
  147. package/dist/{panes-KY6W3V2E.js → panes-7STHOAUJ.js} +4 -4
  148. package/dist/{panes-HMABYVO4.js → panes-SHAUIRXY.js} +10 -8
  149. package/dist/{paths-II4K7DNR.js → paths-L7LGY6RN.js} +4 -4
  150. package/dist/{reset-DQ6FGCSH.js → reset-EOLM7GVE.js} +7 -8
  151. package/dist/{resources-BB3MVJMD.js → resources-74GKTLSF.js} +17 -13
  152. package/dist/{run-H2GQDUER.js → run-HBAUJNNZ.js} +86 -76
  153. package/dist/{share-GTJN6A5O.js → share-G3APVLVP.js} +17 -14
  154. package/dist/{skills-L55TEW6R.js → skills-35HHUKCR.js} +19 -16
  155. package/dist/{skills-eval-XVXPH2JI.js → skills-eval-QN4HSHDC.js} +55 -57
  156. package/dist/{skills-inventory-S4MXPJFV.js → skills-inventory-J357J34F.js} +15 -12
  157. package/dist/{slash-commands-ZSGASKJC.js → slash-commands-JZZCQA32.js} +31 -29
  158. package/dist/{steer-RZGSCY4R.js → steer-XAVHJM22.js} +3 -3
  159. package/dist/{support-PKEUNNQL.js → support-U7QOWY26.js} +6 -6
  160. package/dist/{targets-NCPZ644J.js → targets-DSM6CY3M.js} +59 -53
  161. package/dist/{terminal-lease-44SV3YCN.js → terminal-lease-JOPFUVEM.js} +14 -9
  162. package/dist/{tools-DAF3DI3C.js → tools-MKNWVPBH.js} +10 -8
  163. package/dist/{trace-FYVW2MQA.js → trace-ECQ7TIYZ.js} +48 -3
  164. package/dist/{tui-primitives-2AKXQNZK.js → tui-primitives-K5PASC3O.js} +8 -4
  165. package/dist/{uninstall-DW2PNOIC.js → uninstall-N34PCTGJ.js} +4 -6
  166. package/dist/{upgrade-3XPP6OQL.js → upgrade-H7TOM7YL.js} +35 -62
  167. package/dist/{usage-3NLHGTU2.js → usage-X52N3IDJ.js} +51 -48
  168. package/dist/{verifiers-SSQONKRT.js → verifiers-EJTVVSMA.js} +10 -9
  169. package/dist/{verify-3U6J7FZI.js → verify-YJL6XET2.js} +9 -8
  170. package/dist/{web-fetch-S7RR6GZ7.js → web-fetch-MPIFL3LL.js} +1 -2
  171. package/dist/{wiki-generate-CEHYGPGQ.js → wiki-generate-4NDZTQ4B.js} +66 -63
  172. package/dist/{with-panes-MKB46MPQ.js → with-panes-OBOBFIIR.js} +62 -26
  173. package/dist/worker/entry.js +57 -52
  174. package/docs/acp.md +1 -1
  175. package/docs/built-in-agents.md +40 -32
  176. package/docs/commands-and-modes.md +9 -3
  177. package/docs/config-knobs-audit.md +3 -0
  178. package/docs/configuration-and-targets.md +105 -164
  179. package/docs/environment-variables.md +2 -1
  180. package/docs/exit-codes-and-output.md +2 -0
  181. package/docs/fleet-demo-runbook.md +6 -3
  182. package/docs/fleet-dispatch.md +8 -6
  183. package/docs/installation-and-lifecycle.md +1 -1
  184. package/docs/release-cut-checklist.md +164 -177
  185. package/docs/trace-store.md +15 -10
  186. package/docs/troubleshooting.md +1 -1
  187. package/evals/README.md +5 -0
  188. package/evals/behavioral-corpus-grader.mjs +103 -0
  189. package/evals/behavioral-machinery-baseline.json +2276 -0
  190. package/evals/behavioral-machinery-driver.ts +250 -0
  191. package/evals/behavioral-machinery-support.ts +253 -0
  192. package/evals/behavioral-machinery.yaml +614 -0
  193. package/evals/behavioral-model-negative-control.yaml +68 -0
  194. package/evals/behavioral-model.yaml +216 -0
  195. package/evals/fixtures/behavioral-facts.txt +3 -0
  196. package/evals/fixtures/behavioral-main.ts +7 -0
  197. package/evals/fixtures/decoy/note.txt +2 -0
  198. package/evals/fixtures/private/credentials.txt +1 -0
  199. package/evals/tracked-metrics-baseline.yaml +229 -0
  200. package/evals/tracked-metrics-grader.mjs +129 -0
  201. package/package.json +5 -15
  202. package/skills/README.md +6 -6
  203. package/skills/coding/ast-grep/SKILL.md +8 -2
  204. package/skills/coding/coding-standards/SKILL.md +8 -2
  205. package/skills/coding/prototype/SKILL.md +8 -2
  206. package/skills/coding/tdd/SKILL.md +8 -2
  207. package/skills/context/context-handoff/SKILL.md +12 -3
  208. package/skills/context/context-handoff/evals.md +3 -3
  209. package/skills/context/context-prime/SKILL.md +8 -2
  210. package/skills/context/context-prime/evals.md +2 -2
  211. package/skills/git/file-ticket/SKILL.md +9 -4
  212. package/skills/git/file-ticket/evals.md +2 -2
  213. package/skills/git/fix-issue/SKILL.md +12 -5
  214. package/skills/git/fix-issue/evals.md +4 -4
  215. package/skills/git/resolve-merge-conflicts/SKILL.md +8 -2
  216. package/skills/git/resolve-merge-conflicts/evals.md +2 -2
  217. package/skills/git/ship/SKILL.md +9 -3
  218. package/skills/git/ship/evals.md +4 -4
  219. package/skills/git/worktree-create/SKILL.md +7 -2
  220. package/skills/git/worktree-create/evals.md +6 -6
  221. package/skills/git/worktree-merge/SKILL.md +7 -2
  222. package/skills/git/worktree-merge/evals.md +6 -6
  223. package/skills/meta/{clio-dev → clio-coder-dev}/SKILL.md +14 -8
  224. package/skills/meta/{clio-dev → clio-coder-dev}/evals.md +3 -3
  225. package/skills/meta/{clio-test → clio-coder-test}/SKILL.md +11 -5
  226. package/skills/meta/{clio-test → clio-coder-test}/evals.md +1 -1
  227. package/skills/meta/credentials/SKILL.md +9 -2
  228. package/skills/meta/find-skills/SKILL.md +8 -2
  229. package/skills/meta/herdr/SKILL.md +8 -2
  230. package/skills/meta/skill-craft/SKILL.md +21 -4
  231. package/skills/planning/architecture/SKILL.md +9 -3
  232. package/skills/planning/backlog/SKILL.md +8 -2
  233. package/skills/planning/prd/SKILL.md +8 -2
  234. package/skills/planning/product-intent/SKILL.md +8 -2
  235. package/skills/planning/tech-spec/SKILL.md +9 -3
  236. package/skills/registry.yaml +66 -66
  237. package/skills/research/arxiv-literature/SKILL.md +8 -2
  238. package/skills/research/experiment-protocol/SKILL.md +9 -2
  239. package/skills/research/scientific-debugging/SKILL.md +9 -2
  240. package/skills/research/scientific-debugging/evals.md +2 -2
  241. package/skills/research/scientific-modernization/SKILL.md +9 -2
  242. package/skills/skill-marketplace.json +257 -38
  243. package/skills/workflow/cut-it/SKILL.md +10 -2
  244. package/skills/workflow/design-council/SKILL.md +11 -2
  245. package/skills/workflow/grill-me/SKILL.md +8 -2
  246. package/skills/workflow/workflow-distiller/SKILL.md +8 -2
  247. package/src/cli/acp.ts +2 -2
  248. package/src/cli/auth.ts +2 -2
  249. package/src/cli/bootstrap-generate.ts +5 -5
  250. package/src/cli/clio.ts +6 -1
  251. package/src/cli/config-inspect.ts +3 -3
  252. package/src/cli/configure-interop.ts +1 -1
  253. package/src/cli/configure.ts +27 -27
  254. package/src/cli/default-target.ts +1 -1
  255. package/src/cli/docs.ts +6 -6
  256. package/src/cli/doctor-naming.ts +323 -0
  257. package/src/cli/doctor-panes.ts +46 -14
  258. package/src/cli/doctor-toolchain.ts +29 -8
  259. package/src/cli/doctor.ts +15 -1
  260. package/src/cli/eval-inventory.ts +8 -8
  261. package/src/cli/evidence-detail.ts +1 -1
  262. package/src/cli/evidence-inventory.ts +1 -1
  263. package/src/cli/fleet-decisions.ts +1 -1
  264. package/src/cli/fleet-inspect.ts +1 -1
  265. package/src/cli/fleet-preflight.ts +1 -1
  266. package/src/cli/fleet-verify.ts +1 -1
  267. package/src/cli/fleet-view.ts +40 -23
  268. package/src/cli/fleet.ts +8 -5
  269. package/src/cli/interop-inspect.ts +2 -2
  270. package/src/cli/models.ts +3 -3
  271. package/src/cli/modes/print.ts +1 -1
  272. package/src/cli/reset.ts +1 -1
  273. package/src/cli/run.ts +11 -15
  274. package/src/cli/share.ts +1 -1
  275. package/src/cli/skills-eval.ts +11 -11
  276. package/src/cli/targets.ts +23 -24
  277. package/src/cli/trace-inspect.ts +1 -1
  278. package/src/cli/trace.ts +41 -0
  279. package/src/cli/uninstall.ts +2 -2
  280. package/src/cli/upgrade.ts +29 -34
  281. package/src/cli/usage.ts +2 -2
  282. package/src/cli/validate-model.ts +1 -1
  283. package/src/cli/verifiers-inspect.ts +1 -1
  284. package/src/cli/wiki-generate.ts +5 -5
  285. package/src/core/bash-exec.ts +1 -1
  286. package/src/core/boot-trace.ts +3 -3
  287. package/src/core/bus-trace.ts +2 -2
  288. package/src/core/compile-cache.ts +1 -1
  289. package/src/core/config.ts +1062 -886
  290. package/src/core/defaults.ts +321 -528
  291. package/src/core/domain-loader.ts +6 -4
  292. package/src/core/event-bus.ts +1 -1
  293. package/src/core/file-references.ts +78 -88
  294. package/src/core/git-commit-attribution.ts +3 -9
  295. package/src/core/guardrails.ts +24 -4
  296. package/src/core/naming-compat.ts +45 -0
  297. package/src/core/naming-events.ts +62 -0
  298. package/src/core/recent-models.ts +1 -7
  299. package/src/core/residency-protection.ts +4 -8
  300. package/src/core/resolve-config-value.ts +1 -1
  301. package/src/core/response-model-id.ts +0 -14
  302. package/src/core/session-routing.ts +84 -74
  303. package/src/core/skill-activation.ts +18 -0
  304. package/src/core/termination.ts +4 -4
  305. package/src/core/timers.ts +2 -12
  306. package/src/domains/agents/catalog.ts +2 -12
  307. package/src/domains/agents/extension.ts +3 -3
  308. package/src/domains/agents/registry.ts +7 -7
  309. package/src/domains/agents/result-contract.ts +1 -1
  310. package/src/domains/agents/spec.ts +0 -11
  311. package/src/domains/config/classify.ts +35 -47
  312. package/src/domains/config/extension.ts +5 -5
  313. package/src/domains/config/keybindings.ts +48 -47
  314. package/src/domains/config/watcher.ts +1 -1
  315. package/src/domains/context/codewiki/indexer.ts +1 -1
  316. package/src/domains/context/extension.ts +3 -3
  317. package/src/domains/context/prompt-context.ts +1 -1
  318. package/src/domains/context/wiki/assemble.ts +2 -2
  319. package/src/domains/context/working-set/replay/metrics.ts +0 -4
  320. package/src/domains/context/working-set/replay/report.ts +1 -1
  321. package/src/domains/context/working-set/replay/synthetic.ts +2 -2
  322. package/src/domains/dispatch/active-route-planner.ts +2 -2
  323. package/src/domains/dispatch/agent-candidates.ts +1 -1
  324. package/src/domains/dispatch/agent-ledger-store.ts +1 -1
  325. package/src/domains/dispatch/agent-ledger.ts +1 -1
  326. package/src/domains/dispatch/assignment.ts +5 -5
  327. package/src/domains/dispatch/capacity-lease.ts +2 -5
  328. package/src/domains/dispatch/code-step.ts +1 -1
  329. package/src/domains/dispatch/contract.ts +2 -2
  330. package/src/domains/dispatch/extension.ts +65 -61
  331. package/src/domains/dispatch/fleet-node-prompt.ts +1 -1
  332. package/src/domains/dispatch/fleet-preflight.ts +8 -17
  333. package/src/domains/dispatch/fleet-run.ts +0 -7
  334. package/src/domains/dispatch/gate-decisions.ts +25 -14
  335. package/src/domains/dispatch/joint-route-resolver.ts +1 -1
  336. package/src/domains/dispatch/path-scope.ts +0 -61
  337. package/src/domains/dispatch/placement.ts +2 -2
  338. package/src/domains/dispatch/receipt-findings.ts +1 -1
  339. package/src/domains/dispatch/receipt-integrity.ts +20 -8
  340. package/src/domains/dispatch/reservation-store.ts +0 -23
  341. package/src/domains/dispatch/route-decision.ts +1 -1
  342. package/src/domains/dispatch/route-history.ts +1 -1
  343. package/src/domains/dispatch/route-policy.ts +1 -1
  344. package/src/domains/dispatch/route-readiness.ts +0 -28
  345. package/src/domains/dispatch/run-event-journal.ts +6 -5
  346. package/src/domains/dispatch/tool-stats.ts +1 -1
  347. package/src/domains/dispatch/transport.ts +2 -19
  348. package/src/domains/dispatch/types.ts +3 -3
  349. package/src/domains/dispatch/worker-protocol.ts +2 -2
  350. package/src/domains/eval/artifacts/store.ts +5 -4
  351. package/src/domains/eval/compare/thresholds.ts +0 -8
  352. package/src/domains/eval/execution-provenance.ts +1 -1
  353. package/src/domains/eval/metrics/token-stream.ts +0 -7
  354. package/src/domains/eval/report.ts +1 -1
  355. package/src/domains/eval/runner.ts +1 -1
  356. package/src/domains/eval/runners/clio-run.ts +7 -6
  357. package/src/domains/eval/runners/external-command.ts +4 -3
  358. package/src/domains/eval/schema/artifact.ts +1 -1
  359. package/src/domains/eval/schema/behavioral-metrics.ts +3 -2
  360. package/src/domains/eval/schema/behavioral.ts +7 -6
  361. package/src/domains/eval/schema/execution-envelope.ts +4 -2
  362. package/src/domains/eval/schema/naming.ts +10 -0
  363. package/src/domains/eval/schema/suite.ts +2 -2
  364. package/src/domains/eval/schema/validate.ts +9 -5
  365. package/src/domains/eval/schema/verdict.ts +4 -2
  366. package/src/domains/eval/store.ts +12 -2
  367. package/src/domains/eval/suites/run.ts +12 -6
  368. package/src/domains/eval/types.ts +1 -1
  369. package/src/domains/eval/workspaces/git.ts +1 -1
  370. package/src/domains/eval/workspaces/temp-copy.ts +1 -1
  371. package/src/domains/evidence/build.ts +13 -5
  372. package/src/domains/interop/consent.ts +7 -7
  373. package/src/domains/interop/extension.ts +1 -1
  374. package/src/domains/lifecycle/doctor.ts +27 -21
  375. package/src/domains/lifecycle/migrations/2026-09-01-clio-coder-naming.ts +155 -0
  376. package/src/domains/lifecycle/migrations/2026-09-01-retire-panes-knobs.ts +59 -0
  377. package/src/domains/lifecycle/migrations/2026-09-01-settings-v2.ts +338 -0
  378. package/src/domains/lifecycle/migrations/index.ts +20 -1
  379. package/src/domains/lifecycle/naming-history.ts +153 -0
  380. package/src/domains/lifecycle/naming-mutable-state.ts +104 -0
  381. package/src/domains/lifecycle/naming-resources.ts +261 -0
  382. package/src/domains/lifecycle/naming-tool-markers.ts +139 -0
  383. package/src/domains/lifecycle/naming-yazi.ts +81 -0
  384. package/src/domains/lifecycle/upgrade-notice.ts +1 -1
  385. package/src/domains/memory/task-memory-handoff.ts +6 -3
  386. package/src/domains/middleware/index.ts +7 -0
  387. package/src/domains/middleware/marketplace-offer.ts +339 -0
  388. package/src/domains/middleware/runtime.ts +2 -2
  389. package/src/domains/mux/contract.ts +157 -25
  390. package/src/domains/mux/detect.ts +29 -5
  391. package/src/domains/mux/dock-controller.ts +365 -0
  392. package/src/domains/mux/extension.ts +7 -1
  393. package/src/domains/mux/index.ts +20 -0
  394. package/src/domains/mux/operations.ts +28 -0
  395. package/src/domains/mux/protocol.ts +19 -6
  396. package/src/domains/mux/socket-client.ts +167 -19
  397. package/src/domains/mux/types.ts +49 -6
  398. package/src/domains/mux/yazi/event-stream.ts +6 -4
  399. package/src/domains/mux/yazi/profile.ts +1 -1
  400. package/src/domains/mux/yazi/session.ts +26 -3
  401. package/src/domains/observability/extension.ts +1 -1
  402. package/src/domains/observability/out-of-turn-usage.ts +2 -2
  403. package/src/domains/observability/projection.ts +1 -1
  404. package/src/domains/observability/trace-store.ts +22 -12
  405. package/src/domains/prompts/compiler.ts +2 -2
  406. package/src/domains/prompts/extension.ts +3 -3
  407. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -1
  408. package/src/domains/prompts/fragments/operating/skills.md +25 -18
  409. package/src/domains/providers/extension.ts +5 -5
  410. package/src/domains/providers/knowledge-base-path.ts +1 -1
  411. package/src/domains/providers/model-runtime-capabilities.ts +14 -2
  412. package/src/domains/providers/models/cloud-models/alcf.yaml +1 -1
  413. package/src/domains/providers/models/local-models/{clio-local-coding-targets.yaml → clio-coder-local-coding-targets.yaml} +4 -4
  414. package/src/domains/providers/plugins.ts +1 -1
  415. package/src/domains/providers/resolver.ts +1 -1
  416. package/src/domains/providers/runtimes/cloud/alcf.ts +4 -4
  417. package/src/domains/providers/runtimes/common/lmstudio-http.ts +1 -5
  418. package/src/domains/providers/runtimes/common/local-synth.ts +3 -3
  419. package/src/domains/providers/runtimes/common/probe-helpers.ts +2 -2
  420. package/src/domains/providers/runtimes/local-native/llamacpp-completion.ts +1 -1
  421. package/src/domains/providers/runtimes/local-native/lmstudio.ts +2 -9
  422. package/src/domains/providers/runtimes/protocol/litellm.ts +1 -91
  423. package/src/domains/providers/types/knowledge-base.ts +13 -0
  424. package/src/domains/providers/types/local-model-quirks.ts +2 -2
  425. package/src/domains/providers/types/target-descriptor.ts +3 -3
  426. package/src/domains/resources/extension.ts +1 -1
  427. package/src/domains/resources/library.ts +6 -6
  428. package/src/domains/resources/prompts/loader.ts +1 -1
  429. package/src/domains/resources/skills/content-hash.ts +7 -6
  430. package/src/domains/resources/skills/evals.ts +1 -1
  431. package/src/domains/resources/skills/install.ts +36 -12
  432. package/src/domains/resources/skills/loader.ts +39 -13
  433. package/src/domains/resources/skills/marketplace.ts +21 -2
  434. package/src/domains/resources/skills/promotion.ts +214 -0
  435. package/src/domains/safety/audit.ts +2 -2
  436. package/src/domains/safety/finish-contract.ts +2 -1
  437. package/src/domains/safety/run-effects.ts +1 -1
  438. package/src/domains/scheduling/extension.ts +4 -4
  439. package/src/domains/session/archive-readers.ts +9 -1
  440. package/src/domains/session/compaction/branch-summary.ts +4 -0
  441. package/src/domains/session/compaction/compact.ts +1 -1
  442. package/src/domains/session/compaction/tokens.ts +4 -0
  443. package/src/domains/session/context-accounting.ts +1 -1
  444. package/src/domains/session/decision-board.ts +1 -1
  445. package/src/domains/session/extension.ts +1 -1
  446. package/src/domains/session/handoff.ts +2 -2
  447. package/src/domains/session/prompt-manifest.ts +0 -5
  448. package/src/domains/session/protected-artifact-journal.ts +12 -6
  449. package/src/domains/session/retry.ts +1 -1
  450. package/src/domains/share/archive.ts +85 -36
  451. package/src/domains/toolchain/install.ts +1 -1
  452. package/src/engine/acp/adapter.ts +3 -3
  453. package/src/engine/acp/event-mapper.ts +3 -3
  454. package/src/engine/acp/server.ts +27 -26
  455. package/src/engine/acp/tool-mediator.ts +2 -2
  456. package/src/engine/acp/types.ts +1 -1
  457. package/src/engine/alcf-oauth.ts +5 -5
  458. package/src/engine/antigravity/subprocess-runtime.ts +2 -2
  459. package/src/engine/api-registry.ts +1 -1
  460. package/src/engine/apis/llamacpp-residency.ts +1 -19
  461. package/src/engine/apis/lmstudio.ts +1 -6
  462. package/src/engine/apis/ollama-native.ts +3 -3
  463. package/src/engine/apis/openai-completions.ts +2 -2
  464. package/src/engine/apis/residency.ts +3 -9
  465. package/src/engine/claude/sdk-module.ts +1 -12
  466. package/src/engine/claude/sdk-runtime.ts +6 -6
  467. package/src/engine/claude/subprocess-runtime.ts +1 -1
  468. package/src/engine/claude/tool-safety.ts +4 -4
  469. package/src/engine/loop-guard.ts +0 -5
  470. package/src/engine/session.ts +14 -7
  471. package/src/engine/tui-primitives.ts +1 -1
  472. package/src/engine/worker-events.ts +6 -6
  473. package/src/engine/worker-runtime.ts +14 -13
  474. package/src/entry/orchestrator.ts +107 -88
  475. package/src/interactive/application-controller.ts +21 -21
  476. package/src/interactive/bus-notices.ts +2 -2
  477. package/src/interactive/chat-loop.ts +8 -8
  478. package/src/interactive/chat-panel.ts +1 -1
  479. package/src/interactive/clio-editor.ts +105 -1
  480. package/src/interactive/context-activity.ts +8 -6
  481. package/src/interactive/context-meter.ts +3 -6
  482. package/src/interactive/context-overlay.ts +1 -1
  483. package/src/interactive/cost-overlay.ts +1 -1
  484. package/src/interactive/council-grid.ts +2 -2
  485. package/src/interactive/dispatch-board.ts +30 -33
  486. package/src/interactive/editor-bash.ts +21 -0
  487. package/src/interactive/editor-steer.ts +9 -4
  488. package/src/interactive/editor-submit.ts +24 -18
  489. package/src/interactive/external-editor.ts +1 -1
  490. package/src/interactive/file-reference-completion.ts +360 -0
  491. package/src/interactive/footer/dashboard.ts +15 -17
  492. package/src/interactive/footer/notifications.ts +14 -8
  493. package/src/interactive/footer/widgets.ts +2 -44
  494. package/src/interactive/interactive-application.ts +79 -59
  495. package/src/interactive/interactive-event-projection.ts +1 -1
  496. package/src/interactive/interactive-input-runtime.ts +2 -2
  497. package/src/interactive/interactive-presentation.ts +21 -16
  498. package/src/interactive/interactive-shell.ts +2 -2
  499. package/src/interactive/interactive-slash-runtime.ts +63 -17
  500. package/src/interactive/interactive-subscriptions.ts +1 -1
  501. package/src/interactive/interactive-tickers.ts +1 -1
  502. package/src/interactive/keybinding-manager.ts +4 -4
  503. package/src/interactive/layout.ts +1 -1
  504. package/src/interactive/memory-overlay.ts +2 -2
  505. package/src/interactive/modal-marker.ts +2 -21
  506. package/src/interactive/mutation-preview.ts +1 -1
  507. package/src/interactive/overlay-frame.ts +4 -12
  508. package/src/interactive/overlay-general-openers.ts +6 -2
  509. package/src/interactive/overlay-key-routing.ts +7 -7
  510. package/src/interactive/overlay-lifecycle.ts +1 -1
  511. package/src/interactive/overlay-model-selectors.ts +3 -3
  512. package/src/interactive/overlays/agents.ts +2 -2
  513. package/src/interactive/overlays/ask-user.ts +25 -11
  514. package/src/interactive/overlays/context-reset.ts +28 -4
  515. package/src/interactive/overlays/cwd-fallback.ts +28 -4
  516. package/src/interactive/overlays/decisions.ts +4 -2
  517. package/src/interactive/overlays/fleet-run-approval.ts +3 -3
  518. package/src/interactive/overlays/handoff-review.ts +2 -2
  519. package/src/interactive/overlays/interop.ts +1 -1
  520. package/src/interactive/overlays/library-install-confirm.ts +1 -1
  521. package/src/interactive/overlays/message-picker.ts +1 -1
  522. package/src/interactive/overlays/model-selector.ts +39 -31
  523. package/src/interactive/overlays/prompts.ts +10 -4
  524. package/src/interactive/overlays/session-selector.ts +2 -2
  525. package/src/interactive/overlays/settings.ts +339 -293
  526. package/src/interactive/overlays/side-question.ts +2 -2
  527. package/src/interactive/overlays/skills-hub.ts +8 -8
  528. package/src/interactive/overlays/tree-selector.ts +2 -2
  529. package/src/interactive/panes-runtime.ts +36 -10
  530. package/src/interactive/permission-overlay.ts +2 -2
  531. package/src/interactive/renderers/retry-status.ts +12 -4
  532. package/src/interactive/renderers/tool-execution.ts +4 -4
  533. package/src/interactive/session-transcript.ts +3 -3
  534. package/src/interactive/slash-autocomplete.ts +454 -165
  535. package/src/interactive/slash-commands.ts +279 -183
  536. package/src/interactive/slash-spec.ts +160 -17
  537. package/src/interactive/status/controller.ts +2 -2
  538. package/src/interactive/stream-pacing-policy.ts +1 -1
  539. package/src/interactive/tasks-overlay.ts +20 -13
  540. package/src/interactive/terminal-lease.ts +6 -7
  541. package/src/interactive/turn-context.ts +11 -11
  542. package/src/interactive/turn-persistence.ts +2 -2
  543. package/src/interactive/turn-prewarm.ts +2 -2
  544. package/src/interactive/turn-runtime.ts +8 -8
  545. package/src/interactive/turn-state.ts +1 -1
  546. package/src/interactive/view/artifacts.ts +12 -9
  547. package/src/interactive/view/view-overlay.ts +13 -10
  548. package/src/interactive/watch-pane.ts +38 -10
  549. package/src/interactive/welcome-dashboard.ts +15 -15
  550. package/src/interactive/worker-progress.ts +4 -4
  551. package/src/interactive/worker-receipts.ts +1 -1
  552. package/src/interactive/worker-stream.ts +1 -4
  553. package/src/interactive/yazi-bridge.ts +12 -5
  554. package/src/tools/ask-user.ts +3 -3
  555. package/src/tools/bash.ts +1 -1
  556. package/src/tools/builtin-tool-catalog.ts +1 -1
  557. package/src/tools/compete-worktrees.ts +27 -17
  558. package/src/tools/context/index.ts +15 -1
  559. package/src/tools/dispatch-admission.ts +4 -2
  560. package/src/tools/dispatch-arguments.ts +1 -1
  561. package/src/tools/dispatch-plan.ts +0 -11
  562. package/src/tools/dispatch-run-events.ts +12 -10
  563. package/src/tools/dispatch-runner.ts +11 -6
  564. package/src/tools/dispatch.ts +1 -1
  565. package/src/tools/find.ts +1 -6
  566. package/src/tools/monitor.ts +4 -4
  567. package/src/tools/observers.ts +0 -33
  568. package/src/tools/task-worktree.ts +28 -7
  569. package/src/tools/verify/authoring.ts +3 -6
  570. package/src/tools/verify/frontend.ts +1 -1
  571. package/src/tools/web-fetch.ts +1 -1
  572. package/src/worker/entry.ts +4 -3
  573. package/src/worker/protocol.ts +16 -14
  574. package/src/worker/spec-contract.ts +2 -2
  575. package/src/worker/stdin-demux.ts +2 -2
  576. package/dist/chunk-GXNLGKAB.js +0 -571
  577. package/dist/chunk-VFA6GDY5.js +0 -1625
  578. package/dist/doctor-QOA5FNY5.js +0 -313
  579. package/src/engine/apis/degraded-inference.ts +0 -95
  580. /package/skills/meta/{clio-test → clio-coder-test}/references/harness.md +0 -0
  581. /package/skills/meta/{clio-test → clio-coder-test}/references/test-map.md +0 -0
@@ -1,5 +1,3 @@
1
- import type { Skill } from "../domains/resources/skills/loader.js";
2
- import type { MarketplaceSkill } from "../domains/resources/skills/marketplace.js";
3
1
  import {
4
2
  type AutocompleteItem,
5
3
  type AutocompleteProvider,
@@ -10,33 +8,82 @@ import {
10
8
  visibleWidth,
11
9
  } from "../engine/tui.js";
12
10
  import { resolveFdBinary } from "../tools/executables.js";
13
- import { commandReference, SLASH_COMMAND_GROUPS } from "./slash-commands.js";
14
- import { type CommandArgsSpec, completeArgs, renderArgsSpec } from "./slash-spec.js";
11
+ import {
12
+ createFileReferenceCompletionSource,
13
+ type FileReferenceCompletionSource,
14
+ } from "./file-reference-completion.js";
15
+ import { commandReference, SETTINGS_AREA_IDS, SLASH_COMMAND_GROUPS } from "./slash-commands.js";
16
+ import {
17
+ type ArgCompletion,
18
+ COMPLETION_SLOT_NAMES,
19
+ type CommandArgsSpec,
20
+ type CompletionSlotName,
21
+ completeArgs,
22
+ renderArgsSpec,
23
+ } from "./slash-spec.js";
15
24
 
16
25
  export type SlashAutocompleteCommand = SlashCommand;
17
26
 
18
- /**
19
- * The suggestion row shares one truncated column with the command description,
20
- * so the hint's job is orientation, not the full grammar. Anything longer than
21
- * this budget is elided; the full usage lives in the usage notice and in the
22
- * per-token argument completions.
23
- */
24
27
  const ARGUMENT_HINT_BUDGET = 44;
25
-
26
- /** Fits the narrowest description column the slash popup grants at 120 cols. */
27
28
  const COMPLETION_DESCRIPTION_BUDGET = 80;
28
29
 
30
+ export interface CompletionValue {
31
+ /** Stable identity; distinct from the inserted spelling when aliases are displayed. */
32
+ id: string;
33
+ value: string;
34
+ label: string;
35
+ description: string;
36
+ disabledReason?: string;
37
+ sensitive?: boolean;
38
+ }
39
+
40
+ export interface CompletionSourceRequest {
41
+ slot: CompletionSlotName;
42
+ prefix: string;
43
+ command: string;
44
+ subcommand?: string;
45
+ line: string;
46
+ cursor: number;
47
+ generation: number;
48
+ signal: AbortSignal;
49
+ }
50
+
51
+ export type CompletionSource = (request: CompletionSourceRequest) => Promise<ReadonlyArray<CompletionValue>>;
52
+ export type CompletionSources = Partial<Record<CompletionSlotName, CompletionSource>>;
53
+
54
+ export interface SlashCompletionItem extends AutocompleteItem {
55
+ id: string;
56
+ kind: "command" | "flag" | "value" | "submenu" | "open-submenu";
57
+ replacement: { start: number; end: number };
58
+ appendSpace: boolean;
59
+ disabledReason?: string;
60
+ completionSlot?: CompletionSlotName;
61
+ quote?: '"' | "'";
62
+ remainingGrammar?: string;
63
+ effectDescription?: string;
64
+ submenu?: { parent: string; back: true };
65
+ /** Cursor adjustment after insertion; quoted directories keep it before the closing quote. */
66
+ cursorOffset?: number;
67
+ }
68
+
29
69
  export interface SlashAutocompleteOptions {
30
70
  basePath?: string;
31
71
  fdPath?: string | null;
32
- listSkills?: () => { installed: Skill[]; marketplace: MarketplaceSkill[] };
72
+ /** Slice 11 replaces the named no-op sources with read-only runtime sources. */
73
+ completionSources?: CompletionSources;
74
+ /** Replace the default workspace-aware `@` source without adding a second composer provider. */
75
+ fileReferenceSource?: FileReferenceCompletionSource;
76
+ /** @deprecated Dynamic skill values move to the named `skills` slot in slice 11. */
77
+ listSkills?: () => unknown;
78
+ }
79
+
80
+ /** Complete provider surface now, deliberately inert until slice 11 wiring. */
81
+ function stubCompletionSources(): Record<CompletionSlotName, CompletionSource> {
82
+ const sources = {} as Record<CompletionSlotName, CompletionSource>;
83
+ for (const slot of COMPLETION_SLOT_NAMES) sources[slot] = async () => [];
84
+ return sources;
33
85
  }
34
86
 
35
- /**
36
- * A hint that fits the row. Subcommand commands list their subcommand names;
37
- * flag commands keep the positional tail whole and include leading flags only
38
- * while the budget holds, eliding the remainder behind an ellipsis.
39
- */
40
87
  function compactArgumentHint(args: CommandArgsSpec | undefined): string | undefined {
41
88
  if (!args) return undefined;
42
89
  if (args.subcommands) {
@@ -44,97 +91,224 @@ function compactArgumentHint(args: CommandArgsSpec | undefined): string | undefi
44
91
  ...(args.flags ? { flags: args.flags } : {}),
45
92
  ...(args.positionals ? { positionals: args.positionals } : {}),
46
93
  });
47
- const parts = [...(rootStr.length > 0 ? [rootStr] : []), ...Object.keys(args.subcommands)];
48
- const joined = parts.join(" | ");
49
- return joined.length > 0 ? joined : undefined;
94
+ const parts = [...(rootStr ? [rootStr] : []), ...Object.keys(args.subcommands)];
95
+ return parts.join(" | ") || undefined;
50
96
  }
51
97
  const positionalTail = renderArgsSpec({ ...(args.positionals ? { positionals: args.positionals } : {}) });
52
- const tail = positionalTail.length > 0 ? ` ${positionalTail}` : "";
98
+ const tail = positionalTail ? ` ${positionalTail}` : "";
53
99
  const flagParts = (args.flags ?? []).map((flag) => renderArgsSpec({ flags: [flag] }));
54
100
  const kept: string[] = [];
55
101
  for (const part of flagParts) {
56
- const candidate = [...kept, part].join(" ");
57
- if (`${candidate} …${tail}`.length > ARGUMENT_HINT_BUDGET) break;
102
+ if (`${[...kept, part].join(" ")} …${tail}`.length > ARGUMENT_HINT_BUDGET) break;
58
103
  kept.push(part);
59
104
  }
60
- let flagsStr = kept.join(" ");
61
- if (kept.length < flagParts.length) flagsStr = flagsStr.length > 0 ? `${flagsStr} …` : "…";
62
- const hint = `${flagsStr}${flagsStr.length > 0 ? tail : positionalTail}`.trim();
63
- return hint.length > 0 ? hint : undefined;
105
+ let flags = kept.join(" ");
106
+ if (kept.length < flagParts.length) flags = flags ? `${flags} …` : "…";
107
+ const hint = `${flags}${flags ? tail : positionalTail}`.trim();
108
+ return hint || undefined;
64
109
  }
65
110
 
66
- function argumentCompletionItems(
67
- args: CommandArgsSpec,
68
- argumentText: string,
69
- subcommandDescriptions?: Readonly<Record<string, string>>,
70
- ): AutocompleteItem[] | null {
71
- const result = completeArgs(args, argumentText);
72
- if (!result) return null;
73
- // The provider replaces the whole argument text with the item value, so
74
- // each value carries the typed stem verbatim with only the trailing token
75
- // swapped for the completion.
76
- const stem = argumentText.slice(0, result.tokenStart);
77
- return result.completions.map((completion) => {
78
- const description = subcommandDescriptions?.[completion.token] ?? completion.hint;
79
- return {
80
- value: `${stem}${completion.token}`,
81
- label: completion.token,
82
- ...(description ? { description } : {}),
83
- };
84
- });
85
- }
111
+ /** Explicit attachment manifest: grammar owns positions, providers only own values. */
112
+ export const COMPLETION_SLOT_MANIFEST: Readonly<Record<string, CompletionSlotName>> = {
113
+ "run:pos:agent": "agents",
114
+ "run:flag:--agent-profile": "agent-profiles",
115
+ "run:flag:--runtime": "worker-runtimes",
116
+ "run:flag:--target": "targets",
117
+ "run:flag:--model": "models",
118
+ "run:flag:--require": "capabilities",
119
+ "delegate:pos:agent-id": "external-agents",
120
+ "council:flag:--roster": "rosters",
121
+ "share:pos:run-id": "shareable-runs",
122
+ "skill:pos:name": "skills",
123
+ "fleet/run:pos:name": "fleet-contracts",
124
+ "fleet/run:flag:--var": "fleet-vars",
125
+ "tasks/hand:pos:id": "tasks",
126
+ "tasks/done:pos:id": "tasks",
127
+ "tasks/drop:pos:id": "tasks",
128
+ "context/recall:pos:ref": "context-refs",
129
+ "view/verify:pos:runId": "receipts",
130
+ "panes/show:pos:run-or-agent": "pane-runs-agents",
131
+ "panes/open:pos:preset-or-argv": "pane-presets",
132
+ "panes/close:pos:target": "pane-targets",
133
+ "resources/library:pos:kind": "library-tabs",
134
+ "model:pos:pattern": "models",
135
+ "thinking:pos:level": "thinking-levels",
136
+ "settings:pos:area": "settings-areas",
137
+ "settings:pos:group": "settings-groups",
138
+ "help:pos:query": "help-queries",
139
+ "archive/export:pos:path": "paths",
140
+ "archive/import:pos:path": "paths",
141
+ "export:pos:path": "paths",
142
+ };
86
143
 
87
- export function buildSlashAutocompleteCommands(): SlashAutocompleteCommand[] {
88
- const reference = commandReference();
89
- return SLASH_COMMAND_GROUPS.flatMap((group) => reference.filter((ref) => ref.group === group)).map((ref) => {
90
- const argumentHint = compactArgumentHint(ref.args);
91
- const args = ref.args;
92
- return {
93
- name: ref.name,
94
- description: ref.description,
95
- ...(argumentHint ? { argumentHint } : {}),
96
- ...(args
97
- ? {
98
- getArgumentCompletions: (argumentText: string) =>
99
- argumentCompletionItems(args, argumentText, ref.subcommandDescriptions),
100
- }
101
- : {}),
102
- };
144
+ function completionGrammar(command: string, args: CommandArgsSpec): CommandArgsSpec {
145
+ const clone = (spec: CommandArgsSpec, path: string): CommandArgsSpec => ({
146
+ ...spec,
147
+ ...(spec.flags
148
+ ? {
149
+ flags: spec.flags.map((flag) => {
150
+ const completionSlot = COMPLETION_SLOT_MANIFEST[`${path}:flag:${flag.name}`];
151
+ return { ...flag, ...(completionSlot ? { completionSlot } : {}) };
152
+ }),
153
+ }
154
+ : {}),
155
+ ...(spec.positionals
156
+ ? {
157
+ positionals: spec.positionals.map((pos) => {
158
+ const completionSlot = COMPLETION_SLOT_MANIFEST[`${path}:pos:${pos.name}`];
159
+ const values =
160
+ command === "output" && pos.name === "verbosity"
161
+ ? (["minimal", "default", "verbose"] as const)
162
+ : command === "settings" && pos.name === "area"
163
+ ? SETTINGS_AREA_IDS
164
+ : undefined;
165
+ return { ...pos, ...(completionSlot ? { completionSlot } : {}), ...(values ? { values } : {}) };
166
+ }),
167
+ }
168
+ : {}),
169
+ ...(spec.subcommands
170
+ ? {
171
+ subcommands: Object.fromEntries(
172
+ Object.entries(spec.subcommands).map(([name, child]) => [name, clone(child, `${path}/${name}`)]),
173
+ ),
174
+ }
175
+ : {}),
103
176
  });
177
+ return clone(args, command);
104
178
  }
105
179
 
106
- function compactCompletionDescription(description: string | undefined): string | undefined {
180
+ function compactDescription(description: string | undefined): string | undefined {
107
181
  if (!description || visibleWidth(description) <= COMPLETION_DESCRIPTION_BUDGET) return description;
108
- const clipped = truncateToWidth(description, COMPLETION_DESCRIPTION_BUDGET - 1, "", false).trimEnd();
109
- return `${clipped}…`;
182
+ return `${truncateToWidth(description, COMPLETION_DESCRIPTION_BUDGET - 1, "", false).trimEnd()}…`;
183
+ }
184
+
185
+ const BARE_VALID_PARENTS = new Set(["agents", "context", "memory", "panes", "resources"]);
186
+
187
+ interface SlashContext {
188
+ line: string;
189
+ command: string;
190
+ commandStart: number;
191
+ commandEnd: number;
192
+ argsStart: number;
110
193
  }
111
194
 
112
- function isSlashCommandPrefix(lines: string[], cursorLine: number, cursorCol: number): string | null {
195
+ interface FileReferenceContext {
196
+ query: string;
197
+ prefix: string;
198
+ replacement: { start: number; end: number };
199
+ }
200
+
201
+ function slashContext(lines: string[], cursorLine: number, cursorCol: number): SlashContext | null {
113
202
  if (cursorLine !== 0) return null;
114
- const currentLine = lines[cursorLine] ?? "";
115
- const textBeforeCursor = currentLine.slice(0, cursorCol);
116
- const firstNonSpace = textBeforeCursor.search(/\S/);
117
- if (firstNonSpace === -1 || textBeforeCursor[firstNonSpace] !== "/") return null;
118
- const slashText = textBeforeCursor.slice(firstNonSpace);
119
- if (slashText.includes(" ")) return null;
120
- const prefix = slashText.slice(1);
121
- return prefix.includes("/") ? null : prefix;
203
+ const line = lines[0] ?? "";
204
+ const first = line.search(/\S/);
205
+ if (first < 0 || line[first] !== "/" || cursorCol < first + 1) return null;
206
+ let commandEnd = first + 1;
207
+ while (commandEnd < line.length && !/\s/.test(line[commandEnd] ?? "")) commandEnd++;
208
+ const argsStart = commandEnd < line.length ? commandEnd + 1 : commandEnd;
209
+ // The cursor may be in the command or any argument token, but never in a later editor line.
210
+ return { line, command: line.slice(first + 1, commandEnd), commandStart: first + 1, commandEnd, argsStart };
211
+ }
212
+
213
+ function genericTokenRange(line: string, cursor: number): { start: number; end: number } {
214
+ let start = Math.max(0, Math.min(cursor, line.length));
215
+ let quote: '"' | "'" | undefined;
216
+ while (start > 0) {
217
+ const previous = line[start - 1] ?? "";
218
+ if (!quote && /\s/.test(previous)) break;
219
+ if (previous === '"' || previous === "'") quote = quote === previous ? undefined : previous;
220
+ start--;
221
+ }
222
+ let end = Math.max(start, Math.min(cursor, line.length));
223
+ quote = undefined;
224
+ while (end < line.length) {
225
+ const char = line[end] ?? "";
226
+ if (!quote && /\s/.test(char)) break;
227
+ if (char === '"' || char === "'") quote = quote === char ? undefined : char;
228
+ end++;
229
+ }
230
+ return { start, end };
231
+ }
232
+
233
+ function quotedReferenceText(raw: string, quote: '"' | "'"): string {
234
+ const body = raw.startsWith(quote) ? raw.slice(1) : raw;
235
+ const withoutClose = body.endsWith(quote) ? body.slice(0, -1) : body;
236
+ let decoded = "";
237
+ let escaped = false;
238
+ for (const character of withoutClose) {
239
+ if (escaped) {
240
+ decoded += character;
241
+ escaped = false;
242
+ continue;
243
+ }
244
+ if (character === "\\") {
245
+ escaped = true;
246
+ continue;
247
+ }
248
+ decoded += character;
249
+ }
250
+ if (escaped) decoded += "\\";
251
+ return decoded;
252
+ }
253
+
254
+ function fileReferenceContext(lines: string[], cursorLine: number, cursorCol: number): FileReferenceContext | null {
255
+ const line = lines[cursorLine] ?? "";
256
+ const cursor = Math.max(0, Math.min(cursorCol, line.length));
257
+ for (let start = cursor - 1; start >= 0; start -= 1) {
258
+ if (line[start] !== "@" || (start > 0 && !/\s/u.test(line[start - 1] ?? ""))) continue;
259
+ const quote = line[start + 1] === '"' || line[start + 1] === "'" ? (line[start + 1] as '"' | "'") : null;
260
+ let end = start + 1;
261
+ let escaped = false;
262
+ if (quote) {
263
+ end += 1;
264
+ while (end < line.length) {
265
+ const character = line[end] ?? "";
266
+ end += 1;
267
+ if (escaped) {
268
+ escaped = false;
269
+ continue;
270
+ }
271
+ if (character === "\\") {
272
+ escaped = true;
273
+ continue;
274
+ }
275
+ if (character === quote) break;
276
+ }
277
+ } else {
278
+ while (end < line.length && !/\s/u.test(line[end] ?? "")) end += 1;
279
+ }
280
+ if (cursor < start + 1 || cursor > end) continue;
281
+ const rawQuery = line.slice(start + 1, cursor);
282
+ return {
283
+ query: quote ? quotedReferenceText(rawQuery, quote) : rawQuery,
284
+ prefix: line.slice(start, cursor),
285
+ replacement: { start, end },
286
+ };
287
+ }
288
+ return null;
289
+ }
290
+
291
+ function sourceRows(values: ReadonlyArray<CompletionValue>, prefix: string): CompletionValue[] {
292
+ const lower = prefix.toLowerCase();
293
+ return values.filter((value) => !value.sensitive && value.value.toLowerCase().startsWith(lower));
122
294
  }
123
295
 
124
296
  class ClioAutocompleteProvider implements AutocompleteProvider {
125
297
  readonly triggerCharacters = ["/", "@"];
126
-
127
- private readonly provider: CombinedAutocompleteProvider;
128
- private readonly listSkills: (() => { installed: Skill[]; marketplace: MarketplaceSkill[] }) | undefined;
298
+ private readonly files: CombinedAutocompleteProvider;
299
+ private readonly fileReferences: FileReferenceCompletionSource;
300
+ private readonly sourceBySlot: Record<CompletionSlotName, CompletionSource>;
301
+ private generation = 0;
129
302
 
130
303
  constructor(
131
- commands: SlashAutocompleteCommand[],
132
304
  basePath: string,
133
305
  fdPath: string | null,
134
- listSkills?: () => { installed: Skill[]; marketplace: MarketplaceSkill[] },
306
+ sources: CompletionSources,
307
+ fileReferenceSource?: FileReferenceCompletionSource,
135
308
  ) {
136
- this.provider = new CombinedAutocompleteProvider(commands, basePath, fdPath);
137
- this.listSkills = listSkills;
309
+ this.files = new CombinedAutocompleteProvider([], basePath, fdPath);
310
+ this.fileReferences = fileReferenceSource ?? createFileReferenceCompletionSource({ basePath });
311
+ this.sourceBySlot = { ...stubCompletionSources(), ...sources };
138
312
  }
139
313
 
140
314
  async getSuggestions(
@@ -143,114 +317,229 @@ class ClioAutocompleteProvider implements AutocompleteProvider {
143
317
  cursorCol: number,
144
318
  options: { signal: AbortSignal; force?: boolean },
145
319
  ): Promise<AutocompleteSuggestions | null> {
146
- const currentLine = lines[cursorLine] ?? "";
147
- const textBeforeCursor = currentLine.slice(0, cursorCol);
148
-
149
- // Check if we are typing the canonical /skill invocation command (a name
150
- // separator after /skill). The bare "/skill" selector with nothing after
151
- // it must NOT match here: matching would offer every installed skill as
152
- // an autocomplete suggestion with the first one pre-selected, and the
153
- // editor's autocomplete-confirm binding shares the Enter key with
154
- // submit, so submitting the bare selector would silently commit
155
- // whichever skill happened to sort first instead of opening the Skills
156
- // Hub (see FINDINGS.md F1).
157
- const skillMatch = textBeforeCursor.match(/^\s*\/skill\s+([a-zA-Z0-9_-]*)$/i);
158
- if (skillMatch && this.listSkills) {
159
- const typedPrefix = skillMatch[1]?.toLowerCase() ?? "";
160
- const { installed, marketplace } = this.listSkills();
161
-
162
- const items: AutocompleteItem[] = [];
163
-
164
- // 1. Installed skills
165
- for (const skill of installed) {
166
- if (skill.name.toLowerCase().startsWith(typedPrefix)) {
167
- items.push({
168
- value: `skill:${skill.name}`,
169
- label: skill.name,
170
- description: skill.description,
171
- });
172
- }
320
+ const generation = ++this.generation;
321
+ const context = slashContext(lines, cursorLine, cursorCol);
322
+ if (!context) {
323
+ const reference = fileReferenceContext(lines, cursorLine, cursorCol);
324
+ if (reference) {
325
+ const values = await this.fileReferences({ query: reference.query, signal: options.signal });
326
+ if (generation !== this.generation || options.signal.aborted || values.length === 0) return null;
327
+ return {
328
+ prefix: reference.prefix,
329
+ items: values.map((value): SlashCompletionItem => {
330
+ const quotedDirectory = value.isDirectory && value.value.endsWith('"');
331
+ return {
332
+ id: value.id,
333
+ kind: value.isDirectory ? "open-submenu" : "value",
334
+ value: value.value,
335
+ label: value.label,
336
+ description: value.description,
337
+ effectDescription: value.description,
338
+ replacement: reference.replacement,
339
+ appendSpace: !value.isDirectory,
340
+ ...(quotedDirectory ? { cursorOffset: -1 } : {}),
341
+ ...(value.isDirectory ? { submenu: { parent: `@${value.path}`, back: true } } : {}),
342
+ };
343
+ }),
344
+ };
173
345
  }
346
+ const suggestions = await this.files.getSuggestions(lines, cursorLine, cursorCol, options);
347
+ if (!suggestions || generation !== this.generation || options.signal.aborted) return null;
348
+ const range = genericTokenRange(lines[cursorLine] ?? "", cursorCol);
349
+ return {
350
+ prefix: suggestions.prefix,
351
+ items: suggestions.items.map((item, index) => ({
352
+ ...item,
353
+ id: `file:${index}:${item.value}`,
354
+ kind: "value" as const,
355
+ replacement: range,
356
+ appendSpace: false,
357
+ ...(item.description ? { effectDescription: item.description } : {}),
358
+ })),
359
+ };
360
+ }
361
+ const reference = commandReference();
362
+ const refs = SLASH_COMMAND_GROUPS.flatMap((group) => reference.filter((ref) => ref.group === group));
363
+ const exactRef = refs.find((candidate) => candidate.name.toLowerCase() === context.command.toLowerCase());
364
+ if (cursorCol === context.commandEnd && options.force && exactRef && BARE_VALID_PARENTS.has(exactRef.name)) {
365
+ const item: SlashCompletionItem = {
366
+ id: `open:${exactRef.name}`,
367
+ kind: "open-submenu",
368
+ value: "",
369
+ label: "Open …",
370
+ description: `Open /${exactRef.name} actions`,
371
+ effectDescription: `Open /${exactRef.name} actions`,
372
+ replacement: { start: context.commandEnd, end: context.commandEnd },
373
+ appendSpace: true,
374
+ submenu: { parent: exactRef.name, back: true },
375
+ };
376
+ return { items: [item], prefix: "" };
377
+ }
378
+ if (cursorCol === context.commandEnd && options.force && exactRef?.args) {
379
+ const item: SlashCompletionItem = {
380
+ id: `advance:${exactRef.name}`,
381
+ kind: "command",
382
+ value: exactRef.name,
383
+ label: exactRef.name,
384
+ description: exactRef.description,
385
+ effectDescription: exactRef.description,
386
+ replacement: { start: context.commandStart, end: context.commandEnd },
387
+ appendSpace: true,
388
+ };
389
+ return { items: [item], prefix: context.command };
390
+ }
391
+ if (cursorCol <= context.commandEnd) {
392
+ const prefix = context.line.slice(context.commandStart, cursorCol);
393
+ const items: SlashCompletionItem[] = refs
394
+ .filter((ref) => ref.name.toLowerCase().startsWith(prefix.toLowerCase()) && ref.name !== prefix)
395
+ .map((ref) => {
396
+ const remainingGrammar = compactArgumentHint(ref.args);
397
+ const description = compactDescription(`${remainingGrammar ? `${remainingGrammar} — ` : ""}${ref.description}`);
398
+ const item: SlashCompletionItem = {
399
+ id: `command:${ref.name}`,
400
+ kind: "command",
401
+ value: ref.name,
402
+ label: ref.name,
403
+ effectDescription: ref.description,
404
+ replacement: { start: context.commandStart, end: context.commandEnd },
405
+ appendSpace: Boolean(ref.args && (ref.args.positionals || ref.args.flags || ref.args.subcommands)),
406
+ };
407
+ if (description) item.description = description;
408
+ if (remainingGrammar) item.remainingGrammar = remainingGrammar;
409
+ return item;
410
+ });
411
+ return items.length ? { items, prefix } : null;
412
+ }
174
413
 
175
- // 2. Marketplace skills (uninstalled)
176
- for (const skill of marketplace) {
177
- if (installed.some((s) => s.name === skill.name)) continue;
178
-
179
- if (skill.name.toLowerCase().startsWith(typedPrefix)) {
180
- items.push({
181
- value: `marketplace:${skill.name}`,
182
- label: `${skill.name} (marketplace)`,
183
- description: skill.description,
184
- });
414
+ const ref = refs.find((candidate) => candidate.name.toLowerCase() === context.command.toLowerCase());
415
+ if (!ref?.args) return null;
416
+ const argumentText = context.line.slice(context.argsStart);
417
+ const argumentCursor = Math.max(0, cursorCol - context.argsStart);
418
+ const grammar = completionGrammar(ref.name, ref.args);
419
+ const result = completeArgs(grammar, argumentText, argumentCursor);
420
+ if (!result) return null;
421
+ const beforeCursor = argumentText.slice(result.tokenStart, argumentCursor);
422
+ const selectedSubcommand = Object.keys(ref.args.subcommands ?? {}).find(
423
+ (name) => argumentText.trimStart().split(/\s+/, 1)[0] === name,
424
+ );
425
+ const items: SlashCompletionItem[] = [];
426
+ for (const completion of result.completions) {
427
+ if (completion.completionSlot) {
428
+ const values = await this.sourceBySlot[completion.completionSlot]({
429
+ slot: completion.completionSlot,
430
+ prefix: beforeCursor,
431
+ command: ref.name,
432
+ ...(selectedSubcommand ? { subcommand: selectedSubcommand } : {}),
433
+ line: context.line,
434
+ cursor: cursorCol,
435
+ generation,
436
+ signal: options.signal,
437
+ });
438
+ if (generation !== this.generation || options.signal.aborted) return null;
439
+ for (const value of sourceRows(values, beforeCursor)) {
440
+ items.push(
441
+ this.itemFromValue(
442
+ value,
443
+ completion,
444
+ context.argsStart + result.tokenStart,
445
+ context.argsStart + result.tokenEnd,
446
+ result.quote,
447
+ ),
448
+ );
185
449
  }
450
+ continue;
186
451
  }
187
-
188
- if (items.length > 0) return { items, prefix: typedPrefix };
452
+ if (completion.token === beforeCursor && options.force !== true) continue;
453
+ const description = completion.description ?? ref.subcommandDescriptions?.[completion.token] ?? completion.hint;
454
+ const effectDescription = completion.description ?? ref.subcommandDescriptions?.[completion.token];
455
+ const item: SlashCompletionItem = {
456
+ id: `${ref.name}:${completion.token}`,
457
+ kind: result.submenu ? "submenu" : completion.token.startsWith("--") ? "flag" : "value",
458
+ value: completion.token,
459
+ label: completion.token,
460
+ replacement: { start: context.argsStart + result.tokenStart, end: context.argsStart + result.tokenEnd },
461
+ appendSpace: completion.hasNextSlot,
462
+ };
463
+ if (description) item.description = description;
464
+ if (completion.hint) item.remainingGrammar = completion.hint;
465
+ if (effectDescription) item.effectDescription = effectDescription;
466
+ if (result.submenu) item.submenu = { parent: ref.name, back: true };
467
+ if (result.quote) item.quote = result.quote;
468
+ items.push(item);
189
469
  }
470
+ return items.length ? { items, prefix: beforeCursor } : null;
471
+ }
190
472
 
191
- const suggestions = await this.provider.getSuggestions(lines, cursorLine, cursorCol, options);
192
- const commandPrefix = isSlashCommandPrefix(lines, cursorLine, cursorCol);
193
- if (commandPrefix !== null) {
194
- const canonicalItems = (suggestions?.items ?? [])
195
- .filter((item) => item.value.startsWith(commandPrefix))
196
- .map((item) => {
197
- const description = compactCompletionDescription(item.description);
198
- if (description === item.description || description === undefined) return item;
199
- return { ...item, description };
200
- });
201
- const items = canonicalItems;
202
- if (items.length === 0) return null;
203
- return { items, prefix: suggestions?.prefix ?? textBeforeCursor };
204
- }
205
- // Enter accepts the open completion instead of submitting, so a suggestion
206
- // the input already equals costs a keystroke that changes no pixel: typing
207
- // `/memory seed` and pressing Enter accepted "seed" and submitted nothing,
208
- // which reads as a dropped key and concatenates whatever is typed next
209
- // onto the unsent line. Nothing left to complete, no popup, and the first
210
- // Enter submits. An explicit Tab is left alone: it asked for the list.
211
- if (suggestions && options.force !== true && suggestions.items.some((item) => item.value === suggestions.prefix)) {
212
- return null;
213
- }
214
- return suggestions;
473
+ private itemFromValue(
474
+ value: CompletionValue,
475
+ grammar: ArgCompletion,
476
+ start: number,
477
+ end: number,
478
+ quote?: '"' | "'",
479
+ ): SlashCompletionItem {
480
+ return {
481
+ id: value.id,
482
+ kind: "value",
483
+ value: value.value,
484
+ label: value.label,
485
+ description: value.disabledReason ?? value.description,
486
+ replacement: { start, end },
487
+ appendSpace: grammar.hasNextSlot,
488
+ effectDescription: value.description,
489
+ ...(grammar.completionSlot ? { completionSlot: grammar.completionSlot } : {}),
490
+ ...(quote ? { quote } : {}),
491
+ ...(value.disabledReason ? { disabledReason: value.disabledReason } : {}),
492
+ };
215
493
  }
216
494
 
217
495
  applyCompletion(
218
496
  lines: string[],
219
497
  cursorLine: number,
220
- cursorCol: number,
498
+ _cursorCol: number,
221
499
  item: AutocompleteItem,
222
- prefix: string,
500
+ _prefix: string,
223
501
  ): { lines: string[]; cursorLine: number; cursorCol: number } {
224
- const currentLine = lines[cursorLine] ?? "";
225
- const textBeforeCursor = currentLine.slice(0, cursorCol);
226
- const textAfterCursor = currentLine.slice(cursorCol);
227
-
228
- const skillMatch = textBeforeCursor.match(/^\s*\/skill\s+[a-zA-Z0-9_-]*$/i);
229
- if (skillMatch && (item.value.startsWith("skill:") || item.value.startsWith("marketplace:"))) {
230
- const skillName = item.value.slice(item.value.indexOf(":") + 1);
231
- const newLine = `/skill ${skillName} ${textAfterCursor}`;
232
- const newLines = [...lines];
233
- newLines[cursorLine] = newLine;
502
+ const completion = item as SlashCompletionItem;
503
+ if (!completion.replacement || completion.disabledReason) {
504
+ return { lines, cursorLine, cursorCol: _cursorCol };
505
+ }
506
+ const current = lines[cursorLine] ?? "";
507
+ if (completion.appendSpace && completion.quote && current[completion.replacement.end] === completion.quote) {
508
+ const needsSpace = !/\s/.test(current[completion.replacement.end + 1] ?? "");
509
+ const inserted = `${completion.value}${completion.quote}${needsSpace ? " " : ""}`;
510
+ const next = [...lines];
511
+ next[cursorLine] =
512
+ `${current.slice(0, completion.replacement.start)}${inserted}${current.slice(completion.replacement.end + 1)}`;
234
513
  return {
235
- lines: newLines,
514
+ lines: next,
236
515
  cursorLine,
237
- cursorCol: `/skill ${skillName} `.length,
516
+ cursorCol: completion.replacement.start + inserted.length + (completion.cursorOffset ?? 0),
238
517
  };
239
518
  }
240
-
241
- return this.provider.applyCompletion(lines, cursorLine, cursorCol, item, prefix);
519
+ const needsSpace = completion.appendSpace && !/\s/.test(current[completion.replacement.end] ?? "");
520
+ const inserted = `${completion.value}${needsSpace ? " " : ""}`;
521
+ const next = [...lines];
522
+ next[cursorLine] =
523
+ `${current.slice(0, completion.replacement.start)}${inserted}${current.slice(completion.replacement.end)}`;
524
+ return {
525
+ lines: next,
526
+ cursorLine,
527
+ cursorCol: completion.replacement.start + inserted.length + (completion.cursorOffset ?? 0),
528
+ };
242
529
  }
243
530
 
244
531
  shouldTriggerFileCompletion(lines: string[], cursorLine: number, cursorCol: number): boolean {
245
- return this.provider.shouldTriggerFileCompletion(lines, cursorLine, cursorCol);
532
+ if (slashContext(lines, cursorLine, cursorCol) !== null) return false;
533
+ if (fileReferenceContext(lines, cursorLine, cursorCol) !== null) return true;
534
+ return this.files.shouldTriggerFileCompletion(lines, cursorLine, cursorCol);
246
535
  }
247
536
  }
248
537
 
249
538
  export function createSlashCommandAutocompleteProvider(options: SlashAutocompleteOptions = {}): AutocompleteProvider {
250
539
  return new ClioAutocompleteProvider(
251
- buildSlashAutocompleteCommands(),
252
540
  options.basePath ?? process.cwd(),
253
541
  options.fdPath === undefined ? resolveFdBinary() : options.fdPath,
254
- options.listSkills,
542
+ options.completionSources ?? {},
543
+ options.fileReferenceSource,
255
544
  );
256
545
  }