@iowarp/clio-coder 0.3.1 → 0.3.3

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 (601) hide show
  1. package/CHANGELOG.md +233 -373
  2. package/CONTRIBUTING.md +23 -23
  3. package/README.md +284 -613
  4. package/dist/{acp-FPR54DGL.js → acp-P2AQILE2.js} +43 -53
  5. package/dist/{agents-OGPIHPJH.js → agents-72W3BI7I.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-2DJ2KNFG.js +2095 -0
  9. package/dist/{chunk-IS3ONKU3.js → chunk-2IR2NMPA.js} +6 -4
  10. package/dist/chunk-2SFS6XQE.js +122 -0
  11. package/dist/{chunk-PV4JUBVJ.js → chunk-2TLUCQVG.js} +40 -21
  12. package/dist/chunk-2VTFPG5O.js +48 -0
  13. package/dist/chunk-4BJ5BYCE.js +61 -0
  14. package/dist/{chunk-474KN5II.js → chunk-4BPJXDWC.js} +111 -181
  15. package/dist/chunk-4VP4KH3K.js +962 -0
  16. package/dist/chunk-4XUGQOHA.js +797 -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-4QKXUHSR.js → chunk-5UFT4SUX.js} +70 -20
  21. package/dist/{chunk-OLBBMFRD.js → chunk-5UUP6MWO.js} +24 -62
  22. package/dist/chunk-65DEGPJ6.js +52 -0
  23. package/dist/chunk-6EJMN2Y3.js +17 -0
  24. package/dist/chunk-6N5PTWMY.js +136 -0
  25. package/dist/chunk-6SGHMWE3.js +277 -0
  26. package/dist/chunk-6XLNIQDB.js +27 -0
  27. package/dist/chunk-7CR24IG7.js +242 -0
  28. package/dist/chunk-7MNJORFF.js +22 -0
  29. package/dist/{chunk-KY56HMHH.js → chunk-A3CYT5EX.js} +125 -31
  30. package/dist/chunk-AGYYIBLL.js +1069 -0
  31. package/dist/{chunk-GB6QRBXN.js → chunk-APJ265NV.js} +54 -1187
  32. package/dist/{chunk-673JJUWJ.js → chunk-BMEMKKIT.js} +2 -2
  33. package/dist/chunk-CBCAPZAA.js +229 -0
  34. package/dist/chunk-CMZWFGD2.js +352 -0
  35. package/dist/chunk-COU2UHX6.js +400 -0
  36. package/dist/chunk-DSELYM6W.js +1077 -0
  37. package/dist/chunk-DUYJ5IO6.js +644 -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-FCSXB6T2.js +338 -0
  42. package/dist/chunk-FJ3H4MN5.js +48 -0
  43. package/dist/{chunk-RPTR2H26.js → chunk-FNTMWMX5.js} +21 -15
  44. package/dist/chunk-FQ4SKYE4.js +29 -0
  45. package/dist/chunk-G4BMMOKF.js +182 -0
  46. package/dist/{chunk-ZPY3JZ5E.js → chunk-GGXXDWE4.js} +183 -1233
  47. package/dist/chunk-HC4CLZ2Y.js +68 -0
  48. package/dist/{chunk-LU4TK2PR.js → chunk-HFSBBKSQ.js} +5 -56
  49. package/dist/{chunk-PIUMUEMV.js → chunk-HKIYEGME.js} +10 -6
  50. package/dist/chunk-I4HZDVNP.js +73 -0
  51. package/dist/chunk-IKCO5N3L.js +162 -0
  52. package/dist/chunk-IR4CFBFN.js +56 -0
  53. package/dist/{chunk-R5KLMSBV.js → chunk-J5Q24KAG.js} +2 -2
  54. package/dist/chunk-J7CWMCQD.js +255 -0
  55. package/dist/{chunk-K5XEMXTI.js → chunk-JVCV3ICN.js} +1 -1
  56. package/dist/chunk-KZWTDYJF.js +217 -0
  57. package/dist/chunk-LBMZMYH2.js +285 -0
  58. package/dist/{chunk-G34LV2PF.js → chunk-LM5TQCJZ.js} +84 -170
  59. package/dist/chunk-LW6DSM3M.js +5135 -0
  60. package/dist/chunk-LWLEKMDQ.js +3482 -0
  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-FST4FYJB.js → chunk-MFFY33HR.js} +99 -140
  64. package/dist/{chunk-BSU2YIWB.js → chunk-MVVUPGPW.js} +131 -136
  65. package/dist/chunk-OAO4GE4M.js +619 -0
  66. package/dist/{chunk-Q3RUPKEJ.js → chunk-OC7FIQPC.js} +58 -189
  67. package/dist/chunk-OKGUZO2U.js +34 -0
  68. package/dist/{chunk-GAEBEQVI.js → chunk-OOJYHWRB.js} +32 -346
  69. package/dist/{chunk-Q5WJOSJ7.js → chunk-OQ33BKR3.js} +2 -1
  70. package/dist/chunk-OQE5J4C6.js +73 -0
  71. package/dist/{chunk-KKNLWXI6.js → chunk-ORBHGJC5.js} +8 -8
  72. package/dist/{chunk-MAR7Y6HW.js → chunk-PAJK6MAQ.js} +23 -16
  73. package/dist/{chunk-M5T5VO65.js → chunk-PIWWS5BL.js} +837 -635
  74. package/dist/chunk-POHLU5DW.js +1186 -0
  75. package/dist/chunk-QKMUKYO7.js +4961 -0
  76. package/dist/chunk-SRDMMSEP.js +16405 -0
  77. package/dist/chunk-SST6Z5JA.js +80 -0
  78. package/dist/chunk-STBPMHSX.js +2456 -0
  79. package/dist/chunk-T6YILFSB.js +80 -0
  80. package/dist/chunk-TZK7PACC.js +174 -0
  81. package/dist/chunk-TZTZS7QK.js +227 -0
  82. package/dist/{chunk-ASND7OZK.js → chunk-UFIIWP2H.js} +13 -13
  83. package/dist/chunk-UOV2BYIW.js +107 -0
  84. package/dist/{chunk-PFEFKVGL.js → chunk-V6RTAOC2.js} +13 -11
  85. package/dist/chunk-VAKQQHWR.js +434 -0
  86. package/dist/chunk-VG7TBQIY.js +128 -0
  87. package/dist/chunk-VJWL6YS5.js +244 -0
  88. package/dist/{chunk-EYOKLTMF.js → chunk-VPAYEGVX.js} +17 -3
  89. package/dist/chunk-WEH5XRJQ.js +32 -0
  90. package/dist/chunk-X4RCMKVQ.js +641 -0
  91. package/dist/{chunk-TEKV33Q5.js → chunk-X6IAEBZR.js} +65 -33
  92. package/dist/chunk-XBXAASKX.js +18 -0
  93. package/dist/chunk-XN3L4EYL.js +46 -0
  94. package/dist/{chunk-RDLVBZEO.js → chunk-YCWGATWI.js} +6 -4
  95. package/dist/chunk-YHZX5GEU.js +193 -0
  96. package/dist/chunk-YXLYO42X.js +91 -0
  97. package/dist/{chunk-NMOX6HFD.js → chunk-ZDOOVTXZ.js} +29 -77
  98. package/dist/chunk-ZI647VB5.js +37 -0
  99. package/dist/{chunk-C4PTHK7P.js → chunk-ZWLZP4ZT.js} +5 -5
  100. package/dist/chunk-ZWMF7253.js +1882 -0
  101. package/dist/cli/index.js +62 -54
  102. package/dist/clio-JOU4FXVA.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-XCDVKR23.js} +92 -55
  108. package/dist/configure-4GAP54ZW.js +42 -0
  109. package/dist/{context-5RADCKTR.js → context-4UOGGLQ5.js} +71 -35
  110. package/dist/context-5VKGUVJJ.js +866 -0
  111. package/dist/{context-3KWFLHJG.js → context-77FM5DV5.js} +15 -13
  112. package/dist/{context-clear-7TSNPAAI.js → context-clear-XXJRLCJJ.js} +54 -28
  113. package/dist/{context-index-W4RLWOQH.js → context-index-BZ4UYMTC.js} +30 -24
  114. package/dist/dispatch-runner-QPRDDBDX.js +1997 -0
  115. package/dist/{docs-5AWSPS37.js → docs-2C2LTVT2.js} +23 -10
  116. package/dist/{doctor-UC5NAJYQ.js → doctor-HR46URBJ.js} +27 -17
  117. package/dist/{eval-U6TJHRLX.js → eval-XSSNATB4.js} +29 -16
  118. package/dist/{evidence-YEGUW4L3.js → evidence-6HG2PY2B.js} +46 -26
  119. package/dist/{evolve-TXARCTPG.js → evolve-K7YU3NCY.js} +45 -25
  120. package/dist/{extensions-OZFJ3A3G.js → extensions-QVDOHDGJ.js} +16 -7
  121. package/dist/{fleet-6G3DHNYE.js → fleet-VY3HHKN6.js} +163 -54
  122. package/dist/{fleet-preflight-DSNT37JK.js → fleet-preflight-DDN536IT.js} +7 -4
  123. package/dist/{init-KZ5QTF6M.js → init-JYGXI3FK.js} +69 -32
  124. package/dist/{memory-73ESV5YC.js → memory-WFZMGYHX.js} +48 -27
  125. package/dist/{models-A4PVNWJK.js → models-I5QWSEOM.js} +39 -25
  126. package/dist/monitor-GE4ID3IA.js +661 -0
  127. package/dist/{chunk-FCIH3BIZ.js → orchestrator-EM5MC3HM.js} +15979 -12407
  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-ZU3QMZPZ.js} +101 -61
  132. package/dist/{share-YIFFV4NQ.js → share-S5BZQC5I.js} +15 -8
  133. package/dist/{skills-2V6RA3OQ.js → skills-X5VXCRNQ.js} +34 -14
  134. package/dist/{skills-eval-S2TVJO4F.js → skills-eval-WKIHWTHR.js} +70 -34
  135. package/dist/steer-GGWFUJUD.js +77 -0
  136. package/dist/{targets-TYXLPB23.js → targets-SNCPI2NR.js} +43 -27
  137. package/dist/terminal-lease-BNAHVHBS.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-JQHHPQ4K.js} +45 -25
  142. package/dist/{usage-ZAFSXKKG.js → usage-OR4O5SMZ.js} +62 -31
  143. package/dist/verify-375KUB3Y.js +716 -0
  144. package/dist/web-fetch-2YHJ3KTG.js +638 -0
  145. package/dist/{wiki-generate-NUQCVOQ3.js → wiki-generate-UEXP2ARI.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 +387 -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 +45 -9
  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 +715 -278
  444. package/src/interactive/chat-renderer.ts +306 -85
  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 +253 -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 +42 -22
  456. package/src/interactive/footer-panel.ts +8 -3
  457. package/src/interactive/format-time.ts +14 -2
  458. package/src/interactive/interactive-application.ts +203 -17
  459. package/src/interactive/interactive-event-projection.ts +18 -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 +184 -117
  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/ask-user.ts +146 -24
  474. package/src/interactive/overlays/decisions.ts +300 -0
  475. package/src/interactive/overlays/help-reference.ts +15 -10
  476. package/src/interactive/overlays/model-selector.ts +34 -16
  477. package/src/interactive/overlays/session-selector.ts +18 -0
  478. package/src/interactive/overlays/settings.ts +105 -17
  479. package/src/interactive/overlays/skills-hub.ts +4 -4
  480. package/src/interactive/overlays/tree-selector.ts +41 -6
  481. package/src/interactive/render-trace.ts +499 -90
  482. package/src/interactive/renderers/compaction-summary.ts +2 -2
  483. package/src/interactive/renderers/diff.ts +115 -104
  484. package/src/interactive/renderers/mermaid.ts +53 -0
  485. package/src/interactive/renderers/tool-execution.ts +516 -168
  486. package/src/interactive/renderers/worker-entry.ts +20 -4
  487. package/src/interactive/session-switch-settlement.ts +10 -0
  488. package/src/interactive/slash-autocomplete.ts +6 -114
  489. package/src/interactive/slash-commands.ts +135 -47
  490. package/src/interactive/slash-spec.ts +9 -38
  491. package/src/interactive/status/controller.ts +5 -1
  492. package/src/interactive/status/index.ts +12 -1
  493. package/src/interactive/status/reasoning.ts +87 -0
  494. package/src/interactive/status/summary.ts +13 -2
  495. package/src/interactive/stdout-backpressure.ts +99 -0
  496. package/src/interactive/stream-pacer.ts +530 -0
  497. package/src/interactive/stream-pacing-policy.ts +66 -0
  498. package/src/interactive/tasks-overlay.ts +368 -14
  499. package/src/interactive/terminal-lease.ts +485 -0
  500. package/src/interactive/theme/tokens.ts +1 -1
  501. package/src/interactive/transcript-detail.ts +120 -0
  502. package/src/interactive/turn-context.ts +4 -3
  503. package/src/interactive/turn-persistence.ts +30 -13
  504. package/src/interactive/turn-queues.ts +12 -0
  505. package/src/interactive/turn-recovery.ts +25 -8
  506. package/src/interactive/turn-runtime.ts +79 -12
  507. package/src/interactive/turn-state.ts +10 -0
  508. package/src/interactive/view/artifacts.ts +114 -4
  509. package/src/interactive/view/view-overlay.ts +3 -0
  510. package/src/interactive/welcome-dashboard.ts +17 -16
  511. package/src/interactive/worker-receipts.ts +52 -3
  512. package/src/interactive/worker-stream.ts +5 -1
  513. package/src/tools/agent-tools.ts +23 -3
  514. package/src/tools/artifact.ts +2 -2
  515. package/src/tools/ask-user.ts +23 -13
  516. package/src/tools/bash.ts +30 -2
  517. package/src/tools/bootstrap.ts +34 -431
  518. package/src/tools/builtin-tool-catalog.ts +271 -0
  519. package/src/tools/codewiki/code-nav-surface.ts +29 -0
  520. package/src/tools/codewiki/code-nav.ts +8 -22
  521. package/src/tools/codewiki/shared.ts +41 -38
  522. package/src/tools/context/docs-engine.ts +14 -3
  523. package/src/tools/context/index.ts +107 -28
  524. package/src/tools/context/surface.ts +19 -0
  525. package/src/tools/core-bootstrap.ts +168 -0
  526. package/src/tools/credential-present.ts +5 -5
  527. package/src/tools/dispatch-admission.ts +533 -0
  528. package/src/tools/dispatch-background.ts +54 -0
  529. package/src/tools/dispatch-event-text.ts +6 -0
  530. package/src/tools/dispatch-plan.ts +9 -4
  531. package/src/tools/dispatch-run-events.ts +238 -0
  532. package/src/tools/dispatch-runner.ts +2370 -0
  533. package/src/tools/dispatch-scout-admission.ts +295 -0
  534. package/src/tools/dispatch-types.ts +77 -0
  535. package/src/tools/dispatch.ts +67 -3161
  536. package/src/tools/find.ts +4 -2
  537. package/src/tools/grep.ts +2 -2
  538. package/src/tools/lazy-tool.ts +60 -0
  539. package/src/tools/ledger.ts +3 -3
  540. package/src/tools/monitor-surface.ts +36 -0
  541. package/src/tools/monitor.ts +2 -32
  542. package/src/tools/observers.ts +2 -2
  543. package/src/tools/presentation.ts +107 -0
  544. package/src/tools/registry.ts +45 -27
  545. package/src/tools/safe-exec.ts +2 -2
  546. package/src/tools/steer-surface.ts +17 -0
  547. package/src/tools/steer.ts +2 -13
  548. package/src/tools/tasks.ts +108 -11
  549. package/src/tools/truncate.ts +25 -184
  550. package/src/tools/verify/frontend.ts +3 -1
  551. package/src/tools/verify/index.ts +3 -38
  552. package/src/tools/verify/surface.ts +46 -0
  553. package/src/tools/web-fetch-surface.ts +23 -0
  554. package/src/tools/web-fetch.ts +2 -20
  555. package/src/tools/write.ts +7 -2
  556. package/src/worker/entry.ts +39 -2
  557. package/src/worker/spec-contract.ts +26 -5
  558. package/dist/chunk-7SS2CTV2.js +0 -61361
  559. package/dist/chunk-DKGKUHFA.js +0 -924
  560. package/dist/chunk-GEP36Y4X.js +0 -12796
  561. package/dist/chunk-XYWBQRDM.js +0 -137
  562. package/dist/clio-BZVGEUFJ.js +0 -58
  563. package/dist/configure-S7S6F6CL.js +0 -32
  564. package/docs/html/agents_blueprint.html +0 -936
  565. package/docs/html/alcf_blueprint.html +0 -324
  566. package/docs/html/architecture_blueprint.html +0 -850
  567. package/docs/html/commands_blueprint.html +0 -939
  568. package/docs/html/config_knobs_audit_blueprint.html +0 -178
  569. package/docs/html/configuration_blueprint.html +0 -1080
  570. package/docs/html/context_blueprint.html +0 -603
  571. package/docs/html/documentation_blueprint.html +0 -832
  572. package/docs/html/environment_blueprint.html +0 -404
  573. package/docs/html/eval_blueprint.html +0 -743
  574. package/docs/html/evals_internal_blueprint.html +0 -190
  575. package/docs/html/evolution_blueprint.html +0 -674
  576. package/docs/html/extensions_blueprint.html +0 -2065
  577. package/docs/html/fleet_dispatch_blueprint.html +0 -286
  578. package/docs/html/index.html +0 -919
  579. package/docs/html/lifecycle_blueprint.html +0 -723
  580. package/docs/html/memory_blueprint.html +0 -699
  581. package/docs/html/middleware_blueprint.html +0 -664
  582. package/docs/html/models_blueprint.html +0 -2366
  583. package/docs/html/observability_blueprint.html +0 -683
  584. package/docs/html/provider_adapter_blueprint.html +0 -245
  585. package/docs/html/safety_blueprint.html +0 -1386
  586. package/docs/html/shared.css +0 -571
  587. package/docs/html/shared.js +0 -143
  588. package/docs/html/skills_blueprint.html +0 -671
  589. package/docs/html/soak_blueprint.html +0 -182
  590. package/docs/html/tool_usage_blueprint.html +0 -350
  591. package/docs/html/tools_blueprint.html +0 -2249
  592. package/docs/html/trace_blueprint.html +0 -235
  593. package/docs/html/tui_design_blueprint.html +0 -374
  594. package/docs/html/validation_blueprint.html +0 -961
  595. package/docs/html/worker_dispatch_blueprint.html +0 -231
  596. package/src/core/release.ts +0 -2
  597. package/src/domains/providers/runtimes/common/lmstudio-logger.ts +0 -32
  598. package/src/domains/providers/runtimes/local-native/lmstudio-native.ts +0 -491
  599. package/src/engine/apis/lmstudio-native.ts +0 -1438
  600. package/src/engine/apis/thinking-replay.ts +0 -11
  601. package/src/tools/string-enum.ts +0 -15
@@ -1,29 +1,17 @@
1
- import { createHash } from "node:crypto";
2
- import { existsSync, readFileSync } from "node:fs";
3
- import { isAbsolute, relative } from "node:path";
1
+ import { existsSync } from "node:fs";
2
+ import { isAbsolute, join, relative, resolve } from "node:path";
4
3
  import { BusChannels, type ContextActivityPayload } from "../../core/bus-events.js";
5
4
  import type { DomainBundle, DomainContext, DomainExtension } from "../../core/domain-loader.js";
6
5
  import { clioDataDir } from "../../core/xdg.js";
7
6
  import { loadMemoryRecordsSync } from "../memory/index.js";
8
- import { detectProjectType } from "../session/workspace/project-type.js";
7
+ import { detectProjectType, type ProjectType } from "../session/workspace/project-type.js";
9
8
  import { adoptionSourcesChanged } from "./adoption.js";
10
9
  import { runBootstrap } from "./bootstrap.js";
11
10
  import { runContextClear } from "./clear.js";
12
- import { tryReadClioMd } from "./clio-md.js";
13
- import { createSlicer } from "./codewiki/cooperative.js";
14
- import {
15
- buildCodewiki,
16
- type Codewiki,
17
- codewikiNeedsBackfill,
18
- codewikiPath,
19
- parseCodewikiRaw,
20
- readCodewikiAsync,
21
- syncCodewiki,
22
- updateCodewikiPaths,
23
- writeCodewiki,
24
- } from "./codewiki/indexer.js";
11
+ import { loadProjectClioMd } from "./clio-md.js";
12
+ import { codewikiPath } from "./codewiki/artifact.js";
13
+ import { coordinateCodewikiWrite, drainCodewikiWrites } from "./codewiki/coordinator.js";
25
14
  import type { ContextContract, ContextState } from "./contract.js";
26
- import { computeFingerprintAsync, isStale } from "./fingerprint.js";
27
15
  import { renderPromptContext } from "./prompt-context.js";
28
16
  import { runContextRefresh } from "./refresh.js";
29
17
  import { type ClioProjectState, readClioState, writeClioState } from "./state.js";
@@ -40,10 +28,11 @@ function persistState(
40
28
  indexedAt: string,
41
29
  prev: ClioProjectState | null,
42
30
  codewikiVersion: number,
31
+ projectType: ProjectType,
43
32
  ): void {
44
33
  writeClioState(cwd, {
45
34
  version: 1,
46
- projectType: prev?.projectType ?? detectProjectType(cwd),
35
+ projectType: prev?.projectType ?? projectType,
47
36
  fingerprint,
48
37
  codewikiVersion,
49
38
  ...(prev?.contextSources ? { contextSources: prev.contextSources } : {}),
@@ -58,8 +47,10 @@ function persistState(
58
47
  /**
59
48
  * Rebuild the codewiki when it is missing or the working tree has drifted since
60
49
  * the last full index. Runs once at session start (catches branch switches, git
61
- * pulls, and out-of-session edits) and again at stop. Skips projects that were
62
- * never indexed so we never index an arbitrary directory unprompted.
50
+ * pulls, and out-of-session edits). Skips projects that were never indexed so we
51
+ * never index an arbitrary directory unprompted. This is the only place a
52
+ * session reconciles the index with the tree: in-session edits arrive through
53
+ * `noteFileChanges`, and stop() deliberately does no indexing at all.
63
54
  *
64
55
  * Every phase runs through one shared slicer. This work overlaps a mounted TUI:
65
56
  * before slicing, a drifted tree on a 1100-file repository held the event loop
@@ -73,36 +64,27 @@ async function ensureCodewikiFresh(cwd: string): Promise<void> {
73
64
  if (process.env.CLIO_CODER_BOOTSTRAP_GENERATE_CHILD === "1") return;
74
65
  const state = readClioState(cwd);
75
66
  if (!state && !existsSync(codewikiPath(cwd))) return;
76
- const slicer = createSlicer();
77
- const codewiki = await readCodewikiAsync(cwd);
78
- const fingerprint = await computeFingerprintAsync(cwd, codewiki, { slicer });
79
- const stale =
80
- !state ||
81
- isStale(state.fingerprint, fingerprint) ||
82
- !existsSync(codewikiPath(cwd)) ||
83
- !codewiki ||
84
- codewikiNeedsBackfill(codewiki);
85
- if (!stale) return;
86
67
  const indexedAt = new Date().toISOString();
87
- const projectType = state?.projectType ?? detectProjectType(cwd);
88
- const synced = codewiki
89
- ? await syncCodewiki(cwd, codewiki, { slicer })
90
- : await buildCodewiki({ cwd, language: projectType, generatedAt: indexedAt }, { slicer });
91
- writeCodewiki(cwd, synced);
92
- persistState(cwd, await computeFingerprintAsync(cwd, synced, { slicer }), indexedAt, state, synced.version);
68
+ await coordinateCodewikiWrite(
69
+ cwd,
70
+ (current, workspace) => {
71
+ const language = readClioState(workspace)?.projectType ?? current?.language;
72
+ return {
73
+ kind: "ensure",
74
+ cwd,
75
+ ...(language ? { language } : {}),
76
+ current,
77
+ previous: readClioState(workspace)?.fingerprint ?? null,
78
+ };
79
+ },
80
+ {
81
+ afterCommit: ({ codewiki, fingerprint }, workspace) =>
82
+ persistState(workspace, fingerprint, indexedAt, readClioState(workspace), codewiki.version, codewiki.language),
83
+ },
84
+ );
93
85
  }
94
86
 
95
87
  const CONTEXT_STATE_CACHE_TTL_MS = 1500;
96
- const CODEWIKI_CACHE_LIMIT = 4;
97
-
98
- interface CachedCodewiki {
99
- hash: string;
100
- codewiki: Codewiki;
101
- }
102
-
103
- function codewikiContentHash(raw: string): string {
104
- return createHash("sha256").update(raw).digest("hex");
105
- }
106
88
 
107
89
  function memoryCount(): number {
108
90
  try {
@@ -113,11 +95,16 @@ function memoryCount(): number {
113
95
  }
114
96
 
115
97
  function resolveClioMdState(cwd: string): ContextState["clioMd"] {
116
- const clio = tryReadClioMd(cwd);
117
- if (!clio) return "none";
118
- if (!clio.ok) return "malformed";
98
+ const clio = loadProjectClioMd(cwd);
99
+ if (clio.files.length === 0 && clio.errors.length === 0) return "none";
100
+ if (clio.errors.length > 0) return "malformed";
119
101
  const state = readClioState(cwd);
120
- if (state?.contextSources !== undefined && adoptionSourcesChanged(state.contextSources, { cwd })) {
102
+ const localStandardIsEffective = clio.files.some((file) => file.path === join(resolve(cwd), "CLIO-CODER.md"));
103
+ if (
104
+ localStandardIsEffective &&
105
+ state?.contextSources !== undefined &&
106
+ adoptionSourcesChanged(state.contextSources, { cwd })
107
+ ) {
121
108
  return "stale";
122
109
  }
123
110
  return "ok";
@@ -152,12 +139,17 @@ function collectStartupHints(cwd: string, options: ContextBundleOptions = {}): s
152
139
  } catch {
153
140
  projectType = "unknown";
154
141
  }
155
- const clio = tryReadClioMd(cwd);
156
- if (!clio && projectType !== "unknown" && options.noContextFiles !== true) {
142
+ const clio = loadProjectClioMd(cwd);
143
+ if (
144
+ clio.files.length === 0 &&
145
+ clio.errors.length === 0 &&
146
+ projectType !== "unknown" &&
147
+ options.noContextFiles !== true
148
+ ) {
157
149
  hints.push("clio: No CLIO-CODER.md detected. Run /context init to explore the repo and bootstrap context.");
158
150
  }
159
- if (clio && !clio.ok) {
160
- hints.push(`clio: malformed CLIO-CODER.md ignored: ${clio.error}`);
151
+ for (const issue of clio.errors) {
152
+ hints.push(`clio: malformed ${issue.path} ignored: ${issue.error}`);
161
153
  }
162
154
  const state = readClioState(cwd);
163
155
  if (!state) return hints;
@@ -172,44 +164,9 @@ export function createContextBundle(
172
164
  options: ContextBundleOptions = {},
173
165
  ): DomainBundle<ContextContract> {
174
166
  let lastCwd = process.cwd();
167
+ let stopping = false;
175
168
  let startupHints: string[] = [];
176
169
  const contextState = createContextStateReader();
177
- const codewikiCache = new Map<string, CachedCodewiki>();
178
- const rememberCodewiki = (cwd: string, hash: string, codewiki: Codewiki): void => {
179
- codewikiCache.delete(cwd);
180
- codewikiCache.set(cwd, { hash, codewiki });
181
- while (codewikiCache.size > CODEWIKI_CACHE_LIMIT) {
182
- const oldest = codewikiCache.keys().next().value;
183
- if (oldest === undefined) break;
184
- codewikiCache.delete(oldest);
185
- }
186
- };
187
- const readCachedCodewiki = (cwd: string): Codewiki | null => {
188
- let raw: string;
189
- try {
190
- raw = readFileSync(codewikiPath(cwd), "utf8");
191
- } catch {
192
- codewikiCache.delete(cwd);
193
- return null;
194
- }
195
- const hash = codewikiContentHash(raw);
196
- const cached = codewikiCache.get(cwd);
197
- if (cached && cached.hash === hash) {
198
- rememberCodewiki(cwd, hash, cached.codewiki);
199
- return cached.codewiki;
200
- }
201
- const codewiki = parseCodewikiRaw(raw);
202
- if (!codewiki) {
203
- codewikiCache.delete(cwd);
204
- return null;
205
- }
206
- rememberCodewiki(cwd, hash, codewiki);
207
- return codewiki;
208
- };
209
- const writeCachedCodewiki = (cwd: string, codewiki: Codewiki): void => {
210
- const serialized = writeCodewiki(cwd, codewiki);
211
- rememberCodewiki(cwd, codewikiContentHash(serialized), codewiki);
212
- };
213
170
  const onStart = (): void => {
214
171
  lastCwd = process.cwd();
215
172
  void ensureCodewikiFresh(lastCwd).catch(() => {
@@ -222,31 +179,38 @@ export function createContextBundle(
222
179
 
223
180
  // Incremental updates are read-modify-write on the artifact; overlapping runs
224
181
  // would compute from a stale base and drop each other's records, so batches
225
- // serialize through this queue and stop() drains it before its final rebuild.
182
+ // serialize through this queue and stop() drains it before the process exits.
226
183
  let incrementalQueue: Promise<void> = Promise.resolve();
227
184
  const noteFileChanges = (paths: ReadonlyArray<string>, cwd: string = lastCwd): void => {
185
+ if (stopping) return;
186
+ const workspace = resolve(cwd);
228
187
  incrementalQueue = incrementalQueue
229
188
  .then(async () => {
230
189
  if (paths.length === 0) return;
231
- const codewiki = readCachedCodewiki(cwd);
232
- if (!codewiki) return; // Not indexed yet; session start/stop owns first build.
233
190
  const rel = paths
234
- .map((p) => (isAbsolute(p) ? relative(cwd, p) : p))
191
+ .map((p) => (isAbsolute(p) ? relative(workspace, p) : p))
235
192
  .filter((p) => p.length > 0 && !p.startsWith(".."));
236
193
  // Fires after every write the agent makes, mid-turn, with the TUI
237
194
  // mounted; an edge rebuild here is the same cost as one at start.
238
- const slicer = createSlicer();
239
- const updated = await updateCodewikiPaths(cwd, codewiki, rel, { slicer });
240
- if (updated === codewiki) return; // No indexable file actually changed.
241
- writeCachedCodewiki(cwd, updated);
242
- persistState(
243
- cwd,
244
- await computeFingerprintAsync(cwd, updated, { slicer }),
245
- new Date().toISOString(),
246
- readClioState(cwd),
247
- updated.version,
195
+ await coordinateCodewikiWrite(
196
+ workspace,
197
+ (current) => (current ? { kind: "incremental", cwd: workspace, current, paths: rel } : null),
198
+ {
199
+ requireExisting: true,
200
+ afterCommit: ({ codewiki, fingerprint, changed }, committedWorkspace) => {
201
+ if (!changed) return;
202
+ persistState(
203
+ committedWorkspace,
204
+ fingerprint,
205
+ new Date().toISOString(),
206
+ readClioState(committedWorkspace),
207
+ codewiki.version,
208
+ codewiki.language,
209
+ );
210
+ },
211
+ },
248
212
  );
249
- contextState.invalidate(cwd);
213
+ contextState.invalidate(workspace);
250
214
  })
251
215
  .catch(() => {
252
216
  // Best-effort: never let incremental indexing surface as a tool error.
@@ -259,37 +223,23 @@ export function createContextBundle(
259
223
  unsubscribeSessionStart = _context.bus.on(BusChannels.SessionStart, onStart);
260
224
  },
261
225
  async stop() {
226
+ stopping = true;
262
227
  unsubscribeSessionStart?.();
263
228
  unsubscribeSessionStart = null;
264
- await incrementalQueue;
265
- // Stop runs the same rebuild as start and the TUI is still mounted while
266
- // it drains, so it shares the sliced path rather than blocking the quit.
267
- const slicer = createSlicer();
268
- const projectType = detectProjectType(lastCwd);
229
+ // Everything the session changed already went through noteFileChanges,
230
+ // so the only work still owed at stop is the tail of that queue. Nothing
231
+ // here re-indexes: a stop-time rebuild used to run the same full scan as
232
+ // start on every exit, on the shutdown path, where one synchronous
233
+ // tree-sitter parse of a large file holds the event loop past every
234
+ // shutdown budget (issue #99). Out-of-band drift is start's job on the
235
+ // next session, and a never-indexed cwd stays that way; indexing an
236
+ // arbitrary directory because a process exited in it is not a favor.
237
+ await Promise.all([incrementalQueue, drainCodewikiWrites(lastCwd)]);
269
238
  const state = readClioState(lastCwd);
270
- let codewiki = readCachedCodewiki(lastCwd);
271
- let fingerprint = await computeFingerprintAsync(lastCwd, codewiki, { slicer });
272
- let lastIndexedAt = state?.lastIndexedAt;
273
- if (!state || isStale(state.fingerprint, fingerprint) || !codewiki || codewikiNeedsBackfill(codewiki)) {
274
- lastIndexedAt = new Date().toISOString();
275
- codewiki = codewiki
276
- ? await syncCodewiki(lastCwd, codewiki, { slicer })
277
- : await buildCodewiki({ cwd: lastCwd, language: projectType, generatedAt: lastIndexedAt }, { slicer });
278
- writeCachedCodewiki(lastCwd, codewiki);
279
- fingerprint = await computeFingerprintAsync(lastCwd, codewiki, { slicer });
280
- }
281
- writeClioState(lastCwd, {
282
- version: 1,
283
- projectType,
284
- fingerprint,
285
- ...(codewiki ? { codewikiVersion: codewiki.version } : {}),
286
- ...(state?.contextSources ? { contextSources: state.contextSources } : {}),
287
- ...(state?.contextSourceHash ? { contextSourceHash: state.contextSourceHash } : {}),
288
- ...(state?.lastBootstrap ? { lastBootstrap: state.lastBootstrap } : {}),
289
- ...(state?.lastInitAt ? { lastInitAt: state.lastInitAt } : {}),
290
- lastSessionAt: new Date().toISOString(),
291
- ...(lastIndexedAt ? { lastIndexedAt } : {}),
292
- });
239
+ if (!state) return;
240
+ // The fingerprint is left as the last index wrote it. Stamping a fresh
241
+ // one without re-indexing would hide drift from the next start.
242
+ writeClioState(lastCwd, { ...state, lastSessionAt: new Date().toISOString() });
293
243
  },
294
244
  };
295
245
 
@@ -381,20 +331,21 @@ export function createContextBundle(
381
331
  },
382
332
  renderPromptContext,
383
333
  projectStructuredContext(cwd = process.cwd()) {
384
- const clio = tryReadClioMd(cwd);
385
- if (!clio?.ok) return null;
334
+ const clio = loadProjectClioMd(cwd).value;
335
+ if (!clio) return null;
386
336
  // Exact-title allowlist: "Verification expectations" is the only
387
337
  // custom section ever projected to workers (verification class only,
388
338
  // enforced dispatch-side). Same case-insensitive comparison as
389
339
  // clio-md's sectionBody().
390
- const verification = clio.value.sections.find(
391
- (section) => section.title.toLowerCase() === "verification expectations",
392
- );
393
- const verificationBody = verification?.body.trim() ?? "";
340
+ const verificationBody = clio.sections
341
+ .filter((section) => section.title.toLowerCase() === "verification expectations")
342
+ .map((section) => section.body.trim())
343
+ .filter((body) => body.length > 0)
344
+ .join("\n\n");
394
345
  return {
395
- projectName: clio.value.projectName,
396
- conventions: [...clio.value.conventions],
397
- invariants: [...clio.value.invariants],
346
+ projectName: clio.projectName,
347
+ conventions: [...clio.conventions],
348
+ invariants: [...clio.invariants],
398
349
  ...(verificationBody.length > 0 ? { verificationExpectations: verificationBody } : {}),
399
350
  };
400
351
  },
@@ -4,8 +4,10 @@ import { readFileSync, statSync } from "node:fs";
4
4
  import { join } from "node:path";
5
5
  import { promisify } from "node:util";
6
6
  import { enumerateWorkspaceFiles, enumerateWorkspaceFilesAsync } from "../../core/workspace-files.js";
7
+ import { readCodewiki, readCodewikiAsync } from "./codewiki/artifact.js";
7
8
  import { type CooperativeSlicer, createSlicer } from "./codewiki/cooperative.js";
8
- import { type Codewiki, isIndexablePath, readCodewiki, readCodewikiAsync } from "./codewiki/indexer.js";
9
+ import { isIndexablePath } from "./codewiki/paths.js";
10
+ import type { Codewiki } from "./codewiki/schema.js";
9
11
  import { EXCLUDED_DIRS } from "./excluded-dirs.js";
10
12
 
11
13
  const execFileAsync = promisify(execFile);
@@ -1,19 +1,3 @@
1
- import type { DomainModule } from "../../core/domain-loader.js";
2
- import { type ContextBundleOptions, createContextBundle } from "./extension.js";
3
- import { ContextManifest } from "./manifest.js";
4
-
5
- export const ContextDomainModule: DomainModule = {
6
- manifest: ContextManifest,
7
- createExtension: createContextBundle,
8
- };
9
-
10
- export function createContextDomainModule(options: ContextBundleOptions = {}): DomainModule {
11
- return {
12
- manifest: ContextManifest,
13
- createExtension: (context) => createContextBundle(context, options),
14
- };
15
- }
16
-
17
1
  export {
18
2
  type AdoptionScanResult,
19
3
  type AdoptionSourcesChangedOptions,
@@ -39,21 +23,26 @@ export {
39
23
  runBootstrap,
40
24
  } from "./bootstrap.js";
41
25
  export { type RunContextClearInput, type RunContextClearResult, runContextClear } from "./clear.js";
42
- export { parseClioMd, serializeClioMd, tryReadClioMd } from "./clio-md.js";
43
- export { type CooperativeSlicer, createSlicer, INDEX_SLICE_MS } from "./codewiki/cooperative.js";
44
- export { renderCodewikiDigest } from "./codewiki/digest.js";
26
+ export { loadProjectClioMd, parseClioMd, serializeClioMd, tryReadClioMd } from "./clio-md.js";
45
27
  export {
46
- buildCodewiki,
47
- CODEWIKI_VERSION,
48
28
  codewikiEntries,
49
29
  codewikiNeedsBackfill,
30
+ codewikiPath,
31
+ parseCodewikiRaw,
50
32
  readCodewiki,
51
33
  readCodewikiAsync,
34
+ serializeCodewiki,
52
35
  structuralCodewikiHash,
36
+ writeCodewiki,
37
+ } from "./codewiki/artifact.js";
38
+ export { type CooperativeSlicer, createSlicer, INDEX_SLICE_MS } from "./codewiki/cooperative.js";
39
+ export { renderCodewikiDigest } from "./codewiki/digest.js";
40
+ export {
41
+ buildCodewiki,
53
42
  syncCodewiki,
54
43
  updateCodewikiPaths,
55
- writeCodewiki,
56
44
  } from "./codewiki/indexer.js";
45
+ export { CODEWIKI_VERSION } from "./codewiki/schema.js";
57
46
  export type { ContextContract, ContextState, ProjectPromptContext, ProjectStructuredContext } from "./contract.js";
58
47
  export {
59
48
  type ComputeFingerprintAsyncOptions,
@@ -80,6 +69,7 @@ export {
80
69
  type RunContextRefreshResult,
81
70
  runContextRefresh,
82
71
  } from "./refresh.js";
72
+ export { type ContextBundleOptions, ContextDomainModule, createContextDomainModule } from "./runtime.js";
83
73
  export {
84
74
  type BootstrapGenerationMode,
85
75
  type BootstrapGenerationState,
@@ -112,6 +112,25 @@ function tomlTableValue(raw: string, table: string, key: string): string | null
112
112
  return null;
113
113
  }
114
114
 
115
+ /**
116
+ * Whether a TOML file declares the named top-level table, e.g. `tool.tox`.
117
+ * A trimmed line must start with `[table]` and carry nothing after it but an
118
+ * optional `# comment`, the only content TOML itself allows there. A raw
119
+ * `raw.includes("[table]")` check would also fire on a comment mentioning the
120
+ * table or a string value that happens to contain the same bracketed text;
121
+ * anchoring to the start of the line rules both out without a TOML parser,
122
+ * while still accepting the valid `[table] # comment` form that a plain
123
+ * equality check would have missed.
124
+ */
125
+ export function hasTomlTable(raw: string, table: string): boolean {
126
+ const header = `[${table}]`;
127
+ return raw.split(/\r?\n/u).some((line) => {
128
+ const trimmed = line.trim();
129
+ if (!trimmed.startsWith(header)) return false;
130
+ return /^\s*(?:#.*)?$/u.test(trimmed.slice(header.length));
131
+ });
132
+ }
133
+
115
134
  /** One `KEY = value` line from a Doxyfile or an INI-shaped config. */
116
135
  function keyEqualsValue(raw: string, key: string): string | null {
117
136
  const match = new RegExp(`^[ \\t]*${key}[ \\t]*(?:\\+?=)[ \\t]*(.+)$`, "mu").exec(raw);
@@ -1,11 +1,11 @@
1
1
  import { detectProjectType } from "../session/workspace/project-type.js";
2
2
  import {
3
+ loadProjectClioMd,
3
4
  type ParsedClioMd,
4
5
  renderProjectContextFragment,
5
6
  renderProjectTypeFragment,
6
- tryReadClioMd,
7
7
  } from "./clio-md.js";
8
- import { readCodewiki } from "./codewiki/indexer.js";
8
+ import { readCodewiki } from "./codewiki/artifact.js";
9
9
  import type { ProjectPromptContext } from "./contract.js";
10
10
  import { computeFingerprintCached, isStale } from "./fingerprint.js";
11
11
  import { readClioState } from "./state.js";
@@ -14,7 +14,7 @@ import { wikiCompleteness, wikiStaleness } from "./wiki/staleness.js";
14
14
 
15
15
  /**
16
16
  * Render the project prompt context for `cwd`: the project-type marker, the
17
- * CLIO-CODER.md fragment when a parseable handbook exists, the codewiki availability
17
+ * effective CLIO-CODER.md fragments when parseable handbooks exist, the codewiki availability
18
18
  * marker, and the Markdown wiki marker when a valid wiki exists. Shared by the
19
19
  * prompts extension (session compile),
20
20
  * context-init preload reporting, and `clio-coder config inspect`, so every surface
@@ -24,13 +24,12 @@ export function renderPromptContext(cwd: string): ProjectPromptContext {
24
24
  const projectType = detectProjectType(cwd);
25
25
  const pieces = [renderProjectTypeFragment(projectType)];
26
26
  const warnings: string[] = [];
27
- const clio = tryReadClioMd(cwd);
28
- let clioMd: ParsedClioMd | null = null;
29
- if (clio?.ok) {
30
- clioMd = clio.value;
31
- pieces.push(renderProjectContextFragment(clio.value));
27
+ const loadedClioMd = loadProjectClioMd(cwd);
28
+ const clioMd: ParsedClioMd | null = loadedClioMd.value;
29
+ for (const file of loadedClioMd.files) pieces.push(renderProjectContextFragment(file.value, file.path));
30
+ for (const issue of loadedClioMd.errors) {
31
+ warnings.push(`clio: malformed ${issue.path} ignored: ${issue.error}`);
32
32
  }
33
- if (clio && !clio.ok) warnings.push(`clio: malformed CLIO-CODER.md ignored: ${clio.error}`);
34
33
  const codewiki = readCodewiki(cwd);
35
34
  if (codewiki) {
36
35
  const state = readClioState(cwd);
@@ -58,5 +57,5 @@ export function renderPromptContext(cwd: string): ProjectPromptContext {
58
57
  const suffix = notes.length > 0 ? ` (${notes.join("; ")}; run clio-coder context wiki --update)` : "";
59
58
  pieces.push(`<wiki>${pages.length} pages at .clio-coder/wiki (start: quickstart.md)${suffix}</wiki>`);
60
59
  }
61
- return { text: pieces.join("\n\n"), clioMd, warnings };
60
+ return { text: pieces.join("\n\n"), clioMd, warnings, handbookFiles: loadedClioMd.files.map((file) => file.path) };
62
61
  }
@@ -3,8 +3,9 @@ import { join } from "node:path";
3
3
  import { detectProjectType } from "../session/workspace/project-type.js";
4
4
  import { type BootstrapIo, type BootstrapProgressSink, codewikiSections } from "./bootstrap.js";
5
5
  import { serializeClioMd, tryReadClioMd } from "./clio-md.js";
6
- import { buildCodewiki, type Codewiki, writeCodewiki } from "./codewiki/indexer.js";
7
- import { computeFingerprint, type Fingerprint } from "./fingerprint.js";
6
+ import { coordinateCodewikiWrite } from "./codewiki/coordinator.js";
7
+ import type { Codewiki } from "./codewiki/schema.js";
8
+ import type { Fingerprint } from "./fingerprint.js";
8
9
  import { readClioState, writeClioState } from "./state.js";
9
10
  import { type RunWikiGenerateResult, runWikiGenerate, type WikiGenerate } from "./wiki/generate.js";
10
11
  import { readWikiMeta } from "./wiki/meta.js";
@@ -113,24 +114,30 @@ export async function runContextRefresh(input: RunContextRefreshInput = {}): Pro
113
114
  const indexedAt = now().toISOString();
114
115
 
115
116
  input.onProgress?.({ phase: "codewiki", status: "started", message: "rebuilding codewiki" });
116
- const codewiki = await buildCodewiki({ cwd, language: projectType, generatedAt: indexedAt });
117
- writeCodewiki(cwd, codewiki);
118
- const fingerprint = computeFingerprint(cwd, codewiki);
119
- const clioMd = curateClioMd(cwd, codewiki);
120
-
121
- input.onProgress?.({ phase: "state", status: "running", message: "writing state" });
122
- writeClioState(cwd, {
123
- version: 1,
124
- projectType,
125
- fingerprint,
126
- codewikiVersion: codewiki.version,
127
- ...(prev?.contextSources ? { contextSources: prev.contextSources } : {}),
128
- ...(prev?.contextSourceHash ? { contextSourceHash: prev.contextSourceHash } : {}),
129
- ...(prev?.lastBootstrap ? { lastBootstrap: prev.lastBootstrap } : {}),
130
- ...(prev?.lastInitAt ? { lastInitAt: prev.lastInitAt } : {}),
131
- lastSessionAt: prev?.lastSessionAt ?? indexedAt,
132
- lastIndexedAt: indexedAt,
117
+ let fingerprint: Fingerprint | undefined;
118
+ let clioMd: ClioMdCuration = "absent";
119
+ const coordinated = await coordinateCodewikiWrite(cwd, () => ({ kind: "build", cwd, language: projectType }), {
120
+ afterCommit: (result, workspace) => {
121
+ fingerprint = result.fingerprint;
122
+ clioMd = curateClioMd(workspace, result.codewiki);
123
+ input.onProgress?.({ phase: "state", status: "running", message: "writing state" });
124
+ const latest = readClioState(workspace);
125
+ writeClioState(workspace, {
126
+ version: 1,
127
+ projectType,
128
+ fingerprint: result.fingerprint,
129
+ codewikiVersion: result.codewiki.version,
130
+ ...(latest?.contextSources ? { contextSources: latest.contextSources } : {}),
131
+ ...(latest?.contextSourceHash ? { contextSourceHash: latest.contextSourceHash } : {}),
132
+ ...(latest?.lastBootstrap ? { lastBootstrap: latest.lastBootstrap } : {}),
133
+ ...(latest?.lastInitAt ? { lastInitAt: latest.lastInitAt } : {}),
134
+ lastSessionAt: latest?.lastSessionAt ?? indexedAt,
135
+ lastIndexedAt: indexedAt,
136
+ });
137
+ },
133
138
  });
139
+ if (!coordinated || !fingerprint) throw new Error("codewiki refresh transaction did not commit");
140
+ const codewiki = coordinated.codewiki;
134
141
 
135
142
  const entries = indexedSourceFileCount(codewiki);
136
143
  let wikiResult: RunWikiGenerateResult | undefined;
@@ -154,7 +161,8 @@ export async function runContextRefresh(input: RunContextRefreshInput = {}): Pro
154
161
  hint = incompleteWikiHint(cwd) ?? (wikiStaleness(cwd).state === "stale" ? STALE_WIKI_REFRESH_HINT : undefined);
155
162
  }
156
163
 
157
- const handbookNote = clioMd === "updated" ? "; CLIO-CODER.md index sections updated" : "";
164
+ const committedClioMd = clioMd as ClioMdCuration;
165
+ const handbookNote = committedClioMd === "updated" ? "; CLIO-CODER.md index sections updated" : "";
158
166
  input.io?.stdout(
159
167
  `clio-coder context refresh: codewiki rebuilt (${entries} source file${entries === 1 ? "" : "s"})${handbookNote}\n`,
160
168
  );
@@ -163,7 +171,7 @@ export async function runContextRefresh(input: RunContextRefreshInput = {}): Pro
163
171
  action: "refreshed",
164
172
  codewikiEntries: entries,
165
173
  fingerprint,
166
- clioMd,
174
+ clioMd: committedClioMd,
167
175
  ...(wikiResult ? { wiki: wikiResult } : {}),
168
176
  ...(hint ? { hint } : {}),
169
177
  };
@@ -0,0 +1,17 @@
1
+ import type { DomainModule } from "../../core/domain-loader.js";
2
+ import { type ContextBundleOptions, createContextBundle } from "./extension.js";
3
+ import { ContextManifest } from "./manifest.js";
4
+
5
+ export const ContextDomainModule: DomainModule = {
6
+ manifest: ContextManifest,
7
+ createExtension: createContextBundle,
8
+ };
9
+
10
+ export function createContextDomainModule(options: ContextBundleOptions = {}): DomainModule {
11
+ return {
12
+ manifest: ContextManifest,
13
+ createExtension: (context) => createContextBundle(context, options),
14
+ };
15
+ }
16
+
17
+ export type { ContextBundleOptions } from "./extension.js";