@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,126 +1,102 @@
1
1
  # Clio test harness reference
2
2
 
3
- How to drive the real Clio binary, a mock provider, the ACP surface, and a
4
- real pseudo-terminal in tests. Every model here is a stub; these are machinery
5
- tests. A run against a real model is `benchmarks/internal/SKILL.md`.
6
-
7
- ## Contents
8
- - The spawn harness (`runCli`, `makeScratchHome`)
9
- - Mocking a provider (OpenAI-compatible SSE fixture)
10
- - ACP over JSON-RPC/stdio
11
- - The PTY (`openPty`, `runInPty`)
12
- - One-off probes (no test file)
13
-
14
- ## The spawn harness
15
-
16
- `tests/harness/spawn.ts` spawns `node dist/cli/index.js` with piped stdio, so
17
- **build first** (or keep `npm run dev` running) before running smoke.
18
-
19
- ```ts
20
- import { makeScratchHome, runCli } from "../harness/spawn.js";
21
-
22
- const scratch = makeScratchHome();
23
- try {
24
- await runCli(["doctor", "--fix"], { env: scratch.env }); // bootstrap config
25
- const res = await runCli(["targets", "--json"], { env: scratch.env, timeoutMs: 20_000 });
26
- // res = { code, signal, stdout, stderr }
27
- const parsed = JSON.parse(res.stdout) as { targets: unknown[] };
28
- } finally {
29
- scratch.cleanup();
30
- }
31
- ```
32
-
33
- - `runCli(args, { env, cwd, timeoutMs, input })` → `Promise<{ code, signal, stdout, stderr }>`.
34
- Default `timeoutMs` is 15_000; raise it for `run`/`acp`.
35
- - `makeScratchHome()` `{ dir, env, cleanup }`. The `env` sets `CLIO_CODER_HOME`,
36
- `CLIO_CODER_DATA_DIR`, `CLIO_CODER_CONFIG_DIR`, `CLIO_CODER_CACHE_DIR`, and
37
- `CLIO_CODER_REQUIRE_HOME_PREFIX=1`. **Always pass `env: scratch.env`** so the test
38
- never touches the developer's real config, and always `cleanup()` in `finally`.
39
- - Bootstrap a scratch home with `runCli(["doctor", "--fix"], …)` before commands
40
- that need settings.
41
-
42
- Useful flags seen in smoke tests: `--no-context-files`, `--no-skills`,
43
- `--skill <path>`, `--json`. For the live CLI surface, run `clio-coder --help` and
44
- `clio-coder <command> --help` rather than hardcoding a command list here.
45
-
46
- ## Mocking a provider
47
-
48
- To exercise an agent `run` without a real model, stand up an in-process
49
- OpenAI-compatible server that streams one SSE chunk, then point a target at it by
50
- patching `settings.yaml`. This is the pattern in `tests/smoke/cli.test.ts`:
51
-
52
- ```ts
53
- // 1. Start a fixture that replies with a fixed string over text/event-stream.
54
- const fixture = await startOpenAICompatFixture("mock reply");
55
- // 2. Patch the scratch settings.yaml: add an `openai-compat` target whose
56
- // url is fixture.url, set orchestrator.target/model to it, and supply the
57
- // apiKeyEnvVar it expects.
58
- seedOpenAICompatOrchestrator(join(scratch.dir, "config"), fixture.url);
59
- // 3. Run, providing the key env var the target references.
60
- const res = await runCli(["--no-context-files", "run", "hello"], {
61
- env: { ...scratch.env, CLIO_CODER_TEST_OPENAI_KEY: "sk-test" },
62
- timeoutMs: 20_000,
63
- });
64
- // res.stdout === "mock reply\n"
65
- await closeServer(fixture.server);
66
- ```
67
-
68
- The fixture also records `fixture.requests`, so you can assert what Clio sent
69
- (e.g. that an explicit `--skill` was injected into the prompt).
70
-
71
- ## ACP over JSON-RPC/stdio
72
-
73
- `clio-coder acp` speaks ACP v1 over stdio. Drive it with a line-delimited JSON-RPC
74
- client (see `createJsonRpcProcessClient` in the smoke test): `initialize` →
75
- `session/new` `session/prompt` → `session/close`. Streaming arrives as
76
- `session/update` notifications whose `update.sessionUpdate` must be a v1 variant
77
- (`agent_message_chunk`, `tool_call`, `plan`, `current_mode_update`, …). A
78
- non-spec discriminator breaks strict clients like Zed, so the smoke test asserts
79
- every emitted variant is in the v1 set.
80
-
81
- ## The PTY
82
-
83
- Piped stdio reports no terminal width and no TTY, so the TUI refuses to start
84
- and every width-sensitive path collapses to 80 columns. `tests/harness/pty.ts`
85
- opens a real pseudo-terminal through `node-pty` (a devDependency, never
86
- shipped):
87
-
88
- ```ts
89
- import { openPty, runInPty, stripAnsi, visibleLines } from "../harness/pty.js";
90
-
91
- // Scripted: type on a schedule, stop when the output matches, bounded by a timeout.
92
- const run = await runInPty(process.execPath, [CLI], { cols: 120, rows: 40, cwd, env,
93
- readyWhen: /ctx /, input: [{ afterMs: 200, data: "/quit\r" }], until: /bye/, timeoutMs: 20_000 });
94
-
95
- // Controllable: write, resize, pause output, wait for a matcher, wait for exit.
96
- const session = await openPty(process.execPath, [CLI], { cols: 140, rows: 44, cwd, env });
97
- await session.waitForOutput((out) => /ctx /.test(stripAnsi(out)), 30_000);
98
- session.write("/quit\r");
99
- await session.waitForExit(10_000);
100
- ```
101
-
102
- Use it only for what a pipe cannot show: width, raw mode, SIGINT through a
103
- terminal, the alternate-screen and keyboard-protocol teardown. The three
104
- suites that need it are `tests/smoke/tui-width-matrix.test.ts`,
105
- `instant-shell-pty.test.ts`, and `render-trace-pty.test.ts`. Anything else
106
- belongs on `runCli`.
107
-
108
- ## One-off probes (no test file)
109
-
110
- To poke at Clio without writing a permanent test, drop a throwaway script in
111
- your scratch directory and run it with tsx. Delete it when done — never leave
112
- probes under `tests/`, `scripts/`, or `benchmarks/`.
113
-
114
- ```ts
115
- // /tmp/probe.ts
116
- import { makeScratchHome, runCli } from "/abs/path/to/repo/tests/harness/spawn.js";
117
- const scratch = makeScratchHome();
118
- await runCli(["doctor", "--fix"], { env: scratch.env });
119
- const out = await runCli(["skills", "list", "--json", "--all"], { env: scratch.env, cwd: process.cwd() });
120
- console.log(out.stdout.slice(0, 400));
121
- scratch.cleanup();
122
- ```
123
-
124
- ```bash
125
- npx tsx /tmp/probe.ts
126
- ```
3
+ This reference covers the harness modules that exist in the current tree:
4
+ temporary-state isolation, dispatch fixtures, a loopback OpenAI-compatible
5
+ server, and the ACP stdio smoke driver. Deterministic tests do not contact a
6
+ real model and the repository currently has no shared spawn or PTY harness.
7
+
8
+ ## Temporary roots and state isolation
9
+
10
+ The `test:file` and `test` package scripts preload `tests/harness/tmp-root.ts`.
11
+ It creates one guarded root below the system temp directory, points `TMPDIR`
12
+ inside it before test modules load, sweeps abandoned roots only after a bounded
13
+ age, and removes the current root on process exit. `tmp-git-guard.ts` prevents
14
+ a test from creating `.git` at the system or run temp root, where it would alter
15
+ project-boundary discovery for unrelated tests.
16
+
17
+ Use `tests/harness/scratch-env.ts` for Clio-specific state:
18
+
19
+ - `makeScratchHome()` returns a directory, a child-process environment, and a
20
+ cleanup function without mutating `process.env`.
21
+ - `isolateClioEnv()` snapshots and mutates `process.env`, resets the XDG cache,
22
+ and returns a restoring teardown.
23
+ - `newScratchClioHome()` and `clearScratchClioHome()` provide the same
24
+ in-process isolation when a plain directory string is more convenient.
25
+ - `scratchClioEnvVars()` keeps `CLIO_CODER_HOME` and the data, config, state,
26
+ and cache overrides in one root. The child-process form also sets
27
+ `CLIO_CODER_REQUIRE_HOME_PREFIX=1`.
28
+
29
+ In-process environment isolation is a process-wide critical section. Await the
30
+ acquire helper in setup and always invoke its matching restore or clear helper
31
+ in teardown.
32
+
33
+ ## Driving the built CLI
34
+
35
+ Every file under `tests/smoke/` spawns `dist/cli/index.js` through a local
36
+ process driver suited to that boundary:
37
+
38
+ - `cli-core.test.ts` captures stdout and stderr with a bounded timeout.
39
+ - `acp-boundary.test.ts` keeps stdin open and frames ACP v1 JSON-RPC messages.
40
+ - `installed-package.test.ts` packs, installs, and launches the installed
41
+ artifact.
42
+ - `process-lifecycle.test.ts` keeps the process live long enough to verify
43
+ signal propagation into a tool child.
44
+ - `real-binary-boot.test.ts` supports interactive setup input and bounded
45
+ shutdown during first-run and migration checks.
46
+
47
+ Build before a focused smoke run. `npm run ci` performs that build in the
48
+ correct order. Keep environment roots under a scratch directory, capture both
49
+ output streams, bound every wait, and terminate a surviving child in teardown.
50
+ Do not import a nonexistent shared `runCli`; copy the closest smoke driver's
51
+ small pattern or extract a helper only when more than one current boundary has
52
+ the same contract.
53
+
54
+ ## Loopback provider fixtures
55
+
56
+ `tests/harness/openai-compat-fixture.ts` exports
57
+ `startOpenAICompatFixture()` and `closeServer()`. The fixture listens on an
58
+ ephemeral loopback port, serves `/v1/models` and `/v1/chat/completions`, supports
59
+ streaming text and one scripted tool call, and records request bodies for
60
+ assertions. Its seed helpers write scratch target configurations for
61
+ orchestrator, tool, fleet, bootstrap, and unregistered-runtime cases.
62
+
63
+ The current reusable fixture is used by provider contracts. Smoke files define
64
+ their own minimal loopback servers because their wire behavior differs. In
65
+ either lane, close the server in teardown and assert the request body when the
66
+ test's claim concerns payload fields.
67
+
68
+ ## Dispatch contracts
69
+
70
+ `tests/harness/dispatch.ts` provides:
71
+
72
+ - `makeDispatchBundle()` with the real prompt customization path and a fast,
73
+ argument-preserving reproducibility collector.
74
+ - `isolateDispatchState()` and `restoreDispatchState()` for ledger, receipt,
75
+ and environment isolation.
76
+ - `holdEventLoop()` for contracts that await an unref'd production watchdog.
77
+
78
+ `dispatch-stub-context.ts` supplies the minimal domain context used by dispatch
79
+ tests. `receipt.ts` supplies typed envelope and receipt drafts. Prefer these
80
+ fixtures over reconstructing broad domain objects in each test.
81
+
82
+ ## ACP over JSON-RPC stdio
83
+
84
+ `tests/smoke/acp-boundary.test.ts` owns the current `AcpClient`. It launches
85
+ `clio-coder acp` with piped stdio, parses one JSON object per line, correlates
86
+ responses by id, collects `session/update` notifications, and handles inbound
87
+ `session/request_permission` calls.
88
+
89
+ The exercised sequence is `initialize`, `session/new`, `session/prompt`, then
90
+ `session/close`. Permission cases answer the inbound request with a selected
91
+ `allow-once` or `reject-once` option and assert both the final tool-call update
92
+ and the filesystem outcome. Keep stdout exclusively for protocol frames;
93
+ diagnostics belong on stderr.
94
+
95
+ ## Disposable probes
96
+
97
+ A one-off diagnostic belongs under `/tmp`, not `tests/`, `scripts/`, or an
98
+ invented benchmark tree. Run TypeScript probes with `node --import tsx`, point
99
+ all Clio state variables at a fresh temporary root, and delete the probe after
100
+ recording the result. A result from a loopback fixture is machinery evidence,
101
+ not live-model evidence. Live validation must name the configured target,
102
+ model, runtime, prompt, and serving settings.
@@ -1,69 +1,96 @@
1
1
  # Where Clio's tests live
2
2
 
3
- Three layers under `tests/`. Add a new test next to the closest existing file;
4
- create a new file only for a genuinely new domain cluster.
3
+ The root repository has contract and smoke tests under `tests/`; import
4
+ boundaries run through the lint hygiene checker. Add a test beside the closest
5
+ current behavior, and create a new file only for a genuinely new cluster.
5
6
 
6
7
  ## Layout
7
8
 
8
- | Layer | Path | Runner | Build needed |
9
+ | Lane | Path | Runner | Build needed |
9
10
  |---|---|---|---|
10
- | contracts | `tests/contracts/*.test.ts` | `npm run test:file -- <glob>` (tsx + scratch root) | no (imports `src`) |
11
- | smoke | `tests/smoke/*.test.ts` | `npm run test:file -- <glob>` | **yes** (spawns `dist/`) |
12
- | boundaries | `tests/boundaries/check-boundaries.ts` | `npm run lint` (hygiene) | no |
13
- | harness (not tests) | `tests/harness/*.ts` | imported by contracts and smoke | |
11
+ | Contracts | `tests/contracts/*.test.ts` | `npm run test:file -- <file-or-files>` through tsx and the temp-root preload | No; imports `src/` |
12
+ | Smoke | `tests/smoke/*.test.ts` | `npm run test:file -- <file-or-files>` | Yes; spawns `dist/cli/index.js` |
13
+ | Boundaries | `tests/boundaries/check-boundaries.ts` | `npm run lint` through `scripts/check-hygiene.ts` | No |
14
+ | Root full suite | Contract and smoke files | `npm run test` | Yes for current smoke behavior |
15
+ | Trace viewer | `apps/trace-viewer/tests/*.test.mjs` | `npm run test:trace-viewer` | No |
16
+ | Workbench | `apps/workbench/tests/` | `deno task verify` from `apps/workbench` | The command builds the app |
14
17
 
15
- The harness modules: `spawn.ts` (run the built CLI with pipes), `scratch-env.ts`
16
- (isolated Clio home), `pty.ts` (a real pseudo-terminal), `openai-compat-fixture.ts`
17
- and `fake-lmstudio-server.ts` (stub providers), `fake-ssh.ts` (stub fleet node),
18
- `clock.ts` (steppable clock), plus dispatch, receipt, and module-graph helpers.
19
- Everything under `tests/` stubs the model. Real-model runs are
20
- `benchmarks/internal/` and never run under `npm test`.
18
+ `npm run ci` orders typecheck, lint, skill-pin verification, build, the root
19
+ suite, and trace-viewer tests. `npm run ci:release` adds the release audit. The
20
+ Workbench gate is separate.
21
21
 
22
- ## Contract test files
22
+ ## Contract files
23
23
 
24
- | Area | File |
24
+ | Area | Current files under `tests/contracts/` |
25
25
  |---|---|
26
- | ACP contract | `tests/contracts/acp.test.ts` |
27
- | context bootstrap / CLIO-CODER.md parse+render | `tests/contracts/bootstrap.test.ts` |
28
- | config schema + hot-reload classification | `tests/contracts/config.test.ts` |
29
- | dispatch (validation / admission / ledger) | `tests/contracts/dispatch.test.ts` |
30
- | session / memory / evidence persistence | `tests/contracts/persistence.test.ts` |
31
- | prompt fragments + hashing | `tests/contracts/prompts.test.ts` |
32
- | provider catalog / matcher / resolver | `tests/contracts/providers.test.ts` |
33
- | safety classification | `tests/contracts/safety.test.ts` |
34
- | skills loader / collisions / provenance | `tests/contracts/skills.test.ts` |
35
- | skill activation + compaction interplay | `tests/contracts/skill-activation-compaction.test.ts` |
36
- | tool registry / names / profiles | `tests/contracts/tools.test.ts` |
37
-
38
- ## Smoke + boundaries
39
-
40
- | Area | File |
26
+ | Authentication | `auth-login-write-failure`, `auth-storage-durability` |
27
+ | Context, session, and state | `context-lifecycle`, `memory-scope`, `project-bootstrap`, `session-durability`, `state-file-lock`, `task-board-done`, `working-set-core` |
28
+ | Config, routing, and presentation | `footer-context-window`, `knob-aliases`, `pane-remedies`, `rendering-invariants`, `route-identity-keying`, `settings-migration` |
29
+ | Dispatch, fleet, and workers | `dispatch-admission`, `dispatch-lifecycle`, `dispatch-schema`, `fleet-lifecycle`, `host-verification-batch`, `intent-requirements`, `worker-attestation-surface`, `worker-boundary` |
30
+ | Prompts, engine loop, and middleware | `compact-prompt-contracts`, `engine-lifecycle`, `loop-detector`, `loop-guard-epoch`, `middleware-hooks`, `prompt-cache-correctness`, `prompt-prefix-layout`, `prompt-role-routing`, `prompt-session-snapshot`, `prompt-tool-hints` |
31
+ | Providers and model policy | `gemma-channel-filter`, `llamacpp-router-probe`, `local-model-family-resolution`, `provider-context-boundary`, `provider-transport`, `synthesis-lock`, `thinking-off-wire` |
32
+ | Safety and tools | `bash-exec-settlement`, `rejection-feedback`, `safe-resource-write`, `safety-gates`, `tool-boundaries` |
33
+ | Evidence, eval, and release | `eval-boundary`, `evidence-integrity`, `metering-integrity`, `release-boundary` |
34
+ | Extensions, interop, and skills | `extension-compatibility`, `extension-reload-coordinator`, `extension-reload-slash`, `extension-resources`, `extension-snapshot`, `interop-boundary`, `marketplace-offer`, `skill-install` |
35
+ | Documentation server | `docs-server` |
36
+
37
+ Append `.test.ts` to every stem in the table. Use `rg` over the files before
38
+ choosing a lane; related behavior can span more than one focused contract.
39
+
40
+ ## Smoke files
41
+
42
+ | Boundary | File under `tests/smoke/` |
43
+ |---|---|
44
+ | ACP v1 over JSON-RPC stdio, permission requests, and text/image content | `acp-boundary.test.ts` |
45
+ | Core CLI health, local-provider run, receipts, events, and autonomy | `cli-core.test.ts` |
46
+ | `npm pack`, installed resources, and installed codewiki navigation | `installed-package.test.ts` |
47
+ | Signal propagation through a real tool child | `process-lifecycle.test.ts` |
48
+ | Real-binary setup, onboarding, migration, and launch behavior | `real-binary-boot.test.ts` |
49
+
50
+ The smoke files own their child-process helpers. There is no shared
51
+ `tests/harness/spawn.ts` and no PTY smoke lane in the current tree.
52
+
53
+ ## Harness and fixture modules
54
+
55
+ | File | Purpose |
41
56
  |---|---|
42
- | non-interactive CLI + ACP-over-stdio end-to-end | `tests/smoke/cli.test.ts` |
43
- | the package as installed from `npm pack` | `tests/smoke/pack-install.test.ts` |
44
- | TUI at real terminal sizes, NO_COLOR, Ctrl-C teardown (PTY) | `tests/smoke/tui-width-matrix.test.ts` |
45
- | instant shell before hydration, SIGTERM through the lease (PTY) | `tests/smoke/instant-shell-pty.test.ts` |
46
- | committed-frame render trace under PTY backpressure (PTY) | `tests/smoke/render-trace-pty.test.ts` |
47
- | import boundary rules (rule1/2/3), run under `npm run lint` | `tests/boundaries/check-boundaries.ts` |
57
+ | `tests/harness/tmp-root.ts` | Preloaded guarded temp root and cleanup for every root test run |
58
+ | `tests/harness/tmp-git-guard.ts` | Prevents accidental `.git` creation in the system or test temp root |
59
+ | `tests/harness/scratch-env.ts` | Child-process and in-process Clio state isolation |
60
+ | `tests/harness/dispatch.ts` | Dispatch bundle, fast reproducibility, isolated state, and event-loop helpers |
61
+ | `tests/harness/dispatch-stub-context.ts` | Minimal domain context for dispatch contracts |
62
+ | `tests/harness/receipt.ts` | Typed run-envelope and receipt fixtures |
63
+ | `tests/harness/openai-compat-fixture.ts` | Loopback OpenAI-compatible server and target seeders |
64
+
65
+ Child fixtures in `tests/fixtures/` are
66
+ `capacity-lease-child.ts`, `codewiki-coordinator-child.ts`, and
67
+ `evidence-index-writer.ts`.
48
68
 
49
69
  ## Running a subset
50
70
 
51
71
  ```bash
52
- # all contracts
53
- npm run test:file -- 'tests/contracts/**/*.test.ts'
54
- # one file
55
- npm run test:file -- tests/contracts/skills.test.ts
56
- # only it.only / describe.only within a file
57
- npm run test:file -- --test-only tests/contracts/skills.test.ts
72
+ # all contracts (the shell expands the file pattern)
73
+ npm run test:file -- tests/contracts/*.test.ts
74
+
75
+ # one contract or smoke file
76
+ npm run test:file -- tests/contracts/skill-install.test.ts
77
+ npm run build
78
+ npm run test:file -- tests/smoke/cli-core.test.ts
79
+
80
+ # only it.only or describe.only within one file
81
+ npm run test:file -- --test-only tests/contracts/skill-install.test.ts
58
82
  ```
59
83
 
60
84
  ## Writing tests
61
85
 
62
- - `node:test` + `node:assert/strict`. Group with `describe` / `it`.
63
- - Local imports end in `.js` (NodeNext), e.g. `from "../../src/domains/x/y.js"`.
64
- - `tsconfig.tests.json` is strict with `noUncheckedIndexedAccess` and
65
- `exactOptionalPropertyTypes`; narrow array access before use.
66
- - Biome rejects `delete obj.key`; use `Reflect.deleteProperty(obj, "key")` when
67
- cleaning env maps or object keys.
68
- - Filesystem tests use a scratch home via `makeScratchHome()` (smoke) or the
69
- `CLIO_CODER_HOME` / `CLIO_CODER_*_DIR` env overrides (contracts); clean up in `finally`.
86
+ - Use `node:test` and `node:assert/strict`.
87
+ - End local TypeScript import specifiers in `.js` for NodeNext resolution.
88
+ - Keep `tsconfig.tests.json` strict, including `noUncheckedIndexedAccess` and
89
+ `exactOptionalPropertyTypes`; narrow indexed values before use.
90
+ - Let the package script preload `tmp-root.ts`. Tests that mutate Clio state or
91
+ `process.env` should use `scratch-env.ts` and restore in teardown.
92
+ - Use a loopback fixture for provider behavior. Do not contact a configured or
93
+ public model from a deterministic test.
94
+ - Build before a focused smoke run. `npm run ci` already builds before testing.
95
+ - Keep a smoke process driver local to the boundary it exercises unless a
96
+ genuinely shared contract appears.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: credentials
3
- description: Use before running any tool or script that needs an API key, token, or other credential, when a command fails with an auth error, when the user must supply a new secret, or when a secret may have leaked into output. Covers facility surfaces such as kerberos tickets, globus and scheduler tokens, ssh agents, and netrc. Triggers on "API key", "credential", "token", "auth error", "permission denied", "add a secret", "leaked". Not for provider target configuration; use clio-coder auth and target settings.
3
+ description: Handles API keys, tokens, and facility credentials (kerberos tickets, globus and scheduler tokens, ssh agents, netrc) before a tool needs one, after an auth error, when a new secret is supplied, or when one may have leaked. Not for provider target configuration; use clio-coder auth and target settings.
4
4
  triggers:
5
5
  - API key
6
6
  - credential missing
@@ -8,7 +8,7 @@ triggers:
8
8
  - permission denied
9
9
  - add a secret
10
10
  - secret leaked
11
- version: 0.1.3
11
+ version: 0.2.0
12
12
  license: Apache-2.0
13
13
  allowed-tools:
14
14
  - read
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: find-skills
3
- description: Use when the user asks "is there a skill for X", "find a skill", "install a skill", "add a skill", asks whether a capability exists as an installable skill, or wants to extend the agent with functionality that might already be published. Searches with `clio-coder skills search`, browses the ecosystem read-only, and installs only through `clio-coder skills install`. Not for authoring a new skill; use skill-craft.
3
+ description: Finds and installs published skills when the user asks whether a capability exists as a skill, searching with clio-coder skills search and installing only through clio-coder skills install. Not for authoring a new skill; use skill-craft.
4
4
  triggers:
5
5
  - find a skill
6
6
  - is there a skill for this
7
7
  - install a skill
8
8
  - add an agent skill
9
9
  - search the skills marketplace
10
- version: 0.1.2
10
+ version: 0.2.0
11
11
  license: Apache-2.0
12
12
  allowed-tools:
13
13
  - bash
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: herdr
3
- description: Use when the user explicitly mentions Herdr or asks to launch, drive, or inspect another agent or command in a Herdr pane, tab, or workspace including starting a second Clio Coder instance and delegating work to it. Requires HERDR_ENV=1. Not for background work a plain shell or dispatch already covers; do not activate merely because a task could benefit from parallelism.
3
+ description: Launches, drives, or inspects another agent or command in a Herdr pane, tab, or workspace, including a second Clio Coder instance; requires HERDR_ENV=1. Not for background work a plain shell or dispatch already covers.
4
4
  triggers:
5
5
  - use Herdr
6
6
  - launch an agent in a Herdr pane
7
7
  - inspect a Herdr agent
8
8
  - start a second Clio Coder instance
9
9
  - drive a command in a Herdr workspace
10
- version: 0.1.1
10
+ version: 0.2.0
11
11
  license: Apache-2.0
12
12
  allowed-tools:
13
13
  - bash
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: skill-craft
3
- description: Use when writing, reviewing, or pruning a SKILL.md — authoring a new skill, editing an installed one, or judging whether a skill's description, body, or length is earning its cost. Triggers on "write a skill", "improve this skill", "why isn't this skill firing", "is this skill too long".
3
+ description: Writes, reviews, or prunes a SKILL.md, judging whether its description, body, and length earn their cost. Not for packaging a workflow that just happened; use workflow-distiller.
4
4
  triggers:
5
5
  - write a SKILL.md
6
6
  - create a new skill
7
7
  - improve this skill
8
8
  - why isn't this skill firing
9
9
  - prune a skill body
10
- version: 0.1.3
10
+ version: 0.3.0
11
11
  license: Apache-2.0
12
12
  allowed-tools:
13
13
  - read
@@ -36,11 +36,14 @@ tool. Project skills live in `.clio-coder/skills/<name>/`; user skills in the Cl
36
36
  config dir under `skills/<name>/`. The loader validates on load; check work
37
37
  with `clio-coder skills validate`. Frontmatter contract (Agent Skills compatible):
38
38
 
39
- - `name`: lowercase-hyphen, ≤64 chars, must match the folder.
39
+ - `name`: lowercase-hyphen, ≤64 chars. Catalog convention requires it to match
40
+ the folder; the runtime loader warns on a mismatch and uses the frontmatter
41
+ name.
40
42
  - `description`: required, ≤1024 chars; its craft is the section below. Quote
41
43
  it when it contains ` #` — an unquoted YAML scalar is truncated there.
42
- - `version` and `license`: required for catalog publication; bump the version
43
- on any name or description change so drift detection can tell copies apart.
44
+ - `version` and `license`: required for catalog publication. Follow the
45
+ marketplace versioning policy for body, trigger-surface, and sibling-file
46
+ changes; the normalized `SKILL.md` hash handles drift separately.
44
47
  - `disable-model-invocation: true`: hides the skill from the agent; only the
45
48
  user can activate it.
46
49
  - `allowed-tools` / `disallowed-tools`: a *narrowing* declaration, not a
@@ -50,7 +53,7 @@ with `clio-coder skills validate`. Frontmatter contract (Agent Skills compatible
50
53
  names only (see skills/README.md, "Claude Code interop").
51
54
  - `requires`: `skill:<name>` dependencies; the loader warns when one is
52
55
  missing. Reference an installed skill by name instead of restating its job.
53
- - `clio:`: the reserved publication block (`registry-id`, `source-url`,
56
+ - `clio-coder:`: the reserved publication block (`registry-id`, `source-url`,
54
57
  `audit`, `provenance` designed|adapted|imported with `origin` when not
55
58
  designed, `eval-status`, optional `model-size` and `agents`). Required for
56
59
  catalog skills; approval is judged against it (skills/README.md).
@@ -66,17 +69,19 @@ but the user must remember it exists: cognitive load. Keep a description only
66
69
  when the agent must reach the skill on its own or another skill requires it;
67
70
  if it only ever fires by hand, set `disable-model-invocation: true`.
68
71
 
69
- ## Description: Triggers, Not Identity
72
+ ## Description and Triggers
70
73
 
71
- The description is the skill's trigger surface, so every word competes with
72
- every other skill's description:
74
+ Two frontmatter fields share the trigger surface, and every word in both
75
+ competes with every other skill's:
73
76
 
74
- - Front-load the strongest trigger word.
75
- - One trigger per distinct branch. Synonyms restating one branch ("API key",
76
- "credential", "token") are duplication; keep the strongest.
77
- - Cut identity the body already states; keep triggers, plus one "Not for X;
78
- use <other-skill>" clause per real boundary.
79
- - Word triggers with the language the user actually types.
77
+ - `triggers`: the phrases a user actually types, one per distinct branch.
78
+ Synonyms restating one branch ("API key", "credential", "token") are
79
+ duplication; keep the strongest.
80
+ - `description`: one lead sentence saying what the skill does, then one
81
+ "Not for X; use <other-skill>" clause per real boundary. It is what the
82
+ agent reads in the `context(scope="skills")` listing on every skill-shaped
83
+ turn, so it carries no trigger list and no identity the body already
84
+ states.
80
85
 
81
86
  ## Body: Steps and Reference
82
87
 
@@ -113,7 +118,8 @@ Before finishing any skill, pass the body line by line:
113
118
  or split the skill; a split description must earn its permanent context
114
119
  load.
115
120
 
116
- Done when: description is triggers-only, every step has a checkable
121
+ Done when: the description is one sentence plus routing clauses and the
122
+ triggers carry the phrases, every step has a checkable
117
123
  completion criterion, no line fails the relevance/duplication/no-op pass, and
118
124
  an `evals.md` records at least one RED-GREEN scenario distinguishing
119
125
  with-skill from without.
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: architecture
3
- description: 'Use when an intent (PRD, epic, brief, or idea) needs its engineering approach decided "how should we build this", "pick the stack", "architecture for this feature". An interactive working session: investigates, proposes 2-3 genuinely different approaches with trade-offs, recommends with reasoning, lets the user decide, and writes a high-level architecture decision doc. Not a task-by-task plan; use cut-it for that. Not a multi-perspective debate; use design-council. Not product intent; use product-intent. Not a typed implementation handoff with code-shaped contracts; use tech-spec.'
3
+ description: "Decides the engineering approach for an intent in an interactive session: investigates, proposes two or three genuinely different approaches with trade-offs, recommends, lets the user decide, and writes the decision doc. Not a task-by-task plan; use cut-it. Not a multi-perspective debate; use design-council. Not product intent; use product-intent. Not a typed implementation handoff; use tech-spec."
4
4
  triggers:
5
5
  - how should we build this
6
6
  - pick the stack
7
7
  - architecture for this feature
8
8
  - decide the engineering approach
9
9
  - compare architecture options
10
- version: 0.2.2
10
+ version: 0.3.0
11
11
  license: Apache-2.0
12
12
  allowed-tools:
13
13
  - read
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: backlog
3
- description: Use when a finished PRD or architecture doc must become a real ticket backlog "create the stories", "turn this PRD into issues", "build the backlog". Decomposes phases and user stories into small tickets with verifiable acceptance criteria, confirms the list, then creates them as GitHub issues (or in another tracker when an integration exists). Not for local sprint slicing into a SPRINT.md; use cut-it.
3
+ description: Turns a finished PRD or architecture doc into a ticket backlog of small stories with verifiable acceptance criteria, confirmed, then created as GitHub issues or in another configured tracker. Not for local sprint slicing into a SPRINT.md; use cut-it.
4
4
  triggers:
5
5
  - create the stories
6
6
  - turn this PRD into issues
7
7
  - build the backlog
8
8
  - decompose this plan into tickets
9
9
  - create GitHub issues from this architecture
10
- version: 0.2.1
10
+ version: 0.3.0
11
11
  license: Apache-2.0
12
12
  allowed-tools:
13
13
  - read
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: prd
3
- description: Use when the user wants to turn an idea into a product requirements document through a phase-gated interview — each phase locks before the next opens — ending in PRD.md plus per-milestone prompt files ready to drive a coding agent. Triggers on "write a PRD", "spec this out", "help me define this feature/product", or a brain dump that needs structure before planning.
3
+ description: Turns an idea into a product requirements document through a phase-gated interview, ending in PRD.md plus per-milestone prompt files ready to drive a coding agent. Not for the problem-first product thesis; use product-intent.
4
4
  triggers:
5
5
  - write a PRD
6
6
  - spec this product out
7
7
  - define this feature
8
8
  - structure this product brain dump
9
9
  - create milestone prompts
10
- version: 0.2.2
10
+ version: 0.3.0
11
11
  license: Apache-2.0
12
12
  allowed-tools:
13
13
  - read
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: product-intent
3
- description: Use at the start of a greenfield product effort, when the user wants a problem-first product document "why are we building this", "write the product thesis", "PRD for this idea". Interviews for the problem, evidence, and a falsifiable hypothesis; writes an intent-only PRD with zero engineering decisions. Not for engineering decisions; use architecture. Not for turning a locked idea into milestone build prompts; use prd.
3
+ description: "Writes a problem-first product document for a greenfield effort: interviews for the problem, evidence, and a falsifiable hypothesis, with zero engineering decisions. Not for engineering decisions; use architecture. Not for turning a locked idea into milestone build prompts; use prd."
4
4
  triggers:
5
5
  - why are we building this
6
6
  - write the product thesis
7
7
  - problem-first PRD
8
8
  - define a falsifiable product hypothesis
9
9
  - greenfield product intent
10
- version: 0.2.1
10
+ version: 0.3.0
11
11
  license: Apache-2.0
12
12
  allowed-tools:
13
13
  - read
@@ -1,13 +1,13 @@
1
1
  ---
2
2
  name: tech-spec
3
- description: Write a typed call-stack architecture handoff code-shaped contracts plus execution flows, implementation-ready for another engineer. User-invoked only. Not for weighing approaches or deciding the design; use architecture first.
3
+ description: "Writes a typed call-stack architecture handoff: code-shaped contracts plus execution flows, implementation-ready for another engineer. User-invoked only. Not for weighing approaches or deciding the design; use architecture first."
4
4
  triggers:
5
5
  - write a tech spec
6
6
  - typed call-stack handoff
7
7
  - code-shaped contracts
8
8
  - implementation-ready technical specification
9
9
  - specify execution flows
10
- version: 0.1.2
10
+ version: 0.2.0
11
11
  license: Apache-2.0
12
12
  disable-model-invocation: true
13
13
  allowed-tools: