compforge/baton
A terminal-native workspace for Codex, Claude Code, and DeepSeek Harness, built on durable cross-harness sessi
A terminal-native workspace that lets Claude Code, Codex and DeepSeek Harness share one durable conversation, so context stops being carried by hand between agents. Switching targets, models and modes keeps each harness's native experience while a user-owned BatonSession unifies history — you can continue, fork, adopt native sessions, or reference any listed session in a later prompt with @bs_01.... Switch commands route immediately, e.g. /cx review this diff or /cc implement the fix. Plugins from local or Git Marketplaces lets one chat become a long-running workflow where a Plugin asks for decisions, prepares editable drafts, wakes on schedules or resource changes and delegates to side lanes — each third-party Plugin runs in its own supervised process, so a crash does not take over the terminal and provider credentials stay in the harness that owns them. Everything baton stores lives under ~/.baton/; it never edits the harnesses' own native session files.
Install
npm install -g @compforge/batonREADME install: npm install -g @compforge/baton, or try it without a global install with npx @compforge/baton. You also need at least one supported runtime — an authenticated Codex CLI, Claude Code, or provider credentials configured in DeepSeek Harness (the official DSH SDK includes its matching runtime). Start the TUI with baton in your project; on first run it creates ~/.baton/config.yaml with defaultTarget and per-target definitions (the README's example wires codex, a second Codex home, claude and dsh with model: deepseek-flash). npm @compforge/baton 0.4.26 verified 2026-09-12 — note the registry repository field points at github.com/qiankunli/baton.
Compatibility
Requires a supported runtime: authenticated Codex CLI, Claude Code, or DeepSeek Harness with configured provider credentials. baton reuses each harness's existing credentials rather than copying secrets; dshHome, patches and dshBin settings are documented in the DSH adapter guide. Desktop notifications use OSC 9 on iTerm2, WezTerm, Kitty, Ghostty and Warp (tmux 3.3+ needs allow-passthrough on), with a bell fallback via notifications: { enabled: true, bell: true }.
Details
- Repo: compforge/baton
- Category: Web UI Enhancements
- Stars: 6
- Version: 0.4.26 (npm @compforge/baton; registry repository field → github.com/qiankunli/baton, verified 2026-09-12)
- Last push: 2026-09-15
- First seen: 2026-07-09
Recent updates
The README documents session handling in detail: baton -c continues the latest session in a project, -s opens one by id, resume continues the source while fork branches, baton sessions lists referenceable sessions, and baton clean scans all projects (skipping active sessions) to permanently remove BatonSession directories inactive for over 30 days, including logs and Plugin-owned data, with --cwd to limit the scope.
FAQ
- How do I install baton?
- npm install -g @compforge/baton (or npx @compforge/baton). You also need at least one runtime it can drive: an authenticated Codex CLI, Claude Code, or provider credentials configured in DeepSeek Harness.
- How do I move context from Codex to DeepSeek Harness?
- Switch with /dsh (or /deepseek) and keep working — the BatonSession is owned by you, not by any harness, so history is durable. You can also reference an earlier session in a prompt with @bs_01..., or use baton resume / baton fork to continue or branch it.
- Where does baton keep my data and credentials?
- Configuration, attachments, Plugins, projects and session history live under ~/.baton/. baton never edits the harnesses' native session files and reuses each harness's existing credentials instead of copying provider secrets.