diff --git a/IDEAS.md b/IDEAS.md index 04f83d3..7e1d930 100644 --- a/IDEAS.md +++ b/IDEAS.md @@ -128,6 +128,13 @@ team-board/ описание: "Markdown текст с деталями" статус: draft | ready | in_progress | review | completed | blocked + # Тип задачи (флаги/теги) + теги: ["кодинг", "api", "auth"] + тип: coding | analytics | design | testing | docs | other + + # PR (только для задач с кодом) + требует_pr: true | false # автоматически по типу задачи + # Назначение назначен: agent_id (или null) @@ -215,39 +222,91 @@ Task A ──depends_on──→ Task B --- -## Агенты +## Агенты и адаптеры -### Типы провайдеров (адаптеры) +### Адаптер (провайдер) -| Провайдер | Описание | -|-----------|----------| -| `anthropic` | Claude API (Opus, Sonnet) | -| `openai` | GPT, Codex | -| `google` | Gemini | -| `openclaw` | Через OpenClaw Gateway (с инструментами) | -| `cli` | Claude Code CLI (без API токенов) | +Адаптер — это подключение к конкретной нейросети. Один адаптер может использоваться несколькими агентами. -### Настройки агента +```yaml +Адаптер: + id: uuid + название: "Claude Opus" + провайдер: anthropic | openai | google | openclaw | cli + + # Конфиг — JSON поле, разное для каждого провайдера + config: + # Anthropic + api_key: "sk-ant-..." + model: "claude-opus-4-5" + max_tokens: 8192 + + # Или OpenAI + api_key: "sk-..." + model: "gpt-4" + organization: "org-..." + + # Или OpenClaw + gateway_url: "http://localhost:18789" + gateway_token: "..." + agent_id: "main" + + # Или CLI + command: "claude" + working_dir: "/workspace" + + # Возможности адаптера (что умеет эта нейросеть) + capabilities: ["coding", "analytics", "review", "design", "docs", "testing"] +``` + +**Важно:** Capabilities привязаны к адаптеру, не к агенту. Потому что возможности определяются нейросетью. + +### Агент + +Агент — это "личность" с ролью, которая использует адаптер. ```yaml Агент: + id: uuid имя: "Кодер" slug: "coder" - провайдер: anthropic - модель: claude-sonnet-4-20250514 - api_key: "sk-..." # зашифрован + # Привязка к адаптеру + адаптер_id: uuid + + # Роль системный_промпт: "Ты — backend разработчик..." + # Подписка подписка: режим: mentions # all | mentions | assigned проекты: ["*"] # или конкретные - ограничения: - макс_параллельных: 2 - таймаут: 600 # секунд + # Ограничения + макс_параллельных: 2 + таймаут: 600 # секунд ``` +### Связка: типы задач ↔ адаптеры + +``` +Задача с тегом "coding" → только агенты с адаптером, у которого capability "coding" +Задача с тегом "design" → только агенты с адаптером, у которого capability "design" +Задача с тегом "analytics" → только агенты с адаптером, у которого capability "analytics" +``` + +Агент-дизайнер НЕ возьмёт задачу на кодинг — у его адаптера нет такой возможности. + +### Типы провайдеров + +| Провайдер | Описание | Конфиг | +|-----------|----------|--------| +| `anthropic` | Claude API | api_key, model, max_tokens | +| `openai` | GPT, Codex | api_key, model, organization | +| `google` | Gemini | api_key, model | +| `openclaw` | OpenClaw Gateway | gateway_url, gateway_token, agent_id | +| `cli` | Claude Code CLI | command, working_dir | + ### Подписка на события | Режим | Агент получает | @@ -288,6 +347,64 @@ agent.heartbeat — пульс --- +## Ревью и PR + +### Не каждая задача = PR + +| Тип задачи | Нужен PR? | +|------------|-----------| +| coding | Да | +| testing | Да | +| analytics | Нет — результат в виде файла/отчёта | +| design | Нет — результат в виде файла | +| docs | Возможно — зависит от проекта | + +Поле `требует_pr` определяется автоматически по типу, но можно переопределить вручную. + +### Флоу ревью (для задач с PR) + +``` +1. Агент работает → коммитит в feature branch +2. Создаёт PR в Gitea +3. Сдвигает задачу в Review +4. Трекер назначает ревьюера (другой агент, НЕ автор) +5. Ревьюер смотрит PR, пишет комментарии В ЗАДАЧЕ +6. Ок → Approve → Done, PR мержится +7. Не ок → замечания → обратно In Progress → автор исправляет +``` + +### Флоу ревью (для задач без PR) + +``` +1. Агент работает → прикрепляет результат (файл/отчёт) к задаче +2. Сдвигает в Review +3. Ревьюер проверяет результат +4. Ок → Done +5. Не ок → замечания → обратно In Progress +``` + +### Правила ревью + +- Автор ≠ ревьюер (всегда) +- Максимум 3 итерации — потом эскалация к человеку +- Все комментарии в задаче (единый контекст) +- Чат проекта = лог событий (всё видно) + +### Итерации ревью + +```yaml +review_history: + - iteration: 1 + reviewer: analyst + status: changes_requested + comments: ["Нужна валидация", "Нет тестов"] + - iteration: 2 + reviewer: analyst + status: approved +``` + +--- + ## Workflow: от идеи до деплоя ### Фаза 1: Идея → Проект @@ -335,6 +452,72 @@ agent.heartbeat — пульс --- +## База данных (ключевые таблицы) + +```sql +-- Адаптеры (подключения к нейросетям) +CREATE TABLE adapters ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + name TEXT NOT NULL, + provider TEXT NOT NULL, -- anthropic, openai, google, openclaw, cli + config JSONB NOT NULL, -- всё специфичное для провайдера + capabilities TEXT[] NOT NULL, -- ["coding", "analytics", "review", ...] + created_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Агенты (личности с ролями) +CREATE TABLE agents ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + name TEXT NOT NULL, + slug TEXT UNIQUE NOT NULL, + adapter_id UUID REFERENCES adapters(id), + system_prompt TEXT, + subscription_mode TEXT DEFAULT 'mentions', -- all, mentions, assigned + max_concurrent INT DEFAULT 1, + timeout_seconds INT DEFAULT 600, + status TEXT DEFAULT 'idle', + created_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Задачи +CREATE TABLE tasks ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + project_id UUID REFERENCES projects(id), + parent_id UUID REFERENCES tasks(id), -- подзадачи + title TEXT NOT NULL, + description TEXT, + status TEXT DEFAULT 'draft', + task_type TEXT DEFAULT 'other', -- coding, analytics, design, testing, docs + tags TEXT[], + requires_pr BOOLEAN DEFAULT FALSE, + assigned_agent_id UUID REFERENCES agents(id), + priority TEXT DEFAULT 'medium', + pr_url TEXT, + created_at TIMESTAMPTZ DEFAULT NOW(), + updated_at TIMESTAMPTZ DEFAULT NOW() +); + +-- Зависимости задач +CREATE TABLE task_dependencies ( + task_id UUID REFERENCES tasks(id) ON DELETE CASCADE, + depends_on_id UUID REFERENCES tasks(id) ON DELETE CASCADE, + PRIMARY KEY (task_id, depends_on_id) +); + +-- Файлы задач +CREATE TABLE task_files ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + task_id UUID REFERENCES tasks(id) ON DELETE CASCADE, + filename TEXT NOT NULL, + mime_type TEXT, + file_path TEXT NOT NULL, + uploaded_by UUID, -- agent_id или null (человек) + created_at TIMESTAMPTZ DEFAULT NOW() +); +``` + +--- + ## Открытые вопросы 1. Как интегрировать CLI-агентов (Claude Code, Cline)?