Skip to content
vxvx
GitHubBlueskydev.toRSS
Releases

vx speaks to agents

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.632: vx speaks to agents

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.

Terminal window
$ 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.

Terminal window
$ 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.

Terminal window
$ 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.

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.

Terminal window
$ vx run build --all --affected=HEAD --dry
would 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.

Terminal window
vx init --native

PRs #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

  • The cache format is now 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.

Terminal window
npm install -D @vzn/vx@latest

A standalone binary updates itself with vx upgrade.

Turborepo, Nx and other product names are trademarks of their owners. vx is not affiliated with or endorsed by them.