Worktree в .claude/worktrees/ через EnterWorktree, вход без подтверждения (#25, 0.5.1) #27

Merged
aep merged 1 commits from feat/25-worktrees-in-repo into main 2026-10-23 23:22:49 +03:00
Owner

Closes #25 — решение владельца 23.10.2026, вариант 1. Bounded: дизайн утверждён в чате 24.10.2026.

Зачем

С Claude Code 2.1.206 EnterWorktree с путём вне <repo>/.claude/worktrees/ спрашивает подтверждение при каждом входе. Этот запрос не снимают ни allow-правила, ни additionalDirectories, ни auto mode (docs/worktrees, «Ask Claude to create a worktree»). Соседний каталог ../<repo>.wt/ в обвязке нигде не был записан: его выбрал я в начале сессии. Skill using-git-worktrees велит сначала пользоваться родным инструментом, то есть EnterWorktree.

Что сделано

  • roles/dev.md, «Исполнение»: worktree создаёт EnterWorktree с именем <slug>. Он кладёт его в <repo>/.claude/worktrees/<slug> на временную ветку worktree-<slug> от origin/main; после заведения issue ветка переименовывается командой git branch -m feat/<id>-<slug>. Чеклист закрытия:
    • п. 1 — архивный PR так же: имя archive-<id>, ветка chore/archive-<id>;
    • п. 4 — сначала ExitWorktree (keep), затем git worktree remove и git branch -D. EnterWorktree блокирует worktree (locked claude session …), и ExitWorktree эту блокировку снимает — проверено вживую.
  • .claude/worktrees/ в .gitignore: adopt-project.sh, project-template/gitignore, .gitignore этого репозитория. doctor.sh выдаёт WARN .claude/worktrees/ не в .gitignore. Проверяется git check-ignore .claude/worktrees/ со слешем, поэтому засчитываются и более широкие шаблоны вроде .claude/.
  • Спека hook-guards (openspec/specs/, validate --strict проходит): два сценария.
    • guard-main: запись во вложенном worktree на ветке проходит, запись в основной checkout на main блокируется.
    • require-plan: .bounded основного checkout на вложенный worktree не действует.
  • HARNESS.md (шаг 4, п. 4, абзац о подтверждениях), SKILL.md, CHANGELOG 0.5.1, CLAUDE.md.
  • awp-ca (.wt/<задача>/ в многорепозиторном workspace) не затронут. Вопрос записан в #2, часть 2.

Проверка

  • bash tests/run.sh — passed 519, failed 0. Новых тестов 14:
    • 6 для guard-main и 2 для require-plan. Код хуков не менялся, поэтому эти тесты прошли сразу: они закрепляют уже верное поведение;
    • 6 сначала были красными: test-doctor (2), test-workspace (2), test-roles (2).
  • Вживую:
    • сама эта задача сделана по новому порядку — EnterWorktree с именем 25-worktrees-in-repo, вход без подтверждения, переименование ветки;
    • doctor.sh из ветки на основном checkout выдаёт WARN (его .gitignore пока старый), на worktree — WARN нет;
    • выход и повторный вход в .claude/worktrees/… прошли без подтверждения.

Находки

Маркер Что Статус
O-16 EnterWorktree блокирует worktree (git worktree lock), а заблокированный worktree git worktree remove не удаляет; блокировку снимает ExitWorktree (keep) fixed 00b496d (порядок в п. 4)
O-17 у codegraph_explore с projectPath вложенного worktree без своего индекса отвечает индекс ближайшего каталога выше, то есть основного checkout, — устаревший код без предупреждения. Правило «codegraph init в worktree» в roles/dev.md это закрывает (из README codegraph: «nearest .codegraph/ index at or above that path», вживую не проверялось) deferred

Rulings I made

  • Тесты хуков для вложенного worktree — регрессионные, не TDD: поведение уже было верным. Цена: нет.
  • global/CLAUDE.md не менял: он уже 3058 Б при пороге 3 КБ. Правило лежит в roles/dev.md. Цена: сессия без /role dev о нём не узнает (как и о прочих правилах процесса).
  • git branch --unset-upstream после EnterWorktree не нужен: ветка создаётся без upstream, а git push -u origin feat/… задаёт его сам. Цена: нет.

После merge

bash install.sh --no-permissions (обновит roles/dev.md, doctor). В основном checkout после git pull .claude/worktrees/ перестанет показываться как неотслеживаемый.

🤖 Generated with Claude Code

Closes #25 — решение владельца 23.10.2026, вариант 1. Bounded: дизайн утверждён в чате 24.10.2026. ## Зачем С Claude Code 2.1.206 `EnterWorktree` с путём вне `<repo>/.claude/worktrees/` спрашивает подтверждение при каждом входе. Этот запрос не снимают ни allow-правила, ни `additionalDirectories`, ни auto mode (docs/worktrees, «Ask Claude to create a worktree»). Соседний каталог `../<repo>.wt/` в обвязке нигде не был записан: его выбрал я в начале сессии. Skill `using-git-worktrees` велит сначала пользоваться родным инструментом, то есть `EnterWorktree`. ## Что сделано - **`roles/dev.md`, «Исполнение»**: worktree создаёт `EnterWorktree` с именем `<slug>`. Он кладёт его в `<repo>/.claude/worktrees/<slug>` на временную ветку `worktree-<slug>` от `origin/main`; после заведения issue ветка переименовывается командой `git branch -m feat/<id>-<slug>`. Чеклист закрытия: - п. 1 — архивный PR так же: имя `archive-<id>`, ветка `chore/archive-<id>`; - п. 4 — сначала `ExitWorktree` (keep), затем `git worktree remove` и `git branch -D`. `EnterWorktree` блокирует worktree (`locked claude session …`), и `ExitWorktree` эту блокировку снимает — проверено вживую. - **`.claude/worktrees/` в `.gitignore`**: `adopt-project.sh`, `project-template/gitignore`, `.gitignore` этого репозитория. `doctor.sh` выдаёт `WARN .claude/worktrees/ не в .gitignore`. Проверяется `git check-ignore .claude/worktrees/` со слешем, поэтому засчитываются и более широкие шаблоны вроде `.claude/`. - **Спека `hook-guards`** (`openspec/specs/`, `validate --strict` проходит): два сценария. - guard-main: запись во вложенном worktree на ветке проходит, запись в основной checkout на main блокируется. - require-plan: `.bounded` основного checkout на вложенный worktree не действует. - `HARNESS.md` (шаг 4, п. 4, абзац о подтверждениях), `SKILL.md`, CHANGELOG 0.5.1, `CLAUDE.md`. - awp-ca (`.wt/<задача>/` в многорепозиторном workspace) не затронут. Вопрос записан в #2, часть 2. ## Проверка - `bash tests/run.sh` — passed 519, failed 0. Новых тестов 14: - 6 для guard-main и 2 для require-plan. Код хуков не менялся, поэтому эти тесты прошли сразу: они закрепляют уже верное поведение; - 6 сначала были красными: `test-doctor` (2), `test-workspace` (2), `test-roles` (2). - Вживую: - сама эта задача сделана по новому порядку — `EnterWorktree` с именем `25-worktrees-in-repo`, вход без подтверждения, переименование ветки; - `doctor.sh` из ветки на основном checkout выдаёт WARN (его `.gitignore` пока старый), на worktree — WARN нет; - выход и повторный вход в `.claude/worktrees/…` прошли без подтверждения. ## Находки | Маркер | Что | Статус | |---|---|---| | O-16 | `EnterWorktree` блокирует worktree (`git worktree lock`), а заблокированный worktree `git worktree remove` не удаляет; блокировку снимает `ExitWorktree` (keep) | fixed 00b496d (порядок в п. 4) | | O-17 | у `codegraph_explore` с `projectPath` вложенного worktree без своего индекса отвечает индекс ближайшего каталога выше, то есть основного checkout, — устаревший код без предупреждения. Правило «`codegraph init` в worktree» в `roles/dev.md` это закрывает (из README codegraph: «nearest .codegraph/ index at or above that path», вживую не проверялось) | deferred | ## Rulings I made - Тесты хуков для вложенного worktree — регрессионные, не TDD: поведение уже было верным. Цена: нет. - `global/CLAUDE.md` не менял: он уже 3058 Б при пороге 3 КБ. Правило лежит в `roles/dev.md`. Цена: сессия без `/role dev` о нём не узнает (как и о прочих правилах процесса). - `git branch --unset-upstream` после `EnterWorktree` не нужен: ветка создаётся без upstream, а `git push -u origin feat/…` задаёт его сам. Цена: нет. ## После merge `bash install.sh --no-permissions` (обновит `roles/dev.md`, doctor). В основном checkout после `git pull` `.claude/worktrees/` перестанет показываться как неотслеживаемый. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 1 commit 2026-10-23 23:21:07 +03:00
С Claude Code 2.1.206 вход в worktree вне .claude/worktrees/ спрашивает
подтверждение при любых allow-правилах. EnterWorktree с именем создаёт
worktree в <repo>/.claude/worktrees/<slug> на ветке worktree-<slug> от
origin/main и входит без вопроса; ветка переименовывается в
feat/<id>-<slug>.

- roles/dev.md: «Исполнение» — EnterWorktree с именем; п. 1 закрытия —
  archive-<id>; п. 4 — ExitWorktree (keep) снимает блокировку сессии,
  затем git worktree remove и branch -D.
- .claude/worktrees/ в .gitignore: adopt-project.sh, project-template,
  этот репозиторий; doctor.sh — WARN, если не игнорируется.
- Спека hook-guards: сценарии «worktree внутри репозитория» для
  guard-main и require-plan; тесты закрепляют уже верное поведение.
- HARNESS.md (шаг 4, п. 4, подтверждения), SKILL.md, CHANGELOG 0.5.1,
  CLAUDE.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 957ce1e007 into main 2026-10-23 23:22:49 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: aep/claude-harness#27
No description provided.