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