Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

wt-dash

A local, repo-first web board for triaging git worktrees across parallel coding-agent sessions. It discovers every repo under your roots, classifies each worktree by lifecycle, surfaces PR / CI / review state, and does the cleanup itself. Zero runtime dependencies (Node ≥ 18 + git; gh optional for the PR panel).

Demo

wt-dash demo

Board overview → a worktree's PR / changes detail → filtering by lifecycle (In review, Reclaimable).

Install / run

# from anywhere
node /path/to/wt-dash/wt-dash.mjs serve      # → http://127.0.0.1:4600

# or link it as a command
cd wt-dash && npm link      # then:  wt-dash serve

# first-time checks
wt-dash doctor              # verifies git, gh, editor, terminal, claude, roots

By default it scans the current working directory. Point it at your code roots via a config file or env (see below).

Configuration

~/.wt-dash/config.json (all fields optional):

{
  "roots": ["/path/to/your/code"],
  "bases": ["prod"],
  "editor": "code",
  "prSkill": "create-pr",
  "onCreate": ["cp ../<repo>/.env .env", "npm install"],
  "attentionStaleDays": 7,
  "maxDepth": 4,
  "staleDays": 14,
  "port": 4600,
  "host": "127.0.0.1",
  "ignoreDirs": ["target", "dist"]
}
  • prSkill — the Claude Code skill the "Create PR" button runs (claude "/<prSkill>"). Default create-pr.

  • onCreate — shell commands run inside a new worktree after wt new / the + New button (copy env, install deps…).

  • attentionStaleDays — a WIP worktree older than this is flagged ⚠ "needs you".

  • roots — where to look for repos (recursively, up to maxDepth). Default: cwd.

  • bases — extra integration branches to test "merged" against, beyond each repo's default branch (which is detected automatically from origin/HEAD). E.g. add "prod" if you also merge to prod.

  • editor — command for the "Open in editor" action (code, cursor, subl, …). Auto-detected if unset (falls back to the OS file handler; on macOS, a detected VS Code/Cursor/Zed app).

Env overrides: WT_ROOTS (:/;-separated), WT_MAXDEPTH, WT_STALE_DAYS, WT_PORT, WT_HOST, WT_EDITOR.

What it shows

  • Global chips — counts by lifecycle: Needs you · In review · Active · Stale · Reclaimable — plus ⚠ Attention (CI failing / changes-requested / stale-WIP), a search box, + New worktree, Reclaim all / Prune across every repo, and a 🔔 to enable desktop notifications when something needs you.
  • Repo list — each repo, its worktree counts, and bulk Reclaim merged / Prune actions.
  • Detail pane — per worktree: lifecycle badges, session link, Resume/Start Claude, editor, terminal, remove; an editable purpose; the Pull request panel (state, CI, review decision, reviews, comments via gh) with Create PR (runs your prSkill Claude skill), Merge, Re-run failed CI, and Fix CI (launches Claude in the worktree with the failed job logs to diagnose + fix); and the Changes (split/unified diff — commits ahead of base + uncommitted work).

Lifecycle is derived from git: wip (uncommitted) · unpushed · in-review (pushed & ahead) · active · stale (>staleDays) · merged (landed → reclaim) · prunable. The PR panel is the source of truth for actual PR/CI state.

Ground truth (manifests)

The board reads a manifest per worktree instead of only inferring: ~/.wt-dash/manifests.json, keyed by worktree path — createdAt, creator, baseBranch, status, task, purpose, sessionId, prUrl. Manifest fields win over git-derived ones.

wt-dash new <base> <branch> [--task X --purpose "..." --creator human|agent|pipeline --json]
                            # canonical create: git worktree add + record a manifest
wt-dash link <path> --session <id>   # upsert (used by the SessionStart hook)
wt-dash import                       # seed manifests for existing worktrees that lack one

Resumable sessions

Claude Code keys sessions by launch directory. To make a worktree's session discoverable/resumable:

wt-dash install     # writes ~/.claude/hooks/wt-manifest-sync.sh (SessionStart back-fill) + prints
                    # the settings.json snippet to enable it

With the hook enabled, any Claude session run inside a worktree stamps its session id onto the manifest, so the board can offer Resume Claude. The /new-worktree skill creates worktrees through wt-dash new so they're tracked from the start.

Commands

serve · scan · new · link · import · doctor · config · install — run wt-dash with no args for the full list.

Platform support

OS Status
macOS ✅ Verified end-to-end.
Linux ✅ Works by design, not yet run in CI. Core is pure Node + git; launchers use xdg-open and gnome-terminal/konsole/xfce4-terminal/xterm; the SessionStart hook is bash (present on Linux).
Windows ⚠️ Partial. The board, triage, cleanup and PR panel should run, but the SessionStart session-linking hook is a bash script (needs Git Bash or WSL), and the editor/terminal/Resume launchers are best-effort. Native Windows is unverified.

Repo discovery is a Node filesystem walk (no Unix find); base branches come from each repo's origin/HEAD (+ configured bases); the server binds 127.0.0.1.

Notes / limits

  • The server binds to 127.0.0.1 only (it runs git and can remove worktrees). No auth beyond that.
  • gh is optional; without it the PR panel is empty but everything else works.
  • manifests.json is a single JSON file without write-locking — fine for single-user local use.
  • The install-generated hook and /new-worktree skill are per-user artifacts (they embed the absolute path of your local copy).

About

Local web board to triage git worktrees across parallel coding-agent sessions

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages