# gntodo (gnexus-tasks)

Персональный менеджер задач: быстрый захват без метаданных, автодетализация через
локальную LLM (Ollama), дерево задач, MCP-интерфейс для ИИ-агентов.

Техническое задание: [docs/TZ.md](docs/TZ.md).

## Стек

- **Frontend**: Vue 3 SPA + [gnexus-ui-kit](https://git.gnexus.space/git/root/gnexus-ui-kit.git) (Vite, TypeScript)
- **Backend**: Python 3.12, FastAPI, SQLAlchemy/PostgreSQL
- **SSO**: auth.gnexus.space через [gnexus-gauth](https://git.gnexus.space/git/root/gnexus-auth-client-py.git)
- **AI**: Ollama (модель из конфига) — автодетализация метаданных
- **MCP**: MCP-сервер в составе backend (M5)
- **Деплой**: Docker Compose на VPS

## Структура

```
docs/          — техническое задание и прочая документация
backend/       — FastAPI API + MCP (Python, uv)
frontend/      — Vue 3 SPA (Vite, TypeScript)
```

## Разработка

Dev-БД (docker, порт 15432 — 5432/5433/5434 на машине заняты):

```bash
docker run -d --name gntodo-postgres -p 15432:5432 \
  -e POSTGRES_USER=gntodo -e POSTGRES_PASSWORD=gntodo -e POSTGRES_DB=gntodo \
  postgres:17-alpine
```

Миграции: `cd backend && uv run alembic upgrade head`.

Backend:

```bash
cd backend
uv sync                  # создаст .venv, установит зависимости
uv run uvicorn app.main:app --reload --port 8134
```

Frontend:

```bash
cd frontend
npm install
npm run dev              # http://localhost:15134, /api и /auth проксируются на :8134
```

## Деплой (Docker Compose)

Пошаговая инструкция для разворачивания на VPS — [docs/deploy.md](docs/deploy.md)
(состав стека, настройка `.env`, SSO, внешний TLS-прокси, чеклист проверки, MCP,
обновление, бэкапы, диагностика). Кратко:

Состав стека: `db` (PostgreSQL 17) + `api` (FastAPI, миграции применяются при старте
контейнера) + `web` (nginx: SPA-статика, прокси `/api/`, `/auth/`, `/mcp/` на api).
TLS терминирует **внешний reverse-proxy** на VPS — контейнер `web` слушает :80.

1. На сервере: `cp .env.example .env` и заполнить:
   - SSO-креды (`GAUTH_CLIENT_ID/SECRET`), `GAUTH_REDIRECT_URI=https://<домен>/auth/callback`
     — адрес callback регистрируется в auth.gnexus.space;
   - `SESSION_SECRET` (произвольная длинная строка) и `MCP_TOKEN` (пусто — `/mcp` закрыт);
   - `OLLAMA_BASE_URL` внешнего сервера Ollama (контейнера ollama в compose нет)
     и `OLLAMA_MODEL` (по умолчанию `qwen3.5:2b-q4_K_M`).
2. Запуск: `docker compose up -d --build`.
3. На внешнем reverse-proxy, который пробрасывает на `WEB_PORT` (по умолчанию 8135):
   - `client_max_body_size 12m` или больше (вложения до 10 МБ);
   - `/api/` и `/mcp/` — без буферизации (backend шлёт `X-Accel-Buffering: no`,
     nginx его уважает; на других прокси отключить буферизацию явно) — иначе
     SSE-реактивность и MCP-агенты застрянут.

Заметка: API работает в 1 воркер uvicorn — это осознанно (PKCE/state у gnexus-gauth
хранятся в памяти процесса; несколько воркеров сломают OAuth-флоу).

## Вехи

M0 — каркас (репо, скелеты, SSO, деплой) → M1 MVP задач → M2 автодетализация →
M3 структура → M4 прогнозы/бюджет/«3 варианта» → M5 MCP → M6 PWA → M7 Docker-упаковка.