docs(claude): mandate branch+PR workflow, ban direct push to main #84
1 changed files with 80 additions and 20 deletions
100
CLAUDE.md
100
CLAUDE.md
|
|
@ -32,7 +32,9 @@
|
|||
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`
|
||||
- Колонки удаляются `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
|
||||
- `main` — protected, triggers prod deploy on push
|
||||
- Feature branches: `feat/short-description` / `fix/short-description`
|
||||
- `main` — protected, **никаких direct push**. Только через PR merge.
|
||||
- Feature branches: `feat/short-description` / `fix/short-description` / `refactor/...` / `docs/...` / `chore/...`
|
||||
- Trunk-based, мелкие PR'ы (1-2 файла или 1 концептуальное изменение)
|
||||
|
||||
### Commit messages
|
||||
### Commit messages (на feature branch)
|
||||
- Imperative mood: "fix worker crash" не "fixed worker crash"
|
||||
- Длинный prefix: `feat(scope): ...`, `fix(scope): ...`, `refactor(scope): ...`, `docs(scope): ...`, `chore: ...`
|
||||
- Body — почему, не что (что видно в diff)
|
||||
- Атомарные коммиты — один логический шаг = один коммит
|
||||
- НЕ добавлять `Co-Authored-By: Claude ...` (per feedback rule)
|
||||
|
||||
### PR review
|
||||
- Обязательный self-review перед request review
|
||||
- Описание PR: links на issue / vault entity, скрин для UI changes
|
||||
- Squash on merge
|
||||
### PR
|
||||
- Title: краткое описание изменения (под 70 символов)
|
||||
- Body должен содержать:
|
||||
- `## 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 (НЕ нарушать)
|
||||
|
||||
1. **Никогда не делай `git commit` сам** — пользователь коммитит лично. Ты пишешь сообщение в чат, пользователь применяет.
|
||||
2. **Никогда не используй `--no-verify` / `--no-edit` / `--amend`** — pre-commit hooks обязательны. Если hook падает — fix root cause, не bypass.
|
||||
3. **Никогда не пуш с `--force` в main** — катастрофа для всей команды.
|
||||
4. **Не вызывай destructive команды без явного approval**: `git reset --hard`, `git clean -fdx`, `DROP TABLE`, `TRUNCATE`, `rm -rf` за пределами `node_modules/.next`.
|
||||
1. **НИКОГДА не пуш напрямую в main.** Только через PR merge.
|
||||
2. **Worker-agents (backend/frontend/devops/database) НЕ делают `git commit` сами.** Они оставляют изменения staged — main session коммитит на feature branch.
|
||||
3. **Никогда не используй `--no-verify` / `--no-edit` / `--amend`** — pre-commit hooks обязательны. Если hook падает — fix root cause, не bypass.
|
||||
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
|
||||
|
||||
|
|
@ -304,14 +357,20 @@ Main session запускает worker'ов в order'е (по dependencies)
|
|||
```
|
||||
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:
|
||||
• ✅ APPROVE → main session коммитит + пушит
|
||||
• ⚠️ MINOR → main session решает (или пускает, или возвращает worker'у)
|
||||
• ❌ MAJOR → BLOCK push, возвращает worker'у на исправление
|
||||
• ✅ APPROVE → main session коммитит на feature branch
|
||||
• ⚠️ MINOR → main session решает (или коммитит, или возвращает 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 для:
|
||||
|
|
@ -414,9 +473,10 @@ Loop until ✅ → git push origin HEAD:main
|
|||
- ❌ Писать новые сущности в `old/` папку vault'а — это архив legacy paths.
|
||||
|
||||
### 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 нельзя.
|
||||
- ❌ `git push --force` в main или shared branches.
|
||||
- ❌ `git push --force` ни в main ни в feature branch без approval.
|
||||
- ❌ Hardcode credentials в код / в коммиты. Используй `os.environ.get()` + `.env`/`.env.runtime`.
|
||||
- ❌ `print(...)` для логирования в prod-коде — использовать `logger.info/warning/error`.
|
||||
- ❌ Catching `Exception` без re-raise или явного логирования (silent failures).
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue