GitHub - cheapsteak/tbd

2 min read Original article ↗

A macOS native app for managing git worktrees and terminals, designed for multi-agent Claude Code workflows.

TBD gives you a unified interface to spin up isolated worktrees, run Claude Code sessions in embedded terminals, and orchestrate parallel development across branches — all from a single SwiftUI app.

tbd-demo.mp4

Architecture

Three components communicate over a Unix socket using a JSON RPC protocol:

  • tbdd — Daemon that owns all state (SQLite via GRDB, tmux, git)
  • tbd — CLI client for scripting and shell integration
  • TBDApp — SwiftUI app with embedded terminal views (SwiftTerm)

Requirements

  • macOS 15+
  • Swift 6.0+ / Xcode 16+
  • tmux installed (brew install tmux)
  • SwiftLint installed (brew install swiftlint) — required for the pre-push git hook

Build & Run

# Build everything
swift build

# Run the daemon
.build/debug/tbdd

# Use the CLI
.build/debug/tbd --help

# Run the app (or open in Xcode)
open TBDApp.xcodeproj  # if applicable, or:
swift build --product TBDApp && .build/debug/TBDApp

A convenience script rebuilds and restarts the daemon + app:

scripts/restart.sh          # full rebuild + restart
scripts/restart.sh --app    # restart app only
scripts/restart.sh --quick  # skip build

Test

Migrating from Conductor

Adopt your existing Conductor worktrees into TBD in place — no files moved, branches untouched, Conductor keeps working alongside. By default, only active (ready) Conductor workspaces are adopted, and any repos they reference are auto-registered in TBD.

./scripts/import-conductor.sh --dry-run    # preview
./scripts/import-conductor.sh              # run

Flags:

  • --all — also adopt archived Conductor workspaces.
  • --repo <name> — limit to one Conductor repo (e.g. --repo longeye-app).
  • --dry-run — print the plan, don't write anything.

Idempotent — safe to re-run as you create new Conductor worktrees.

Existing Claude session transcripts and conductor.json hooks are picked up automatically — nothing extra to migrate.

Migrating from Claude Code Desktop

Adopt your existing Claude Code Desktop worktrees into TBD in place. Pass any path inside the repo (the main checkout or any worktree); the script resolves to the main repo root and adopts every worktree under .claude/worktrees/. Repos not yet in TBD are auto-registered. Directories named agent-* (scratch worktrees from one-shot agent runs) are skipped by default — pass --include-agents to adopt them too.

./scripts/import-claude-code-desktop.sh --repo ~/projects/acme-app --dry-run
./scripts/import-claude-code-desktop.sh --repo ~/projects/acme-app

License

MIT © 2026 Chang Wang