feat: система активных агентов — ROADMAP, статусы, команда /project:review

- ROADMAP.md — единый роадмап продукта (реализовано / в работе / бэклог)
- agents/dev-status.md — состояние кода, долг, следующий шаг
- agents/devops-status.md — VPS, блокеры, инфра-бэклог
- agents/design-status.md — компоненты, нереализованные экраны
- agents/feature-status.md — таблица функционала, приоритизированный бэклог
- agents/test-status.md — покрытие, пробелы, следующий шаг
- .claude/commands/review.md — мастер-команда: сводный отчёт по всем агентам
- Все агенты обновлены: читают и пишут свой status.md в начале/конце работы

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
wasrusgen 2026-05-18 11:16:27 +03:00
parent ff35dd769f
commit 7b874e0195
12 changed files with 425 additions and 16 deletions

View File

@ -72,14 +72,16 @@ color: #F5F5F5; /* ✅ почти белый — невидим на свет
## Процесс работы с дизайном ## Процесс работы с дизайном
1. Получить задачу на новый экран или изменение 1. **Прочитать `agents/design-status.md`** — понять что запроектировано, что нет
2. Если нужен прототип → открыть open-design (localhost:17573) 2. Получить задачу на новый экран или изменение
3. Написать/изменить CSS в `styles.css` или `podbor.css` 3. Если нужен прототип → открыть open-design (localhost:17573)
4. Проверить все 4 темы 4. Написать/изменить CSS в `styles.css` или `podbor.css`
5. Запустить CSS-линтер: `python -X utf8 tests/lint_css.py` 5. Проверить все 4 темы
6. Поднять версию `?v=` в `index.html` 6. Запустить CSS-линтер: `python -X utf8 tests/lint_css.py`
7. Запустить `/project:ui-check` 7. Поднять версию `?v=` в `index.html`
8. Коммит только после зелёных проверок 8. Запустить `/project:ui-check`
9. Коммит только после зелёных проверок
10. **Обновить `agents/design-status.md`**: что запроектировано, что нет, следующий шаг
## Компонентная библиотека (существующие классы) ## Компонентная библиотека (существующие классы)
``` ```

View File

@ -34,12 +34,13 @@
- Формат буквы: a → b → c → ... в течение одного дня - Формат буквы: a → b → c → ... в течение одного дня
## Процесс работы ## Процесс работы
1. Прочитать задачу 1. **Прочитать `agents/dev-status.md`** — понять текущее состояние и бэклог
2. Найти нужные файлы (`Glob`, `Grep`, `Read`) 2. Найти нужные файлы (`Glob`, `Grep`, `Read`)
3. Написать код 3. Написать код
4. Поднять версию `?v=` если тронут miniapp 4. Поднять версию `?v=` если тронут miniapp
5. Запустить `/project:test` — убедиться что не сломал 5. Запустить `/project:test` — убедиться что не сломал
6. Закоммитить с понятным сообщением 6. Закоммитить с понятным сообщением
7. **Обновить `agents/dev-status.md`**: добавить в «Сделано», убрать из бэклога, написать новый «Следующий шаг»
## Чего НЕ делать ## Чего НЕ делать
- Не трогать `deploy/` и docker без `/project:devops` - Не трогать `deploy/` и docker без `/project:devops`

View File

@ -65,10 +65,12 @@ curl -s https://api.wasrusgen1.pro/healthz
- Проверить деплой: вкладка Actions в репозитории - Проверить деплой: вкладка Actions в репозитории
## Процесс деплоя ## Процесс деплоя
1. `git push` в master → GitHub Pages обновляется автоматически 1. **Прочитать `agents/devops-status.md`** — проверить блокеры и известные проблемы
2. Для VPS (бот/бэкенд) — запустить SSH-команды выше 2. `git push` в master → GitHub Pages обновляется автоматически
3. Проверить: `curl https://api.wasrusgen1.pro/healthz` → должен вернуть 200 3. Для VPS (бот/бэкенд) — запустить SSH-команды выше
4. Запустить `/project:test` для подтверждения 4. Проверить: `curl https://api.wasrusgen1.pro/healthz` → должен вернуть 200
5. Запустить `/project:test` для подтверждения
6. **Обновить `agents/devops-status.md`**: статус блокеров, новые проблемы, следующий шаг
## Мониторинг и диагностика ## Мониторинг и диагностика
- Если бот не отвечает → проверить логи бота - Если бот не отвечает → проверить логи бота

View File

@ -70,12 +70,21 @@ if (prefill) { /* применить */ sessionStorage.removeItem("prefillClient
- Применить минимальный патч - Применить минимальный патч
- Не ломать существующий функционал - Не ломать существующий функционал
### Шаг 0 — Контекст
**Прочитать `agents/feature-status.md` и `ROADMAP.md`** — понять что реализовано, что нет, приоритеты.
### Шаг 3 — Проверка ### Шаг 3 — Проверка
```bash ```bash
python -X utf8 tests/test_manager.py # полный тест менеджера python -X utf8 tests/test_manager.py # полный тест менеджера
python -X utf8 tests/smoke_api.py # smoke python -X utf8 tests/smoke_api.py # smoke
node tests/ui_smoke.js # UI Playwright
``` ```
### Шаг 4 — Обновление статуса
После реализации **обновить `agents/feature-status.md`** и **`ROADMAP.md`**:
- Переместить функцию из «Бэклог» в «✅ Реализовано»
- Обновить «Следующий шаг»
## API эндпоинты (существующие) ## API эндпоинты (существующие)
| Эндпоинт | Описание | | Эндпоинт | Описание |
|---|---| |---|---|

View File

@ -0,0 +1,85 @@
# Агент: Ревью продукта
Ты — координатор. Собираешь полную картину состояния продукта от всех агентов и формируешь план следующего шага.
## Что делаешь
### Шаг 1 — Читай статусы всех агентов
```
agents/dev-status.md
agents/devops-status.md
agents/design-status.md
agents/feature-status.md
agents/test-status.md
ROADMAP.md
```
### Шаг 2 — Проверь живое состояние
**Git: последние изменения**
```bash
git log --oneline -10
git status
```
**VPS: сервисы живы?**
```bash
curl -s https://api.wasrusgen1.pro/healthz
```
**Тесты: последний прогон чистый?**
```bash
python -X utf8 tests/smoke_api.py 2>&1 | tail -20
```
### Шаг 3 — Сформируй отчёт
Выведи строго в этом формате:
```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
РЕВЬЮ ПРОДУКТА — zov-tech [дата]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ИНФРАСТРУКТУРА
VPS / API ✅/❌ [статус]
GitHub Pages ✅/❌ [последний деплой]
Drive-доступ ✅/❌ [shipments/arrivals]
КОД
Последний коммит: [хэш] [сообщение]
Открытый долг: [N пунктов]
ТЕСТЫ
CSS-линтер ✅/❌
Smoke API ✅/⚠️/❌ (N/12)
Менеджер ✅/⚠️/❌ (N/19)
UI Playwright ✅/❌ (N/10)
ФУНКЦИОНАЛ
Реализовано: [N функций из ROADMAP]
В работе: [что сейчас в процессе]
Следующий MVP: [первый незакрытый Приоритет 1]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
БЛОКЕРЫ (требуют действия Руслана)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[список — каждый блокер одной строкой]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ПЛАН НА СЛЕДУЮЩИЙ СПРИНТ
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. [задача — агент — оценка]
2. [задача — агент — оценка]
3. [задача — агент — оценка]
```
### Шаг 4 — Обнови статус-файлы
Если при проверке обнаружил устаревшие данные в `agents/*.md` — исправь их.
Если ROADMAP не соответствует реальному состоянию — исправь.
### Шаг 5 — Рекомендация
Одним предложением: что делать прямо сейчас и какой агент вызвать.
Пример: «Вызови `/project:feature` — экран «Мой статус» готов к реализации, дизайн не нужен.»

View File

@ -1,6 +1,9 @@
# Агент: Тестировщик # Агент: Тестировщик
Запусти все тесты и выдай сводный отчёт с замечаниями к устранению. Запусти все тесты, выдай сводный отчёт и обнови статус покрытия.
## Шаг 0 — Читай статус
Прочитай `agents/test-status.md` — знай что уже покрыто и что пропускается намеренно.
## Шаг 1 — CSS-линтер ## Шаг 1 — CSS-линтер
```bash ```bash
@ -52,5 +55,6 @@ node tests/ui_smoke.js
Эти два считать **предупреждением**, не блокирующей ошибкой, пока не расшарен файл в Google Drive. Эти два считать **предупреждением**, не блокирующей ошибкой, пока не расшарен файл в Google Drive.
## После отчёта ## После отчёта
Если всё зелёное — написать одно предложение что стоит добавить в тесты следующим. 1. **Обновить `agents/test-status.md`**: результаты прогона, актуализировать пробелы в покрытии
Если есть ошибки — вызвать нужного агента: `/project:dev` (код), `/project:devops` (инфра), `/project:design` (CSS). 2. Если всё зелёное — написать одно предложение что стоит добавить в тесты следующим
3. Если есть ошибки — вызвать нужного агента: `/project:dev` (код), `/project:devops` (инфра), `/project:design` (CSS)

83
ROADMAP.md Normal file
View File

@ -0,0 +1,83 @@
# ROADMAP — zov-tech CRM MiniApp
> Обновляется агентами автоматически. Последнее обновление: 2026-05-18
---
## 🎯 Продуктовая цель
Telegram MiniApp для 112 менеджеров салонов ЗОВ: подбор техники, замеры, сборки, CRM-клиенты.
Привязка менеджеров к куратору через инструмент. Клиентский кабинет — воронка покупки.
---
## ✅ Готово (реализовано)
### Инфраструктура
- [x] VPS на Docker (FastAPI + aiogram + Caddy)
- [x] GitHub Pages для MiniApp (auto-deploy при push в master)
- [x] Google Sheets как БД
- [x] HMAC-SHA256 аутентификация через Telegram initData
- [x] Pre-push hook: CSS-линтер + UI Playwright блокируют сломанный код
- [x] CI: GitHub Actions запускает тесты при каждом push
### Модули MiniApp (менеджер/admin)
- [x] Список клиентов + поиск + карточка клиента
- [x] Создание/редактирование клиента
- [x] Замеры: создание, фото, закрытие заявки
- [x] Заявка на замер (назначение замерщику)
- [x] Сборки: создание, список, детальная карточка
- [x] Подбор техники (proposals): создание, варианты, голосование клиента
- [x] Подбор через AI (GigaChat/Claude)
- [x] Приватность клиентских данных (имена/телефоны скрыты визуально)
- [x] 4 темы оформления: Default, Foundry, Boardroom, Atelier
### Качество
- [x] 15-секундный таймаут на все fetch-запросы (все модули)
- [x] CSS-линтер (запрещённые паттерны + WCAG-контраст)
- [x] Smoke API тесты (12 эндпоинтов)
- [x] Полный тест кабинета менеджера (19 сценариев)
- [x] UI Playwright smoke (10 проверок JS-ошибок)
---
## 🔄 В работе
| Задача | Агент | Статус |
|--------|-------|--------|
| Доступ сервисного аккаунта к Google Drive (отгрузки/поступления) | devops | ⏳ ждём подтверждения |
---
## 📋 Бэклог (приоритизирован)
### Приоритет 1 — Завершение MVP менеджера
- [ ] Экран «Мой статус» для менеджера (роль, активность, дата последней сделки)
- [ ] Входящие задачи менеджера (`/api/manager_pending`) — экран уведомлений
- [ ] Отгрузки и поступления склад (после решения Drive)
### Приоритет 2 — Клиентский кабинет
- [ ] Базовый клиентский экран (сейчас только `#/picker`)
- [ ] История заказов клиента
- [ ] Самозамер (5-шаговая форма для клиента)
- [ ] Калькулятор стоимости кухни
### Приоритет 3 — Аналитика и управление
- [ ] Дашборд куратора: активность менеджеров, воронка сделок
- [ ] Реестр менеджеров: поле `last_order_date`, 90-дневный контроль активности
- [ ] Метрики: количество замеров, подборов, сборок по менеджеру
### Приоритет 4 — Монетизация
- [ ] Платёжная интеграция (Telegram Stars / ЮKassa)
- [ ] Статусы подписки менеджеров (бесплатно / платно)
### Технический долг
- [ ] `Content-Type: application/json` в `_fetchWithTimeout` (все модули)
- [ ] Аудит `app.js` роутера на edge cases
- [ ] Тест карточки клиента в Playwright (нужна фикстура)
- [ ] Staging-окружение (отдельный VPS или Docker Compose override)
---
## 🚫 Не в скоупе (решение принято)
- Нативное мобильное приложение (остаётся MiniApp)
- База знаний, Обучение, FAQ (отдельный продукт)
- Партнёрская комиссия от производителей

38
agents/design-status.md Normal file
View File

@ -0,0 +1,38 @@
# Статус агента: Дизайнер
> Обновляется агентом `/project:design` после каждой задачи.
**Последнее обновление:** 2026-05-18
---
## ✅ Сделано
- 4 темы оформления: Default (светлая/тёмная), Foundry, Boardroom, Atelier
- Компонентная библиотека: 15+ классов (client-card, podbor-step, btn-primary и др.)
- CSS-линтер: WCAG-контраст, запрещённые паттерны, версии кэша
- Privacy-режим: имена и телефоны клиентов скрыты (`color: #F5F5F5`)
- Анимации: splash-экран с логотипом, spinner, плавные переходы
---
## ⚠️ Известные проблемы
| Проблема | Файл | Приоритет |
|----------|------|-----------|
| open-design требует ручного запуска (нет autostart) | — | низкий |
| Экраны «Мой статус», «Входящие» — не запроектированы | — | средний |
| Тёмная тема Default не проверялась системно по всем экранам | styles.css | средний |
| Нет адаптации под iPhone SE (320px) | styles.css | низкий |
---
## 📋 Бэклог дизайнера
1. Спроектировать экран «Мой статус» менеджера (данные роли, активность, бейджи)
2. Спроектировать экран «Входящие задачи» (карточки заявок)
3. Аудит тёмной темы Default — пройти по всем экранам вручную
4. Типография: проверить иерархию заголовков на экранах замеров и сборок
5. Добавить empty-state иллюстрации (сейчас только текст «пока нет»)
---
## 🔜 Следующий шаг
**Спроектировать экран «Мой статус»** в open-design (localhost:17573).
Данные для экрана: роль, имя менеджера, дата последней сделки, количество клиентов/замеров/сборок.

37
agents/dev-status.md Normal file
View File

@ -0,0 +1,37 @@
# Статус агента: Разработчик
> Обновляется агентом `/project:dev` после каждой задачи.
**Последнее обновление:** 2026-05-18
**Последний коммит:** `fix: добавить 15-секундный таймаут fetch во все модули`
---
## ✅ Сделано (последние задачи)
- `escAttr is not defined` — добавлена функция, карточка клиента работает
- `_fetchWithTimeout` (15с AbortController) — внедрён во все 5 модулей: clients, measurements, assembly, proposals, request
- Карточка клиента: убран баг с загрузкой proposals вместо карточки
- Сравнение `client_tg_id` через `String()` — исправлен silent TypeError
- Примечания клиента: кнопка больше не зависает на «Сохраняем...»
---
## ⚠️ Известные проблемы
| Проблема | Файл | Приоритет |
|----------|------|-----------|
| Нет `Content-Type: application/json` в `_fetchWithTimeout` | все модули | низкий (бэкенд прощает) |
| `app.js` роутер не аудирован на edge cases | app.js | средний |
| `measurements.js` — статический fetch `zamer-checklist.md` без таймаута | measurements.js | низкий |
---
## 📋 Бэклог разработчика
1. Добавить `Content-Type: application/json` в `_fetchWithTimeout` (все модули)
2. Аудит `app.js`: неизвестные хэши → 404-экран, а не падение
3. Экран «Мой статус» менеджера (API `/api/me` уже есть)
4. Проверить обработку ошибок в `measurements.js` после рефакторинга fetch
---
## 🔜 Следующий шаг
**Добавить `Content-Type` в `_fetchWithTimeout`** — патч в 5 файлах, 2 минуты работы.
Или: реализовать экран «Мой статус» (приоритет 1 в ROADMAP).

47
agents/devops-status.md Normal file
View File

@ -0,0 +1,47 @@
# Статус агента: DevOps / VPS
> Обновляется агентом `/project:devops` после каждой задачи.
**Последнее обновление:** 2026-05-18
**VPS:** `94.241.170.144` | **API:** `https://api.wasrusgen1.pro`
---
## ✅ Сделано
- Docker Compose: bot + backend + caddy — все сервисы работают
- Auto-deploy GitHub Pages через GitHub Actions при push в master
- HTTPS через Caddy — сертификат активен
- Pre-push hook защищает от деплоя сломанного кода
---
## 🔴 Блокеры
| Проблема | Описание | Решение |
|----------|----------|---------|
| Drive 404 для shipments/arrivals | Сервисный аккаунт `zov-backend@zov-sborka.iam.gserviceaccount.com` не имеет доступа к файлу отгрузок | ⏳ Ждём расшаривания файла `1KCJUXjhVR2NWEz9bD0kjTaEADsxF8gI5GMzLwJ2bw84` |
---
## ⚠️ Известные проблемы
| Проблема | Приоритет |
|----------|-----------|
| Нет алертинга при падении сервисов (только ручной мониторинг) | средний |
| Нет staging-окружения — правки идут сразу в прод | средний |
| Логи не ротируются автоматически | низкий |
---
## 📋 Бэклог DevOps
1. ✅ Проверить Drive-доступ после расшаривания файла
2. Настроить алертинг: если `/healthz` падает → уведомление в Telegram
3. Настроить staging (`api-dev.wasrusgen1.pro`) для тестирования без риска прода
4. Автоматическая ротация логов Docker
5. Backup Google Sheets → локальный снэпшот раз в сутки
---
## 🔜 Следующий шаг
**Проверить Drive-доступ** как только придёт подтверждение:
```bash
python -X utf8 tests/smoke_api.py
```
Ожидаем: `POST /api/shipments` и `POST /api/arrivals` перестают падать с 404.

57
agents/feature-status.md Normal file
View File

@ -0,0 +1,57 @@
# Статус агента: Функционал
> Обновляется агентом `/project:feature` после каждой задачи.
**Последнее обновление:** 2026-05-18
---
## ✅ Реализованные функции
### Менеджер / Admin
| Функция | Маршрут | Статус |
|---------|---------|--------|
| Список клиентов + поиск | `#/clients` | ✅ работает |
| Создание клиента | `#/clients/new` | ✅ работает |
| Карточка клиента + примечания | `#/clients/client/{key}` | ✅ работает |
| Заявка на замер | `#/request` | ✅ работает |
| Новый замер + фото | `#/measurements` | ✅ работает |
| Закрытие заявки на замер | `#/measurements?id=...` | ✅ работает |
| Список сборок | `#/assembly` | ✅ работает |
| Создание сборки | `#/assembly/new` | ✅ работает |
| Детальная сборка | `#/assembly/{id}` | ✅ работает |
| Подбор техники (proposals) | `#/picker` | ✅ работает |
| AI-подбор (GigaChat/Claude) | через proposals | ✅ работает |
### Отсутствует из ТЗ (Приоритет 1 ROADMAP)
| Функция | Маршрут | Статус |
|---------|---------|--------|
| Мой статус менеджера | `#/me` или `#/status` | ❌ не реализован |
| Входящие задачи | `#/inbox` | ❌ не реализован |
| Отгрузки завода | — | ❌ блокер: Drive 404 |
| Поступления склада | — | ❌ блокер: Drive 404 |
---
## ⚠️ Известные проблемы
| Проблема | Приоритет |
|----------|-----------|
| Клиентский кабинет — только `#/picker`, нет полноценного кабинета | высокий |
| Нет экрана 404 для неизвестных хэшей | средний |
| Нет пагинации списка клиентов (сломается при 500+ записях) | средний |
---
## 📋 Бэклог функционала
1. **Экран «Мой статус»** — вызов `/api/me`, показать роль + статистику
2. **Экран «Входящие»** — вызов `/api/manager_pending`, карточки заявок
3. **Клиентский кабинет** — базовый экран для роли `client`
4. **Пагинация / виртуальный скролл** в списке клиентов
5. **Фильтры в замерах** — по дате, по замерщику, по статусу
---
## 🔜 Следующий шаг
**Реализовать экран «Мой статус»** (`#/me`):
- API `/api/me` уже возвращает роль, `first_name`, `username`
- Добавить счётчики клиентов/замеров/сборок (требует нового поля в `/api/me` или отдельного запроса)
- Дизайн-агент проектирует экран, dev-агент реализует

44
agents/test-status.md Normal file
View File

@ -0,0 +1,44 @@
# Статус агента: Тестировщик
> Обновляется агентом `/project:test` после каждого прогона.
**Последнее обновление:** 2026-05-18
**Последний прогон:** UI smoke 10/10 ✅
---
## ✅ Тестовое покрытие
| Сьют | Команда | Охват | Статус |
|------|---------|-------|--------|
| CSS-линтер | `python -X utf8 tests/lint_css.py` | Запрещённые паттерны, WCAG, версии кэша | ✅ зелёный |
| Smoke API | `python -X utf8 tests/smoke_api.py` | 12 эндпоинтов (без auth) | ⚠️ 2 предупреждения (Drive 404) |
| Кабинет менеджера | `python -X utf8 tests/test_manager.py` | 19 сценариев: auth, CRUD, edge cases | ✅ зелёный* |
| UI Playwright | `node tests/ui_smoke.js` | 10 JS-проверок по экранам | ✅ 10/10 |
*Кроме shipments/arrivals (Drive блокер)
---
## ⚠️ Пробелы в тестировании
| Что не покрыто | Приоритет |
|----------------|-----------|
| Карточка клиента в Playwright (пропускается — нет тестового клиента) | высокий |
| POST /api/shipments, /api/arrivals (Drive 404) | ждём доступ |
| Экраны «Мой статус», «Входящие» (не реализованы) | после реализации |
| Мобильные размеры (320px, landscape) в Playwright | средний |
| Тёмная тема Default — нет визуальных тестов | низкий |
---
## 📋 Бэклог тестировщика
1. Добавить фикстуру в `ui_smoke.js`: создать тестового клиента через API перед тестом, удалить после
2. Добавить тест карточки клиента: открытие, примечание, быстрые действия
3. Проверить shipments/arrivals после получения Drive-доступа
4. Параметризовать `ui_smoke.js` на разные viewport (iPhone SE 320px, iPad 768px)
5. Добавить скриншот-дифф между релизами (визуальная регрессия)
---
## 🔜 Следующий шаг
**Добавить фикстуру в Playwright**: создать клиента через `/api/client_create` в начале теста → протестировать карточку → удалить клиента через `/api/client_delete`.
Это закроет единственный пропускаемый тест.