dev-workflow
Концепции

Дашборд

Локальный веб-дашборд для просмотра 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 задач
Vaultstack.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
EngramHealth демона (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-workflow e2e.yml.

On this page