Skip to content

Reef 0.4.0

Choose a tag to compare

@github-actions github-actions released this 04 Nov 04:59
· 4 commits to main since this release
aa27f40

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, then import reef. Every API call is a typed method on reef.connect()'s client and on reef.aio's, generated from the schema, with page iterators and streams. The daemon's errors arrive as exceptions by kind, with reason, hint and next. 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 as reef ws run does 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, then import { connect } from "reef-vcs". ESM for Node 22.15 and later, loadable by require(). Every API call is a typed async method, generated from the schema, with page iterators and streams; messages are in reef-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 as await using and as withWorkspace(...). Published to npm with provenance by each release.

Fixed

  • reef ws create, reef ws run and the MCP create_workspace tool 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. --timeout still 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 init adds Reef's MCP server to an existing .mcp.json or opencode.json without 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 init skips a .mcp.json or opencode.json with comments or trailing commas with a reason that quotes the entry to add by hand, as it does for opencode.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 status and reef diff read at an operation (--at-op, --at) keep at_operation, the full id of the operation read, so brief JSON says when its answer is not about now; so does the MCP get_diff tool when called with at_operation. Their text read at an operation starts with At operation <id>, with the operation's time for status. Reads at head print what they did (#126).
  • reef history -o text names 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".