rovecode 0.3.3 → 0.4.0-beta.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.
- package/CHANGELOG.md +527 -0
- package/README.md +46 -48
- package/bin/rovecode.js +24 -0
- package/dist/cli/app-j6gn14w3.js +2 -0
- package/dist/cli/ask-user-cwstt8fz.js +2 -0
- package/dist/cli/auth-login-9bbp9915.js +2 -0
- package/dist/cli/auth-m8p9grty.js +2 -0
- package/dist/cli/bench-16zqdms5.js +9 -0
- package/dist/cli/catalog-1xchffa4.js +2 -0
- package/dist/cli/cli-1n1zb64f.js +2 -0
- package/dist/cli/client-2t9gjkck.js +2 -0
- package/dist/cli/commands-exafvm2b.js +2 -0
- package/dist/cli/connect-6zde0kn3.js +2 -0
- package/dist/cli/context-cmd-5t43wgqt.js +2 -0
- package/dist/cli/context-report-kt01pw8y.js +2 -0
- package/dist/cli/count-remote-ap7x3vh6.js +2 -0
- package/dist/cli/design-ne5zszyh.js +2 -0
- package/dist/cli/dispatch-2r5myxye.js +2 -0
- package/dist/cli/doctor-ws4fh4tn.js +3 -0
- package/dist/cli/executor-bdrjn634.js +2 -0
- package/dist/cli/export-1mxb9g5p.js +2 -0
- package/dist/cli/files-g104xghh.js +2 -0
- package/dist/cli/gauntlet-07xrjpj7.js +2 -0
- package/dist/cli/gauntlet-runner-xvy64436.js +10 -0
- package/dist/cli/gauntlet-wave3-jm91yt5w.js +5 -0
- package/dist/cli/gauntlet-wave4-r13py7p1.js +14 -0
- package/dist/cli/hashline-znvrat11.js +2 -0
- package/dist/cli/http-xafw6fsh.js +143 -0
- package/dist/cli/index-1sgjm25y.js +2 -0
- package/dist/cli/init-g2m0tn4m.js +51 -0
- package/dist/cli/install-avaqjjqq.js +2 -0
- package/dist/cli/loop-mmpfft01.js +2 -0
- package/dist/cli/main-0904f6ps.js +5 -0
- package/dist/cli/main-0ab9fc26.js +9 -0
- package/dist/cli/main-0jys2ccn.js +3 -0
- package/dist/cli/main-0mtcdbs7.js +3 -0
- package/dist/cli/main-0z1w2zsg.js +3 -0
- package/dist/cli/main-1dchs7xv.js +18 -0
- package/dist/cli/main-1ereejm1.js +3 -0
- package/dist/cli/main-1k1kw6b5.js +3 -0
- package/dist/cli/main-27y4sm2k.js +38 -0
- package/dist/cli/main-2wwjex5j.js +58 -0
- package/dist/cli/main-2yeveeve.js +6 -0
- package/dist/cli/main-2yfck9b5.js +3 -0
- package/dist/cli/main-2zmzgkwh.js +3 -0
- package/dist/cli/main-351pz3z7.js +7 -0
- package/dist/cli/main-3gjqfh7a.js +6 -0
- package/dist/cli/main-3nf3kgve.js +3 -0
- package/dist/cli/main-3pjrb2hd.js +3 -0
- package/dist/cli/main-3rxcvgna.js +19 -0
- package/dist/cli/main-4b3jgy66.js +19 -0
- package/dist/cli/main-4wndhjdc.js +7 -0
- package/dist/cli/main-4xcmvxnk.js +3 -0
- package/dist/cli/main-5tbz0wbz.js +4 -0
- package/dist/cli/main-5ywnwthm.js +3 -0
- package/dist/cli/main-6b62vkz0.js +14 -0
- package/dist/cli/main-6dnk69vp.js +3 -0
- package/dist/cli/main-6genrmhs.js +136 -0
- package/dist/cli/main-73g7eff4.js +15 -0
- package/dist/cli/main-7c5thhjd.js +5 -0
- package/dist/cli/main-7rn6bqje.js +3 -0
- package/dist/cli/main-80haw7qk.js +4 -0
- package/dist/cli/main-875s60s2.js +4 -0
- package/dist/cli/main-8kjxbpw4.js +8 -0
- package/dist/cli/main-90ds1z4e.js +10 -0
- package/dist/cli/main-9etavkew.js +3 -0
- package/dist/cli/main-a9njrkk1.js +3 -0
- package/dist/cli/main-aecrjq2d.js +12 -0
- package/dist/cli/main-ck9asesq.js +9 -0
- package/dist/cli/main-cta9racd.js +4 -0
- package/dist/cli/main-ddv7j2ag.js +3 -0
- package/dist/cli/main-dfreez27.js +10 -0
- package/dist/cli/main-f7rw7des.js +3 -0
- package/dist/cli/main-ggcn7rd7.js +5 -0
- package/dist/cli/main-gzkmycnv.js +3 -0
- package/dist/cli/main-hq51jg8v.js +18 -0
- package/dist/cli/main-jft389w9.js +8 -0
- package/dist/cli/main-k1eqkg83.js +3 -0
- package/dist/cli/main-k2y8a2aw.js +9 -0
- package/dist/cli/main-kcpbykxz.js +4 -0
- package/dist/cli/main-kd488vje.js +22 -0
- package/dist/cli/main-kh32yvgk.js +5 -0
- package/dist/cli/main-kqxnqjnv.js +25 -0
- package/dist/cli/main-kyn0xnsg.js +3 -0
- package/dist/cli/main-m1kk6fp5.js +21 -0
- package/dist/cli/main-mv40pcr2.js +4 -0
- package/dist/cli/main-n0t3973w.js +3 -0
- package/dist/cli/main-nqveez48.js +4 -0
- package/dist/cli/main-pknhvrmj.js +3 -0
- package/dist/cli/main-pn1w7a7j.js +3 -0
- package/dist/cli/main-prxxs70n.js +4 -0
- package/dist/cli/main-q3vsesf9.js +3 -0
- package/dist/cli/main-qsevpgsv.js +3 -0
- package/dist/cli/main-rdgdw24b.js +25 -0
- package/dist/cli/main-rfth4tbm.js +16 -0
- package/dist/cli/main-rg0wn0xf.js +5 -0
- package/dist/cli/main-sdmxhtv8.js +4 -0
- package/dist/cli/main-skbp13js.js +18 -0
- package/dist/cli/main-t4xnd213.js +7 -0
- package/dist/cli/main-vqak588n.js +4 -0
- package/dist/cli/main-w2n1303f.js +9 -0
- package/dist/cli/main-wbrdspr2.js +5 -0
- package/dist/cli/main-wsrg79c1.js +7 -0
- package/dist/cli/main-x4r0fne4.js +5 -0
- package/dist/cli/main-xea2f3tn.js +6 -0
- package/dist/cli/main-xg704a3c.js +3 -0
- package/dist/cli/main-xvnrabfp.js +16 -0
- package/dist/cli/main-xy53xf0r.js +4 -0
- package/dist/cli/main-y1fqy60y.js +3 -0
- package/dist/cli/main-yn8cd281.js +34 -0
- package/dist/cli/main-yr0ksc0h.js +4 -0
- package/dist/cli/main-z2ex2vyf.js +4 -0
- package/dist/cli/main-z3aayzvq.js +3 -0
- package/dist/cli/main-zaqh35jg.js +3 -0
- package/dist/cli/main-zc2e8e46.js +4 -0
- package/dist/cli/main-zzrfw6cf.js +13 -0
- package/dist/cli/main.js +280 -0
- package/dist/cli/market-cmd-e14kmx9n.js +5 -0
- package/dist/cli/mcp-login-wq7ktdek.js +2 -0
- package/dist/cli/mcp-market-cmd-9mg3jecy.js +2 -0
- package/dist/cli/notify-b7qc0cjb.js +2 -0
- package/dist/cli/oauth-z8whcgfx.js +2 -0
- package/dist/cli/output-b3ewj3ps.js +16 -0
- package/dist/cli/profiles-6mr5he5e.js +2 -0
- package/dist/cli/provider-config-g7j42q8x.js +2 -0
- package/dist/cli/provider-jr1y8vvm.js +2 -0
- package/dist/cli/registry-s8yk86g0.js +2 -0
- package/dist/cli/registry-t6p8d4mn.js +2 -0
- package/dist/cli/repl-bajwe1mh.js +11 -0
- package/dist/cli/resume-rwn9nz7y.js +2 -0
- package/dist/cli/run-flags-nah7ndpt.js +2 -0
- package/dist/cli/runtime-n7gafzhb.js +2 -0
- package/dist/cli/sandbox-config-emdy18x4.js +2 -0
- package/dist/cli/server-b0nvs2bn.js +5 -0
- package/dist/cli/session-arg-y75wd4kj.js +2 -0
- package/dist/cli/session-j62evmjq.js +2 -0
- package/dist/cli/sessions-cmd-tsnwz0ns.js +7 -0
- package/dist/cli/settings-df10wfez.js +2 -0
- package/dist/cli/setup-jzvv72fg.js +2 -0
- package/dist/cli/sextant-smoke-37m81ke6.js +5 -0
- package/dist/cli/skills-cmd-gjxnxnhx.js +2 -0
- package/dist/cli/smoke-p7748apt.js +8 -0
- package/dist/cli/start-chat-s4st3mm0.js +12 -0
- package/dist/cli/stream-gmeyewds.js +2 -0
- package/dist/cli/task-gh0kkp3n.js +2 -0
- package/dist/cli/tasks-z1kfpe8e.js +2 -0
- package/dist/cli/thinking-0eqkrz6t.js +2 -0
- package/dist/cli/todo-5brcrt9m.js +2 -0
- package/dist/cli/tools-7pzm0vj9.js +2 -0
- package/dist/cli/tools-s635p6s8.js +2 -0
- package/dist/cli/trust-cmd-cjav8zgm.js +2 -0
- package/dist/cli/update-check-pt31bm2f.js +2 -0
- package/dist/cli/update-cmd-tk131s9t.js +2 -0
- package/dist/cli/voice-56nabd8d.js +2 -0
- package/dist/cli/webfetch-xd8q596m.js +2 -0
- package/dist/cli/websearch-5hkf98k1.js +2 -0
- package/dist/cli/workflow-cmd-cy3cvzjp.js +4 -0
- package/dist/cli/workspace-q10g5z3e.js +2 -0
- package/dist/lib/index.js +62 -0
- package/dist/lib/models-index.json +1 -0
- package/dist/lib/plugins.js +55 -0
- package/dist/lib/providers.js +17 -0
- package/dist/lib/public-api.js +20 -0
- package/dist/lib/sdk.js +360 -0
- package/package.json +84 -72
- package/bin/rovecode.ts +0 -21
- package/src/acp/server.ts +0 -374
- package/src/cli/auth-login.ts +0 -122
- package/src/cli/connect.ts +0 -244
- package/src/cli/context-cmd.ts +0 -199
- package/src/cli/dispatch.ts +0 -82
- package/src/cli/doctor.ts +0 -362
- package/src/cli/export.ts +0 -276
- package/src/cli/help.ts +0 -293
- package/src/cli/is-tui-invocation.ts +0 -8
- package/src/cli/main.ts +0 -583
- package/src/cli/market-cmd.ts +0 -658
- package/src/cli/mcp-login.ts +0 -141
- package/src/cli/mcp-market-cmd.ts +0 -302
- package/src/cli/output.ts +0 -382
- package/src/cli/repl.ts +0 -250
- package/src/cli/repomap-root.ts +0 -14
- package/src/cli/resume.ts +0 -57
- package/src/cli/run-flags.ts +0 -43
- package/src/cli/run-limits.ts +0 -78
- package/src/cli/runtime.ts +0 -931
- package/src/cli/session-arg.ts +0 -30
- package/src/cli/sessions-cmd.ts +0 -145
- package/src/cli/setup.ts +0 -153
- package/src/cli/skills-cmd.ts +0 -194
- package/src/cli/start-chat.ts +0 -65
- package/src/cli/trust-cmd.ts +0 -52
- package/src/coding/bash.ts +0 -148
- package/src/coding/checkpoints.ts +0 -327
- package/src/coding/diff.ts +0 -138
- package/src/coding/files.ts +0 -341
- package/src/coding/hashline.ts +0 -274
- package/src/coding/lsp-gate.ts +0 -254
- package/src/coding/lsp-servers.ts +0 -147
- package/src/coding/lsp.ts +0 -283
- package/src/coding/repomap-cache.ts +0 -99
- package/src/coding/repomap-files.ts +0 -192
- package/src/coding/repomap.ts +0 -481
- package/src/core/agents.ts +0 -255
- package/src/core/compaction.ts +0 -259
- package/src/core/config.ts +0 -289
- package/src/core/context-report.ts +0 -228
- package/src/core/context.ts +0 -60
- package/src/core/count-remote.ts +0 -107
- package/src/core/execpolicy-rules.ts +0 -196
- package/src/core/execpolicy.ts +0 -385
- package/src/core/executor.ts +0 -454
- package/src/core/guardrails.ts +0 -400
- package/src/core/hooks.ts +0 -411
- package/src/core/images.ts +0 -230
- package/src/core/intro.ts +0 -266
- package/src/core/loop.ts +0 -567
- package/src/core/modes.ts +0 -372
- package/src/core/orchestrator.ts +0 -245
- package/src/core/proc-group.ts +0 -48
- package/src/core/project-trust.ts +0 -98
- package/src/core/reflection.ts +0 -165
- package/src/core/sandbox-config.ts +0 -186
- package/src/core/session-id.ts +0 -24
- package/src/core/session-images.ts +0 -73
- package/src/core/session-ops.ts +0 -183
- package/src/core/session-text.ts +0 -29
- package/src/core/session.ts +0 -469
- package/src/core/settings.ts +0 -170
- package/src/core/tasks.ts +0 -646
- package/src/core/token-scale.ts +0 -108
- package/src/core/tools.ts +0 -309
- package/src/core/trust.ts +0 -104
- package/src/core/types.ts +0 -330
- package/src/core/update-check.ts +0 -171
- package/src/core/usage.ts +0 -204
- package/src/core/validate.ts +0 -121
- package/src/core/verify-gate.ts +0 -159
- package/src/core/verify.ts +0 -236
- package/src/core/voice.ts +0 -158
- package/src/core/win-job.ts +0 -183
- package/src/core/workspace.ts +0 -184
- package/src/design/audit.ts +0 -797
- package/src/design/direction.ts +0 -190
- package/src/design/rules.ts +0 -157
- package/src/eval/bench.ts +0 -150
- package/src/eval/gauntlet-runner.ts +0 -215
- package/src/eval/gauntlet-support.ts +0 -84
- package/src/eval/gauntlet-wave3.ts +0 -269
- package/src/eval/gauntlet-wave4.ts +0 -217
- package/src/eval/gauntlet.ts +0 -253
- package/src/index.ts +0 -17
- package/src/lanes/agy.ts +0 -95
- package/src/lanes/approval.ts +0 -24
- package/src/lanes/claude.ts +0 -129
- package/src/lanes/codex.ts +0 -127
- package/src/lanes/events.ts +0 -130
- package/src/lanes/job.ts +0 -142
- package/src/lanes/opencode.ts +0 -122
- package/src/lanes/process.ts +0 -184
- package/src/lanes/progress.ts +0 -183
- package/src/lanes/registry.ts +0 -178
- package/src/lanes/runner.ts +0 -124
- package/src/lanes/types.ts +0 -112
- package/src/market/catalogs/mcp-docs.json +0 -111
- package/src/market/catalogs/plugins.json +0 -111
- package/src/market/catalogs/skills.json +0 -478
- package/src/market/clone.ts +0 -72
- package/src/market/context-cost.ts +0 -121
- package/src/market/digest.ts +0 -106
- package/src/market/index.ts +0 -22
- package/src/market/install.ts +0 -578
- package/src/market/manifest.ts +0 -187
- package/src/market/prereq.ts +0 -145
- package/src/market/registry.ts +0 -363
- package/src/market/resolve.ts +0 -111
- package/src/market/types.ts +0 -236
- package/src/market/validate.ts +0 -227
- package/src/mcp/client.ts +0 -449
- package/src/mcp/config.ts +0 -252
- package/src/mcp/local-package.ts +0 -211
- package/src/mcp/market-catalog.ts +0 -84
- package/src/mcp/market-install.ts +0 -289
- package/src/mcp/market.ts +0 -362
- package/src/mcp/oauth.ts +0 -251
- package/src/mcp/prompts-resources.ts +0 -249
- package/src/mcp/shared.ts +0 -149
- package/src/mcp/status.ts +0 -67
- package/src/mcp/tools.ts +0 -275
- package/src/mcp/transport.ts +0 -122
- package/src/mcp/trust.ts +0 -25
- package/src/memory/blocks.ts +0 -278
- package/src/memory/recall.ts +0 -355
- package/src/memory/scope.ts +0 -182
- package/src/memory/store.ts +0 -105
- package/src/memory/tools.ts +0 -99
- package/src/plugins/cli.ts +0 -119
- package/src/plugins/discover.ts +0 -108
- package/src/plugins/index.ts +0 -50
- package/src/plugins/install.ts +0 -184
- package/src/plugins/load.ts +0 -124
- package/src/plugins/manifest.ts +0 -92
- package/src/plugins/state.ts +0 -83
- package/src/providers/auth.ts +0 -408
- package/src/providers/cache.ts +0 -223
- package/src/providers/catalog-local.ts +0 -160
- package/src/providers/catalog.ts +0 -421
- package/src/providers/middleware-context.ts +0 -86
- package/src/providers/middleware.ts +0 -373
- package/src/providers/model-list.ts +0 -23
- package/src/providers/oauth/common.ts +0 -105
- package/src/providers/oauth/device-code.ts +0 -107
- package/src/providers/oauth/github-copilot.ts +0 -146
- package/src/providers/oauth/loopback.ts +0 -158
- package/src/providers/oauth/openai.ts +0 -163
- package/src/providers/oauth/openrouter.ts +0 -89
- package/src/providers/oauth/pkce.ts +0 -45
- package/src/providers/oauth/registry.ts +0 -39
- package/src/providers/oauth/seam.ts +0 -89
- package/src/providers/profile-glm53.ts +0 -111
- package/src/providers/profile-sonnet5-persona.ts +0 -65
- package/src/providers/profile-sonnet5-voice.ts +0 -23
- package/src/providers/profiles.ts +0 -156
- package/src/providers/provider-config.ts +0 -311
- package/src/providers/registry.ts +0 -333
- package/src/providers/responses.ts +0 -209
- package/src/providers/retry.ts +0 -234
- package/src/providers/router.ts +0 -294
- package/src/providers/sse.ts +0 -26
- package/src/providers/stream-errors.ts +0 -117
- package/src/providers/stream.ts +0 -566
- package/src/providers/thinking.ts +0 -189
- package/src/providers/wire-messages.ts +0 -129
- package/src/providers/wire-responses.ts +0 -79
- package/src/providers/wire-select.ts +0 -53
- package/src/server/http.ts +0 -291
- package/src/server/openapi.ts +0 -246
- package/src/sextant/card-hits.ts +0 -102
- package/src/sextant/card-keys.ts +0 -55
- package/src/sextant/context-source.ts +0 -157
- package/src/sextant/crew-cards.ts +0 -350
- package/src/sextant/draw-agents.ts +0 -273
- package/src/sextant/draw-code.ts +0 -388
- package/src/sextant/draw-context.ts +0 -222
- package/src/sextant/draw-frame.ts +0 -164
- package/src/sextant/draw-market.ts +0 -573
- package/src/sextant/draw-messages.ts +0 -386
- package/src/sextant/draw-pet.ts +0 -230
- package/src/sextant/draw-plan.ts +0 -187
- package/src/sextant/draw-tabs.ts +0 -85
- package/src/sextant/draw-util.ts +0 -65
- package/src/sextant/draw-wizard.ts +0 -378
- package/src/sextant/engine.ts +0 -230
- package/src/sextant/frame-hits.ts +0 -25
- package/src/sextant/frame.ts +0 -101
- package/src/sextant/git-status.ts +0 -197
- package/src/sextant/grid.ts +0 -59
- package/src/sextant/input.ts +0 -119
- package/src/sextant/keys.ts +0 -521
- package/src/sextant/layout.ts +0 -86
- package/src/sextant/local-commands.ts +0 -169
- package/src/sextant/market-source.ts +0 -287
- package/src/sextant/mentions.ts +0 -200
- package/src/sextant/message-hits.ts +0 -26
- package/src/sextant/model.ts +0 -387
- package/src/sextant/overlays.ts +0 -456
- package/src/sextant/panel-hits.ts +0 -38
- package/src/sextant/pet.ts +0 -399
- package/src/sextant/screen.ts +0 -324
- package/src/sextant/scroll-hits.ts +0 -66
- package/src/sextant/scrollbar.ts +0 -82
- package/src/sextant/sextant-bridge.ts +0 -174
- package/src/sextant/sextant-cards.ts +0 -142
- package/src/sextant/sextant-diff-base.ts +0 -63
- package/src/sextant/sextant-files.ts +0 -154
- package/src/sextant/sextant-frame-loop.ts +0 -335
- package/src/sextant/sextant-renderer.ts +0 -574
- package/src/sextant/sextant-repo.ts +0 -140
- package/src/sextant/theme.ts +0 -66
- package/src/sextant/tool-rows.ts +0 -189
- package/src/sextant/types.ts +0 -493
- package/src/skills/index.ts +0 -387
- package/src/skills/pack.ts +0 -220
- package/src/skills/spec.ts +0 -162
- package/src/skills/tools.ts +0 -69
- package/src/skills/versioned.ts +0 -227
- package/src/telemetry/otel-export.ts +0 -122
- package/src/telemetry/otel-lanes.ts +0 -89
- package/src/telemetry/otel-logs.ts +0 -131
- package/src/telemetry/otel-metrics.ts +0 -136
- package/src/telemetry/otel.ts +0 -397
- package/src/telemetry/otlp.ts +0 -76
- package/src/tools/ask-user.ts +0 -156
- package/src/tools/bash-bg.ts +0 -94
- package/src/tools/bash-jobs.ts +0 -237
- package/src/tools/design.ts +0 -151
- package/src/tools/evalcell.ts +0 -338
- package/src/tools/html-text.ts +0 -139
- package/src/tools/provider.ts +0 -149
- package/src/tools/task.ts +0 -250
- package/src/tools/todo.ts +0 -320
- package/src/tools/webfetch.ts +0 -332
- package/src/tools/websearch.ts +0 -359
- package/src/tui/agents-cmd.ts +0 -41
- package/src/tui/app.ts +0 -749
- package/src/tui/attach.ts +0 -127
- package/src/tui/boot-notes.ts +0 -41
- package/src/tui/builtin-prompts.ts +0 -59
- package/src/tui/checkpoints-cmd.ts +0 -70
- package/src/tui/clipboard-image.ts +0 -81
- package/src/tui/clipboard.ts +0 -78
- package/src/tui/commands.ts +0 -283
- package/src/tui/config-view.ts +0 -53
- package/src/tui/context-cmds.ts +0 -282
- package/src/tui/cost.ts +0 -108
- package/src/tui/crash-guard.ts +0 -173
- package/src/tui/focus-terminal.ts +0 -34
- package/src/tui/git-cmds.ts +0 -273
- package/src/tui/git-plain.ts +0 -58
- package/src/tui/info-cmd.ts +0 -150
- package/src/tui/input-plain.ts +0 -76
- package/src/tui/mcp-cmd.ts +0 -128
- package/src/tui/memory-note.ts +0 -77
- package/src/tui/modes-cmd.ts +0 -45
- package/src/tui/notify-seq.ts +0 -100
- package/src/tui/notify.ts +0 -318
- package/src/tui/overlays.ts +0 -97
- package/src/tui/pi-renderer.ts +0 -428
- package/src/tui/providers-cmd.ts +0 -377
- package/src/tui/reasoning-view.ts +0 -56
- package/src/tui/renderer.ts +0 -128
- package/src/tui/replay-marker.ts +0 -29
- package/src/tui/session-cmd.ts +0 -148
- package/src/tui/session-manage.ts +0 -95
- package/src/tui/sextant-attach.ts +0 -102
- package/src/tui/sextant-io.ts +0 -202
- package/src/tui/sextant-smoke.ts +0 -110
- package/src/tui/shell-cmd.ts +0 -158
- package/src/tui/smoke.ts +0 -72
- package/src/tui/staged-terminal.ts +0 -50
- package/src/tui/startup.ts +0 -12
- package/src/tui/theme.ts +0 -59
- package/src/tui/todo-label.ts +0 -7
- package/src/tui/trust-card.ts +0 -107
- package/src/tui/tui-commands.ts +0 -87
- package/tsconfig.json +0 -30
- package/vendor/pi-tui/LICENSE +0 -21
- package/vendor/pi-tui/PATCHES.md +0 -12
- package/vendor/pi-tui/PROVENANCE.md +0 -12
- package/vendor/pi-tui/README.upstream.md +0 -854
- package/vendor/pi-tui/native/win32/prebuilds/win32-arm64/win32-console-mode.node +0 -0
- package/vendor/pi-tui/native/win32/prebuilds/win32-x64/win32-console-mode.node +0 -0
- package/vendor/pi-tui/src/alt-screen-search.ts +0 -158
- package/vendor/pi-tui/src/autocomplete.ts +0 -827
- package/vendor/pi-tui/src/components/alt-screen-flash.ts +0 -52
- package/vendor/pi-tui/src/components/box.ts +0 -138
- package/vendor/pi-tui/src/components/cancellable-loader.ts +0 -41
- package/vendor/pi-tui/src/components/editor.ts +0 -2364
- package/vendor/pi-tui/src/components/h-stack.ts +0 -45
- package/vendor/pi-tui/src/components/image.ts +0 -128
- package/vendor/pi-tui/src/components/input.ts +0 -448
- package/vendor/pi-tui/src/components/loader.ts +0 -93
- package/vendor/pi-tui/src/components/markdown.ts +0 -1016
- package/vendor/pi-tui/src/components/scroll-view.ts +0 -217
- package/vendor/pi-tui/src/components/select-list.ts +0 -230
- package/vendor/pi-tui/src/components/settings-list.ts +0 -277
- package/vendor/pi-tui/src/components/spacer.ts +0 -29
- package/vendor/pi-tui/src/components/stack.ts +0 -155
- package/vendor/pi-tui/src/components/text.ts +0 -108
- package/vendor/pi-tui/src/components/truncated-text.ts +0 -66
- package/vendor/pi-tui/src/components/v-stack.ts +0 -34
- package/vendor/pi-tui/src/editor-component.ts +0 -75
- package/vendor/pi-tui/src/fuzzy.ts +0 -138
- package/vendor/pi-tui/src/index.ts +0 -149
- package/vendor/pi-tui/src/keybindings.ts +0 -321
- package/vendor/pi-tui/src/keys.ts +0 -1402
- package/vendor/pi-tui/src/kill-ring.ts +0 -47
- package/vendor/pi-tui/src/latex.ts +0 -1381
- package/vendor/pi-tui/src/layout-node.ts +0 -52
- package/vendor/pi-tui/src/layout.ts +0 -411
- package/vendor/pi-tui/src/native-modifiers.ts +0 -60
- package/vendor/pi-tui/src/native-module-path.ts +0 -32
- package/vendor/pi-tui/src/stdin-buffer.ts +0 -445
- package/vendor/pi-tui/src/terminal-colors.ts +0 -74
- package/vendor/pi-tui/src/terminal-image.ts +0 -701
- package/vendor/pi-tui/src/terminal.ts +0 -554
- package/vendor/pi-tui/src/tui-alt-screen.ts +0 -1379
- package/vendor/pi-tui/src/tui-main-screen.ts +0 -655
- package/vendor/pi-tui/src/tui.ts +0 -1264
- package/vendor/pi-tui/src/undo-stack.ts +0 -29
- package/vendor/pi-tui/src/utils.ts +0 -1327
- package/vendor/pi-tui/src/word-navigation.ts +0 -118
- package/vendor/pi-tui/test/test-themes.ts +0 -39
- package/vendor/pi-tui/test/virtual-terminal.ts +0 -219
- /package/{src/providers → dist/cli}/models-index.json +0 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,527 @@
|
|
|
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
|
+
### SDK, mission control, and workflows
|
|
13
|
+
|
|
14
|
+
- Added `rovecode/sdk`: the embeddable client (`createClient` — sessions, streamed prompts,
|
|
15
|
+
background tasks, live `agent_tree_update` frames) over the same runtime the CLI boots, published
|
|
16
|
+
as the `./sdk` subpath export.
|
|
17
|
+
- Added `rovecode serve` observation surfaces: `GET /events` (a global SSE bus: session_created,
|
|
18
|
+
agent_tree_update, every RunEvent) and `GET /ui`, a zero-build mission-control dashboard.
|
|
19
|
+
- Added `rovecode workflow run <file.ts> [--resume <runId>]` / `workflow list`: DAG workflows
|
|
20
|
+
(`defineWorkflow`) of agent + gate steps with retry, token budget, and JSONL checkpoint-resume;
|
|
21
|
+
steps appear in the mission-control agent tree.
|
|
22
|
+
- Added `rovecode plugin init` (scaffold) and `rovecode plugin test` (dry harness), and optional
|
|
23
|
+
manifest `permissions` declarations enforced before tool execution.
|
|
24
|
+
- `TaskInfo` gains `parent` (the task that spawned this one), which the SDK agent tree and the
|
|
25
|
+
dashboard hang on.
|
|
26
|
+
|
|
27
|
+
### Open-core boundary and supported APIs
|
|
28
|
+
|
|
29
|
+
- Added explicit package exports for the core, extension, plugin, and provider APIs, with contract tests and a documented 0.x compatibility policy.
|
|
30
|
+
- Added a CI-enforced one-way dependency boundary: public source cannot import private, hosted, commercial, or control-plane overlays.
|
|
31
|
+
- 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.
|
|
32
|
+
- Added local documentation-link validation and a manual signed release checklist.
|
|
33
|
+
- Replaced the licensed Gitleaks Action with a checksum-pinned open-source CLI invocation and pinned all CI actions to immutable commits.
|
|
34
|
+
|
|
35
|
+
### Connect wizard: endpoint doors and the active model list
|
|
36
|
+
|
|
37
|
+
- A "your own URL" row in the wizard's provider list no longer fails with `unknown provider` when
|
|
38
|
+
the key step arrives: it walks its own ENDPOINT step first (a short name and the base URL, both
|
|
39
|
+
validated before the registry is touched), registers the row, and only then asks for the key.
|
|
40
|
+
- The model step pins the ACTIVE model list: rows are checked with space, `a` toggles all, Enter
|
|
41
|
+
confirms — the checked rows become the provider's `models` entry in providers.json (served from
|
|
42
|
+
the file afterwards, never re-fetched), an empty selection leaves the endpoint live ("use them
|
|
43
|
+
all"), and one of the checked rows becomes the default and the session's model. When the endpoint
|
|
44
|
+
cannot be listed, typing the id by hand still works exactly as before.
|
|
45
|
+
|
|
46
|
+
### Readiness-driven intro
|
|
47
|
+
|
|
48
|
+
- The animated intro remains on screen while the textbox and complete TUI are drawn offscreen.
|
|
49
|
+
Reveal waits for both the intro choreography and real readiness (including the initial file list),
|
|
50
|
+
then replaces the intro with the complete frame in a synchronized-output transaction. No visible
|
|
51
|
+
empty frame/files-only stage or second panel stagger. Slow starts retain the loading screen;
|
|
52
|
+
resize, startup cancellation and errors restore the terminal cleanly.
|
|
53
|
+
- Only the selected renderer is loaded. Sextant no longer loads the classic editor/markdown graph,
|
|
54
|
+
classic no longer loads Sextant, and `--plain` loads neither renderer nor the TUI app.
|
|
55
|
+
- Automatic interactive repo-map indexing skips the home directory and filesystem root, avoiding
|
|
56
|
+
unrelated SDK/cache trees. Actual project directories and explicit headless builds are unchanged.
|
|
57
|
+
- Fast preparation no longer makes the intro flash and disappear: the existing approximately 1.1s
|
|
58
|
+
choreography runs alongside loading, not after it. See [startup behavior and validation](docs/startup.md)
|
|
59
|
+
for the first-frame contract and opt-outs.
|
|
60
|
+
|
|
61
|
+
### Branch integration and startup responsiveness
|
|
62
|
+
|
|
63
|
+
- Integrated the remaining TUI ports: plain `!cmd` / `@path` input, image staging, the bare `/model`
|
|
64
|
+
picker with context/pricing/reasoning metadata, and shared boot-note / command declarations
|
|
65
|
+
(`99becc4`). The command table retains `/commit`, `/undo`, `/compact`, `/clear`, `/init`, `/copy`,
|
|
66
|
+
`/agents` and `/config` from `aion-port`; plain `/init` expands before attachment processing.
|
|
67
|
+
- Repository-map warmup no longer monopolizes the event loop after the first frame (`510437f`,
|
|
68
|
+
extended during integration). Enumeration is async, extraction is sliced, and graph ranking and
|
|
69
|
+
budget search yield. Quitting cancels and drains the scan before resolving the TUI, preventing
|
|
70
|
+
late cache writes and Windows cwd locks. A background failure omits the map rather than retrying
|
|
71
|
+
synchronously on the next interactive prompt; headless runs retain their synchronous path.
|
|
72
|
+
- Plain git commands, compaction, shell commands and model turns share busy/interrupt/quit handling.
|
|
73
|
+
EOF during a pending commit draft cancels it without committing or consuming another model turn.
|
|
74
|
+
- The Nimbus submission history is reconciled without replacing Rovecode's product tree. See
|
|
75
|
+
The integration retained Rovecode’s product tree rather than importing an unrelated snapshot wholesale.
|
|
76
|
+
|
|
77
|
+
### Added
|
|
78
|
+
|
|
79
|
+
- The sextant's crew section is a card per workflow, not a row per task: a title, `3 agents · 01s`, and one chip
|
|
80
|
+
per agent showing which CLI opened it (`codex claude codex`). A workflow is the RUN the tasks were started
|
|
81
|
+
under — nothing invented, no time buckets or label matching: the manager stamps the run it bound, and tasks
|
|
82
|
+
with no run are their own cards. Two rules the chips keep: a queued lane is hollow and dim while a running one
|
|
83
|
+
is filled, so "codex is about to start" cannot look like "codex is working"; and only an external CLI lane
|
|
84
|
+
shows a CLI's name — our own subagents show their agent name. Working workflows lead the section, since the
|
|
85
|
+
header above it already said how many are working. At the panel's 32 cells the spacing goes first, then names
|
|
86
|
+
collapse to counts (`codex ×2`) and a `+N`, then the title truncates, then whole cards go behind `+N more`;
|
|
87
|
+
the agent count and the clock are never dropped, and a card that cannot show them is not drawn at all
|
|
88
|
+
- The card's fourth line is what the workflow has actually done — `wrote 4 files · 12 calls · 4.2k` — and it says
|
|
89
|
+
`wrote` only about a patch that reached your tree. A cancelled or failed agent's files are reported as
|
|
90
|
+
`discarded` (its worktree was thrown away), a live one's as `so far`, and a CLI that has confirmed nothing yet
|
|
91
|
+
gets no file count at all rather than a `0` that would be false while it writes. Tokens are omitted when the CLI
|
|
92
|
+
reported none, because a lane whose usage we could not read is not a lane that used nothing
|
|
93
|
+
|
|
94
|
+
- `/commit`, `/undo`, `/compact`, `/clear`, `/init`, `/copy`, `/agents list` and `/config` — the
|
|
95
|
+
command surface the TUI was missing, ported in three parallel slices. `/commit` shows the
|
|
96
|
+
model-drafted message ON THE APPROVAL CARD before git runs (the card is the only place it is
|
|
97
|
+
visible before it is recorded); the first adaptation skipped the card and the commit went through
|
|
98
|
+
unseen — found by the port's own tests, fixed before landing. `/undo` restores the previous
|
|
99
|
+
checkpoint through two new read-only methods on the checkpoints table (a scratch index under the
|
|
100
|
+
shadow git-dir; your real index is never touched), and `/undo` stopped being an alias note in the
|
|
101
|
+
sextant — it is a real command now. `/copy` reaches the clipboard through PowerShell with explicit
|
|
102
|
+
UTF-8 on Windows (clip.exe deliberately absent: code-page-dependent stdin). `/agents list` shows the
|
|
103
|
+
loaded definitions while the BARE `/agents` stays the crew board
|
|
104
|
+
- An `@image` mention in the sextant rides the `/attach` seam instead of dying as "a binary file",
|
|
105
|
+
and a reasoning block shows as one collapsed `reasoning · N tokens` row per assistant message.
|
|
106
|
+
The harness's input-expand was deliberately NOT ported — rovecode's mentions.ts already is the
|
|
107
|
+
feature, in a stricter format; porting over it would have put two wire formats in one binary.
|
|
108
|
+
Reasoning text is never rendered because the loop drops it on purpose; the row counts what
|
|
109
|
+
survives, the token estimate
|
|
110
|
+
|
|
111
|
+
### Changed
|
|
112
|
+
|
|
113
|
+
- `rovecode run "/init"` expands the BUILT-IN prompt instead of sending the literal string to the
|
|
114
|
+
model: expandSlashPrompt consults the builtin table before custom command files, so a repo file
|
|
115
|
+
named init.md cannot swallow it
|
|
116
|
+
- `/compact` is durable but cannot summarize on this build: the mechanism is complete (fresh-id
|
|
117
|
+
branch, marker persisted, attachments parked and restored, Esc/Ctrl-C bound) but no surface wires
|
|
118
|
+
a summarizer yet, so a real /compact keeps the window and SAYS so rather than pretending. The
|
|
119
|
+
compaction marker omits `trigger` rather than writing a word the vocabulary has no honest value
|
|
120
|
+
for. The seam exists; the day the core wiring lands, the already-written "with a summarizer" test
|
|
121
|
+
turns green by itself
|
|
122
|
+
- The intro ends when the session is READY, not when its clock runs out. It was given a fixed ~1.1 s so it
|
|
123
|
+
would not collapse into a single frame on a fast machine; measured on this one the session is ready at
|
|
124
|
+
~224 ms, so the other ~875 ms was an animation with nothing left to cover — and it was most of what
|
|
125
|
+
"the UI opens late" meant. It still plays, and it still ends on the finished mark rather than cutting
|
|
126
|
+
mid-sweep; it just stops waiting. `ROVECODE_TRACE_BOOT=1` now covers the stretch before the TUI starts,
|
|
127
|
+
where that time was hiding: the previous trace began after it
|
|
128
|
+
- External CLI lanes are on by default. `ROVECODE_LANES_ALLOW` used to be an opt-in allow-list, so
|
|
129
|
+
`task start codex` was refused on every machine until you found an env knob nobody reads — a CLI you had
|
|
130
|
+
installed was unreachable. Unset now allows all four (`claude`, `codex`, `opencode`, `agy`); a value you
|
|
131
|
+
set is still an exact list, so a narrower one is never widened behind your back, and `ROVECODE_LANES_ALLOW=`
|
|
132
|
+
(empty) turns every lane off. Two things come with the new default. A lane whose CLI is not on PATH is
|
|
133
|
+
refused BY NAME at the gate — before a worktree is built and a turn is spent, where it used to surface as
|
|
134
|
+
`spawn failed: codex: ENOENT` afterwards; the check reads PATH only (plus PATHEXT on Windows) and is
|
|
135
|
+
memoised, so `task start` in a loop does not re-stat the disk. And because the gate was also the only
|
|
136
|
+
reason a lane paused for approval, every lane start now states its own flags — `spawn codex lane · sandbox
|
|
137
|
+
workspace-write · approval never · worktree — started` — at every permission level, including `auto`, where
|
|
138
|
+
no approval card is ever shown. That sentence is built from the same function as the card, so it cannot
|
|
139
|
+
describe flags the lane did not get
|
|
140
|
+
|
|
141
|
+
### Fixed
|
|
142
|
+
|
|
143
|
+
- A rovecode launched from a pipe, a script or a wrapper that then closed its stdin hung FOREVER.
|
|
144
|
+
Both surfaces listened for input and never for the pipe ending: the sextant's ProcessIO watched
|
|
145
|
+
`data` only, and the classic surface's vendored terminal does the same, so the process sat in its
|
|
146
|
+
event loop with nothing to wait for — measured 60 s+, killed only by an outer timeout. stdin END is
|
|
147
|
+
now an exit on both surfaces: the sextant delivers ETX through the input subscriber (exactly what a
|
|
148
|
+
real Ctrl+C delivers, so a running turn aborts and an idle surface quits through its normal close
|
|
149
|
+
path), and the composition root exits the process when the classic side's input is gone. A TTY
|
|
150
|
+
never ends, so a real terminal is unaffected
|
|
151
|
+
|
|
152
|
+
- A crash left your TERMINAL broken and told you nothing. The TUI puts the terminal on the alt screen with
|
|
153
|
+
raw input, mouse reporting and focus reporting; quitting undid all of it and dying undid none of it. So an
|
|
154
|
+
uncaught error handed the shell back inside the alt screen, still covered by the last painted frame, and
|
|
155
|
+
every mouse movement afterwards typed escape sequences at the prompt — `[<222;39;51M[<222;38;51M` walking
|
|
156
|
+
across the screen as the pointer moved. The reason it died went with the screen it printed on. rovecode now
|
|
157
|
+
restores the terminal on any death, BEFORE anything that could itself fail, then writes what happened to
|
|
158
|
+
`~/.rovecode/logs/crash-<date>-<time>.log` — name, message, stack, version, platform, cwd — and prints one
|
|
159
|
+
stderr line naming the file. The log exists because restoring the alt screen erases the trace that would
|
|
160
|
+
otherwise have been the only copy. A clean quit writes nothing: it is not a crash
|
|
161
|
+
- An isolated subagent could write to your live repository through an external CLI. A lane always built
|
|
162
|
+
its worktree from the top-level root and merged its patch back there, whoever started it — so a subagent
|
|
163
|
+
confined to its own worktree could start `codex`, and the CLI's diff landed straight in the real tree.
|
|
164
|
+
The subagent could not write there; the lane it started could, and the subagent's own patch — the only
|
|
165
|
+
record you read — said nothing about it. A lane now works in, and merges back into, the tree of whatever
|
|
166
|
+
started it, so a nested lane's result travels up the same chain of patches as everything else. A lane
|
|
167
|
+
started at the top level is unchanged: there the root IS the working tree
|
|
168
|
+
- Killing a command left its grandchildren running on POSIX. The signal reached the direct child only,
|
|
169
|
+
so anything it had forked — `npm` inside a compound command, anything behind `&` — was orphaned, ran
|
|
170
|
+
to completion and held stdout open while it did, which hung the runner rather than merely leaking a
|
|
171
|
+
process. Abort now signals the whole process GROUP, then escalates to SIGKILL on the group if the
|
|
172
|
+
grace expires. Windows was already covered by its Job Object; a run with no signal is spawned exactly
|
|
173
|
+
as before on both platforms (3a6d3b1)
|
|
174
|
+
- A mistyped `--resume <id>` started a NEW empty session under the typed name and said nothing. It now
|
|
175
|
+
exits 2 before the TUI boots, naming the reason and where to look; `--continue` with nothing to
|
|
176
|
+
continue still starts fresh but SAYS so on the startup card. `--resume ../x` used to write its first
|
|
177
|
+
entry outside the sessions root — one validator now gates both it and `trace` (5ceb21e)
|
|
178
|
+
- Listing sessions read the whole transcript of every session directory — on this machine 36 of them,
|
|
179
|
+
35 with nothing in them — and `--continue` paid that scan to find one id. It is now a readdir plus one
|
|
180
|
+
stat per directory, and a directory nothing was ever written to is never opened (5ceb21e)
|
|
181
|
+
- The memory a session wrote died with the session id, and the USER block — preferences meant to follow
|
|
182
|
+
the person across projects — was written INSIDE the repository. MEMORY is now project-scoped and USER
|
|
183
|
+
lives under the user home; a legacy per-session store is copied forward once, originals untouched
|
|
184
|
+
(240c296)
|
|
185
|
+
- An agent file's problem reached you as `plugins: agents: explore.md: skipped`. Four subsystems were
|
|
186
|
+
reporting under a fifth's name; each note now carries its own word (bc31587)
|
|
187
|
+
- Every untrusted-file note told you to run a terminal command — read inside the TUI, an instruction to
|
|
188
|
+
quit in order to approve something. Both spellings are now on the line (30638b3)
|
|
189
|
+
|
|
190
|
+
- A subagent's request to the model carried no tool schemas. Every surface that starts a run passes the
|
|
191
|
+
tool list; the one path that starts a child never did, so a task child on a model that calls tools
|
|
192
|
+
natively was handed a request with no tools and could call nothing, whatever its registry held. The
|
|
193
|
+
scripted models in the tests ignore the tool list, which is how it stayed invisible. A child now sends
|
|
194
|
+
exactly its own registry's schemas, and a loopback provider test counts them per request
|
|
195
|
+
|
|
196
|
+
- `ROVECODE_MOCK=1` now always means the canned provider. It used to be ignored whenever a provider was
|
|
197
|
+
configured — with a key exported, `ROVECODE_MOCK=1 rovecode run "say hi"` reached the real model and cost
|
|
198
|
+
$0.09 for one turn, while the flag's own comment promised a mock. The suite never saw it because the test
|
|
199
|
+
harness scrubs keys before the CLI starts; the new test counts the requests that must not happen
|
|
200
|
+
|
|
201
|
+
### Added
|
|
202
|
+
|
|
203
|
+
- **External agentic-CLI lanes.** `task start {agent: "codex"}` runs codex — or claude, opencode,
|
|
204
|
+
antigravity — as a job of the manager that already runs our own subagents: its own git worktree, its
|
|
205
|
+
diff merged back as a patch, the same completion note. A nested CLI was always possible through
|
|
206
|
+
`bash`; what it could not do was tell anyone. The approval card now names the CLI, the flags it will
|
|
207
|
+
run with and the directory, BEFORE the process exists, and a lane's permissions are quoted from the
|
|
208
|
+
CLI's own flags rather than paraphrased in ours. OFF unless `ROVECODE_LANES_ALLOW` lists the id, and
|
|
209
|
+
the refusal names the variable (8c0fb24)
|
|
210
|
+
- **`rovecode trust`.** A cloned repository could make this machine run code through five files and was
|
|
211
|
+
asked about one. The worst was `.rovecode/hooks.ts` — imported IN-PROCESS at boot, with your
|
|
212
|
+
privileges, before the first prompt is read. Also gated now: `sandbox.json` (which rung and which
|
|
213
|
+
docker image every bash command runs in), and the `verify`, `lsp` and `notify_command` settings keys.
|
|
214
|
+
One store, keyed by sha256, so an edited byte asks again; `rovecode trust show` says what each file
|
|
215
|
+
WOULD do; `/trust` answers it in the TUI. Enforced inside loadSettings, so no consumer can forget.
|
|
216
|
+
`.rovecode/commands/*.md` and `agents/*.md` stay out on purpose: prompt text, a different gate
|
|
217
|
+
(08f355a, 240c296)
|
|
218
|
+
- **Background shell jobs.** `bash … run_in_background: true` returns a job id at once —
|
|
219
|
+
`bash_output` reads only what is NEW since your last read, `bash_list` shows them, `bash_kill` stops
|
|
220
|
+
one and everything it started. `timeout_ms` gives up on a deadline and RETURNS what the command
|
|
221
|
+
printed, because a build that timed out has usually already printed the reason. Jobs die with their
|
|
222
|
+
session (6048215)
|
|
223
|
+
- **Sign in instead of pasting a key**: `rovecode auth login github-copilot` (device code) and
|
|
224
|
+
`openrouter` (PKCE, loopback). Tokens sit beside the API keys, 0600, refreshed in the streaming path.
|
|
225
|
+
`anthropic` is refused — a subscription login is an owner's decision, not a port (9b7a0ac)
|
|
226
|
+
- **The OpenAI Responses wire**, which is what a stored ChatGPT token can actually be sent over; the
|
|
227
|
+
`openai` login refusal was lifted in the same change that made it work. Reasoning items are not
|
|
228
|
+
replayed to the model yet, and `rovecode help env` says so under `ROVECODE_OPENAI_WIRE` (0aa46a0)
|
|
229
|
+
- **MCP prompts and resources**, not just tools: `mcp_prompts`, `mcp_prompt`, `mcp_resources`,
|
|
230
|
+
`mcp_read`. A server behind OAuth can be signed into with `rovecode mcp login` — through the trust
|
|
231
|
+
gate, which the upstream version went around (4a02798)
|
|
232
|
+
- **`--add-dir <dir>`**, and the workspace boundary it needed. Reading a file outside the project used
|
|
233
|
+
to be silently allowed; a path outside every root is now a card that names the path, the roots that
|
|
234
|
+
exist and the way out, remembered per directory. Measured before shipping: zero new prompts under
|
|
235
|
+
`permission=auto`, zero inside the project under accept-edits. Checkpoints do NOT span added roots
|
|
236
|
+
and `/restore` will not undo a change under one — stated at boot, in `rovecode doctor`, in the module
|
|
237
|
+
and here, rather than shipped as a version that looks whole (3416586)
|
|
238
|
+
- **Custom subagents**: `.rovecode/agents/<name>.md` — description, model, plan-or-act mode and a tool
|
|
239
|
+
allow-list that is a FILTER, not a label. A definition can never widen a child, and a reserved lane
|
|
240
|
+
id is refused with a reason rather than either side silently winning (ad97ffa)
|
|
241
|
+
- **`rovecode sessions`** list · rename · delete · fork · search, and the same four verbs as `/sessions`
|
|
242
|
+
in the TUI. Delete removes the session AND its checkpoints shadow repo; fork is bounded at 256 MB,
|
|
243
|
+
measured before anything is copied (5ceb21e, 240c296)
|
|
244
|
+
- **`rovecode skills`** list · validate · pack · install. A `SKILL.md` the loader disagreed with used to
|
|
245
|
+
load under the wrong name or vanish without a word; it now loads with a warning, and `skills list` is
|
|
246
|
+
where those warnings live. A URL install goes through the same SSRF guard as `web_fetch`, re-checked
|
|
247
|
+
on every redirect hop (33ce2c1)
|
|
248
|
+
- **`web_search`** beside `web_fetch`, same network class, same SSRF guard, and a keyless default that
|
|
249
|
+
does not pretend to be a credentialed one (824cddf)
|
|
250
|
+
- **A language-server TABLE** behind the per-edit diagnostics gate (`ROVECODE_LSP` or the `lsp` setting),
|
|
251
|
+
so it is no longer TypeScript-only. A configured server that is not on PATH is named ONCE, at boot and
|
|
252
|
+
in `rovecode doctor`, with the extensions it would have covered (47e5cca)
|
|
253
|
+
- **Metrics and logs on the OTel exporter**, not just traces: token counters, cost, tool durations,
|
|
254
|
+
retry notes, the approval ledger and a span per external lane. A lane that reported no usage emits
|
|
255
|
+
nothing rather than zeros (3a5f82e)
|
|
256
|
+
- **Notifications that fire only when you are not looking.** The bell used to ring on every run
|
|
257
|
+
regardless of focus, which is the same as not ringing. `notify_when: always` restores the old
|
|
258
|
+
behaviour; on Ghostty, iTerm2, kitty, Warp and WezTerm `auto` sends a desktop toast instead. A
|
|
259
|
+
`notify_command` is argv with no shell, the run's text lands as one JSON argument, and it goes through
|
|
260
|
+
the same policy a bash command does (34c43e5)
|
|
261
|
+
- **`!cmd` in the composer** — promised by the input classifier since before this repository existed and
|
|
262
|
+
consumed by nothing. It goes through the app's own approver, so a `!cmd` and a model turn share ONE
|
|
263
|
+
approval path (240c296)
|
|
264
|
+
- `@`-mentions reach `~/` and absolute paths (240c296)
|
|
265
|
+
|
|
266
|
+
- `/trust` in the TUI: the project trust gate can be answered where you are. A checkout's `.rovecode/hooks.ts`,
|
|
267
|
+
`sandbox.json`, MCP files and the `verify` / `lsp` / `notify_command` settings keys do nothing until this
|
|
268
|
+
machine approves that exact content, and until now the only yes was to quit the session and run `rovecode
|
|
269
|
+
trust` — the shape of friction that gets a gate switched off. `/trust` prints the same lines `rovecode trust
|
|
270
|
+
show` prints (what each file would run, with its values), then asks per file. The highlighted item is "keep
|
|
271
|
+
them untrusted", so Enter on an untouched card refuses; "approve all N" appears only after that listing and
|
|
272
|
+
only when there is more than one file. Approving records the file's current bytes, so a later edit asks again
|
|
273
|
+
- `/sessions rename <title…> | delete <id> | fork [<id>] | search <terms…>` in the TUI — the four verbs
|
|
274
|
+
`rovecode sessions` already had, over the one resolver, without leaving the session. Delete resolves the id
|
|
275
|
+
first, asks on one card naming the session, and removes the session directory AND its checkpoints shadow
|
|
276
|
+
repo (a half-delete leaves the space used with nothing pointing at it); deleting the session you are IN moves
|
|
277
|
+
you to a fresh one before the old directory goes. A renamed session now shows its title where you resume it,
|
|
278
|
+
as `rovecode sessions list` already did
|
|
279
|
+
|
|
280
|
+
- Custom subagents: a markdown file in `.rovecode/agents/<name>.md` (or `~/.rovecode/agents/`) is an agent the
|
|
281
|
+
`task` tool can start by name, with its own prompt (the body), model, plan or act mode and a tool
|
|
282
|
+
allow-list that is a filter over the child's tools — `tools: [read, grep]` yields exactly read and grep,
|
|
283
|
+
and a definition can never hand a child more than the agent that started it has. Files that cannot be
|
|
284
|
+
honoured are refused when the session starts, each with a line naming the file: a reserved name (`main`
|
|
285
|
+
and the four external-lane ids keep their meaning), a mode other than plan or act, a model on a provider
|
|
286
|
+
other than the one this session streams over, a YAML list or an empty `tools:` (which never means "all")
|
|
287
|
+
- `--add-dir <dir>` (repeatable, every surface) makes a second directory part of the workspace, and with it
|
|
288
|
+
the workspace gained an edge it never had: a file tool aimed at a path outside the project and outside every
|
|
289
|
+
added root now asks first, on one card that names the path, the project, the roots that exist and the remedy
|
|
290
|
+
— before this an absolute path anywhere on the disk was read without a word. Inside the project and inside a
|
|
291
|
+
root nothing changed; a session in auto mode or accept-edits sees no new question
|
|
292
|
+
- The limit that comes with roots, named rather than discovered later: checkpoints snapshot the project
|
|
293
|
+
directory only, so a change under an added root is not undone by /restore. rovecode says so at start, in
|
|
294
|
+
`rovecode doctor --add-dir <dir>`, and here
|
|
295
|
+
|
|
296
|
+
## 0.3.2 — 2026-09-06
|
|
297
|
+
|
|
298
|
+
### Fixed
|
|
299
|
+
|
|
300
|
+
- `--max-cost 0.15` sent its own number to the model as part of the prompt: the flag was not in the
|
|
301
|
+
parser's value list, so the budget was consumed as a flag and `0.15` was consumed as the request. A
|
|
302
|
+
run asked to build a page came back with `0.15` used as a CSS opacity. The test now walks the whole
|
|
303
|
+
flag table instead of the three entries someone remembered
|
|
304
|
+
|
|
305
|
+
### Added
|
|
306
|
+
|
|
307
|
+
- A run that changed files can check its own work before it says done: rovecode works out what checking
|
|
308
|
+
this project costs (a `verify` list in settings, or inferred from package.json / Makefile / pyproject),
|
|
309
|
+
runs it once at the end, and on failure gives the model one turn with the failing part quoted. Off by
|
|
310
|
+
default — `ROVECODE_VERIFY=1` turns it on, and `rovecode doctor` says which commands it would run
|
|
311
|
+
- `rovecode doctor` gained a verify row: what would run, where it came from, and — when nothing is
|
|
312
|
+
configured — that this is the blind spot, named rather than silently skipped
|
|
313
|
+
|
|
314
|
+
### Changed
|
|
315
|
+
|
|
316
|
+
- The website moved out. rovecode is its own repository with its own history; site/ was 250 MB of the
|
|
317
|
+
old pack and none of it was ever read by a build here. Content still lives here and is published to
|
|
318
|
+
the site with `bun run publish:site`
|
|
319
|
+
|
|
320
|
+
## 0.3.1 — 2026-09-06
|
|
321
|
+
|
|
322
|
+
Berkay: "kod yazarken pek üstünde durmuyor, çoğu durumda az değişiklikler yapıp bırakıyor" — when it writes
|
|
323
|
+
code rovecode does not stay on the task. Three sessions measured it and the cause was ours, in two halves.
|
|
324
|
+
|
|
325
|
+
### Finishing what was asked
|
|
326
|
+
|
|
327
|
+
- A run ended as `done` whenever a turn contained no tool call — the model's silence, taken for finished
|
|
328
|
+
work by every layer. Proven end to end: a rejected `write`, the plan item marked completed anyway,
|
|
329
|
+
"Done — I created src/a.ts", exit 0, three of four items still open, the file never written. `run_end`
|
|
330
|
+
now carries what the transcript says was left (a failure with no later success at the same path, an
|
|
331
|
+
unanswered question, open plan items) and both TUIs and the headless summary say it in one clause —
|
|
332
|
+
`done · 1 failed tool call not recovered (write)`. A run with nothing outstanding is byte-identical to
|
|
333
|
+
before (b0dae27)
|
|
334
|
+
- And once per run, on a failure or an unanswered question, the model gets one turn naming exactly what is
|
|
335
|
+
open, which it may answer by finishing OR by saying why it is not needed. Never on a permission denial,
|
|
336
|
+
the loop guard or an abort — those are the harness's verdict or the user's. The next silence is
|
|
337
|
+
accepted whatever it says: a loop that will not stop is worse than one that stops early.
|
|
338
|
+
`ROVECODE_FINISH_CHECK=0` turns the nudge off (b0dae27)
|
|
339
|
+
- Nothing we send the model said to finish the task before answering, and ten sentences said do less. The
|
|
340
|
+
worst told it that turns are scarce without ever saying there are sixty; it is gone. The worked recap
|
|
341
|
+
example ended with "README untouched; say so if you want the flag documented" — we were teaching that
|
|
342
|
+
the right ending is a small change plus a menu. A `# Finishing` section now says what the harnesses that
|
|
343
|
+
get this right say: done means everything named and plainly implied is built and verified, a reply
|
|
344
|
+
without a tool call ends the run, and a blocked part is named while every other part is finished
|
|
345
|
+
(6714953)
|
|
346
|
+
- The design gate asked for directions before every visual change, and on this machine 6 of 24 task runs
|
|
347
|
+
ended at that question. Berkay's decision: propose directions for something NEW; make the change to
|
|
348
|
+
something that already exists. The rule is now a test anyone can apply — if the person could point at
|
|
349
|
+
the thing on the screen, it exists and you change it (6714953)
|
|
350
|
+
|
|
351
|
+
## 0.3.0 — 2026-09-06
|
|
352
|
+
|
|
353
|
+
`rovecode doctor` is new: one command that runs every check in here and says what it did NOT check.
|
|
354
|
+
Startup, the first edit of a session and an idle session all got much cheaper, several surfaces stopped
|
|
355
|
+
promising things they did not do, and MCP servers can be installed once instead of resolved at every
|
|
356
|
+
start. Numbers are measurements from the commit that reports them, on the machine it names.
|
|
357
|
+
|
|
358
|
+
### Startup
|
|
359
|
+
|
|
360
|
+
- 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)
|
|
361
|
+
- 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)
|
|
362
|
+
- 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)
|
|
363
|
+
- 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)
|
|
364
|
+
- 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)
|
|
365
|
+
- 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)
|
|
366
|
+
- `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)
|
|
367
|
+
- 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)
|
|
368
|
+
|
|
369
|
+
### Speed
|
|
370
|
+
|
|
371
|
+
- 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)
|
|
372
|
+
|
|
373
|
+
### Correctness
|
|
374
|
+
|
|
375
|
+
- 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)
|
|
376
|
+
- 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)
|
|
377
|
+
- `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)
|
|
378
|
+
- 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)
|
|
379
|
+
- 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)
|
|
380
|
+
- `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)
|
|
381
|
+
- `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)
|
|
382
|
+
- 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)
|
|
383
|
+
- `--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)
|
|
384
|
+
|
|
385
|
+
### Sessions & scripting
|
|
386
|
+
|
|
387
|
+
- 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)
|
|
388
|
+
- 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)
|
|
389
|
+
- `market list --kind mcp|skill|plugin` filters; a flag a market subcommand does not read is refused with exit 2 instead of ignored (1169be0)
|
|
390
|
+
- `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)
|
|
391
|
+
- 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)
|
|
392
|
+
- `--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)
|
|
393
|
+
- `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)
|
|
394
|
+
|
|
395
|
+
### MCP market & trust
|
|
396
|
+
|
|
397
|
+
- 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)
|
|
398
|
+
- 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)
|
|
399
|
+
|
|
400
|
+
- 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)
|
|
401
|
+
- 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)
|
|
402
|
+
|
|
403
|
+
### Sextant TUI
|
|
404
|
+
|
|
405
|
+
- `@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)
|
|
406
|
+
- 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)
|
|
407
|
+
- `/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)
|
|
408
|
+
|
|
409
|
+
### Tests
|
|
410
|
+
|
|
411
|
+
- 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)
|
|
412
|
+
- `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)
|
|
413
|
+
|
|
414
|
+
## Unreleased — 2026-09-04
|
|
415
|
+
|
|
416
|
+
### Thinking & providers
|
|
417
|
+
|
|
418
|
+
- 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)
|
|
419
|
+
- 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)
|
|
420
|
+
- 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)
|
|
421
|
+
- 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)
|
|
422
|
+
- `--help`, the ROVECODE_EFFORT note and the `/effort` row list `auto` as the default (1b275ae)
|
|
423
|
+
- 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)
|
|
424
|
+
- 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)
|
|
425
|
+
- 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)
|
|
426
|
+
- 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)
|
|
427
|
+
|
|
428
|
+
### Run limits & wire failures
|
|
429
|
+
|
|
430
|
+
- `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)
|
|
431
|
+
- 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)
|
|
432
|
+
- The wire-failure policy is documented and the retry knobs are in `--help` (7c29705)
|
|
433
|
+
- `rovecode serve` stops in order on SIGTERM/SIGINT: session-close hooks, MCP servers and background tasks close instead of being killed (1e8ae54)
|
|
434
|
+
|
|
435
|
+
### MCP market & trust
|
|
436
|
+
|
|
437
|
+
- `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)
|
|
438
|
+
- 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)
|
|
439
|
+
- 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)
|
|
440
|
+
- `/mcp ` offers its subcommands, and Enter completes the word instead of sending it (b8c311e)
|
|
441
|
+
|
|
442
|
+
### Sextant TUI
|
|
443
|
+
|
|
444
|
+
- 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)
|
|
445
|
+
- The frame's border rows answer clicks, and the thinking dial shows in the footer (c8c42e4)
|
|
446
|
+
- Click a tool row that names a file and the file opens (6076b09)
|
|
447
|
+
- A long plan windows around the step in progress instead of showing steps 1–8 of 30 (b24164c)
|
|
448
|
+
- `/effort ` offers its levels and `/model ` suggests the configured providers' models (b614a22, 7f134a9)
|
|
449
|
+
- The help card names every key it has, and the README says what the mouse does (515d05e, e31fc58)
|
|
450
|
+
- `design_direction get` no longer raises an approval card; only the write does (71e5d1a)
|
|
451
|
+
- 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)
|
|
452
|
+
|
|
453
|
+
### Startup performance
|
|
454
|
+
|
|
455
|
+
- `rovecode --help` answers in 75 ms instead of ~900: each command imports what it needs when it runs (077155b)
|
|
456
|
+
- Telemetry and MCP load only when configured; the models.dev snapshot parses on first use (d080e16)
|
|
457
|
+
- 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)
|
|
458
|
+
- Process start to first frame ~948 → ~240 ms, measured with the new ROVECODE_TRACE_BOOT=1, which prints boot timestamps to stderr (8c24361, 3be18f7)
|
|
459
|
+
- The files tree and the transcript rows are built once per frame, not twice; the scrollbar painters drop a placeholder (4b23ee2, a7ad4fe, 79d27f5)
|
|
460
|
+
- `/help`, `/status`, `/cost` and the session commands load on first use instead of before the first frame (b3daccb)
|
|
461
|
+
- `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)
|
|
462
|
+
|
|
463
|
+
### Tooling & CI
|
|
464
|
+
|
|
465
|
+
- 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)
|
|
466
|
+
- `bun run gauntlet` runs the gauntlet (it executed the library module and printed nothing); `check`, `smoke` and `deploy:site` scripts (6bbba33, a996b52)
|
|
467
|
+
- Dependencies: models.dev 0.0.64, marked 18.0.11, @xterm/headless 6 (f246355, b5e51bf)
|
|
468
|
+
- `.gitattributes` makes every text file LF; fresh checkouts no longer depend on core.autocrlf (e848057)
|
|
469
|
+
|
|
470
|
+
### Site & deploy
|
|
471
|
+
|
|
472
|
+
- The rovecode site, round 8: Vite + React, static output, self-hosted Hanken Grotesk and IBM Plex Mono, recorded in site/.rovecode/design.json (2b4364d)
|
|
473
|
+
- 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)
|
|
474
|
+
- Locales load lazily, fonts are pruned, social tags are absolute, and a real 404 page replaces the SPA fallback (4641a04)
|
|
475
|
+
- One page per language: 15 prerendered pages with hreflang, a sitemap, RTL for Arabic; every quickstart command checked against the CLI (e197e59)
|
|
476
|
+
- 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)
|
|
477
|
+
- `/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)
|
|
478
|
+
- `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)
|
|
479
|
+
- Historical website deployment details were removed from the public core repository; the website is maintained separately.
|
|
480
|
+
- The site's frames, design.json and facts.json describe what actually ships (de35af2, ffddf2c, aee0f63)
|
|
481
|
+
- 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)
|
|
482
|
+
|
|
483
|
+
### Docs
|
|
484
|
+
|
|
485
|
+
- 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)
|
|
486
|
+
- 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)
|
|
487
|
+
|
|
488
|
+
### Tests / Linux
|
|
489
|
+
|
|
490
|
+
- 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)
|
|
491
|
+
- 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)
|
|
492
|
+
|
|
493
|
+
### CRT receiver companion and first-party artifacts
|
|
494
|
+
|
|
495
|
+
- Replaced the cloud/weather mascot painter with a compact terminal-native CRT receiver while retaining `--pet` and `ROVECODE_PET` as compatibility aliases.
|
|
496
|
+
- Added deterministic receiver state/layout snapshots and removed ambient sprite sway to avoid flicker.
|
|
497
|
+
- Fixed the single-binary build smoke, which still expected a removed mock-provider path, and fixed JSON model-index loading inside compiled binaries.
|
|
498
|
+
- Added Windows x64 release staging, checksums, manifest contract, extracted-artifact smoke instructions, and a measured offline harness quality report.
|
|
499
|
+
|
|
500
|
+
### The cloud mascot is back, harness improvements, and the dist-only npm beta (2026-09-19)
|
|
501
|
+
|
|
502
|
+
- 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.
|
|
503
|
+
- 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.
|
|
504
|
+
- 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.
|
|
505
|
+
- 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.
|
|
506
|
+
- 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.
|
|
507
|
+
- 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.
|
|
508
|
+
- 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.
|
|
509
|
+
|
|
510
|
+
### 0.4.0-beta.1 — the second npm beta (2026-09-20)
|
|
511
|
+
|
|
512
|
+
Everything after beta.0, measured rather than assumed:
|
|
513
|
+
|
|
514
|
+
- 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
|
|
515
|
+
- 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
|
|
516
|
+
- 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
|
|
517
|
+
- 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%)
|
|
518
|
+
- feat: the effort dial persists — `resolveEffort` reads settings.json (flag → env → project → user → auto) and `/effort low --save [--project]` writes it
|
|
519
|
+
- pet: the crown is a three-lobe cumulus
|
|
520
|
+
- 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)
|
|
521
|
+
|
|
522
|
+
### 0.4.0-beta.2 — self-update (2026-09-20)
|
|
523
|
+
|
|
524
|
+
- `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.
|
|
525
|
+
- `"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".
|
|
526
|
+
- 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.
|
|
527
|
+
- 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.
|