rovecode 0.3.3 → 0.4.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (491) hide show
  1. package/CHANGELOG.md +512 -0
  2. package/README.md +33 -48
  3. package/bin/rovecode.js +24 -0
  4. package/dist/cli/app-dybnr56b.js +2 -0
  5. package/dist/cli/ask-user-p8hq4xgj.js +2 -0
  6. package/dist/cli/auth-login-ewpgw5sm.js +2 -0
  7. package/dist/cli/auth-m8p9grty.js +2 -0
  8. package/dist/cli/bench-xv3ypwev.js +9 -0
  9. package/dist/cli/catalog-737wb2s0.js +2 -0
  10. package/dist/cli/cli-arhg40m0.js +2 -0
  11. package/dist/cli/client-cf2pxx8q.js +2 -0
  12. package/dist/cli/commands-3p7e4xxs.js +2 -0
  13. package/dist/cli/connect-3q93d7cb.js +2 -0
  14. package/dist/cli/context-cmd-eqxmxhzq.js +2 -0
  15. package/dist/cli/context-report-hbw9zfes.js +2 -0
  16. package/dist/cli/count-remote-mby98cd0.js +2 -0
  17. package/dist/cli/design-122y0axd.js +2 -0
  18. package/dist/cli/dispatch-b4egzvvh.js +2 -0
  19. package/dist/cli/doctor-x4jkv72e.js +3 -0
  20. package/dist/cli/executor-ftvg6tsy.js +2 -0
  21. package/dist/cli/export-pdgdhkch.js +2 -0
  22. package/dist/cli/files-cez9a96p.js +2 -0
  23. package/dist/cli/gauntlet-r3xxaszc.js +2 -0
  24. package/dist/cli/gauntlet-runner-r515m7kk.js +10 -0
  25. package/dist/cli/gauntlet-wave3-bnkjk2v2.js +5 -0
  26. package/dist/cli/gauntlet-wave4-acs9s60q.js +14 -0
  27. package/dist/cli/hashline-ewg5hbe3.js +2 -0
  28. package/dist/cli/http-n0kehsk8.js +5 -0
  29. package/dist/cli/index-z5qt1s76.js +2 -0
  30. package/dist/cli/install-80mp63kx.js +2 -0
  31. package/dist/cli/loop-12twjcat.js +2 -0
  32. package/dist/cli/main-01pv9206.js +4 -0
  33. package/dist/cli/main-0jys2ccn.js +3 -0
  34. package/dist/cli/main-1ztz6fkj.js +10 -0
  35. package/dist/cli/main-23q7cmww.js +9 -0
  36. package/dist/cli/main-2rzbexn2.js +3 -0
  37. package/dist/cli/main-2wyax8k9.js +9 -0
  38. package/dist/cli/main-2yeveeve.js +6 -0
  39. package/dist/cli/main-2z3dek0b.js +3 -0
  40. package/dist/cli/main-2zgsknth.js +3 -0
  41. package/dist/cli/main-45ejth3a.js +4 -0
  42. package/dist/cli/main-45rn3trk.js +22 -0
  43. package/dist/cli/main-4p4e2w7x.js +4 -0
  44. package/dist/cli/main-4y0tnfpa.js +16 -0
  45. package/dist/cli/main-5py0rkmc.js +4 -0
  46. package/dist/cli/main-6dtqmbt6.js +7 -0
  47. package/dist/cli/main-6h9x282m.js +4 -0
  48. package/dist/cli/main-6vjeds42.js +3 -0
  49. package/dist/cli/main-78gq4bt9.js +6 -0
  50. package/dist/cli/main-7jd5vh3x.js +4 -0
  51. package/dist/cli/main-7kt6r53y.js +4 -0
  52. package/dist/cli/main-8c1tbazx.js +58 -0
  53. package/dist/cli/main-9a9rnh47.js +19 -0
  54. package/dist/cli/main-9ht36z12.js +3 -0
  55. package/dist/cli/main-a2yfvcy9.js +7 -0
  56. package/dist/cli/main-a3f51n0x.js +5 -0
  57. package/dist/cli/main-b8zq261k.js +3 -0
  58. package/dist/cli/main-bxtvnf6d.js +13 -0
  59. package/dist/cli/main-edxc3yzt.js +4 -0
  60. package/dist/cli/main-evgz4mp5.js +21 -0
  61. package/dist/cli/main-f33fc5je.js +9 -0
  62. package/dist/cli/main-fvnpq46y.js +12 -0
  63. package/dist/cli/main-gbbty4d4.js +3 -0
  64. package/dist/cli/main-gth53dnt.js +25 -0
  65. package/dist/cli/main-hqbz10aw.js +9 -0
  66. package/dist/cli/main-hrrvcfan.js +38 -0
  67. package/dist/cli/main-hzwtsb2m.js +5 -0
  68. package/dist/cli/main-j7ttv0sd.js +34 -0
  69. package/dist/cli/main-jak598k9.js +5 -0
  70. package/dist/cli/main-kba6zeyd.js +6 -0
  71. package/dist/cli/main-kwwsz6rq.js +3 -0
  72. package/dist/cli/main-m8vm17zq.js +3 -0
  73. package/dist/cli/main-mg4f96e1.js +3 -0
  74. package/dist/cli/main-mg9b20ac.js +18 -0
  75. package/dist/cli/main-mgb9ccnx.js +3 -0
  76. package/dist/cli/main-mjt2p7aj.js +3 -0
  77. package/dist/cli/main-n6qrdbmy.js +3 -0
  78. package/dist/cli/main-na7wse0x.js +5 -0
  79. package/dist/cli/main-nqveez48.js +4 -0
  80. package/dist/cli/main-ntqef02r.js +10 -0
  81. package/dist/cli/main-nvc3yjay.js +136 -0
  82. package/dist/cli/main-p0cfn6nr.js +16 -0
  83. package/dist/cli/main-qj2djy17.js +19 -0
  84. package/dist/cli/main-qsevpgsv.js +3 -0
  85. package/dist/cli/main-qvarybsp.js +3 -0
  86. package/dist/cli/main-rebtt91r.js +5 -0
  87. package/dist/cli/main-rpg7h8mb.js +3 -0
  88. package/dist/cli/main-rsy72qmw.js +15 -0
  89. package/dist/cli/main-rvetps99.js +18 -0
  90. package/dist/cli/main-s4bb0jav.js +3 -0
  91. package/dist/cli/main-s9v8k74e.js +3 -0
  92. package/dist/cli/main-tjvwmscs.js +3 -0
  93. package/dist/cli/main-tkgarpjj.js +4 -0
  94. package/dist/cli/main-v8y60bb2.js +3 -0
  95. package/dist/cli/main-vhrrq337.js +3 -0
  96. package/dist/cli/main-vp2dfb7s.js +4 -0
  97. package/dist/cli/main-vqbr22sz.js +8 -0
  98. package/dist/cli/main-vxnwe5xx.js +18 -0
  99. package/dist/cli/main-wgph00xf.js +5 -0
  100. package/dist/cli/main-wk2csfnj.js +5 -0
  101. package/dist/cli/main-wm997zjx.js +3 -0
  102. package/dist/cli/main-wpkyraxh.js +3 -0
  103. package/dist/cli/main-wqt32p5x.js +4 -0
  104. package/dist/cli/main-x9ct6y1a.js +3 -0
  105. package/dist/cli/main-xfekqh9m.js +7 -0
  106. package/dist/cli/main-xt9zc3n6.js +7 -0
  107. package/dist/cli/main-xx2z3zh5.js +4 -0
  108. package/dist/cli/main-y5c82rxr.js +3 -0
  109. package/dist/cli/main-yrjt2sqt.js +14 -0
  110. package/dist/cli/main-ys6zj3yr.js +3 -0
  111. package/dist/cli/main-ywbxshqc.js +8 -0
  112. package/dist/cli/main-z13755t8.js +25 -0
  113. package/dist/cli/main-zc7pyrbj.js +4 -0
  114. package/dist/cli/main.js +279 -0
  115. package/dist/cli/market-cmd-bm5xvn9f.js +5 -0
  116. package/dist/cli/mcp-login-bthtfpt7.js +2 -0
  117. package/dist/cli/mcp-market-cmd-mbeshfyd.js +2 -0
  118. package/dist/cli/notify-54v5z9dz.js +2 -0
  119. package/dist/cli/oauth-g5gme95c.js +2 -0
  120. package/dist/cli/output-satndjap.js +16 -0
  121. package/dist/cli/profiles-sfhpbq3m.js +2 -0
  122. package/dist/cli/provider-config-hv3xtdt4.js +2 -0
  123. package/dist/cli/provider-kwzq6g84.js +2 -0
  124. package/dist/cli/registry-fh0hdnyn.js +2 -0
  125. package/dist/cli/registry-y1y8e94r.js +2 -0
  126. package/dist/cli/repl-t4z03mqq.js +11 -0
  127. package/dist/cli/resume-fqt4chg8.js +2 -0
  128. package/dist/cli/run-flags-rysbag9t.js +2 -0
  129. package/dist/cli/runtime-j19fjbsa.js +2 -0
  130. package/dist/cli/sandbox-config-g4qxd7y5.js +2 -0
  131. package/dist/cli/server-r0b6bksk.js +5 -0
  132. package/dist/cli/session-arg-txmn5g4x.js +2 -0
  133. package/dist/cli/session-ed250d9j.js +2 -0
  134. package/dist/cli/sessions-cmd-adw7svfn.js +7 -0
  135. package/dist/cli/settings-y9rzcqx8.js +2 -0
  136. package/dist/cli/setup-jmbr11j0.js +2 -0
  137. package/dist/cli/sextant-smoke-tcth0vea.js +5 -0
  138. package/dist/cli/skills-cmd-zbdy99v6.js +2 -0
  139. package/dist/cli/smoke-1bg937kx.js +8 -0
  140. package/dist/cli/start-chat-p01cdks3.js +12 -0
  141. package/dist/cli/stream-4wmyaypz.js +2 -0
  142. package/dist/cli/task-eg4s093s.js +2 -0
  143. package/dist/cli/tasks-12v9rr9k.js +2 -0
  144. package/dist/cli/thinking-a5ngvqyh.js +2 -0
  145. package/dist/cli/todo-1wxpcecx.js +2 -0
  146. package/dist/cli/tools-2ftsya7w.js +2 -0
  147. package/dist/cli/tools-x1tj4fxm.js +2 -0
  148. package/dist/cli/trust-cmd-hccxehzb.js +2 -0
  149. package/dist/cli/update-check-ygt3vd7m.js +2 -0
  150. package/dist/cli/update-cmd-v23qhr8c.js +2 -0
  151. package/dist/cli/voice-g1gtck92.js +2 -0
  152. package/dist/cli/webfetch-0nnrjgb5.js +2 -0
  153. package/dist/cli/websearch-f0vr2p7d.js +2 -0
  154. package/dist/cli/workspace-9rq1w4ta.js +2 -0
  155. package/dist/lib/index.js +62 -0
  156. package/dist/lib/models-index.json +1 -0
  157. package/dist/lib/plugins.js +6 -0
  158. package/dist/lib/providers.js +17 -0
  159. package/dist/lib/public-api.js +20 -0
  160. package/dist/rovecode.exe +4 -0
  161. package/package.json +83 -72
  162. package/bin/rovecode.ts +0 -21
  163. package/src/acp/server.ts +0 -374
  164. package/src/cli/auth-login.ts +0 -122
  165. package/src/cli/connect.ts +0 -244
  166. package/src/cli/context-cmd.ts +0 -199
  167. package/src/cli/dispatch.ts +0 -82
  168. package/src/cli/doctor.ts +0 -362
  169. package/src/cli/export.ts +0 -276
  170. package/src/cli/help.ts +0 -293
  171. package/src/cli/is-tui-invocation.ts +0 -8
  172. package/src/cli/main.ts +0 -583
  173. package/src/cli/market-cmd.ts +0 -658
  174. package/src/cli/mcp-login.ts +0 -141
  175. package/src/cli/mcp-market-cmd.ts +0 -302
  176. package/src/cli/output.ts +0 -382
  177. package/src/cli/repl.ts +0 -250
  178. package/src/cli/repomap-root.ts +0 -14
  179. package/src/cli/resume.ts +0 -57
  180. package/src/cli/run-flags.ts +0 -43
  181. package/src/cli/run-limits.ts +0 -78
  182. package/src/cli/runtime.ts +0 -931
  183. package/src/cli/session-arg.ts +0 -30
  184. package/src/cli/sessions-cmd.ts +0 -145
  185. package/src/cli/setup.ts +0 -153
  186. package/src/cli/skills-cmd.ts +0 -194
  187. package/src/cli/start-chat.ts +0 -65
  188. package/src/cli/trust-cmd.ts +0 -52
  189. package/src/coding/bash.ts +0 -148
  190. package/src/coding/checkpoints.ts +0 -327
  191. package/src/coding/diff.ts +0 -138
  192. package/src/coding/files.ts +0 -341
  193. package/src/coding/hashline.ts +0 -274
  194. package/src/coding/lsp-gate.ts +0 -254
  195. package/src/coding/lsp-servers.ts +0 -147
  196. package/src/coding/lsp.ts +0 -283
  197. package/src/coding/repomap-cache.ts +0 -99
  198. package/src/coding/repomap-files.ts +0 -192
  199. package/src/coding/repomap.ts +0 -481
  200. package/src/core/agents.ts +0 -255
  201. package/src/core/compaction.ts +0 -259
  202. package/src/core/config.ts +0 -289
  203. package/src/core/context-report.ts +0 -228
  204. package/src/core/context.ts +0 -60
  205. package/src/core/count-remote.ts +0 -107
  206. package/src/core/execpolicy-rules.ts +0 -196
  207. package/src/core/execpolicy.ts +0 -385
  208. package/src/core/executor.ts +0 -454
  209. package/src/core/guardrails.ts +0 -400
  210. package/src/core/hooks.ts +0 -411
  211. package/src/core/images.ts +0 -230
  212. package/src/core/intro.ts +0 -266
  213. package/src/core/loop.ts +0 -567
  214. package/src/core/modes.ts +0 -372
  215. package/src/core/orchestrator.ts +0 -245
  216. package/src/core/proc-group.ts +0 -48
  217. package/src/core/project-trust.ts +0 -98
  218. package/src/core/reflection.ts +0 -165
  219. package/src/core/sandbox-config.ts +0 -186
  220. package/src/core/session-id.ts +0 -24
  221. package/src/core/session-images.ts +0 -73
  222. package/src/core/session-ops.ts +0 -183
  223. package/src/core/session-text.ts +0 -29
  224. package/src/core/session.ts +0 -469
  225. package/src/core/settings.ts +0 -170
  226. package/src/core/tasks.ts +0 -646
  227. package/src/core/token-scale.ts +0 -108
  228. package/src/core/tools.ts +0 -309
  229. package/src/core/trust.ts +0 -104
  230. package/src/core/types.ts +0 -330
  231. package/src/core/update-check.ts +0 -171
  232. package/src/core/usage.ts +0 -204
  233. package/src/core/validate.ts +0 -121
  234. package/src/core/verify-gate.ts +0 -159
  235. package/src/core/verify.ts +0 -236
  236. package/src/core/voice.ts +0 -158
  237. package/src/core/win-job.ts +0 -183
  238. package/src/core/workspace.ts +0 -184
  239. package/src/design/audit.ts +0 -797
  240. package/src/design/direction.ts +0 -190
  241. package/src/design/rules.ts +0 -157
  242. package/src/eval/bench.ts +0 -150
  243. package/src/eval/gauntlet-runner.ts +0 -215
  244. package/src/eval/gauntlet-support.ts +0 -84
  245. package/src/eval/gauntlet-wave3.ts +0 -269
  246. package/src/eval/gauntlet-wave4.ts +0 -217
  247. package/src/eval/gauntlet.ts +0 -253
  248. package/src/index.ts +0 -17
  249. package/src/lanes/agy.ts +0 -95
  250. package/src/lanes/approval.ts +0 -24
  251. package/src/lanes/claude.ts +0 -129
  252. package/src/lanes/codex.ts +0 -127
  253. package/src/lanes/events.ts +0 -130
  254. package/src/lanes/job.ts +0 -142
  255. package/src/lanes/opencode.ts +0 -122
  256. package/src/lanes/process.ts +0 -184
  257. package/src/lanes/progress.ts +0 -183
  258. package/src/lanes/registry.ts +0 -178
  259. package/src/lanes/runner.ts +0 -124
  260. package/src/lanes/types.ts +0 -112
  261. package/src/market/catalogs/mcp-docs.json +0 -111
  262. package/src/market/catalogs/plugins.json +0 -111
  263. package/src/market/catalogs/skills.json +0 -478
  264. package/src/market/clone.ts +0 -72
  265. package/src/market/context-cost.ts +0 -121
  266. package/src/market/digest.ts +0 -106
  267. package/src/market/index.ts +0 -22
  268. package/src/market/install.ts +0 -578
  269. package/src/market/manifest.ts +0 -187
  270. package/src/market/prereq.ts +0 -145
  271. package/src/market/registry.ts +0 -363
  272. package/src/market/resolve.ts +0 -111
  273. package/src/market/types.ts +0 -236
  274. package/src/market/validate.ts +0 -227
  275. package/src/mcp/client.ts +0 -449
  276. package/src/mcp/config.ts +0 -252
  277. package/src/mcp/local-package.ts +0 -211
  278. package/src/mcp/market-catalog.ts +0 -84
  279. package/src/mcp/market-install.ts +0 -289
  280. package/src/mcp/market.ts +0 -362
  281. package/src/mcp/oauth.ts +0 -251
  282. package/src/mcp/prompts-resources.ts +0 -249
  283. package/src/mcp/shared.ts +0 -149
  284. package/src/mcp/status.ts +0 -67
  285. package/src/mcp/tools.ts +0 -275
  286. package/src/mcp/transport.ts +0 -122
  287. package/src/mcp/trust.ts +0 -25
  288. package/src/memory/blocks.ts +0 -278
  289. package/src/memory/recall.ts +0 -355
  290. package/src/memory/scope.ts +0 -182
  291. package/src/memory/store.ts +0 -105
  292. package/src/memory/tools.ts +0 -99
  293. package/src/plugins/cli.ts +0 -119
  294. package/src/plugins/discover.ts +0 -108
  295. package/src/plugins/index.ts +0 -50
  296. package/src/plugins/install.ts +0 -184
  297. package/src/plugins/load.ts +0 -124
  298. package/src/plugins/manifest.ts +0 -92
  299. package/src/plugins/state.ts +0 -83
  300. package/src/providers/auth.ts +0 -408
  301. package/src/providers/cache.ts +0 -223
  302. package/src/providers/catalog-local.ts +0 -160
  303. package/src/providers/catalog.ts +0 -421
  304. package/src/providers/middleware-context.ts +0 -86
  305. package/src/providers/middleware.ts +0 -373
  306. package/src/providers/model-list.ts +0 -23
  307. package/src/providers/oauth/common.ts +0 -105
  308. package/src/providers/oauth/device-code.ts +0 -107
  309. package/src/providers/oauth/github-copilot.ts +0 -146
  310. package/src/providers/oauth/loopback.ts +0 -158
  311. package/src/providers/oauth/openai.ts +0 -163
  312. package/src/providers/oauth/openrouter.ts +0 -89
  313. package/src/providers/oauth/pkce.ts +0 -45
  314. package/src/providers/oauth/registry.ts +0 -39
  315. package/src/providers/oauth/seam.ts +0 -89
  316. package/src/providers/profile-glm53.ts +0 -111
  317. package/src/providers/profile-sonnet5-persona.ts +0 -65
  318. package/src/providers/profile-sonnet5-voice.ts +0 -23
  319. package/src/providers/profiles.ts +0 -156
  320. package/src/providers/provider-config.ts +0 -311
  321. package/src/providers/registry.ts +0 -333
  322. package/src/providers/responses.ts +0 -209
  323. package/src/providers/retry.ts +0 -234
  324. package/src/providers/router.ts +0 -294
  325. package/src/providers/sse.ts +0 -26
  326. package/src/providers/stream-errors.ts +0 -117
  327. package/src/providers/stream.ts +0 -566
  328. package/src/providers/thinking.ts +0 -189
  329. package/src/providers/wire-messages.ts +0 -129
  330. package/src/providers/wire-responses.ts +0 -79
  331. package/src/providers/wire-select.ts +0 -53
  332. package/src/server/http.ts +0 -291
  333. package/src/server/openapi.ts +0 -246
  334. package/src/sextant/card-hits.ts +0 -102
  335. package/src/sextant/card-keys.ts +0 -55
  336. package/src/sextant/context-source.ts +0 -157
  337. package/src/sextant/crew-cards.ts +0 -350
  338. package/src/sextant/draw-agents.ts +0 -273
  339. package/src/sextant/draw-code.ts +0 -388
  340. package/src/sextant/draw-context.ts +0 -222
  341. package/src/sextant/draw-frame.ts +0 -164
  342. package/src/sextant/draw-market.ts +0 -573
  343. package/src/sextant/draw-messages.ts +0 -386
  344. package/src/sextant/draw-pet.ts +0 -230
  345. package/src/sextant/draw-plan.ts +0 -187
  346. package/src/sextant/draw-tabs.ts +0 -85
  347. package/src/sextant/draw-util.ts +0 -65
  348. package/src/sextant/draw-wizard.ts +0 -378
  349. package/src/sextant/engine.ts +0 -230
  350. package/src/sextant/frame-hits.ts +0 -25
  351. package/src/sextant/frame.ts +0 -101
  352. package/src/sextant/git-status.ts +0 -197
  353. package/src/sextant/grid.ts +0 -59
  354. package/src/sextant/input.ts +0 -119
  355. package/src/sextant/keys.ts +0 -521
  356. package/src/sextant/layout.ts +0 -86
  357. package/src/sextant/local-commands.ts +0 -169
  358. package/src/sextant/market-source.ts +0 -287
  359. package/src/sextant/mentions.ts +0 -200
  360. package/src/sextant/message-hits.ts +0 -26
  361. package/src/sextant/model.ts +0 -387
  362. package/src/sextant/overlays.ts +0 -456
  363. package/src/sextant/panel-hits.ts +0 -38
  364. package/src/sextant/pet.ts +0 -399
  365. package/src/sextant/screen.ts +0 -324
  366. package/src/sextant/scroll-hits.ts +0 -66
  367. package/src/sextant/scrollbar.ts +0 -82
  368. package/src/sextant/sextant-bridge.ts +0 -174
  369. package/src/sextant/sextant-cards.ts +0 -142
  370. package/src/sextant/sextant-diff-base.ts +0 -63
  371. package/src/sextant/sextant-files.ts +0 -154
  372. package/src/sextant/sextant-frame-loop.ts +0 -335
  373. package/src/sextant/sextant-renderer.ts +0 -574
  374. package/src/sextant/sextant-repo.ts +0 -140
  375. package/src/sextant/theme.ts +0 -66
  376. package/src/sextant/tool-rows.ts +0 -189
  377. package/src/sextant/types.ts +0 -493
  378. package/src/skills/index.ts +0 -387
  379. package/src/skills/pack.ts +0 -220
  380. package/src/skills/spec.ts +0 -162
  381. package/src/skills/tools.ts +0 -69
  382. package/src/skills/versioned.ts +0 -227
  383. package/src/telemetry/otel-export.ts +0 -122
  384. package/src/telemetry/otel-lanes.ts +0 -89
  385. package/src/telemetry/otel-logs.ts +0 -131
  386. package/src/telemetry/otel-metrics.ts +0 -136
  387. package/src/telemetry/otel.ts +0 -397
  388. package/src/telemetry/otlp.ts +0 -76
  389. package/src/tools/ask-user.ts +0 -156
  390. package/src/tools/bash-bg.ts +0 -94
  391. package/src/tools/bash-jobs.ts +0 -237
  392. package/src/tools/design.ts +0 -151
  393. package/src/tools/evalcell.ts +0 -338
  394. package/src/tools/html-text.ts +0 -139
  395. package/src/tools/provider.ts +0 -149
  396. package/src/tools/task.ts +0 -250
  397. package/src/tools/todo.ts +0 -320
  398. package/src/tools/webfetch.ts +0 -332
  399. package/src/tools/websearch.ts +0 -359
  400. package/src/tui/agents-cmd.ts +0 -41
  401. package/src/tui/app.ts +0 -749
  402. package/src/tui/attach.ts +0 -127
  403. package/src/tui/boot-notes.ts +0 -41
  404. package/src/tui/builtin-prompts.ts +0 -59
  405. package/src/tui/checkpoints-cmd.ts +0 -70
  406. package/src/tui/clipboard-image.ts +0 -81
  407. package/src/tui/clipboard.ts +0 -78
  408. package/src/tui/commands.ts +0 -283
  409. package/src/tui/config-view.ts +0 -53
  410. package/src/tui/context-cmds.ts +0 -282
  411. package/src/tui/cost.ts +0 -108
  412. package/src/tui/crash-guard.ts +0 -173
  413. package/src/tui/focus-terminal.ts +0 -34
  414. package/src/tui/git-cmds.ts +0 -273
  415. package/src/tui/git-plain.ts +0 -58
  416. package/src/tui/info-cmd.ts +0 -150
  417. package/src/tui/input-plain.ts +0 -76
  418. package/src/tui/mcp-cmd.ts +0 -128
  419. package/src/tui/memory-note.ts +0 -77
  420. package/src/tui/modes-cmd.ts +0 -45
  421. package/src/tui/notify-seq.ts +0 -100
  422. package/src/tui/notify.ts +0 -318
  423. package/src/tui/overlays.ts +0 -97
  424. package/src/tui/pi-renderer.ts +0 -428
  425. package/src/tui/providers-cmd.ts +0 -377
  426. package/src/tui/reasoning-view.ts +0 -56
  427. package/src/tui/renderer.ts +0 -128
  428. package/src/tui/replay-marker.ts +0 -29
  429. package/src/tui/session-cmd.ts +0 -148
  430. package/src/tui/session-manage.ts +0 -95
  431. package/src/tui/sextant-attach.ts +0 -102
  432. package/src/tui/sextant-io.ts +0 -202
  433. package/src/tui/sextant-smoke.ts +0 -110
  434. package/src/tui/shell-cmd.ts +0 -158
  435. package/src/tui/smoke.ts +0 -72
  436. package/src/tui/staged-terminal.ts +0 -50
  437. package/src/tui/startup.ts +0 -12
  438. package/src/tui/theme.ts +0 -59
  439. package/src/tui/todo-label.ts +0 -7
  440. package/src/tui/trust-card.ts +0 -107
  441. package/src/tui/tui-commands.ts +0 -87
  442. package/tsconfig.json +0 -30
  443. package/vendor/pi-tui/LICENSE +0 -21
  444. package/vendor/pi-tui/PATCHES.md +0 -12
  445. package/vendor/pi-tui/PROVENANCE.md +0 -12
  446. package/vendor/pi-tui/README.upstream.md +0 -854
  447. package/vendor/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
  448. package/vendor/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
  449. package/vendor/pi-tui/src/alt-screen-search.ts +0 -158
  450. package/vendor/pi-tui/src/autocomplete.ts +0 -827
  451. package/vendor/pi-tui/src/components/alt-screen-flash.ts +0 -52
  452. package/vendor/pi-tui/src/components/box.ts +0 -138
  453. package/vendor/pi-tui/src/components/cancellable-loader.ts +0 -41
  454. package/vendor/pi-tui/src/components/editor.ts +0 -2364
  455. package/vendor/pi-tui/src/components/h-stack.ts +0 -45
  456. package/vendor/pi-tui/src/components/image.ts +0 -128
  457. package/vendor/pi-tui/src/components/input.ts +0 -448
  458. package/vendor/pi-tui/src/components/loader.ts +0 -93
  459. package/vendor/pi-tui/src/components/markdown.ts +0 -1016
  460. package/vendor/pi-tui/src/components/scroll-view.ts +0 -217
  461. package/vendor/pi-tui/src/components/select-list.ts +0 -230
  462. package/vendor/pi-tui/src/components/settings-list.ts +0 -277
  463. package/vendor/pi-tui/src/components/spacer.ts +0 -29
  464. package/vendor/pi-tui/src/components/stack.ts +0 -155
  465. package/vendor/pi-tui/src/components/text.ts +0 -108
  466. package/vendor/pi-tui/src/components/truncated-text.ts +0 -66
  467. package/vendor/pi-tui/src/components/v-stack.ts +0 -34
  468. package/vendor/pi-tui/src/editor-component.ts +0 -75
  469. package/vendor/pi-tui/src/fuzzy.ts +0 -138
  470. package/vendor/pi-tui/src/index.ts +0 -149
  471. package/vendor/pi-tui/src/keybindings.ts +0 -321
  472. package/vendor/pi-tui/src/keys.ts +0 -1402
  473. package/vendor/pi-tui/src/kill-ring.ts +0 -47
  474. package/vendor/pi-tui/src/latex.ts +0 -1381
  475. package/vendor/pi-tui/src/layout-node.ts +0 -52
  476. package/vendor/pi-tui/src/layout.ts +0 -411
  477. package/vendor/pi-tui/src/native-modifiers.ts +0 -60
  478. package/vendor/pi-tui/src/native-module-path.ts +0 -32
  479. package/vendor/pi-tui/src/stdin-buffer.ts +0 -445
  480. package/vendor/pi-tui/src/terminal-colors.ts +0 -74
  481. package/vendor/pi-tui/src/terminal-image.ts +0 -701
  482. package/vendor/pi-tui/src/terminal.ts +0 -554
  483. package/vendor/pi-tui/src/tui-alt-screen.ts +0 -1379
  484. package/vendor/pi-tui/src/tui-main-screen.ts +0 -655
  485. package/vendor/pi-tui/src/tui.ts +0 -1264
  486. package/vendor/pi-tui/src/undo-stack.ts +0 -29
  487. package/vendor/pi-tui/src/utils.ts +0 -1327
  488. package/vendor/pi-tui/src/word-navigation.ts +0 -118
  489. package/vendor/pi-tui/test/test-themes.ts +0 -39
  490. package/vendor/pi-tui/test/virtual-terminal.ts +0 -219
  491. /package/{src/providers → dist/cli}/models-index.json +0 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,512 @@
1
+ # Changelog
2
+
3
+ What changed for the person using rovecode, newest first. Every line ends with the commit that carries
4
+ the change (hashes on `main`). Numbers are measurements from the commit that reports them, on the
5
+ machine it names.
6
+
7
+ Hashes on entries before 0.3.2 name commits in the checkout rovecode shared with its website until
8
+ 2026-09-06. That repository is gone; the entries are kept because what they describe still ships.
9
+
10
+ ## Unreleased
11
+
12
+ ### Open-core boundary and supported APIs
13
+
14
+ - Added explicit package exports for the core, extension, plugin, and provider APIs, with contract tests and a documented 0.x compatibility policy.
15
+ - Added a CI-enforced one-way dependency boundary: public source cannot import private, hosted, commercial, or control-plane overlays.
16
+ - Added a separate product-auth boundary that excludes account, billing, entitlement, website/dashboard, and control-plane contracts while retaining generic local provider and MCP authentication.
17
+ - Added local documentation-link validation and a manual signed release checklist.
18
+ - Replaced the licensed Gitleaks Action with a checksum-pinned open-source CLI invocation and pinned all CI actions to immutable commits.
19
+
20
+ ### Connect wizard: endpoint doors and the active model list
21
+
22
+ - A "your own URL" row in the wizard's provider list no longer fails with `unknown provider` when
23
+ the key step arrives: it walks its own ENDPOINT step first (a short name and the base URL, both
24
+ validated before the registry is touched), registers the row, and only then asks for the key.
25
+ - The model step pins the ACTIVE model list: rows are checked with space, `a` toggles all, Enter
26
+ confirms — the checked rows become the provider's `models` entry in providers.json (served from
27
+ the file afterwards, never re-fetched), an empty selection leaves the endpoint live ("use them
28
+ all"), and one of the checked rows becomes the default and the session's model. When the endpoint
29
+ cannot be listed, typing the id by hand still works exactly as before.
30
+
31
+ ### Readiness-driven intro
32
+
33
+ - The animated intro remains on screen while the textbox and complete TUI are drawn offscreen.
34
+ Reveal waits for both the intro choreography and real readiness (including the initial file list),
35
+ then replaces the intro with the complete frame in a synchronized-output transaction. No visible
36
+ empty frame/files-only stage or second panel stagger. Slow starts retain the loading screen;
37
+ resize, startup cancellation and errors restore the terminal cleanly.
38
+ - Only the selected renderer is loaded. Sextant no longer loads the classic editor/markdown graph,
39
+ classic no longer loads Sextant, and `--plain` loads neither renderer nor the TUI app.
40
+ - Automatic interactive repo-map indexing skips the home directory and filesystem root, avoiding
41
+ unrelated SDK/cache trees. Actual project directories and explicit headless builds are unchanged.
42
+ - Fast preparation no longer makes the intro flash and disappear: the existing approximately 1.1s
43
+ choreography runs alongside loading, not after it. See [startup behavior and validation](docs/startup.md)
44
+ for the first-frame contract and opt-outs.
45
+
46
+ ### Branch integration and startup responsiveness
47
+
48
+ - Integrated the remaining TUI ports: plain `!cmd` / `@path` input, image staging, the bare `/model`
49
+ picker with context/pricing/reasoning metadata, and shared boot-note / command declarations
50
+ (`99becc4`). The command table retains `/commit`, `/undo`, `/compact`, `/clear`, `/init`, `/copy`,
51
+ `/agents` and `/config` from `aion-port`; plain `/init` expands before attachment processing.
52
+ - Repository-map warmup no longer monopolizes the event loop after the first frame (`510437f`,
53
+ extended during integration). Enumeration is async, extraction is sliced, and graph ranking and
54
+ budget search yield. Quitting cancels and drains the scan before resolving the TUI, preventing
55
+ late cache writes and Windows cwd locks. A background failure omits the map rather than retrying
56
+ synchronously on the next interactive prompt; headless runs retain their synchronous path.
57
+ - Plain git commands, compaction, shell commands and model turns share busy/interrupt/quit handling.
58
+ EOF during a pending commit draft cancels it without committing or consuming another model turn.
59
+ - The Nimbus submission history is reconciled without replacing Rovecode's product tree. See
60
+ The integration retained Rovecode’s product tree rather than importing an unrelated snapshot wholesale.
61
+
62
+ ### Added
63
+
64
+ - The sextant's crew section is a card per workflow, not a row per task: a title, `3 agents · 01s`, and one chip
65
+ per agent showing which CLI opened it (`codex claude codex`). A workflow is the RUN the tasks were started
66
+ under — nothing invented, no time buckets or label matching: the manager stamps the run it bound, and tasks
67
+ with no run are their own cards. Two rules the chips keep: a queued lane is hollow and dim while a running one
68
+ is filled, so "codex is about to start" cannot look like "codex is working"; and only an external CLI lane
69
+ shows a CLI's name — our own subagents show their agent name. Working workflows lead the section, since the
70
+ header above it already said how many are working. At the panel's 32 cells the spacing goes first, then names
71
+ collapse to counts (`codex ×2`) and a `+N`, then the title truncates, then whole cards go behind `+N more`;
72
+ the agent count and the clock are never dropped, and a card that cannot show them is not drawn at all
73
+ - The card's fourth line is what the workflow has actually done — `wrote 4 files · 12 calls · 4.2k` — and it says
74
+ `wrote` only about a patch that reached your tree. A cancelled or failed agent's files are reported as
75
+ `discarded` (its worktree was thrown away), a live one's as `so far`, and a CLI that has confirmed nothing yet
76
+ gets no file count at all rather than a `0` that would be false while it writes. Tokens are omitted when the CLI
77
+ reported none, because a lane whose usage we could not read is not a lane that used nothing
78
+
79
+ - `/commit`, `/undo`, `/compact`, `/clear`, `/init`, `/copy`, `/agents list` and `/config` — the
80
+ command surface the TUI was missing, ported in three parallel slices. `/commit` shows the
81
+ model-drafted message ON THE APPROVAL CARD before git runs (the card is the only place it is
82
+ visible before it is recorded); the first adaptation skipped the card and the commit went through
83
+ unseen — found by the port's own tests, fixed before landing. `/undo` restores the previous
84
+ checkpoint through two new read-only methods on the checkpoints table (a scratch index under the
85
+ shadow git-dir; your real index is never touched), and `/undo` stopped being an alias note in the
86
+ sextant — it is a real command now. `/copy` reaches the clipboard through PowerShell with explicit
87
+ UTF-8 on Windows (clip.exe deliberately absent: code-page-dependent stdin). `/agents list` shows the
88
+ loaded definitions while the BARE `/agents` stays the crew board
89
+ - An `@image` mention in the sextant rides the `/attach` seam instead of dying as "a binary file",
90
+ and a reasoning block shows as one collapsed `reasoning · N tokens` row per assistant message.
91
+ The harness's input-expand was deliberately NOT ported — rovecode's mentions.ts already is the
92
+ feature, in a stricter format; porting over it would have put two wire formats in one binary.
93
+ Reasoning text is never rendered because the loop drops it on purpose; the row counts what
94
+ survives, the token estimate
95
+
96
+ ### Changed
97
+
98
+ - `rovecode run "/init"` expands the BUILT-IN prompt instead of sending the literal string to the
99
+ model: expandSlashPrompt consults the builtin table before custom command files, so a repo file
100
+ named init.md cannot swallow it
101
+ - `/compact` is durable but cannot summarize on this build: the mechanism is complete (fresh-id
102
+ branch, marker persisted, attachments parked and restored, Esc/Ctrl-C bound) but no surface wires
103
+ a summarizer yet, so a real /compact keeps the window and SAYS so rather than pretending. The
104
+ compaction marker omits `trigger` rather than writing a word the vocabulary has no honest value
105
+ for. The seam exists; the day the core wiring lands, the already-written "with a summarizer" test
106
+ turns green by itself
107
+ - The intro ends when the session is READY, not when its clock runs out. It was given a fixed ~1.1 s so it
108
+ would not collapse into a single frame on a fast machine; measured on this one the session is ready at
109
+ ~224 ms, so the other ~875 ms was an animation with nothing left to cover — and it was most of what
110
+ "the UI opens late" meant. It still plays, and it still ends on the finished mark rather than cutting
111
+ mid-sweep; it just stops waiting. `ROVECODE_TRACE_BOOT=1` now covers the stretch before the TUI starts,
112
+ where that time was hiding: the previous trace began after it
113
+ - External CLI lanes are on by default. `ROVECODE_LANES_ALLOW` used to be an opt-in allow-list, so
114
+ `task start codex` was refused on every machine until you found an env knob nobody reads — a CLI you had
115
+ installed was unreachable. Unset now allows all four (`claude`, `codex`, `opencode`, `agy`); a value you
116
+ set is still an exact list, so a narrower one is never widened behind your back, and `ROVECODE_LANES_ALLOW=`
117
+ (empty) turns every lane off. Two things come with the new default. A lane whose CLI is not on PATH is
118
+ refused BY NAME at the gate — before a worktree is built and a turn is spent, where it used to surface as
119
+ `spawn failed: codex: ENOENT` afterwards; the check reads PATH only (plus PATHEXT on Windows) and is
120
+ memoised, so `task start` in a loop does not re-stat the disk. And because the gate was also the only
121
+ reason a lane paused for approval, every lane start now states its own flags — `spawn codex lane · sandbox
122
+ workspace-write · approval never · worktree — started` — at every permission level, including `auto`, where
123
+ no approval card is ever shown. That sentence is built from the same function as the card, so it cannot
124
+ describe flags the lane did not get
125
+
126
+ ### Fixed
127
+
128
+ - A rovecode launched from a pipe, a script or a wrapper that then closed its stdin hung FOREVER.
129
+ Both surfaces listened for input and never for the pipe ending: the sextant's ProcessIO watched
130
+ `data` only, and the classic surface's vendored terminal does the same, so the process sat in its
131
+ event loop with nothing to wait for — measured 60 s+, killed only by an outer timeout. stdin END is
132
+ now an exit on both surfaces: the sextant delivers ETX through the input subscriber (exactly what a
133
+ real Ctrl+C delivers, so a running turn aborts and an idle surface quits through its normal close
134
+ path), and the composition root exits the process when the classic side's input is gone. A TTY
135
+ never ends, so a real terminal is unaffected
136
+
137
+ - A crash left your TERMINAL broken and told you nothing. The TUI puts the terminal on the alt screen with
138
+ raw input, mouse reporting and focus reporting; quitting undid all of it and dying undid none of it. So an
139
+ uncaught error handed the shell back inside the alt screen, still covered by the last painted frame, and
140
+ every mouse movement afterwards typed escape sequences at the prompt — `[<222;39;51M[<222;38;51M` walking
141
+ across the screen as the pointer moved. The reason it died went with the screen it printed on. rovecode now
142
+ restores the terminal on any death, BEFORE anything that could itself fail, then writes what happened to
143
+ `~/.rovecode/logs/crash-<date>-<time>.log` — name, message, stack, version, platform, cwd — and prints one
144
+ stderr line naming the file. The log exists because restoring the alt screen erases the trace that would
145
+ otherwise have been the only copy. A clean quit writes nothing: it is not a crash
146
+ - An isolated subagent could write to your live repository through an external CLI. A lane always built
147
+ its worktree from the top-level root and merged its patch back there, whoever started it — so a subagent
148
+ confined to its own worktree could start `codex`, and the CLI's diff landed straight in the real tree.
149
+ The subagent could not write there; the lane it started could, and the subagent's own patch — the only
150
+ record you read — said nothing about it. A lane now works in, and merges back into, the tree of whatever
151
+ started it, so a nested lane's result travels up the same chain of patches as everything else. A lane
152
+ started at the top level is unchanged: there the root IS the working tree
153
+ - Killing a command left its grandchildren running on POSIX. The signal reached the direct child only,
154
+ so anything it had forked — `npm` inside a compound command, anything behind `&` — was orphaned, ran
155
+ to completion and held stdout open while it did, which hung the runner rather than merely leaking a
156
+ process. Abort now signals the whole process GROUP, then escalates to SIGKILL on the group if the
157
+ grace expires. Windows was already covered by its Job Object; a run with no signal is spawned exactly
158
+ as before on both platforms (3a6d3b1)
159
+ - A mistyped `--resume <id>` started a NEW empty session under the typed name and said nothing. It now
160
+ exits 2 before the TUI boots, naming the reason and where to look; `--continue` with nothing to
161
+ continue still starts fresh but SAYS so on the startup card. `--resume ../x` used to write its first
162
+ entry outside the sessions root — one validator now gates both it and `trace` (5ceb21e)
163
+ - Listing sessions read the whole transcript of every session directory — on this machine 36 of them,
164
+ 35 with nothing in them — and `--continue` paid that scan to find one id. It is now a readdir plus one
165
+ stat per directory, and a directory nothing was ever written to is never opened (5ceb21e)
166
+ - The memory a session wrote died with the session id, and the USER block — preferences meant to follow
167
+ the person across projects — was written INSIDE the repository. MEMORY is now project-scoped and USER
168
+ lives under the user home; a legacy per-session store is copied forward once, originals untouched
169
+ (240c296)
170
+ - An agent file's problem reached you as `plugins: agents: explore.md: skipped`. Four subsystems were
171
+ reporting under a fifth's name; each note now carries its own word (bc31587)
172
+ - Every untrusted-file note told you to run a terminal command — read inside the TUI, an instruction to
173
+ quit in order to approve something. Both spellings are now on the line (30638b3)
174
+
175
+ - A subagent's request to the model carried no tool schemas. Every surface that starts a run passes the
176
+ tool list; the one path that starts a child never did, so a task child on a model that calls tools
177
+ natively was handed a request with no tools and could call nothing, whatever its registry held. The
178
+ scripted models in the tests ignore the tool list, which is how it stayed invisible. A child now sends
179
+ exactly its own registry's schemas, and a loopback provider test counts them per request
180
+
181
+ - `ROVECODE_MOCK=1` now always means the canned provider. It used to be ignored whenever a provider was
182
+ configured — with a key exported, `ROVECODE_MOCK=1 rovecode run "say hi"` reached the real model and cost
183
+ $0.09 for one turn, while the flag's own comment promised a mock. The suite never saw it because the test
184
+ harness scrubs keys before the CLI starts; the new test counts the requests that must not happen
185
+
186
+ ### Added
187
+
188
+ - **External agentic-CLI lanes.** `task start {agent: "codex"}` runs codex — or claude, opencode,
189
+ antigravity — as a job of the manager that already runs our own subagents: its own git worktree, its
190
+ diff merged back as a patch, the same completion note. A nested CLI was always possible through
191
+ `bash`; what it could not do was tell anyone. The approval card now names the CLI, the flags it will
192
+ run with and the directory, BEFORE the process exists, and a lane's permissions are quoted from the
193
+ CLI's own flags rather than paraphrased in ours. OFF unless `ROVECODE_LANES_ALLOW` lists the id, and
194
+ the refusal names the variable (8c0fb24)
195
+ - **`rovecode trust`.** A cloned repository could make this machine run code through five files and was
196
+ asked about one. The worst was `.rovecode/hooks.ts` — imported IN-PROCESS at boot, with your
197
+ privileges, before the first prompt is read. Also gated now: `sandbox.json` (which rung and which
198
+ docker image every bash command runs in), and the `verify`, `lsp` and `notify_command` settings keys.
199
+ One store, keyed by sha256, so an edited byte asks again; `rovecode trust show` says what each file
200
+ WOULD do; `/trust` answers it in the TUI. Enforced inside loadSettings, so no consumer can forget.
201
+ `.rovecode/commands/*.md` and `agents/*.md` stay out on purpose: prompt text, a different gate
202
+ (08f355a, 240c296)
203
+ - **Background shell jobs.** `bash … run_in_background: true` returns a job id at once —
204
+ `bash_output` reads only what is NEW since your last read, `bash_list` shows them, `bash_kill` stops
205
+ one and everything it started. `timeout_ms` gives up on a deadline and RETURNS what the command
206
+ printed, because a build that timed out has usually already printed the reason. Jobs die with their
207
+ session (6048215)
208
+ - **Sign in instead of pasting a key**: `rovecode auth login github-copilot` (device code) and
209
+ `openrouter` (PKCE, loopback). Tokens sit beside the API keys, 0600, refreshed in the streaming path.
210
+ `anthropic` is refused — a subscription login is an owner's decision, not a port (9b7a0ac)
211
+ - **The OpenAI Responses wire**, which is what a stored ChatGPT token can actually be sent over; the
212
+ `openai` login refusal was lifted in the same change that made it work. Reasoning items are not
213
+ replayed to the model yet, and `rovecode help env` says so under `ROVECODE_OPENAI_WIRE` (0aa46a0)
214
+ - **MCP prompts and resources**, not just tools: `mcp_prompts`, `mcp_prompt`, `mcp_resources`,
215
+ `mcp_read`. A server behind OAuth can be signed into with `rovecode mcp login` — through the trust
216
+ gate, which the upstream version went around (4a02798)
217
+ - **`--add-dir <dir>`**, and the workspace boundary it needed. Reading a file outside the project used
218
+ to be silently allowed; a path outside every root is now a card that names the path, the roots that
219
+ exist and the way out, remembered per directory. Measured before shipping: zero new prompts under
220
+ `permission=auto`, zero inside the project under accept-edits. Checkpoints do NOT span added roots
221
+ and `/restore` will not undo a change under one — stated at boot, in `rovecode doctor`, in the module
222
+ and here, rather than shipped as a version that looks whole (3416586)
223
+ - **Custom subagents**: `.rovecode/agents/<name>.md` — description, model, plan-or-act mode and a tool
224
+ allow-list that is a FILTER, not a label. A definition can never widen a child, and a reserved lane
225
+ id is refused with a reason rather than either side silently winning (ad97ffa)
226
+ - **`rovecode sessions`** list · rename · delete · fork · search, and the same four verbs as `/sessions`
227
+ in the TUI. Delete removes the session AND its checkpoints shadow repo; fork is bounded at 256 MB,
228
+ measured before anything is copied (5ceb21e, 240c296)
229
+ - **`rovecode skills`** list · validate · pack · install. A `SKILL.md` the loader disagreed with used to
230
+ load under the wrong name or vanish without a word; it now loads with a warning, and `skills list` is
231
+ where those warnings live. A URL install goes through the same SSRF guard as `web_fetch`, re-checked
232
+ on every redirect hop (33ce2c1)
233
+ - **`web_search`** beside `web_fetch`, same network class, same SSRF guard, and a keyless default that
234
+ does not pretend to be a credentialed one (824cddf)
235
+ - **A language-server TABLE** behind the per-edit diagnostics gate (`ROVECODE_LSP` or the `lsp` setting),
236
+ so it is no longer TypeScript-only. A configured server that is not on PATH is named ONCE, at boot and
237
+ in `rovecode doctor`, with the extensions it would have covered (47e5cca)
238
+ - **Metrics and logs on the OTel exporter**, not just traces: token counters, cost, tool durations,
239
+ retry notes, the approval ledger and a span per external lane. A lane that reported no usage emits
240
+ nothing rather than zeros (3a5f82e)
241
+ - **Notifications that fire only when you are not looking.** The bell used to ring on every run
242
+ regardless of focus, which is the same as not ringing. `notify_when: always` restores the old
243
+ behaviour; on Ghostty, iTerm2, kitty, Warp and WezTerm `auto` sends a desktop toast instead. A
244
+ `notify_command` is argv with no shell, the run's text lands as one JSON argument, and it goes through
245
+ the same policy a bash command does (34c43e5)
246
+ - **`!cmd` in the composer** — promised by the input classifier since before this repository existed and
247
+ consumed by nothing. It goes through the app's own approver, so a `!cmd` and a model turn share ONE
248
+ approval path (240c296)
249
+ - `@`-mentions reach `~/` and absolute paths (240c296)
250
+
251
+ - `/trust` in the TUI: the project trust gate can be answered where you are. A checkout's `.rovecode/hooks.ts`,
252
+ `sandbox.json`, MCP files and the `verify` / `lsp` / `notify_command` settings keys do nothing until this
253
+ machine approves that exact content, and until now the only yes was to quit the session and run `rovecode
254
+ trust` — the shape of friction that gets a gate switched off. `/trust` prints the same lines `rovecode trust
255
+ show` prints (what each file would run, with its values), then asks per file. The highlighted item is "keep
256
+ them untrusted", so Enter on an untouched card refuses; "approve all N" appears only after that listing and
257
+ only when there is more than one file. Approving records the file's current bytes, so a later edit asks again
258
+ - `/sessions rename <title…> | delete <id> | fork [<id>] | search <terms…>` in the TUI — the four verbs
259
+ `rovecode sessions` already had, over the one resolver, without leaving the session. Delete resolves the id
260
+ first, asks on one card naming the session, and removes the session directory AND its checkpoints shadow
261
+ repo (a half-delete leaves the space used with nothing pointing at it); deleting the session you are IN moves
262
+ you to a fresh one before the old directory goes. A renamed session now shows its title where you resume it,
263
+ as `rovecode sessions list` already did
264
+
265
+ - Custom subagents: a markdown file in `.rovecode/agents/<name>.md` (or `~/.rovecode/agents/`) is an agent the
266
+ `task` tool can start by name, with its own prompt (the body), model, plan or act mode and a tool
267
+ allow-list that is a filter over the child's tools — `tools: [read, grep]` yields exactly read and grep,
268
+ and a definition can never hand a child more than the agent that started it has. Files that cannot be
269
+ honoured are refused when the session starts, each with a line naming the file: a reserved name (`main`
270
+ and the four external-lane ids keep their meaning), a mode other than plan or act, a model on a provider
271
+ other than the one this session streams over, a YAML list or an empty `tools:` (which never means "all")
272
+ - `--add-dir <dir>` (repeatable, every surface) makes a second directory part of the workspace, and with it
273
+ the workspace gained an edge it never had: a file tool aimed at a path outside the project and outside every
274
+ added root now asks first, on one card that names the path, the project, the roots that exist and the remedy
275
+ — before this an absolute path anywhere on the disk was read without a word. Inside the project and inside a
276
+ root nothing changed; a session in auto mode or accept-edits sees no new question
277
+ - The limit that comes with roots, named rather than discovered later: checkpoints snapshot the project
278
+ directory only, so a change under an added root is not undone by /restore. rovecode says so at start, in
279
+ `rovecode doctor --add-dir <dir>`, and here
280
+
281
+ ## 0.3.2 — 2026-09-06
282
+
283
+ ### Fixed
284
+
285
+ - `--max-cost 0.15` sent its own number to the model as part of the prompt: the flag was not in the
286
+ parser's value list, so the budget was consumed as a flag and `0.15` was consumed as the request. A
287
+ run asked to build a page came back with `0.15` used as a CSS opacity. The test now walks the whole
288
+ flag table instead of the three entries someone remembered
289
+
290
+ ### Added
291
+
292
+ - A run that changed files can check its own work before it says done: rovecode works out what checking
293
+ this project costs (a `verify` list in settings, or inferred from package.json / Makefile / pyproject),
294
+ runs it once at the end, and on failure gives the model one turn with the failing part quoted. Off by
295
+ default — `ROVECODE_VERIFY=1` turns it on, and `rovecode doctor` says which commands it would run
296
+ - `rovecode doctor` gained a verify row: what would run, where it came from, and — when nothing is
297
+ configured — that this is the blind spot, named rather than silently skipped
298
+
299
+ ### Changed
300
+
301
+ - The website moved out. rovecode is its own repository with its own history; site/ was 250 MB of the
302
+ old pack and none of it was ever read by a build here. Content still lives here and is published to
303
+ the site with `bun run publish:site`
304
+
305
+ ## 0.3.1 — 2026-09-06
306
+
307
+ Berkay: "kod yazarken pek üstünde durmuyor, çoğu durumda az değişiklikler yapıp bırakıyor" — when it writes
308
+ code rovecode does not stay on the task. Three sessions measured it and the cause was ours, in two halves.
309
+
310
+ ### Finishing what was asked
311
+
312
+ - A run ended as `done` whenever a turn contained no tool call — the model's silence, taken for finished
313
+ work by every layer. Proven end to end: a rejected `write`, the plan item marked completed anyway,
314
+ "Done — I created src/a.ts", exit 0, three of four items still open, the file never written. `run_end`
315
+ now carries what the transcript says was left (a failure with no later success at the same path, an
316
+ unanswered question, open plan items) and both TUIs and the headless summary say it in one clause —
317
+ `done · 1 failed tool call not recovered (write)`. A run with nothing outstanding is byte-identical to
318
+ before (b0dae27)
319
+ - And once per run, on a failure or an unanswered question, the model gets one turn naming exactly what is
320
+ open, which it may answer by finishing OR by saying why it is not needed. Never on a permission denial,
321
+ the loop guard or an abort — those are the harness's verdict or the user's. The next silence is
322
+ accepted whatever it says: a loop that will not stop is worse than one that stops early.
323
+ `ROVECODE_FINISH_CHECK=0` turns the nudge off (b0dae27)
324
+ - Nothing we send the model said to finish the task before answering, and ten sentences said do less. The
325
+ worst told it that turns are scarce without ever saying there are sixty; it is gone. The worked recap
326
+ example ended with "README untouched; say so if you want the flag documented" — we were teaching that
327
+ the right ending is a small change plus a menu. A `# Finishing` section now says what the harnesses that
328
+ get this right say: done means everything named and plainly implied is built and verified, a reply
329
+ without a tool call ends the run, and a blocked part is named while every other part is finished
330
+ (6714953)
331
+ - The design gate asked for directions before every visual change, and on this machine 6 of 24 task runs
332
+ ended at that question. Berkay's decision: propose directions for something NEW; make the change to
333
+ something that already exists. The rule is now a test anyone can apply — if the person could point at
334
+ the thing on the screen, it exists and you change it (6714953)
335
+
336
+ ## 0.3.0 — 2026-09-06
337
+
338
+ `rovecode doctor` is new: one command that runs every check in here and says what it did NOT check.
339
+ Startup, the first edit of a session and an idle session all got much cheaper, several surfaces stopped
340
+ promising things they did not do, and MCP servers can be installed once instead of resolved at every
341
+ start. Numbers are measurements from the commit that reports them, on the machine it names.
342
+
343
+ ### Startup
344
+
345
+ - The TUI opens on a card that names the version, the connected model, what loaded (skills · plugins · MCP servers, zeroes omitted), the folder and permission tier — and `update available: x → y · <url>` when GitHub Releases on 9Code-Labs/rovecode has a newer one. The check needs `GITHUB_TOKEN`, `GH_TOKEN` or `gh auth login` (the repository is private), asks at most every six hours, never blocks, and prints nothing unless a release is genuinely newer (8c6f6f9)
346
+ - An opening intro, centred on a cleared screen: the ROVECODE mark fills in left to right, a hairline frame draws inward from the four corners, the cloud mascot leans down out of that top line, and the mark breathes once. ~1.1 s; the session boots underneath it, so the only wall time it adds is whatever is left of the show once the session is ready. `--no-intro` or `ROVECODE_INTRO=0` skips it; nothing is drawn into a pipe or under `--plain`, and it never reads stdin, so keys typed during it reach the session (09e4a1c, 420353d, 9d6fe71)
347
+ - The intro no longer draws outside a terminal it does not fit in: at 34×24 the frame wrapped six columns past the edge and the mark broke up, at 40×10 it painted thirteen lines into ten and scrolled its own top away. A terminal too small for the whole block gets no intro and the card's prose form instead (25ca9af)
348
+ - Every session loaded a 136 MB token table before its first frame — to count an empty string and return 0. Fresh session to first frame: RSS 238–246 MB → 111–112 MB, boot 450–550 ms → 154–183 ms; a resumed session with a 435k-character transcript no longer pays it either. `/cost`, `/context` and `export` are unchanged and still exact (574dae0)
349
+ - The pre-bundled CLI was undoing its own lazy imports: `bun build` inlines dynamic imports, so `dist/cli/main.js --version` paid for pi-tui, the gauntlet, acp and the tokenizer. Built with `--splitting`: 388–491 ms → 84–103 ms wall, 98 MB → 74 MB. `build:cli` also clears `dist/cli` first (574dae0)
350
+ - An idle session repainted ~9.5 times a second to show nothing changing: 89–98 ms of CPU per wall-clock second → 14–20 ms at ~2.5 frames/s. A busy session is unchanged by design, and nothing looks different — things now paint only when they change (df155ca)
351
+ - `rovecode --version` prints the version to stdout alone (still one word for a script) and the update check’s answer to stderr: the newer release, `up to date (0.2.0) · cached`, or `not asked yet`. It reads the cache and never opens a socket — awaiting the network there made the one command scripts call to identify a build take 3.2 s on a fresh machine, against 117–159 ms now (2aef715, b2e1101)
352
+ - Two configured MCP servers cost 758 ms before the first frame because the MCP SDK was evaluated inside createRuntime; it now loads on the connect path, after the first frame, and servers start one per event-loop turn (createRuntime 758 ms → 22 ms with the same home) (f36e73b)
353
+
354
+ ### Speed
355
+
356
+ - The first edit of a session took 26–35 s in this repository and built a 232 MB checkpoint: the shadow-git snapshot taken before the first change hashed 165 MB of video and 82 MB of screenshots, because only cline's structural excludes had been ported. With its media, archive, binary and database/log patterns added (SVG stays — it is text and it is edited), the first snapshot is 2.8–3.2 s and 3.6 MB over 566 files, and every later change costs ~200 ms (14e9118)
357
+
358
+ ### Correctness
359
+
360
+ - A one-shot run with no provider configured reported success: `rovecode run "hi" --output json` printed `{"status":"done"}` with the “no model is connected” hint as its summary, and exited 0. It is a startup failure — exit 2, one document in a machine mode — and the canned provider is now asked for by name (`ROVECODE_MOCK=1`) rather than fallen into (d80c2f6)
361
+ - A configured MCP server that never connected was counted on the startup card and never mentioned; boot-time connect failures now say so by name, the same way the loader’s skipped entries do (f213b58)
362
+ - `rovecode mcp add` and `rovecode market install` share one plan and had drifted into three different behaviours — different wording for the same question, a secret asked in project scope and then discarded, and `--yes` off a terminal refused by one face and written by the other. Unified on: write it, name it out loud, let the loader refuse to launch until the variable is set (18f607a)
363
+ - Pointing `ROVECODE_HOME` at a directory that did not exist yet filled it with a copy of `~/.cumulus`, stored keys included: the rename migration honoured an explicit home too, so a "scratch" home was not scratch. It billed two real API calls during this release's own verification before anyone noticed. An explicit home is now that directory and nothing else; the default home still inherits, and says so on stderr (03817b8)
364
+ - A first word shaped like a path (`rovecode ./src/cli/main.ts`) is no longer sent to the provider as a prompt — it cost a real API call when a probe passed a filename where a prompt was expected. On a terminal it asks first; off one it exits 2 before the runtime boots. `rovecode run <word>` stays the explicit way to send it, and sentences are never guarded (60456d6, 14e9118)
365
+ - `rovecode run "hi" --output json --max-turns 1` sent the model the prompt "hi 1": only `--output`'s value was kept out of the prompt words, every other value flag after the command leaked its value in. All of them are dropped now, by position, so a prompt may still contain the word "json" (60456d6)
366
+ - `rovecode trace` with no id exited 0 and printed nothing — a silent success a reader takes for an empty session; it now asks for the id and exits 2. `rovecode export` with no argument exited 1, the code a failed export uses; a usage error there is 2 now, like every other command, and a real failure stays 1 (9936376)
367
+ - A TypeScript project on a machine without `typescript-language-server` on PATH is told once at boot that edits and writes are NOT being type-checked and the model gets no diagnostics after them. The gate had been silently off, and everyone had been crediting a loop that was not running (60456d6)
368
+ - `--help` still promised that "a scripted mock answers when no provider is configured", which d80c2f6 made false; the line now says exit 2 and names `ROVECODE_MOCK=1` as the way to ask for the mock (03817b8)
369
+
370
+ ### Sessions & scripting
371
+
372
+ - A session that never received a message no longer leaves `.rovecode/sessions/<id>/` behind — 35 hollow directories in this repository alone; the directory appears with the first entry, and nothing is ever deleted, so every session that has content resumes as before (1169be0)
373
+ - Every `--json` surface is one parseable document on stdout on every exit: `market update --all --json` (was a sentence, or one document per item), every market usage error (`{ok:false, error, usage}`, exit 2) and the early exits of `context --json` (`{error}`) (1169be0)
374
+ - `market list --kind mcp|skill|plugin` filters; a flag a market subcommand does not read is refused with exit 2 instead of ignored (1169be0)
375
+ - `rovecode --continue` (or `--resume` with no id) reopens the newest session in this directory that holds something: a leftover directory with only a meta.json cannot win, and `--resume <id>` still opens exactly what was named. With nothing to continue from, a fresh session (60456d6)
376
+ - Piped stdin becomes the prompt's context: `git diff | rovecode run "review this"` appends the diff under the words as a fenced block. It is never read from a terminal; an open pipe that sends nothing for 3 s is skipped with a note; input past 1 MB is trimmed with a note; `--no-stdin` opts out (60456d6)
377
+ - `--max-cost 0.50` (`ROVECODE_MAX_COST` on every surface) ends a run at the next turn boundary once the money is spent — status "budget", the dollars in the message — priced the way `/cost` prices, for the model that served each turn. A turn the catalog cannot price adds nothing and is counted in the message, so the figure is never mistaken for the whole bill (60456d6)
378
+ - `provider list --json` and `auth list --json` accepted the flag and printed prose, so a script asking for a document got a paragraph and exit 0; both are one document now, the credentials one carrying only the redacted form (03817b8)
379
+
380
+ ### MCP market & trust
381
+
382
+ - An install that could not fill a required argument (the filesystem server's directory) wrote a server that could never start. Now the argument is asked for on both CLI faces (`rovecode mcp add`, `rovecode market install`), written as `<directory the server may touch>` when nobody answered, and the loader skips a server still carrying the placeholder and names the file and the line to edit (a180ad2)
383
+ - A server installed from `/mcp` or `/market` is connected in that session, without a restart, and a session that had no servers gets `mcp_list`/`mcp_call` at that moment; the overlay also stopped refusing the six curated servers that only needed a placeholder argument (d30755f)
384
+
385
+ - MCP servers can be installed once instead of resolved through `npx` at every start: connect 1767/2052 ms → 347/473 ms for memory/filesystem, no network needed to open a session, and the package, version and npm integrity hash recorded in `installed.json`. It always asks, declining leaves the `npx` line exactly as it is, and existing entries are never rewritten (158e2e9)
386
+ - A server that was downloading looked like a server that was broken: a first-ever `uvx` or `npx` launch can exceed the 10 s connect budget, so the very first start of a newly installed server failed with “Request timed out”. Package runners now get 90 s for a first connect, and a timeout says what happened and both ways out (736f6fd)
387
+
388
+ ### Sextant TUI
389
+
390
+ - `@path` in the prompt attaches the file: the model receives exactly what the `read` tool returns, edit anchors included, with no tool round-trip. The footer had promised this while nothing read the mentions. Every refusal is named — no match, a directory, a binary, over 2 MB, outside the workspace — and the caps are said out loud: 400 lines a file, 8 files, ~60k characters a message. The transcript shows `▤ path · N lines` chips instead of the file (8a5e9d7)
391
+ - The terminal bell rings when a run ends, when an approval card opens and when a question card opens — the three moments someone who tabbed away needs. `"bell": false` in settings.json silences it, user or project scope (8a5e9d7)
392
+ - `/market` can install an MCP server's package once, as the two CLI faces already could: it asks before the plan with the trade under each option, the approval card stays the gate, and Esc at either step installs nothing (8a5e9d7)
393
+
394
+ ### Tests
395
+
396
+ - The migration test asserted the very behaviour 03817b8 removed — "the override is a home like any other" — and so kept the defect honest until someone measured what it cost. Flipped, with the two real charges recorded in it; tests that need the migration inject `legacyDir` (3f8c0ed, 03817b8)
397
+ - `bun test` runs against an empty `ROVECODE_HOME` and a scrubbed environment (`bunfig.toml` preloads `test/helpers/isolate-home.ts`): every `*_API_KEY`, `GITHUB_TOKEN`/`GH_TOKEN` and `ROVECODE_*` variable is cleared, so what is installed or exported on the machine running the suite cannot decide a result. Installing one skill used to fail a plugin test, two MCP servers failed twenty-five, and an exported `ANTHROPIC_API_KEY` let a headless run on a clean checkout bill a real call (8c6f6f9, f213b58)
398
+
399
+ ## Unreleased — 2026-09-04
400
+
401
+ ### Thinking & providers
402
+
403
+ - Thinking is on by default: the new `auto` effort level sends no thinking field, so the model's own reasoning default stands; `off` is now the explicit, deliberate choice (f655be0)
404
+ - Answers are no longer cut at 4096 tokens: max output follows the catalog's limit per model, capped at 32768, with an 8192 floor for uncatalogued models (f655be0)
405
+ - Every model receives the working agreement (read before edit, verify before "done", parallel calls, scope, reporting), not only GLM; "be concise" became "match the length to the task" (f655be0)
406
+ - One effort dial for every wire: the dial is translated per model family (Anthropic, GLM, DeepSeek, Qwen, Kimi, Gemini, grok, gpt-5, o-series, OpenRouter); `/effort` and `rovecode model show` say exactly what the model receives; the matrix is docs/thinking.md (02edf99)
407
+ - `--help`, the ROVECODE_EFFORT note and the `/effort` row list `auto` as the default (1b275ae)
408
+ - Models that models.dev lacks are priced from rovecode's own table (the DeepSeek API aliases, the grok-4 family); `model show` names where a price comes from (b5e51bf)
409
+ - The grok-4 rows carry xAI's retirement terms (served by grok-4.3: $1.25 in / $2.50 out per MTok, 1M context); the DeepSeek alias rows are marked unverified because the vendor page now lists only V4; grok-3-mini stays unpriced (2309b7f)
410
+ - models.dev 0.0.64: openrouter glm-5.3 cache-read 0.26 → 0.14 per MTok; google, zai, moonshot, alibaba and minimax ids resolve to prices; Anthropic prompt caching verified healthy on a live run (f246355)
411
+ - Images the way people try to send them: ctrl-v pastes a clipboard screenshot, dropping an image on the terminal attaches it, staged images show as chips on the prompt row before sending (f655be0)
412
+
413
+ ### Run limits & wire failures
414
+
415
+ - `rovecode run --max-turns N --max-seconds S` (ROVECODE_MAX_TURNS / ROVECODE_MAX_SECONDS also reach the TUI, serve and acp); a headless run defaults to a 1200 s wall clock and ends with status "budget", exit 1, every tool result kept (605b288)
416
+ - Wire failures decided and visible: 1 s base, 20 s cap, 4 attempts, full jitter, floors from Retry-After, retry-after-ms and Anthropic's ratelimit headers; no retry after content has streamed, so an answer never appears twice; a 60 s first-byte timeout (ROVECODE_FIRST_BYTE_TIMEOUT_MS); live notes such as "anthropic: overloaded — retrying in 4 s (2/4)" in the TUI and on stderr (c3be792)
417
+ - The wire-failure policy is documented and the retry knobs are in `--help` (7c29705)
418
+ - `rovecode serve` stops in order on SIGTERM/SIGINT: session-close hooks, MCP servers and background tasks close instead of being killed (1e8ae54)
419
+
420
+ ### MCP market & trust
421
+
422
+ - `rovecode mcp search | info | add | remove | list` and `/mcp [query]`: a curated shelf of 16 servers plus the official registry, an approval card carrying the exact launch line; installs write `${NAME}` placeholders and a secret never lands on a command line or in a project file (576d295)
423
+ - A project's `.rovecode/mcp.json` or `.mcp.json` loads nothing until approved once on this machine (`rovecode mcp trust`, `/mcp trust`); any edit to the file asks again; the user-level file is never gated (114a9d5)
424
+ - Four promises the docs made are kept: the plugin boot summary prints, an sse-only registry remote says why nothing was written, unknown `mcp` flags exit 2, and the note after `mcp add` names only the variables the entry uses (da3f41f)
425
+ - `/mcp ` offers its subcommands, and Enter completes the word instead of sending it (b8c311e)
426
+
427
+ ### Sextant TUI
428
+
429
+ - Scrollbar thumbs can be dragged (ddc9226); the wheel scrolls the files tree, and a view scrolled up follows the tail again once it reaches the bottom (4618610)
430
+ - The frame's border rows answer clicks, and the thinking dial shows in the footer (c8c42e4)
431
+ - Click a tool row that names a file and the file opens (6076b09)
432
+ - A long plan windows around the step in progress instead of showing steps 1–8 of 30 (b24164c)
433
+ - `/effort ` offers its levels and `/model ` suggests the configured providers' models (b614a22, 7f134a9)
434
+ - The help card names every key it has, and the README says what the mouse does (515d05e, e31fc58)
435
+ - `design_direction get` no longer raises an approval card; only the write does (71e5d1a)
436
+ - Design tools: a provisional direction is recorded when no human can answer, plus four rules live runs asked for (cbdc608); design_audit rebuilt on 20 measured repositories, slop rules demoted, deviation measured in OKLCH (b0111a6); multi-page projects are scored with their layout chain and HSL colours are read (42e5732); the ask-once flow is tested through the real TUI (b8ab321)
437
+
438
+ ### Startup performance
439
+
440
+ - `rovecode --help` answers in 75 ms instead of ~900: each command imports what it needs when it runs (077155b)
441
+ - Telemetry and MCP load only when configured; the models.dev snapshot parses on first use (d080e16)
442
+ - The tokenizer parses on the first count, ~430 ms off every launch; the repo map's ast-grep loads after the first frame (3be18f7, c80cc1f)
443
+ - Process start to first frame ~948 → ~240 ms, measured with the new ROVECODE_TRACE_BOOT=1, which prints boot timestamps to stderr (8c24361, 3be18f7)
444
+ - The files tree and the transcript rows are built once per frame, not twice; the scrollbar painters drop a placeholder (4b23ee2, a7ad4fe, 79d27f5)
445
+ - `/help`, `/status`, `/cost` and the session commands load on first use instead of before the first frame (b3daccb)
446
+ - `bun run build:cli` pre-bundles the TUI path (opt-in, re-run after git pull); the `rovecode` bin routes a TUI launch to the bundle and everything else to the source, so `--help` stays ~80 ms and the first frame drops ~230 → ~75 ms (d252e1b)
447
+
448
+ ### Tooling & CI
449
+
450
+ - GitHub Actions: tsc and the suite on every push and pull request; the site deploys itself on merge through an SSH key bound to a forced receive command (1ea1504)
451
+ - `bun run gauntlet` runs the gauntlet (it executed the library module and printed nothing); `check`, `smoke` and `deploy:site` scripts (6bbba33, a996b52)
452
+ - Dependencies: models.dev 0.0.64, marked 18.0.11, @xterm/headless 6 (f246355, b5e51bf)
453
+ - `.gitattributes` makes every text file LF; fresh checkouts no longer depend on core.autocrlf (e848057)
454
+
455
+ ### Site & deploy
456
+
457
+ - The rovecode site, round 8: Vite + React, static output, self-hosted Hanken Grotesk and IBM Plex Mono, recorded in site/.rovecode/design.json (2b4364d)
458
+ - Landing transfer 1007 → 294 kB: AVIF/WebP frames, prerendered HTML that works without JavaScript, no motion library; Lighthouse 94/100/100/100 mobile and 100s desktop (63edd98, 4e2cb18)
459
+ - Locales load lazily, fonts are pruned, social tags are absolute, and a real 404 page replaces the SPA fallback (4641a04)
460
+ - One page per language: 15 prerendered pages with hreflang, a sitemap, RTL for Arabic; every quickstart command checked against the CLI (e197e59)
461
+ - Live checks: a sitemap walk with axe (0 findings on 15 pages) and a Chromium + Firefox + WebKit pass; the copy button reports failure instead of claiming success (4c4278a, 1ca96f9)
462
+ - `/docs/` is live: 7 pages × 15 locales, the deploy default (`--no-docs` builds the landing alone); one h1 per page and keyboard-scrollable code blocks (6624432, 6964982, 18241ac, 2d9a9e9)
463
+ - `deploy-site.sh --check` runs the live walk after the flip and rolls the release back when a page fails; live-check exits non-zero on failure and checks a preview URL where it lives (e0fc4ae, 529217f)
464
+ - Historical website deployment details were removed from the public core repository; the website is maintained separately.
465
+ - The site's frames, design.json and facts.json describe what actually ships (de35af2, ffddf2c, aee0f63)
466
+ - Round 12, Y3 · Sabah sisi: a softer visual system on the same content — periwinkle ground, white 24 px cards with one shadow, pills, Manrope + JetBrains Mono, a two-tone blue accent that meets 4.6:1 on every small text; og.png and favicons follow; live-check 120 pages clean, design_audit 0 findings, Lighthouse mobile 91 (live was 87) (c1c8c09)
467
+
468
+ ### Docs
469
+
470
+ - Every command, flag, key and env var checked against the code both ways; drift fixed: three permission modes, `auto` effort, ROVECODE_STREAM's five values, the MCP verbs and trust gate, the unlisted keys (706d37a)
471
+ - README: the site and how it ships (e912782); status measured on today's HEAD, what landed after wave 4, Windows-first and Linux-checked (c2acdc5)
472
+
473
+ ### Tests / Linux
474
+
475
+ - The suite runs on Linux: eleven Windows-only assumptions fixed, three of them product gaps (HOME honoured for the config directory, backslash session ids refused everywhere, drive-letter paths relativized on POSIX); the backslash-cwd git check is Windows-only (1dfd3fa, d24c590)
476
+ - The two headless surfaces are tested through the real process: a `serve` SSE run, an `acp` stdio session, and the MCP child reaped on exit (6aa25aa)
477
+
478
+ ### CRT receiver companion and first-party artifacts
479
+
480
+ - Replaced the cloud/weather mascot painter with a compact terminal-native CRT receiver while retaining `--pet` and `ROVECODE_PET` as compatibility aliases.
481
+ - Added deterministic receiver state/layout snapshots and removed ambient sprite sway to avoid flicker.
482
+ - Fixed the single-binary build smoke, which still expected a removed mock-provider path, and fixed JSON model-index loading inside compiled binaries.
483
+ - Added Windows x64 release staging, checksums, manifest contract, extracted-artifact smoke instructions, and a measured offline harness quality report.
484
+
485
+ ### The cloud mascot is back, harness improvements, and the dist-only npm beta (2026-09-19)
486
+
487
+ - The mascot is the weather cloud again: the CRT receiver experiment (2b122e2) is reverted at Berkay's call — a flat-topped rounded box with a face read as a television. The cloud returns with a TWO-LOBE crown instead of the flat one; intro, pet painter and every pin draw the same cloud.
488
+ - Planning contract: the working agreement every model gets gains a `# Planning` section — a non-trivial request is planned before the first edit as specific, verifiable todo items; the list is then FOLLOWED (exactly one in_progress, completed means verified, rewritten the moment the plan changes); a wide request is split into a workflow of concurrent background subagents instead of one long solo run.
489
+ - Model lists open instantly: a provider's /models answer is cached in memory AND on disk (`<home>/cache/models.json`), served stale-while-revalidate. The background refresh is opt-in for long-lived surfaces only (a pending fetch keeps a Bun process alive — a one-shot command must never leave one dangling); a network blip is retried once and remembered for at most 30 s; an empty answer never overwrites a good cache.
490
+ - The MCP environment reaches the model AND its children: the system prompt names the configured servers (two generic house tools in a long tool list were invisible in practice), and task children get the house tools through the SAME manager. Policy still decides reach: under gated rules children get the list read only.
491
+ - The update check asks THIS public repository and works anonymously (a token only raises the rate limit); `ROVECODE_NO_UPDATE_CHECK=1` disables the check outright — the test suite sets it, since the `gh auth token` spawn used to leak a real "update available" note into TUI tests mid-assertion.
492
+ - npm packaging is dist-only from here: the tarball ships the MINIFIED bundle (`prepack` runs `build:npm`; this public repository is the AGPL source the package points at), `bin/rovecode.js` prefers dist and falls back to src in an unbuilt checkout, the library exports answer from `dist/lib/*`, and the version moves to 0.4.0-beta.0 published under the `beta` dist-tag.
493
+ - A test-suite flake and a fixture gap fixed on the way: the spinner frame-rate floor dropped 8→6 frames per 500 ms (the 8-floor flaked at 7 on a saturated box), and the suite's home isolation keeps `ROVECODE_NO_UPDATE_CHECK` across per-test scrubs.
494
+
495
+ ### 0.4.0-beta.1 — the second npm beta (2026-09-20)
496
+
497
+ Everything after beta.0, measured rather than assumed:
498
+
499
+ - fix: a tool NAME repeated by a proxy no longer doubles into `unknown tool lsls` (the SSE accumulator was seed+append; an exact repeat is now idempotent, genuine fragments still concatenate), and arguments repeated whole per delta (`{…}{…}`) are rescued when the repeat is exact
500
+ - feat: GLM generation 5 below 5.3 gets its real effort vocabulary (`reasoning_effort low|high|max`) — the on/off mapping it replaced sent one identical body for low, medium and high
501
+ - feat: the chat is drag-copyable — select text in the messages panel, release, it is on the clipboard (OSC 52) with a toast; motionless clicks replay verbatim, scrollbars/cards/palette untouched; `/mouse on|off|toggle` still hands the whole terminal back for native selection
502
+ - feat: staged context — the ~2.2k-token design proposal now rides as a stub until a direction is recorded, and `design_direction {action:"get"}` lazy-discloses the full protocol (system prompt measured 18.2k → 10.0k chars; the whole request −20%)
503
+ - feat: the effort dial persists — `resolveEffort` reads settings.json (flag → env → project → user → auto) and `/effort low --save [--project]` writes it
504
+ - pet: the crown is a three-lobe cumulus
505
+ - the library half is verified from the INSTALLED tarball now: all four export subpaths resolve and a real `agentLoop` runs to "done" through the minified bundle (lib smoke)
506
+
507
+ ### 0.4.0-beta.2 — self-update (2026-09-20)
508
+
509
+ - `rovecode update` (and `/update` in the TUI): detects how THIS copy was installed — npm (global vs project, decided from `npm prefix -g`), a source checkout (`git pull --ff-only` + `bun install`, plus `build:cli` when a dist was built), or a compiled binary (no self-swap yet: the releases page, said plainly) — and runs the right plan. The channel follows the running version: a beta stays on `beta` unless `--channel` says otherwise. `--check` only looks.
510
+ - `"autoUpdate": true` in settings.json (or `ROVECODE_AUTO_UPDATE=1`): when the boot-time update check finds a newer release, the plan runs in the BACKGROUND — the session is never blocked, the running process never swapped; the note says "restart rovecode to run the new version".
511
+ - the update-check cache is keyed PER RELEASE REPO (`update-check-<repo>.json`): two builds on one machine (private dev + public community) used to answer each other's question — observed live, where the community's "no release published yet" silenced the dev build's real answer.
512
+ - nothing swaps a live process: on Windows the files under a running bun are replaced while it runs, so the promise is deliberately "updated — restart", not a mid-session hot-swap.