@iowarp/clio-coder 0.3.1 → 0.3.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 (595) hide show
  1. package/CHANGELOG.md +90 -2
  2. package/CONTRIBUTING.md +23 -23
  3. package/README.md +284 -613
  4. package/dist/{acp-FPR54DGL.js → acp-BIYHVZIM.js} +43 -53
  5. package/dist/{agents-OGPIHPJH.js → agents-YT6SSRIT.js} +43 -26
  6. package/dist/assets/codewiki.json +1 -1
  7. package/dist/{auth-IC3K6NIZ.js → auth-5TWEIYDN.js} +20 -12
  8. package/dist/{chunk-PV4JUBVJ.js → chunk-2EHAIA3X.js} +40 -21
  9. package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
  10. package/dist/chunk-2SFS6XQE.js +122 -0
  11. package/dist/chunk-2VTFPG5O.js +48 -0
  12. package/dist/{chunk-MAR7Y6HW.js → chunk-3ZXDFGR5.js} +23 -16
  13. package/dist/chunk-4BJ5BYCE.js +61 -0
  14. package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
  15. package/dist/chunk-4KLWL3UC.js +18 -0
  16. package/dist/chunk-4VP4KH3K.js +962 -0
  17. package/dist/chunk-4ZG3XFUR.js +77 -0
  18. package/dist/chunk-5B2AEOW5.js +5407 -0
  19. package/dist/{chunk-K2ITRMHZ.js → chunk-5TSRNF4G.js} +6 -138
  20. package/dist/{chunk-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
  21. package/dist/chunk-65DEGPJ6.js +52 -0
  22. package/dist/chunk-6EJMN2Y3.js +17 -0
  23. package/dist/chunk-6EJV5X2W.js +16405 -0
  24. package/dist/chunk-6N5PTWMY.js +136 -0
  25. package/dist/chunk-6XLNIQDB.js +27 -0
  26. package/dist/{chunk-TEKV33Q5.js → chunk-77VKQEHF.js} +65 -33
  27. package/dist/chunk-7CR24IG7.js +242 -0
  28. package/dist/{chunk-M5T5VO65.js → chunk-7EYHLWU7.js} +837 -635
  29. package/dist/chunk-7MNJORFF.js +22 -0
  30. package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
  31. package/dist/chunk-AGYYIBLL.js +1069 -0
  32. package/dist/chunk-AO4RKG4M.js +277 -0
  33. package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
  34. package/dist/chunk-ARBGF5F7.js +174 -0
  35. package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
  36. package/dist/chunk-CBCAPZAA.js +229 -0
  37. package/dist/chunk-CMZWFGD2.js +352 -0
  38. package/dist/chunk-ECH6PKUQ.js +39 -0
  39. package/dist/chunk-ED4KHGC3.js +143 -0
  40. package/dist/chunk-EKMEHE4H.js +340 -0
  41. package/dist/{chunk-RPTR2H26.js → chunk-EPVUXGXG.js} +21 -15
  42. package/dist/chunk-FCSXB6T2.js +338 -0
  43. package/dist/chunk-FJ3H4MN5.js +48 -0
  44. package/dist/chunk-FQ4SKYE4.js +29 -0
  45. package/dist/chunk-G2DE3C7R.js +644 -0
  46. package/dist/chunk-G4BMMOKF.js +182 -0
  47. package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
  48. package/dist/chunk-HC4CLZ2Y.js +68 -0
  49. package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
  50. package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
  51. package/dist/chunk-I4HZDVNP.js +73 -0
  52. package/dist/{chunk-4QKXUHSR.js → chunk-IGLFWIYI.js} +70 -20
  53. package/dist/chunk-IKCO5N3L.js +162 -0
  54. package/dist/chunk-IR4CFBFN.js +56 -0
  55. package/dist/{chunk-PFEFKVGL.js → chunk-J5HN4RYU.js} +13 -11
  56. package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
  57. package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
  58. package/dist/chunk-KJ5LWLOE.js +1077 -0
  59. package/dist/chunk-LBMZMYH2.js +285 -0
  60. package/dist/{chunk-G34LV2PF.js → chunk-LBNRH5WM.js} +84 -170
  61. package/dist/{chunk-H6F6BYOH.js → chunk-LZSJBIVT.js} +7003 -7434
  62. package/dist/{chunk-HQQID6OA.js → chunk-M6SHUN7Q.js} +5 -5
  63. package/dist/chunk-MAW544W2.js +1882 -0
  64. package/dist/chunk-MBS4V7ZP.js +217 -0
  65. package/dist/{chunk-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
  66. package/dist/chunk-MNA4JGU4.js +255 -0
  67. package/dist/chunk-MQSRRFWA.js +3428 -0
  68. package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
  69. package/dist/chunk-OAO4GE4M.js +619 -0
  70. package/dist/chunk-OHHN2SO4.js +5135 -0
  71. package/dist/chunk-OKGUZO2U.js +34 -0
  72. package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
  73. package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
  74. package/dist/chunk-OQE5J4C6.js +73 -0
  75. package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
  76. package/dist/chunk-POHLU5DW.js +1186 -0
  77. package/dist/chunk-QKMUKYO7.js +4961 -0
  78. package/dist/{chunk-ASND7OZK.js → chunk-QTYWRVRA.js} +13 -13
  79. package/dist/{chunk-EYOKLTMF.js → chunk-SRF2PJNW.js} +17 -3
  80. package/dist/chunk-SST6Z5JA.js +80 -0
  81. package/dist/chunk-STBPMHSX.js +2456 -0
  82. package/dist/chunk-T6YILFSB.js +80 -0
  83. package/dist/chunk-TZTZS7QK.js +227 -0
  84. package/dist/chunk-UOV2BYIW.js +107 -0
  85. package/dist/{chunk-Q3RUPKEJ.js → chunk-V4RXGQ5Q.js} +58 -189
  86. package/dist/chunk-VAKQQHWR.js +434 -0
  87. package/dist/chunk-VG7TBQIY.js +128 -0
  88. package/dist/chunk-VJWL6YS5.js +244 -0
  89. package/dist/chunk-WEH5XRJQ.js +32 -0
  90. package/dist/chunk-WMSVI4G2.js +2095 -0
  91. package/dist/chunk-WVO7V2QY.js +797 -0
  92. package/dist/chunk-X4RCMKVQ.js +641 -0
  93. package/dist/chunk-X75S7HFS.js +374 -0
  94. package/dist/chunk-XN3L4EYL.js +46 -0
  95. package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
  96. package/dist/chunk-YHZX5GEU.js +193 -0
  97. package/dist/chunk-YXLYO42X.js +91 -0
  98. package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
  99. package/dist/chunk-ZI647VB5.js +37 -0
  100. package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
  101. package/dist/cli/index.js +62 -54
  102. package/dist/clio-4LY5K2AC.js +25 -0
  103. package/dist/code-nav-7AX6FYE6.js +600 -0
  104. package/dist/codewiki/build-worker.js +66 -0
  105. package/dist/compile-cache-CVJMMODC.js +18 -0
  106. package/dist/{components-DMAOEKFB.js → components-KELWS457.js} +11 -6
  107. package/dist/{config-IRUQ7SE4.js → config-GTLUW2PR.js} +92 -55
  108. package/dist/configure-R6A64DHX.js +42 -0
  109. package/dist/context-5VKGUVJJ.js +866 -0
  110. package/dist/{context-3KWFLHJG.js → context-JFZEJ7W5.js} +15 -13
  111. package/dist/{context-5RADCKTR.js → context-RW5HC47S.js} +71 -35
  112. package/dist/{context-clear-7TSNPAAI.js → context-clear-6ZHBAZZT.js} +54 -28
  113. package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
  114. package/dist/dispatch-runner-VKBRCWQC.js +1997 -0
  115. package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
  116. package/dist/{doctor-UC5NAJYQ.js → doctor-KI767GSN.js} +27 -17
  117. package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
  118. package/dist/{evidence-YEGUW4L3.js → evidence-UA6AWDQQ.js} +46 -26
  119. package/dist/{evolve-TXARCTPG.js → evolve-QNTFGV6Z.js} +45 -25
  120. package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
  121. package/dist/{fleet-6G3DHNYE.js → fleet-Q7UOMUSG.js} +163 -54
  122. package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
  123. package/dist/{init-KZ5QTF6M.js → init-WBB65ZHQ.js} +69 -32
  124. package/dist/{memory-73ESV5YC.js → memory-MD3O64RI.js} +48 -27
  125. package/dist/{models-A4PVNWJK.js → models-BZU34YWD.js} +39 -25
  126. package/dist/monitor-MEQA5C3I.js +661 -0
  127. package/dist/{chunk-FCIH3BIZ.js → orchestrator-CGFKEP27.js} +11832 -8687
  128. package/dist/{paths-C4H6IV77.js → paths-UXLN5YYZ.js} +10 -5
  129. package/dist/{preload-6WVMHX3A.js → preload-P6DGH2PZ.js} +2 -2
  130. package/dist/{reset-BGW6OGMV.js → reset-L2FQEE3E.js} +16 -10
  131. package/dist/{run-YTPEYQOH.js → run-IV4Q6RLN.js} +101 -61
  132. package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
  133. package/dist/{skills-2V6RA3OQ.js → skills-LQEKRDTN.js} +34 -14
  134. package/dist/{skills-eval-S2TVJO4F.js → skills-eval-3DC4HEWS.js} +70 -34
  135. package/dist/steer-GGWFUJUD.js +77 -0
  136. package/dist/{targets-TYXLPB23.js → targets-C4SSGQOB.js} +43 -27
  137. package/dist/terminal-lease-IT5JW2NR.js +395 -0
  138. package/dist/{trace-GGOJ6Q6Z.js → trace-PNCASAXC.js} +41 -16
  139. package/dist/{chunk-N6F52NLF.js → tree-sitter-HGKH6LG4.js} +28 -2306
  140. package/dist/{uninstall-LLLT4F4W.js → uninstall-FZCQCDKC.js} +10 -5
  141. package/dist/{upgrade-33G2LMM5.js → upgrade-7TT7SQ3G.js} +45 -25
  142. package/dist/{usage-ZAFSXKKG.js → usage-GV4PKT3M.js} +62 -31
  143. package/dist/verify-G6V4D2G7.js +716 -0
  144. package/dist/web-fetch-2YHJ3KTG.js +638 -0
  145. package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-DQF6Z66B.js} +74 -34
  146. package/dist/worker/entry.js +221 -36
  147. package/dist/workspace-G4ZWUIPR.js +22 -0
  148. package/docs/README.md +22 -17
  149. package/docs/acp.md +168 -16
  150. package/docs/alcf-provider.md +1 -1
  151. package/docs/architecture.md +136 -7
  152. package/docs/artifact-versions.md +1 -1
  153. package/docs/built-in-agents.md +1 -1
  154. package/docs/capacity-and-scheduling.md +1 -1
  155. package/docs/commands-and-modes.md +114 -71
  156. package/docs/config-knobs-audit.md +1 -3
  157. package/docs/configuration-and-targets.md +174 -46
  158. package/docs/context-engine.md +29 -6
  159. package/docs/development-pipeline.md +26 -1
  160. package/docs/dispatch-architecture-rationale.md +1 -1
  161. package/docs/documentation-coverage.md +2 -2
  162. package/docs/documentation-guide.md +1 -1
  163. package/docs/environment-variables.md +13 -5
  164. package/docs/eval-runner.md +1 -1
  165. package/docs/evals-internal.md +1 -1
  166. package/docs/evidence-and-memory.md +6 -2
  167. package/docs/evolution.md +2 -2
  168. package/docs/exit-codes-and-output.md +15 -9
  169. package/docs/extensions-and-sharing.md +9 -9
  170. package/docs/fleet-dispatch.md +7 -5
  171. package/docs/git-commit-provenance.md +120 -0
  172. package/docs/glossary.md +1 -1
  173. package/docs/installation-and-lifecycle.md +34 -27
  174. package/docs/middleware-and-components.md +1 -1
  175. package/docs/model-catalog.md +45 -14
  176. package/docs/observability.md +8 -5
  177. package/docs/performance-methodology.md +491 -0
  178. package/docs/pi-boundary.md +72 -0
  179. package/docs/proactive-memory.md +3 -3
  180. package/docs/prompt-envelope-and-tools.md +24 -3
  181. package/docs/provider-adapter-cookbook.md +57 -4
  182. package/docs/release-cut-checklist.md +129 -115
  183. package/docs/safety-model.md +9 -5
  184. package/docs/scientific-validation.md +3 -3
  185. package/docs/session-lifecycle.md +55 -12
  186. package/docs/skills-marketplace.md +12 -8
  187. package/docs/time-conventions.md +1 -1
  188. package/docs/tool-usage.md +3 -3
  189. package/docs/trace-store.md +1 -1
  190. package/docs/troubleshooting.md +10 -7
  191. package/docs/tui-design.md +47 -10
  192. package/docs/worker-dispatch-mechanics.md +1 -1
  193. package/package.json +19 -22
  194. package/skills/coding/ast-grep/SKILL.md +136 -0
  195. package/skills/coding/ast-grep/evals.md +56 -0
  196. package/skills/coding/ast-grep/references/rule_reference.md +297 -0
  197. package/skills/coding/coding-standards/SKILL.md +113 -0
  198. package/skills/coding/coding-standards/evals.md +34 -0
  199. package/skills/coding/prototype/SKILL.md +86 -0
  200. package/skills/coding/prototype/evals.md +42 -0
  201. package/skills/coding/prototype/references/LOGIC.md +67 -0
  202. package/skills/coding/prototype/references/UI.md +112 -0
  203. package/skills/coding/tdd/SKILL.md +101 -0
  204. package/skills/coding/tdd/evals.md +41 -0
  205. package/skills/coding/tdd/references/mocking.md +59 -0
  206. package/skills/coding/tdd/references/tests.md +77 -0
  207. package/skills/context/context-handoff/SKILL.md +126 -0
  208. package/skills/context/context-handoff/evals.md +57 -0
  209. package/skills/context/context-handoff/scripts/new-handoff.sh +26 -0
  210. package/skills/context/context-prime/SKILL.md +95 -0
  211. package/skills/context/context-prime/evals.md +54 -0
  212. package/skills/meta/clio-dev/SKILL.md +91 -0
  213. package/skills/meta/clio-dev/evals.md +45 -0
  214. package/skills/meta/clio-test/SKILL.md +130 -0
  215. package/skills/meta/clio-test/evals.md +43 -0
  216. package/skills/meta/clio-test/references/harness.md +97 -0
  217. package/skills/meta/clio-test/references/test-map.md +59 -0
  218. package/skills/meta/credentials/SKILL.md +125 -0
  219. package/skills/meta/credentials/evals.md +104 -0
  220. package/skills/meta/find-skills/SKILL.md +72 -0
  221. package/skills/meta/find-skills/evals.md +47 -0
  222. package/skills/meta/herdr/SKILL.md +127 -0
  223. package/skills/meta/herdr/evals.md +38 -0
  224. package/skills/meta/skill-craft/SKILL.md +102 -0
  225. package/skills/meta/skill-craft/evals.md +41 -0
  226. package/skills/planning/architecture/SKILL.md +129 -0
  227. package/skills/planning/architecture/evals.md +36 -0
  228. package/skills/planning/backlog/SKILL.md +90 -0
  229. package/skills/planning/backlog/evals.md +43 -0
  230. package/skills/planning/prd/SKILL.md +82 -0
  231. package/skills/planning/prd/evals.md +49 -0
  232. package/skills/planning/product-intent/SKILL.md +112 -0
  233. package/skills/planning/product-intent/evals.md +36 -0
  234. package/skills/planning/tech-spec/SKILL.md +115 -0
  235. package/skills/planning/tech-spec/evals.md +47 -0
  236. package/skills/registry.yaml +136 -0
  237. package/skills/research/arxiv-literature/SKILL.md +104 -0
  238. package/skills/research/arxiv-literature/evals.md +58 -0
  239. package/skills/research/experiment-protocol/SKILL.md +122 -0
  240. package/skills/research/experiment-protocol/evals.md +91 -0
  241. package/skills/research/scientific-debugging/SKILL.md +119 -0
  242. package/skills/research/scientific-debugging/evals.md +138 -0
  243. package/skills/research/scientific-modernization/SKILL.md +138 -0
  244. package/skills/research/scientific-modernization/evals.md +84 -0
  245. package/skills/workflow/design-council/SKILL.md +139 -0
  246. package/skills/workflow/design-council/evals.md +97 -0
  247. package/skills/workflow/grill-me/SKILL.md +186 -0
  248. package/skills/workflow/grill-me/evals.md +78 -0
  249. package/skills/workflow/workflow-distiller/SKILL.md +136 -0
  250. package/skills/workflow/workflow-distiller/evals.md +107 -0
  251. package/src/cli/acp.ts +31 -4
  252. package/src/cli/clio.ts +68 -6
  253. package/src/cli/config-inspect.ts +28 -22
  254. package/src/cli/configure.ts +47 -9
  255. package/src/cli/context-clear.ts +2 -2
  256. package/src/cli/context-index.ts +21 -23
  257. package/src/cli/context.ts +13 -8
  258. package/src/cli/default-target.ts +9 -17
  259. package/src/cli/docs.ts +11 -5
  260. package/src/cli/evidence.ts +4 -1
  261. package/src/cli/extensions.ts +10 -1
  262. package/src/cli/fleet.ts +47 -6
  263. package/src/cli/index.ts +55 -26
  264. package/src/cli/memory.ts +3 -1
  265. package/src/cli/models.ts +1 -1
  266. package/src/cli/modes/json-stream.ts +37 -1
  267. package/src/cli/modes/print.ts +24 -9
  268. package/src/cli/run.ts +2 -2
  269. package/src/cli/skills-eval.ts +23 -8
  270. package/src/cli/skills.ts +19 -4
  271. package/src/cli/targets.ts +4 -0
  272. package/src/cli/text-layout.ts +15 -5
  273. package/src/cli/trace.ts +62 -14
  274. package/src/cli/upgrade.ts +18 -2
  275. package/src/cli/usage.ts +10 -3
  276. package/src/cli/wiki-generate.ts +2 -1
  277. package/src/core/agent-environment.ts +7 -0
  278. package/src/core/bash-exec.ts +72 -1
  279. package/src/core/boot-trace.ts +9 -4
  280. package/src/core/bus-events.ts +20 -4
  281. package/src/core/commit-attribution.ts +157 -0
  282. package/src/core/compile-cache.ts +159 -0
  283. package/src/core/config.ts +131 -2
  284. package/src/core/defaults.ts +39 -5
  285. package/src/core/domain-loader.ts +12 -5
  286. package/src/core/git-commit-attribution.ts +362 -0
  287. package/src/core/incomplete-installation.ts +45 -0
  288. package/src/core/response-schema.ts +1 -1
  289. package/src/core/safe-exec.ts +13 -1
  290. package/src/core/settings-layers.ts +155 -21
  291. package/src/core/skill-activation.ts +1 -1
  292. package/src/core/startup-timer.ts +3 -3
  293. package/src/core/state-file-lock.ts +13 -1
  294. package/src/core/termination.ts +78 -5
  295. package/src/domains/config/classify.ts +15 -3
  296. package/src/domains/config/extension.ts +19 -13
  297. package/src/domains/config/index.ts +10 -0
  298. package/src/domains/config/keybindings.ts +42 -6
  299. package/src/domains/context/bootstrap-prompt.ts +1 -1
  300. package/src/domains/context/bootstrap.ts +111 -18
  301. package/src/domains/context/clear.ts +16 -11
  302. package/src/domains/context/clio-md.ts +111 -9
  303. package/src/domains/context/codewiki/artifact.ts +400 -0
  304. package/src/domains/context/codewiki/build-worker-protocol.ts +24 -0
  305. package/src/domains/context/codewiki/build-worker.ts +54 -0
  306. package/src/domains/context/codewiki/coordinator.ts +182 -0
  307. package/src/domains/context/codewiki/indexer.ts +59 -144
  308. package/src/domains/context/codewiki/paths.ts +67 -0
  309. package/src/domains/context/codewiki/schema.ts +80 -0
  310. package/src/domains/context/codewiki/tree-sitter.ts +1 -1
  311. package/src/domains/context/contract.ts +11 -5
  312. package/src/domains/context/extension.ts +94 -143
  313. package/src/domains/context/fingerprint.ts +3 -1
  314. package/src/domains/context/index.ts +12 -22
  315. package/src/domains/context/project-metadata.ts +19 -0
  316. package/src/domains/context/prompt-context.ts +9 -10
  317. package/src/domains/context/refresh.ts +29 -21
  318. package/src/domains/context/runtime.ts +17 -0
  319. package/src/domains/context/wiki/generate.ts +39 -34
  320. package/src/domains/context/wiki/plan.ts +1 -1
  321. package/src/domains/context/wiki/prompts.ts +21 -8
  322. package/src/domains/dispatch/code-step.ts +20 -1
  323. package/src/domains/dispatch/extension.ts +158 -21
  324. package/src/domains/dispatch/failure-classification.ts +6 -0
  325. package/src/domains/dispatch/fleet-commit-attribution.ts +56 -0
  326. package/src/domains/dispatch/orphan-recovery.ts +50 -8
  327. package/src/domains/dispatch/receipt-integrity.ts +5 -0
  328. package/src/domains/dispatch/state.ts +31 -6
  329. package/src/domains/dispatch/transport.ts +2 -1
  330. package/src/domains/dispatch/types.ts +14 -0
  331. package/src/domains/dispatch/worker-spawn.ts +21 -2
  332. package/src/domains/eval/metrics/context.ts +1 -1
  333. package/src/domains/eval/types.ts +0 -1
  334. package/src/domains/evidence/build.ts +41 -1
  335. package/src/domains/lifecycle/migrations/2026-08-18-lmstudio-runtime-id.ts +52 -0
  336. package/src/domains/lifecycle/migrations/index.ts +24 -4
  337. package/src/domains/middleware/hooks-io.ts +12 -0
  338. package/src/domains/middleware/skills-reminder.ts +30 -15
  339. package/src/domains/prompts/compiler.ts +142 -84
  340. package/src/domains/prompts/contract.ts +18 -2
  341. package/src/domains/prompts/extension.ts +39 -7
  342. package/src/domains/prompts/fragment-loader.ts +0 -1
  343. package/src/domains/prompts/fragments/identity/clio.md +2 -4
  344. package/src/domains/prompts/fragments/identity/docs-routing.md +10 -0
  345. package/src/domains/prompts/fragments/identity/self-awareness.md +1 -45
  346. package/src/domains/prompts/fragments/operating/contract.md +4 -50
  347. package/src/domains/prompts/fragments/operating/delegation.md +42 -0
  348. package/src/domains/prompts/fragments/operating/skills.md +26 -0
  349. package/src/domains/prompts/fragments/operating/worker.md +16 -0
  350. package/src/domains/prompts/fragments/safety/auto-edit.md +5 -5
  351. package/src/domains/prompts/fragments/safety/full-auto.md +3 -3
  352. package/src/domains/prompts/fragments/safety/read-only.md +4 -4
  353. package/src/domains/prompts/fragments/safety/suggest.md +2 -2
  354. package/src/domains/prompts/fragments/wiki/page.md +10 -0
  355. package/src/domains/prompts/fragments/wiki/plan.md +10 -0
  356. package/src/domains/prompts/preload.ts +3 -3
  357. package/src/domains/providers/auth/api-key.ts +1 -1
  358. package/src/domains/providers/auth/backend-file.ts +20 -10
  359. package/src/domains/providers/auth/backend-memory.ts +59 -4
  360. package/src/domains/providers/auth/boot-status.ts +65 -0
  361. package/src/domains/providers/auth/oauth.ts +2 -1
  362. package/src/domains/providers/auth/storage.ts +97 -38
  363. package/src/domains/providers/capabilities.ts +12 -4
  364. package/src/domains/providers/contract.ts +15 -4
  365. package/src/domains/providers/extension.ts +18 -6
  366. package/src/domains/providers/model-runtime-capabilities.ts +15 -4
  367. package/src/domains/providers/models/local-models/clio-local-coding-targets.yaml +118 -35
  368. package/src/domains/providers/plugins.ts +5 -3
  369. package/src/domains/providers/probe/fingerprint.ts +25 -5
  370. package/src/domains/providers/registry.ts +31 -10
  371. package/src/domains/providers/runtimes/boot-manifest.ts +55 -0
  372. package/src/domains/providers/runtimes/builtins.ts +2 -2
  373. package/src/domains/providers/runtimes/common/lmstudio-http.ts +423 -0
  374. package/src/domains/providers/runtimes/common/local-synth.ts +6 -7
  375. package/src/domains/providers/runtimes/local-native/lmstudio.ts +241 -0
  376. package/src/domains/providers/support.ts +6 -3
  377. package/src/domains/providers/types/local-model-quirks.ts +7 -9
  378. package/src/domains/providers/types/runtime-descriptor.ts +12 -1
  379. package/src/domains/providers/types/target-descriptor.ts +22 -0
  380. package/src/domains/resources/contract.ts +0 -1
  381. package/src/domains/resources/extension.ts +1 -3
  382. package/src/domains/resources/loader.ts +3 -4
  383. package/src/domains/resources/prompts/loader.ts +16 -2
  384. package/src/domains/resources/prompts/substitute.ts +1 -65
  385. package/src/domains/resources/skills/content-hash.ts +2 -0
  386. package/src/domains/resources/skills/install.ts +17 -0
  387. package/src/domains/resources/skills/loader.ts +17 -10
  388. package/src/domains/resources/skills/marketplace.ts +55 -9
  389. package/src/domains/safety/action-classifier.ts +4 -2
  390. package/src/domains/safety/audit.ts +8 -2
  391. package/src/domains/safety/extension.ts +1 -1
  392. package/src/domains/session/compaction/branch-summary.ts +3 -2
  393. package/src/domains/session/compaction/cut-point.ts +2 -1
  394. package/src/domains/session/compaction/tokens.ts +2 -1
  395. package/src/domains/session/context-ledger.ts +14 -0
  396. package/src/domains/session/contract.ts +15 -0
  397. package/src/domains/session/decision-board.ts +190 -0
  398. package/src/domains/session/entries.ts +66 -3
  399. package/src/domains/session/extension.ts +93 -12
  400. package/src/domains/session/retry.ts +10 -18
  401. package/src/domains/session/session-artifacts.ts +107 -0
  402. package/src/domains/session/task-board.ts +207 -13
  403. package/src/domains/session/tree/active-path.ts +44 -5
  404. package/src/domains/session/tree/fork.ts +26 -27
  405. package/src/domains/session/tree/preview.ts +2 -2
  406. package/src/domains/session/workspace/git-probe.ts +17 -11
  407. package/src/domains/user-tasks/store.ts +297 -0
  408. package/src/engine/acp/errors.ts +96 -0
  409. package/src/engine/acp/server.ts +1728 -146
  410. package/src/engine/acp/transport.ts +135 -14
  411. package/src/engine/acp/types.ts +26 -0
  412. package/src/engine/agent.ts +3 -3
  413. package/src/engine/ai.ts +32 -27
  414. package/src/engine/alcf-oauth.ts +26 -19
  415. package/src/engine/api-registry.ts +223 -0
  416. package/src/engine/apis/index.ts +3 -7
  417. package/src/engine/apis/llamacpp-residency.ts +49 -9
  418. package/src/engine/apis/lmstudio-residency.ts +5 -21
  419. package/src/engine/apis/lmstudio.ts +243 -0
  420. package/src/engine/apis/ollama-native.ts +24 -3
  421. package/src/engine/apis/openai-completions.ts +170 -91
  422. package/src/engine/apis/residency.ts +139 -3
  423. package/src/engine/apis/types.ts +16 -0
  424. package/src/engine/env-api-keys.ts +98 -0
  425. package/src/engine/gemma-channel-filter.ts +223 -0
  426. package/src/engine/instrumented-tui.ts +192 -0
  427. package/src/engine/messages.ts +14 -0
  428. package/src/engine/models.ts +42 -0
  429. package/src/engine/oauth.ts +16 -12
  430. package/src/engine/prompt-templates.ts +1 -0
  431. package/src/engine/provider-payload.ts +16 -59
  432. package/src/engine/strip-tokenizer-sentinels.ts +1 -1
  433. package/src/engine/truncate.ts +9 -0
  434. package/src/engine/tui.ts +17 -9
  435. package/src/engine/types.ts +3 -6
  436. package/src/engine/worker-runtime-capabilities.ts +5 -0
  437. package/src/engine/worker-runtime.ts +1 -1
  438. package/src/engine/worker-tools.ts +9 -4
  439. package/src/entry/boot-options.ts +50 -0
  440. package/src/entry/orchestrator.ts +288 -150
  441. package/src/interactive/application-controller.ts +89 -2
  442. package/src/interactive/chat-loop.ts +266 -41
  443. package/src/interactive/chat-panel.ts +173 -47
  444. package/src/interactive/chat-renderer.ts +262 -72
  445. package/src/interactive/clio-editor.ts +3 -8
  446. package/src/interactive/command-fallbacks.ts +2 -2
  447. package/src/interactive/context-overlay.ts +27 -1
  448. package/src/interactive/editor-submit.ts +228 -24
  449. package/src/interactive/export-html/ansi-to-html.ts +161 -0
  450. package/src/interactive/export-html/index.ts +51 -0
  451. package/src/interactive/export-html/template.ts +45 -0
  452. package/src/interactive/export-html/tool-renderer.ts +54 -0
  453. package/src/interactive/footer/dashboard.ts +4 -0
  454. package/src/interactive/footer/notifications.ts +1 -1
  455. package/src/interactive/footer/widgets.ts +20 -2
  456. package/src/interactive/footer-panel.ts +2 -2
  457. package/src/interactive/format-time.ts +14 -2
  458. package/src/interactive/interactive-application.ts +201 -17
  459. package/src/interactive/interactive-event-projection.ts +6 -1
  460. package/src/interactive/interactive-input-runtime.ts +50 -4
  461. package/src/interactive/interactive-presentation.ts +151 -19
  462. package/src/interactive/interactive-shell.ts +268 -14
  463. package/src/interactive/interactive-slash-runtime.ts +176 -114
  464. package/src/interactive/interactive-tickers.ts +38 -7
  465. package/src/interactive/keybinding-manager.ts +1 -1
  466. package/src/interactive/layout.ts +40 -3
  467. package/src/interactive/overlay-frame.ts +1 -1
  468. package/src/interactive/overlay-general-openers.ts +58 -1
  469. package/src/interactive/overlay-key-routing.ts +3 -0
  470. package/src/interactive/overlay-lifecycle.ts +13 -0
  471. package/src/interactive/overlay-permission-lifecycle.ts +2 -1
  472. package/src/interactive/overlay-session-lifecycle.ts +69 -12
  473. package/src/interactive/overlays/decisions.ts +300 -0
  474. package/src/interactive/overlays/help-reference.ts +15 -10
  475. package/src/interactive/overlays/model-selector.ts +34 -16
  476. package/src/interactive/overlays/session-selector.ts +18 -0
  477. package/src/interactive/overlays/settings.ts +105 -17
  478. package/src/interactive/overlays/skills-hub.ts +4 -4
  479. package/src/interactive/overlays/tree-selector.ts +41 -6
  480. package/src/interactive/render-trace.ts +499 -90
  481. package/src/interactive/renderers/compaction-summary.ts +2 -2
  482. package/src/interactive/renderers/diff.ts +115 -104
  483. package/src/interactive/renderers/mermaid.ts +53 -0
  484. package/src/interactive/renderers/tool-execution.ts +386 -133
  485. package/src/interactive/renderers/worker-entry.ts +20 -4
  486. package/src/interactive/session-switch-settlement.ts +10 -0
  487. package/src/interactive/slash-autocomplete.ts +6 -114
  488. package/src/interactive/slash-commands.ts +135 -47
  489. package/src/interactive/slash-spec.ts +9 -38
  490. package/src/interactive/status/controller.ts +5 -1
  491. package/src/interactive/stdout-backpressure.ts +99 -0
  492. package/src/interactive/stream-pacer.ts +530 -0
  493. package/src/interactive/stream-pacing-policy.ts +66 -0
  494. package/src/interactive/tasks-overlay.ts +368 -14
  495. package/src/interactive/terminal-lease.ts +485 -0
  496. package/src/interactive/theme/tokens.ts +1 -1
  497. package/src/interactive/turn-context.ts +4 -3
  498. package/src/interactive/turn-persistence.ts +30 -13
  499. package/src/interactive/turn-queues.ts +12 -0
  500. package/src/interactive/turn-recovery.ts +25 -8
  501. package/src/interactive/turn-runtime.ts +79 -12
  502. package/src/interactive/turn-state.ts +10 -0
  503. package/src/interactive/view/artifacts.ts +114 -4
  504. package/src/interactive/view/view-overlay.ts +3 -0
  505. package/src/interactive/welcome-dashboard.ts +17 -16
  506. package/src/interactive/worker-receipts.ts +52 -3
  507. package/src/interactive/worker-stream.ts +5 -1
  508. package/src/tools/agent-tools.ts +23 -3
  509. package/src/tools/artifact.ts +2 -2
  510. package/src/tools/ask-user.ts +23 -13
  511. package/src/tools/bash.ts +30 -2
  512. package/src/tools/bootstrap.ts +34 -431
  513. package/src/tools/builtin-tool-catalog.ts +265 -0
  514. package/src/tools/codewiki/code-nav-surface.ts +29 -0
  515. package/src/tools/codewiki/code-nav.ts +8 -22
  516. package/src/tools/codewiki/shared.ts +41 -38
  517. package/src/tools/context/docs-engine.ts +14 -3
  518. package/src/tools/context/index.ts +107 -28
  519. package/src/tools/context/surface.ts +19 -0
  520. package/src/tools/core-bootstrap.ts +168 -0
  521. package/src/tools/credential-present.ts +5 -5
  522. package/src/tools/dispatch-admission.ts +533 -0
  523. package/src/tools/dispatch-background.ts +54 -0
  524. package/src/tools/dispatch-event-text.ts +6 -0
  525. package/src/tools/dispatch-plan.ts +9 -4
  526. package/src/tools/dispatch-run-events.ts +238 -0
  527. package/src/tools/dispatch-runner.ts +2370 -0
  528. package/src/tools/dispatch-scout-admission.ts +295 -0
  529. package/src/tools/dispatch-types.ts +77 -0
  530. package/src/tools/dispatch.ts +67 -3161
  531. package/src/tools/find.ts +4 -2
  532. package/src/tools/grep.ts +2 -2
  533. package/src/tools/lazy-tool.ts +60 -0
  534. package/src/tools/ledger.ts +3 -3
  535. package/src/tools/monitor-surface.ts +36 -0
  536. package/src/tools/monitor.ts +2 -32
  537. package/src/tools/observers.ts +2 -2
  538. package/src/tools/registry.ts +39 -27
  539. package/src/tools/safe-exec.ts +2 -2
  540. package/src/tools/steer-surface.ts +17 -0
  541. package/src/tools/steer.ts +2 -13
  542. package/src/tools/tasks.ts +108 -11
  543. package/src/tools/truncate.ts +25 -184
  544. package/src/tools/verify/frontend.ts +3 -1
  545. package/src/tools/verify/index.ts +3 -38
  546. package/src/tools/verify/surface.ts +46 -0
  547. package/src/tools/web-fetch-surface.ts +23 -0
  548. package/src/tools/web-fetch.ts +2 -20
  549. package/src/tools/write.ts +7 -2
  550. package/src/worker/entry.ts +39 -2
  551. package/src/worker/spec-contract.ts +26 -5
  552. package/dist/chunk-7SS2CTV2.js +0 -61361
  553. package/dist/chunk-DKGKUHFA.js +0 -924
  554. package/dist/chunk-GEP36Y4X.js +0 -12796
  555. package/dist/chunk-XYWBQRDM.js +0 -137
  556. package/dist/clio-BZVGEUFJ.js +0 -58
  557. package/dist/configure-S7S6F6CL.js +0 -32
  558. package/docs/html/agents_blueprint.html +0 -936
  559. package/docs/html/alcf_blueprint.html +0 -324
  560. package/docs/html/architecture_blueprint.html +0 -850
  561. package/docs/html/commands_blueprint.html +0 -939
  562. package/docs/html/config_knobs_audit_blueprint.html +0 -178
  563. package/docs/html/configuration_blueprint.html +0 -1080
  564. package/docs/html/context_blueprint.html +0 -603
  565. package/docs/html/documentation_blueprint.html +0 -832
  566. package/docs/html/environment_blueprint.html +0 -404
  567. package/docs/html/eval_blueprint.html +0 -743
  568. package/docs/html/evals_internal_blueprint.html +0 -190
  569. package/docs/html/evolution_blueprint.html +0 -674
  570. package/docs/html/extensions_blueprint.html +0 -2065
  571. package/docs/html/fleet_dispatch_blueprint.html +0 -286
  572. package/docs/html/index.html +0 -919
  573. package/docs/html/lifecycle_blueprint.html +0 -723
  574. package/docs/html/memory_blueprint.html +0 -699
  575. package/docs/html/middleware_blueprint.html +0 -664
  576. package/docs/html/models_blueprint.html +0 -2366
  577. package/docs/html/observability_blueprint.html +0 -683
  578. package/docs/html/provider_adapter_blueprint.html +0 -245
  579. package/docs/html/safety_blueprint.html +0 -1386
  580. package/docs/html/shared.css +0 -571
  581. package/docs/html/shared.js +0 -143
  582. package/docs/html/skills_blueprint.html +0 -671
  583. package/docs/html/soak_blueprint.html +0 -182
  584. package/docs/html/tool_usage_blueprint.html +0 -350
  585. package/docs/html/tools_blueprint.html +0 -2249
  586. package/docs/html/trace_blueprint.html +0 -235
  587. package/docs/html/tui_design_blueprint.html +0 -374
  588. package/docs/html/validation_blueprint.html +0 -961
  589. package/docs/html/worker_dispatch_blueprint.html +0 -231
  590. package/src/core/release.ts +0 -2
  591. package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
  592. package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
  593. package/src/engine/apis/lmstudio-native.ts +0 -1438
  594. package/src/engine/apis/thinking-replay.ts +0 -11
  595. package/src/tools/string-enum.ts +0 -15
@@ -23,6 +23,8 @@ export interface ClioAppKeybindings {
23
23
  "clio.status.toggle": true;
24
24
  "clio.session.tree": true;
25
25
  "clio.dispatchBoard.toggle": true;
26
+ "clio.tasks.open": true;
27
+ "clio.decisions.open": true;
26
28
  "clio.dispatch.background": true;
27
29
  "clio.model.select": true;
28
30
  "clio.model.cycleForward": true;
@@ -34,6 +36,7 @@ export interface ClioAppKeybindings {
34
36
  "clio.thinking.expandAll": true;
35
37
  "clio.editor.external": true;
36
38
  "clio.message.followUp": true;
39
+ "clio.message.interrupt": true;
37
40
  "clio.message.dequeue": true;
38
41
  "clio.notifications.dismiss": true;
39
42
  "clio.leader": true;
@@ -59,10 +62,11 @@ declare module "@earendil-works/pi-tui" {
59
62
  * `ctrl+d`, and the portable `ctrl+g` leader retained because every terminal
60
63
  * already transmits them). `Alt + <letter>` decodes from the legacy
61
64
  * `ESC <letter>` sequence on meta-capable terminals. The chosen letters avoid
62
- * pi-tui's editor reserves (`alt+b/f/d/y`, and the `ESC n`/`ESC p` aliases for
63
- * `alt+down`/`alt+up`) and the readline/terminal line-editing reserves the
64
- * router relies on for editor behavior. The CSI-u/reserved-key detector in
65
- * `keybinding-manager.ts` stays as a safety net for user rebinds.
65
+ * pi-tui's editor reserves except for the approved `Alt+B` and `Alt+D`
66
+ * application-boundary overrides. They open the task and decision boards
67
+ * before the editor can interpret those chords as word-back or word-delete.
68
+ * The CSI-u/reserved-key detector in `keybinding-manager.ts` stays as a safety
69
+ * net for user rebinds.
66
70
  */
67
71
  export const CLIO_APP_KEYBINDINGS = {
68
72
  "clio.thinking.cycle": {
@@ -85,6 +89,16 @@ export const CLIO_APP_KEYBINDINGS = {
85
89
  defaultKeys: "alt+w",
86
90
  description: "Toggle the dispatch (workers) board overlay",
87
91
  },
92
+ "clio.tasks.open": {
93
+ // Approved application-boundary override of pi-tui editor word-back.
94
+ defaultKeys: "alt+b",
95
+ description: "Open the composite session and operator task board",
96
+ },
97
+ "clio.decisions.open": {
98
+ // Approved application-boundary override of pi-tui editor word-delete.
99
+ defaultKeys: "alt+d",
100
+ description: "Open the settled interview decision board",
101
+ },
88
102
  "clio.dispatch.background": {
89
103
  // Ctrl+B alone is pi-tui's editor cursor-left, so the Claude Code chord
90
104
  // cannot be the primary here. Alt+S ("send to background") keeps the app
@@ -139,7 +153,16 @@ export const CLIO_APP_KEYBINDINGS = {
139
153
  },
140
154
  "clio.message.followUp": {
141
155
  defaultKeys: "alt+enter",
142
- description: "Queue the current input as a follow-up delivered after the active run (Enter steers the run live)",
156
+ description:
157
+ "End of turn: queue the current input for delivery when the active run settles (Enter delivers it at the next slot, between tool batches)",
158
+ },
159
+ "clio.message.interrupt": {
160
+ // Alt+I keeps the app scheme and earns the Ctrl+G leader fallback. A
161
+ // Ctrl+Enter chord was rejected because legacy terminals send it as a
162
+ // plain Enter, which would turn every send into a cancel.
163
+ defaultKeys: "alt+i",
164
+ description:
165
+ "Interrupt: cancel the active run and deliver the current input now (refused while an attached dispatch runs or a permission ask is parked; the input then queues for the next slot)",
143
166
  },
144
167
  "clio.message.dequeue": {
145
168
  defaultKeys: "alt+up",
@@ -155,9 +178,22 @@ export const CLIO_APP_KEYBINDINGS = {
155
178
  },
156
179
  } as const satisfies KeybindingDefinitions;
157
180
 
158
- /** Full definition table = pi-tui editor/select defaults + Clio app ids. */
181
+ /**
182
+ * Full definition table = pi-tui editor/select defaults + Clio app ids.
183
+ * pi-tui 0.84 supplies dedicated prompt-history actions but leaves them
184
+ * unbound for applications to place. Clio uses the readline-style Ctrl+P and
185
+ * Ctrl+N pair because its model cycling already lives on Alt+J and Alt+K.
186
+ */
159
187
  export const CLIO_KEYBINDINGS = {
160
188
  ...TUI_KEYBINDINGS,
189
+ "tui.editor.historyPrevious": {
190
+ ...TUI_KEYBINDINGS["tui.editor.historyPrevious"],
191
+ defaultKeys: "ctrl+p",
192
+ },
193
+ "tui.editor.historyNext": {
194
+ ...TUI_KEYBINDINGS["tui.editor.historyNext"],
195
+ defaultKeys: "ctrl+n",
196
+ },
161
197
  ...CLIO_APP_KEYBINDINGS,
162
198
  } as const satisfies KeybindingDefinitions;
163
199
 
@@ -3,7 +3,7 @@ import type { ProjectType } from "../session/workspace/project-type.js";
3
3
  import type { AdoptionScanResult } from "./adoption.js";
4
4
  import type { BootstrapStructuredOutput } from "./bootstrap.js";
5
5
  import { renderCodewikiDigest } from "./codewiki/digest.js";
6
- import type { Codewiki } from "./codewiki/indexer.js";
6
+ import type { Codewiki } from "./codewiki/schema.js";
7
7
  import type { SiblingContextFile } from "./sibling-files.js";
8
8
 
9
9
  export const BOOTSTRAP_PROMPT = `You are the clio-coder bootstrap agent. Your job is to write the custom sections of CLIO-CODER.md for the project at <cwd>. CLIO-CODER.md is a lean, project-specific handbook that the clio-coder coding agent loads on every session, so write for an experienced engineer who has never seen this repository and is about to change it.
@@ -12,9 +12,10 @@ import {
12
12
  scanAgentConfigs,
13
13
  } from "./adoption.js";
14
14
  import { type ClioMdSection, type ParsedClioMd, parseClioMd, serializeClioMd, tryReadClioMd } from "./clio-md.js";
15
- import { buildCodewiki, type Codewiki, writeCodewiki } from "./codewiki/indexer.js";
16
- import { computeFingerprint } from "./fingerprint.js";
17
- import { type ProjectMetadata, readProjectMetadata } from "./project-metadata.js";
15
+ import { buildCodewikiCandidate, coordinateCodewikiWrite } from "./codewiki/coordinator.js";
16
+ import type { Codewiki } from "./codewiki/schema.js";
17
+ import type { Fingerprint } from "./fingerprint.js";
18
+ import { hasTomlTable, type ProjectMetadata, readProjectMetadata } from "./project-metadata.js";
18
19
  import { renderPromptContext } from "./prompt-context.js";
19
20
  import type { SiblingContextFile } from "./sibling-files.js";
20
21
  import {
@@ -454,6 +455,71 @@ export function packageManager(cwd: string): PackageManager {
454
455
  /** A script whose command rewrites the tree cannot serve as a verification gate. */
455
456
  const MUTATING_SCRIPT_RE = /(?:^|\s)--(?:fix|write)(?:\s|$)/;
456
457
 
458
+ /**
459
+ * First preset a human could actually invoke: named and not hidden. Hidden
460
+ * presets exist only to be inherited from, so naming one in the handbook would
461
+ * hand the agent a command CMake refuses to run.
462
+ */
463
+ function cmakePresetName(presets: unknown, key: string): string | null {
464
+ if (typeof presets !== "object" || presets === null || Array.isArray(presets)) return null;
465
+ const list = (presets as Record<string, unknown>)[key];
466
+ if (!Array.isArray(list)) return null;
467
+ for (const entry of list) {
468
+ if ((entry as Record<string, unknown> | null)?.hidden === true) continue;
469
+ const name = stringField(entry, "name");
470
+ if (name !== null) return name;
471
+ }
472
+ return null;
473
+ }
474
+
475
+ /**
476
+ * CMake presets are the project's own declared configure/build/test recipes,
477
+ * the same authority package.json scripts carry for Node. A CMake tree without
478
+ * presets stays silent: nothing there declares a runnable command, and a
479
+ * guessed `cmake -B build` fails on exactly the toolchain-file and MPI-wrapper
480
+ * projects this tool targets. Configure, build, and test are each named
481
+ * independently: a project can declare a visible build preset without a
482
+ * visible configure preset (e.g. the configure preset is the hidden base
483
+ * every build preset inherits from), and that build command is still one the
484
+ * agent can run.
485
+ */
486
+ function cmakeVerificationLines(cwd: string): string[] {
487
+ const presets = readJsonFile(join(cwd, "CMakePresets.json"));
488
+ if (presets === null) return [];
489
+ const configure = cmakePresetName(presets, "configurePresets");
490
+ const build = cmakePresetName(presets, "buildPresets");
491
+ const test = cmakePresetName(presets, "testPresets");
492
+ const lines: string[] = [];
493
+ if (configure !== null) lines.push(`Configure with \`cmake --preset ${configure}\`.`);
494
+ if (build !== null) lines.push(`Build with \`cmake --build --preset ${build}\`.`);
495
+ if (test !== null) lines.push(`Run tests with \`ctest --preset ${test}\`.`);
496
+ return lines;
497
+ }
498
+
499
+ /**
500
+ * Python has no single scripts manifest, so this names a runner only where the
501
+ * project declares one: a tox configuration declares `tox`, and a declared
502
+ * pytest configuration declares `pytest`. An undeclared layout stays silent
503
+ * rather than guessing `python -m unittest` at a repository that tests some
504
+ * other way. Tox wins when both are declared because it typically wraps the
505
+ * pytest run.
506
+ */
507
+ function pythonVerificationLines(cwd: string): string[] {
508
+ let pyproject = "";
509
+ try {
510
+ pyproject = readFileSync(join(cwd, "pyproject.toml"), "utf8");
511
+ } catch {
512
+ pyproject = "";
513
+ }
514
+ if (existsSync(join(cwd, "tox.ini")) || hasTomlTable(pyproject, "tool.tox")) {
515
+ return ["Run `tox` before handoff."];
516
+ }
517
+ if (existsSync(join(cwd, "pytest.ini")) || hasTomlTable(pyproject, "tool.pytest.ini_options")) {
518
+ return ["Run `pytest` before handoff."];
519
+ }
520
+ return [];
521
+ }
522
+
457
523
  function verificationSection(cwd: string): ClioMdSection | null {
458
524
  const scripts = packageScripts(cwd);
459
525
  const pm = packageManager(cwd);
@@ -487,6 +553,20 @@ function verificationSection(cwd: string): ClioMdSection | null {
487
553
  if (hasScript("ci")) {
488
554
  lines.push(`Use ${command("ci")} for the full local gate before committing broad or shared behavior changes.`);
489
555
  }
556
+ lines.push(...cmakeVerificationLines(cwd));
557
+ // Cargo's commands are defined by the toolchain, not by each project, so
558
+ // naming them for any Cargo workspace carries the same confidence as a
559
+ // declared package script.
560
+ if (existsSync(join(cwd, "Cargo.toml"))) {
561
+ lines.push("Run `cargo build` and `cargo test` before handoff.");
562
+ }
563
+ // Go's commands are defined by the toolchain, not by each project, so
564
+ // naming them for any module carries the same confidence as a declared
565
+ // package script.
566
+ if (existsSync(join(cwd, "go.mod"))) {
567
+ lines.push("Run `go build ./...` and `go test ./...` before handoff.");
568
+ }
569
+ lines.push(...pythonVerificationLines(cwd));
490
570
  if (lines.length === 0) return null;
491
571
  return { title: "Verification expectations", body: lines.join(" ") };
492
572
  }
@@ -684,20 +764,21 @@ function stabilizeGeneratedOutput(
684
764
 
685
765
  /**
686
766
  * The handbook sections whose every fact is read straight off the codewiki index:
687
- * how many files it holds, which modules anchor it, where the mass sits. They are
688
- * the only sections nothing but the index can author, and equally the only ones
689
- * that are wrong the moment the tree moves, so `context refresh` re-derives them
690
- * in place and leaves every other section to its human or model author.
767
+ * which modules anchor it and where the mass sits. They are the only sections
768
+ * nothing but the index can author, and equally the only ones that are wrong the
769
+ * moment the tree moves, so `context refresh` re-derives them in place and leaves
770
+ * every other section to its human or model author. An exact file count stays
771
+ * out: the handbook persists between refreshes while the tree keeps moving, so a
772
+ * precise number is falsified by any single added file and carries no
773
+ * navigational value the entry-point list does not.
691
774
  */
692
775
  export function codewikiSections(codewiki: Codewiki): ClioMdSection[] {
693
776
  const sections: ClioMdSection[] = [];
694
777
  const entryPoints = codewikiEntryPoints(codewiki, 8);
695
- const indexedCount = indexedSourceFileCount(codewiki);
696
778
  if (entryPoints.length > 0) {
697
779
  sections.push({
698
780
  title: "Context retrieval",
699
781
  body: [
700
- `The codewiki currently indexes ${indexedCount} source file${indexedCount === 1 ? "" : "s"}.`,
701
782
  `Start orientation with these indexed entry points: ${entryPoints.map((entry) => `\`${entry}\``).join(", ")}.`,
702
783
  "Use `code_nav` (modes: symbol, path, entries, outline, deps, dependents, wiki) before broad reads when the task is navigational.",
703
784
  ].join(" "),
@@ -1041,10 +1122,10 @@ function writeProjectState(
1041
1122
  adoption: AdoptionScanResult,
1042
1123
  recordAdoption: boolean,
1043
1124
  codewikiVersion: number,
1125
+ fingerprint: Fingerprint,
1044
1126
  generation: BootstrapGenerationTelemetry,
1045
1127
  generated: boolean,
1046
1128
  ): string {
1047
- const finalFingerprint = computeFingerprint(cwd);
1048
1129
  const statePath = resolveStatePath(cwd);
1049
1130
  const prev = readClioState(cwd);
1050
1131
  // lastBootstrap describes how the CLIO-CODER.md on disk was produced, not what the
@@ -1059,7 +1140,7 @@ function writeProjectState(
1059
1140
  writeClioState(cwd, {
1060
1141
  version: 1,
1061
1142
  projectType,
1062
- fingerprint: finalFingerprint,
1143
+ fingerprint,
1063
1144
  codewikiVersion,
1064
1145
  lastInitAt: now.toISOString(),
1065
1146
  lastSessionAt: now.toISOString(),
@@ -1082,13 +1163,13 @@ function persistCodewikiForGeneration(
1082
1163
  projectType: ProjectType,
1083
1164
  indexedAt: string,
1084
1165
  codewiki: Codewiki,
1166
+ fingerprint: Fingerprint,
1085
1167
  ): void {
1086
- writeCodewiki(cwd, codewiki);
1087
1168
  const prev = readClioState(cwd);
1088
1169
  writeClioState(cwd, {
1089
1170
  version: 1,
1090
1171
  projectType,
1091
- fingerprint: computeFingerprint(cwd, codewiki),
1172
+ fingerprint,
1092
1173
  codewikiVersion: codewiki.version,
1093
1174
  ...(prev?.contextSources ? { contextSources: prev.contextSources } : {}),
1094
1175
  ...(prev?.contextSourceHash ? { contextSourceHash: prev.contextSourceHash } : {}),
@@ -1176,7 +1257,22 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
1176
1257
  // Index the repository before generation so the generator can ground CLIO-CODER.md
1177
1258
  // in the real structure (entry points, key modules), not just sibling prose.
1178
1259
  progress(input, { phase: "codewiki", status: "started", message: "building codewiki index" });
1179
- const codewiki = await buildCodewiki({ cwd, language: projectType, generatedAt: indexedAt });
1260
+ let codewiki: Codewiki;
1261
+ let codewikiFingerprint: Fingerprint;
1262
+ if (input.preview === true) {
1263
+ const candidate = await buildCodewikiCandidate(cwd, projectType);
1264
+ codewiki = candidate.codewiki;
1265
+ codewikiFingerprint = candidate.fingerprint;
1266
+ } else {
1267
+ const coordinated = await coordinateCodewikiWrite(cwd, () => ({ kind: "build", cwd, language: projectType }), {
1268
+ beforeCommit: (_result, workspace) => ensureGitignore(workspace, input),
1269
+ afterCommit: ({ codewiki: committed, fingerprint }, workspace) =>
1270
+ persistCodewikiForGeneration(workspace, projectType, indexedAt, committed, fingerprint),
1271
+ });
1272
+ if (!coordinated) throw new Error("codewiki bootstrap transaction did not commit");
1273
+ codewiki = coordinated.codewiki;
1274
+ codewikiFingerprint = coordinated.worker.fingerprint;
1275
+ }
1180
1276
  const codewikiEntryCount = indexedSourceFileCount(codewiki);
1181
1277
  progress(input, {
1182
1278
  phase: "codewiki",
@@ -1185,10 +1281,6 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
1185
1281
  current: codewikiEntryCount,
1186
1282
  total: codewikiEntryCount,
1187
1283
  });
1188
- if (input.preview !== true) {
1189
- await ensureGitignore(cwd, input);
1190
- persistCodewikiForGeneration(cwd, projectType, indexedAt, codewiki);
1191
- }
1192
1284
  const hadClioMd = existsSync(join(cwd, "CLIO-CODER.md"));
1193
1285
  const useExistingClioMdAsSource = hadClioMd && input.rewriteClioMd !== true;
1194
1286
  const existingClioMdText = useExistingClioMdAsSource ? readExistingClioMdText(cwd) : null;
@@ -1362,6 +1454,7 @@ export async function runBootstrap(input: RunBootstrapInput = {}): Promise<RunBo
1362
1454
  adoption,
1363
1455
  adoptionApplied,
1364
1456
  codewiki.version,
1457
+ codewikiFingerprint,
1365
1458
  generation,
1366
1459
  shouldGenerate,
1367
1460
  );
@@ -2,6 +2,7 @@ import { existsSync, rmSync } from "node:fs";
2
2
  import { join } from "node:path";
3
3
 
4
4
  import type { BootstrapIo } from "./bootstrap.js";
5
+ import { coordinateCodewikiExclusive } from "./codewiki/coordinator.js";
5
6
 
6
7
  export interface RunContextClearInput {
7
8
  cwd?: string;
@@ -25,7 +26,7 @@ const ACCUMULATED_CONTEXT_PATHS = [
25
26
  ] as const;
26
27
  /**
27
28
  * Kept, and said to be kept. `.clio-coder/wiki` is Clio-written rather than
28
- * operator-authored, so it does not belong with the handbook and the overlay
29
+ * operator-authored, so it does not belong with the handbooks and the overlay
29
30
  * directories on merit; it is listed because the reset reports exactly two
30
31
  * categories and a reader takes anything absent from both to be gone. It is the
31
32
  * most expensive artifact in `.clio-coder` (one model dispatch per page), and leaving
@@ -33,6 +34,7 @@ const ACCUMULATED_CONTEXT_PATHS = [
33
34
  */
34
35
  const PRESERVED_CONTEXT_PATHS = [
35
36
  "CLIO-CODER.md",
37
+ "CLIO-CODER.override.md",
36
38
  ".clio-coder/agents",
37
39
  ".clio-coder/skills",
38
40
  ".clio-coder/wiki",
@@ -61,18 +63,21 @@ export async function runContextClear(input: RunContextClearInput = {}): Promise
61
63
  return { action: "cancelled", removed: [], preserved: [...PRESERVED_CONTEXT_PATHS] };
62
64
  }
63
65
 
64
- const removed: string[] = [];
65
- for (const relPath of ACCUMULATED_CONTEXT_PATHS) removeIfPresent(cwd, relPath, removed);
66
+ const { removed, preserved } = await coordinateCodewikiExclusive(cwd, async (workspace) => {
67
+ const removed: string[] = [];
68
+ for (const relPath of ACCUMULATED_CONTEXT_PATHS) removeIfPresent(workspace, relPath, removed);
66
69
 
67
- const preserved = [...PRESERVED_CONTEXT_PATHS];
68
- if (input.all === true) {
69
- const confirmedAll = await input.confirmAll?.();
70
- if (confirmedAll === true) {
71
- removeIfPresent(cwd, "CLIO-CODER.md", removed);
72
- const index = preserved.indexOf("CLIO-CODER.md");
73
- if (index !== -1) preserved.splice(index, 1);
70
+ const preserved = [...PRESERVED_CONTEXT_PATHS];
71
+ if (input.all === true) {
72
+ const confirmedAll = await input.confirmAll?.();
73
+ if (confirmedAll === true) {
74
+ removeIfPresent(workspace, "CLIO-CODER.md", removed);
75
+ const index = preserved.indexOf("CLIO-CODER.md");
76
+ if (index !== -1) preserved.splice(index, 1);
77
+ }
74
78
  }
75
- }
79
+ return { removed, preserved };
80
+ });
76
81
 
77
82
  out(
78
83
  input.io,
@@ -1,5 +1,5 @@
1
- import { existsSync, readFileSync } from "node:fs";
2
- import { join } from "node:path";
1
+ import { existsSync, readFileSync, statSync } from "node:fs";
2
+ import { basename, dirname, join, resolve } from "node:path";
3
3
 
4
4
  export interface ClioMdFingerprintFooter {
5
5
  initAt: string;
@@ -26,6 +26,25 @@ export interface ParsedClioMd {
26
26
  warnings: string[];
27
27
  }
28
28
 
29
+ export interface LoadedClioMdFile {
30
+ path: string;
31
+ value: ParsedClioMd;
32
+ }
33
+
34
+ export interface ClioMdLoadError {
35
+ path: string;
36
+ error: string;
37
+ }
38
+
39
+ export interface LoadedProjectClioMd {
40
+ /** Effective files in ancestor-to-descendant order. */
41
+ files: LoadedClioMdFile[];
42
+ /** Selected files that could not be read or parsed. */
43
+ errors: ClioMdLoadError[];
44
+ /** The layered effective handbook, or null when no selected file parsed. */
45
+ value: ParsedClioMd | null;
46
+ }
47
+
29
48
  export type ClioMdParseResult = { ok: true; value: ParsedClioMd } | { ok: false; errors: string[]; warnings: string[] };
30
49
 
31
50
  export interface SerializeClioMdInput {
@@ -294,7 +313,11 @@ export function renderProjectTypeFragment(projectType: string): string {
294
313
  return `<project-type>${projectType}</project-type>`;
295
314
  }
296
315
 
297
- export function renderProjectContextFragment(parsed: ParsedClioMd): string {
316
+ function escapeXmlAttribute(value: string): string {
317
+ return value.replaceAll("&", "&amp;").replaceAll('"', "&quot;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
318
+ }
319
+
320
+ export function renderProjectContextFragment(parsed: ParsedClioMd, sourcePath?: string): string {
298
321
  const sections: string[] = [`# ${parsed.projectName}`, parsed.identity];
299
322
  if (parsed.conventions.length > 0) {
300
323
  sections.push("## Conventions", ...parsed.conventions.map((item) => `- ${item}`));
@@ -308,20 +331,99 @@ export function renderProjectContextFragment(parsed: ParsedClioMd): string {
308
331
  if (parsed.importedAgentContext) {
309
332
  sections.push("## Imported agent context", parsed.importedAgentContext);
310
333
  }
311
- return `<project-context>\n${sections.join("\n\n")}\n</project-context>`;
334
+ const source = sourcePath ? ` path="${escapeXmlAttribute(sourcePath)}"` : "";
335
+ return `<project-context${source}>\n${sections.join("\n\n")}\n</project-context>`;
312
336
  }
313
337
 
314
- export function tryReadClioMd(cwd: string): { ok: true; value: ParsedClioMd } | { ok: false; error: string } | null {
315
- const filePath = join(cwd, "CLIO-CODER.md");
316
- if (!existsSync(filePath)) return null;
338
+ const PROJECT_CONTEXT_CANDIDATES = ["CLIO-CODER.override.md", "CLIO-CODER.md"] as const;
339
+
340
+ function selectedClioMdPath(directory: string): string | null {
341
+ for (const filename of PROJECT_CONTEXT_CANDIDATES) {
342
+ const filePath = join(directory, filename);
343
+ if (!existsSync(filePath)) continue;
344
+ try {
345
+ if (statSync(filePath).isFile()) return filePath;
346
+ } catch {
347
+ // Preserve candidate precedence and let the read below own the
348
+ // actionable error instead of silently falling back to the base file.
349
+ return filePath;
350
+ }
351
+ }
352
+ return null;
353
+ }
354
+
355
+ function readClioMdPath(filePath: string): { ok: true; value: ParsedClioMd } | { ok: false; error: string } {
317
356
  let content: string;
318
357
  try {
319
358
  content = readFileSync(filePath, "utf8");
320
359
  } catch (err) {
321
- const message = err instanceof Error ? err.message : String(err);
322
- return { ok: false, error: message };
360
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
323
361
  }
324
362
  const parsed = parseClioMd(content);
325
363
  if (!parsed.ok) return { ok: false, error: parsed.errors.join("; ") };
326
364
  return { ok: true, value: parsed.value };
327
365
  }
366
+
367
+ function mergeClioMdFiles(files: ReadonlyArray<LoadedClioMdFile>): ParsedClioMd | null {
368
+ const nearest = files.at(-1)?.value;
369
+ if (!nearest) return null;
370
+ return {
371
+ projectName: nearest.projectName,
372
+ identity: files.map((file) => file.value.identity).join("\n\n"),
373
+ conventions: files.flatMap((file) => file.value.conventions),
374
+ invariants: files.flatMap((file) => file.value.invariants),
375
+ sections: files.flatMap((file) => file.value.sections),
376
+ importedAgentContext:
377
+ files
378
+ .map((file) => file.value.importedAgentContext)
379
+ .filter((value): value is string => value !== null)
380
+ .join("\n\n") || null,
381
+ fingerprint: nearest.fingerprint,
382
+ firstInit: nearest.firstInit,
383
+ warnings: files.flatMap((file) => file.value.warnings),
384
+ };
385
+ }
386
+
387
+ /**
388
+ * Load effective project handbooks from filesystem root through `cwd`.
389
+ * Candidate selection follows pi-coding-agent 0.84's
390
+ * `loadProjectContextFiles`: an override wins over the base file in the same
391
+ * directory. Clio's structured override additionally resets the inherited
392
+ * handbook chain for that subtree, as required by the project-context
393
+ * contract. Handbooks below the override may add new layers.
394
+ */
395
+ export function loadProjectClioMd(cwd: string): LoadedProjectClioMd {
396
+ const directories: string[] = [];
397
+ let directory = resolve(cwd);
398
+ while (true) {
399
+ directories.unshift(directory);
400
+ const parent = dirname(directory);
401
+ if (parent === directory) break;
402
+ directory = parent;
403
+ }
404
+
405
+ const selectedPaths: string[] = [];
406
+ for (const current of directories) {
407
+ const selected = selectedClioMdPath(current);
408
+ if (!selected) continue;
409
+ if (basename(selected) === "CLIO-CODER.override.md") {
410
+ selectedPaths.length = 0;
411
+ }
412
+ selectedPaths.push(selected);
413
+ }
414
+
415
+ const files: LoadedClioMdFile[] = [];
416
+ const errors: ClioMdLoadError[] = [];
417
+ for (const filePath of selectedPaths) {
418
+ const read = readClioMdPath(filePath);
419
+ if (read.ok) files.push({ path: filePath, value: read.value });
420
+ else errors.push({ path: filePath, error: read.error });
421
+ }
422
+ return { files, errors, value: mergeClioMdFiles(files) };
423
+ }
424
+
425
+ export function tryReadClioMd(cwd: string): { ok: true; value: ParsedClioMd } | { ok: false; error: string } | null {
426
+ const filePath = join(cwd, "CLIO-CODER.md");
427
+ if (!existsSync(filePath)) return null;
428
+ return readClioMdPath(filePath);
429
+ }