@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,136 @@
1
+ ---
2
+ name: workflow-distiller
3
+ description: Use when a workflow that just happened should become reusable, when the user says "make this a skill", "package what we just did", "turn this into a workflow", or when the same multi-step process has been repeated across sessions. Reconstructs the workflow from the session record, interviews, checks overlap with installed skills, gates on approval, then writes the SKILL.md following skill-craft. Not for authoring a skill from scratch with no prior workflow; write the SKILL.md directly following skill-craft. Not for distilling into an agent recipe; propose that as a follow-up when the workflow is dispatch-shaped.
4
+ version: 0.2.1
5
+ license: Apache-2.0
6
+ allowed-tools:
7
+ - read
8
+ - grep
9
+ - find
10
+ - ls
11
+ - context
12
+ - write
13
+ - ask_user
14
+ requires:
15
+ - skill:skill-craft
16
+ clio:
17
+ registry-id: iowarp/clio-coder
18
+ source-url: https://github.com/iowarp/clio-coder/tree/main/skills/workflow/workflow-distiller
19
+ audit: pass
20
+ provenance: designed
21
+ eval-status: smoke-checked
22
+ model-size: large
23
+ ---
24
+
25
+ # Workflow Distiller
26
+
27
+ Turn a workflow that actually ran into a reusable skill. The distiller's
28
+ identity is runtime truth: it reconstructs what happened from the visible
29
+ session record, not from anyone's memory of it. Skip the ceremony when there
30
+ is no prior workflow; a from-scratch skill is a SKILL.md written directly,
31
+ following skill-craft. skill-craft also governs how every skill this
32
+ distiller produces is written: description, body, and pruning rules live
33
+ there, not here.
34
+
35
+ ## Phase 1 - Reconstruct From Evidence
36
+
37
+ Before asking anything, list the concrete steps that visibly executed in this
38
+ session, in order: tools called, commands run, files touched, dispatches made,
39
+ skills activated. Cite the conversation record for each step. Anything the
40
+ user describes that did not visibly run is tagged `assumption` and becomes an
41
+ interview question. This grounding step is mandatory and comes first; when the
42
+ reconstruction and the user's memory disagree, the reconstruction wins and the
43
+ disagreement is worth a question.
44
+
45
+ ## Phase 2 - Interview
46
+
47
+ Use `ask_user` with `mode: "single_question"`, one question per round, bounded
48
+ rounds (default 8, max 12), following the grill-me operating contract:
49
+ recommended answer first when options are natural, stop signals ("stop",
50
+ "enough", "later", cancel) respected immediately, answers translated into
51
+ compact decisions. Question bank, roots before leaves:
52
+
53
+ 1. Confirm the reconstruction and resolve tagged assumptions.
54
+ 2. Inputs and outputs: what varies between runs, what is fixed.
55
+ 3. Recurrence: how often has this actually happened? A workflow that ran once
56
+ is usually not worth a skill; ask early and offer to stop.
57
+ 4. Per-step rigidity: must-match versus any-reasonable-approach.
58
+ 5. Failure behavior per step: ask the user, retry an alternative, or fail
59
+ loudly.
60
+ 6. Scope cuts: what the skill should refuse to do.
61
+ 7. Name (lowercase-hyphen).
62
+
63
+ ## Phase 3 - Overlap Check
64
+
65
+ Call `context(scope="skills")` with no name to list installed skills. Judge
66
+ overlap per step, not per workflow: if an installed skill's triggers cover a
67
+ step, that step is referenced by name in the new skill body, never
68
+ reimplemented, with a one-line rationale for the dependency. A different end
69
+ goal does not excuse reimplementing a covered step. Record each reference as
70
+ a `requires: [skill:<name>]` entry in the generated skill's frontmatter in
71
+ Phase 5, so the loader warns when the dependency is missing.
72
+
73
+ ## Phase 4 - Design Gate
74
+
75
+ Present a compact design summary and wait for explicit approval:
76
+
77
+ ```markdown
78
+ ## Skill Design - <name>
79
+ Description draft: <triggers only, third person>
80
+ Steps: <step, rigidity, on-failure> per line
81
+ References: <skill:<name>, why> or none
82
+ Scope: project | user (user only if the workflow crosses repositories)
83
+ Validation scenario: <prompt, expected observable behavior>
84
+ ```
85
+
86
+ No skill file is written before the user approves. "Looks fine, but change X"
87
+ means revise and re-present.
88
+
89
+ ## Phase 5 - Create
90
+
91
+ Write `SKILL.md` under `.clio-coder/skills/<approved-name>/`, following skill-craft
92
+ for the frontmatter contract, a triggers-only third-person description, and
93
+ the pruning pass, with `requires: [skill:<name>]` for every skill the overlap
94
+ check referenced. Confirm it loads with `clio-coder skills validate`. Scope
95
+ defaults to project; use the user skill store only when the user said the
96
+ workflow crosses repositories. Placeholders replace every session-specific
97
+ path, name, and value; distill the pattern, not the incident. Keep the
98
+ generated skill under 120 lines; reference instead of inlining. If
99
+ the session repeatedly dispatched the same worker pattern, also offer a recipe
100
+ sketch for the agents surface, but do not write recipe files.
101
+
102
+ ## Phase 6 - Validate
103
+
104
+ Record one RED-GREEN scenario agreed with the user: the prompt, and the
105
+ observable behavior that distinguishes with-skill from without. Run it once if
106
+ cheap (a single small headless run); otherwise record it in the skill body's
107
+ example section as the standing validation obligation.
108
+
109
+ ## Worked Example
110
+
111
+ Session: the user fetched a CSV export, normalized column names with a small
112
+ script, and verified row counts against the source, three sessions in a row.
113
+
114
+ 1. Reconstruct: `bash curl ...` (ran), `write normalize.py` + `bash python3
115
+ normalize.py` (ran), `bash wc -l` comparison (ran). User also mentions "and
116
+ I always spot-check five rows" - not visible this session, tagged
117
+ assumption.
118
+ 2. Interview: confirms reconstruction; spot-check confirmed as a real step;
119
+ recurrence "weekly"; normalization must-match, fetch any-approach; failure
120
+ on row-count mismatch must fail loudly; name `csv-ingest`.
121
+ 3. Overlap: the `context(scope="skills")` listing shows no fetch or CSV skill
122
+ installed; no references.
123
+ 4. Gate: summary presented; user approves after tightening the description.
124
+ 5. Create: write `.clio-coder/skills/csv-ingest/SKILL.md`, placeholders for the
125
+ export URL and column map; `clio-coder skills validate` passes.
126
+ 6. Validate: scenario "ingest this month's export" must show fetch,
127
+ normalize, count-verify, spot-check in that order; recorded in the body.
128
+
129
+ ## Red Flags
130
+
131
+ - Writing any skill before the design gate is approved.
132
+ - A reconstruction that lists steps nothing in the session shows.
133
+ - Reimplementing an installed skill's job instead of referencing it.
134
+ - Session-specific paths or values surviving into the generated skill.
135
+ - Batching interview questions or ignoring a stop signal.
136
+ - Distilling a one-off without asking about recurrence.
@@ -0,0 +1,107 @@
1
+ # Evals - workflow-distiller
2
+
3
+ Baseline scenarios (run a subagent WITHOUT the skill to capture the gap, then
4
+ WITH the skill to confirm it closes). Rubric is pass/fail per bullet.
5
+
6
+ ## S1 - "make what we just did a skill"
7
+
8
+ Setup: Make what we just did a skill. For the record, this session we ran
9
+ the release-notes workflow end to end: pulled the merged PR titles since
10
+ the last tag with gh, grouped them by conventional-commit type, rewrote
11
+ each group into user-facing bullets, and verified every PR number in the
12
+ draft against the gh list before saving docs/release-notes.md. I also
13
+ mentioned we sometimes ping the release channel afterwards, but we did not
14
+ do that here.
15
+
16
+ Expected:
17
+
18
+ - Reconstructs the executed steps from the session record, in order, before
19
+ asking any question; unobserved steps the user mentions are tagged as
20
+ assumptions.
21
+ - Interviews via `ask_user` with `mode: "single_question"`, one question per
22
+ round, bounded rounds.
23
+ - Lists installed skills via `context(scope="skills")` with no name before
24
+ designing.
25
+ - Presents a compact design summary and waits for explicit approval.
26
+ - Writes the SKILL.md only after approval, with session-specific values
27
+ replaced by placeholders.
28
+ - Records a RED-GREEN validation scenario.
29
+
30
+ ## S2 - overlap with an installed skill
31
+
32
+ Setup: the workflow's retrieval step is already covered by an installed skill
33
+ (for example arxiv-literature for paper retrieval).
34
+
35
+ Expected:
36
+
37
+ - The overlap check finds the installed skill.
38
+ - The generated skill references it by name instead of reimplementing the
39
+ step, with a one-line rationale in the body.
40
+ - The generated frontmatter carries `requires: [skill:<name>]` so the loader's
41
+ unmet-dependency warning arms when the referenced skill is absent.
42
+
43
+ ## S3 - no recurrence
44
+
45
+ Setup: mid-interview the user admits the workflow has only ever run once and
46
+ may not recur.
47
+
48
+ Expected:
49
+
50
+ - Questions whether distillation is worth it and offers to stop.
51
+ - Does not press on to create a skill for a one-off by default.
52
+
53
+ ## S4 - anti-trigger: brand-new skill
54
+
55
+ Setup: user asks for a new skill for something never done in any session.
56
+
57
+ Expected:
58
+
59
+ - Skips the distiller ceremony and points at writing the SKILL.md directly,
60
+ following skill-craft.
61
+
62
+ ## Baseline failure modes to watch for (RED)
63
+
64
+ - Writes a vague skill immediately from the user's description, no grounding
65
+ in what actually ran.
66
+ - No overlap check; reimplements an installed skill's behavior.
67
+ - No approval gate; the skill file appears before the user saw a design.
68
+ - Session-specific paths, URLs, and values baked into the skill body.
69
+ - Multi-question interviewing or an unbounded question stream.
70
+
71
+ ## Observed results
72
+
73
+ Runs 2026-07-02, headless `clio-coder run --skill`. `ask_user` is not registered in
74
+ headless runs, so interviews were exercised with pre-supplied decisions in the
75
+ prompt; the phases still had to run in order.
76
+
77
+ - Six-phase walk (CSV header normalization fixture): the workflow visibly ran
78
+ (write plus execute normalize.py, row-count check), Phase 1 cited exactly
79
+ those steps, Phase 2 applied the pre-supplied decisions question by
80
+ question, Phase 3 listed installed skills with no name, Phase 4 presented
81
+ the summary and stopped for approval even though pre-approval was offered
82
+ (the strict reading of the gate), and after an explicit approval turn Phase
83
+ 5's skill-creation call landed a loadable project skill that `clio-coder skills
84
+ inspect` resolves, with placeholders instead of session paths. Phase 6
85
+ recorded the validation scenario in the body.
86
+ - S2 RED (no distiller, arxiv-literature installed): the baseline created the
87
+ skill immediately with no overlap check against the installed-skill
88
+ listing, no gate, and a body that reimplements the fetch step. Gap
89
+ confirmed.
90
+ - S2 GREEN: with the shipped per-step overlap wording, the design references
91
+ `arxiv-literature` with a rationale instead of reimplementing retrieval.
92
+ Two earlier drafts missed this: workflow-level overlap judgment and a
93
+ fixture prompt that prescribed the fetch mechanism both masked the
94
+ behavior; the wording now says a different end goal does not excuse
95
+ reimplementing a covered step. At the time of that run the skill-creation
96
+ tool could not emit `requires` frontmatter, so the skill handed the user
97
+ the line to add; `requires: [skill:arxiv-literature]` on the generated
98
+ skill was verified to produce the loader's "requires skill ... which is not
99
+ available" warning when the dependency is absent. 2026-07-02: skill
100
+ creation moved to writing SKILL.md directly (the artifact tool's skill kind
101
+ was removed); Phase 5 now writes the `requires` entries into the
102
+ frontmatter itself.
103
+
104
+ ## Smoke record (2026-08-13)
105
+
106
+ One representative scenario via `clio-coder skills eval` against Nemo-3.5-Lightning
107
+ (30B local, llamacpp on mini), full-auto sandbox. PASS. Inline session-trace setup engaged; judge 5/6.
package/src/cli/acp.ts CHANGED
@@ -1,4 +1,6 @@
1
+ import { realpathSync } from "node:fs";
1
2
  import path from "node:path";
3
+ import { MAX_TIMER_DELAY_MS } from "../core/timers.js";
2
4
  import { runClioCommand } from "./clio.js";
3
5
  import { restoreStdout, takeOverStdout, writeRawStdout } from "./output-guard.js";
4
6
  import { printError } from "./shared.js";
@@ -9,7 +11,7 @@ Serve Clio Coder as an Agent Client Protocol v1 agent over stdio.
9
11
 
10
12
  --cwd PATH Workspace root the server boots in and opens sessions at.
11
13
  --permission-timeout MS How long a mediated permission request may wait for the
12
- client before it is denied. Defaults to the configured
14
+ client before the prompt expires. Defaults to the configured
13
15
  delegation.defaults.permissionTimeoutMs.
14
16
 
15
17
  This command is intended for ACP frontends to spawn. Interactive delegation remains
@@ -35,7 +37,9 @@ function parseAcpFlags(args: ReadonlyArray<string>): AcpFlags | string {
35
37
  }
36
38
  if (arg === "--permission-timeout") {
37
39
  const ms = value === undefined ? Number.NaN : Number(value);
38
- if (!Number.isInteger(ms) || ms <= 0) return "--permission-timeout needs a positive whole number of milliseconds";
40
+ if (!Number.isInteger(ms) || ms <= 0 || ms > MAX_TIMER_DELAY_MS) {
41
+ return `--permission-timeout needs a whole number from 1 to ${MAX_TIMER_DELAY_MS} milliseconds`;
42
+ }
39
43
  flags.permissionTimeoutMs = ms;
40
44
  index += 1;
41
45
  continue;
@@ -45,6 +49,19 @@ function parseAcpFlags(args: ReadonlyArray<string>): AcpFlags | string {
45
49
  return flags;
46
50
  }
47
51
 
52
+ /**
53
+ * The workspace root the server is pinned to, resolved and then canonicalized
54
+ * through the filesystem. A symlinked launch path is the reason: `process.cwd()`
55
+ * reports the physical path after chdir, so a session request carrying the same
56
+ * string the process was launched with used to be refused as a different
57
+ * workspace. One canonical form on both sides removes that class of mismatch.
58
+ * Throws when the path cannot be resolved, which the caller reports as an
59
+ * unusable `--cwd`.
60
+ */
61
+ export function resolveAcpCwd(value: string): string {
62
+ return realpathSync(path.resolve(value));
63
+ }
64
+
48
65
  export async function runAcpCommand(
49
66
  args: ReadonlyArray<string>,
50
67
  options: { apiKey?: string; noContextFiles?: boolean; noSkills?: boolean; skillPaths?: ReadonlyArray<string> } = {},
@@ -62,9 +79,11 @@ export async function runAcpCommand(
62
79
  // Boot has to happen in the workspace the sessions will use: settings
63
80
  // resolution, project context, and the session ledger all read process.cwd(),
64
81
  // and the server refuses a session whose cwd is not the one it booted in.
82
+ // The path is canonicalized before the chdir so the launch root and every
83
+ // later comparison against process.cwd() speak the same physical path.
65
84
  if (flags.cwd !== undefined) {
66
85
  try {
67
- process.chdir(flags.cwd);
86
+ process.chdir(resolveAcpCwd(flags.cwd));
68
87
  } catch {
69
88
  printError(`--cwd is not a directory this process can enter: ${flags.cwd}`);
70
89
  return 2;
@@ -78,7 +97,15 @@ export async function runAcpCommand(
78
97
  ...(options.noSkills ? { noSkills: true } : {}),
79
98
  ...(options.skillPaths && options.skillPaths.length > 0 ? { skillPaths: options.skillPaths } : {}),
80
99
  acp: {
81
- transportOptions: { write: writeRawStdout },
100
+ // Stdout is JSON-RPC only. An unclassified handler failure answers the
101
+ // client with fixed host text; the original message, which nothing in
102
+ // this process authored, goes to the stderr tail.
103
+ transportOptions: {
104
+ write: writeRawStdout,
105
+ diagnostics: (line) => {
106
+ process.stderr.write(`[clio:acp] ${line}\n`);
107
+ },
108
+ },
82
109
  ...(flags.permissionTimeoutMs === undefined ? {} : { permissionTimeoutMs: flags.permissionTimeoutMs }),
83
110
  },
84
111
  });
package/src/cli/clio.ts CHANGED
@@ -1,8 +1,18 @@
1
+ import { formatBootTrace } from "../core/boot-trace.js";
1
2
  import { initializeClioHome } from "../core/init.js";
2
- import { type BootOptions, bootOrchestrator } from "../entry/orchestrator.js";
3
- import { runConfigureCommand } from "./configure.js";
3
+ import { readLayeredSettings, readStrictLayeredSettings } from "../core/settings-layers.js";
4
+ import type { BootOptions } from "../entry/boot-options.js";
4
5
  import { classifyDefaultTarget, describeVerdict } from "./default-target.js";
5
6
 
7
+ /** Headless and ACP keep their established non-TUI transports even when an
8
+ * embedding process leaves the interactive marker in the environment. */
9
+ export function terminalLeaseEligible(
10
+ options: Pick<BootOptions, "headless" | "acp">,
11
+ env: Readonly<Record<string, string | undefined>> = process.env,
12
+ ): boolean {
13
+ return !options.headless && !options.acp && env.CLIO_CODER_INTERACTIVE === "1";
14
+ }
15
+
6
16
  export async function runClioCommand(options: BootOptions = {}): Promise<number> {
7
17
  // Bare `clio` (no subcommand) boots interactive mode implicitly, but only
8
18
  // when stdin is a real TTY. Piped or /dev/null stdin (used by verify.ts,
@@ -12,9 +22,14 @@ export async function runClioCommand(options: BootOptions = {}): Promise<number>
12
22
  if (!options.headless && !options.acp && process.env.CLIO_CODER_INTERACTIVE === undefined && process.stdin.isTTY) {
13
23
  process.env.CLIO_CODER_INTERACTIVE = "1";
14
24
  }
15
- if (process.env.CLIO_CODER_INTERACTIVE === "1") {
25
+ let startupSettings: import("../core/config.js").ClioSettings | undefined;
26
+ if (terminalLeaseEligible(options)) {
16
27
  initializeClioHome();
17
- const verdict = classifyDefaultTarget();
28
+ // The user file remains a strict gate. Project layers retain their
29
+ // established best-effort diagnostics, but every subsequent boot phase
30
+ // consumes this same effective snapshot.
31
+ startupSettings = readStrictLayeredSettings(process.cwd()).settings;
32
+ const verdict = classifyDefaultTarget(startupSettings);
18
33
  if (verdict.kind === "missing-credential") {
19
34
  // Diagnosis without a detour. The session continues, because whether
20
35
  // the credential is actually required is the endpoint's answer to
@@ -25,10 +40,57 @@ export async function runClioCommand(options: BootOptions = {}): Promise<number>
25
40
  );
26
41
  } else if (verdict.kind !== "usable") {
27
42
  process.stdout.write(`${describeVerdict(verdict)} Starting \`clio-coder configure\`.\n`);
43
+ const { runConfigureCommand } = await import("./configure.js");
28
44
  const configured = await runConfigureCommand([]);
29
45
  if (configured !== 0) return configured;
46
+ startupSettings = readStrictLayeredSettings(process.cwd()).settings;
47
+ }
48
+ }
49
+ let terminalLease: import("../interactive/terminal-lease.js").TerminalLease | undefined;
50
+ try {
51
+ if (terminalLeaseEligible(options)) {
52
+ const { createProcessTerminalLease, instantShellEnabled } = await import("../interactive/terminal-lease.js");
53
+ if (instantShellEnabled()) {
54
+ let stage0FrameId: number | null = null;
55
+ terminalLease = createProcessTerminalLease({
56
+ settings: startupSettings ?? readLayeredSettings(process.cwd()).settings,
57
+ onStage0Commit: (frameId) => {
58
+ stage0FrameId = frameId;
59
+ },
60
+ });
61
+ if (stage0FrameId !== null) {
62
+ const line = formatBootTrace("Stage 0 shell commit", `frameId=${stage0FrameId}`);
63
+ if (line) terminalLease.deferDiagnostic("stderr", line);
64
+ }
65
+ }
66
+ }
67
+ // Deterministic built-PTY interleaving seam. It is unavailable outside
68
+ // NODE_ENV=test and bounded even under a malformed value.
69
+ if (terminalLease && process.env.NODE_ENV === "test") {
70
+ const requestedDelay = Number.parseInt(process.env.CLIO_CODER_TEST_STAGE1_DELAY_MS ?? "0", 10);
71
+ const delayMs = Number.isFinite(requestedDelay) ? Math.max(0, Math.min(5_000, requestedDelay)) : 0;
72
+ if (delayMs > 0) await new Promise<void>((resolve) => setTimeout(resolve, delayMs));
73
+ if (process.env.CLIO_CODER_TEST_STAGE1_FAIL === "1") {
74
+ throw new Error("injected Stage 1 hydration failure");
75
+ }
76
+ }
77
+ const { bootOrchestrator } = await import("../entry/orchestrator.js");
78
+ const result = await bootOrchestrator({
79
+ ...options,
80
+ ...(startupSettings ? { startupSettings } : {}),
81
+ ...(terminalLease ? { terminalLease } : {}),
82
+ });
83
+ return result.exitCode;
84
+ } catch (error) {
85
+ try {
86
+ await terminalLease?.fail();
87
+ } catch (cleanupError) {
88
+ // Preserve the established boot failure as the primary error. The lease
89
+ // has already attempted every restoration step and reached `closed`.
90
+ process.stderr.write(
91
+ `Clio Coder: terminal cleanup also failed: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}\n`,
92
+ );
30
93
  }
94
+ throw error;
31
95
  }
32
- const result = await bootOrchestrator(options);
33
- return result.exitCode;
34
96
  }
@@ -12,12 +12,13 @@
12
12
  */
13
13
 
14
14
  import { existsSync, readFileSync } from "node:fs";
15
- import { join } from "node:path";
15
+ import { basename } from "node:path";
16
16
  import type { ClioSettings } from "../core/config.js";
17
17
  import { readLayeredSettings, type SettingsOrigin, settingsSourceFor } from "../core/settings-layers.js";
18
18
  import { clioDataDir } from "../core/xdg.js";
19
19
  import {
20
20
  loadOperatorProfile,
21
+ loadProjectClioMd,
21
22
  loadProjectRules,
22
23
  renderOperatorProfile,
23
24
  renderPromptContext,
@@ -51,7 +52,7 @@ export interface CustomizationEntry {
51
52
  sourcePath?: string;
52
53
  hash?: string;
53
54
  trust?: "trusted" | "untrusted" | "n/a";
54
- precedence?: "winner" | "loser" | "single";
55
+ precedence?: "winner" | "loser" | "single" | "layer";
55
56
  reloadClass: ReloadClass;
56
57
  /** Token cost where the item enters the prompt; absent when it does not. */
57
58
  contextCostTokens?: number;
@@ -105,29 +106,34 @@ function inspectSettings(cwd: string, graph: CustomizationGraph): void {
105
106
  }
106
107
 
107
108
  function inspectClioMd(cwd: string, graph: CustomizationGraph): void {
108
- const path = join(cwd, "CLIO-CODER.md");
109
- if (!existsSync(path)) return;
109
+ const loaded = loadProjectClioMd(cwd);
110
+ for (const issue of loaded.errors) graph.issues.push(`clio-md ${issue.path}: ${issue.error}`);
111
+ if (loaded.files.length === 0) return;
110
112
  try {
111
- const text = readFileSync(path, "utf8");
112
113
  const promptContext = renderPromptContext(cwd);
113
114
  const preload = classifyProjectPreload({ hasClioMd: promptContext.clioMd !== null, text: promptContext.text });
114
- graph.entries.push({
115
- category: "clio-md",
116
- id: "CLIO-CODER.md",
117
- scope: "project",
118
- sourcePath: path,
119
- hash: shortHash(text),
120
- trust: "trusted",
121
- precedence: "single",
122
- reloadClass: "next-turn",
123
- contextCostTokens: ceilChars(text.length),
124
- detail: {
125
- preload: preload.label,
126
- preloadChars: preload.chars,
127
- preloadLines: preload.lines,
128
- ...(preload.nearLimit ? { preloadNearLimit: true } : {}),
129
- },
130
- });
115
+ for (const [index, file] of loaded.files.entries()) {
116
+ const text = readFileSync(file.path, "utf8");
117
+ graph.entries.push({
118
+ category: "clio-md",
119
+ id: basename(file.path),
120
+ scope: "project",
121
+ sourcePath: file.path,
122
+ hash: shortHash(text),
123
+ trust: "trusted",
124
+ precedence: loaded.files.length === 1 ? "single" : "layer",
125
+ reloadClass: "next-turn",
126
+ contextCostTokens: ceilChars(text.length),
127
+ detail: {
128
+ layer: index + 1,
129
+ layers: loaded.files.length,
130
+ preload: preload.label,
131
+ preloadChars: preload.chars,
132
+ preloadLines: preload.lines,
133
+ ...(preload.nearLimit ? { preloadNearLimit: true } : {}),
134
+ },
135
+ });
136
+ }
131
137
  } catch (err) {
132
138
  graph.issues.push(`clio-md: ${err instanceof Error ? err.message : String(err)}`);
133
139
  }