
Runs that explain themselves
A live run now says how long is left, vx why follows a re-run to the file that caused it, and a bad config points at its line.
vx run speaks JSON, every refusal has a stable code, and vx mcp plans and runs tasks. vx init moves a Turbo or Nx repo to vx in one command.

vx 0.0.626 to 0.0.632 shipped on 2026-10-08 and 2026-10-09. This batch
makes vx easy for an AI agent to drive: results as JSON, errors with
stable codes, failed output an agent can act on, and an MCP server that
runs and plans tasks. It also makes vx init the one command to adopt a
Turbo or Nx repo.
In this release
vx run --format json prints one result object on stdout: each task’s
status, exit code, duration and key, plus the time the cache saved and
the critical path. An agent reads one value instead of parsing a log.
$ vx run build --all --format json 2>/dev/null{ "runId": "01a11f0d-014c-700d-a4ad-59e93a00a129", "ok": true, "exitCode": 0, "savedMs": 1270, "tasks": [ { "id": "@demo/api#build", "status": "cache-hit", "durationMs": 3, ... }PRs #3271, #3296. Deep dive: Built for agents
Every refusal now carries a VX_E_ code that does not change between
versions, so a script or an agent branches on the code, not the wording.
Unknown verbs, usage mistakes and the reading verbs’ refusals are coded
too.
$ vx run biuld --all --format json{"ok":false,"error":{"code":"VX_E_UNKNOWN_TASK","message":"vx run: no projects declare task(s): biuld. Did you mean build?"}}PRs #3298, #3321, #3324. Deep dive: Error codes
A failed task’s output is kept for vx last --failed, and every
file:line:col in it becomes a location an agent can open and a
terminal can click.
$ vx last --failed --format json | jq '.tasks[] | select(.output != "") | {status, locations}'{ "status": "failed", "locations": [ { "file": "/work/demo/packages/ui/src/index.ts", "line": 3, "col": 7 } ]}vx last --log <task> prints one task’s output from a recorded run, so an
agent reads only the log it needs. vx also ships an agent skill
(skills/vx/SKILL.md) and the JSON schemas the docs point at.
PRs #3273, #3264, #3325, #3288
@vzn/vx-mcp gained new tools: runTasks runs tasks and returns the
JSON result, planTasks returns what a run would do without running it,
listTasks narrows by --filter and --affected, getConfig returns a
task’s resolved config, getTaskLog returns one task’s output, and
whyDidThisRerun answers like vx why, root cause included.
mcp({ run }) limits runTasks to named tasks or turns it off.
flowchart LR A[agent] -->|planTasks| P[what would run] A -->|runTasks| R[JSON result] A -->|whyDidThisRerun| W[root cause] style R stroke:#c6f84e,stroke-width:2px
PRs #3289, #3303, #3320, #3300, #3338, #3330. Deep dive: Agents and MCP
--dry now prints, under each task --affected kept, the changed file
that kept it and the dependency it came through.
$ vx run build --all --affected=HEAD --drywould run: ▶ @demo/docs#build cache miss — would exec e50d7ee9 ~309ms affected: packages/ui/src/index.ts changed (an input), via @demo/ui#build ▶ @demo/ui#build cache miss — would exec e212d097 ~312ms affected: packages/ui/src/index.ts changed (an input)PR #3276. Deep dive: See inside a run
In a repo with turbo.json or nx.json, vx init runs
@vzn/vx-migrate. It asks whether to write native config (a
vx.config.ts per package) or keep the repo’s own config live;
--native and --keep answer up front. A Turbo remote cache or a
self-hosted Nx cache the repo already uses is kept.
vx init --nativePRs #3258, #3237. Deep dive: From Turborepo
A task’s stdout and stderr are now stored as one ordered log, so a cache hit replays stderr too, in the order the task wrote it. Live and on a hit, a task’s output prints as one section.
PRs #3251, #3248. Deep dive: Inside a cache hit
@vzn/vx-reapi connects an endpoint with no scheme over TLS, as Bazel
does; plaintext takes grpc:// or tls: false. A remote result can now write only the
outputs the task declares.
reapi({ endpoint: 'grpc://localhost:8980' })PRs #3265, #3256. Deep dive: Remote execution
vx-cache-v42: every cached task misses once after upgrading (#3251).@vzn/vx-reapi: an endpoint with no scheme now uses TLS; a plaintext server needs grpc:// (#3265).See Upgrading.
npm install -D @vzn/vx@latestA standalone binary updates itself with vx upgrade.