Files
vtube/docs/GIT_WORKFLOW.md

166 lines
7.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# tubev — Git Workflow
Repo для документації / правил / coordination team. Окремо від `backup_<port>/` (це не один з 14 site repos — це наш infra repo).
## Repo info
| | |
|---|---|
| **Origin** | `git@gdev.hserver.cloud:ovtube/vtube.git` (Gitea) |
| **Auth** | SSH key `w4@frontend03.rss.g--o.info` |
| **Default branch** | `main` |
| **Pull strategy** | rebase (`git config --global pull.rebase true`) |
## Worktree layout
| Path | Owner | Permissions |
|------|-------|-------------|
| `/home/w4/goboss/tubev/` | goboss | full (read/write/commit/push) |
| `/home/w4/gocc1/tubev/` | gocc1 (auditor: code) | read-only doc consumption |
| `/home/w4/gocc2/tubev/` | gocc2 (auditor: test) | read-only doc consumption |
| `/home/w4/gocc3/tubev/` | gocc3 (frontend writer) | edit + commit (no push) |
| `/home/w4/gocc4/tubev/` | gocc4 (architect writer) | edit + commit (no push) |
Кожен worktree — самостійний git clone, не symlink. Це дозволяє кожному боту мати свій stage/index незалежно.
## Push policy
**Тільки goboss пушить до origin.** Це enforced через `guard-bash.sh` hook:
- Bot tries `git push` → BLOCKED
- Bot тримає коміти у власному worktree
- goboss робить cherry-pick з bot worktree → push
**Why:** prevent accidental conflicts / force-push / unreviewed pushes до прода. goboss is single point of push authority.
## When to push (default + exceptions)
**Default: push immediately after commit.** Цей repo — docs/coordination, low-risk. Кожен commit = один atomic logical step (P4 atomic-commits global rule). Не накопичуй commits локально.
```bash
# Стандартний цикл:
git pull --rebase
# edit
git add <files>
git commit -m "..."
git push origin main # ← одразу
```
**Чому push immediately:**
- Bots підтягують через `~/bin/trigger-bots` — швидке рознесення стану
- Conflict window мінімальний (rebase-pull простіший на свіжому стані)
- Audit trail чіткий (кожен commit видимий в origin одразу)
- Не треба пам'ятати "що ще не пушнуто"
**Винятки — НЕ пушити одразу:**
| Situation | Action |
|-----------|--------|
| Multi-step refactor у процесі (3+ commits пов'язані, ще не finalized) | Commit локально, push коли batch complete + code-reviewer agent на повний diff |
| Diff >50 LOC АБО architectural change | Commit локально, **обов'язково** `Agent(superpowers:code-reviewer)` на diff перед push (per `feedback_pre_push_subagent`) |
| Experimental / WIP — developer явно сказав "не пушити поки не скажу" | Commit локально, чекай developer-go |
| Після bot's commit (cherry-pick into goboss worktree) | Push після cherry-pick + reviewer-agent якщо потрібно (workflow B) |
**Не tradeoff'и:** atomic commits + push immediately. Не штучно ділити одну зміну на 5 commits "щоб частіше push'ити". І не штучно групувати незв'язані зміни в один commit "щоб push один раз".
## Workflow patterns
### A. Pure docs change (goboss as author)
```bash
cd ~/goboss/tubev
git pull --rebase # завжди перед роботою
# ... edit docs/SITES.md ...
git add docs/SITES.md
git commit -m "docs: update site 8112 status"
git push origin main
```
Bots autoматично побачать через `~/bin/trigger-bots` (виконує `git pull` для кожного worktree перед signal'ом).
### B. Bot edits (frontend / architect)
Bot edits in own worktree, commits локально:
```bash
# у gocc3 session:
cd ~/gocc3/tubev
git pull --rebase
# ... edit ...
git add <files>
git commit -m "feat: <change>"
# Write report до ~/comms/gocc3-report.md з commit SHA
# git push — БЛОКУЄТЬСЯ guard-bash.sh
```
goboss reads report, потім:
```bash
cd ~/goboss/tubev
git pull --rebase
# Cherry-pick bot's commit
git fetch /home/w4/gocc3/tubev main
git cherry-pick <SHA>
# Pre-push subagent review (per memory feedback_pre_push_subagent)
# якщо ≥50 LOC або architectural — Agent(superpowers:code-reviewer) на diff
git push origin main
```
### C. Recommendations cadence
`docs/RECOMMENDATIONS.md` — багаточасне джерело backlog. Items НЕ виконуються automatically. goboss нагадує developer'у на session start (1 рядок: `📋 RECOMMENDATIONS: N OPEN ...`). Виконання — тільки коли developer дає `go: реалізуй S1`.
Виконання:
1. goboss отримує `go` → читає item з RECOMMENDATIONS.md
2. Якщо implementation потрібно (більше за trivial) → dispatch на gocc3 (frontend) або gocc4 (architect)
3. Bot робить → commits локально → reports
4. goboss cherry-picks → push
5. Item у RECOMMENDATIONS.md → DONE (move до footer)
## Hooks (active enforcement)
| Hook | Effect |
|------|--------|
| `guard-bash.sh` PreToolUse:Bash | Blocks `git push` для gocc/goorest sessions |
| `guard-bash.sh` PreToolUse:Bash | Blocks Bash write/cp/mv до `/home/nosfortube/` (production source) |
| `guard-readonly.sh` PreToolUse:Edit\|Write | Blocks Edit/Write на `/home/nosfortube/`, `/etc/`, `/var/www/` |
| `auto-signal-goboss.sh` PostToolUse:Write | Auto-signals goboss після bot writes report у `~/comms/` |
## Як додати новий бот / worktree
Якщо буде потрібно gocc5 ABO інший role:
1. Створити worktree: `git clone git@gdev.hserver.cloud:ovtube/vtube.git ~/gocc5/tubev`
2. Додати launcher: `~/bin/gocc5` (skopiyuvati з `~/bin/gocc4` і змінити SESSION/WORK_DIR)
3. Додати у `~/start-devs.sh`, `~/bin/trigger-bots`, `~/bin/clear-bots`, `~/bin/restart-bots`
4. Додати role file: `docs/roles/gocc5-<role>.md`
5. Додати у `CLAUDE.md` Team Coordination таблицю
6. `git push` зміни
7. `~/bin/restart-bots gocc5` — перший запуск
## Testing the cycle
Швидкий smoke test після setup:
```bash
# 1. У goboss зробити дрібну зміну
cd ~/goboss/tubev
echo "" >> docs/SITES.md
git add docs/SITES.md
git commit -m "test: smoke push cycle"
git push origin main
# 2. Bot pull (через trigger-bots для всіх ОА per-bot)
~/bin/trigger-bots
# 3. Verify bot бачить
tmux send-keys -t gocc1 'cd ~/gocc1/tubev && git log --oneline -1' Enter
```
Очікуваний результат: bot's `git log` показує той самий SHA що в origin.
## Troubleshooting
- **Bot "git pull failed"** у `~/bin/trigger-bots`: бот worktree не git repo АБО має локальні зміни що conflicting. `cd ~/<bot>/tubev && git status` — перевір.
- **goboss push rejected**: developer (або інший ботworktree, або інший pусnh source) вже запушив. `git pull --rebase && git push`.
- **Symlink на worktree**: НЕ робити. Кожен bot МАЄ власний clone.