Changelog
0.17.0 (2026-10-24)
Features
-
authenticate to Anthropic through the SDK’s credential chain (#606) (617fdb7)
-
give tools the background job registry as a documented context key (#579) (a8e98ac)
Bug Fixes
-
/auth and /model refusals say how to supply a missing credential (#597) (ffe18fe)
-
reload each Loader-built runtime with its own build’s choices (#598) (d6b95a6)
-
terminal: keep a capped input inside a short terminal (#575) (8b67c2b)
0.16.0 (2026-10-18)
Features
0.15.0 (2026-10-18)
Features
Bug Fixes
0.14.0 (2026-10-18)
Upgrading
-
the
modelspricing table insettings.jsonis no longer read. Move each entry into a model catalog file’spricing— the same four rates, USD per million tokens — and list the file incatalog_files.
Features
-
make reasoning effort configurable like the model (#553) (330f190)
-
terminal: keep the status bar filled between turns (#555) (e0918ec)
-
upgrade riffer to 0.53.0 and adopt the model catalog (#552) (70b129b)
Bug Fixes
-
stop models from polling background bash jobs (#559) (57ad0ba)
-
terminal: draw the banner and the input row together (#549) (e847277)
0.13.0 (2026-10-17)
⚠ BREAKING CHANGES
-
Riffer::Rig::Loadertakes its per-build choices as aRiffer::Rig::Loader::Optionsinstead of keywords. Loader.runtime no longer accepts model:, extensions:, skills:, agents_md:, tools: or max_steps: (ArgumentError: unknown keywords); pass options:Riffer::Rig::Loader::Options.new(model: …, skills: false). On a Loader instance the Options is the optional first positional argument: runtime(options), continue(options) and resume(id, options). Loader#tracked_files is removed with no replacement.
Features
-
acp: add adopt: hook and yield the connection from run (#336) (612a9c4), closes #302
-
acp: announce background job exits between prompts (#437) (cd40e5b), closes #334
-
carry the tool lifecycle on before/after_tool_call events (#321) (c3967e2)
-
commands: add /cost runtime command (#431) (f7f36e8), closes #260
-
commands: add /trace runtime command (#373) (95fc4cc), closes #250
-
headless: wait for background jobs at exit (#438) (91c7f9f), closes #331
-
runtime: deliver background job exits to the model (#434) (e3f87b3)
-
runtime: keep background jobs running through a cancel (#436) (699ebbc), closes #333
-
stores: stamp session entries with recorded_at (#316) (44dd322)
-
terminal: add a /help command that lists the session’s commands (#547) (81acfcf), closes #545
-
terminal: add the message queue and its footer chip (#410) (9a4c41a), closes #243
-
terminal: make the ticker UI the default and document it (#435) (3400949), closes #265
-
terminal: replay prior turns on resume (#432) (7652083), closes #262
-
terminal: run the REPL as a queue-draining loop (#429) (0213860)
-
terminal: show session totals in the banner and redraw on /model (#317) (69232fd), closes #264
-
terminal: show turns through the ticker and delete the old renderer (#433) (4ec3388)
-
terminal: start a turn when a background job exits at an idle prompt (#439) (0d5198a), closes #332
-
terminal: wire slash autocomplete into the REPL (#495) (af936d9)
-
tools: add bash_output and bash_kill for background jobs (#409) (88fc7a9), closes #329
-
tools: job registry for background bash jobs (#305) (54f7df1), closes #276
-
watch background jobs and route their exits through the Runtime (#376) (32a3be2), closes #328
Bug Fixes
-
acp: announce the tool call of a relayed question (#511) (b20f0ee), closes #472
-
acp: answer a failed prompt with the provider’s message (#526) (976c670), closes #519
-
acp: answer a prompt on a busy session with invalid request (#508) (3a50652), closes #473
-
acp: close the tool call of a relayed question (#404) (2dc638c), closes #395
-
acp: declare the client’s MCP servers on session/load (#374) (06e07bd), closes #343
-
acp: decline build-time questions while session/load builds (#405) (98cf668), closes #394
-
acp: re-send the command list after a reload changes it (#535) (a904bc7), closes #521
-
acp: run slash commands instead of sending them to the model (#494) (3924ce5), closes #444
-
acp: send available_commands_update on session/load (#403) (3659b0a), closes #383
-
acp: send each notice as a paragraph of its own (#527) (e665309), closes #520
-
acp: skip blank assistant messages when replaying a loaded session (#509) (85f0aa3), closes #471
-
cli: answer –version and -v with the riffer-rig version (#399) (08ad995), closes #380
-
cli: open the picker for a bare -r followed by another flag (#370) (e01bd20), closes #342
-
cli: recognise clustered short flags such as -pc as headless (#406) (2e28f63), closes #384
-
cli: reject –max-steps values below 1 (#499) (e0e33ad), closes #467
-
commands: confirm the save in /model –save (#500) (7c0035b), closes #464
-
credentials: never overwrite a malformed auth, settings or trust file (#415) (c8d66aa), closes #381
-
credentials: preserve unrecognised auth.json entries on store and remove (#365) (a7d26e7), closes #344
-
credentials: tighten an existing auth.json to 0600 on rewrite (#400) (59765c8), closes #382
-
headless: print the –verbose tool trace in –json mode (#501) (4fba2a0), closes #468
-
headless: refuse a whitespace-only prompt (#498) (633d099), closes #465
-
headless: replace invalid UTF-8 in piped stdin (#482) (1e726f4), closes #451
-
headless: report a missing session before the missing prompt (#507) (60ad490)
-
headless: separate follow-up answers with a blank line in text mode (#505) (4c74399), closes #469
-
headless: serialise non-pair Enumerables in Ndjson as arrays (#357) (0b5e16a), closes #348
-
headless: stop waiting on a silent stdin when -p has a prompt argument (#541) (32d0ca9), closes #529
-
headless: stream stdout to pipes and files as it is written (#484) (3fbc295), closes #452
-
loader: ask again about a trust question left unanswered (#522) (c5e8dae), closes #517
-
mcp: preserve stdio fields in Declaration#with_headers (#310) (90b6f8e), closes #307
-
route missing-session wording through the sessions collaborator (#298) (a22e2bd), closes #283
-
runtime: keep a resumed session’s first user message (#478) (3a1e7e5), closes #441
-
runtime: show the provider’s response body message on HTTP errors (#491) (4e93ec4)
-
runtime: warn about tool allowlist names no extension registered (#485) (da61612), closes #453
-
sdk: return a message when the gem install fails (#369) (1cf5557), closes #351
-
sessions: let –model win over a resumed session’s /model switch (#537) (8233c13), closes #528
-
sessions: resume a session in the directory it was saved in (#544) (6cd8df2), closes #530
-
settings: report a non-string model as a settings error (#510) (5fde7c2), closes #470
-
single credentials install flow, fixing the /auth partial-apply (#295) (d6626d8)
-
stores: keep recording skill activations after a reload (#371) (d81abb2), closes #327
-
stores: skip non-object JSON lines in Stores::JSONL (#361) (14f9d3a), closes #346
-
terminal: announce the exits a follow-up turn actually delivers (#542) (f04e762), closes #532
-
terminal: cancel a credential question on Ctrl-C (#490) (37579b6)
-
terminal: close the session /new or /resume swapped in at exit (#480) (dd3de41), closes #442
-
terminal: confirm /model in one line instead of the banner (#401) (083a2c0), closes #378
-
terminal: fit the banner to narrow terminals (#513) (9a19efa), closes #474
-
terminal: handle Ctrl-C at idle when SIGINT is inherited as ignored (#512) (73d51e7), closes #476
-
terminal: indent and wrap command output like the turn report (#497) (2aadbd0), closes #458
-
terminal: interrupt a streaming reply on Ctrl-C (#416) (0f123dc)
-
terminal: keep a blank row between output and the input row (#534) (01070f4), closes #515
-
terminal: keep a pasted prompt’s line breaks in its echo (#536) (73b73ec), closes #525
-
terminal: keep a whitespace-only line as a paragraph break (#366) (3a402c8), closes #341
-
terminal: keep the columns of a /trace line that wraps (#538) (d24cfc5), closes #524
-
terminal: keep the key reader alive on non-UTF-8 input (#496) (f7382c6), closes #443
-
terminal: make the key pipeline restartable and end-of-input aware (#408) (c2b4787), closes #396
-
terminal: print the missing-session notice below the banner (#514) (2b3a296), closes #475
-
terminal: render a paragraph’s single newlines as line breaks (#479) (fa9d08f), closes #450
-
terminal: render non-object tool-call arguments verbatim (#359) (956ae23), closes #347
-
terminal: replay a job-exit turn on its own when resuming (#493) (24c84c2)
-
terminal: report a bare / instead of sending it to the model (#504) (c66d2ae), closes #460
-
terminal: say sessions are off under –no-save instead of none saved (#506) (777aba0), closes #463
-
terminal: say when a picker filter matches no session (#502) (07b39bd), closes #462
-
terminal: say when the /resume picker closes without a pick (#503) (327d34b), closes #461
-
terminal: show a static hint on the status line while a question waits (#486) (ee53ed5), closes #457
-
terminal: show every reply of a turn a job exit continued (#543) (763558d), closes #531
-
terminal: show the cursor while suspended with Ctrl-Z (#414) (fa6e7b4)
-
terminal: size a table by its header and keep pipes in code spans (#489) (324ba0e), closes #455
-
terminal: stop Wrapper hanging when the width is at or below the indent (#367) (cbbca89), closes #340
-
terminal: treat 0 in the /resume picker as filter text (#362) (ae7516b), closes #350
-
terminal: word-wrap questions with a hanging indent (#540) (16fb443), closes #523
-
terminal: word-wrap the echoed prompt with a hanging indent (#483) (3f357a1), closes #459
-
terminal: wrap a table column at spaces before breaking a token (#518) (6208f11), closes #516
-
terminal: wrap markdown tables to the terminal width (#492) (3b998eb)
-
terminal: wrap prose by display columns and keep its indentation (#412) (40f83ce), closes #385
-
tools: cap background job output and remove it on close (#417) (02a3c5e), closes #391
-
tools: end a background job’s process group after its leader exits (#413) (26de424), closes #390
-
tools: give background bash jobs an empty stdin (#488) (23a1a1c), closes #445
-
tools: keep bash output valid UTF-8 and report sub-second timeouts (#360) (9d74845), closes #345
-
tools: let bash_kill stop a stopped background job (#487) (2b5d13e), closes #447
-
tools: read bash output while the command runs (#407) (3a94502), closes #379
-
tools: replace invalid UTF-8 bytes in read output (#481) (8bc5c8b), closes #446
-
tools: report a background job ended by a signal as killed (#539) (db792ec), closes #533
-
tools: treat a missing background job output file as empty (#402) (8464463), closes #392
Documentation
0.12.0 (2026-10-07)
Features
-
–json streams every Runtime event as NDJSON (#231) (a5e4641)
-
resolve secret MCP headers from env and auth.json (#234) (6253f95)
0.11.0 (2026-10-06)
Features
-
riffer -p runs one prompt headless with exit codes (#226) (eaa91d6), closes #137
-
store entries as typed POROs at the store boundary (#225) (05431e5)
0.10.0 (2026-10-05)
Features
0.9.0 (2026-10-04)
⚠ BREAKING CHANGES
-
optional provider SDKs and the missing-SDK flow (#211)
Features
-
/auth lists, re-runs and removes provider credentials (#213) (ce17f15)
-
/model –save and provider switching through the Loader (#214) (f033caa)
-
extension providers with a setup on the provider seam (#216) (f24f632)
-
JSONL session store appends every Loader-built Runtime (#219) (67c5e80)
-
optional provider SDKs and the missing-SDK flow (#211) (334c94b), closes #127
-
provider-native tools switched on in settings (#217) (6ba2a6a)
-
reload tracked files with /reload (#218) (403de96), closes #132
Bug Fixes
0.8.0 (2026-10-02)
Features
-
discover rig.rb files with project trust and optional gem autoload (#208) (6ed818f)
-
truncate tool output and fit lines to the terminal width (#209) (3765de1)
0.7.0 (2026-09-30)
⚠ BREAKING CHANGES
-
Riffer::Rig::CodingAgent, REPL, TokenTally and the UI namespace are removed, and the old CLI is replaced by the dispatcher. Embed a Runtime through
Riffer::Rig::Loader.runtimeinstead of CodingAgent; the terminal UI classes now live underRiffer::Rig::Terminal. The bash tool now errors when its context has no :cwd. -
DEFAULT_MODEL is gone; with no model the Loader asks the host to onboard and the null host’s refusal is a configuration error. The old Settings module API changes shape.
-
Riffer::Rig::Hosts::Base and Riffer::Rig::Events::Event are removed. A host is any object implementing the five host methods (Riffer::Rig::Hosts::_Host); drop the superclass. A custom event drops the superclass and super(), and includes Riffer::Rig::Events::Value for equality.
Features
-
/model switches the model for the current Runtime (#193) (f888972)
-
bundle Agent Skills with /skill: commands over the skills seam (#201) (e14844d)
-
bundle AGENTS.md as the agents_md prompt section (#198) (e2e9141)
-
bundle read, write, edit and bash as extensions (#195) (d5c9ffe)
-
isolate extension load errors and check requires (#192) (0aac3bf), closes #114
-
lifecycle, vetoable and observe hooks plus the stream passthrough (#194) (206d349)
-
Loader builds a Runtime from settings, credentials and the bundle (#205) (01170fe), closes #123
-
runtime commands with run_command and the command context (#190) (159d007), closes #111
Bug Fixes
Code Refactoring
0.6.0 (2026-09-27)
⚠ BREAKING CHANGES
-
the flat
{"anthropic": "sk-..."}auth.json shape is no longer read, with no migration. Stored keys must be re-entered or rewritten as{"anthropic": {"type": "api_key", "api_key": "sk-..."}}. -
Riffer::Rig::Host is removed. A host subclasses Riffer::Rig::Hosts::Base and implements all five methods; the null host is
Riffer::Rig::Hosts::Null.
Features
Code Refactoring
0.5.0 (2026-09-19)
Features
-
add Runtime with a per-instance agent, base prompt and tool seam (#160) (97019ca)
-
type IO streams and JSON boundaries, dropping explicit untyped (#174) (22407be)
Bug Fixes
-
drain smoother backlog before every animator restart (#177) (3126155)
-
drop invalid ? optional markers from rbs-inline annotations (#171) (60030bf)
0.4.0 (2026-09-13)
Features
Bug Fixes
0.3.0 (2026-09-10)
Features
Bug Fixes
0.2.1 (2026-09-08)
Bug Fixes
-
ui: hide the cursor while a turn is in flight (#161) (0d18fe0)
-
ui: stop the equalizer before the end-of-turn newline (#158) (00edaa3)
0.2.0 (2026-09-08)
⚠ BREAKING CHANGES
-
remove the Riffy mascot entirely (#151)
Features
Bug Fixes
0.1.2 (2026-09-07)
Bug Fixes
0.1.1 (2026-09-07)
Bug Fixes
0.1.0 (2026-09-05)
⚠ BREAKING CHANGES
-
the gem, executable, namespace, config directory and environment variable are all renamed; nothing reads the old names.
Features
-
add prompt caching, token tally, and settings (#7) (bb02a95)
-
multi-provider support (Anthropic, OpenAI, Gemini, OpenRouter) (#32) (30b5ccf)