Дашборд
Локальный веб-дашборд для просмотра vault, задач, ранов воркфлоу и engram-памяти проекта.
Дашборд
dev-workflow web поднимает локальный read-write дашборд для проекта — семь страниц, мульти-проектный навбар, живые обновления через Server-Sent Events. Один процесс Node поверх node:http, без фреймворка на сервере; UI — Next.js static export.
Запуск
cd my-project
dev-workflow web # http://127.0.0.1:3737
dev-workflow web --port 4000 # выбрать порт
dev-workflow web --no-open # не открывать браузерСервер слушает только loopback (127.0.0.1) — флага --host нет по дизайну. Это локальный инструмент для одного оператора, не публичный сервис. При занятом порте — fallback на +1..+4 (до 5 попыток). При запуске текущая директория добавляется в реестр проектов и становится активной, если активного ещё нет.
Семь страниц
| Страница | Что показывает |
|---|---|
| Overview | Текущий проект, последняя активность по vault, recent workflow-runs, summary задач |
| Vault | stack.md / conventions.md / knowledge.md / gameplan.md в живом редакторе с live-обновлением при изменении файла снаружи |
| Tasks | Список задач, фильтр по статусу / приоритету / ветке, создание новых, отметка in-progress / done |
| Workflow | Список ранов с воркфлоу/таском/статусом; клик по руну открывает детали — шаги, телеметрию, JSON state, trace |
| Tokens | Разбивка токенов выбранного рана (by step / source / vault file / engram type) + advisory-предупреждения; ручной refresh, без SSE |
| Engram | Health демона (Voyage / deterministic provider), agg-метрики, live-tail trace выбранного рана |
| Settings | Реестр проектов (добавить / удалить), активный профиль коммуникации, raw communication.yaml |
Сетевые границы
- Loopback only. Сервер связывается с
127.0.0.1, не0.0.0.0. Доступ из других машин в LAN заблокирован архитектурно, не флагом —--hostотсутствует. - Рейт-лимит 60 req/min на IP для REST-эндпоинтов; SSE-стрим освобождён, чтобы long-lived подписки не съедали бюджет.
?project=валидация на каждом эндпоинте, project-scoped данные изолированы между проектами в реестре.
Server-Sent Events
Дашборд держит одно SSE-соединение на вкладку — /events/stream?project=<name>. Сервер мультиплексирует четыре топика (vault, runs, trace, projects) через event:-имя; клиентский синглтон SseHub демультиплексирует и рассылает подписчикам по топику. Реконнект — только при смене проекта.
Это решает классическую проблему HTTP/1.1: ~6-соединений-на-origin браузерный кап в сочетании с RSC-префетчами Next.js приводил к стопу навигации при четырёх per-topic стримах. Один мультиплексированный стрим больше не голодает пул.
Multi-project
Реестр живёт в ~/.config/dev-workflow/projects.json — один JSON со списком абсолютных путей и активным проектом. Любая вкладка дашборда может переключаться между ними через селектор в навбаре. Добавление / удаление проекта — через страницу Settings (server-side directory browser; webkitdirectory в браузере не используется по соображениям UX и безопасности).
Что в дашборд не входит
- Запуск воркфлоу. Workflow-страница read-only — никаких «Run /workflow:dev» кнопок. Дашборд показывает то, что произошло, не управляет тем, что происходит. Запуск воркфлоу — только из Claude Code-сессии через slash.
- Удалённый доступ. Loopback намеренный. Если нужно посмотреть с другой машины — пробросить порт SSH-туннелем.
- Multi-user. Один реестр на пользователя, один процесс на проект; coordination между сессиями не предусмотрена.
Тех-детали для любопытных
- Сервер: один процесс
node:http,~/Projects/.../src/web/server.ts, без runtime-фреймворка.chokidar— единственная runtime-зависимость веб-слоя (file-watching для SSE). - UI: Next.js 16 static export →
dist/dashboard/*. Раздаётся самим Node-сервером (src/web/static.ts). - Watcher per project с idle-TTL 5 минут — если на проект нет подписчиков, chokidar-инстансы освобождаются.
- E2E: Playwright против реального CLI, см.
e2e/и CI-workflowe2e.yml.