chore(claude): agents view readiness — cleanup, .worktreeinclude, workflow #497

Merged
lekss361 merged 1 commit from chore/agents-view-readiness into main 2026-05-24 09:20:26 +00:00
Owner

Summary

Подготовка для перехода на claude agents (Agent View) как daily-driver workflow вместо одиночной session + subagent spawning. Это 2026 фича Claude Code — dashboard для управления 3-5 background sessions одновременно, каждая в своей worktree.

Changes

1. scripts/cleanup-merged-worktrees.sh (new, executable)

Удаляет worktrees чьи branches уже merged в forgejo/main. Safe — использует git merge-base --is-ancestor, не трогает unmerged WIP. Для cron weekly или ручного запуска после merge bursts.

Текущая утилизация (до merge этого PR): 102 worktrees, 14GB в .claude/worktrees/. После одного прогона script'а удалил 3 (только non-squash-merged). 99 worktrees остаются — это unmerged WIP или squash-merged (где local SHA не ancestor remote main). Aggressive cleanup (по возрасту + Forgejo PR API check) — отдельным future PR если станет критично.

2. .worktreeinclude (new)

Список gitignored файлов которые auto-копируются в каждую новую worktree (Anthropic feature):

  • backend/.env, backend/.env.runtime — иначе backend не стартанёт
  • frontend/.env.local — иначе API_BASE_URL отсутствует
  • .mcp.json — иначе Obsidian MCP не подключится

Без этого каждая background session = broken environment.

3. .claude/rules/git-pr.md updates

Новая MANDATORY workflow — default через claude --bg --name X background session:

  • supervisor создаёт worktree автоматически (от forgejo/main через worktree.baseRef: fresh в settings)
  • session работает self-contained: код → commit → push → PR
  • agent view row показывает status dot (🟡/🟢/🔴/) реалтайм

Foreground (git checkout -b feat/X forgejo/main) — fallback для ad-hoc / интерактивных fixes.

Session naming MANDATORY: --name "<type>-<scope>-<detail>" (kebab-case ≤30). Resume: claude --resume X. Filter в agent view: type prefix в input.

Polling section обновлён — preferred path = agent view row status (no manual loop), foreground fallback = Skill loop с MCP.

Новая секция Multi-session workflow (Agent View) — параллелизм budget (3-5), Ctrl+T pin для long-running, deprecation manual git worktree add, weekly cleanup script reference.

Local-only (NOT in this PR)

.claude/settings.json дополнен:

"worktree": {
  "baseRef": "fresh",
  "bgIsolation": "worktree"
}

baseRef: fresh исправляет первопричину PR #494 (новые ветки создавались от текущей stale-сессии вместо main). bgIsolation: worktree явно фиксирует Anthropic-2026 default — каждая background session ест в собственной worktree, main checkout не трогается.

Файл gitignored как личная preference (per team-shared .gitignore rule).

Test plan

  • После merge: claude agents открыть → dispatch test session claude --bg --name test-agents-view "echo hello" → row появится → peek → attach → детач ()
  • worktree.baseRef: fresh верификация: создать новую background session → check git -C .claude/worktrees/agent-XXX log --oneline -1 → должен начинаться от forgejo/main SHA, не от текущей session-ветки
  • cleanup-merged-worktrees.sh re-run weekly когда .claude/worktrees/ >100 dirs

Out of scope (deferred)

  • Aggressive cleanup (по возрасту, по Forgejo PR API status) — current --is-ancestor пропускает squash-merged
  • Cron entry для weekly cleanup — пусть юзер сам решит (cron / Task Scheduler)
  • CLAUDE.md update про agents view — отдельным PR после привыкания к workflow

Notes

Pure infrastructure / docs. No app code touched. Не триггерит deploy.yml.

## Summary Подготовка для перехода на `claude agents` (Agent View) как daily-driver workflow вместо одиночной session + subagent spawning. Это 2026 фича Claude Code — dashboard для управления 3-5 background sessions одновременно, каждая в своей worktree. ## Changes ### 1. `scripts/cleanup-merged-worktrees.sh` (new, executable) Удаляет worktrees чьи branches уже merged в `forgejo/main`. Safe — использует `git merge-base --is-ancestor`, не трогает unmerged WIP. Для cron weekly или ручного запуска после merge bursts. **Текущая утилизация (до merge этого PR):** 102 worktrees, 14GB в `.claude/worktrees/`. После одного прогона script'а удалил 3 (только non-squash-merged). 99 worktrees остаются — это unmerged WIP или squash-merged (где local SHA не ancestor remote main). Aggressive cleanup (по возрасту + Forgejo PR API check) — отдельным future PR если станет критично. ### 2. `.worktreeinclude` (new) Список gitignored файлов которые auto-копируются в каждую новую worktree (Anthropic feature): - `backend/.env`, `backend/.env.runtime` — иначе backend не стартанёт - `frontend/.env.local` — иначе API_BASE_URL отсутствует - `.mcp.json` — иначе Obsidian MCP не подключится Без этого каждая background session = broken environment. ### 3. `.claude/rules/git-pr.md` updates **Новая MANDATORY workflow** — default через `claude --bg --name X` background session: - supervisor создаёт worktree автоматически (от `forgejo/main` через `worktree.baseRef: fresh` в settings) - session работает self-contained: код → commit → push → PR - agent view row показывает status dot (🟡/🟢/🔴/⚫) реалтайм Foreground (`git checkout -b feat/X forgejo/main`) — fallback для ad-hoc / интерактивных fixes. **Session naming MANDATORY**: `--name "<type>-<scope>-<detail>"` (kebab-case ≤30). Resume: `claude --resume X`. Filter в agent view: type prefix в input. **Polling section** обновлён — preferred path = agent view row status (no manual loop), foreground fallback = Skill loop с MCP. **Новая секция `Multi-session workflow (Agent View)`** — параллелизм budget (3-5), `Ctrl+T` pin для long-running, deprecation manual `git worktree add`, weekly cleanup script reference. ## Local-only (NOT in this PR) `.claude/settings.json` дополнен: ```json "worktree": { "baseRef": "fresh", "bgIsolation": "worktree" } ``` `baseRef: fresh` исправляет первопричину PR #494 (новые ветки создавались от текущей stale-сессии вместо main). `bgIsolation: worktree` явно фиксирует Anthropic-2026 default — каждая background session ест в собственной worktree, main checkout не трогается. Файл gitignored как личная preference (per team-shared `.gitignore` rule). ## Test plan - [ ] После merge: `claude agents` открыть → dispatch test session `claude --bg --name test-agents-view "echo hello"` → row появится → peek → attach → детач (`←`) - [ ] `worktree.baseRef: fresh` верификация: создать новую background session → check `git -C .claude/worktrees/agent-XXX log --oneline -1` → должен начинаться от `forgejo/main` SHA, не от текущей session-ветки - [ ] `cleanup-merged-worktrees.sh` re-run weekly когда `.claude/worktrees/` >100 dirs ## Out of scope (deferred) - Aggressive cleanup (по возрасту, по Forgejo PR API status) — current `--is-ancestor` пропускает squash-merged - Cron entry для weekly cleanup — пусть юзер сам решит (cron / Task Scheduler) - CLAUDE.md update про agents view — отдельным PR после привыкания к workflow ## Notes Pure infrastructure / docs. No app code touched. Не триггерит deploy.yml.
lekss361 added 1 commit 2026-05-24 09:14:46 +00:00
Подготовка к переходу на 'claude agents' dashboard как daily driver:

- scripts/cleanup-merged-worktrees.sh: removes worktrees whose branch is
  ancestor of forgejo/main. Run weekly via cron or manually after merge
  bursts. Safe — skips unmerged branches and current worktree.

- .worktreeinclude: copies .env files + .mcp.json into every new worktree
  (otherwise backend/frontend/MCP fail to start in fresh worktrees Claude
  creates for background sessions).

- .claude/rules/git-pr.md:
  - new MANDATORY workflow: default 'claude --bg --name X' background
    session (auto worktree, auto baseRef=fresh) vs foreground fallback
  - session naming convention (--name kebab-case)
  - polling section: preferred (agents view row status ●) vs foreground
    fallback (Skill loop)
  - new 'Multi-session workflow (Agent View)' section: parallelism budget,
    Ctrl+T pin, deprecated 'manual git worktree add', weekly cleanup ref

Local-only (not in this PR):
- .claude/settings.json: worktree.{baseRef:fresh, bgIsolation:worktree}
  (gitignored as personal preference)

Pre-cleanup state: 102 worktrees / 14GB. After: 99 / 14GB — only 3 squash-
merged branches removed via safe --is-ancestor check; 99 retained as
unmerged WIP. Aggressive cleanup (by age + Forgejo PR check) — future PR.
lekss361 merged commit 998c8a17a8 into main 2026-05-24 09:20:26 +00:00
Author
Owner

Merged via deep-code-reviewer — verdict APPROVE (MINOR nits, non-blocking).

Security: .worktreeinclude contains only path patterns (no secret values). Parent .gitignore lines 25-29 (.env, .env.local, .env.runtime, .mcp.json) + line 56 (.claude/worktrees/) ensure copied files remain ignored even when reached via worktree paths.

Cleanup script safety: git merge-base --is-ancestor correctly skips unmerged WIP, force-pushed orphans, and squash-merged branches. Skips main worktree and detached HEADs. --force on remove is required because supervisor locks worktrees — acceptable since only merged branches are touched.

git-pr.md updates: consistent with existing memory (feedback_use_loop_skill_for_pr_polling preserved as foreground fallback, feedback_no_self_review external window flow unchanged). Default workflow now claude --bg --name <type-scope-detail>.

Nits (low, can land in next chore PR):

  • set -e only — set -euo pipefail is more defensive
  • REMOVED/KEPT counters incremented in subshell (piped while loop) won't propagate to parent — cosmetic, never printed
  • --force on a merged-but-locally-uncommitted worktree will discard those uncommitted changes — extremely unlikely scenario (work is already in main), but worth a git status --porcelain check pre-remove if you want extra paranoia
  • Minor: dwa раза typo, soft-hyphens in wee­k­ly cron
Merged via deep-code-reviewer — verdict APPROVE (MINOR nits, non-blocking). **Security**: `.worktreeinclude` contains only path patterns (no secret values). Parent `.gitignore` lines 25-29 (`.env`, `.env.local`, `.env.runtime`, `.mcp.json`) + line 56 (`.claude/worktrees/`) ensure copied files remain ignored even when reached via worktree paths. **Cleanup script safety**: `git merge-base --is-ancestor` correctly skips unmerged WIP, force-pushed orphans, and squash-merged branches. Skips main worktree and detached HEADs. `--force` on remove is required because supervisor locks worktrees — acceptable since only merged branches are touched. **git-pr.md updates**: consistent with existing memory (`feedback_use_loop_skill_for_pr_polling` preserved as foreground fallback, `feedback_no_self_review` external window flow unchanged). Default workflow now `claude --bg --name <type-scope-detail>`. Nits (low, can land in next chore PR): - `set -e` only — `set -euo pipefail` is more defensive - `REMOVED`/`KEPT` counters incremented in subshell (piped while loop) won't propagate to parent — cosmetic, never printed - `--force` on a merged-but-locally-uncommitted worktree will discard those uncommitted changes — extremely unlikely scenario (work is already in main), but worth a `git status --porcelain` check pre-remove if you want extra paranoia - Minor: `dwa раза` typo, soft-hyphens in `wee­k­ly cron`
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#497
No description provided.