Repository navigation
Releases
chord 0.3.1
pi support
chord now runs pi agents beside Claude Code, Codex and OpenCode:
chord pi [--name <agent>] ...
- chord loads an extension into pi with
-e, so nothing under~/.piis written. The extension registers chord's MCP server for the session withdirectexposure (pi's default,codemode, would hide the tools from the model) and a ten minute timeout forfinish. - The extension routes pi's
session_start,before_agent_start,tool_call,tool_result,agent_before_settle,agent_settledandsession_shutdownto chord's hooks: the briefing and reminder arrive as one custom message, an unclaimed write is blocked with the reason the model reads, messages that arrive mid-turn ride on the tool result, a message waiting at the end of a run makes pi take one more run, and an agent is idle once pi has settled, after an Esc too. - Hooks know pi's
editandwrite, whosepathis relative to the project folder or absolute. chord resumereopens a pi session with--session;--no-mcpis refused because chord's tools would go with it. The exit command is/quit; pi's OSC 7501 state reports are read as Codex's are.- Both READMEs link to the short film on Bilibili.
Verified against pi 1.4.0 with a scripted model on Windows: briefing, refusal, claim over MCP, write, a peer message holding the agent for one more run, idle, session end and resume. Not yet run with a live model through the terminal wrapper, nor on Linux or macOS.
chord 0.3.0
OpenCode support
chord now runs OpenCode agents beside Claude Code and Codex:
chord opencode [--name <agent>] ...
- OpenCode is configured through
OPENCODE_CONFIG_CONTENT: chord's MCP server and a plugin, named by file URL, so your own config,OPENCODE_CONFIG_DIRand the project'sopencode.jsonstay in force. - The plugin routes OpenCode's
chat.message,tool.execute.before/afterandsession.idleto chord's hooks: the briefing and reminder arrive as synthetic parts, an unclaimed write is refused with the reason the model reads, messages that arrive mid-turn ride on the tool output, and idle agents are woken through the prompt. - Hooks know
edit,write,apply_patchand the bashworkdir. chord resumereopens an OpenCode session with-s;--pureis refused because it would unload the plugin.- The pty wrapper runs the binary behind a
.cmdshim that wraps an.exe, which is howopencode-aiinstalls on Windows.
Verified against OpenCode 1.19.5 with a scripted model: refusal, claim, write, claim clash with a message, wake-up, finish, resume and stop. chord's MCP tools run without a permission prompt.
chord 0.2.2
The npm package page shows the English README again: npm had been picking README.zh-CN.md, now README-zh-CN.md, which it ignores. No code changes since 0.2.1. The 0.2.1 changes have now also passed the test suite on macOS in CI.
Full changes: v0.2.1...v0.2.2
chord 0.2.1
macOS
chord-cli installs on macOS: the package allows the platform and sets the execute bit on node-pty's spawn helper, which the prebuilt package ships without. Codex's state=done report counts as idle.
Work that was lost or unprotected
chord cleanno longer removes a worktree whose git link is broken; a failinggit statusis reported as held work instead of taken for a clean tree.finishrefuses to merge while a file you claimed sits untracked in the worktree, so agit commit -athat skipped a new file no longer leaves main with half the change.- The merge lock names its holder: a dead holder loses it at once, a live one keeps it through a long test run, and only the owner removes it.
- An agent still running its setup command, or waiting for Codex's first start, is no longer swept offline after thirty seconds, and the wrapper no longer drops messages or a stop request that arrived meanwhile.
- A machine waking from sleep no longer takes some agents offline because their wrappers woke a second apart.
- Writes through a junction or symlink are checked against the claims and the main checkout like any other.
Smaller fixes
- An agent with only merge notices unread may stop; a subagent's tool calls no longer consume the agent's messages.
- Shell warnings: a claimed file inside a new directory covers the directory; the dirty-main warning uses the same rule as
finish. Parser.parseoverlaps withParserandparsewhen claims compare symbols.- Codex state reports are read once and only when complete; submodules with non-ASCII names are checked; project paths fold case on macOS.
claim()reads<repo>/xas a repository path and explains the two spellings that reach your copy when that can only have meant the old form.- The MCP server reports the package version; the log rotates at 16 MB.
Faster
- One
git diffinstead of eight subprocesses after every shell command. - No fsync per heartbeat: the database runs with
synchronous = normalunder WAL. - Hooks load fewer modules;
finishmakes onerev-parsecall instead of four.
Also
- Schema version 4 drops two columns nothing read.
- The READMEs now describe trust, the Codex sandbox and conflict handling as the code does, and the demo shows the current
chord lscolumns.
Full changes: v0.2.0...v0.2.1
chord 0.2.0
Agents run in the project folder
chord claude and chord codex now start the tool in the project folder, the directory you run it in yourself, so that stays its project: one /resume list, one CLAUDE.md, one trust answer. Each agent still works in its own worktree under chord/agents/<name>/. Writes to the main checkout or another agent's worktree are refused with the path of the agent's own copy, and a shell command that ran in the main checkout gets a warning.
The hooks record each agent's conversation id, so chord resume <agent> reopens exactly that conversation for Claude and Codex alike. Agents started with earlier versions have no recorded conversation; start them again with chord <tool> --name <agent>. chord no longer writes trust entries to ~/.claude.json.
Readable commands
chord lsfits the terminal width (CJK counts as two cells), showsbusy,idleoroff 3d, counts only real messages as unread and lists each agent's claims under its row.chord messagesprints one line per send, naming up to three recipients, and drops the sentence meant for agents.chord cleansays what is held (unmerged commits, uncommitted changes) and names the agents a--forcewould hit;-fworks.chord --helpdescribes every command;chord --versionexists; unknown commands and arguments are reported instead of ignored.- Timestamps from another day read
Oct 17 23:39; a quitting agent is told how to come back. - A wrapper killed with its pid reused is no longer shown online for ever:
ls,cleanandstopwatch stale heartbeats for a moment first.
Also
- A Chinese README (
README.zh-CN.md). - The database upgrades itself to schema version 3 on first open; the migration runs under a write lock.
Full changes: v0.1.3...v0.2.0