Initial commit: VoIdeaAI - voice-first AI idea assistant
This commit is contained in:
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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)*
|
||||
@@ -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*
|
||||
@@ -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)*
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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*
|
||||
@@ -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)*
|
||||
Reference in New Issue
Block a user