@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
@@ -0,0 +1,362 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "node:fs";
3
+ import { join, resolve } from "node:path";
4
+ import { AI_AGENT_NAME } from "./agent-environment.js";
5
+ import { CLIO_COMMIT_TRAILERS, type CommitAttributionEvidence } from "./commit-attribution.js";
6
+ import { clioStateDir } from "./xdg.js";
7
+
8
+ /** Effective `attribution.gitCommits` for child-process seams. Internal state, not an operator override. */
9
+ export const CLIO_GIT_COMMITS_ENABLED_ENV = "CLIO_CODER_GIT_COMMITS_ENABLED";
10
+ const ASSISTED_ENV = "CLIO_CODER_COMMIT_ASSISTED";
11
+ const AUTHORED_ENV = "CLIO_CODER_COMMIT_AUTHORED";
12
+ /** Present iff this environment carries Clio's command-scope core.hooksPath pair; holds the count below it. */
13
+ const CONFIG_BASE_COUNT_ENV = "CLIO_CODER_GIT_CONFIG_BASE_COUNT";
14
+ const DEFAULT_HOOKS_EQUIVALENT_ENV = "CLIO_CODER_GIT_DEFAULT_HOOKS_EQUIVALENT";
15
+ const MANAGED_HOOK_VERSION = 2;
16
+ const DIAGNOSTIC_MAX_CHARS = 300;
17
+ const COUNT = /^(?:0|[1-9][0-9]*)$/u;
18
+ const reportedDiagnostics = new Set<string>();
19
+ /**
20
+ * How long one repository probe (inside a work tree, effective core.hooksPath)
21
+ * is reused for the same cwd and Git environment. Each probe costs two `git`
22
+ * subprocesses, about 9 ms on a warm machine, and seams such as the verify
23
+ * tool's per-file `node --check` spawn in bursts. The window is short so a
24
+ * `git init` or a `core.hooksPath` change made during a session is seen on the
25
+ * next spawn after it rather than for the rest of the session.
26
+ */
27
+ const PROBE_CACHE_TTL_MS = 10_000;
28
+ const PROBE_CACHE_MAX_ENTRIES = 32;
29
+
30
+ type RepositoryProbe =
31
+ | { kind: "outside" }
32
+ | { kind: "custom"; hooksPath: string }
33
+ | { kind: "default"; declaredDefault: boolean };
34
+
35
+ const probeCache = new Map<string, { at: number; probe: RepositoryProbe }>();
36
+ let installedHooksDirectory: string | null = null;
37
+
38
+ const PER_SPAWN_ENV_NAMES = [ASSISTED_ENV, AUTHORED_ENV, CONFIG_BASE_COUNT_ENV, DEFAULT_HOOKS_EQUIVALENT_ENV] as const;
39
+
40
+ export interface ManagedCommitAttributionOptions {
41
+ cwd?: string;
42
+ enabled?: boolean;
43
+ evidence?: Readonly<CommitAttributionEvidence>;
44
+ }
45
+
46
+ export interface ManagedCommitAttributionEnvironment {
47
+ env: NodeJS.ProcessEnv;
48
+ /** Bounded, nonfatal reason the managed hook could not be composed. */
49
+ diagnostic: string | null;
50
+ }
51
+
52
+ /** Report a bounded fail-open reason once without changing child command output. */
53
+ export function reportCommitAttributionDiagnostic(diagnostic: string | null): void {
54
+ if (diagnostic === null || reportedDiagnostics.has(diagnostic)) return;
55
+ reportedDiagnostics.add(diagnostic);
56
+ process.stderr.write(`[clio:attribution] ${diagnostic}\n`);
57
+ }
58
+
59
+ export function setGitCommitAttributionEnabled(enabled: boolean): void {
60
+ process.env[CLIO_GIT_COMMITS_ENABLED_ENV] = enabled ? "1" : "0";
61
+ }
62
+
63
+ export function gitCommitAttributionEnabled(source: NodeJS.ProcessEnv = process.env): boolean {
64
+ return source[CLIO_GIT_COMMITS_ENABLED_ENV] !== "0";
65
+ }
66
+
67
+ /** Forget cached repository probes and the installed managed hooks directory. */
68
+ export function resetGitCommitAttributionCachesForTests(): void {
69
+ probeCache.clear();
70
+ installedHooksDirectory = null;
71
+ }
72
+
73
+ function boundedDiagnostic(message: string): string {
74
+ const folded = message.replace(/\s+/gu, " ").trim();
75
+ return folded.length <= DIAGNOSTIC_MAX_CHARS ? folded : `${folded.slice(0, DIAGNOSTIC_MAX_CHARS - 3)}...`;
76
+ }
77
+
78
+ /**
79
+ * Remove the command-scope config pair a parent Clio process installed, so a
80
+ * nested seam starts from the operator's own GIT_CONFIG_* entries.
81
+ */
82
+ function withoutManagedGitConfig(source: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
83
+ const env = { ...source };
84
+ const baseRaw = env[CONFIG_BASE_COUNT_ENV];
85
+ const currentRaw = env.GIT_CONFIG_COUNT;
86
+ if (baseRaw !== undefined && COUNT.test(baseRaw) && currentRaw !== undefined && COUNT.test(currentRaw)) {
87
+ const base = Number(baseRaw);
88
+ for (let index = base; index < Number(currentRaw); index += 1) {
89
+ Reflect.deleteProperty(env, `GIT_CONFIG_KEY_${index}`);
90
+ Reflect.deleteProperty(env, `GIT_CONFIG_VALUE_${index}`);
91
+ }
92
+ if (base === 0) Reflect.deleteProperty(env, "GIT_CONFIG_COUNT");
93
+ else env.GIT_CONFIG_COUNT = String(base);
94
+ }
95
+ for (const name of PER_SPAWN_ENV_NAMES) Reflect.deleteProperty(env, name);
96
+ return env;
97
+ }
98
+
99
+ function gitOutput(cwd: string, env: NodeJS.ProcessEnv, args: ReadonlyArray<string>): string | null {
100
+ try {
101
+ return execFileSync("git", [...args], {
102
+ cwd,
103
+ env,
104
+ encoding: "utf8",
105
+ stdio: ["ignore", "pipe", "ignore"],
106
+ timeout: 5_000,
107
+ }).trim();
108
+ } catch {
109
+ return null;
110
+ }
111
+ }
112
+
113
+ /**
114
+ * Every hook name Git resolves through core.hooksPath. Pointing core.hooksPath
115
+ * at the managed directory would otherwise silently disable each repository
116
+ * hook that is not prepare-commit-msg, so each name gets a chaining wrapper.
117
+ */
118
+ const MANAGED_HOOK_NAMES = [
119
+ "applypatch-msg",
120
+ "pre-applypatch",
121
+ "post-applypatch",
122
+ "pre-commit",
123
+ "pre-merge-commit",
124
+ "prepare-commit-msg",
125
+ "commit-msg",
126
+ "post-commit",
127
+ "pre-rebase",
128
+ "post-checkout",
129
+ "post-merge",
130
+ "pre-push",
131
+ "pre-receive",
132
+ "update",
133
+ "proc-receive",
134
+ "post-receive",
135
+ "post-update",
136
+ "reference-transaction",
137
+ "push-to-checkout",
138
+ "pre-auto-gc",
139
+ "post-rewrite",
140
+ "sendemail-validate",
141
+ "post-index-change",
142
+ ] as const;
143
+
144
+ /**
145
+ * One script serves every hook name. It restores the Git configuration the
146
+ * command would have had without Clio, chains the repository's own hook of the
147
+ * same name with the original exit status, and, for prepare-commit-msg only,
148
+ * appends the assistance and authorship trailers this spawn was given.
149
+ *
150
+ * Testing, review, and receipt trailers never cross the environment. The fleet
151
+ * seam writes them into the message in process from coordinator-owned facts;
152
+ * an environment channel could be forged by exporting a variable before
153
+ * `git commit`.
154
+ */
155
+ const MANAGED_HOOK_SCRIPT = `#!/bin/sh
156
+ # Clio Coder managed Git hook v${MANAGED_HOOK_VERSION}. Selected only through
157
+ # command-scope configuration in Clio child-process environments.
158
+
159
+ hook_name=$(basename "$0")
160
+
161
+ base_count=$${CONFIG_BASE_COUNT_ENV}
162
+ case "$base_count" in
163
+ '' | *[!0-9]*)
164
+ printf '%s\\n' '[clio:attribution] invalid managed hook environment' >&2
165
+ exit 0
166
+ ;;
167
+ 0) unset GIT_CONFIG_COUNT ;;
168
+ *)
169
+ GIT_CONFIG_COUNT=$base_count
170
+ export GIT_CONFIG_COUNT
171
+ ;;
172
+ esac
173
+
174
+ # A command may have moved into a different repository after Clio prepared the
175
+ # environment. A repository with its own core.hooksPath gets its hook run and
176
+ # is never attributed; composing an unknown setup is not attempted.
177
+ if [ "$${DEFAULT_HOOKS_EQUIVALENT_ENV}" != '1' ] && git config --get core.hooksPath >/dev/null 2>&1; then
178
+ custom_hooks=$(git config --path --get core.hooksPath 2>/dev/null || true)
179
+ case "$custom_hooks" in
180
+ '') ;;
181
+ /*) custom_hook=$custom_hooks/$hook_name ;;
182
+ *) custom_hook=$PWD/$custom_hooks/$hook_name ;;
183
+ esac
184
+ if [ -n "$custom_hooks" ] && [ -x "$custom_hook" ]; then exec "$custom_hook" "$@"; fi
185
+ exit 0
186
+ fi
187
+
188
+ common_dir=$(git rev-parse --git-common-dir 2>/dev/null || true)
189
+ case "$common_dir" in
190
+ '') default_hook= ;;
191
+ /*) default_hook=$common_dir/hooks/$hook_name ;;
192
+ *) default_hook=$PWD/$common_dir/hooks/$hook_name ;;
193
+ esac
194
+
195
+ if [ "$hook_name" != 'prepare-commit-msg' ]; then
196
+ if [ -n "$default_hook" ] && [ -x "$default_hook" ]; then exec "$default_hook" "$@"; fi
197
+ exit 0
198
+ fi
199
+
200
+ message_file=$1
201
+ message_source=$2
202
+
203
+ if [ -n "$default_hook" ] && [ -x "$default_hook" ]; then
204
+ "$default_hook" "$@" || exit $?
205
+ fi
206
+
207
+ # The repository's own hook semantics are settled. Everything below is
208
+ # fail-open and applies only to Clio-spawned commits with attribution enabled.
209
+ if [ "$AI_AGENT" != '${AI_AGENT_NAME}' ] || [ "$${CLIO_GIT_COMMITS_ENABLED_ENV}" != '1' ]; then exit 0; fi
210
+
211
+ # Only a message supplied up front (-m, -F, or a merge) is attributed. --amend,
212
+ # -c/-C, squash, and template sources reuse or lack a real message, and an
213
+ # editor session starts from an all-comment template where added trailers
214
+ # would turn an abandoned editor into a commit whose whole message is trailers.
215
+ case "$message_source" in message|merge) ;; *) exit 0 ;; esac
216
+ for marker in CHERRY_PICK_HEAD REVERT_HEAD rebase-apply rebase-merge sequencer; do
217
+ marker_path=$(git rev-parse --git-path "$marker" 2>/dev/null || true)
218
+ if [ -n "$marker_path" ] && [ -e "$marker_path" ]; then exit 0; fi
219
+ done
220
+
221
+ # Case-insensitive presence check on the whole message, so a human-written
222
+ # variant of a Clio trailer is respected rather than duplicated.
223
+ has_trailer() {
224
+ awk -v wanted="$(printf '%s' "$1" | tr '[:upper:]' '[:lower:]')" '
225
+ { line=$0; gsub(/[ \\t]+/, " ", line); sub(/ $/, "", line); if (tolower(line) == wanted) found=1 }
226
+ END { exit found ? 0 : 1 }' "$message_file"
227
+ }
228
+
229
+ append_trailer() {
230
+ if has_trailer "$1"; then return 0; fi
231
+ git interpret-trailers --in-place --if-exists=addIfDifferent --trailer "$1" "$message_file" ||
232
+ printf '%s\\n' '[clio:attribution] git interpret-trailers failed; commit left as written' >&2
233
+ }
234
+
235
+ if [ "$${ASSISTED_ENV}" = '1' ] || [ "$${AUTHORED_ENV}" = '1' ]; then
236
+ append_trailer '${CLIO_COMMIT_TRAILERS.assisted}'
237
+ fi
238
+ if [ "$${AUTHORED_ENV}" = '1' ]; then append_trailer '${CLIO_COMMIT_TRAILERS.coAuthored}'; fi
239
+ exit 0
240
+ `;
241
+
242
+ function installManagedHook(directory: string, name: string): void {
243
+ const hook = join(directory, name);
244
+ try {
245
+ if (existsSync(hook) && readFileSync(hook, "utf8") === MANAGED_HOOK_SCRIPT) {
246
+ chmodSync(hook, 0o755);
247
+ return;
248
+ }
249
+ } catch {
250
+ // Unreadable content is replaced below; the path is Clio-owned.
251
+ }
252
+ const temporary = `${hook}.tmp-${process.pid}-${Date.now()}`;
253
+ try {
254
+ writeFileSync(temporary, MANAGED_HOOK_SCRIPT, { encoding: "utf8", mode: 0o755 });
255
+ renameSync(temporary, hook);
256
+ } finally {
257
+ rmSync(temporary, { force: true });
258
+ }
259
+ }
260
+
261
+ function managedHooksDirectory(): string {
262
+ const directory = join(clioStateDir(), "git-hooks", `v${MANAGED_HOOK_VERSION}`);
263
+ // Installed once per process; one stat afterwards confirms the Clio-owned
264
+ // directory is still there rather than re-reading all of its wrappers.
265
+ if (installedHooksDirectory === directory && existsSync(join(directory, "prepare-commit-msg"))) return directory;
266
+ mkdirSync(directory, { recursive: true, mode: 0o700 });
267
+ for (const name of MANAGED_HOOK_NAMES) installManagedHook(directory, name);
268
+ installedHooksDirectory = directory;
269
+ return directory;
270
+ }
271
+
272
+ /** The environment entries that change what `git` resolves for a cwd. */
273
+ function gitEnvironmentFingerprint(env: NodeJS.ProcessEnv): string {
274
+ const parts: string[] = [];
275
+ for (const key of Object.keys(env)) {
276
+ if (key.startsWith("GIT_") || key === "HOME" || key === "XDG_CONFIG_HOME") parts.push(`${key}=${env[key] ?? ""}`);
277
+ }
278
+ return parts.sort().join("\0");
279
+ }
280
+
281
+ function probeRepositoryUncached(cwd: string, env: NodeJS.ProcessEnv): RepositoryProbe {
282
+ if (gitOutput(cwd, env, ["rev-parse", "--is-inside-work-tree"]) !== "true") return { kind: "outside" };
283
+ const customHooksPath = gitOutput(cwd, env, ["config", "--path", "--get", "core.hooksPath"]);
284
+ if (customHooksPath === null) return { kind: "default", declaredDefault: false };
285
+ const commonDirectory = gitOutput(cwd, env, ["rev-parse", "--git-common-dir"]);
286
+ const defaultHooksPath = commonDirectory === null ? null : resolve(cwd, commonDirectory, "hooks");
287
+ if (customHooksPath.length === 0 || resolve(cwd, customHooksPath) !== defaultHooksPath) {
288
+ return { kind: "custom", hooksPath: customHooksPath };
289
+ }
290
+ return { kind: "default", declaredDefault: true };
291
+ }
292
+
293
+ function probeRepository(cwd: string, env: NodeJS.ProcessEnv, now = Date.now()): RepositoryProbe {
294
+ const key = `${cwd}\0${gitEnvironmentFingerprint(env)}`;
295
+ const cached = probeCache.get(key);
296
+ if (cached !== undefined && now - cached.at < PROBE_CACHE_TTL_MS && now >= cached.at) return cached.probe;
297
+ const probe = probeRepositoryUncached(cwd, env);
298
+ if (cached === undefined && probeCache.size >= PROBE_CACHE_MAX_ENTRIES) {
299
+ const oldest = probeCache.keys().next().value;
300
+ if (oldest !== undefined) probeCache.delete(oldest);
301
+ }
302
+ probeCache.delete(key);
303
+ probeCache.set(key, { at: now, probe });
304
+ return probe;
305
+ }
306
+
307
+ /**
308
+ * Build a child environment that selects Clio's managed hooks directory through
309
+ * command-scope Git configuration. Repository and user configuration are never
310
+ * written. An effective core.hooksPath that is not the repository's default
311
+ * hooks directory is left alone: attribution fails open with a diagnostic.
312
+ *
313
+ * The repository probe behind this is cached per cwd and Git environment for
314
+ * `PROBE_CACHE_TTL_MS`, and the managed hooks directory is installed once per
315
+ * process, so a burst of spawns pays the git subprocesses once.
316
+ */
317
+ export function withManagedGitCommitAttributionEnvironment(
318
+ source: NodeJS.ProcessEnv,
319
+ options: ManagedCommitAttributionOptions = {},
320
+ ): ManagedCommitAttributionEnvironment {
321
+ const env = withoutManagedGitConfig(source);
322
+ env.AI_AGENT = AI_AGENT_NAME;
323
+ const enabled = options.enabled ?? gitCommitAttributionEnabled(source);
324
+ env[CLIO_GIT_COMMITS_ENABLED_ENV] = enabled ? "1" : "0";
325
+ if (!enabled) return { env, diagnostic: null };
326
+
327
+ const evidence = options.evidence ?? { materiallyAssisted: true, materiallyAuthored: true };
328
+ env[ASSISTED_ENV] = evidence.materiallyAssisted === true ? "1" : "0";
329
+ env[AUTHORED_ENV] = evidence.materiallyAuthored === true ? "1" : "0";
330
+
331
+ const countRaw = env.GIT_CONFIG_COUNT;
332
+ const count = countRaw === undefined ? 0 : COUNT.test(countRaw) ? Number(countRaw) : Number.NaN;
333
+ if (!Number.isSafeInteger(count) || count > 1_024) {
334
+ return { env, diagnostic: boundedDiagnostic("GIT_CONFIG_COUNT is invalid; Clio commit attribution skipped") };
335
+ }
336
+ const cwd = resolve(options.cwd ?? process.cwd());
337
+ const probe = probeRepository(cwd, env);
338
+ if (probe.kind === "outside") return { env, diagnostic: null };
339
+ if (probe.kind === "custom") {
340
+ return {
341
+ env,
342
+ diagnostic: boundedDiagnostic(`core.hooksPath is set to '${probe.hooksPath}'; Clio commit attribution skipped`),
343
+ };
344
+ }
345
+ if (probe.declaredDefault) env[DEFAULT_HOOKS_EQUIVALENT_ENV] = "1";
346
+
347
+ let hooksDirectory: string;
348
+ try {
349
+ hooksDirectory = managedHooksDirectory();
350
+ } catch (error) {
351
+ const reason = error instanceof Error ? error.message : String(error);
352
+ return {
353
+ env,
354
+ diagnostic: boundedDiagnostic(`managed hooks unavailable; Clio commit attribution skipped (${reason})`),
355
+ };
356
+ }
357
+ env[CONFIG_BASE_COUNT_ENV] = String(count);
358
+ env.GIT_CONFIG_COUNT = String(count + 1);
359
+ env[`GIT_CONFIG_KEY_${count}`] = "core.hooksPath";
360
+ env[`GIT_CONFIG_VALUE_${count}`] = hooksDirectory;
361
+ return { env, diagnostic: null };
362
+ }
@@ -0,0 +1,45 @@
1
+ import { isAbsolute, join, relative } from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ import { resolvePackageRoot } from "./package-root.js";
4
+
5
+ function missingModulePath(message: string): string | null {
6
+ const specifier = /Cannot find (?:module|package) ['"]([^'"]+)['"]/.exec(message)?.[1];
7
+ if (!specifier) return null;
8
+ if (specifier.startsWith("file:")) {
9
+ try {
10
+ return fileURLToPath(specifier);
11
+ } catch {
12
+ return null;
13
+ }
14
+ }
15
+ return isAbsolute(specifier) ? specifier : null;
16
+ }
17
+
18
+ /**
19
+ * Turn a missing Clio-owned lazy chunk into an actionable reinstall message.
20
+ * Errors for user extensions, hooks, or any module outside this installation's
21
+ * generated `dist` directory remain untouched.
22
+ */
23
+ export function incompleteInstallationAdvice(err: unknown): string | null {
24
+ if ((err as NodeJS.ErrnoException | undefined)?.code !== "ERR_MODULE_NOT_FOUND") return null;
25
+ const message = err instanceof Error ? err.message : String(err);
26
+ let outputDir: string;
27
+ try {
28
+ outputDir = join(resolvePackageRoot(), "dist");
29
+ } catch {
30
+ return null;
31
+ }
32
+ const missing = missingModulePath(message);
33
+ if (!missing) return null;
34
+ const fromOutput = relative(outputDir, missing);
35
+ if (fromOutput === "" || fromOutput.startsWith("..") || isAbsolute(fromOutput)) return null;
36
+ return [
37
+ `${message}`,
38
+ "",
39
+ "This Clio Coder installation is incomplete: the command's own module is missing from",
40
+ `${outputDir}`,
41
+ "Reinstall to restore it, using the line that matches how you installed:",
42
+ " npm install -g @iowarp/clio-coder # npm install",
43
+ " npm run install:local # source checkout",
44
+ ].join("\n");
45
+ }
@@ -10,7 +10,7 @@ export const RESPONSE_SCHEMA_MAX_SERIALIZED_BYTES = 64 * 1024;
10
10
  * OpenAI-compatible gateway accepts that request, ignores the unrecognized
11
11
  * `schema` key, and returns HTTP 200 with unconstrained JSON, so widening this
12
12
  * to the api family would convert a clean refusal into a silent
13
- * non-enforcement. lmstudio-native declares `structuredOutputs: "json-schema"`
13
+ * non-enforcement. lmstudio declares `structuredOutputs: "json-schema"`
14
14
  * truthfully and is still excluded here, because Clio has no dialect for its
15
15
  * transport. Widen this only together with a dialect for the runtime added.
16
16
  */
@@ -1,6 +1,12 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import path from "node:path";
3
3
  import { performance } from "node:perf_hooks";
4
+ import { AI_AGENT_NAME } from "./agent-environment.js";
5
+ import {
6
+ gitCommitAttributionEnabled,
7
+ reportCommitAttributionDiagnostic,
8
+ withManagedGitCommitAttributionEnvironment,
9
+ } from "./git-commit-attribution.js";
4
10
  import { clampTimerDelayMs } from "./timers.js";
5
11
 
6
12
  export const SAFE_EXEC_DEFAULT_TIMEOUT_MS = 120_000;
@@ -53,6 +59,7 @@ export function buildSafeToolEnv(extra: Record<string, string> = {}): NodeJS.Pro
53
59
  if (!/^[A-Z_][A-Z0-9_]*$/i.test(key)) continue;
54
60
  env[key] = value;
55
61
  }
62
+ env.AI_AGENT = AI_AGENT_NAME;
56
63
  return env;
57
64
  }
58
65
 
@@ -74,6 +81,11 @@ export function runCommandVector(
74
81
  const cwd = resolveSafeCwd(options.cwd, options.workspaceRoot);
75
82
  const timeoutMs = clampTimerDelayMs(options.timeoutMs ?? SAFE_EXEC_DEFAULT_TIMEOUT_MS);
76
83
  const maxOutputBytes = options.maxOutputBytes ?? SAFE_EXEC_DEFAULT_MAX_OUTPUT_BYTES;
84
+ const attribution = withManagedGitCommitAttributionEnvironment(buildSafeToolEnv(options.env), {
85
+ cwd,
86
+ enabled: gitCommitAttributionEnabled(process.env),
87
+ });
88
+ reportCommitAttributionDiagnostic(attribution.diagnostic);
77
89
  let aborted = false;
78
90
  let timedOut = false;
79
91
  let outputCapped = false;
@@ -87,7 +99,7 @@ export function runCommandVector(
87
99
 
88
100
  const child = spawn(file, [...args], {
89
101
  cwd,
90
- env: buildSafeToolEnv(options.env),
102
+ env: attribution.env,
91
103
  detached: process.platform !== "win32",
92
104
  stdio: ["ignore", "pipe", "pipe"],
93
105
  });