diff --git a/CLAUDE.md b/CLAUDE.md index f93940c..059a32f 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -72,10 +72,17 @@ git pull --rebase # ЗАВЖДИ перед роботою у bac ### No hardcodes у нових патчах Перш ніж писати літерал (URL, домен, GA ID, magic number) — `grep` чи вже є у `views/config/` чи аналогічному місці. Існує — import/include. Нема — додай як параметр у `views/config/site.lua` (якщо буде створено) і потім use. +### Docs upkeep — meta-rule +**Якщо ти витратив >5 хвилин шукаючи інформацію про інфраструктуру / команди / шляхи / hooks / scripts — це signal що документація не покриває цю area.** Після того як знайшов відповідь: +1. Додай знайдену інформацію у відповідний doc файл (як правило `docs/INFRASTRUCTURE.md` для systemic / Operational, інше — у domain doc) +2. Додай пункт у [docs/RECOMMENDATIONS.md](docs/RECOMMENDATIONS.md) як D# (DOC) item якщо потрібен ширший update +3. Не дай наступним сесіям повторити пошук + ## Doc Index | Файл | Призначення | |------|-------------| +| **[docs/INFRASTRUCTURE.md](docs/INFRASTRUCTURE.md)** | Мапа `/home/w4/`: bin, scripts, comms, hooks, sessions, memory + cheatsheet | | **[docs/GIT_WORKFLOW.md](docs/GIT_WORKFLOW.md)** | Repo `vtube`, push process, bot commits → goboss push | | **[docs/SITES.md](docs/SITES.md)** | Таблиця 14 портів × домен × cluster × outlier flags | | **[docs/SYNC_WORKFLOW.md](docs/SYNC_WORKFLOW.md)** | Як sync.sh у backup_/ працює, 2 парадигми | diff --git a/docs/INFRASTRUCTURE.md b/docs/INFRASTRUCTURE.md new file mode 100644 index 0000000..f809aee --- /dev/null +++ b/docs/INFRASTRUCTURE.md @@ -0,0 +1,158 @@ +# tubev — Infrastructure Map + +Швидкий lookup того, що де лежить у `/home/w4/`. + +## Top-level (`/home/w4/`) + +``` +/home/w4/ +├── .claude/ # Claude Code config (settings, hooks, projects) +├── .bashrc # alias ll/la/l + PATH=$HOME/bin +├── .tmux.conf # tmux config +├── bin/ # PATH scripts (launchers + bot management) +├── scripts/ # bot communication scripts (flock-serialized) +├── comms/ # bot ↔ goboss channel (task / report files) +├── start-devs.sh # bulk launcher (boss/gocc/goorest/all) +├── git-save-all.sh # commit-and-push helper +├── goboss/ # goboss workspace +│ └── tubev/ # ← OUR repo (git@gdev.hserver.cloud:ovtube/vtube.git) +├── gocc1/tubev/ # gocc1 worktree (own clone) +├── gocc2/tubev/ # gocc2 worktree +├── gocc3/tubev/ # gocc3 worktree +├── gocc4/tubev/ # gocc4 worktree +├── backup_/ # 14 prod-mirror dirs (8081, 8084, ..., 8148) +└── *.md # legacy admin1-era docs (read-only, не наші) +``` + +`/home/admin1` — symlink → `/home/w4/`. Старі скрипти референсять `/home/admin1/...`, працює прозоро. + +## `~/bin/` — PATH scripts + +| Script | Призначення | +|--------|-------------| +| `goboss` | Launcher tmux session goboss → CWD `~/goboss` | +| `gocc1` ... `gocc4` | Launcher tmux sessions для ботів → CWD `~/gocc{N}/tubev` | +| `goorest1`, `goorest2`, `goorest3` | (опціонально, не tubev — інший проект) | +| `clear-bots [bot...]` | `/clear` для всіх gocc1-4 (topic switch) | +| `trigger-bots [bot...]` | Auto-pull + signal новий task. Стандартний dispatch. | +| `restart-bots [bot...]` | kill+start+wait+trigger. Для зависів/нових проектів. | +| `deploy-admin-orest.sh` | (опціонально, інший проект) | + +## `~/scripts/` — bot communication + +| Script | Що робить | +|--------|-----------| +| `send_to_goboss.sh ""` | Bot → goboss. Flock-serialized. Stable-idle wait + paste-buffer + dual-Enter + verify. | +| `trigger_bot.sh ""` | goboss → bot. Така ж надійність delivery. | + +**Не використовувати raw `tmux send-keys` для quoted text** — guard-bash.sh блокує (Enter sometimes dropped). + +## `~/comms/` — bot ↔ goboss channel + +| File | Direction | +|------|-----------| +| `gocc{N}-task.md` | goboss → bot (goboss пише, bot читає) | +| `gocc{N}-report.md` | bot → goboss (bot Write tool, hook auto-signals) | + +При normal operation у comms/ тільки 8 файлів (4 task + 4 report). Все інше — проблема (treba clean). + +## `~/.claude/hooks/` — Claude Code hooks + +| Hook | Event | Що робить | +|------|-------|-----------| +| `guard-bash.sh` | PreToolUse:Bash | Блокує: rm на critical paths (/etc, /var, /home/nosfortube), git push для bots, write до /home/nosfortube/, raw tmux send-keys без bot prefix | +| `guard-readonly.sh` | PreToolUse:Edit\|Write | Блокує Edit/Write на `/home/nosfortube/`, `/etc/`, `/var/www/`, `/usr/` | +| `auto-signal-goboss.sh` | PostToolUse:Write\|Bash | Auto-signal `gocc{N}: done` коли bot пише `~/comms/-report.md` | +| `check-inbox.sh` | (опційний) | Periodic inbox check | +| `telegram-notify.sh` | Stop | TG completion ping | +| `guard-readonly.sh.disabled` | (disabled backup) | старіша версія, не активна | + +Конфігурація: `~/.claude/settings.json` секція `hooks`. + +## `~/.claude/projects/` — per-project memory + +| Slug | Owner | +|------|-------| +| `-home-w4-goboss/memory/` | goboss (single source of truth) | +| `-home-w4-gocc{1-4}-tubev/memory/` | symlink → `-home-w4-goboss/memory/` (shared) | + +Auto-determined by Claude Code based on cwd → slug. Якщо bot CWD змінюється → з'являється новий slug; якщо потрібен shared memory — додай symlink. + +`MEMORY.md` у memory/ — auto-loaded в context (індекс). + +## `~/.claude/settings.json` (ключове) + +```json +{ + "permissions": { + "allow": ["Bash(*)", "Read(*)", "Edit(*)", "Write(*)", ...], + "additionalDirectories": ["/home/w4/goboss", "/home/w4/comms", "/tmp"] + }, + "hooks": { + "PreToolUse": [ + {"matcher": "Edit|Write", "command": "/home/admin1/.claude/hooks/guard-readonly.sh"}, + {"matcher": "Bash", "command": "/home/admin1/.claude/hooks/guard-bash.sh"} + ], + "PostToolUse": [ + {"matcher": "Write|Bash", "command": "/home/admin1/.claude/hooks/auto-signal-goboss.sh"} + ] + } +} +``` + +`/home/admin1/...` працює через symlink → `/home/w4/...`. + +## `~/start-devs.sh` — bulk launcher + +```bash +~/start-devs.sh boss # тільки goboss +~/start-devs.sh gocc # gocc1-4 +~/start-devs.sh goorest # (інший проект) +~/start-devs.sh all # все +``` + +Skipує already-running sessions. + +## `~/.bashrc` — environment + +- `PATH=$HOME/bin:$PATH` — saves typing `~/bin/