From 790e800ee19baeab96b511638c8f73d1bb447052 Mon Sep 17 00:00:00 2001
From: Artem Efimov <41889057+efim0v@users.noreply.github.com>
Date: Sun, 18 Oct 2026 11:46:52 +0500
Subject: [PATCH 1/4] docs: Grove is now part of Brow
---
README.md | 249 +++---------------------------------------------
README.ru.md | 249 +++---------------------------------------------
README.zh-CN.md | 249 +++---------------------------------------------
3 files changed, 33 insertions(+), 714 deletions(-)
diff --git a/README.md b/README.md
index f6c99e9..a282eb6 100644
--- a/README.md
+++ b/README.md
@@ -1,252 +1,25 @@
English · [Русский](README.ru.md) · [简体中文](README.zh-CN.md)
-Website: [efimov.page/grove](https://efimov.page/grove/)
+# Grove
-# Grove — multi-repo git-worktree workspaces for parallel Claude Code sessions
-
-[](https://github.com/efim0v/grove/actions/workflows/ci.yml)
-[](https://github.com/efim0v/grove/releases/latest)
-[](LICENSE)
-[](#requirements)
-
-A macOS menu-bar app for running [Claude Code](https://claude.com/claude-code) and other AI coding agents on a product that is split across several repositories.
-
-Grove gives every feature its own **workspace**: one directory holding a git worktree of each repository. Claude Code starts in that directory and sees one consistent branch of the whole product, so parallel agent sessions never trip over each other's branches. Claude Code's own `--worktree` does this inside a single repository; [here is how the two differ](#why-not-claude-codes-built-in-worktrees). Grove also moves a session from one Claude account to another when a rate limit runs out.
-
-**[Download Grove for macOS](https://github.com/efim0v/grove/releases/latest/download/Grove.zip)** or `brew install --cask efim0v/tap/grove` · macOS 26 or later, Apple silicon · [install notes](#install)
-
-> **Companion app: [Brow](https://github.com/efim0v/brow).** Brow lives in the MacBook notch and shows the rate limits of every Claude account you have. Grove moves work between accounts; Brow tells you which account has room. Each runs on its own, and they are built to be used together.
-
-
-
-
-
-
-All screenshots show made-up demo data.
-
-## The problem
-
-Claude Code works best when it can see the whole product in one directory. A monorepo gives it that. But many products are split across repositories — a client, a server, the server's configuration, an admin panel, a landing page, a handful of microservices — and merging millions of lines into one repository just for the agent is not always sensible, if only because of who should have access to what.
-
-Run several agents in parallel on a multi-repo project and they start tripping over branches: one checks out a branch in the server repository, and another agent working on a different feature is suddenly looking at the wrong code.
-
-## Workspaces
-
-Grove's answer is the **workspace**: an umbrella directory for one feature or epic that contains a git worktree of each repository you chose, all on the same branch.
-
-```
-~/Workspaces/acme-shop/checkout-redesign/ <- start Claude Code here
-├── web-client/ worktree on feat/checkout-redesign
-├── api-server/ worktree on feat/checkout-redesign
-└── server-config/ worktree on feat/checkout-redesign
-```
-
-Claude Code is launched in the umbrella directory. It gets what is in effect a private copy of the whole project on that feature's branch, and nothing another session does can change the branch under it. Ten features in flight are ten directories.
-
-Creating one takes a name and a click: Grove runs `git worktree add` in each repository, applies your branch template, seeds shared files such as `CLAUDE.md`, and runs post-create hooks. Workspaces can be stacked — forked from another workspace rather than from the base branch — and Grove derives that tree from git itself.
-
-
-
-
-
-
-## Moving a session between accounts
-
-The second thing Grove is for. A project does not have to stay on the account it started on: when one account runs out of limit, continue the same session on another.
-
-- **Resume as…** continues a session under a different account without copying anything.
-- **Migrate to…** makes a full copy of a session in another account — transcript, memory, file history, tasks — and works even while that account is in use.
-- **Share** moves a session into the shared store so every linked account can see it.
-
-Each project has a default account, and every launch can pick its own account, model and effort.
-
-
-
-
-
-
-## Graph and statistics
-
-- **Graph** — the commit graph of a repository with its branches, remotes and tags. From a branch you can create a workspace or open Claude Code in its worktree.
-- **Stats** — lines of code across the project: totals, language breakdown, and growth over time stacked by repository.
-
-
-
-
-
-
-There is also a command-line tool, `grove`, with `scan`, `workspaces`, `sessions`, `create`, `graph` and `doctor`, each with `--json`. `grove --version` prints its version, and `grove doctor` exits with status 1 when it can't run git or `claude`.
-
-## Why not Claude Code's built-in worktrees?
-
-Claude Code has worktrees of its own. `claude --worktree ` starts a session in a new worktree of the repository you run it in (by default under `.claude/worktrees//`, on a branch named `worktree-`) and cleans the worktree up when you exit, asking first if there is work in it. Subagents and sessions in the desktop app can get worktrees too ([Claude Code docs](https://code.claude.com/docs/en/worktrees)). If your product lives in one repository, that may be all you need.
-
-Grove is for a product split across repositories:
-
-- **One branch across all of them.** A workspace holds a worktree of each repository you pick, all on the same branch, under one directory. Claude Code starts there and sees the whole product.
-- **Your branch names and start points.** Branches follow your template, `feat/{name}` by default. Each repository can start from its own base branch, and a workspace can fork from another workspace's branches.
-- **Set up on creation.** Shared files you choose, such as `CLAUDE.md`, are linked or copied into each new workspace, and each repository can run its own post-create hook.
-- **Sessions across accounts.** Grove lists the sessions of every Claude account it knows and moves them between accounts with **Resume as…**, **Migrate to…** and **Share**.
-
-## How Grove and Brow fit together
-
-Claude Code keeps each account in its own directory: `~/.claude` for the default account and, here, `~/.claude-accounts/` for the others. Both apps read those directories; neither talks to the other directly.
-
-```mermaid
-flowchart LR
- subgraph acc_default["~/.claude (default account, and the shared store)"]
- P["projects/<workspace>/<session>.jsonl transcripts"]
- F["file-history/ tasks/ session-env/"]
- M["grove/transcripts/<account>/… transcript mirror"]
- end
-
- subgraph acc_work["~/.claude-accounts/work"]
- WP["projects/<workspace>"]
- WF["file-history tasks session-env"]
- WK["credentials · settings · plugins stay per account"]
- end
-
- subgraph acc_team["~/.claude-accounts/team"]
- TP["projects/<workspace>"]
- TX["projects/<other>/<session>.jsonl"]
- end
-
- WP -. symlink .-> P
- WF -. symlink .-> F
- TP -. symlink .-> P
- P == hard link ==> M
- TX == hard link ==> M
- TX -- "Migrate: copy" --> WP
-```
-
-**The shared store (symbolic links).** There is no separate neutral directory: the default account's own `~/.claude` is the shared store. When an account is linked — by a button on the Accounts screen, or the first time you resume a session as another account — its `file-history`, `tasks` and `session-env` directories become symbolic links into `~/.claude`, and so does `projects/` for each workspace involved. From then on a session started under one linked account is visible to the others, which is what makes **Resume as…** work without copying. Credentials, settings and plugins are never shared.
-
-**The transcript mirror (hard links).** Separately, Grove keeps a safety copy of every transcript under `~/.claude/grove/transcripts/`. Each entry is a hard link to the live file, so it costs no extra disk space while the original exists. If a transcript disappears from an account, whether you deleted it or Claude Code's retention cleanup did, the next pass restores it. Entries are kept for 90 days and up to 500 MB by default; **Settings → Transcript safety-net** changes both limits or turns the mirror off, and **Purge** on the Sessions screen is the way to delete a transcript for good.
-
-**Migration (copy).** **Migrate to…** copies a session's data from one account directory into another.
-
-The other contracts between the two apps — the account key that names Keychain items and browser profiles, the browser router Grove borrows from an installed Brow, the status-line captures both read — are described in [`docs/grove-and-brow.md`](docs/grove-and-brow.md).
-
-## What Grove does on your machine
-
-Worth knowing before you run it:
-
-- **Grove edits each account's `settings.json`**, pointing `statusLine.command` at its own wrapper so it can read usage per session. It does this at launch. The wrapper passes the same input on to the command you had, so your own status line keeps working, and **Stop** on the Accounts screen puts your command back.
-- **Linking an account moves its session files into `~/.claude`.** Anything that would be overwritten is backed up under `/grove-backup/` first.
-- **The transcript mirror outlasts Claude Code's own cleanup.** Claude Code deletes transcripts older than [`cleanupPeriodDays`](https://code.claude.com/docs/en/settings-reference#cleanupperioddays): 30 days, unless you or your organization's managed settings set another value. The mirror holds a hard link to each transcript, so its content survives that deletion, and Grove restores the file on its next pass until the transcript is more than 90 days old (the default). A transcript you delete by hand comes back the same way. **Purge** on the Sessions screen deletes one for good. To leave retention to Claude Code, turn off **Keep a backup of every session** in Settings → Transcript safety-net, then delete `~/.claude/grove/transcripts/`.
-- **Grove marks Claude Code's first-run setup as done** in account folders other than `~/.claude`: before it starts Claude Code in one, it sets `hasCompletedOnboarding` in that folder's `.claude.json` (and copies your theme if the folder has none), so the session doesn't open the onboarding wizard.
-- **Grove does not read Claude Code's credentials.** Rate limits and sign-in are Brow's job.
-
-[Uninstall](#uninstall) shows how to reverse the status-line, link and mirror changes.
-
-This is an independent tool, not affiliated with or endorsed by Anthropic.
-
-## Requirements
-
-- macOS 26 or later.
-- Xcode with Swift 6.2, to build.
-- [Claude Code](https://claude.com/claude-code) and git.
-- A terminal for the sessions: [cmux](https://cmux.dev), recommended, or Terminal.app. See below.
-- For cross-account resume and the transcript mirror: an account signed in at the default `~/.claude`.
-- Optional: [Brow](https://github.com/efim0v/brow), for per-account rate limits and for opening each account's sign-in in its own browser profile. When Brow is installed, Grove passes its browser router to every session it launches.
-
-**cmux or Terminal.app.** Grove is built around cmux: it opens each session in a cmux workspace of its own and takes you to a running session in one click. Terminal.app works too, through the launch sheet, which opens for **New Claude** on a workspace, for the gear on a closed session, and when you click a closed session on the Projects screen. Set **Open in** to **Terminal** there; the sheet starts on cmux each time, and it also picks the account, model and effort. Every other button that starts or resumes a session (**Resume**, **Resume as…**, **Add & log in** and the rest) opens it in cmux. Grove can bring a session running in Terminal.app to the front when you click it on the Projects screen, but it can't launch into or switch to other terminals. A workspace is an ordinary directory, though, so you can start Claude Code in it from any terminal yourself.
-
-## Install
-
-With [Homebrew](https://brew.sh):
-
-```sh
-brew install --cask efim0v/tap/grove # the menu-bar app
-brew install efim0v/tap/grove-cli # the grove command-line tool, if you want it
-```
-
-Or download **[Grove.zip](https://github.com/efim0v/grove/releases/latest/download/Grove.zip)** from the [latest release](https://github.com/efim0v/grove/releases/latest), unzip it and move `Grove.app` to `/Applications`. The release also has `grove-cli.zip`, the command-line tool, and `SHA256SUMS.txt`; check the downloads with `shasum -a 256 -c --ignore-missing SHA256SUMS.txt`.
-
-Either way, the build is signed ad hoc and is not notarized by Apple, so macOS blocks the first launch. Open **System Settings → Privacy & Security**, find the message about Grove and press **Open Anyway** — or clear the quarantine flag yourself:
-
-```sh
-xattr -dr com.apple.quarantine /Applications/Grove.app
-```
-
-The `grove` tool from `grove-cli.zip` carries the same flag when you download it in a browser: `xattr -d com.apple.quarantine grove`.
-
-First run: click the tree icon in the menu bar, open Settings, press **Add project…** and pick the directory that contains your repositories. Workspaces are created under `~/Workspaces//` unless you change the template.
-
-## Uninstall
-
-Deleting `Grove.app` leaves its changes to your Claude Code folders in place. To undo them as well:
-
-1. **Give each account its status line back.** On the **Accounts** screen press **Stop** next to *monitoring* on every account. Grove puts back the `statusLine` command it saved, or removes the key if there was none. Then check that no `settings.json` still points at Grove's wrapper:
-
- ```sh
- find ~/.claude ~/.claude-accounts -maxdepth 2 -name settings.json -exec grep -l grove-statusline {} +
- ```
-
- For each file it lists, open the script that file's `statusLine.command` names: its `GROVE_ORIG` line holds the command you had before. Put that command back, or delete the `statusLine` key if `GROVE_ORIG` is empty.
-
-2. **Quit Grove** (**Quit** in the panel) and remove it: `brew uninstall --cask grove` and `brew uninstall grove-cli`, or move `Grove.app` and the `grove` tool to the Trash.
-
-3. **Delete the files Grove created:**
- - `~/.claude/grove/`: the transcript mirror (`transcripts/`) and the default account's status-line captures (`usage/`). The transcripts in each account's `projects/` stay, but a transcript that only the mirror still holds goes with it.
- - `grove/` in every other account folder, such as `~/.claude-accounts/work/grove/`: that account's status-line captures.
- - `grove-backup/` in an account folder: what linking set aside. Look through it before you delete it.
- - `~/Library/Application Support/Grove/`: `config.json`, the wrapper scripts in `bin/` and the code statistics in `stats/`. If you keep using Brow, leave `oauth-usage-ledger.json`, which is Brow's. `defaults delete dev.artemefimov.grove3` removes Grove's preferences.
-
-4. **Unlink accounts, if you want to.** A linked account's `file-history`, `tasks` and `session-env`, and `projects/` for each shared workspace, are symbolic links into `~/.claude`, and they keep working without Grove. To give an account its own copies again, run this while no Claude Code session is using that account, with your account's folder in place of `~/.claude-accounts/work`:
-
- ```sh
- cd ~/.claude-accounts/work
- find file-history tasks session-env projects -maxdepth 1 -type l | while read -r link; do
- target=$(readlink "$link")
- rm "$link" && cp -R "$target" "$link"
- done
- ```
-
-Workspaces are ordinary git worktrees and branches in your repositories, so they stay. To remove one, run `git worktree remove` on each of its worktrees, then delete its directory.
-
-## Build
-
-```sh
-git clone https://github.com/efim0v/grove.git
-cd grove
-
-swift test # full suite, about two minutes
-Scripts/build-app.sh # -> dist/Grove.app
-cp -R dist/Grove.app /Applications/
-```
-
-The app is signed ad hoc by default. macOS then forgets the Automation permission on every rebuild; to keep it, set `GROVE_SIGN_IDENTITY` to your own `Apple Development: Name (TEAMID)` identity before building.
-
-The command-line tool:
+**Grove is now part of [Brow](https://github.com/efim0v/brow).** From Brow 0.4.0, Grove's workspaces of git worktrees for parallel Claude Code sessions across several repositories run inside Brow, as Workspaces.
```sh
-swift build -c release
-.build/release/grove --help
-.build/release/grove workspaces ~/code/acme-shop
+brew install --cask efim0v/tap/brow
```
-If cmux reports as unavailable, see [`docs/troubleshooting.md`](docs/troubleshooting.md).
-
-## Layout
+Or download **[Brow.zip](https://github.com/efim0v/brow/releases/latest/download/Brow.zip)** · macOS 26 or later, Apple silicon · [install notes](https://github.com/efim0v/brow#install)
-| Path | What it is |
-|---|---|
-| `Sources/GroveCore` | The core library: git and worktrees, cmux, Claude sessions, the shared store, the transcript mirror, migration, code statistics, credentials and usage. Brow depends on it too. |
-| `Sources/GroveAppKit`, `Sources/GroveApp` | The menu-bar app |
-| `Sources/grove-cli` | The `grove` command-line tool |
-| `Tests` | About 920 tests |
-| `docs` | How Grove and Brow fit together, snapshot testing, troubleshooting |
+## What moved where
-There are no third-party dependencies.
+- **Workspaces** opens from Brow's item in the menu bar, the notch with two dots, and from the stacked-squares button in the notch panel: projects, workspaces, sessions, **Resume as…**, **Migrate to…**, **Share**, the commit graph and the code statistics.
+- **Your projects, accounts and settings come along by themselves.** Brow finds Grove's `config.json` in `~/Library/Application Support/Grove` and turns Workspaces on with it. Nothing moves, and the status lines Grove captured keep working.
+- **The command-line tool is `brow`**, with `grove` kept as a second name, so your scripts keep working: `brew install efim0v/tap/brow-cli`, after `brew uninstall grove-cli` if you have Grove's.
+- **Grove.app can go.** Quit it first: while it runs, Workspaces waits and offers **Quit Grove**, so the two never write the same files. Then delete it, or run `brew uninstall --cask grove` without `--zap`, which would move the folder Brow now uses to the Trash. If Grove was in your Login Items, turn on **Launch at login** in Brow instead.
-## Development
+[Coming from Grove](https://github.com/efim0v/brow#coming-from-grove) says what else changes, such as the notch reading every account's limits, which Grove never did. The website is [efimov.page/brow](https://efimov.page/brow/).
-- `swift test` and `swift test -c release` should both stay green.
-- `swift run GroveApp --snapshot /tmp/grove-snap` renders the app's screens to PNG without starting it; see [`docs/snapshot-testing.md`](docs/snapshot-testing.md).
-- The screenshots in this README are regenerated with
- `DEMO_SCREENSHOTS_DIR="$PWD/docs/screenshots" swift test --filter DemoScreenshotTests`.
-- Grove's configuration lives at `~/Library/Application Support/Grove/config.json`.
+The last Grove release, [0.2.2](https://github.com/efim0v/grove/releases/tag/0.2.2), stays available for reference, and so does the code in this repository. To remove Grove without moving to Brow, follow [the uninstall steps in its README](https://github.com/efim0v/grove/blob/0.2.2/README.md#uninstall).
## License
diff --git a/README.ru.md b/README.ru.md
index f965139..c8d3944 100644
--- a/README.ru.md
+++ b/README.ru.md
@@ -1,254 +1,27 @@
[English](README.md) · Русский · [简体中文](README.zh-CN.md)
-Сайт: [efimov.page/grove/ru](https://efimov.page/grove/ru/)
-
> Это перевод [английского README](README.md). Английская версия основная и может быть новее перевода; если тексты расходятся, ориентируйтесь на неё.
-# Grove — рабочие пространства на git worktree для параллельных сессий Claude Code
-
-[](https://github.com/efim0v/grove/actions/workflows/ci.yml)
-[](https://github.com/efim0v/grove/releases/latest)
-[](LICENSE)
-[](#требования)
-
-Приложение в строке меню macOS для работы [Claude Code](https://claude.com/claude-code) и других ИИ-агентов над продуктом, код которого разнесён по нескольким репозиториям.
-
-Grove выделяет каждой фиче своё **рабочее пространство** (workspace): один каталог, в котором лежит git worktree каждого репозитория. Claude Code запускается в этом каталоге и видит весь продукт на одной и той же ветке, поэтому параллельные сессии агентов никогда не мешают друг другу переключением веток. Встроенный в Claude Code флаг `--worktree` делает то же самое в пределах одного репозитория; [вот чем они отличаются](#почему-не-встроенные-worktree-claude-code). А ещё Grove переносит сессию с одного аккаунта Claude на другой, когда у первого кончается лимит.
-
-**[Скачать Grove для macOS](https://github.com/efim0v/grove/releases/latest/download/Grove.zip)** или `brew install --cask efim0v/tap/grove` · macOS 26 или новее, Apple silicon · [подробнее об установке](#установка)
-
-> **Приложение-компаньон: [Brow](https://github.com/efim0v/brow).** Brow живёт в чёлке MacBook и показывает лимиты всех ваших аккаунтов Claude. Grove переносит работу между аккаунтами, а Brow подсказывает, у какого аккаунта есть запас. Каждое приложение работает и само по себе, но задуманы они как пара.
-
-
-
-
-
-
-На всех скриншотах — вымышленные демонстрационные данные.
-
-## Проблема
-
-Claude Code лучше всего работает, когда видит весь продукт в одном каталоге. Монорепозиторий это даёт. Но многие продукты разнесены по репозиториям — клиент, сервер, конфигурация сервера, админ-панель, лендинг, несколько микросервисов, — и сливать миллионы строк в один репозиторий только ради агента не всегда разумно, хотя бы из-за того, кому к чему положен доступ.
-
-Стоит запустить параллельно несколько агентов на таком проекте, как они начинают спотыкаться о ветки: один переключает ветку в репозитории сервера — и второй агент, который делает другую фичу, вдруг видит не тот код.
-
-## Рабочие пространства
-
-Ответ Grove — **рабочее пространство**: общий каталог для одной фичи или эпика, в котором лежит git worktree каждого выбранного вами репозитория, и все они на одной ветке.
-
-```
-~/Workspaces/acme-shop/checkout-redesign/ <- start Claude Code here
-├── web-client/ worktree on feat/checkout-redesign
-├── api-server/ worktree on feat/checkout-redesign
-└── server-config/ worktree on feat/checkout-redesign
-```
-
-Claude Code запускается в этом общем каталоге. По сути, он получает собственную копию всего проекта на ветке этой фичи, и ничто из того, что делает другая сессия, не может сменить ветку у него под ногами. Десять фич в работе — это десять каталогов.
-
-Чтобы создать рабочее пространство, нужны только имя и один клик: Grove выполняет `git worktree add` в каждом репозитории, применяет ваш шаблон имени ветки, раскладывает общие файлы вроде `CLAUDE.md` и запускает хуки после создания. Рабочие пространства можно наслаивать — ответвлять от другого рабочего пространства, а не от базовой ветки, — и это дерево Grove строит по данным самого git.
-
-
-
-
-
-
-## Перенос сессии между аккаунтами
-
-Вторая задача Grove. Проект не обязан оставаться на том аккаунте, с которого начался: когда у одного аккаунта кончается лимит, продолжайте ту же сессию на другом.
-
-- **Resume as…** продолжает сессию под другим аккаунтом, ничего не копируя.
-- **Migrate to…** делает полную копию сессии в другом аккаунте — транскрипт, память, историю файлов, задачи — и работает, даже если этот аккаунт сейчас используется.
-- **Share** переносит сессию в общее хранилище, чтобы её видели все связанные аккаунты.
-
-У каждого проекта есть аккаунт по умолчанию, а при каждом запуске можно отдельно выбрать аккаунт, модель и уровень effort.
-
-
-
-
-
-
-## Граф и статистика
-
-- **Graph** — граф коммитов репозитория с ветками, удалёнными репозиториями и тегами. Из ветки можно создать рабочее пространство или открыть Claude Code в её worktree.
-- **Stats** — строки кода по всему проекту: итоги, разбивка по языкам и рост во времени на диаграмме с накоплением по репозиториям.
-
-
-
-
-
-
-Есть и утилита командной строки `grove` с командами `scan`, `workspaces`, `sessions`, `create`, `graph` и `doctor`, и у каждой есть флаг `--json`. `grove --version` выводит версию утилиты, а `grove doctor` завершается с кодом 1, если не может запустить git или `claude`.
-
-## Почему не встроенные worktree Claude Code?
-
-У Claude Code есть собственные worktree. `claude --worktree ` запускает сессию в новом worktree того репозитория, где вы выполнили команду (по умолчанию в `.claude/worktrees//`, на ветке `worktree-`), а при выходе убирает этот worktree, но сначала спрашивает, если в нём осталась работа. Worktree бывают и у субагентов, и у сессий в десктопном приложении ([документация Claude Code](https://code.claude.com/docs/en/worktrees)). Если ваш продукт живёт в одном репозитории, этого может быть вполне достаточно.
-
-Grove нужен, когда продукт разнесён по нескольким репозиториям:
-
-- **Одна ветка во всех репозиториях.** Рабочее пространство собирает в одном каталоге worktree каждого выбранного репозитория, и все они на одной ветке. Claude Code запускается там и видит весь продукт.
-- **Ваши имена веток и точки старта.** Ветки называются по вашему шаблону, по умолчанию `feat/{name}`. Каждый репозиторий может стартовать со своей базовой ветки, а рабочее пространство — ответвиться от веток другого рабочего пространства.
-- **Подготовка при создании.** Выбранные вами общие файлы, например `CLAUDE.md`, попадают в каждое новое рабочее пространство ссылкой или копией, а каждый репозиторий может запускать свой хук после создания.
-- **Сессии в разных аккаунтах.** Grove показывает сессии всех известных ему аккаунтов Claude и переносит их между аккаунтами с помощью **Resume as…**, **Migrate to…** и **Share**.
-
-## Как Grove и Brow работают вместе
-
-Claude Code хранит каждый аккаунт в отдельном каталоге: `~/.claude` для аккаунта по умолчанию и, в этой схеме, `~/.claude-accounts/` для остальных. Оба приложения читают эти каталоги, а напрямую друг с другом не общаются.
-
-```mermaid
-flowchart LR
- subgraph acc_default["~/.claude (default account, and the shared store)"]
- P["projects/<workspace>/<session>.jsonl transcripts"]
- F["file-history/ tasks/ session-env/"]
- M["grove/transcripts/<account>/… transcript mirror"]
- end
-
- subgraph acc_work["~/.claude-accounts/work"]
- WP["projects/<workspace>"]
- WF["file-history tasks session-env"]
- WK["credentials · settings · plugins stay per account"]
- end
-
- subgraph acc_team["~/.claude-accounts/team"]
- TP["projects/<workspace>"]
- TX["projects/<other>/<session>.jsonl"]
- end
-
- WP -. symlink .-> P
- WF -. symlink .-> F
- TP -. symlink .-> P
- P == hard link ==> M
- TX == hard link ==> M
- TX -- "Migrate: copy" --> WP
-```
-
-**Общее хранилище (символические ссылки).** Отдельного нейтрального каталога нет: общим хранилищем служит собственный `~/.claude` аккаунта по умолчанию. Когда аккаунт связывают — кнопкой на экране Accounts или при первом возобновлении сессии от имени другого аккаунта, — его каталоги `file-history`, `tasks` и `session-env` становятся символическими ссылками внутрь `~/.claude`, как и `projects/` каждого затронутого рабочего пространства. С этого момента сессия, начатая под одним связанным аккаунтом, видна остальным, и именно поэтому **Resume as…** работает без копирования. Учётные данные, настройки и плагины никогда не становятся общими.
+# Grove
-**Зеркало транскриптов (жёсткие ссылки).** Кроме того, Grove хранит страховочную копию каждого транскрипта в `~/.claude/grove/transcripts/`. Каждая запись — жёсткая ссылка на исходный файл, поэтому, пока оригинал существует, она не занимает лишнего места на диске. Если транскрипт пропал из аккаунта — вы ли его удалили или его стёрла очистка Claude Code по сроку хранения, — следующий проход его восстановит. По умолчанию записи хранятся 90 дней и занимают не больше 500 МБ; в **Settings → Transcript safety-net** можно изменить оба ограничения или выключить зеркало, а удалить транскрипт насовсем позволяет **Purge** на экране Sessions.
-
-**Миграция (копирование).** **Migrate to…** копирует данные сессии из каталога одного аккаунта в каталог другого.
-
-Остальные договорённости между приложениями — ключ аккаунта, по которому называются записи в связке ключей и профили браузера, браузерный роутер, который Grove берёт у установленного Brow, данные строки состояния, которые читают оба, — описаны в [`docs/grove-and-brow.md`](docs/grove-and-brow.md) (на английском).
-
-## Что Grove делает на вашем Mac
-
-Это стоит знать до первого запуска:
-
-- **Grove меняет `settings.json` каждого аккаунта**: направляет `statusLine.command` на свою обёртку, чтобы видеть расход по каждой сессии. Делает он это при своём запуске. Обёртка передаёт те же входные данные вашей прежней команде, так что ваша строка состояния продолжает работать, а **Stop** на экране Accounts возвращает вашу команду на место.
-- **При связывании аккаунта его файлы сессий переезжают в `~/.claude`.** Всё, что при этом было бы перезаписано, сначала сохраняется в `/grove-backup/`.
-- **Зеркало транскриптов переживает собственную очистку Claude Code.** Claude Code удаляет транскрипты старше [`cleanupPeriodDays`](https://code.claude.com/docs/en/settings-reference#cleanupperioddays): это 30 дней, если вы или управляемые настройки вашей организации не задали другое значение. Зеркало держит жёсткую ссылку на каждый транскрипт, поэтому его содержимое переживает такое удаление, и Grove восстанавливает файл при следующем проходе, пока транскрипт не станет старше 90 дней (значение по умолчанию). Транскрипт, удалённый вручную, возвращается так же. Насовсем его удаляет **Purge** на экране Sessions. Чтобы оставить хранение на усмотрение Claude Code, выключите **Keep a backup of every session** в Settings → Transcript safety-net, а затем удалите `~/.claude/grove/transcripts/`.
-- **Grove отмечает первоначальную настройку Claude Code как пройденную** во всех папках аккаунтов, кроме `~/.claude`: прежде чем запустить в такой папке Claude Code, он выставляет `hasCompletedOnboarding` в её `.claude.json` (и копирует вашу тему, если в папке её нет), чтобы сессия не открывала мастер первого запуска.
-- **Grove не читает учётные данные Claude Code.** Лимиты и вход в аккаунты — забота Brow.
-
-Как откатить изменения строки состояния, связывания и зеркала, описано в разделе [Удаление](#удаление).
-
-Это независимый инструмент. Anthropic не имеет к нему отношения и не одобряла его.
-
-## Требования
-
-- macOS 26 или новее.
-- Для сборки — Xcode со Swift 6.2.
-- [Claude Code](https://claude.com/claude-code) и git.
-- Терминал для сессий: [cmux](https://cmux.dev) (рекомендуется) или Terminal.app. Подробнее ниже.
-- Для возобновления сессий между аккаунтами и зеркала транскриптов — аккаунт, вход в который выполнен в стандартной папке `~/.claude`.
-- Необязательно: [Brow](https://github.com/efim0v/brow) — чтобы видеть лимиты каждого аккаунта и входить в каждый аккаунт в его собственном профиле браузера. Если Brow установлен, Grove передаёт его браузерный роутер каждой сессии, которую запускает.
-
-**cmux или Terminal.app.** Grove построен вокруг cmux: он открывает каждую сессию в отдельном рабочем пространстве cmux и в один клик переводит вас к запущенной сессии. Terminal.app тоже подходит — через окно запуска, которое открывается по кнопке **New Claude** у рабочего пространства, по шестерёнке у закрытой сессии и при клике на закрытую сессию на экране Projects. Выберите там в **Open in** вариант **Terminal**; окно каждый раз открывается с выбранным cmux, и в нём же выбираются аккаунт, модель и уровень effort. Все остальные кнопки, которые запускают или возобновляют сессию (**Resume**, **Resume as…**, **Add & log in** и прочие), открывают её в cmux. Grove может вывести на передний план сессию, запущенную в Terminal.app, когда вы кликаете по ней на экране Projects, но запускать сессии в других терминалах или переключаться на них он не умеет. Впрочем, рабочее пространство — обычный каталог, так что в нём можно самостоятельно запустить Claude Code из любого терминала.
-
-## Установка
-
-Через [Homebrew](https://brew.sh):
-
-```sh
-brew install --cask efim0v/tap/grove # the menu-bar app
-brew install efim0v/tap/grove-cli # the grove command-line tool, if you want it
-```
-
-Или скачайте **[Grove.zip](https://github.com/efim0v/grove/releases/latest/download/Grove.zip)** из [последнего релиза](https://github.com/efim0v/grove/releases/latest), распакуйте и перенесите `Grove.app` в `/Applications`. В релизе также есть `grove-cli.zip` с утилитой командной строки и `SHA256SUMS.txt`; проверить скачанные файлы можно командой `shasum -a 256 -c --ignore-missing SHA256SUMS.txt`.
-
-Каким бы способом вы ни установили Grove, сборка подписана ad hoc и не нотаризована Apple, поэтому macOS заблокирует первый запуск. Откройте **Системные настройки → Конфиденциальность и безопасность**, найдите сообщение о Grove и нажмите **Все равно открыть** — или снимите атрибут карантина сами:
-
-```sh
-xattr -dr com.apple.quarantine /Applications/Grove.app
-```
-
-Утилита `grove` из `grove-cli.zip` получает тот же атрибут, если скачать её через браузер: `xattr -d com.apple.quarantine grove`.
-
-Первый запуск: нажмите на значок дерева в строке меню, откройте Settings, нажмите **Add project…** и выберите каталог, в котором лежат ваши репозитории. Рабочие пространства создаются в `~/Workspaces//`, если вы не поменяете шаблон.
-
-## Удаление
-
-Если просто удалить `Grove.app`, его изменения в папках Claude Code останутся. Чтобы откатить и их:
-
-1. **Верните каждому аккаунту его строку состояния.** На экране **Accounts** нажмите **Stop** рядом с *monitoring* у каждого аккаунта. Grove вернёт сохранённую команду `statusLine` или удалит ключ, если команды не было. Затем проверьте, что ни один `settings.json` больше не указывает на обёртку Grove:
-
- ```sh
- find ~/.claude ~/.claude-accounts -maxdepth 2 -name settings.json -exec grep -l grove-statusline {} +
- ```
-
- Для каждого найденного файла откройте скрипт, который указан в его `statusLine.command`: в строке `GROVE_ORIG` записана ваша прежняя команда. Верните эту команду на место или удалите ключ `statusLine`, если `GROVE_ORIG` пуст.
-
-2. **Закройте Grove** (**Quit** в панели) и удалите его: `brew uninstall --cask grove` и `brew uninstall grove-cli` или перенесите `Grove.app` и утилиту `grove` в корзину.
-
-3. **Удалите файлы, которые создал Grove:**
- - `~/.claude/grove/`: зеркало транскриптов (`transcripts/`) и данные строки состояния аккаунта по умолчанию (`usage/`). Транскрипты в `projects/` каждого аккаунта останутся, но транскрипт, который сохранился только в зеркале, исчезнет вместе с ним.
- - `grove/` в папке каждого другого аккаунта, например `~/.claude-accounts/work/grove/`: данные строки состояния этого аккаунта.
- - `grove-backup/` в папке аккаунта: то, что Grove отложил при связывании. Просмотрите содержимое, прежде чем удалять.
- - `~/Library/Application Support/Grove/`: `config.json`, скрипты-обёртки в `bin/` и статистика кода в `stats/`. Если продолжаете пользоваться Brow, оставьте `oauth-usage-ledger.json` — это файл Brow. Команда `defaults delete dev.artemefimov.grove3` удаляет настройки Grove.
-
-4. **При желании отвяжите аккаунты.** У связанного аккаунта `file-history`, `tasks` и `session-env`, а также `projects/` каждого общего рабочего пространства — это символические ссылки внутрь `~/.claude`, и без Grove они продолжают работать. Чтобы у аккаунта снова были собственные копии, выполните следующее, пока этот аккаунт не использует ни одна сессия Claude Code; вместо `~/.claude-accounts/work` подставьте папку своего аккаунта:
-
- ```sh
- cd ~/.claude-accounts/work
- find file-history tasks session-env projects -maxdepth 1 -type l | while read -r link; do
- target=$(readlink "$link")
- rm "$link" && cp -R "$target" "$link"
- done
- ```
-
-Рабочие пространства — это обычные git worktree и ветки в ваших репозиториях, поэтому они остаются на месте. Чтобы удалить рабочее пространство, выполните `git worktree remove` для каждого его worktree, а затем удалите его каталог.
-
-## Сборка
-
-```sh
-git clone https://github.com/efim0v/grove.git
-cd grove
-
-swift test # full suite, about two minutes
-Scripts/build-app.sh # -> dist/Grove.app
-cp -R dist/Grove.app /Applications/
-```
-
-По умолчанию приложение подписывается ad hoc, и тогда macOS забывает разрешение на автоматизацию после каждой пересборки. Чтобы оно сохранялось, перед сборкой укажите в `GROVE_SIGN_IDENTITY` свой сертификат подписи `Apple Development: Name (TEAMID)`.
-
-Утилита командной строки:
+**Grove теперь часть [Brow](https://github.com/efim0v/brow).** Начиная с Brow 0.4.0, рабочие пространства Grove на git worktree для параллельных сессий Claude Code в нескольких репозиториях работают прямо в Brow — это его Workspaces.
```sh
-swift build -c release
-.build/release/grove --help
-.build/release/grove workspaces ~/code/acme-shop
+brew install --cask efim0v/tap/brow
```
-Если cmux значится недоступным, см. [`docs/troubleshooting.md`](docs/troubleshooting.md) (на английском).
-
-## Структура репозитория
+Или скачайте **[Brow.zip](https://github.com/efim0v/brow/releases/latest/download/Brow.zip)** · macOS 26 или новее, Apple silicon · [подробнее об установке](https://github.com/efim0v/brow/blob/main/README.ru.md#установка)
-| Путь | Что это |
-|---|---|
-| `Sources/GroveCore` | Основная библиотека: git и worktree, cmux, сессии Claude, общее хранилище, зеркало транскриптов, миграция, статистика кода, учётные данные и расход. От неё зависит и Brow. |
-| `Sources/GroveAppKit`, `Sources/GroveApp` | Приложение для строки меню |
-| `Sources/grove-cli` | Утилита командной строки `grove` |
-| `Tests` | Около 920 тестов |
-| `docs` | Как Grove и Brow работают вместе, снапшот-тестирование, решение проблем (на английском) |
+## Что куда переехало
-Сторонних зависимостей нет.
+- **Workspaces** открывается из значка Brow в строке меню — чёлки с двумя точками — и кнопкой со стопкой квадратов на панели чёлки: проекты, рабочие пространства, сессии, **Resume as…**, **Migrate to…**, **Share**, граф коммитов и статистика кода.
+- **Проекты, аккаунты и настройки переезжают сами.** Brow находит `config.json` Grove в `~/Library/Application Support/Grove` и включает с ним Workspaces. Ничего не переносится, а строки состояния, которые перехватил Grove, продолжают работать.
+- **Утилита командной строки теперь `brow`**, а `grove` остаётся её вторым именем, так что ваши скрипты работают как раньше: `brew install efim0v/tap/brow-cli`, а если у вас стоит утилита Grove, сначала `brew uninstall grove-cli`.
+- **Grove.app можно удалить.** Сначала закройте его: пока он работает, Workspaces ждёт и предлагает **Quit Grove**, чтобы два приложения не писали в одни и те же файлы. Затем удалите его или выполните `brew uninstall --cask grove` — только без `--zap`: с ним в Корзину уедет и папка, которой теперь пользуется Brow. Если Grove был у вас в объектах входа, включите вместо этого **Launch at login** в Brow.
-## Разработка
+Что ещё меняется — например, что чёлка читает лимиты каждого аккаунта, чего Grove никогда не делал, — сказано в разделе [Если вы пользовались Grove](https://github.com/efim0v/brow/blob/main/README.ru.md#если-вы-пользовались-grove). Сайт: [efimov.page/brow/ru](https://efimov.page/brow/ru/).
-- `swift test` и `swift test -c release` должны оставаться зелёными.
-- `swift run GroveApp --snapshot /tmp/grove-snap` рендерит экраны приложения в PNG, не запуская его; см. [`docs/snapshot-testing.md`](docs/snapshot-testing.md) (на английском).
-- Скриншоты в этом README пересоздаются командой
- `DEMO_SCREENSHOTS_DIR="$PWD/docs/screenshots" swift test --filter DemoScreenshotTests`.
-- Конфигурация Grove хранится в `~/Library/Application Support/Grove/config.json`.
+Последний релиз Grove, [0.2.2](https://github.com/efim0v/grove/releases/tag/0.2.2), остаётся доступным для справки, как и код в этом репозитории. Чтобы удалить Grove, не переходя на Brow, следуйте [шагам удаления из его README](https://github.com/efim0v/grove/blob/0.2.2/README.ru.md#удаление).
## Лицензия
diff --git a/README.zh-CN.md b/README.zh-CN.md
index 5cf6dd7..88feb1e 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -1,254 +1,27 @@
[English](README.md) · [Русский](README.ru.md) · 简体中文
-网站:[efimov.page/grove/zh-cn](https://efimov.page/grove/zh-cn/)
-
> 本文是[英文 README](README.md) 的译文。英文版可能比译文更新,两者不一致时以英文版为准。
-# Grove:面向并行 Claude Code 会话的多仓库 git worktree 工作区
-
-[](https://github.com/efim0v/grove/actions/workflows/ci.yml)
-[](https://github.com/efim0v/grove/releases/latest)
-[](LICENSE)
-[](#系统要求)
-
-一款 macOS 菜单栏应用,用来在拆分为多个仓库的产品上运行 [Claude Code](https://claude.com/claude-code) 及其他 AI 编程智能体。
-
-Grove 为每个功能提供独立的**工作区**(workspace):一个目录,里面放着每个仓库的 git worktree。Claude Code 在这个目录中启动,看到的整个产品都处于同一个分支,因此并行的智能体会话永远不会在分支上互相干扰。Claude Code 自带的 `--worktree` 只在单个仓库内做到这一点,[两者的区别见下文](#为什么不用-claude-code-自带的-worktree)。此外,当一个 Claude 账号的限额用完时,Grove 还能把会话转到另一个账号上继续。
-
-**[下载 macOS 版 Grove](https://github.com/efim0v/grove/releases/latest/download/Grove.zip)** 或 `brew install --cask efim0v/tap/grove` · macOS 26 或更高版本,Apple 芯片 · [安装说明](#安装)
-
-> **配套应用:[Brow](https://github.com/efim0v/brow)**。Brow 常驻在 MacBook 的刘海里,显示你所有 Claude 账号的用量限额。Grove 负责在账号之间转移工作,Brow 告诉你哪个账号还有余量。两者都可以单独运行,同时也是专为搭配使用而设计的。
-
-
-
-
-
-
-所有截图展示的都是虚构的演示数据。
-
-## 问题所在
-
-当 Claude Code 能在一个目录里看到整个产品时,它的效果最好。单体仓库(monorepo)天然做到了这一点。但很多产品拆分在多个仓库中——客户端、服务端、服务端配置、管理后台、落地页,再加上几个微服务——仅仅为了智能体就把数百万行代码合并进一个仓库,并不总是明智的,光是“谁该有权访问什么”就是个问题。
-
-在多仓库项目上并行运行几个智能体,它们就会在分支上互相绊脚:一个智能体在服务端仓库里切换了分支,另一个正在开发别的功能的智能体看到的代码就突然不对了。
-
-## 工作区
-
-Grove 的答案是**工作区**:为一个功能或一个 epic 准备的外层目录,里面放着你选中的每个仓库的 git worktree,全部处于同一个分支。
-
-```
-~/Workspaces/acme-shop/checkout-redesign/ <- start Claude Code here
-├── web-client/ worktree on feat/checkout-redesign
-├── api-server/ worktree on feat/checkout-redesign
-└── server-config/ worktree on feat/checkout-redesign
-```
-
-Claude Code 在这个外层目录中启动。它实际上得到了整个项目在该功能分支上的一份私有副本,其他会话无论做什么,都改变不了它脚下的分支。同时推进十个功能,就是十个目录。
-
-创建工作区只需要一个名字和一次点击:Grove 会在每个仓库中运行 `git worktree add`,套用你的分支模板,放入 `CLAUDE.md` 等共享文件,并运行创建后钩子。工作区还可以叠加,即从另一个工作区而不是基础分支分叉出来;这棵树由 Grove 直接从 git 本身推导出来。
-
-