Skip to content

v0.5.0

Choose a tag to compare

@hamzahamidi hamzahamidi released this 18 Aug 20:20
· 28 commits to main since this release
788cf01

Highlights

  • The MCP protocol moves out of the command line into one internal BridgeSession: spawn the child, negotiate initialization in specification order, allocate request ids, validate replies before anyone reads them, then terminate and reap. cic list and cic call are now create-session, one call, close.
  • The one-shot contract is unchanged. The proof a refactor changed nothing is the old tests passing untouched, so that came first: all 120 checks from 0.4.1 ran green against the new core before a single new test was written. Same stdout, stderr, exit codes and frozen --json shape.
  • Adds --retries <n>, restricted to failures that never reached the browser. Exit 3 is the only retryable class by definition; an exit-2 unknown outcome is never retried whatever the flag says, because repeating a click is a second action rather than a second look at the first.
  • CI runs on Ubuntu, macOS and Windows across Node 22 and 24, six legs, none cancelling the others.

Install

npm install -g claude-in-chrome-cli

Plugin users need nothing new: the CLI ships bundled at node ${CLAUDE_PLUGIN_ROOT}/bin/cic.js.

Windows, stated precisely

Both Windows legs pass, and the assertions say what they actually prove. A child there cannot refuse a signal, because Node maps kill() to TerminateProcess, so the test that demonstrates SIGTERM escalation on POSIX demonstrates only that the client asked on Windows, and its label says so. Two tests stay POSIX-only and print a visible skip with the reason rather than being weakened into assertions that pass everywhere: the EPIPE pipeline needs a POSIX shell, and the detached-descendant shutdown test needs POSIX fd inheritance. The README does not yet claim Windows support, because the matrix proves the contract and parser suites there, not the process-lifecycle guarantees.

Three bugs worth naming

Review of this release found two defects in the new core, both invisible to one-shot use and both fatal to the reuse it exists for. The dispatched flag was set after the request write resolved, leaving a window where the child had already received the request and replied badly or died while the session still reported nothing dispatched: the failure was then classified exit 3, and --retries would have repeated an action that had already run. The flag now leads the write. Separately, four listeners per request were never detached, so twelve sequential calls on one session reached thirteen data listeners and Node began warning about a leak.

A third came from writing --retries itself, and it is the same family as the 0.4.0 output truncation: the backoff timer was unref'd, so it did not hold the event loop open. By the time a retry waits, the child is dead and its pipes destroyed, so nothing else held it either, and Node exited cleanly with code 0 mid-backoff, reporting success for a call that never happened.

Known limit, carried to 0.6.0

Each request owns its own reader and buffer, so bytes arriving between calls are dropped. Serialized one-shot use never sees this; a long-lived streaming session needs one persistent reader with a per-id waiter map instead.

Verified

142 checks across four offline suites, no Chrome and no extension required. Coverage 95.98% of statements, 85.33% of branches, 51 of 51 functions. The published tarball is 5 files. Installed from the registry, cic --version reports 0.5.0, cic list returns 22 live tools through a real bridge, and a missing binary still exits 3. Provenance attached and verifiable with npm audit signatures.

Full changelog: v0.4.1...v0.5.0