Repository navigation
Reef 0.4.0
Phase 2's last rows: the Python and TypeScript SDKs, both named reef-vcs and published to PyPI and npm by this release's workflow. Brief reef status and reef diff read at an operation now say which operation they read, reef history -o text names the authors of changes no Reef agent wrote, and the remote listener answers errors in a form every gRPC client reads. Two fixes come from trying 0.3 on a large monorepo: a workspace create waits up to 5 minutes instead of failing at 30 s, and reef init adds Reef's MCP entry without reformatting .mcp.json. Phase 2 is complete.
Upgrading from 0.3
Nothing to migrate. The API revision (14) and the database schema (6) are those of 0.3, so a 0.3 daemon serves the 0.4 CLI. Restart it anyway, once reef ws list shows no active workspaces (reef daemon stop; the next command starts 0.4's), for the remote listener's fix below, which the SDKs need when they reach a daemon remotely.
Added
- The Python SDK (ADR 0054,
docs/python-sdk.md):pip install reef-vcs, thenimport reef. Every API call is a typed method onreef.connect()'s client and onreef.aio's, generated from the schema, with page iterators and streams. The daemon's errors arrive as exceptions by kind, withreason,hintandnext. The SDK finds the daemon as the CLI does and reaches a remote one with its key pinned before the token is sent.client.workspace(...)holds a workspace for a block of code asreef ws rundoes for a command: lease heartbeats, a presence entry, and a release with a final snapshot. Published to PyPI by each release. - The TypeScript SDK (ADR 0054,
docs/typescript-sdk.md):npm install reef-vcs, thenimport { connect } from "reef-vcs". ESM for Node 22.15 and later, loadable byrequire(). Every API call is a typed async method, generated from the schema, with page iterators and streams; messages are inreef-vcs/api/v1. The same error classes, discovery, remote pinning (checked in every TLS handshake) and workspace block as the Python SDK, the block both asawait usingand aswithWorkspace(...). Published to npm with provenance by each release.
Fixed
reef ws create,reef ws runand the MCPcreate_workspacetool wait up to 5 minutes for a workspace create, not 30 s, so a create in a large repository that checks the whole tree out into the base cache (the first, and on the overlay or copy backend each new tree) no longer fails partway.--timeoutstill sets the deadline. A create that runs past 5 s says why on stderr, and one that reaches its deadline says that the checkout goes on and that running the command again waits for it (#188).reef initadds Reef's MCP server to an existing.mcp.jsonoropencode.jsonwithout reformatting it: the rest of the file keeps its indentation (tabs or spaces), line endings, one-line arrays, number and string spellings and final newline, and only Reef's lines are added (#190).reef initskips a.mcp.jsonoropencode.jsonwith comments or trailing commas with a reason that quotes the entry to add by hand, as it does foropencode.jsonc, instead of calling it "not a JSON object"; a file that already has Reef's entry is skipped with a reason that asks to check that Claude Code (or opencode) reads a file with comments (#190).- Piped
reef statusandreef diffread at an operation (--at-op,--at) keepat_operation, the full id of the operation read, so brief JSON says when its answer is not about now; so does the MCPget_difftool when called withat_operation. Their text read at an operation starts withAt operation <id>, with the operation's time forstatus. Reads at head print what they did (#126). reef history -o textnames a change's author, as<email>, when no Reef agent wrote it (committed or fetched outside Reef, or written by another jj client), and no longer lists-beside the agents of a change that has some (#115).- The remote listener sends a service's error as a trailers-only answer, its HEADERS frame ending the stream. It used to send the headers and then an empty DATA frame, which tonic accepted and other gRPC clients (grpcio) refused as "Stream removed".