docs(claude): mandate branch+PR workflow, ban direct push to main
This commit is contained in:
parent
053ce29a40
commit
bc32822cc1
1 changed files with 60 additions and 11 deletions
71
CLAUDE.md
71
CLAUDE.md
|
|
@ -157,30 +157,79 @@ 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
|
||||||
|
|
||||||
|
### Code review pipeline
|
||||||
|
|
||||||
|
```
|
||||||
|
Worker (backend/frontend/database/devops) пишет код
|
||||||
|
↓
|
||||||
|
Worker (или main session) делает commit на feature branch
|
||||||
|
↓
|
||||||
|
[опционально] code-reviewer agent делает review
|
||||||
|
↓ если ✅
|
||||||
|
git push origin feat/branch
|
||||||
|
↓
|
||||||
|
gh pr create
|
||||||
|
↓
|
||||||
|
Notify user with PR URL → wait for approval
|
||||||
|
↓
|
||||||
|
User approves / requests changes
|
||||||
|
↓
|
||||||
|
Если changes — main session делает fixup commits на той же branch
|
||||||
|
↓
|
||||||
|
User merges PR (or `gh pr merge` после явного "merge it")
|
||||||
|
```
|
||||||
|
|
||||||
### 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. **Никогда не используй `--no-verify` / `--no-edit` / `--amend`** — pre-commit hooks обязательны. Если hook падает — fix root cause, не bypass.
|
||||||
3. **Никогда не пуш с `--force` в main** — катастрофа для всей команды.
|
3. **Никогда не пуш с `--force` ни в main ни в feature branch без approval.**
|
||||||
4. **Не вызывай destructive команды без явного approval**: `git reset --hard`, `git clean -fdx`, `DROP TABLE`, `TRUNCATE`, `rm -rf` за пределами `node_modules/.next`.
|
4. **Не merge PR без явного "merge it" / "ok merge" от пользователя.**
|
||||||
|
5. **Не вызывай destructive команды без явного approval**: `git reset --hard`, `git clean -fdx`, `DROP TABLE`, `TRUNCATE`, `rm -rf` за пределами `node_modules/.next`.
|
||||||
|
|
||||||
|
### Когда auto-mode
|
||||||
|
|
||||||
|
Даже в auto-mode НЕ пушим в main без PR. Auto-mode позволяет:
|
||||||
|
- Создавать branches и commits автономно
|
||||||
|
- Делать `gh pr create`
|
||||||
|
- Прогонять code-reviewer
|
||||||
|
- НО — финальный merge только по явному approval от пользователя.
|
||||||
|
|
||||||
## Pre-commit hooks
|
## Pre-commit hooks
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue