synchrobuilder, and the marketplace is in the public repository RyanNorouzi/synchrobuilder. Every command on this page is available. What each claim rests on is in docs/VERIFICATION.md.| Requirement | Why |
|---|---|
| Claude Code, a current version | The docs we read describe Claude Code up to 2.1.276. Our experiments ran on 2.1.218 on macOS. The /plugin command needs a release that has it; the docs say to upgrade with brew upgrade claude-code or npm install -g @anthropic-ai/claude-code@latest. |
Node.js 20 or newer on PATH | Every hook is declared in exec form as the node executable plus a script path, with no shell. Claude Code resolves node from the PATH it inherited. If node is missing, every hook shows a non-blocking error notice and the plugin does nothing (experiment E3). Node 20 is the floor. CI runs the suite on Node 20 and Node 24. |
git on PATH | The docs say Claude Code clones a git-hosted marketplace onto your machine, so adding one needs git. The multiplayer transport publishes state through your existing git remote, so the background worker needs git too. The hooks themselves never spawn git. |
The Node requirement is the one to check first. A hook cannot fix a missing node from inside itself, because Claude Code resolves the executable before any of our code runs. The /synchrobuilder:doctor checks node and git on PATH and reports the fix for your OS.
$ env -i HOME=… PATH=/usr/bin:/bin claude -p "…" --plugin-dir …/plugin --output-format stream-json … # every hook_response event: "stderr":"Error occurred while executing hook command: Executable not found in $PATH: \"node\"","exit_code":1,"outcome":"error" # result event: exit 0, is_error: false the file was still created; Claude saw no hook context
Recorded with the Phase 0 experiment plugin rather than the shipped hooks. The same fail-open contract is now covered by tests/hooks/replay.test.mjs, which asserts exit 0 on malformed stdin, an unknown verb and outside a git repository.