refactor(skills): оптимизирован codex-review для Plan Mode и resume

- Зачем:
  - в Plan Mode ревью плана вызывало ~5 permission prompts (git, Write, rm),
    хотя для плана git не нужен, а план уже является файлом.
- Что:
  - добавлен fast path: явный `plan` или Plan Mode пропускают git-проверки
  - base branch определяется лениво (только для code/code-vs-plan)
  - resume упрощён через `2>/dev/null` (stderr → /dev/null, stdout = чистое ревью)
  - cleanup пропускается в Plan Mode, best-effort вне его
  - удалены deprecated permissions claude-diff-* из settings.local.json
- Проверка:
  - `/codex-review plan` в Plan Mode — 0 permission prompts
  - `/codex-review code` вне Plan Mode — работает как раньше

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
ddadminandClaude Opus 4.6 committed 2026-04-03 12:26:46 +03:00
1 parent fee4587129
commit 76e6b293c8
3 files changed
+41 -21

No files matched your search

+7
View File
@@ -30,11 +30,18 @@
Также разобраться с поведением `codex exec resume` — переключается на
`workspace-write` sandbox и `xhigh` reasoning вместо запрошенных `read-only` / `high`.
## ~~codex-review: plan mode без git~~ DONE
Реализовано: fast path для режима `plan` — при явном аргументе `plan` или
в Claude Code Plan Mode git-проверки и определение base branch пропускаются.
Resume упрощён через `2>/dev/null` (stderr → /dev/null, stdout = чистое ревью).
## codex-review: pipe в определении base branch
Команда `git symbolic-ref ... | sed` содержит pipe `|`, который может
триггерить permission prompt в Claude Code. Пока не триггерит, но если начнёт —
заменить на два отдельных вызова или определять branch иначе.
Актуально только для режимов `code` и `code-vs-plan` — в `plan` git не вызывается.
## codex-review: отдельный репозиторий + статья на Хабр
+34 -19
View File
@@ -25,9 +25,14 @@ user_invocable: true
### Шаг 1: Определить режим ревью
Определи, что ревьюить, по контексту и аргументам:
Определи, что ревьюить. Проверяй в порядке приоритета:
**Автодетект (без явного аргумента):**
**1. Явный аргумент** (`plan`, `code`, путь к файлу) → использовать его.
- Для `plan` → пропустить все git-проверки, перейти к шагу 2 (только REVIEW_ID).
**2. Claude Code Plan Mode** — если в контексте есть системное сообщение "Plan mode is active" → режим = `plan`, пропустить git. В Plan Mode код не редактируется, поэтому code/code-vs-plan невозможны.
**3. Автодетект** (без явного аргумента, вне Plan Mode):
1. Проверь наличие изменений кода (любой непустой — значит есть):
- `git diff --name-only` — unstaged
@@ -42,14 +47,16 @@ user_invocable: true
| Да | Нет | **code** — ревью изменений кода |
| Нет | Нет | Спросить пользователя, что ревьюить |
**Явные аргументы** имеют приоритет над автодетектом: `plan`, `code` или путь к файлу.
### Шаг 2: Сгенерировать Session ID
### Шаг 2: Сгенерировать Session ID и определить base branch
Сгенерируй уникальный `REVIEW_ID` самостоятельно, формат: `{unix_timestamp}-{случайное_4значное_число}`.
Пример: `1711872000-4821`. **НЕ используй bash** — подставляй значение напрямую в команды следующих шагов.
Определи base branch репозитория:
**Определение base branch (только для режимов `code` и `code-vs-plan`):**
Для режима `plan` — пропустить определение base branch, перейти к шагу 3.
Для остальных режимов определи base branch репозитория:
```bash
git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's|refs/remotes/origin/||'
@@ -67,8 +74,8 @@ git rev-parse --verify main 2>/dev/null && echo main || echo master
**Ревью плана:**
- Если план уже существует как файл (в `project/`, memory или где-то в репо) — использовать путь напрямую. НЕ копировать.
- Если план только в контексте разговора — записать через **Write tool** в `/tmp/claude-plan-${REVIEW_ID}.md`.
- Если план уже существует как файл (в `project/`, plan file от Plan Mode, memory или где-то в репо) — использовать путь напрямую. НЕ копировать. В Claude Code Plan Mode план всегда является файлом.
- Если план только в контексте разговора (вне Plan Mode) — записать через **Write tool** в `/tmp/claude-plan-${REVIEW_ID}.md`.
- **Обязательно вывести путь к файлу плана пользователю**, чтобы он мог открыть его в IDE:
`📄 План для ревью: <путь-к-файлу>`
@@ -247,9 +254,9 @@ If changes are needed, end with exactly: VERDICT: REVISE"
### Шаг 7: Переотправить в Codex (Раунды 2-5)
**Предпочтительно: `resume`** — экономит токены, сохраняет контекст сессии:
**Resume — основной путь.** Экономит токены и сохраняет контекст сессии Codex. Свежий `codex exec` без resume — **аварийный fallback**, расходует значительно больше токенов. Использовать только при ошибке resume.
1. Запусти (без перенаправлений):
1. Запусти resume с подавлением stderr (`2>/dev/null`):
```bash
timeout 600 codex exec resume ${CODEX_SESSION_ID} \
@@ -258,20 +265,19 @@ timeout 600 codex exec resume ${CODEX_SESSION_ID} \
Here's what I changed:
[Список правок]
Please re-review. End with VERDICT: APPROVED or VERDICT: REVISE"
Please re-review. End with VERDICT: APPROVED or VERDICT: REVISE" 2>/dev/null
```
Используй `timeout: 620000` в параметрах Bash tool.
2. Bash tool захватывает и stdout, и stderr. Проверь результат по exit code:
- **exit 0** — успех. Сохрани stdout через **Write tool** в `/tmp/codex-review-${REVIEW_ID}.md`.
**Проверка полноты:** убедись что **последняя непустая строка** stdout — это ровно `VERDICT: APPROVED` или `VERDICT: REVISE`. Если вердикт отсутствует или не на последней строке — вывод мог быть обрезан; перейди к Fallback (свежий `codex exec -o`, который пишет напрямую в файл без риска truncation).
- **exit 124** — таймаут. Сообщи пользователю: "Codex не ответил за 10 минут" и предложи повторить (аналогично шагу 4).
- **другой exit code** — покажи пользователю stderr/stdout для диагностики, затем перейди к Fallback.
**Почему `2>/dev/null`:** `codex exec` по дизайну разделяет потоки — progress/metadata → stderr, финальный ответ модели → stdout. Подавление stderr даёт чистый вывод без CLI-шума. Результат Bash tool = только ревью.
**Примечание:** `resume` не поддерживает `-o`, поэтому вывод идёт в stdout Bash tool. Затем читай файл как обычно (Шаг 5).
2. Проверь результат по exit code:
- **exit 0** — успех. stdout содержит чистое ревью. Показать пользователю напрямую (Write в файл и Read **не нужны**). Проверить VERDICT: последняя непустая строка stdout = `VERDICT: APPROVED` или `VERDICT: REVISE`. Если вердикт отсутствует → вывод мог быть обрезан, перейти к Fallback. Далее применить обработку вердикта из Шага 5 (APPROVED → Шаг 8, REVISE → Шаг 6).
- **exit 124** — таймаут. Сообщи пользователю: "Codex не ответил за 10 минут" и предложи повторить.
- **другой exit code** — сообщи пользователю: "Resume не удался (exit code N)". Перейди к Fallback. Диагностика без stderr недоступна — не пытайся парсить stdout как ошибку.
**Fallback** — если `resume` не сработал (сессия истекла, session ID не захвачен):
**Fallback** — если `resume` не сработал (сессия истекла, session ID не захвачен, ошибка):
1. Собрать список изменённых файлов (аналогично Шагу 3).
2. Запустить свежий `codex exec -o` с описанием предыдущих раундов в промпте.
@@ -307,16 +313,25 @@ Please re-review. End with VERDICT: APPROVED or VERDICT: REVISE"
### Шаг 9: Очистка
**В Claude Code Plan Mode:** пропустить любой cleanup (включая deferred). rm вызовет permission prompt. Файлы подчистятся при следующем вызове вне Plan Mode.
**Вне Plan Mode:**
```bash
rm -f /tmp/claude-plan-${REVIEW_ID}.md /tmp/codex-review-${REVIEW_ID}.md
```
НЕ удалять файлы планов, которые существовали до ревью (только temp-файлы, созданные этим скиллом).
Если пользователь отклонил rm — продолжить без ошибки.
НЕ удалять файлы планов, которые существовали до ревью (только temp-файлы, созданные этим скиллом). Старые temp-файлы от предыдущих сессий безвредны в /tmp и очистятся ОС при перезагрузке.
## Правила
- Claude **активно правит** по замечаниям Codex — это НЕ просто передача сообщений
- Автодетект режима ревью по контексту; аргументы пользователя имеют приоритет
- При явном аргументе `plan` или в Claude Code Plan Mode: пропускать git-проверки и определение base branch
- Resume — основной путь для повторных раундов. Свежий exec — аварийный fallback (дорогой по токенам)
- Cleanup — best-effort: в Plan Mode пропускать, при отказе продолжать без ошибки
- Предпочитать существующие файлы, не создавать лишние копии
- Всегда read-only sandbox — Codex никогда не пишет файлы
- Максимум 5 раундов для защиты от бесконечных циклов
-2
View File
@@ -105,13 +105,11 @@
"Bash(gh repo:*)",
"Bash(codex *)",
"Bash(timeout 600 codex exec *)",
"Bash(rm -f /tmp/claude-diff-*)",
"Bash(rm -f /tmp/claude-plan-*)",
"Bash(rm -f /tmp/codex-review-*)",
"WebSearch",
"mcp__claude_ai_Context7__resolve-library-id",
"Write(/tmp/claude-plan-*)",
"Write(/tmp/claude-diff-*)",
"Write(/tmp/codex-review-*)"
]
},