@iowarp/clio-coder 0.4.1 → 0.4.2

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 (437) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/CONTRIBUTING.md +59 -36
  3. package/README.md +404 -472
  4. package/SECURITY.md +2 -1
  5. package/dist/{acp-ZILU3AUO.js → acp-TMDQZDIG.js} +7 -7
  6. package/dist/{agents-HYWGBGQR.js → agents-5N5NG3XG.js} +28 -28
  7. package/dist/assets/codewiki.json +1 -1
  8. package/dist/{auth-N3QT7CBO.js → auth-Z5CCBXKQ.js} +8 -9
  9. package/dist/{builtins-UJLMOVOV.js → builtins-K6TNDT24.js} +4 -4
  10. package/dist/{chunk-GVQJ5CCZ.js → chunk-2HFQNRV3.js} +7 -7
  11. package/dist/{chunk-QMXC4JB7.js → chunk-2NHR3NAY.js} +163 -1401
  12. package/dist/chunk-2X4RYJTJ.js +39 -0
  13. package/dist/{chunk-Y45G3AXC.js → chunk-2Z2IKEXI.js} +6 -10
  14. package/dist/{chunk-EIMVLWB3.js → chunk-34BHNEE3.js} +7 -3
  15. package/dist/{chunk-GIZNH63R.js → chunk-35MSIRKH.js} +9 -4
  16. package/dist/chunk-3EBYEESD.js +314 -0
  17. package/dist/{chunk-CTJ4RNAA.js → chunk-3F7VUY77.js} +2 -2
  18. package/dist/{chunk-AP73CFDC.js → chunk-3KIPBMUA.js} +2 -2
  19. package/dist/{chunk-J5LZHVIT.js → chunk-3M6DQK6S.js} +113 -35
  20. package/dist/{chunk-VEGN6WIQ.js → chunk-462T4EGZ.js} +2 -2
  21. package/dist/{chunk-AFKWHWXF.js → chunk-4JDLP6ZS.js} +33 -16
  22. package/dist/{chunk-6FN3E6KX.js → chunk-4O6MANBS.js} +2 -2
  23. package/dist/{chunk-AKB4GYDL.js → chunk-54ODD65L.js} +5 -5
  24. package/dist/{chunk-BBTJOK6Y.js → chunk-5KW52TEP.js} +3 -3
  25. package/dist/{chunk-6CCS4G3W.js → chunk-5PFYMY2V.js} +2 -2
  26. package/dist/chunk-77QIVUZB.js +1334 -0
  27. package/dist/{chunk-7OBGU7UB.js → chunk-7BHIY2MW.js} +7 -13
  28. package/dist/{chunk-3QSOM6PA.js → chunk-AZ4WMN4W.js} +2 -2
  29. package/dist/{chunk-6NJQITNH.js → chunk-B74PXLU7.js} +6 -3
  30. package/dist/{chunk-R23Z6K6I.js → chunk-B7HM5Z7T.js} +15 -15
  31. package/dist/{chunk-R32CLGZ6.js → chunk-BO7Y52RY.js} +81 -20
  32. package/dist/{chunk-UEDMSP56.js → chunk-BYMNWQ7O.js} +123 -148
  33. package/dist/{chunk-ZJLUDYFY.js → chunk-CRFOIAX3.js} +4 -4
  34. package/dist/{chunk-2NM363SV.js → chunk-CYZW7JHJ.js} +7 -7
  35. package/dist/{chunk-6HMJX2VU.js → chunk-DYHAXKHD.js} +38 -10
  36. package/dist/{chunk-THYWACCR.js → chunk-DZAW46HP.js} +3 -3
  37. package/dist/{chunk-FYUN5KZ3.js → chunk-DZEK6CJN.js} +17 -17
  38. package/dist/{chunk-3I5NY75V.js → chunk-E7GT7O5N.js} +5 -5
  39. package/dist/{chunk-VKFQTNDV.js → chunk-F2I26BDK.js} +4 -4
  40. package/dist/{chunk-HLW2MRKE.js → chunk-F4EKGO4N.js} +3 -1
  41. package/dist/{chunk-IXJT6DCX.js → chunk-FVDGR2ZL.js} +3 -3
  42. package/dist/{chunk-TZSKNMZG.js → chunk-GTUD2WMY.js} +2 -1
  43. package/dist/{chunk-7EPLI7VL.js → chunk-HIICAHCJ.js} +2 -2
  44. package/dist/{chunk-E67WX76H.js → chunk-HKMD33FO.js} +29 -80
  45. package/dist/chunk-HLAFFSEK.js +360 -0
  46. package/dist/{chunk-UAPGZHYC.js → chunk-I64IFBLB.js} +9 -2
  47. package/dist/{chunk-XKA2ICR3.js → chunk-I66ZTYNP.js} +440 -175
  48. package/dist/{chunk-7PWAODYW.js → chunk-I7XBWTYH.js} +2 -2
  49. package/dist/{chunk-PVAMAVBB.js → chunk-IDNA72AH.js} +102 -2
  50. package/dist/{chunk-GCSMB2KY.js → chunk-IKOZFYBN.js} +1 -1
  51. package/dist/{chunk-2VG7KLYV.js → chunk-IKSLQ4XV.js} +5460 -3241
  52. package/dist/{chunk-QKIFBZKT.js → chunk-IMXMHHMQ.js} +166 -25
  53. package/dist/{chunk-74YWRRU5.js → chunk-JBCS7CRR.js} +2 -2
  54. package/dist/{chunk-BDPT6GTK.js → chunk-JWJGP5DQ.js} +2 -2
  55. package/dist/{chunk-K6BF4U2H.js → chunk-KKOJXO6R.js} +62 -14
  56. package/dist/chunk-KPXDY6QF.js +47 -0
  57. package/dist/{chunk-ABLSQ6JX.js → chunk-LJID3DYZ.js} +7 -1
  58. package/dist/{chunk-VKRH2TCS.js → chunk-M2DAX4F6.js} +2 -2
  59. package/dist/{chunk-6I5ILFOF.js → chunk-M2WXEHER.js} +2 -2
  60. package/dist/{chunk-YPI3QQCF.js → chunk-MCEPRMZW.js} +2 -4
  61. package/dist/{chunk-N5UK64DP.js → chunk-MCMZMDAC.js} +2 -2
  62. package/dist/{chunk-Y4CAGMM6.js → chunk-MNJGS2IN.js} +5 -6
  63. package/dist/{chunk-TVHHYFHE.js → chunk-NEDJ26B5.js} +2 -2
  64. package/dist/{chunk-U2WB7TZS.js → chunk-NMJXSHBJ.js} +97 -85
  65. package/dist/{chunk-HUAS7ITX.js → chunk-O3YUNJZ2.js} +13 -21
  66. package/dist/{chunk-MA3H6DM5.js → chunk-P75RZCJW.js} +25 -3
  67. package/dist/{chunk-IG7BCQBA.js → chunk-PGF63K6I.js} +2 -2
  68. package/dist/chunk-PJX3WQUQ.js +42 -0
  69. package/dist/{chunk-6DWBAZ5U.js → chunk-Q4XWMHX6.js} +4 -6
  70. package/dist/{chunk-OJTRZGR3.js → chunk-QQLGQY2A.js} +8 -8
  71. package/dist/{chunk-J4HBWF6Y.js → chunk-RLYRBIYQ.js} +115 -20
  72. package/dist/{chunk-NLFAQR7Z.js → chunk-S66XZJOF.js} +3 -23
  73. package/dist/{chunk-C537JADH.js → chunk-SSEYRH53.js} +6 -7
  74. package/dist/chunk-SZAA6XDG.js +30 -0
  75. package/dist/{chunk-MOPSG2X7.js → chunk-TPEQIQIE.js} +6 -6
  76. package/dist/{chunk-JA5QWE4Z.js → chunk-UBRFI4HS.js} +1879 -1650
  77. package/dist/{chunk-BTGG6BG2.js → chunk-UH347SHR.js} +154 -15
  78. package/dist/{chunk-5YHDIDBP.js → chunk-UH632ZYL.js} +2 -2
  79. package/dist/{chunk-BWW4HLO4.js → chunk-UXCU4E3T.js} +8 -6
  80. package/dist/{chunk-6VC4OV3Z.js → chunk-VIA6RFQZ.js} +3 -11
  81. package/dist/{chunk-ZAZB4JMW.js → chunk-VKPAQYEB.js} +27 -8
  82. package/dist/{chunk-UXN6JT4W.js → chunk-W4YEMFBX.js} +2 -2
  83. package/dist/{chunk-TD3PGPQA.js → chunk-W6NIE6OW.js} +2 -2
  84. package/dist/{chunk-TVH4ONAM.js → chunk-X7IARSHT.js} +3 -3
  85. package/dist/{chunk-PJJ6MY27.js → chunk-XE3PCIXH.js} +3 -3
  86. package/dist/{chunk-FEFIFZTL.js → chunk-XGDPUNND.js} +2 -2
  87. package/dist/{chunk-SCYB3HA4.js → chunk-XOXV5GKE.js} +51 -16
  88. package/dist/{chunk-QTFGO774.js → chunk-XQRY4DTA.js} +24 -11
  89. package/dist/{chunk-BJGUKIG4.js → chunk-YJISEZKC.js} +2 -2
  90. package/dist/{chunk-GPPB3JBE.js → chunk-ZGNYYXQ6.js} +2 -2
  91. package/dist/{chunk-SINK3QR6.js → chunk-ZNT2M6TG.js} +7 -7
  92. package/dist/{chunk-7RY5VZPH.js → chunk-ZW4HH5JJ.js} +6 -6
  93. package/dist/cli/index.js +33 -32
  94. package/dist/{clio-IT3G3VQH.js → clio-7VB377CC.js} +7 -7
  95. package/dist/{code-nav-RK6S7F6E.js → code-nav-YVLCYA7V.js} +85 -17
  96. package/dist/{config-3QZRWZJF.js → config-4HVOS65E.js} +88 -43
  97. package/dist/{configure-FL7Y3KJF.js → configure-PIWO7B24.js} +10 -10
  98. package/dist/{context-5HE7ODYK.js → context-IYEHL3WQ.js} +33 -31
  99. package/dist/{context-XNHL75JV.js → context-KQYIWPWT.js} +47 -34
  100. package/dist/{context-KYQFRVDC.js → context-N6ZE3LGJ.js} +11 -11
  101. package/dist/{context-clear-N545L53A.js → context-clear-G4OGZJDS.js} +33 -31
  102. package/dist/{context-working-set-QHKXSV2F.js → context-working-set-BWLF6LJP.js} +7 -7
  103. package/dist/{dispatch-runner-RGIE5PCT.js → dispatch-runner-2QQAITS3.js} +38 -38
  104. package/dist/{docs-5NAF6AU7.js → docs-PD3EXDKU.js} +21 -20
  105. package/dist/{doctor-ZGPEGHIP.js → doctor-LHBD36VU.js} +23 -22
  106. package/dist/{eval-GXLL44RD.js → eval-C45FYRJ6.js} +21 -20
  107. package/dist/{eval-inventory-HBWSWQOK.js → eval-inventory-6DEJPLBF.js} +2 -2
  108. package/dist/{evidence-HWLBRH3Q.js → evidence-6SHONYAF.js} +30 -28
  109. package/dist/{evolve-FTZBMNVW.js → evolve-KRKMV72X.js} +30 -28
  110. package/dist/{extensions-VHRBEID7.js → extensions-KPZ2UHBB.js} +5 -3
  111. package/dist/{fleet-CKZHJWZJ.js → fleet-IVTCKDHT.js} +62 -61
  112. package/dist/{fleet-commands-EXDXBMV6.js → fleet-commands-EDWL3IT7.js} +5 -5
  113. package/dist/{fleet-decisions-OTHB6KRL.js → fleet-decisions-YP3YEFGK.js} +4 -4
  114. package/dist/{fleet-graph-YTEZUCUT.js → fleet-graph-ZFWKHY2M.js} +16 -14
  115. package/dist/{fleet-inspect-SS6YMDCK.js → fleet-inspect-FVUNCBML.js} +31 -29
  116. package/dist/{fleet-preflight-PBY4VYOM.js → fleet-preflight-UN5XED4R.js} +2 -2
  117. package/dist/{fleet-validate-KMEM5L3S.js → fleet-validate-XOWC4HSX.js} +17 -15
  118. package/dist/{fleet-verify-QD5M7E7Q.js → fleet-verify-UN3SODEL.js} +30 -28
  119. package/dist/{fleet-view-WAMJYNDT.js → fleet-view-TWHJKCN6.js} +31 -29
  120. package/dist/{init-5XQRBOFV.js → init-T2QORQ3Y.js} +50 -49
  121. package/dist/{interop-34TVO25M.js → interop-IN5I2A66.js} +5 -5
  122. package/dist/{library-3QY6KF57.js → library-LSCATDLZ.js} +15 -13
  123. package/dist/{memory-L4UTIIIW.js → memory-HYOKAGGJ.js} +31 -29
  124. package/dist/{models-ZVX3QOWE.js → models-2GPMFYCM.js} +22 -21
  125. package/dist/{monitor-CEKVSYTS.js → monitor-E4ASVUJH.js} +34 -32
  126. package/dist/{orchestrator-77BAP6BC.js → orchestrator-DDMPR3PY.js} +984 -583
  127. package/dist/{panes-7STHOAUJ.js → panes-E3RUXOW5.js} +4 -4
  128. package/dist/{panes-SHAUIRXY.js → panes-IXKLOKA2.js} +23 -8
  129. package/dist/{reset-EOLM7GVE.js → reset-OAQP3W4O.js} +4 -4
  130. package/dist/{resources-74GKTLSF.js → resources-OTRSN34L.js} +15 -13
  131. package/dist/{run-HBAUJNNZ.js → run-5DEYH5QK.js} +60 -59
  132. package/dist/{share-G3APVLVP.js → share-IHWTLO3M.js} +19 -15
  133. package/dist/{skills-35HHUKCR.js → skills-IYMXMKW4.js} +17 -15
  134. package/dist/{skills-eval-QN4HSHDC.js → skills-eval-DROHSJAR.js} +36 -36
  135. package/dist/{skills-inventory-J357J34F.js → skills-inventory-D7X4L4ZX.js} +15 -13
  136. package/dist/{slash-commands-JZZCQA32.js → slash-commands-QBM7UZ3B.js} +21 -18
  137. package/dist/{steer-XAVHJM22.js → steer-Z5DO23FJ.js} +2 -2
  138. package/dist/{targets-DSM6CY3M.js → targets-P2FUC4IL.js} +25 -28
  139. package/dist/{terminal-lease-JOPFUVEM.js → terminal-lease-YREJ3JX2.js} +5 -5
  140. package/dist/{tools-MKNWVPBH.js → tools-5B7RO6MV.js} +4 -4
  141. package/dist/{trace-ECQ7TIYZ.js → trace-YMGMUM6A.js} +55 -7
  142. package/dist/{upgrade-H7TOM7YL.js → upgrade-PXK3S2YM.js} +11 -9
  143. package/dist/{usage-X52N3IDJ.js → usage-ME5MPXGX.js} +36 -34
  144. package/dist/{verifiers-EJTVVSMA.js → verifiers-BVZ7IWOO.js} +5 -5
  145. package/dist/{verify-YJL6XET2.js → verify-5K7ZKQFC.js} +4 -4
  146. package/dist/{web-fetch-MPIFL3LL.js → web-fetch-MPARV2K7.js} +2 -2
  147. package/dist/{wiki-generate-4NDZTQ4B.js → wiki-generate-F5W5QTYY.js} +48 -47
  148. package/dist/{with-panes-OBOBFIIR.js → with-panes-BYOJCLAM.js} +51 -255
  149. package/dist/worker/entry.js +45 -30
  150. package/docs/README.md +176 -81
  151. package/docs/{acp.md → architecture/acp.md} +36 -20
  152. package/docs/{alcf-provider.md → architecture/alcf-provider.md} +8 -5
  153. package/docs/{architecture.md → architecture/architecture.md} +43 -22
  154. package/docs/{artifact-placement.md → architecture/artifact-placement.md} +26 -23
  155. package/docs/architecture/artifact-versions.md +90 -0
  156. package/docs/{capacity-and-scheduling.md → architecture/capacity-and-scheduling.md} +26 -13
  157. package/docs/{context-engine.md → architecture/context-engine.md} +25 -25
  158. package/docs/{context-working-set.md → architecture/context-working-set.md} +13 -10
  159. package/docs/{dispatch-architecture-rationale.md → architecture/dispatch-architecture-rationale.md} +12 -9
  160. package/docs/{dispatch-typed-intent.md → architecture/dispatch-typed-intent.md} +68 -46
  161. package/docs/{evidence-and-memory.md → architecture/evidence-and-memory.md} +23 -16
  162. package/docs/{middleware-and-components.md → architecture/middleware-and-components.md} +11 -5
  163. package/docs/{model-catalog.md → architecture/model-catalog.md} +40 -17
  164. package/docs/{observability.md → architecture/observability.md} +26 -13
  165. package/docs/{pi-boundary.md → architecture/pi-boundary.md} +24 -11
  166. package/docs/{prompt-envelope-and-tools.md → architecture/prompt-envelope-and-tools.md} +55 -20
  167. package/docs/{provider-adapter-cookbook.md → architecture/provider-adapter-cookbook.md} +35 -24
  168. package/docs/{safety-model.md → architecture/safety-model.md} +20 -15
  169. package/docs/{session-lifecycle.md → architecture/session-lifecycle.md} +8 -5
  170. package/docs/architecture/time-conventions.md +125 -0
  171. package/docs/{trace-store.md → architecture/trace-store.md} +13 -5
  172. package/docs/{tui-design.md → architecture/tui-design.md} +13 -13
  173. package/docs/{worker-dispatch-mechanics.md → architecture/worker-dispatch-mechanics.md} +27 -30
  174. package/docs/{built-in-agents.md → guide/built-in-agents.md} +50 -34
  175. package/docs/{commands-and-modes.md → guide/commands-and-modes.md} +65 -60
  176. package/docs/{configuration-and-targets.md → guide/configuration-and-targets.md} +227 -289
  177. package/docs/guide/configuration-reference.md +1158 -0
  178. package/docs/{environment-variables.md → guide/environment-variables.md} +31 -28
  179. package/docs/{exit-codes-and-output.md → guide/exit-codes-and-output.md} +6 -3
  180. package/docs/{extensions-and-sharing.md → guide/extensions-and-sharing.md} +41 -14
  181. package/docs/{fleet-dispatch.md → guide/fleet-dispatch.md} +39 -43
  182. package/docs/{glossary.md → guide/glossary.md} +14 -11
  183. package/docs/{installation-and-lifecycle.md → guide/installation-and-lifecycle.md} +44 -13
  184. package/docs/guide/panes-and-files.md +290 -0
  185. package/docs/{proactive-memory.md → guide/proactive-memory.md} +79 -66
  186. package/docs/{resource-library.md → guide/resource-library.md} +13 -4
  187. package/docs/{skills-marketplace.md → guide/skills-marketplace.md} +7 -3
  188. package/docs/{tool-usage.md → guide/tool-usage.md} +87 -23
  189. package/docs/{troubleshooting.md → guide/troubleshooting.md} +9 -4
  190. package/docs/{config-knobs-audit.md → history/config-knobs-audit.md} +11 -11
  191. package/docs/{release-cut-checklist.md → history/release-cut-checklist.md} +29 -2
  192. package/docs/{development-pipeline.md → process/development-pipeline.md} +24 -26
  193. package/docs/process/documentation-coverage.md +100 -0
  194. package/docs/process/documentation-guide.md +187 -0
  195. package/docs/{eval-runner.md → process/eval-runner.md} +41 -50
  196. package/docs/{evals-internal.md → process/evals-internal.md} +10 -10
  197. package/docs/{evolution.md → process/evolution.md} +2 -2
  198. package/docs/{fleet-demo-runbook.md → process/fleet-demo-runbook.md} +11 -7
  199. package/docs/{git-commit-provenance.md → process/git-commit-provenance.md} +11 -4
  200. package/docs/{performance-methodology.md → process/performance-methodology.md} +87 -69
  201. package/docs/{scientific-validation.md → process/scientific-validation.md} +4 -4
  202. package/evals/README.md +2 -2
  203. package/package.json +9 -7
  204. package/skills/README.md +46 -37
  205. package/skills/coding/ast-grep/SKILL.md +2 -2
  206. package/skills/coding/coding-standards/SKILL.md +2 -2
  207. package/skills/coding/prototype/SKILL.md +2 -2
  208. package/skills/coding/tdd/SKILL.md +2 -2
  209. package/skills/context/context-handoff/SKILL.md +2 -2
  210. package/skills/context/context-prime/SKILL.md +2 -2
  211. package/skills/git/file-ticket/SKILL.md +2 -2
  212. package/skills/git/fix-issue/SKILL.md +3 -3
  213. package/skills/git/resolve-merge-conflicts/SKILL.md +2 -2
  214. package/skills/git/ship/SKILL.md +2 -2
  215. package/skills/git/worktree-create/SKILL.md +2 -2
  216. package/skills/git/worktree-merge/SKILL.md +2 -2
  217. package/skills/meta/clio-coder-dev/SKILL.md +9 -5
  218. package/skills/meta/clio-coder-dev/evals.md +3 -2
  219. package/skills/meta/clio-coder-test/SKILL.md +102 -95
  220. package/skills/meta/clio-coder-test/evals.md +9 -4
  221. package/skills/meta/clio-coder-test/references/harness.md +100 -124
  222. package/skills/meta/clio-coder-test/references/test-map.md +77 -50
  223. package/skills/meta/credentials/SKILL.md +2 -2
  224. package/skills/meta/find-skills/SKILL.md +2 -2
  225. package/skills/meta/herdr/SKILL.md +2 -2
  226. package/skills/meta/skill-craft/SKILL.md +22 -16
  227. package/skills/planning/architecture/SKILL.md +2 -2
  228. package/skills/planning/backlog/SKILL.md +2 -2
  229. package/skills/planning/prd/SKILL.md +2 -2
  230. package/skills/planning/product-intent/SKILL.md +2 -2
  231. package/skills/planning/tech-spec/SKILL.md +2 -2
  232. package/skills/registry.yaml +62 -62
  233. package/skills/research/arxiv-literature/SKILL.md +2 -2
  234. package/skills/research/experiment-protocol/SKILL.md +2 -2
  235. package/skills/research/scientific-debugging/SKILL.md +2 -2
  236. package/skills/research/scientific-modernization/SKILL.md +2 -2
  237. package/skills/skill-marketplace.json +62 -62
  238. package/skills/workflow/cut-it/SKILL.md +2 -2
  239. package/skills/workflow/design-council/SKILL.md +2 -2
  240. package/skills/workflow/grill-me/SKILL.md +2 -2
  241. package/skills/workflow/workflow-distiller/SKILL.md +2 -2
  242. package/src/cli/args.ts +2 -2
  243. package/src/cli/bootstrap-generate.ts +1 -1
  244. package/src/cli/config-inspect.ts +65 -12
  245. package/src/cli/configure.ts +0 -4
  246. package/src/cli/docs.ts +22 -14
  247. package/src/cli/doctor-naming.ts +5 -5
  248. package/src/cli/doctor-toolchain.ts +3 -3
  249. package/src/cli/eval.ts +1 -2
  250. package/src/cli/extensions.ts +2 -1
  251. package/src/cli/fleet.ts +1 -1
  252. package/src/cli/index.ts +2 -1
  253. package/src/cli/internal-dispatch.ts +3 -4
  254. package/src/cli/panes.ts +19 -5
  255. package/src/cli/run.ts +2 -2
  256. package/src/cli/share.ts +5 -1
  257. package/src/cli/skills-eval.ts +3 -3
  258. package/src/cli/targets.ts +2 -6
  259. package/src/cli/trace.ts +55 -4
  260. package/src/cli/wiki-generate.ts +1 -1
  261. package/src/core/artifact-paths.ts +1 -1
  262. package/src/core/bash-exec.ts +131 -86
  263. package/src/core/bus-events.ts +51 -6
  264. package/src/core/config.ts +5 -1
  265. package/src/core/defaults.ts +7 -4
  266. package/src/core/dispatch-outcome.ts +16 -0
  267. package/src/core/guardrails.ts +10 -49
  268. package/src/core/prompt-hint.ts +9 -0
  269. package/src/domains/agents/builtins/architect.md +2 -3
  270. package/src/domains/agents/builtins/coder.md +3 -2
  271. package/src/domains/agents/builtins/debugger.md +2 -2
  272. package/src/domains/agents/builtins/documenter.md +2 -2
  273. package/src/domains/agents/builtins/git-master.md +1 -1
  274. package/src/domains/agents/builtins/oracle.md +1 -1
  275. package/src/domains/agents/builtins/provenance.md +1 -1
  276. package/src/domains/agents/builtins/researcher.md +1 -1
  277. package/src/domains/agents/builtins/scout.md +1 -1
  278. package/src/domains/agents/builtins/tester.md +2 -2
  279. package/src/domains/agents/builtins/verifier.md +2 -2
  280. package/src/domains/agents/builtins/wiki-writer.md +1 -1
  281. package/src/domains/agents/catalog.ts +12 -14
  282. package/src/domains/agents/contract.ts +2 -0
  283. package/src/domains/agents/extension.ts +23 -1
  284. package/src/domains/config/keybindings.ts +8 -0
  285. package/src/domains/context/extension.ts +0 -3
  286. package/src/domains/context/working-set/path-index.ts +1 -0
  287. package/src/domains/dispatch/capability-match.ts +10 -0
  288. package/src/domains/dispatch/extension.ts +105 -22
  289. package/src/domains/dispatch/host-verification.ts +435 -39
  290. package/src/domains/dispatch/intent-requirements.ts +10 -0
  291. package/src/domains/dispatch/intent.ts +18 -1
  292. package/src/domains/dispatch/path-scope.ts +235 -24
  293. package/src/domains/dispatch/run-event-journal.ts +4 -15
  294. package/src/domains/dispatch/state.ts +2 -3
  295. package/src/domains/dispatch/transport.ts +45 -21
  296. package/src/domains/dispatch/types.ts +55 -3
  297. package/src/domains/eval/artifacts/store.ts +5 -0
  298. package/src/domains/eval/store.ts +8 -1
  299. package/src/domains/evidence/trust-status.ts +10 -1
  300. package/src/domains/extensions/contract.ts +15 -1
  301. package/src/domains/extensions/discovery.ts +238 -41
  302. package/src/domains/extensions/extension.ts +105 -6
  303. package/src/domains/extensions/index.ts +24 -0
  304. package/src/domains/extensions/integrity.ts +189 -0
  305. package/src/domains/extensions/manager.ts +17 -1
  306. package/src/domains/extensions/resource-path.ts +27 -0
  307. package/src/domains/extensions/resources.ts +18 -38
  308. package/src/domains/extensions/snapshot-store.ts +39 -0
  309. package/src/domains/extensions/snapshot.ts +180 -0
  310. package/src/domains/extensions/state.ts +385 -57
  311. package/src/domains/extensions/types.ts +118 -1
  312. package/src/domains/lifecycle/migrations/2026-09-01-extension-install-digests.ts +27 -0
  313. package/src/domains/lifecycle/migrations/index.ts +2 -0
  314. package/src/domains/lifecycle/naming-resources.ts +19 -4
  315. package/src/domains/lifecycle/naming-yazi.ts +10 -5
  316. package/src/domains/middleware/contract.ts +26 -0
  317. package/src/domains/middleware/extension.ts +24 -24
  318. package/src/domains/middleware/hook-receipts.ts +27 -4
  319. package/src/domains/middleware/hooks-io.ts +65 -32
  320. package/src/domains/middleware/hooks.ts +64 -0
  321. package/src/domains/middleware/index.ts +28 -4
  322. package/src/domains/middleware/registrations.ts +326 -0
  323. package/src/domains/middleware/runtime.ts +28 -0
  324. package/src/domains/middleware/snapshot.ts +20 -7
  325. package/src/domains/mux/contract.ts +38 -0
  326. package/src/domains/mux/detect.ts +6 -13
  327. package/src/domains/mux/index.ts +1 -1
  328. package/src/domains/mux/operations.ts +44 -5
  329. package/src/domains/mux/yazi/assets/yazi.toml +2 -2
  330. package/src/domains/mux/yazi/session.ts +53 -4
  331. package/src/domains/mux/yazi/theme.ts +117 -17
  332. package/src/domains/observability/contract.ts +10 -11
  333. package/src/domains/observability/extension.ts +11 -3
  334. package/src/domains/observability/projection.ts +14 -90
  335. package/src/domains/observability/trace-store.ts +43 -7
  336. package/src/domains/prompts/compiler.ts +73 -53
  337. package/src/domains/prompts/contract.ts +15 -3
  338. package/src/domains/prompts/extension.ts +97 -9
  339. package/src/domains/prompts/fragments/identity/clio-worker.md +1 -3
  340. package/src/domains/prompts/fragments/identity/clio.md +6 -12
  341. package/src/domains/prompts/fragments/identity/docs-routing.md +1 -2
  342. package/src/domains/prompts/fragments/identity/self-awareness.md +3 -11
  343. package/src/domains/prompts/fragments/operating/contract.md +7 -15
  344. package/src/domains/prompts/fragments/operating/delegation.md +32 -34
  345. package/src/domains/prompts/fragments/operating/skills.md +10 -24
  346. package/src/domains/prompts/fragments/operating/worker.md +1 -8
  347. package/src/domains/providers/index.ts +1 -1
  348. package/src/domains/providers/model-runtime-capabilities.ts +85 -21
  349. package/src/domains/providers/models/local-models/clio-coder-local-coding-targets.yaml +669 -104
  350. package/src/domains/providers/runtime-resolution.ts +31 -0
  351. package/src/domains/providers/runtimes/common/probe-helpers.ts +7 -2
  352. package/src/domains/providers/runtimes/local-native/llamacpp.ts +9 -1
  353. package/src/domains/providers/types/cost-provenance.ts +19 -0
  354. package/src/domains/providers/types/local-model-quirks.ts +85 -37
  355. package/src/domains/resources/skills/loader.ts +16 -19
  356. package/src/domains/safety/call-target.ts +1 -1
  357. package/src/domains/safety/loop-detector.ts +7 -4
  358. package/src/domains/session/task-board.ts +10 -9
  359. package/src/domains/share/archive.ts +164 -7
  360. package/src/engine/acp/server.ts +62 -9
  361. package/src/engine/apis/llamacpp-residency.ts +3 -4
  362. package/src/engine/apis/lmstudio.ts +3 -3
  363. package/src/engine/apis/ollama-native.ts +6 -6
  364. package/src/engine/apis/openai-completions.ts +28 -25
  365. package/src/engine/apis/output-budget.ts +8 -18
  366. package/src/engine/apis/residency.ts +8 -27
  367. package/src/engine/gemma-channel-filter.ts +19 -0
  368. package/src/engine/loop-guard.ts +92 -12
  369. package/src/engine/worker-runtime.ts +40 -11
  370. package/src/engine/worker-tools.ts +3 -1
  371. package/src/entry/extension-hook-sources.ts +28 -0
  372. package/src/entry/extension-reload.ts +309 -0
  373. package/src/entry/orchestrator.ts +59 -35
  374. package/src/interactive/application-controller.ts +2 -1
  375. package/src/interactive/bus-notices.ts +8 -1
  376. package/src/interactive/chat-loop-messages.ts +3 -13
  377. package/src/interactive/chat-loop.ts +10 -1
  378. package/src/interactive/chat-panel.ts +36 -13
  379. package/src/interactive/chat-renderer.ts +71 -7
  380. package/src/interactive/dispatch-board.ts +6 -11
  381. package/src/interactive/footer/widgets.ts +13 -0
  382. package/src/interactive/interactive-application.ts +39 -4
  383. package/src/interactive/interactive-input-runtime.ts +4 -0
  384. package/src/interactive/interactive-presentation.ts +2 -2
  385. package/src/interactive/interactive-slash-runtime.ts +2 -0
  386. package/src/interactive/overlays/extensions.ts +9 -1
  387. package/src/interactive/overlays/help-reference.ts +13 -0
  388. package/src/interactive/overlays/settings.ts +27 -16
  389. package/src/interactive/panes-runtime.ts +111 -35
  390. package/src/interactive/prompt-cache-identity.ts +88 -0
  391. package/src/interactive/slash-commands.ts +129 -14
  392. package/src/interactive/stream-pacing-policy.ts +0 -23
  393. package/src/interactive/turn-context.ts +30 -15
  394. package/src/interactive/yazi-bridge.ts +60 -6
  395. package/src/tools/agent-tools.ts +30 -1
  396. package/src/tools/artifact.ts +2 -2
  397. package/src/tools/ask-user.ts +3 -3
  398. package/src/tools/bash.ts +1 -1
  399. package/src/tools/bootstrap.ts +4 -0
  400. package/src/tools/builtin-tool-catalog.ts +52 -22
  401. package/src/tools/codewiki/code-nav-surface.ts +6 -0
  402. package/src/tools/codewiki/code-nav.ts +99 -13
  403. package/src/tools/context/docs-engine.ts +20 -7
  404. package/src/tools/context/index.ts +29 -12
  405. package/src/tools/core-bootstrap.ts +28 -6
  406. package/src/tools/credential-present.ts +1 -2
  407. package/src/tools/dispatch-arguments.ts +5 -1
  408. package/src/tools/dispatch-plan.ts +48 -4
  409. package/src/tools/dispatch-run-events.ts +1 -1
  410. package/src/tools/dispatch-schema.ts +338 -0
  411. package/src/tools/dispatch-types.ts +3 -0
  412. package/src/tools/dispatch.ts +9 -254
  413. package/src/tools/ledger.ts +3 -5
  414. package/src/tools/monitor-surface.ts +5 -13
  415. package/src/tools/observation.ts +4 -5
  416. package/src/tools/panes-surface.ts +4 -11
  417. package/src/tools/panes.ts +4 -2
  418. package/src/tools/policy.ts +15 -2
  419. package/src/tools/read.ts +5 -6
  420. package/src/tools/registry.ts +30 -7
  421. package/src/tools/result-shaping.ts +18 -14
  422. package/src/tools/steer-surface.ts +1 -1
  423. package/src/tools/tasks.ts +1 -1
  424. package/src/tools/truncate.ts +6 -5
  425. package/src/tools/verify/surface.ts +6 -12
  426. package/src/tools/web-fetch-surface.ts +1 -3
  427. package/dist/chunk-5QIAJV2D.js +0 -48
  428. package/dist/chunk-JZWT5J3Y.js +0 -814
  429. package/dist/chunk-K7VKOLQQ.js +0 -15
  430. package/dist/chunk-PMZCIOCJ.js +0 -25
  431. package/dist/chunk-SUW5DORT.js +0 -819
  432. package/dist/chunk-UOV2BYIW.js +0 -107
  433. package/dist/chunk-WR6U3OVP.js +0 -45
  434. package/docs/artifact-versions.md +0 -67
  435. package/docs/documentation-coverage.md +0 -46
  436. package/docs/documentation-guide.md +0 -167
  437. package/docs/time-conventions.md +0 -101
@@ -1,819 +0,0 @@
1
- import { createRequire as __clioCreateRequire } from "node:module"; const require = __clioCreateRequire(import.meta.url);
2
- import {
3
- getVersionInfo
4
- } from "./chunk-XPLRXC72.js";
5
- import {
6
- require_dist
7
- } from "./chunk-APJ265NV.js";
8
- import {
9
- clioConfigDir
10
- } from "./chunk-BYP5D4HI.js";
11
- import {
12
- safeResourceWrite
13
- } from "./chunk-WEPFGWHJ.js";
14
- import {
15
- __toESM,
16
- init_esm_shims
17
- } from "./chunk-3R73A4XB.js";
18
-
19
- // src/domains/extensions/discovery.ts
20
- init_esm_shims();
21
- var import_yaml = __toESM(require_dist(), 1);
22
- import { existsSync, lstatSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
23
- import path from "node:path";
24
-
25
- // src/domains/extensions/compatibility.ts
26
- init_esm_shims();
27
- var MAX_RANGE_CHARS = 256;
28
- var NUMERIC = "(?:0|[1-9]\\d*)";
29
- var IDENTIFIER = "[0-9A-Za-z-]+";
30
- var VERSION_RE = new RegExp(
31
- `^v?(${NUMERIC})\\.(${NUMERIC})\\.(${NUMERIC})(?:-(${IDENTIFIER}(?:\\.${IDENTIFIER})*))?(?:\\+${IDENTIFIER}(?:\\.${IDENTIFIER})*)?$`
32
- );
33
- var PARTIAL_RE = new RegExp(
34
- `^v?(${NUMERIC}|[xX*])(?:\\.(${NUMERIC}|[xX*]))?(?:\\.(${NUMERIC}|[xX*]))?(?:-(${IDENTIFIER}(?:\\.${IDENTIFIER})*))?(?:\\+${IDENTIFIER}(?:\\.${IDENTIFIER})*)?$`
35
- );
36
- function prerelease(value) {
37
- if (value === void 0) return [];
38
- const out = [];
39
- for (const identifier of value.split(".")) {
40
- if (identifier.length === 0) return null;
41
- if (/^\d+$/u.test(identifier)) {
42
- if (identifier.length > 1 && identifier.startsWith("0")) return null;
43
- const parsed = Number(identifier);
44
- if (!Number.isSafeInteger(parsed)) return null;
45
- out.push(parsed);
46
- } else {
47
- out.push(identifier);
48
- }
49
- }
50
- return out;
51
- }
52
- function parseSemVer(value) {
53
- const match = VERSION_RE.exec(value);
54
- if (match === null) return null;
55
- const parsedPrerelease = prerelease(match[4]);
56
- if (parsedPrerelease === null) return null;
57
- const major = Number(match[1]);
58
- const minor = Number(match[2]);
59
- const patch = Number(match[3]);
60
- if (![major, minor, patch].every(Number.isSafeInteger)) return null;
61
- return { major, minor, patch, prerelease: parsedPrerelease };
62
- }
63
- function parsePart(value) {
64
- if (value === void 0 || value === "x" || value === "X" || value === "*") return null;
65
- const parsed = Number(value);
66
- return Number.isSafeInteger(parsed) ? parsed : null;
67
- }
68
- function parsePartial(value) {
69
- const match = PARTIAL_RE.exec(value);
70
- if (match === null) return null;
71
- for (const part of match.slice(1, 4)) {
72
- if (part === void 0 || part === "x" || part === "X" || part === "*") continue;
73
- if (!Number.isSafeInteger(Number(part))) return null;
74
- }
75
- const major = parsePart(match[1]);
76
- const minor = parsePart(match[2]);
77
- const patch = parsePart(match[3]);
78
- if (major === null && (match[2] !== void 0 || match[3] !== void 0) || minor === null && match[3] !== void 0) {
79
- return null;
80
- }
81
- const parsedPrerelease = prerelease(match[4]);
82
- if (parsedPrerelease === null) return null;
83
- if (parsedPrerelease.length > 0 && (major === null || minor === null || patch === null)) return null;
84
- return { major, minor, patch, prerelease: parsedPrerelease };
85
- }
86
- function compareIdentifiers(left, right) {
87
- if (left === right) return 0;
88
- if (typeof left === "number" && typeof right === "number") return left < right ? -1 : 1;
89
- if (typeof left === "number") return -1;
90
- if (typeof right === "number") return 1;
91
- return left < right ? -1 : 1;
92
- }
93
- function compare(left, right) {
94
- for (const key of ["major", "minor", "patch"]) {
95
- if (left[key] !== right[key]) return left[key] < right[key] ? -1 : 1;
96
- }
97
- if (left.prerelease.length === 0 || right.prerelease.length === 0) {
98
- if (left.prerelease.length === right.prerelease.length) return 0;
99
- return left.prerelease.length === 0 ? 1 : -1;
100
- }
101
- const length = Math.max(left.prerelease.length, right.prerelease.length);
102
- for (let index = 0; index < length; index += 1) {
103
- const leftPart = left.prerelease[index];
104
- const rightPart = right.prerelease[index];
105
- if (leftPart === void 0 || rightPart === void 0) {
106
- if (leftPart === rightPart) return 0;
107
- return leftPart === void 0 ? -1 : 1;
108
- }
109
- const order = compareIdentifiers(leftPart, rightPart);
110
- if (order !== 0) return order;
111
- }
112
- return 0;
113
- }
114
- function floor(partial) {
115
- return {
116
- major: partial.major ?? 0,
117
- minor: partial.minor ?? 0,
118
- patch: partial.patch ?? 0,
119
- prerelease: partial.prerelease
120
- };
121
- }
122
- function nextWildcard(partial) {
123
- if (partial.major === null) return null;
124
- if (partial.minor === null) return { major: partial.major + 1, minor: 0, patch: 0, prerelease: [] };
125
- if (partial.patch === null) return { major: partial.major, minor: partial.minor + 1, patch: 0, prerelease: [] };
126
- return null;
127
- }
128
- function lowerBound(version, inclusive) {
129
- return (candidate) => inclusive ? compare(candidate, version) >= 0 : compare(candidate, version) > 0;
130
- }
131
- function upperBound(version, inclusive) {
132
- return (candidate) => inclusive ? compare(candidate, version) <= 0 : compare(candidate, version) < 0;
133
- }
134
- function core(version) {
135
- return `${version.major}.${version.minor}.${version.patch}`;
136
- }
137
- function predicatesForToken(token) {
138
- const match = /^(<=|>=|<|>|=|~|\^)?(.+)$/u.exec(token);
139
- if (match === null) return null;
140
- const operator = match[1] ?? "";
141
- const partial = parsePartial(match[2] ?? "");
142
- if (partial === null) return null;
143
- const base = floor(partial);
144
- const wildcardUpper = nextWildcard(partial);
145
- const prereleaseCore = partial.prerelease.length > 0 ? core(base) : null;
146
- if (operator === "" || operator === "=") {
147
- if (partial.major === null) return { predicates: [], prereleaseCore };
148
- if (wildcardUpper !== null) {
149
- return { predicates: [lowerBound(base, true), upperBound(wildcardUpper, false)], prereleaseCore };
150
- }
151
- return { predicates: [(candidate) => compare(candidate, base) === 0], prereleaseCore };
152
- }
153
- if (operator === ">=") return { predicates: [lowerBound(base, true)], prereleaseCore };
154
- if (operator === "<") return { predicates: [upperBound(base, false)], prereleaseCore };
155
- if (operator === ">") {
156
- return {
157
- predicates: [wildcardUpper === null ? lowerBound(base, false) : lowerBound(wildcardUpper, true)],
158
- prereleaseCore
159
- };
160
- }
161
- if (operator === "<=") {
162
- return {
163
- predicates: [wildcardUpper === null ? upperBound(base, true) : upperBound(wildcardUpper, false)],
164
- prereleaseCore
165
- };
166
- }
167
- if (partial.major === null) return { predicates: [], prereleaseCore };
168
- if (operator === "~") {
169
- const upper2 = partial.minor === null ? { major: partial.major + 1, minor: 0, patch: 0, prerelease: [] } : { major: partial.major, minor: partial.minor + 1, patch: 0, prerelease: [] };
170
- return { predicates: [lowerBound(base, true), upperBound(upper2, false)], prereleaseCore };
171
- }
172
- const upper = partial.major > 0 ? { major: partial.major + 1, minor: 0, patch: 0, prerelease: [] } : partial.minor === null ? { major: 1, minor: 0, patch: 0, prerelease: [] } : (partial.minor ?? 0) > 0 ? { major: 0, minor: (partial.minor ?? 0) + 1, patch: 0, prerelease: [] } : partial.patch === null ? { major: 0, minor: 1, patch: 0, prerelease: [] } : { major: 0, minor: 0, patch: (partial.patch ?? 0) + 1, prerelease: [] };
173
- return { predicates: [lowerBound(base, true), upperBound(upper, false)], prereleaseCore };
174
- }
175
- function predicatesForSet(raw) {
176
- const hyphen = /^(\S+)\s+-\s+(\S+)$/u.exec(raw);
177
- if (hyphen !== null) {
178
- const left = parsePartial(hyphen[1] ?? "");
179
- const right = parsePartial(hyphen[2] ?? "");
180
- if (left === null || right === null || left.major === null || right.major === null) return null;
181
- const rightUpper = nextWildcard(right);
182
- return {
183
- predicates: [
184
- lowerBound(floor(left), true),
185
- rightUpper === null ? upperBound(floor(right), true) : upperBound(rightUpper, false)
186
- ],
187
- prereleaseCores: new Set(
188
- [
189
- left.prerelease.length > 0 ? core(floor(left)) : null,
190
- right.prerelease.length > 0 ? core(floor(right)) : null
191
- ].filter((entry) => entry !== null)
192
- )
193
- };
194
- }
195
- const normalized = raw.replace(/(<=|>=|<|>|=|~|\^)\s+/gu, "$1");
196
- const tokens = normalized.split(/\s+/u).filter((entry) => entry.length > 0);
197
- if (tokens.length === 0) return null;
198
- const predicates = [];
199
- const prereleaseCores = /* @__PURE__ */ new Set();
200
- for (const token of tokens) {
201
- const parsed = predicatesForToken(token);
202
- if (parsed === null) return null;
203
- predicates.push(...parsed.predicates);
204
- if (parsed.prereleaseCore !== null) prereleaseCores.add(parsed.prereleaseCore);
205
- }
206
- return { predicates, prereleaseCores };
207
- }
208
- function parseRange(range) {
209
- const trimmed = range.trim();
210
- if (trimmed.length === 0 || trimmed.length > MAX_RANGE_CHARS) return null;
211
- const sets = trimmed.split("||");
212
- if (sets.some((set) => set.trim().length === 0)) return null;
213
- const parsed = sets.map((set) => predicatesForSet(set.trim()));
214
- return parsed.every((set) => set !== null) ? parsed : null;
215
- }
216
- function isValidSemVerRange(range) {
217
- return parseRange(range) !== null;
218
- }
219
- function satisfiesSemVerRange(version, range) {
220
- const candidate = parseSemVer(version);
221
- const sets = parseRange(range);
222
- if (candidate === null || sets === null) return false;
223
- return sets.some((set) => {
224
- if (candidate.prerelease.length > 0 && !set.prereleaseCores.has(core(candidate))) return false;
225
- return set.predicates.every((predicate) => predicate(candidate));
226
- });
227
- }
228
- function evaluateClioCompatibility(range, runningVersion = getVersionInfo().clio) {
229
- const rangeValid = isValidSemVerRange(range);
230
- return {
231
- rangeValid,
232
- satisfied: rangeValid && satisfiesSemVerRange(runningVersion, range),
233
- runningVersion
234
- };
235
- }
236
-
237
- // src/domains/extensions/discovery.ts
238
- var MANIFEST_NAMES = ["clio-coder-extension.yaml", "clio-coder-extension.yml", "clio-coder-extension.json"];
239
- function isRecord(value) {
240
- return typeof value === "object" && value !== null && !Array.isArray(value);
241
- }
242
- function trimString(value) {
243
- if (typeof value !== "string") return void 0;
244
- const trimmed = value.trim();
245
- return trimmed.length > 0 ? trimmed : void 0;
246
- }
247
- function validateId(id) {
248
- if (id.length > 80) return "id exceeds 80 characters";
249
- if (!/^[a-z0-9][a-z0-9._-]*[a-z0-9]$/.test(id)) {
250
- return "id must use lowercase letters, numbers, dots, underscores, or hyphens and start/end alphanumeric";
251
- }
252
- return null;
253
- }
254
- function readJsonOrYaml(filePath) {
255
- const raw = readFileSync(filePath, "utf8");
256
- if (filePath.endsWith(".json")) return JSON.parse(raw);
257
- return (0, import_yaml.parse)(raw);
258
- }
259
- function normalizeResources(value) {
260
- if (!isRecord(value)) return {};
261
- const out = {};
262
- const skills = trimString(value.skills);
263
- const prompts = trimString(value.prompts);
264
- const agents = trimString(value.agents);
265
- const fleets = trimString(value.fleets);
266
- const themes = trimString(value.themes);
267
- if (skills) out.skills = skills;
268
- if (prompts) out.prompts = prompts;
269
- if (agents) out.agents = agents;
270
- if (fleets) out.fleets = fleets;
271
- if (themes) out.themes = themes;
272
- return out;
273
- }
274
- function contained(root, candidate) {
275
- const relative = path.relative(root, candidate);
276
- return relative === "" || !relative.startsWith(`..${path.sep}`) && relative !== ".." && !path.isAbsolute(relative);
277
- }
278
- function validateResourceTree(root, resourcePath, kind, diagnostics) {
279
- if (path.isAbsolute(resourcePath)) {
280
- diagnostics.push({ type: "error", message: `resources.${kind} must be relative`, path: resourcePath });
281
- return;
282
- }
283
- const resolvedRoot = path.resolve(root);
284
- const resolved = path.resolve(resolvedRoot, resourcePath);
285
- if (!contained(resolvedRoot, resolved) || resolved === resolvedRoot) {
286
- diagnostics.push({ type: "error", message: `resources.${kind} escapes the extension root`, path: resourcePath });
287
- return;
288
- }
289
- let canonicalRoot;
290
- let canonicalResource;
291
- try {
292
- canonicalRoot = realpathSync(resolvedRoot);
293
- canonicalResource = realpathSync(resolved);
294
- if (!lstatSync(resolved).isDirectory()) {
295
- diagnostics.push({ type: "error", message: `resources.${kind} is not a directory`, path: resolved });
296
- return;
297
- }
298
- } catch (error) {
299
- diagnostics.push({
300
- type: "error",
301
- message: `resources.${kind} cannot be resolved: ${error instanceof Error ? error.message : String(error)}`,
302
- path: resolved
303
- });
304
- return;
305
- }
306
- if (!contained(canonicalRoot, canonicalResource)) {
307
- diagnostics.push({ type: "error", message: `resources.${kind} escapes through a symbolic link`, path: resolved });
308
- return;
309
- }
310
- const pending = [resolved];
311
- while (pending.length > 0) {
312
- const directory = pending.pop();
313
- if (!directory) continue;
314
- for (const entry of readdirSync(directory, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
315
- const candidate = path.join(directory, entry.name);
316
- if (entry.isSymbolicLink()) {
317
- try {
318
- if (!contained(canonicalRoot, realpathSync(candidate))) {
319
- diagnostics.push({
320
- type: "error",
321
- message: `resources.${kind} contains an escaping symbolic link`,
322
- path: candidate
323
- });
324
- }
325
- } catch (error) {
326
- diagnostics.push({
327
- type: "error",
328
- message: `resources.${kind} contains an unresolved symbolic link: ${error instanceof Error ? error.message : String(error)}`,
329
- path: candidate
330
- });
331
- }
332
- } else if (entry.isDirectory()) {
333
- pending.push(candidate);
334
- }
335
- }
336
- }
337
- }
338
- function validateResourceRoots(root, resources, diagnostics) {
339
- for (const [kind, resourcePath] of Object.entries(resources)) {
340
- if (resourcePath) validateResourceTree(root, resourcePath, kind, diagnostics);
341
- }
342
- }
343
- function stringArray(value) {
344
- if (!Array.isArray(value)) return void 0;
345
- const out = value.map((entry) => trimString(entry)).filter((entry) => entry !== void 0);
346
- return out.length > 0 ? out : void 0;
347
- }
348
- function parseExtensionManifest(value, manifestPath) {
349
- const diagnostics = [];
350
- if (!isRecord(value)) {
351
- return { diagnostics: [{ type: "error", message: "extension manifest must be an object", path: manifestPath }] };
352
- }
353
- if (value.manifestVersion !== 1) {
354
- diagnostics.push({ type: "error", message: "manifestVersion must be 1", path: manifestPath });
355
- }
356
- const id = trimString(value.id);
357
- const name = trimString(value.name) ?? id;
358
- const version = trimString(value.version);
359
- const description = trimString(value.description);
360
- if (!id) diagnostics.push({ type: "error", message: "id is required", path: manifestPath });
361
- else {
362
- const idError = validateId(id);
363
- if (idError) diagnostics.push({ type: "error", message: idError, path: manifestPath });
364
- }
365
- if (!version) diagnostics.push({ type: "error", message: "version is required", path: manifestPath });
366
- if (!description) diagnostics.push({ type: "error", message: "description is required", path: manifestPath });
367
- const resources = normalizeResources(value.resources);
368
- const tools = stringArray(value.tools);
369
- const settings = stringArray(value.settings);
370
- let compatibility;
371
- if (value.compatibility !== void 0) {
372
- if (!isRecord(value.compatibility)) {
373
- diagnostics.push({ type: "error", message: "compatibility must be an object", path: manifestPath });
374
- } else if ("clio" in value.compatibility) {
375
- const range = trimString(value.compatibility.clio);
376
- if (range === void 0) {
377
- diagnostics.push({
378
- type: "error",
379
- message: "compatibility.clio must be a non-empty semver range",
380
- path: manifestPath
381
- });
382
- } else {
383
- const evaluation = evaluateClioCompatibility(range);
384
- if (!evaluation.rangeValid) {
385
- diagnostics.push({
386
- type: "error",
387
- message: `extension ${id ?? "<unknown>"} declares malformed compatibility.clio range '${range}'`,
388
- path: manifestPath
389
- });
390
- } else {
391
- compatibility = { clio: range };
392
- }
393
- }
394
- }
395
- }
396
- if (!id || !name || !version || !description || diagnostics.some((diag) => diag.type === "error")) {
397
- return { diagnostics };
398
- }
399
- const manifest = {
400
- manifestVersion: 1,
401
- id,
402
- name,
403
- version,
404
- description,
405
- resources
406
- };
407
- if (tools) manifest.tools = tools;
408
- if (settings) manifest.settings = settings;
409
- if (compatibility && Object.keys(compatibility).length > 0) manifest.compatibility = compatibility;
410
- const clioRange = manifest.compatibility?.clio;
411
- if (clioRange !== void 0) {
412
- const evaluation = evaluateClioCompatibility(clioRange);
413
- if (!evaluation.satisfied) {
414
- diagnostics.push({
415
- type: "error",
416
- message: `extension ${manifest.id} requires Clio '${clioRange}', but running Clio version is '${evaluation.runningVersion}'`,
417
- path: manifestPath
418
- });
419
- }
420
- }
421
- return { manifest, diagnostics };
422
- }
423
- function findExtensionManifestPath(root) {
424
- for (const name of MANIFEST_NAMES) {
425
- const candidate = path.join(root, name);
426
- try {
427
- if (statSync(candidate).isFile()) return candidate;
428
- } catch {
429
- }
430
- }
431
- return null;
432
- }
433
- function loadManifestFromRoot(root) {
434
- const manifestPath = findExtensionManifestPath(root);
435
- if (!manifestPath) {
436
- return {
437
- path: root,
438
- valid: false,
439
- diagnostics: [{ type: "error", message: "extension manifest not found", path: root }]
440
- };
441
- }
442
- try {
443
- const parsed = parseExtensionManifest(readJsonOrYaml(manifestPath), manifestPath);
444
- if (parsed.manifest) validateResourceRoots(root, parsed.manifest.resources, parsed.diagnostics);
445
- return {
446
- path: root,
447
- manifestPath,
448
- ...parsed.manifest ? { manifest: parsed.manifest } : {},
449
- valid: parsed.manifest !== void 0 && !parsed.diagnostics.some((diag) => diag.type === "error"),
450
- diagnostics: parsed.diagnostics
451
- };
452
- } catch (err) {
453
- const reason = err instanceof Error ? err.message : String(err);
454
- return {
455
- path: root,
456
- manifestPath,
457
- valid: false,
458
- diagnostics: [{ type: "error", message: `extension manifest could not be read: ${reason}`, path: manifestPath }]
459
- };
460
- }
461
- }
462
- function discoverExtensionPackages(root) {
463
- const full = path.resolve(root);
464
- if (!existsSync(full)) {
465
- return [{ path: full, valid: false, diagnostics: [{ type: "error", message: "path does not exist", path: full }] }];
466
- }
467
- const stat = statSync(full);
468
- if (!stat.isDirectory()) {
469
- return [
470
- {
471
- path: full,
472
- valid: false,
473
- diagnostics: [{ type: "error", message: "extension path is not a directory", path: full }]
474
- }
475
- ];
476
- }
477
- const direct = loadManifestFromRoot(full);
478
- if (direct.valid || direct.manifestPath) return [direct];
479
- const candidates = [];
480
- for (const entry of readdirSync(full, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
481
- if (!entry.isDirectory() || entry.name.startsWith(".")) continue;
482
- const child = path.join(full, entry.name);
483
- const loaded = loadManifestFromRoot(child);
484
- if (loaded.valid || loaded.manifestPath) candidates.push(loaded);
485
- }
486
- const discovered = candidates.length > 0 ? candidates : [direct];
487
- const ids = /* @__PURE__ */ new Map();
488
- for (const candidate of discovered) {
489
- const id = candidate.manifest?.id;
490
- if (!id) continue;
491
- const group = ids.get(id) ?? [];
492
- group.push(candidate);
493
- ids.set(id, group);
494
- }
495
- for (const [id, group] of ids) {
496
- if (group.length < 2) continue;
497
- for (const candidate of group) {
498
- candidate.valid = false;
499
- candidate.diagnostics.push({
500
- type: "error",
501
- message: `duplicate extension id ${id}`,
502
- path: candidate.manifestPath ?? candidate.path
503
- });
504
- }
505
- }
506
- return discovered;
507
- }
508
-
509
- // src/domains/extensions/state.ts
510
- init_esm_shims();
511
- import { cpSync, existsSync as existsSync2, mkdirSync, readdirSync as readdirSync2, readFileSync as readFileSync2, renameSync, rmSync } from "node:fs";
512
- import path2 from "node:path";
513
- var DEFAULT_STATE = { version: 1, disabled: [], installed: {} };
514
- function extensionBaseDir(scope, cwd = process.cwd()) {
515
- return scope === "user" ? path2.join(clioConfigDir(), "extensions") : path2.join(path2.resolve(cwd), ".clio-coder", "extensions");
516
- }
517
- function statePath(scope, cwd = process.cwd()) {
518
- return path2.join(extensionBaseDir(scope, cwd), "state.json");
519
- }
520
- function scopeRank(scope) {
521
- return scope === "project" ? 2 : 1;
522
- }
523
- function readState(scope, cwd = process.cwd()) {
524
- const filePath = statePath(scope, cwd);
525
- if (!existsSync2(filePath)) return structuredClone(DEFAULT_STATE);
526
- try {
527
- const parsed = JSON.parse(readFileSync2(filePath, "utf8"));
528
- if (!isRecord(parsed) || parsed.version !== 1) return structuredClone(DEFAULT_STATE);
529
- const disabled = Array.isArray(parsed.disabled) ? parsed.disabled.filter((entry) => typeof entry === "string") : [];
530
- const installed = isRecord(parsed.installed) ? Object.fromEntries(
531
- Object.entries(parsed.installed).flatMap(([id, raw]) => {
532
- if (!isRecord(raw)) return [];
533
- const installedAt = trimString(raw.installedAt) ?? (/* @__PURE__ */ new Date(0)).toISOString();
534
- const source = trimString(raw.source);
535
- return [[id, { installedAt, ...source ? { source } : {} }]];
536
- })
537
- ) : {};
538
- return { version: 1, disabled, installed };
539
- } catch {
540
- return structuredClone(DEFAULT_STATE);
541
- }
542
- }
543
- function writeState(scope, state, cwd = process.cwd()) {
544
- const filePath = statePath(scope, cwd);
545
- safeResourceWrite(filePath, `${JSON.stringify(state, null, 2)}
546
- `, { encoding: "utf8" });
547
- }
548
- function installedFromRoot(root, scope, state) {
549
- const candidate = loadManifestFromRoot(root);
550
- const manifest = candidate.manifest;
551
- if (!manifest || !candidate.manifestPath) return null;
552
- const clioRange = manifest.compatibility?.clio;
553
- const compatible = clioRange === void 0 || evaluateClioCompatibility(clioRange).satisfied;
554
- return {
555
- id: manifest.id,
556
- name: manifest.name,
557
- version: manifest.version,
558
- description: manifest.description,
559
- scope,
560
- rootPath: root,
561
- manifestPath: candidate.manifestPath,
562
- enabled: !state.disabled.includes(manifest.id),
563
- compatible,
564
- effective: false,
565
- resources: manifest.resources,
566
- diagnostics: candidate.diagnostics
567
- };
568
- }
569
- function listScope(scope, cwd = process.cwd()) {
570
- const base = extensionBaseDir(scope, cwd);
571
- if (!existsSync2(base)) return [];
572
- const state = readState(scope, cwd);
573
- const out = [];
574
- for (const entry of readdirSync2(base, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
575
- if (!entry.isDirectory()) continue;
576
- const root = path2.join(base, entry.name);
577
- const installed = installedFromRoot(root, scope, state);
578
- if (installed) out.push(installed);
579
- }
580
- return out;
581
- }
582
- function listInstalledExtensions(cwd = process.cwd(), options = {}) {
583
- const scopes = options.scope ? [options.scope] : ["user", "project"];
584
- const entries = scopes.flatMap((scope) => listScope(scope, cwd));
585
- const byId = /* @__PURE__ */ new Map();
586
- for (const entry of entries) {
587
- const list = byId.get(entry.id) ?? [];
588
- list.push(entry);
589
- byId.set(entry.id, list);
590
- }
591
- for (const group of byId.values()) {
592
- const winner = group.filter((entry) => entry.compatible).sort((a, b) => scopeRank(a.scope) - scopeRank(b.scope)).at(-1);
593
- for (const entry of group) {
594
- entry.effective = entry === winner;
595
- if (entry.compatible && !entry.effective && winner) entry.overriddenBy = winner.scope;
596
- }
597
- }
598
- const all = options.all === true ? entries : entries.filter((entry) => entry.effective || !entry.compatible);
599
- return all.sort((a, b) => {
600
- const id = a.id.localeCompare(b.id);
601
- if (id !== 0) return id;
602
- return scopeRank(a.scope) - scopeRank(b.scope);
603
- });
604
- }
605
- function findInstalled(id, cwd, scope) {
606
- const entries = listInstalledExtensions(cwd, { ...scope ? { scope } : {}, all: true }).filter(
607
- (entry) => entry.id === id
608
- );
609
- if (entries.length === 0) return null;
610
- return [...entries].sort((a, b) => scopeRank(a.scope) - scopeRank(b.scope)).at(-1) ?? null;
611
- }
612
- function installExtension(sourcePath, options = {}) {
613
- const scope = options.scope ?? "user";
614
- const cwd = options.cwd ?? process.cwd();
615
- const source = path2.resolve(sourcePath);
616
- const candidate = loadManifestFromRoot(source);
617
- if (!candidate.manifest || !candidate.valid) return { diagnostics: candidate.diagnostics };
618
- const targetRoot = path2.join(extensionBaseDir(scope, cwd), candidate.manifest.id);
619
- if (existsSync2(targetRoot)) {
620
- if (!options.force) {
621
- return {
622
- diagnostics: [
623
- { type: "error", message: `extension ${candidate.manifest.id} is already installed`, path: targetRoot }
624
- ]
625
- };
626
- }
627
- }
628
- const parent = path2.dirname(targetRoot);
629
- const stagingRoot = path2.join(parent, `.${candidate.manifest.id}.install-${process.pid}-${Date.now()}`);
630
- const backupRoot = path2.join(parent, `.${candidate.manifest.id}.backup-${process.pid}-${Date.now()}`);
631
- let installedReplacement = false;
632
- let movedExisting = false;
633
- const state = readState(scope, cwd);
634
- try {
635
- mkdirSync(parent, { recursive: true });
636
- rmSync(stagingRoot, { recursive: true, force: true });
637
- rmSync(backupRoot, { recursive: true, force: true });
638
- cpSync(source, stagingRoot, {
639
- recursive: true,
640
- // `state.json` beside the installed extension directories belongs to
641
- // Clio's extension manager. An extension may legitimately ship nested
642
- // resources with the same basename (for example a project-state JSON
643
- // template), so exclude only a bookkeeping file at the package root.
644
- filter: (src) => path2.relative(source, src) !== "state.json"
645
- });
646
- if (existsSync2(targetRoot)) {
647
- renameSync(targetRoot, backupRoot);
648
- movedExisting = true;
649
- }
650
- renameSync(stagingRoot, targetRoot);
651
- installedReplacement = true;
652
- state.installed[candidate.manifest.id] = { installedAt: (/* @__PURE__ */ new Date()).toISOString(), source };
653
- state.disabled = state.disabled.filter((entry) => entry !== candidate.manifest?.id);
654
- writeState(scope, state, cwd);
655
- rmSync(backupRoot, { recursive: true, force: true });
656
- } catch (error) {
657
- rmSync(stagingRoot, { recursive: true, force: true });
658
- if (installedReplacement) rmSync(targetRoot, { recursive: true, force: true });
659
- if (movedExisting && existsSync2(backupRoot) && !existsSync2(targetRoot)) {
660
- renameSync(backupRoot, targetRoot);
661
- }
662
- return {
663
- diagnostics: [
664
- {
665
- type: "error",
666
- message: `extension ${candidate.manifest.id} install failed: ${error instanceof Error ? error.message : String(error)}`,
667
- path: targetRoot
668
- }
669
- ]
670
- };
671
- }
672
- const installed = findInstalled(candidate.manifest.id, cwd, scope);
673
- return {
674
- ...installed ? { extension: installed } : {},
675
- diagnostics: candidate.diagnostics
676
- };
677
- }
678
- function mutateEnabled(id, enabled, options = {}) {
679
- const cwd = options.cwd ?? process.cwd();
680
- const target = findInstalled(id, cwd, options.scope);
681
- if (!target) {
682
- return { diagnostics: [{ type: "error", message: `extension ${id} is not installed` }] };
683
- }
684
- const state = readState(target.scope, cwd);
685
- if (enabled) state.disabled = state.disabled.filter((entry) => entry !== id);
686
- else if (!state.disabled.includes(id)) state.disabled.push(id);
687
- writeState(target.scope, state, cwd);
688
- const extension = findInstalled(id, cwd, target.scope) ?? void 0;
689
- return { ...extension ? { extension } : {}, diagnostics: [] };
690
- }
691
- function enableExtension(id, options = {}) {
692
- return mutateEnabled(id, true, options);
693
- }
694
- function disableExtension(id, options = {}) {
695
- return mutateEnabled(id, false, options);
696
- }
697
- function removeExtension(id, options = {}) {
698
- const cwd = options.cwd ?? process.cwd();
699
- const target = findInstalled(id, cwd, options.scope);
700
- if (!target) {
701
- return { diagnostics: [{ type: "error", message: `extension ${id} is not installed` }] };
702
- }
703
- rmSync(target.rootPath, { recursive: true, force: true });
704
- const state = readState(target.scope, cwd);
705
- Reflect.deleteProperty(state.installed, id);
706
- state.disabled = state.disabled.filter((entry) => entry !== id);
707
- writeState(target.scope, state, cwd);
708
- return { removed: { id, scope: target.scope, path: target.rootPath }, diagnostics: [] };
709
- }
710
-
711
- // src/domains/extensions/manager.ts
712
- init_esm_shims();
713
-
714
- // src/domains/extensions/resources.ts
715
- init_esm_shims();
716
- import { lstatSync as lstatSync2, realpathSync as realpathSync2 } from "node:fs";
717
- import path3 from "node:path";
718
- function extensionResourcePath(rootPath, resourcePath) {
719
- const root = path3.resolve(rootPath);
720
- const full = path3.resolve(root, resourcePath);
721
- const relative = path3.relative(root, full);
722
- if (relative === "" || relative === ".." || relative.startsWith(`..${path3.sep}`) || path3.isAbsolute(relative))
723
- return null;
724
- try {
725
- const rootReal = realpathSync2(root);
726
- const fullReal = realpathSync2(full);
727
- const canonicalRelative = path3.relative(rootReal, fullReal);
728
- if (canonicalRelative === ".." || canonicalRelative.startsWith(`..${path3.sep}`) || path3.isAbsolute(canonicalRelative)) {
729
- return null;
730
- }
731
- if (!lstatSync2(full).isDirectory()) return null;
732
- return full;
733
- } catch {
734
- return null;
735
- }
736
- }
737
- function enabledExtensionResourceRoots(kind, cwd = process.cwd()) {
738
- const roots = [];
739
- for (const entry of listInstalledExtensions(cwd)) {
740
- if (!entry.enabled || !entry.compatible || !entry.effective) continue;
741
- const rel = entry.resources[kind];
742
- if (!rel) continue;
743
- const full = extensionResourcePath(entry.rootPath, rel);
744
- if (!full) continue;
745
- roots.push({
746
- id: entry.id,
747
- scope: entry.scope,
748
- path: full,
749
- rootPath: entry.rootPath,
750
- source: `extension:${entry.scope}:${entry.id}`
751
- });
752
- }
753
- return roots;
754
- }
755
-
756
- // src/domains/extensions/index.ts
757
- init_esm_shims();
758
-
759
- // src/domains/extensions/extension.ts
760
- init_esm_shims();
761
- function createExtensionsBundle(_context) {
762
- const extension = {
763
- start() {
764
- return void 0;
765
- }
766
- };
767
- const contract = {
768
- list(cwd, options = {}) {
769
- return listInstalledExtensions(cwd, options);
770
- },
771
- discover(root) {
772
- return discoverExtensionPackages(root);
773
- },
774
- install(root, options = {}) {
775
- return installExtension(root, options);
776
- },
777
- enable(id, options = {}) {
778
- return enableExtension(id, options);
779
- },
780
- disable(id, options = {}) {
781
- return disableExtension(id, options);
782
- },
783
- remove(id, options = {}) {
784
- return removeExtension(id, options);
785
- },
786
- resourceRoots(kind, cwd) {
787
- return enabledExtensionResourceRoots(kind, cwd);
788
- },
789
- async reload() {
790
- return void 0;
791
- }
792
- };
793
- return { extension, contract };
794
- }
795
-
796
- // src/domains/extensions/manifest.ts
797
- init_esm_shims();
798
- var ExtensionsManifest = {
799
- name: "extensions",
800
- dependsOn: ["config"]
801
- };
802
-
803
- // src/domains/extensions/index.ts
804
- var ExtensionsDomainModule = {
805
- manifest: ExtensionsManifest,
806
- createExtension: createExtensionsBundle
807
- };
808
-
809
- export {
810
- discoverExtensionPackages,
811
- listInstalledExtensions,
812
- installExtension,
813
- enableExtension,
814
- disableExtension,
815
- removeExtension,
816
- enabledExtensionResourceRoots,
817
- ExtensionsDomainModule
818
- };
819
- //# sourceMappingURL=chunk-SUW5DORT.js.map