{"id":51194590,"url":"https://github.com/zeroblack/yagura","last_synced_at":"2026-06-27T19:01:15.050Z","repository":{"id":367793955,"uuid":"1282324040","full_name":"zeroblack/yagura","owner":"zeroblack","description":"A read-only watchtower for the AI coding agents working across your git worktrees","archived":false,"fork":false,"pushed_at":"2026-06-27T17:53:53.000Z","size":2214,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-27T18:17:41.574Z","etag":null,"topics":["ai-agents","claude-code","cli","developer-tools","git-worktree","golang","tui"],"latest_commit_sha":null,"homepage":"https://github.com/zeroblack/yagura","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zeroblack.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":"NOTICE","maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-27T16:10:16.000Z","updated_at":"2026-06-27T17:53:56.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/zeroblack/yagura","commit_stats":null,"previous_names":["zeroblack/yagura"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/zeroblack/yagura","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeroblack%2Fyagura","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeroblack%2Fyagura/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeroblack%2Fyagura/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeroblack%2Fyagura/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zeroblack","download_url":"https://codeload.github.com/zeroblack/yagura/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zeroblack%2Fyagura/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34864431,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-27T02:00:06.362Z","response_time":126,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","claude-code","cli","developer-tools","git-worktree","golang","tui"],"created_at":"2026-06-27T19:00:27.701Z","updated_at":"2026-06-27T19:01:15.002Z","avatar_url":"https://github.com/zeroblack.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"assets/logo.svg\" alt=\"yagura\" width=\"112\" height=\"112\" /\u003e\n\n# yagura\n\n**A read-only watchtower for the AI coding agents working across all your git worktrees.**\n\n[![CI](https://img.shields.io/github/actions/workflow/status/zeroblack/yagura/ci.yml?branch=main\u0026style=for-the-badge\u0026logo=githubactions\u0026logoColor=FFA033\u0026label=CI\u0026labelColor=07080A)](https://github.com/zeroblack/yagura/actions/workflows/ci.yml)\n[![Release](https://img.shields.io/github/v/release/zeroblack/yagura?sort=semver\u0026style=for-the-badge\u0026logo=github\u0026logoColor=FFA033\u0026label=release\u0026labelColor=07080A\u0026color=FFA033)](https://github.com/zeroblack/yagura/releases)\n[![License](https://img.shields.io/badge/license-Apache--2.0-FFA033?style=for-the-badge\u0026labelColor=07080A)](LICENSE)\n[![Go](https://img.shields.io/badge/Go-1.25-FFA033?style=for-the-badge\u0026logo=go\u0026logoColor=FFA033\u0026labelColor=07080A)](go.mod)\n[![Platform](https://img.shields.io/badge/macOS%20%C2%B7%20Linux-FFA033?style=for-the-badge\u0026labelColor=07080A)](#install)\n\n![yagura in action](assets/demo.gif)\n\n\u003c/div\u003e\n\n## What is yagura?\n\nYou run several AI coding agents at once — each in its own worktree, often across\nmore than one repository. Then you lose the thread. *Which agent is on which branch?\nWhat is each one doing right now? Did that one just edit the wrong tree?*\n\n`yagura` (櫓, \"watchtower\") answers that at a glance. It discovers every git\nrepository under one or more root directories, lists all of their worktrees, and shows\nthe agent running in each — live, ordered by activity, in a single console view.\n\nIt doesn't create worktrees and it doesn't launch agents. **It watches the ones you\nalready have.** Every other tool in this space *drives* parallel agent work; yagura is\nthe pane you leave open beside them to *see* it. Read-only by design — it never runs a\ngit command that writes — so it's safe to keep on screen all day.\n\n## See every agent, at a glance\n\n- **Live status per agent** — `RUNNING`, `EDITING`, `BROWSING`, `THINKING` — inferred\n  from the last tool each one used, shown as a filled chip.\n- **What it's doing, on its own line** — a full-width sub-line under each worktree\n  spells out the current action: *running go test ./...*, *editing webhook_handler.go*.\n- **Activity-ranked** — busy worktrees rise to the top, idle work fades, only live work\n  is loud. Pin one with `space` to keep it in place.\n- **Header you can read from across the room** — trees, repos, and how many agents are\n  live this second.\n\n## Multi-repo by default, zero config\n\n- Point it at one or more root directories; it finds **every git repo underneath** —\n  monorepo and many-repos alike, in one view.\n- **No hooks, no instrumentation, no daemon.** It reads what is already on disk. Nothing\n  to install into your agents, nothing to wire up.\n- Group by repository or flatten everything into a single activity stream with `o`.\n\n## A git inspector for each worktree\n\n![the worktree inspector](assets/inspector.png)\n\n- **CHANGES**, **GRAPH** and **PR** panes for the selected worktree, without leaving the\n  view — uncommitted files, the commit graph, and pull-request state side by side.\n- `git status`, `diff --stat` and recent commits on demand (`s` / `d` / `c`), colorized.\n- **Ahead/behind** divergence and **PR status badges** via the GitHub CLI (`gh`), cached.\n- An **attention banner** surfaces branches that need action.\n\n## A hazard you can't see anywhere else\n\n`yagura` attributes each agent to its *home* worktree — the working directory it is\nactually running in — and watches where its edits land. When an agent writes files into\na **different worktree of the same repo**, yagura flags a `[ LEAK → branch ]` chip.\n\nThat cross-contamination is the quiet failure mode of parallel agent work: one agent\nclobbering another's tree while every dashboard still shows green. yagura is the only\ntool that makes it visible.\n\n## Built to leave open\n\n- **Read-only.** It never mutates a repository. No accidental checkout, no surprise reset.\n- **Never blocks.** Every scan, git call and file read runs off the UI thread with a\n  per-command timeout, so a hung repo (a network mount, a credential prompt, a stale lock)\n  can't freeze the view. An idle tick is just a `stat()`.\n- **Light on huge repos.** Agent transcripts that grow to hundreds of megabytes are read\n  from the tail, with an mtime cache — not re-parsed every tick.\n- **NERV/MAGI instrument-panel aesthetic** — amber for the system, cyan for data, green\n  for live, red for hazard — tuned so a calm baseline lets only live work draw the eye.\n  Truecolor degrades to 256 colors automatically.\n\n## Install\n\n```sh\n# Homebrew\nbrew install zeroblack/tap/yagura\n\n# Go\ngo install github.com/zeroblack/yagura/cmd/yagura@latest\n```\n\nOr grab a binary from the [releases page](https://github.com/zeroblack/yagura/releases).\nmacOS and Linux are supported.\n\n## Usage\n\n```sh\nyagura              # the live TUI (full-screen)\nyagura list --json  # headless listing of worktrees + agents (scriptable)\nyagura doctor       # validate toolchain and config\n```\n\nWith no config, `yagura` watches the current directory. To watch fixed folders, create\n`~/.config/yagura/config.yaml`:\n\n```yaml\nroots:\n  - ~/Project/acme/services\n  - ~/Project/acme/web\nmax_depth: 4\nignore: [node_modules, vendor, dist, .next, target, .venv]\nagents:\n  claude_root: ~/.claude/projects\n  active_window: 10m\n  tool_timeout: 30s\nrefresh:\n  tick: 5s\ntheme: evangelion\n```\n\nEverything is configurable — roots, depth, refresh cadence, git timeouts, agent windows,\nforge integration, theme, and every keybinding. See\n[`config.example.yaml`](config.example.yaml) for the full surface.\n\n## Keybindings\n\n| Key                         | Action                                                  |\n| --------------------------- | ------------------------------------------------------- |\n| `↑ ↓` `j k`                 | move selection / scroll the focused pane                |\n| `tab` `]` / `shift+tab` `[` | cycle pane focus                                        |\n| `1` `2` `3` `4`             | jump to the worktrees / changes / graph / PR pane       |\n| `space`                     | pin the focused worktree to the top (immune to re-sort) |\n| `o`                         | toggle group-by-repo / flat-by-activity                 |\n| `s` `d` `c` `l`             | status / diff / commits / agent log of the selection    |\n| `esc`                       | close detail panel                                      |\n| `r`                         | force refresh                                           |\n| `q` `ctrl+c`                | quit                                                    |\n\nEvery binding is remappable under `keys:` in the config file; unset actions keep their\ndefaults.\n\n## How agent detection works\n\nToday, yagura detects [**Claude Code**](https://www.anthropic.com/claude-code) agents.\nSupport for other coding agents will be added over time — the agent source is a small\ninterface, designed for exactly that.\n\n`yagura` reads Claude Code session transcripts under `~/.claude/projects/**/*.jsonl` and\ngroups them by the working directory recorded *inside* each transcript (the encoded folder\nname under `~/.claude/projects` is lossy). Liveness comes from **transcript freshness** —\nClaude Code doesn't hold its `.jsonl` open, so the robust signal that an agent is working\nis that its transcript is being written *now*. The current activity is inferred from the\nlast tool in use, and the session is placed under its **home** worktree by the directory\nit is running in (the edit path defines the leak, never a read). No `ps`, no `lsof`, no\nhooks. macOS and Linux are supported.\n\n## Scope\n\n`yagura` is, deliberately, **only an observatory**:\n\n- It does **not** create, move, lock or remove worktrees.\n- It does **not** spawn, attach to, or control agents.\n- It does **not** commit, push, merge, or run any git command that writes.\n\nFor creating and orchestrating worktrees-per-agent, reach for a dedicated manager. yagura\nis what you keep open next to it — the one view that tells you, across every repo, where\neach agent is and what it's doing right now.\n\n## Development\n\n```sh\nmake test     # go test -race\nmake lint     # gofmt + go vet + staticcheck\nmake audit    # govulncheck\nmake build    # ./bin/yagura\nmake snapshot # local goreleaser build\n```\n\nSee [`CONVENTIONS.md`](CONVENTIONS.md) for the layout and code rules.\n\n## License\n\nApache-2.0. `yagura` reuses patterns and the agent-session detection approach from\n[lazyworktree](https://github.com/chmouel/lazyworktree) (also Apache-2.0); see\n[`NOTICE`](NOTICE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzeroblack%2Fyagura","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzeroblack%2Fyagura","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzeroblack%2Fyagura/lists"}