docs(claude): mandate branch+PR workflow, ban direct push to main (#84)

* docs(claude): mandate branch+PR workflow, ban direct push to main

* docs(claude): sync TL;DR + Don't-do-these with new PR workflow

Address auto-review feedback:
- TL;DR rule 5 → branch+PR mandate (was: "user commits themselves")
- TL;DR rule 6 → no --no-verify/--force/--amend (split from rule 5)
- Don't-do-these → drop conflicting "no auto-commit" line, add
  "no direct push to main" + "no merge without approval"
- Critical workflow rules: add explicit rule 2 — worker-agents don't
  commit themselves; main session commits on feature branch
- Restore "Squash on merge" wording in PR section (was dropped)
- Auto-mode section: clarify that main session does commits on feature
  branch (worker-agents leave changes staged)

* fix(claude): Code-reviewer diagram had stale 'push origin HEAD:main' — replace with branch+PR flow

---------

Co-authored-by: lekss361 <claudestars@proton.me>
This commit is contained in:
lekss361 2026-05-12 00:16:06 +03:00 committed by GitHub
parent 053ce29a40
commit aadf47709b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

100
CLAUDE.md
View file

@ -32,7 +32,9 @@
obsidian_patch_content / obsidian_append_content / Write (filesystem fallback) obsidian_patch_content / obsidian_append_content / Write (filesystem fallback)
``` ```
5. **No auto-commit, no `--no-verify`** — пишу сообщение коммита в чат, пользователь коммитит. 5. **Branch + PR workflow обязательно** — никаких direct push в main. Создаю feature branch (`feat/...` / `fix/...` / `refactor/...` / `docs/...` / `chore/...`), коммичу туда, push branch, `gh pr create`, отдаю URL пользователю. Merge только по явному approval. См. секцию "Git workflow".
6. **No `--no-verify` / `--force` / `--amend`** — pre-commit hooks обязательны, force-push запрещён.
--- ---
@ -157,30 +159,81 @@ cd frontend && npm run codegen
- View'ы пересоздаются `CREATE OR REPLACE VIEW` - View'ы пересоздаются `CREATE OR REPLACE VIEW`
- Колонки удаляются `ALTER TABLE ... DROP COLUMN IF EXISTS` (после удаления зависимостей) - Колонки удаляются `ALTER TABLE ... DROP COLUMN IF EXISTS` (после удаления зависимостей)
## Git workflow ## Git workflow — BRANCH + PR mandatory
### Workflow (НИКАКОГО direct push в main)
```
1. Создаём feature branch: git checkout -b feat/foo-bar
2. Commits на этой ветке: git commit -m "..."
3. Push branch: git push -u origin feat/foo-bar
4. Создаём PR: gh pr create --title "..." --body "..."
5. Show PR URL пользователю → ждём review
6. Пользователь комментирует / approves
7. После approval — пользователь merge'ит (или я merge'у после явного "merge it")
8. Удаляем branch после merge
```
### Branches ### Branches
- `main` — protected, triggers prod deploy on push - `main` — protected, **никаких direct push**. Только через PR merge.
- Feature branches: `feat/short-description` / `fix/short-description` - Feature branches: `feat/short-description` / `fix/short-description` / `refactor/...` / `docs/...` / `chore/...`
- Trunk-based, мелкие PR'ы (1-2 файла или 1 концептуальное изменение) - Trunk-based, мелкие PR'ы (1-2 файла или 1 концептуальное изменение)
### Commit messages ### Commit messages (на feature branch)
- Imperative mood: "fix worker crash" не "fixed worker crash" - Imperative mood: "fix worker crash" не "fixed worker crash"
- Длинный prefix: `feat(scope): ...`, `fix(scope): ...`, `refactor(scope): ...`, `docs(scope): ...`, `chore: ...` - Длинный prefix: `feat(scope): ...`, `fix(scope): ...`, `refactor(scope): ...`, `docs(scope): ...`, `chore: ...`
- Body — почему, не что (что видно в diff) - Body — почему, не что (что видно в diff)
- Атомарные коммиты — один логический шаг = один коммит - Атомарные коммиты — один логический шаг = один коммит
- НЕ добавлять `Co-Authored-By: Claude ...` (per feedback rule)
### PR review ### PR
- Обязательный self-review перед request review - Title: краткое описание изменения (под 70 символов)
- Описание PR: links на issue / vault entity, скрин для UI changes - Body должен содержать:
- Squash on merge - `## Summary` — 1-3 bullet'a что изменилось
- `## Test plan` — что проверить пользователю / какие команды smoke test'а
- Cross-refs: `Closes #N`, `Relates to #N`, ссылка на vault entity
- `gh pr create` с `--title` + `--body` (через HEREDOC чтобы preserve formatting)
- После создания — **вернуть PR URL пользователю**, ждать его approval
- **Squash on merge** — PR в main объединяется одним коммитом через squash (предпочтительно `gh pr merge --squash`).
### Code review pipeline
```
Worker (backend/frontend/database/devops) пишет код на feature branch
Main session делает commit на feature branch (worker'у запрещено git commit)
[опционально] code-reviewer agent делает review
↓ если ✅
git push -u origin feat/branch
gh pr create → PR URL пользователю
User approves / requests changes
Если changes — main session делает fixup commits на той же branch + push
По явному "merge it" / "approved" от user → gh pr merge --squash
```
### Critical workflow rules (НЕ нарушать) ### Critical workflow rules (НЕ нарушать)
1. **Никогда не делай `git commit` сам** — пользователь коммитит лично. Ты пишешь сообщение в чат, пользователь применяет. 1. **НИКОГДА не пуш напрямую в main.** Только через PR merge.
2. **Никогда не используй `--no-verify` / `--no-edit` / `--amend`** — pre-commit hooks обязательны. Если hook падает — fix root cause, не bypass. 2. **Worker-agents (backend/frontend/devops/database) НЕ делают `git commit` сами.** Они оставляют изменения staged — main session коммитит на feature branch.
3. **Никогда не пуш с `--force` в main** — катастрофа для всей команды. 3. **Никогда не используй `--no-verify` / `--no-edit` / `--amend`** — pre-commit hooks обязательны. Если hook падает — fix root cause, не bypass.
4. **Не вызывай destructive команды без явного approval**: `git reset --hard`, `git clean -fdx`, `DROP TABLE`, `TRUNCATE`, `rm -rf` за пределами `node_modules/.next`. 4. **Никогда не пуш с `--force` ни в main ни в feature branch без approval.**
5. **Не merge PR без явного "merge it" / "ok merge" / "approved" от пользователя.**
6. **Не вызывай destructive команды без явного approval**: `git reset --hard`, `git clean -fdx`, `DROP TABLE`, `TRUNCATE`, `rm -rf` за пределами `node_modules/.next`.
### Когда auto-mode
Даже в auto-mode НЕ пушим в main без PR. Auto-mode позволяет:
- Создавать feature branches автономно
- Делать commits на feature branch (main session делает, не worker'ы)
- `git push -u origin <feature-branch>`
- `gh pr create`
- Прогонять code-reviewer
- **НО — финальный `gh pr merge` только по явному approval от пользователя.**
## Pre-commit hooks ## Pre-commit hooks
@ -304,14 +357,20 @@ Main session запускает worker'ов в order'е (по dependencies)
``` ```
User request → tech-analyst (если cross-domain) User request → tech-analyst (если cross-domain)
Worker (backend/frontend/devops/database) пишет код Main session creates feature branch (git checkout -b feat/...)
Worker (backend/frontend/devops/database) пишет код (staged changes)
**code-reviewer** проверяет staged changes: **code-reviewer** проверяет staged changes:
• ✅ APPROVE → main session коммитит + пушит • ✅ APPROVE → main session коммитит на feature branch
• ⚠️ MINOR → main session решает (или пускает, или возвращает worker'у) • ⚠️ MINOR → main session решает (или коммитит, или возвращает worker'у)
• ❌ MAJOR → BLOCK push, возвращает worker'у на исправление • ❌ MAJOR → BLOCK, возвращает worker'у на исправление
Loop until ✅ → git push origin HEAD:main Loop until ✅ → git push -u origin <feature-branch>
gh pr create → отдаём PR URL пользователю
По явному "merge it" / "approved" → gh pr merge --squash --delete-branch
``` ```
Используй code-reviewer для: Используй code-reviewer для:
@ -414,9 +473,10 @@ Loop until ✅ → git push origin HEAD:main
- ❌ Писать новые сущности в `old/` папку vault'а — это архив legacy paths. - ❌ Писать новые сущности в `old/` папку vault'а — это архив legacy paths.
### Code / git ### Code / git
- ❌ **Commit сам через `git commit`** — пользователь коммитит лично, я пишу сообщение в чат. - ❌ **Direct push в main** — только через PR. Все изменения на feature branch → `gh pr create` → user approval → merge. См. "Git workflow".
- ❌ **Merge PR без явного user approval** ("merge it" / "approved" / "ok merge").
- ❌ `--no-verify`, `--amend`, `--no-edit`, `--no-gpg-sign` — обходить hooks/signing нельзя. - ❌ `--no-verify`, `--amend`, `--no-edit`, `--no-gpg-sign` — обходить hooks/signing нельзя.
- ❌ `git push --force` в main или shared branches. - ❌ `git push --force` ни в main ни в feature branch без approval.
- ❌ Hardcode credentials в код / в коммиты. Используй `os.environ.get()` + `.env`/`.env.runtime`. - ❌ Hardcode credentials в код / в коммиты. Используй `os.environ.get()` + `.env`/`.env.runtime`.
- ❌ `print(...)` для логирования в prod-коде — использовать `logger.info/warning/error`. - ❌ `print(...)` для логирования в prod-коде — использовать `logger.info/warning/error`.
- ❌ Catching `Exception` без re-raise или явного логирования (silent failures). - ❌ Catching `Exception` без re-raise или явного логирования (silent failures).