AI-платформа разработки. Персональный ассистент для кода, инфраструктуры и управления знаниями. Ядро (CLI, wiki, агентный рантайм) -- на MacBook. Инфраструктурные cron-агенты и сервисы -- на Raspberry Pi 5. Внешний доступ через Tailscale Funnel.
Enix Flow -- это локальная персональная AI-платформа на MacBook, надстройка над opencode (Claude Code совместимость). Предоставляет структурированный контекст (wiki, память, задачи), автоматический мониторинг инфраструктуры, самоисцеляющих cron-агентов, управление жизненным циклом сессий (протоколы GL/GG) и наблюдаемость на уровне инструментов.
Ядро системы (CLI, агентный рантайм, wiki) работает на MacBook Pro M3 Max (36GB RAM). Инфраструктурный слой -- на Raspberry Pi 5 (4 ядра ARM64, 8GB RAM, NVMe 465GB). Внешний доступ к сервисам Pi5 через Tailscale Funnel + nginx reverse proxy. Состояние хранится в SQLite на MacBook и Pi5. Cron-агенты на Pi5 круглосуточно выполняют проверки здоровья, верификацию бэкапов и обслуживание wiki.
Система построена за 5 последовательных этапов в течение ~3 недель (20.05.2026 -- 02.06.2026). Каждый этап добавлял новый уровень возможностей. Все этапы завершены, 241 тест проходит.
Цель: исправить критические баги, блокирующие дальнейшую разработку, добавить CI и типизированные контракты. Длительность: 3 дня. Тестов: 73.
| Задача | Что сделано | Файлы |
|---|---|---|
| 0.1 Роутинг | Порог уверенности (мин 50%), ответ о неоднозначности для низкоуверенных совпадений. Больше никаких ложных срабатываний от однословных запросов. | route.js |
| 0.2 FTS индексация | Полнотекстовая индексация тела страниц вместо только summary. FTS5 с префиксными звёздами (OR* для многословных запросов). Гибридное RRF слияние (BM25 + FTS5). | fts.js, scan.js, hybrid.js |
| 0.3 Принудительные guard | Предпроверка guard перед выполнением. Система хуков: YAML frontmatter с signals/guard/risk/steps. Движок политик: уровни риска low/medium/critical. | guard.js, policy.js, hooks.js |
| 0.4 CI пайплайн | npm test для предотвращения регрессий в pre-commit. Все 73 теста проходят перед каждым слиянием. | package.json |
| 0.5 Типизированные схемы | JSON-схемы для выходных данных route/search/guard. Контракт --json для CLI-команд. Структурированные, машиночитаемые ответы. | schemas.js |
Цель: заменить линейные Markdown-файлы на состояние с хранением в SQLite. Длительность: 1 неделя. Тестов: 78.
| Задача | Что построено | CLI |
|---|---|---|
| 1.1 Состояние задач | SQLite таблица tasks (id, project, status, plan_json, evidence, parent_id). Поток статусов: pending -> planned -> executing -> verifying -> done/failed/blocked. Связь с сессией. | task create, list, status, log |
| 1.2 Движок политик | Реестр инструментов с JSON-схемой на каждый. Уровни риска: low (авто), medium (подтверждение), critical (двойное подтверждение). Песочница: разрешённые команды, запрещённые паттерны. | policy check "команда" |
| 1.3 Структурированная память | SQLite таблица memories. Типы: pattern, fix, command, preference, postmortem, candidate. Авто-дедупликация по хешу контента. TTL + пайплайн выпуска (>=3 use_count, >0.7 conf -> кандидат в wiki). memory.md остаётся как человекочитаемое представление. | memory, memory cleanup |
| 1.4 Автоисправление wiki | Еженедельное обнаружение сирот + автоисправление через BM25. Поиск устаревшего (90+ дней без обновления). Подсказки кросспроектных ссылок. Протокол устаревания: старые данные переносятся в секцию "Устарело". | lint --fix, lint --stale, lint --cross |
| 1.5 Наблюдаемость | Структурированные трассы вызовов инструментов. Агрегация по сессиям. Авто tool_calls в sessionClose. Дашборд по проектам. | obs track, stats, traces, flush |
Цель: дать системе настоящий агентный цикл вместо подчинения на уровне промптов. Длительность: 2 недели. Тестов: 52.
Каждый шаг записывает evidence (выполненные команды, вывод, ошибки). Проверка сверяет критерии приёмки. При неудаче -> повтор до N попыток с разными стратегиями. При успехе -> паттерны сохраняются в память.
| Задача | Описание | CLI |
|---|---|---|
| 2.1 Agent Loop | Полный цикл наблюдение->план->действие->проверка->рефлексия. 496 строк в agent.js. Резервные планы: deploy проверяется ДО fix (избегаем совпадения "hotfix" с "fix"). Критерии проверки: npm test/lint ok, 200 OK, ручная проверка. | agent plan, run, status |
| 2.2 Git Worktree | Изолированное рабочее пространство на задачу в /tmp/enix-worktrees/task-ID. git worktree add + ветка на задачу. Автоочистка после завершения (проверяет незакоммиченные изменения). | worktree create, cleanup, list |
| 2.3 Реестр инструментов | 12 стандартных инструментов с risk/schema/confirm. Брокер инструментов выбирает инструменты на основе плана. Evidence: все вызовы + результаты сохраняются в traces. | tools2 list, check, find, stats |
| 2.4 Проактивный GL | При gl: авто-проверка здоровья, ретроспектива (последние 5 сессий), незакрытые задачи, предложения фокуса. Алерты диска (>80%), упавшие контейнеры, заблокированные задачи. HealthScore 0-100 из факторов: failed(-5), blocked(-3), no sessions(-10), частота ошибок. | start/gl |
| 2.5 DERP/Funnel | Детектор конфликта: свой DERP на VPS ломает Tailscale Funnel TLS (edge->DERP->Pi5 петля). Автоисправление: отключить DERP, восстановить Funnel. | infra derp |
| 2.6 Очистка VPS | Монитор диска + автоочистка на VPS (логи, старые бэкапы, docker образы). | infra disk, cleanup |
Цель: система понимает структуру кода и может измерять собственный прогресс. Длительность: 2 недели. Тестов: 22.
| Задача | Описание | CLI |
|---|---|---|
| 3.1 Карта кода | Извлечение символов: определения функций, классы, импорты для JS/PHP/CSS/Python/Shell. Обратный индекс: символ -> расположение в файлах. Граф зависимостей: граф import/require. Предложения wiki: большие компоненты кода -> предложить создание wiki-страницы. | repomap find, usages, wiki |
| 3.2 Метрики качества | Золотой набор задач: роутинг, поиск, wiki lint, агентные сценарии. Базовые замеры. Отслеживание улучшений по сессиям. 6 типов оценки: routing, wiki, agent, search, lint, mixed. | eval run, history |
| 3.3 Наблюдаемость v2 | Дашборд с метриками по проектам: задачи, процент успеха, средняя длительность, вызовы инструментов, паттерны ошибок. Агрегация оценки здоровья. Детектор изменённых файлов (mtime-sha256 дельта от последнего сканирования). | dashboard |
| 3.4 Аналитика навыков | Статистика использования каждого навыка (skill). Оценка качества (помог vs навредил). Авто-выгрузка неиспользуемых навыков (>30 дней). 17 активных навыков в реестре. | skills list, stats |
Цель: распределённые автономные агенты, работающие по cron. Длительность: 2 недели. Тестов: 16.
| Задача | Описание |
|---|---|
| 4.2 Оркестратор | AgentRuntime: регистрация суб-агентов, trigger (по расписанию), разрешение конфликтов. Human-in-the-loop для критических решений. |
| 4.3 Самоисцеление v2 | Автоисправление Funnel при конфликте DERP. Авто-переподключение AWG. Перезапуск Docker-контейнеров при падении. Автоочистка дискового пространства (Pi5 + VPS). |
| 4.5 Сайт документации | Генератор статического HTML из 194 wiki-страниц. Боковая навигация по проектам. Клиентский BM25 + FTS5 поиск (search.json). Тёмная тема, JetBrains Mono. Авто-пересборка при изменениях в wiki. |
Все автоматизированные агенты работают через crontab пользователя en1x на Raspberry Pi 5. Логи пишутся в /home/en1x/logs/enix-checks.log. Расписание cron развёрнуто 02.06.2026, заменив старый скрипт ручного бэкапа.
| Когда | Агент | Что делает | Статус |
|---|---|---|---|
| Каждые 30 мин | SelfHealer | Исправление конфликта DERP/Funnel, перезапуск упавших контейнеров, очистка диска VPS, переподключение AWG | активен |
| Каждые 6 часов | InfraGuard | Проверка диска (Pi5+VPS), здоровье Docker-контейнеров, статус DERP/Funnel, доступность VPS через AWG. Алерты в Telegram при критических событиях. | активен |
| Ежедневно 02:00 | BackupSentinel | Проверка логов бэкапа от 01:00. Верификация 15 задач. Алерт в Telegram при сбоях. | активен |
| Воскресенье 03:00 | WikiCurator | Полный lint wiki: сироты, битые ссылки, устаревшие страницы. Автоисправление сирот через BM25. Пересборка сайта документации (194 страницы -> статический HTML). Первый запуск: 08.06.2026. | ожидает (8 июня) |
| Ежедневно 04:00 (root) | cert-sync | Синхронизация LE-сертификата с VPS на Pi5 (home.de-bor.ru). Перезагрузка nginx при изменении. Действителен до 29 августа. | активен |
Что НЕ выполняется при GL: тяжёлые операции (SSH-проверки, lint wiki, пересборка документации, проверки бэкапов) вынесены в cron, чтобы gl работал быстро (< 150ms). GL показывает только: счётчики + healthScore + алерты + фокус.
Wiki -- это структурированная база знаний из 194 страниц в 14 проектах. Страницы хранятся как Markdown-файлы с YAML frontmatter (type, title, tags, date). Файловая структура использует поддиректории типов во множественном числе: concepts/, entities/, personal/, synthesis/, sources/, roadmap/.
| Операция | CLI | Что делает |
|---|---|---|
| Поиск сирот | lint (по умолчанию) | Находит wiki-страницы с 0 обратных ссылок. Сейчас 18 сирот. |
| Автоисправление сирот | lint --fix | BM25-поиск по имени сироты -> добавляет [[ссылку]] в лучшее совпадение. Создаёт .bak резервную копию. |
| Поиск устаревшего | lint --stale [дней] | Страницы без обновления N дней (по умолчанию 90). |
| Кросспроектные ссылки | lint --cross | Находит битые [[ссылки]], где страница существует в другом проекте. Предлагает scope-квалифицированные ссылки. |
| Битые ссылки | lint | Обнаруживает [[ссылки]] на несуществующие страницы. Сейчас 31 битая. |
| Устаревание | вручную | Старые данные переносятся в секцию "Устарело" с датой. Никогда не удаляются. |
Система памяти перешла от линейного файла memory.md (человекочитаемое представление на 200 строк) к структурированному хранилищу на SQLite с авто-дедупликацией, оценкой уверенности и пайплайном выпуска.
Очистка: записи с низкой уверенностью (conf <=0.5, use_count=0) периодически удаляются. Vacuum уменьшает размер БД. Сейчас 8 записей после очистки (с пика 1602).
GL оптимизирован до < 150ms: без SSH-проверок, без тяжёлого lint. Тяжёлые операции переданы cron-агентам. GL показывает: счётчики, healthScore, алерты, предложения фокуса, последние 5 сессий.
Multi-GG: повторный gg в одной сессии расширяет её. Агент запоминает session_id после gl. Закрытие сессии идемпотентно (повторный вызов безопасен).
| Устройство | Роль | Характеристики | Сеть |
|---|---|---|---|
| Raspberry Pi 5 | Инфра-сервер | ARM64, 4 ядра, 8GB RAM, NVMe 465GB, Debian 13 | LAN 192.168.153.117, Tailscale 100.83.90.104 |
| MacBook Pro M3 Max | Рабочая станция | 36GB RAM, 926GB SSD, режим clamshell | LAN 192.168.153.131, Tailscale 100.121.154.20 |
| Aeza VPS (Амстердам) | VPN + прокси | AmneziaWG, 3x-ui VLESS+Reality, nginx | AWG 10.8.0.1, DERP relay |
Tailscale Funnel: открывает nginx (порт 8084) в публичный интернет через raspberrypi5.tail50b3fb.ts.net. Маршруты Funnel: / -> дашборд, /enix-flow/ -> эта страница, /enix-fit/ -> PWA + прокси API на :3002.
AmneziaWG (AWG): VPN-туннель Pi5 <-> VPS. Jc=3 оптимален (Jc=12 -- переполнение UDP-буфера CGNAT, Jc=1 -- нестабилен под нагрузкой). AWG route-all для обхода DPI (блокировки РКН). Обход exit node на Pi5 (таблица 51821 маршрутизирует определённые IP через eth0).
nginx reverse proxy: SSL-терминация (Let's Encrypt с VPS, синхронизация через cert-sync). 15 виртуальных хостов: homepage, nextcloud, jellyfin, portainer, qbittorrent, filebrowser, uptime-kuma, sunshine, home-assistant, 3x-ui, enix-dash. Все сервисы терминируют SSL на nginx, бэкенд Docker на localhost.
15 задач бэкапа, запускаются ежедневно в 01:00 MSK на Pi5. Хранилище: /home/en1x/backups/ (NVMe). Ротация: 7 ежедневных + 4 еженедельных, используется rsync --link-dest (хардлинки для неизменённых файлов -- экономят место).
| Категория | Задач | Метод |
|---|---|---|
| Вытягивание с MacBook | 8 задач (проекты, сайты, конфиги, wiki, dotfiles, ssh, bin) | rsync pull через pull_mb (двойной путь LAN/Tailscale) |
| Вытягивание с VPS | 1 задача (конфиги aeza: x-ui, hysteria2, nginx, AWG, iptables) | tar через SSH по AWG-туннелю (один поток, без round-trip) |
| Локально на Pi5 | 4 задачи (конфиги docker, /etc, секреты, дамп БД Nextcloud, dotfiles, /var/www) | rsync локально --link-dest для дедупликации хардлинками |
| enix-fit | 1 задача (дамп SQLite БД) | sqlite3 .backup, ротация 30 дней |
| Отправка на VPS | 1 задача (критические конфиги на VPS) | rsync push через AWG |
Пост-проверка: precheck валидирует существование и непустоту критических файлов. BackupSentinel (cron в 02:00) проверяет логи + алертит при сбоях.
| Команда | Описание |
|---|---|
| agent run --task id | Выполнить задачу через полный агентный цикл (наблюдение->план->действие->проверка->рефлексия) |
| agent plan --task id | Сгенерировать только план (JSON-шаги с критериями приёмки) |
| agent run-sub имя | Запустить суб-агента: infra, backup, heal, wiki (вызывается cron) |
| start / gl | Начало сессии: индекс wiki, память, задачи, сессии, здоровье, фокус |
| task create --project п --title з --session с --done | Создать задачу в SQLite с привязкой к сессии |
| task session create --project п | Создать сессию (start_time = сейчас) |
| task session close --session id | Закрыть сессию (end_time, duration). Идемпотентно. |
| search "запрос" [--tags=т1,т2] [--engine hybrid|bm25|fts5] | Гибридный поиск по wiki: тело + теги + обратные ссылки |
| context "тема" [--tags=т] | Контекстный поиск для использования агентом (BM25+FTS5+backlinks+tags) |
| route "сообщение" | Маршрутизация dispatch: приоритет хуков + fallback-таблица. Нечёткое совпадение. |
| policy "триггер" | Проверить, разрешён ли триггер. Риск: low/medium/critical. |
| hooks [имя] | Список хуков или детали конкретного хука (всего 16 хуков) |
| lint [--fix] [--stale] [--cross] | Качество wiki: сироты, битые ссылки, устаревшие страницы, кросспроектные |
| memory / memory cleanup | Статистика памяти, очистка записей с низкой уверенностью |
| repomap find|usages|wiki | Поиск символов в коде, обратный индекс, предложения wiki |
| eval run|history | Запуск бенчмарков, просмотр истории (6 типов оценки) |
| dashboard | Дашборд метрик по проектам |
| skills list|stats | Реестр навыков: статистика использования, оценки качества |
| obs track|stats|traces|flush | Наблюдаемость: трекинг вызовов инструментов, трассировка сессий |
| infra derp|disk|cleanup | Инфраструктура: проверка DERP/Funnel, монитор диска, очистка |
| worktree create|cleanup|list | Управление git worktree для изолированных задач |
| tools2 list|check|find|stats | Реестр инструментов: 12 стандартных с risk/schema/confirm |
| docs [--serve] | Сборка статического сайта документации из wiki (194 страницы -> HTML) |
| db | Статистика БД: количество задач, записей памяти, трасс |
| codelint [проект] | Качество кода: утечки секретов, захардкоженные токены, валидация .env |
В фоне продолжают работать cron-агенты: каждые 30 минут самоисцеление, каждые 6 часов проверка инфраструктуры, ежедневная верификация бэкапов, еженедельная чистка wiki. Вы спите -- Enix Flow наблюдает.