Upgrading
From 0.4 to 0.5
Version 0.5 is about seeing everything that was done: the history of finished work, the
activity of every task in one feed, the complete trace of each tool call, and a native macOS
app on vibe serve. Existing .vibe/config.toml files keep working, and runs started with
0.4 can be resumed with 0.5.
Upgrade
cargo install --git https://github.com/vincentlauriat/vibe-factory --tag v0.5.1 vibe-cli --force
vibe --version # vibe 0.5.1
vibe doctor
Nothing on disk needs converting and the event schema stays 2: 0.5 only adds optional
fields and two event types (committed, merged), which older clients must ignore anyway.
Logs written by 0.4 still load, with what they lack shown as such: vibe trace pairs their
tool calls with their results by order (paired: by order) and has only the 200-character
previews of their outputs, and vibe history marks their token and time totals as lower
bounds (+) unless run.json still describes the run, and shows no cost for them (their
model is not recorded). See Logs recorded before 0.5.
task.json gains a branch field, recorded the next time a run opens the task’s workspace.
Until then vibe pr, vibe task show and vibe task discard compute the branch from the
title as before.
Behaviour that changes by default
Complete tool outputs are kept. Every tool call’s output is written to
.vibe/tool-output/<task dir>/<run>/<call>.txt, at most 100 000 characters per call, so the
directory grows with every run. It is ignored by git (vibe init has always put
tool-output/ in .vibe/.gitignore; check that yours has it), removed per task by
vibe task discard, and can be limited or turned off:
[pipeline]
trace_max_chars = 20_000 # keep less per call
trace_outputs = false # or keep nothing but the previews in the log
Outputs may contain secrets printed by tools; they never leave your machine. See Tool call trace for disk usage and privacy.
vibe events <REF> --follow follows a resumed run to its end. It used to stop at the
run_finished left by an earlier pause of the same run. It also stops at the end of the run
when --after (or the new --type and --since) hides the run_finished event, where an
--after beyond it used to follow forever.
The web UI reads one event stream. The page opens a single GET /api/stream for the
whole project (after loading the recent events with GET /api/events) instead of one
stream per selected task. The per-task routes (/api/tasks/{ref}/events and
/api/tasks/{ref}/stream) are unchanged, so the VS Code extension and other clients keep
working. A task reference that matches several tasks is now answered with 400 instead of
500 on every route.
vibe tui has three screens (T Tasks, A Activity, H History) and a Trace tab.
Esc still quits from the Tasks board; on the other screens it closes what is open and
goes back. In the Trace tab, ↑ ↓ select calls instead of tasks.
New settings
| Key | What it does | Page |
|---|---|---|
pipeline.trace_outputs | keep the complete output of every tool call (default true) | Tool call trace |
pipeline.trace_max_chars | characters kept per call (default 100000) | same |
[pricing."<provider>/<model>"] | prices per million tokens, to show a cost in the history (none by default) | [pricing] |
New commands and options: vibe history [REF] [--all], vibe trace <REF>, vibe events
without a task (with --since, --type, --task, --follow), --since and --type for
vibe events <REF>, and vibe serve --exit-on-stdin-eof. New server routes:
GET /api/events, GET /api/stream, GET /api/history[/{ref}],
GET /api/tasks/{ref}/trace and GET /api/tasks/{ref}/trace/{call}/output; see
vibe serve.
The macOS app
apps/macos/VibeFactory is a SwiftUI client of vibe serve for macOS 14 and later. It
starts vibe serve --exit-on-stdin-eof for the project it opens, so it needs the 0.5
vibe on the machine. A signed, notarized DMG is attached to each release since v0.5.0; the app
then updates itself (Check for Updates…). Its README explains how to build it from source.
For library users
The Rust API is pre-1.0 and 0.5 changes it in a few places. Code that only uses the vibe
command line is not affected.
vibe_core::Eventhas two new variants,CommittedandMerged, and new fields:AgentStarted::model,ToolCalled::{call, subtask},ToolReturned::{call, subtask, exit_code, timed_out, output_chars, output_file}andRunFinished::{usage, active_ms, started_at}. Amatchneeds the new cases (or a wildcard) and..in struct patterns; code that builds these events must fill the fields.vibe_core::CallIdidentifies a tool call.Taskhas a newbranchfield,PipelineConfignewtrace_outputsandtrace_max_charsfields, andVibeConfigapricingtable ofModelPrice: use..Default::default()rather than full struct literals.vibe_agents::ToolTraceandAgentRunner::tool_tracewrite the complete output of each call;RunContexthas a newtool_tracefield andRunContext::committakes the subtask the commit belongs to (Nonefor checkpoints and fixes).PipelineStorehas three new methods with defaults,task_dir_name,task_numbersandis_running; implement them in a custom store to name trace directories after the task and to report running tasks.vibe_pipelinehas a read layer (ADR-008): the modulesevents_log(EventReader,TaggedEnvelope,EventCursor,AllEventsFollower),history(TaskHistory,task_history,project_history) andtrace(RunTrace,Call,run_trace,read_output).vibe-pipelinenow depends onvibe-workspace(read-only git queries of the history).
From 0.2 to 0.4
Version 0.4 includes the work planned for 0.3 (streaming, numbered events, human approvals,
the run manager and the terminal UI) and for 0.4 (vibe serve, the web UI, integrations).
There was no 0.3 release. Existing .vibe/config.toml files keep working, and runs started
with 0.2 can be resumed with 0.4.
Upgrade
cargo install --git https://github.com/vincentlauriat/vibe-factory --tag v0.4.0 vibe-cli --force
vibe --version # vibe 0.4.0
vibe doctor
Nothing on disk needs converting. Events written by 0.2 in events.jsonl have no schema
or seq field: they read as schema 1 and are not replayed by vibe events; a resumed run
numbers its new events from 1. run.json gains approval fields that load empty.
Behaviour that changes by default
Answers are streamed. Anthropic and OpenAI-compatible providers now use server-sent
events, and vibe --json prints agent_delta lines while a step is generated (they are not
kept in events.jsonl). For a gateway that mishandles streaming, set
stream = false in its [providers.<name>] table. See Streaming.
Project memory is on. Lessons of a finished task are kept in .vibe/memory.jsonl and
the relevant ones are recalled by later tasks. Turn it off with
pipeline.project_memory = false; vibe memory list and vibe memory clear inspect and
reset it.
One process per task. A second vibe run on a task that is already running fails
instead of racing the first one; vibe cancel <task> stops a run from another terminal.
Anthropic thinking. Current Anthropic models (Claude 4.6 and later, including the
default claude-sonnet-5) get adaptive thinking with an effort level and no temperature,
which they require. Older models keep the token budget form; extra.thinking forces either.
New settings, off by default
| Key | What it does | Page |
|---|---|---|
pipeline.approvals | pause for vibe approve / vibe reject after spec, plan or before merge | Human approvals |
security.web_allowed_domains, security.search_url | limit web_fetch to some domains; the SearXNG-compatible endpoint that registers web_search | Configuration |
[integrations.github], [integrations.gitlab] | vibe task import and vibe pr | CLI |
New commands: vibe events, vibe approve, vibe reject, vibe cancel, vibe tui,
vibe serve, vibe memory, vibe task import and vibe pr. A run paused for an approval
exits with code 2, like any run that waits for a human.
For library users
The Rust API is pre-1.0 and 0.4 changes it in a few places. Code that only uses the vibe
command line is not affected.
vibe_core::Eventhas new variants (AgentDelta,ValidationFinished,SubtaskIntegrated,BudgetUpdated,ArtefactWritten,ApprovalRequested,ApprovalResolved); amatchon it needs a wildcard arm or the new cases.vibe_core::Envelopehas newschemaandseqfields: build one withEnvelope::now.ModelProvider::complete_streaminghas a default that callscomplete; implement it to stream.StreamDeltaandDeltaSinkare new.PipelineConfighas newapprovalsandproject_memoryfields, the provider configuration astreamfield,SecurityConfigweb_allowed_domainsandsearch_url, andConfiganintegrationstable: use..Default::default()rather than full struct literals.vibe_pipeline::RunManagerstarts, resumes, cancels and lists runs and is the seam every interface uses (ADR-007).RunStatehas new approval fields.
From 0.1 to 0.2
Version 0.2 is about reliability. Existing .vibe/config.toml files keep working, and runs
started with 0.1 can be resumed with 0.2. This page lists what changes when you upgrade and
what you may want to turn on.
Upgrade
cargo install --git https://github.com/vincentlauriat/vibe-factory --tag v0.2.0 vibe-cli --force
vibe --version # vibe 0.2.0
vibe doctor
Nothing on disk needs converting. run.json gains new fields (validations,
validation_fix_attempts, pending_validation_fix, usage, active_ms); files written by
0.1 load with empty or zero values, so a resumed 0.1 run starts its budgets from zero.
Behaviour that changes by default
One worktree per subtask attempt. With the default git_worktree workspace, every
subtask attempt now runs in its own worktree and branch (<task branch>--s<N>-a<attempt>)
and is merged into the task branch as soon as it is done. You will see:
- a
vibe: checkpoint before buildcommit when the task worktree had uncommitted work; - one
vibe: complete subtask N - <title>commit per subtask, and merge commits when parallel subtasks finished out of order, instead of grouped commits (vibe: complete subtasks 2, 3 - …); - temporary
…--s2-a1worktrees under.vibe/worktrees/and branches while a build runs, removed after each attempt.
A subtask whose changes conflict with work integrated while it ran is retried from the updated task branch, which can cost one more attempt than in 0.1. To keep the 0.1 behaviour (parallel subtasks share the task worktree), set:
[pipeline]
isolate_subtasks = false
in_place and plugin workspaces are unchanged. See
One worktree per subtask attempt.
Exit code 2 has one more meaning. vibe run also exits with 2 when a run budget is
exhausted (see below). Scripts that treat 2 as “QA needs a human” should read
run_status and last_error in the --json summary.
Plugin timeouts no longer close the plugin. A request that times out while its line is being written used to close the plugin’s input. Writes now go through a single writer task that never leaves a partial line, so the plugin stays usable after a timeout. A request cancelled before its turn is not sent at all.
New settings, off by default
All of these are optional; leaving them out keeps the 0.1 behaviour.
| Key | What it does | Page |
|---|---|---|
pipeline.validation_commands | shell checks that must pass before ready or a merge, run by the pipeline itself | Required validation commands |
pipeline.max_validation_fix_attempts | automatic fixes of failed checks over the whole run (default 2) | same |
pipeline.max_tokens | pause a run after this many tokens, resumes included | Run budgets |
pipeline.max_duration_secs | pause a run after this much active time, resumes included | same |
pipeline.workspace = "container" | run the agents’ shell commands in a container | Container workspace |
vibe run gains --max-tokens and --max-duration to set the budgets for one invocation.
A reasonable starting point for a Rust project:
[pipeline]
validation_commands = ["cargo fmt --all -- --check", "cargo test --offline"]
max_tokens = 3_000_000
max_duration_secs = 7200
For library users
The Rust API is pre-1.0 and 0.2 changes it in a few places. Code that only uses the vibe
command line is not affected.
vibe_core::PipelineConfighas new public fields (validation_commands,max_validation_fix_attempts,isolate_subtasks,max_tokens,max_duration_secs). Build it withPipelineConfig { …, ..PipelineConfig::default() }rather than a full struct literal.vibe_pipeline::PipelineDepshas a newsubtask_workspacesfield. PassNoneto share the task workspace between subtasks, orSome(Arc::new(GitSubtaskWorkspaces::new()))with a git worktree workspace.vibe_pipeline::RunContexthas newbudgetandsubtask_workspacesfields, andRunStatenewvalidations,validation_fix_attempts,pending_validation_fix,usageandactive_msfields.WorkspaceProviderhas a newmerge_validatedmethod used when validation commands are configured withauto_merge. Its default fails closed: a custom provider must implement it to support validated automatic merges.- New traits and types:
vibe_core::SubtaskWorkspacesandSubtaskIntegration(implemented byvibe_workspace::GitSubtaskWorkspaces),MergeValidator, andRunBudget,BudgetLimits,BudgetExceeded.AgentRunner::budgetattaches a budget to an agent run; a reached limit stops it like a cancellation.