Initial commit: VoIdeaAI - voice-first AI idea assistant

This commit is contained in:
2026-05-13 12:51:42 +03:00
commit 688d043dad
421 changed files with 47915 additions and 0 deletions
+149
View File
@@ -0,0 +1,149 @@
# Agent Evolution System - VoIdea
**Дата:** 2026-05-10
**Статус:** Backlog
---
## Обзор
Система саморазвития агентов для адаптации к новым задачам и улучшения работы.
---
## Структура
### Файл эволюции агента
```yaml
# docs/agents/evolution.yaml
agents:
qa_tester:
version: 1.0
capabilities:
- functional_testing
- temp_user_creation
- cleanup
evolution_history:
- date: 2026-05-10
trigger: "Initial creation"
change: "Added basic testing capabilities"
success: true
next_potential_skills:
- performance_testing
- security_testing
fix:
version: 1.0
capabilities:
- bug_analysis
- code_fix
- pr_creation
evolution_history:
- date: 2026-05-10
trigger: "Initial creation"
change: "Basic fix capabilities"
success: true
next_potential_skills:
- refactoring
- optimization
```
---
## Триггеры эволюции
### 1. Автоматические
- **Успешное выполнение задачи** → агент обучается
- **Повторяющиеся паттерны** → оптимизация
- **Новые типы задач** → добавление capability
### 2. Ручные (человек)
- Добавление нового навыка
- Изменение поведения
- Приоритетная настройка
### 3. ObserverAgent
- Выявление потребности в новых навыках
- Анализ узких мест
- Предложения по улучшению
---
## Процесс эволюции
```
1. Сбор данных
→ ObserverAgent фиксирует паттерны
2. Анализ
→ EvolutionAgent анализирует эффективность
3. Предложение
→ Генерирует варианты улучшений
4. Тестирование
→ QATesterAgent тестирует новые возможности
5. Внедрение
→ DocAgent обновляет документацию
→ SpecAgent обновляет спецификации
6. Мониторинг
→ Отслеживание результатов
```
---
## Меж-агентское взаимодействие
### Делегирование задач
Агенты могут делегировать друг другу:
```python
# Пример: FixAgent → DocAgent
FixAgent.fix_bug(bug_id) DocAgent.update_docs()
```
Правила делегирования:
1. Агент A видит задачу для агента B
2. Проверяет доступность B
3. Отправляет задачу
4. B выполняет и возвращает результат
5. A продолжает работу
### Резервные агенты
При недоступности агента:
1. Поиск агента с похожими capabilities
2. Делегирование задачи
3. Уведомление человека (если критично)
---
## Метрики эволюции
- Tasks completed successfully
- Tasks failed
- Average execution time
- Self-improvements count
- Delegations made/received
---
## TODO
- [ ] Создать evolution.yaml
- [ ] Реализовать EvolutionAgent
- [ ] Добавить механизм меж-агентского взаимодействия
- [ ] Интегрировать с ObserverAgent
- [ ] Настроить мониторинг метрик
- [ ] Документировать процесс эволюции
---
*Создано: 2026-05-10*
*Управляется EvolutionAgent*
+45
View File
@@ -0,0 +1,45 @@
# Car Integration Note - VoIdea
**Date:** 2026-05-10
**Status:** Backlog
---
## Overview
Research and implement car head unit integration for VoIdea app.
---
## Research Topics
1. Android Auto
- How apps integrate
- Voice input support
- Requirements
2. Apple CarPlay
- Same as above for iOS
3. Bluetooth HID
- Universal controller support
- Gamepad protocol
4. CAN Bus
- Steering wheel buttons
- Complex integration
- Hardware requirements
---
## Action Items
- [ ] Research Android Auto app development
- [ ] Research Apple CarPlay requirements
- [ ] Test Bluetooth HID on Android
- [ ] Document findings
- [ ] Create integration plan
---
*Created: 2026-05-10*
+172
View File
@@ -0,0 +1,172 @@
# CHANGELOG Generation - VoIdea
**Дата:** 2026-05-10
**Статус:** Backlog
---
## Обзор
Автоматическая генерация CHANGELOG на основе коммитов и conventional commits.
---
## Структура файлов
```
CHANGELOG/
├── v1.0.md # При смене MAJOR (1.0.0 -> 1.1.0 -> ...)
├── v1.1.md # При смене MINOR
├── v2.0.md # При смене MAJOR
└── ...
```
### Правила
- **MAJOR (X)** → новый файл vX.0.md
- **MINOR (Y)** → новый файл vX.Y.md
- **PATCH (Z)** → добавляется в конец существующего файла
---
## Формат CHANGELOG файла
```markdown
# Changelog v1.0
## [1.0.5] - 2026-05-10
### Added
- Feature X (commit: abc123)
### Fixed
- Bug Y (commit: def456)
## [1.0.4] - 2026-05-09
### Added
- ...
## [1.0.0] - 2026-05-01
### Added
- Initial release
```
---
## Conventional Commits
| Тип | Влияние |
|-----|---------|
| `feat:` | Added (MINOR) |
| `fix:` | Fixed (PATCH) |
| `docs:` | Changed (no version) |
| `refactor:` | Changed (no version) |
| `test:` | Changed (no version) |
| `chore:` | Changed (no version) |
| `BREAKING:` | Major (MAJOR) |
---
## Генерация
### SpecAgent responsibilities
1. **Мониторинг тегов**
- При создании нового тега → запуск генерации
2. **Анализ коммитов**
- Парсинг conventional commits
- Группировка по типу
3. **Генерация файла**
- Определение какой файл создать/обновить
- Формирование записей
4. **Проверка**
- Валидация формата
- Сохранение в CHANGELOG/
---
## CI/CD Integration
### При push в main
```yaml
# .github/workflows/changelog.yml
name: Changelog
on:
push:
branches: [main]
jobs:
generate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Generate Changelog
run: python scripts/generate_changelog.py
- name: Commit
run: |
git add CHANGELOG/
git commit -m "docs: update changelog"
git push
```
### При создании тега
```python
# scripts/generate_changelog.py
import git
from pathlib import Path
def generate_changelog(tag: str):
commits = get_commits_since_last_tag()
changes = {
'added': [],
'fixed': [],
'changed': []
}
for commit in commits:
type, message = parse_conventional_commit(commit.message)
changes[type].append(f"- {message} ({commit.hash[:7]})")
update_changelog_file(tag, changes)
```
---
## Ручная генерация
```bash
# При необходимости
python scripts/generate_changelog.py --tag 1.0.0 --from 0.9.0
```
---
## Автоматическая документация
После генерации:
1. DocAgent обновляет PROJECT_GUIDE.md (ссылка на новую версию)
2. SpecAgent обновляет project.json
3. Уведомление в админ-панель
---
## TODO
- [ ] Создать scripts/generate_changelog.py
- [ ] Настроить CI/CD workflow
- [ ] Интегрировать со SpecAgent
- [ ] Добавить тесты
- [ ] Документировать процесс
---
*Создано: 2026-05-10*
*Управляется SpecAgent*
@@ -0,0 +1,89 @@
# Design System Generators - VoIdea
**Дата:** 2026-05-10
**Статус:** Backlog
---
## Обзор
Создание CLI-генераторов для конвертации tokens.json в платформо-специфичные форматы.
---
## Формат
Python CLI скрипты в `docs/design-system/generators/`
```bash
python -m generators css # Генерирует CSS Variables
python -m generators swift # Генерирует Swift
python -m generators kotlin # Генерирует Kotlin XML
python -m generators all # Генерирует все форматы
```
---
## Генераторы
### 1. CSS Generator
**Вход:** `docs/design-system/tokens.json`
**Выход:** `app/design-tokens/css/theme.css`
**Формат выхода:**
```css
:root {
--color-primary: #6366F1;
--color-background-dark: #0F172A;
--spacing-md: 1rem;
}
```
### 2. Swift Generator
**Выход:** `app/design-tokens/swift/Colors.swift`
**Формат выхода:**
```swift
struct Colors {
static let primary = Color(hex: "#6366F1")
static let backgroundDark = Color(hex: "#0F172A")
}
```
### 3. Kotlin Generator
**Выход:** `app/design-tokens/kotlin/colors.xml`
**Формат выхода:**
```xml
<resources>
<color name="primary">#6366F1</color>
<color name="background_dark">#0F172A</color>
</resources>
```
---
## Интеграция
- Генераторы запускаются при изменении `tokens.json`
- CI/CD автоматизирует генерацию
- DocAgent обновляет документацию
---
## TODO
- [ ] Создать структуру генераторов
- [ ] Реализовать CSS Generator
- [ ] Реализовать Swift Generator
- [ ] Реализовать Kotlin Generator
- [ ] Интегрировать в CI/CD
- [ ] Добавить тесты
---
*Создано: 2026-05-10*
*Обновляется автоматически DocAgent*
+143
View File
@@ -0,0 +1,143 @@
# Export Formats - VoIdea
**Дата:** 2026-05-10
**Статус:** Backlog (часть WebUI)
---
## Обзор
Экспорт идей в различных форматах для резервного копирования и интеграции.
---
## Поддерживаемые форматы
### 1. JSON
**Использование:** Резервное копирование, импорт в другие системы
```json
{
"version": "1.0.0",
"exported_at": "2026-05-10T12:00:00Z",
"ideas": [
{
"id": "uuid",
"title": "Моя идея",
"content": "Описание",
"created_at": "2026-05-01T10:00:00Z",
"updated_at": "2026-05-05T15:30:00Z",
"analysis": {
"coordinator": {...},
"organizer": {...}
}
}
]
}
```
### 2. Markdown
**Использование:** Интеграция с Obsidian, Notion, блогами
```markdown
# Моя идея
## Описание
Текст идеи
## Анализ
### Координатор
...
### Организатор
...
*Экспортировано: 2026-05-10*
```
### 3. PDF
**Использование:** Печать, отчёты, презентации
- Титульный лист с датой
- Оглавление
- Каждая идея — отдельная секция
- Анализ ИИ-агентов
### 4. CSV (опционально)
**Использование:** Аналитика, таблицы
```csv
id,title,created_at,analysis_count
uuid,Моя идея,2026-05-01,5
```
---
## API
```python
# Экспорт всех идей пользователя
GET /api/v1/export?format=json|markdown|pdf
# Экспорт одной идеи
GET /api/v1/ideas/{id}/export?format=json|markdown|pdf
# Параметры
?include_analysis=true # Включить ИИ-анализ
?include_metadata=true # Включить метаданные
```
---
## Обработка больших объёмов
1. **Асинхронная генерация** — Celery task
2. **Progress tracking** — WebSocket/SSE
3. **Download link** — после завершения
```python
# Celery task
@celery.task
def generate_export(user_id: UUID, format: str):
# 1. Создать задачу
export_task = create_export_task(user_id, format)
# 2. Генерация
result = await generate_file(export_task)
# 3. Уведомление
await notify_user(user_id, export_task.id)
return result
```
---
## Права доступа
- Экспорт только своих идей
- Анализ доступен только владельцу
- Логирование всех экспортов
---
## TODO
- [ ] Создать export service
- [ ] Реализовать JSON export
- [ ] Реализовать Markdown export
- [ ] Реализовать PDF export (weasyprint)
- [ ] Асинхронная генерация
- [ ] UI (кнопка экспорта)
- [ ] Тесты
- [ ] Документация
---
*Создано: 2026-05-10*
*Часть WebUI (Block 4)*
+181
View File
@@ -0,0 +1,181 @@
# FixAgent Mechanism - VoIdea
**Дата:** 2026-05-10
**Статус:** Backlog
---
## Обзор
Агент для автоматического анализа и исправления багов с созданием PR.
---
## Архитектура
### FixAgent responsibilities
1. **Анализ багов**
- Получение данных от QATesterAgent
- Анализ логов
- Определение причины
2. **Генерация исправлений**
- Написание кода
- Создание тестов
- Обновление документации
3. **Создание PR**
- Формирование pull request
- Описание изменений
- Добавление тестов
---
## Процесс работы
```python
async def fix_bug(bug_data: BugReport) -> FixResult:
# 1. Анализ
analysis = await analyze_bug(bug_data)
# 2. Поиск решения
solution = await find_solution(analysis)
# 3. Генерация кода
fix_code = await generate_fix(solution)
# 4. Создание PR
pr_url = await create_pr(fix_code, analysis)
# 5. Уведомление
await notify_about_pr(pr_url)
return FixResult(pr_url=pr_url)
```
---
## Анализ багов
### Источники данных
1. **QATesterAgent**
- Failed тесты
- Логи выполнения
- Скриншоты (если есть)
2. **Логи системы**
- Error логи
- Warning логи
- Traceback
3. **Пользовательские отчёты**
- Feedback из админ-панели
- Exception reports
### Типы анализа
- **Static analysis** — код ревью
- **Log analysis** — поиск паттернов
- **Test replay** — воспроизведение
---
## Генерация исправлений
### Правила
1. **Минимальные изменения** — исправлять только проблему
2. **Не ломать существующее** — регрессионные тесты
3. **Документация** — обновлять комментарии и docs
4. **Тесты** — добавлять новые тесты для предотвращения
### Формат PR
```markdown
## Fix: [Краткое описание]
### Проблема
[Описание бага]
### Причина
[Найденная причина]
### Решение
[Описание исправления]
### Тесты
- [ ] Добавлен тест для предотвращения
- [ ] Существующие тесты проходят
### Логи
[Связанные логи]
```
---
## Взаимодействие с другими агентами
### QATesterAgent
```
FixAgent → "Исправь баг X"
QATesterAgent → "Проверь исправление"
```
### DocAgent
```
FixAgent → "Обнови документацию"
DocAgent → "Документация обновлена"
```
### RolloutAgent
```
FixAgent → "Обнаружен критический баг"
RolloutAgent → "Приостановить rollout, исправить"
```
---
## Безопасность
### Ограничения
1. **Только PR, не direct push** — человек проверяет
2. **Scope ограничен** — один файл за раз
3. **Тесты обязательны** — без тестов PR не создаётся
4. **Логирование** — все действия фиксируются
### Что НЕ делает FixAgent
- Не удаляет файлы
- Не меняет чужие PR
- Не коммитит в main напрямую
- Не создаёт бесконечных PR (лимит: 3 на один баг)
---
## Метрики
- Bugs fixed
- PRs created
- PRs merged
- Average fix time
- False positives
---
## TODO
- [ ] Реализовать FixAgent
- [ ] Интегрировать с QATesterAgent
- [ ] Добавить анализ логов
- [ ] Создать шаблон PR
- [ ] Настроить безопасность
- [ ] Добавить метрики
- [ ] Написать тесты
---
*Создано: 2026-05-10*
*Управляется FixAgent*
+122
View File
@@ -0,0 +1,122 @@
# Hotkeys System - VoIdea
**Дата:** 2026-05-10
**Статус:** Backlog (часть WebUI)
---
## Обзор
Настраиваемая система горячих клавиш для быстрого управления приложением.
---
## Структура хранения
### База данных (primary)
```sql
CREATE TABLE user_hotkeys (
id UUID PRIMARY KEY,
user_id UUID REFERENCES users(id),
action VARCHAR(50) NOT NULL,
key_combination VARCHAR(100) NOT NULL,
modifier VARCHAR(20),
created_at TIMESTAMP,
updated_at TIMESTAMP
);
```
### localStorage (backup for offline)
```javascript
// Ключ: 'voidea_hotkeys'
{
"new_idea": "ctrl+n",
"save": "ctrl+s",
"search": "/"
}
```
---
## Синхронизация
1. При входе → загрузить настройки из БД
2. При изменении → обновить БД и localStorage
3. При оффлайн → использовать localStorage
4. При восстановлении → sync БД → localStorage
---
## Дефолтные горячие клавиши
| Действие | Клавиша | Описание |
|----------|---------|----------|
| Новая идея | `Ctrl+N` | Создать новую идею |
| Сохранить | `Ctrl+S` | Сохранить текущее |
| Поиск | `/` | Фокус на поиск |
| Навигация вверх | `J` или `↑` | Предыдущая идея |
| Навигация вниз | `K` или `↓` | Следующая идея |
| Отправить на анализ | `Ctrl+Enter` | Запустить ИИ-анализ |
| Настройки | `Ctrl+,` | Открыть настройки |
| Помощь | `?` | Показать справку |
| Отмена | `Escape` | Закрыть модалку |
| Undo | `Ctrl+Z` | Отменить действие |
| Redo | `Ctrl+Shift+Z` | Повторить действие |
---
## UI настройки
### Страница настроек
```
├── Настройки
│ ├── Горячие клавиши
│ │ ├── Список действий
│ │ ├── Поле ввода (нажмите клавишу)
│ │ ├── Сброс на дефолт
│ │ └── Сохранить
```
### Ввод новой комбинации
1. Клик на поле ввода
2. Нажатие клавиши/комбинации
3. Автоматическое сохранение
4. Валидация (не конфликтует с системой)
---
## Обработка конфликтов
1. **Системные клавиши** (Ctrl+Alt+Del) — запрещено переназначать
2. **Браузерные** (Ctrl+T) — предупреждение
3. **Между пользователями** — индивидуально
---
## Поддерживаемые модификаторы
- `Ctrl` / `Cmd` (Mac)
- `Alt` / `Option`
- `Shift`
- Комбинации: `Ctrl+Shift+N`
---
## TODO
- [ ] Создать модель user_hotkeys
- [ ] Реализовать хуки для клавиш
- [ ] Добавить UI настроек
- [ ] Синхронизация БД ↔ localStorage
- [ ] Обработка конфликтов
- [ ] Тесты
- [ ] Документация для пользователей
---
*Создано: 2026-05-10*
*Часть WebUI (Block 4)*
+145
View File
@@ -0,0 +1,145 @@
# OAuth Schema - VoIdea
**Дата:** 2026-05-10
**Статус:** Backlog (для фиксации ADR)
---
## Обзор
Схема авторизации: один пользователь = один провайдер. Нельзя привязать Google если уже есть Яндекс.
---
## Правила
### Основное правило
> Один пользователь = один провайдер (email или OAuth)
Это означает:
- Если зарегистрировался через Яндекс → только Яндекс
- Если зарегистрировался через Google → только Google
- Если зарегистрировался через email → только email + пароль
### Нельзя
- Привязать Google к аккаунту зарегистрированному через Яндекс
- Добавить второй OAuth провайдер
- Изменить email после регистрации через OAuth
---
## Структура данных
### Users table
```sql
CREATE TABLE users (
id UUID PRIMARY KEY,
email VARCHAR(255) UNIQUE,
password_hash VARCHAR(255), -- NULL если OAuth-only
-- OAuth данные (один провайдер)
oauth_provider VARCHAR(20), -- yandex|google|apple|null
oauth_id VARCHAR(255), -- ID в системе провайдера
-- Метаданные
email_verified BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW(),
-- Constraints
CONSTRAINT users_oauth_xor_email CHECK (
(oauth_provider IS NOT NULL AND email IS NOT NULL) OR
(oauth_provider IS NULL AND email IS NOT NULL AND password_hash IS NOT NULL)
)
);
CREATE UNIQUE INDEX uq_users_oauth ON users(oauth_provider, oauth_id) WHERE oauth_provider IS NOT NULL;
```
### Почему один провайдер
1. **Безопасность** — меньше точек входа
2. **Простота** — не нужно merge аккаунтов
3. **Ясность** — пользователь знает что использует
4. **Privacy** — данные не смешиваются между провайдерами
---
## OAuth Flow
### Яндекс
```
1. Пользователь нажимает "Войти через Яндекс"
2. Редирект на Яндекс OAuth
3. Callback с code
4. Получение access_token
5. Получение данных пользователя
6. Поиск/создание user по oauth_provider + oauth_id
7. Создание JWT session
```
### Google
Аналогично Яндексу, с заменой endpoint-ов.
---
## Регистрация через email
```sql
-- При регистрации через email
INSERT INTO users (email, password_hash, oauth_provider, oauth_id)
VALUES ('user@example.com', 'hash123', NULL, NULL);
```
### Вход через email
```sql
-- Проверка пароля
SELECT * FROM users WHERE email = 'user@example.com' AND password_hash = verify('hash123');
```
---
## Защита от привязки чужого аккаунта
### Проблема
Злоумышленник может попытаться привязать Google к чужому email.
### Решение
1. **Email verification** — требуется подтверждение
2. **Password check** — для существующих пользователей
3. **Separate tables** — OAuth и email разделены логически
---
## Будущее (Apple OAuth)
### Apple будет реализован позже
Для Apple потребуется:
- App Store Developer Account
- Private Key для подписи
- Тот же принцип: один пользователь = один провайдер
---
## TODO
- [ ] Реализовать OAuth service
- [ ] Интегрировать Яндекс OAuth
- [ ] Интегрировать Google OAuth
- [ ] Зарезервировать место для Apple (не реализовывать)
- [ ] Тесты
- [ ] Документация
---
*Создано: 2026-05-10*
*См. также: docs/adr/003-oauth-schema.md*
@@ -0,0 +1,52 @@
# Observer Metrics Stages - VoIdea
**Date:** 2026-05-10
**Status:** Backlog
---
## Overview
Phased approach for implementing user observation metrics.
---
## Stage 1: Basic (MVP)
Metrics:
- page_views
- session_duration
- feature_usage_frequency
- conversion_rate
---
## Stage 2: Advanced (after stabilization)
Metrics:
- mouse_movements (heatmap)
- scroll_depth
- hesitation_moments
- speech_to_text_usage
---
## Stage 3: Experimental (v2)
Metrics:
- emotional_tone_voice_input
- time_of_idea_capture_to_completion
- collaboration_attempts
---
## Decision Criteria
Move to next stage when:
- Current stage stable for 1 month
- Infrastructure ready
- Storage/cost acceptable
---
*Created: 2026-05-10*
+175
View File
@@ -0,0 +1,175 @@
# QATesterAgent Mechanism - VoIdea
**Дата:** 2026-05-10
**Статус:** Backlog
---
## Обзор
Механизм функционального тестирования с созданием временных аккаунтов и очисткой.
---
## Архитектура
### QATesterAgent responsibilities
1. **Создание временных аккаунтов**
- Уникальный префикс: `test_*`
- Автоматическая генерация данных
- Ограничение по времени жизни
2. **Выполнение тестов**
- Функциональные тесты
- API тесты
- UI тесты (через UITestAgent)
3. **Очистка**
- Удаление временных данных
- Проверка целостности
- Логирование результатов
---
## Процесс работы
```python
async def run_tests(test_config: TestConfig) -> TestResult:
# 1. Создание временных аккаунтов
temp_users = await create_temp_users(count=test_config.count)
try:
# 2. Выполнение тестов
results = []
for user in temp_users:
result = await execute_test_suite(user, test_config)
results.append(result)
# 3. Сохранение результатов
await save_test_results(results)
# 4. Очистка
await cleanup_temp_users(temp_users)
return aggregate_results(results)
except Exception as e:
# При ошибке - очистка обязательна
await cleanup_temp_users(temp_users)
raise
```
---
## Правила очистки
### Безопасность
1. **Никогда не удалять пользователей без `test_` префикса**
2. **Использовать soft delete перед hard delete**
3. **Логировать все операции очистки**
4. **Проверять foreign key constraints**
5. **Тестировать очистку в staging**
### Механизм очистки
```python
async def cleanup_temp_users(users: list[TempUser]):
for user in users:
# 1. Soft delete
await user.soft_delete()
# 2. Проверка связанных данных
related = await check_related_entities(user.id)
if related:
await cleanup_related(related)
# 3. Hard delete (через время)
await schedule_hard_delete(user.id, delay_minutes=5)
```
---
## Конфигурация
```yaml
qa_tester:
max_temp_users: 10 # Максимум одновременно
user_ttl_minutes: 30 # Время жизни
auto_cleanup: true # Автоматическая очистка
cleanup_delay_minutes: 5 # Задержка перед hard delete
tests:
functional:
enabled: true
timeout_seconds: 300
api:
enabled: true
timeout_seconds: 60
ui:
enabled: true # Через UITestAgent
timeout_seconds: 120
```
---
## Триггеры
1. **pre-commit** — автоматически перед merge
2. **Ежедневно** — scheduled в cron
3. **Вручную** — кнопка в админ-панели
4. **После failed тестов** — FixAgent запускает повторно
---
## Статусы
Агент может находиться в состояниях:
- `idle` — готов к работе
- `creating_users` — создаёт temp аккаунты
- `running_tests` — выполняет тесты
- `cleaning` — очищает данные
- `error` — требует внимание
- `offline` — отключён
---
## Отчёты
После каждого теста создаётся отчёт:
```json
{
"test_id": "uuid",
"timestamp": "2026-05-10T12:00:00Z",
"status": "passed|failed",
"users_created": 3,
"users_cleaned": 3,
"tests_run": [
{
"name": "test_create_idea",
"status": "passed",
"duration_ms": 150
}
],
"bugs_found": [],
"logs": "..."
}
```
---
## TODO
- [ ] Реализовать QATesterAgent
- [ ] Создать механизм создания temp users
- [ ] Реализовать безопасную очистку
- [ ] Добавить отчёты в админ-панель
- [ ] Настроить триггеры
- [ ] Интегрировать с FixAgent
- [ ] Написать тесты механизма
---
*Создано: 2026-05-10*
*Управляется QATesterAgent*
+32
View File
@@ -0,0 +1,32 @@
# Rate Limiting Note - VoIdea
**Date:** 2026-05-10
**Status:** Backlog (implement later)
---
## Overview
Implement rate limiting for AI agents and API endpoints.
---
## Requirements
1. Per-user limits based on subscription tier
2. Queue overflow requests (up to 100)
3. 7-day TTL for queued requests
4. User notification on limit
---
## Implementation
- Redis for rate limit counters
- Celery for queue management
- API endpoint for queue status
- Admin panel for limit management
---
*Created: 2026-05-10*
+104
View File
@@ -0,0 +1,104 @@
# Rollout Process - VoIdea
**Дата:** 2026-05-10
**Статус:** Backlog (для реализации после MVP)
---
## Обзор
Постепенное развёртывание нового функционала для минимизации рисков.
---
## Этапы rollout
```
Stage 0: Development → Тестирование агентами
Stage 1: 3 users → Первые пользователи
Stage 2: 1% → Расширение выборки
Stage 3: 5% → Продолжение
Stage 4: 15% → Почти все
Stage 5: 100% → Production
```
---
## Правила перехода
### Stage 0 → Stage 1 (3 users)
- Все тесты пройдены (QATesterAgent, UITestAgent, FixAgent)
- Решение принимает RolloutAgent или человек
- Полное логирование включено
### Stage 1 → Stage 2 (1%)
- 2 дня без критических ошибок
- Метрики стабильны
- ObserverAgent не фиксирует аномалий
### Stage 2 → Stage 3 (5%)
- Анализ логов stage 1-2
- При проблемах → возврат к stage 1
- Решение: RolloutAgent + человек
### Stage 3 → Stage 4 (15%)
- Продолжение мониторинга
- При проблемах → возврат к stage 3
### Stage 4 → Stage 5 (100%)
- Все проверки пройдены
- Подготовка changelog для магазинов приложений
- Финальное решение человека
---
## Мониторинг
### ObserverAgent отслеживает:
- Error rate (цель: < 1%)
- Response time (цель: < 500ms)
- User complaints (вход в приложение)
- Feature usage (цель: рост)
### При аномалиях:
1. RolloutAgent приостанавливает rollout
2. Направляет логи FixAgent
3. Если проблема подтверждена → исправление
4. После исправления → повторный test Stage 0
5. Если всё стабильно → продолжаем
---
## Контроль человеком
Админ-панель:
- Просмотр текущего stage
- История всех stage переходов
- Кнопка "Приостановить rollout"
- Кнопка "Откатить на предыдущий stage"
- Кнопка "Форсировать переход"
---
## Откат
При критических проблемах:
1. Откат на предыдущую стабильную версию
2. Фиксация проблемы в logs
3. BacklogAgent создаёт задачу
4. Цикл продолжается
---
## TODO
- [ ] Реализовать RolloutAgent
- [ ] Добавить feature flags в базу
- [ ] Создать UI в админ-панели
- [ ] Настроить мониторинг
- [ ] Подготовить runbook для rollback
---
*Создано: 2026-05-10*
*Управляется RolloutAgent и BacklogAgent*
+42
View File
@@ -0,0 +1,42 @@
# Temp Users Cleanup Note - VoIdea
**Date:** 2026-05-10
**Status:** Backlog
---
## Overview
Mechanism for QATesterAgent to clean up temporary test accounts.
---
## Requirements
1. Create temp users with unique prefix: est_
2. Track creation time
3. Clean up after test completion
4. Verify cleanup in logs
5. No cascade delete on real users
---
## Safety Rules
1. Never delete users without est_ prefix
2. Use soft delete before hard delete
3. Log all cleanup operations
4. Verify foreign key constraints
5. Test cleanup in staging first
---
## Implementation
- PostgreSQL trigger for auto-cleanup (optional)
- Celery task for scheduled cleanup
- Admin notification on cleanup
---
*Created: 2026-05-10*
+173
View File
@@ -0,0 +1,173 @@
# UI Themes - VoIdea
**Дата:** 2026-05-10
**Статус:** Backlog (часть WebUI)
---
## Обзор
Три темы интерфейса: system (auto), dark, light.
---
## Структура
### Design Tokens
```json
{
"themes": ["system", "dark", "light"],
"colors": {
"background": {
"system": "auto",
"dark": "#0F172A",
"light": "#FFFFFF"
},
"text": {
"primary": {
"system": "auto",
"dark": "#F8FAFC",
"light": "#0F172A"
}
}
}
}
```
---
## Реализация
### CSS Variables
```css
/* Тема применяется через data-theme атрибут */
[data-theme="dark"] {
--color-background: #0F172A;
--color-text: #F8FAFC;
}
[data-theme="light"] {
--color-background: #FFFFFF;
--color-text: #0F172A;
}
[data-theme="system"] {
/* Читается из prefers-color-scheme */
}
```
---
## Структура хранения
### База данных
```sql
CREATE TABLE user_settings (
user_id UUID PRIMARY KEY REFERENCES users(id),
theme VARCHAR(10) DEFAULT 'system',
updated_at TIMESTAMP DEFAULT NOW()
);
```
### localStorage (PWA offline)
```javascript
localStorage.setItem('voidea_theme', 'dark');
```
---
## Синхронизация
1. При входе → загрузить тему из БД
2. При изменении → обновить БД и localStorage
3. При оффлайн → использовать localStorage
4. При восстановлении → sync БД → localStorage
---
## Определение system темы
```javascript
// CSS media query
@media (prefers-color-scheme: dark) {
:root[data-theme="system"] {
--color-background: #0F172A;
--color-text: #F8FAFC;
}
}
// JavaScript detection
const isDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
```
---
## UI настройки
### Страница настроек
```
├── Настройки
│ ├── Внешний вид
│ │ ├── Тема
│ │ │ ├── 🌓 System (автоматически)
│ │ │ ├── 🌙 Dark
│ │ │ └── ☀️ Light
```
---
## Поддержка платформ
### Web (PWA)
- CSS Variables
- media query `prefers-color-scheme`
- Service Worker для offline
### React Native (future)
- React Native Appearance API
- `useColorScheme()` hook
### iOS (future)
- SwiftUI `ColorScheme`
- Адаптация из tokens.json
### Android (future)
- Material Design color schemes
- Адаптация из tokens.json
---
## Генерация стилей
```bash
# Из tokens.json
python -m generators css --themes dark,light
```
Генерирует `app/design-tokens/css/themes.css`
---
## TODO
- [ ] CSS Variables для всех тем
- [ ] JavaScript detection для system
- [ ] Синхронизация БД ↔ localStorage
- [ ] UI переключатель
- [ ] Генерация из tokens.json
- [ ] Тесты (переключение тем)
- [ ] Документация
---
*Создано: 2026-05-10*
*Часть WebUI (Block 4) и Design System*
+153
View File
@@ -0,0 +1,153 @@
# Undo/Redo System - VoIdea
**Дата:** 2026-05-10
**Статус:** Backlog (часть WebUI)
---
## Обзор
Система отмены/повтора действий с сохранением истории в базе данных.
---
## Архитектура
### История хранится в БД
```sql
CREATE TABLE user_actions_history (
id UUID PRIMARY KEY,
user_id UUID REFERENCES users(id),
action_type VARCHAR(50) NOT NULL,
entity_type VARCHAR(50) NOT NULL,
entity_id UUID NOT NULL,
previous_state JSONB NOT NULL,
new_state JSONB,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX ix_user_actions_user_id ON user_actions_history(user_id);
CREATE INDEX ix_user_actions_created_at ON user_actions_history(created_at);
```
---
## Типы действий
### Отменяемые
- Создание идеи
- Редактирование идеи
- Удаление идеи
- Изменение настроек
- Действия с ИИ-агентами
### Не отменяемые
- Авторизация (вход/выход)
- Удаление аккаунта
- Оплата
- Массовые операции
---
## Лимиты
- Максимум действий в истории: 100
- Срок хранения: 7 дней
- Автоочистка старых записей
---
## API
```python
# Отмена последнего действия
POST /api/v1/actions/undo
# Повтор отменённого действия
POST /api/v1/actions/redo
# Получить историю
GET /api/v1/actions/history?limit=10
# Очистка истории
DELETE /api/v1/actions/history
```
---
## Процесс undo
```python
async def undo(user_id: UUID) -> ActionResult:
# 1. Получить последнее действие
action = await get_last_action(user_id)
# 2. Валидация (можно ли отменить)
if not can_undo(action):
raise UndoNotAllowed()
# 3. Восстановление предыдущего состояния
await restore_previous_state(action)
# 4. Запись в redo stack
await add_to_redo_stack(action)
# 5. Удаление из истории
await remove_from_history(action)
return ActionResult(success=True)
```
---
## Правила безопасности
1. **Только владелец** — чужие действия нельзя отменить
2. **Целостность данных** — проверка foreign keys
3. **Логирование** — все undo/redo фиксируются
4. **Резервное копирование** — состояние сохраняется до применения
---
## UI
### Кнопки в интерфейсе
- Панель инструментов: Undo ↔ Redo
- Горячие клавиши: Ctrl+Z, Ctrl+Shift+Z
- Контекстное меню: "Отменить"
### Индикация
- Disabled состояние когда undo невозможен
- Tooltip с описанием действия
---
## Падение приложения
При "падении" и невозможности оперативно исправить:
1. **Состояние сохраняется в БД** — можно восстановить
2. **Последние 100 действий** — доступны после перезапуска
3. **Manual recovery** — админ может восстановить вручную
---
## TODO
- [ ] Создать модель user_actions_history
- [ ] Реализовать undo/redo логику
- [ ] Добавить API endpoints
- [ ] Создать UI компоненты
- [ ] Настроить очистку (celery)
- [ ] Тесты
- [ ] Документация
---
*Создано: 2026-05-10*
*Часть WebUI (Block 4)*