HMVMFlow — настройка от А до Я
Канон для людей и агентов, когда непонятно, как устроены Flow, SDD и оркестратор. Код UI: hmvm-flow/web/. Деплой UI не рестартит MCP.
Краткий указатель: этот файл. Карточка продукта в хабе: Flow / марка FL. HTML: <strong>HMVM</strong>Flow. Title: HMVMFlow.
0. За 30 секунд
Три разные вещи, не путать:
| Имя | URL | Что это |
|---|---|---|
| Оркестратор (MCP) | https://ai.hmvm.ru/mcp | Турникет. Grok/ChatGPT просят — он пускает Cursor только в разрешённые репо. Живой. Не рестартить без окна. |
| Flow UI | https://flow.hmvm.ru | Подготовка проекта по SDD: устав, истории, критерии, вопросы, план, задачи. Модели не выбираются здесь. Змейка снята (снимок в hmvm-flow/gold/). |
| Cursor Cloud Agent | GitHub-зеркало | Руки: пишет код и PR. Ключ GitHub живёт у Cursor, не в форме Flow. |
Одной фразой: SDD — билет, Flow — дорога, оркестратор — турникет, Cursor — руки, прод — только ты.
Пачка до кода, как это делают Spec Kit и Kiro: устав проекта, истории, проверяемые критерии (КОГДА … система …), закрытые вопросы, план «как», задачи со ссылкой на критерий. «Готова» и скачиваемый SPEC.md держат эту пачку. Код страница не запускает.
1. Инвентарь
| Имя | HMVMFlow |
| CTID | 115 HMVMAi |
| Нода | HV-PVE-1-T |
| LAN | 10.10.1.51/20, gw 10.10.0.1 |
| UI | https://flow.hmvm.ru → NPM → :8088 (hmvm-flow-web) |
| MCP | https://ai.hmvm.ru/mcp → :8787 (hmvm-ai-orchestrator). Корень https://ai.hmvm.ru/ — чат HMVMAi на LXC 128, не этот процесс |
| Health UI | https://flow.hmvm.ru/health → {"ok": true, "service": "hmvm-flow"} |
| Документация | https://flow.hmvm.ru/docs — тот же текст, что этот файл |
| Health MCP | https://ai.hmvm.ru/healthz → {"ok":true} |
| SSH | ./maintenance/ssh-ai.sh (ключ ~/.ssh/hmvm_ai_ed25519) |
| Деплой UI | ./maintenance/deploy-flow-to-prod.sh |
| JWT SSO | aud=flow, секрет FLOW_JWT_SECRET или fallback portal |
| Хаб | https://auth.hmvm.ru/?service=flow |
WAN домашний: 95.165.147.52. SSH с ноутбука вне LAN — через portal jump (:4000), скрипт сам переключается.
Gold UI (эталон змейки+мастера, не затирать при новых слоях): hmvm-flow/gold/2026-08-22-snake-wizard/ · git 7f3bd7c · id 2026.08.22-flow-gold.1.
2. Как открыть и войти
- Браузер:
https://flow.hmvm.ru. Справа в шапке ссылка Документация →https://flow.hmvm.ru/docs(этот текст). - Без сессии справа ссылка SSO / TG →
https://auth.hmvm.ru/?service=flow(passkey / Telegram). - После входа токен в query
?hmvm_token=…снимается вsessionStorageключhmvm:flow:session. Чип в цвете Flow:{имя} / SSOпосле passkey,{имя} / TGпосле QR. Пока в JWT нетauth_via(старая сессия) — только имя, ссылка SSO / TG остаётся, чтобы войти заново. - Одна страница: слева спека, справа модели из Orch. Чип:
нет спеки/черновик: …/спека: …. - Документация:
https://flow.hmvm.ru/docs. Подключить модель —https://ai.hmvm.ru/admin, не на этой странице.
Модалки (мастер на карточке) закрываются только ✕, не кликом по фону.
Если страница «старая» (нет вкладок) — жёсткое обновление (кэш app.js?v=…).
3. Вкладка SDD — билет (делать первым)
Это не Markdown-файл руками и не логин в Git. Поля пишутся в браузер: localStorage ключ hmvm:flow:spec.
3.1. Что должно быть заполнено, чтобы Готова сработала
Иначе кнопка напишет «Ещё не готова: …»:
- название;
- «что сделать»;
- хотя бы одна строка Делаем;
- минимум три пункта Готово когда (непустых);
- репо из выпадашки (allowlist в коде).
Замки: не prod всегда включён и снять нельзя. не merge и не live PVE по умолчанию включены.
3.2. Поля
| Блок | Зачем | Как заполнять |
|---|---|---|
| Название | Короткое имя билета, видно в чипе | 3–8 слов |
| Что сделать | Задача для людей и потом для агента | 1–3 предложения, без «и заодно прод» |
| Делаем | In scope | Конкретные артефакты |
| Не делаем | Out of scope | Прод, чужие репо, live PVE — уже стоят по умолчанию, не стирай без нужды |
| Готово когда | Чеклист приёмки | Формулировки «да/нет», не «получше» |
| Репо / ветка | Куда Cursor имеет право смотреть | Только список. Сейчас GitHub-зеркало |
| Замки | Политика турникета | Прод нельзя выключить |
| Пишет код | Кто руки | Cursor / я сам / позже |
| Смотрит код | Кто ревью | Kimi / Claude / никто / позже |
Куда (репо) — это выбор цели, не авторизация. PAT и пароль Git сюда не вводятся. См. §7.
Список репо в коде (hmvm-flow/web/app.js, REPOS):
| id | Подпись в UI | Ветка |
|---|---|---|
portal | jnxwl-git/HMVM_PORTAL | main |
orch | jnxwl-git/hmvm-ai-orchestrator | main |
Канон кода портала — GitLab. Cursor ходит в GitHub-зеркало. В SDD выбирай зеркало, которое видит Cloud Agent.
3.3. Кнопки
| Кнопка | Действие |
|---|---|
| Готова | Проверка полей → status: ready → подписи на змейке (Код = Cursor, при Kimi/Claude после Git появляется Code Reviewer) |
| Снова черновик | Снимает «готова». Чертёж не сбрасывает |
| Открыть Flow | Вкладка змейки |
| Скачать SPEC.md | Экспорт для чата/репо. Не замена формы |
3.4. Пример А — «Kimi смотрит PR портала»
Задача: настроить чертёж так, чтобы после Git стоял ревьюер Kimi. Живой вызов Kimi ещё не включён; это пометка на схеме.
Название: Kimi ревьюер на портал
Что сделать: Cursor пишет фичу в GitHub-зеркало HMVM_PORTAL.
Kimi (потом) смотрит diff. Прод не трогаем.
Делаем:
- PR в GitHub jnxwl-git/HMVM_PORTAL
- карточка Code Reviewer после Git / PR
Не делаем:
- merge в main
- прод
- live PVE из чата
- рестарт MCP ai.hmvm.ru
Готово когда:
- на Flow у шага Код подписан Cursor
- после Git есть карточка Code Reviewer · Kimi
- замок «не prod» включён
(четвёртый пункт по желанию)
Репо: jnxwl-git/HMVM_PORTAL
Ветка: main
Пишет: Cursor
Смотрит: Kimi
Дальше Готова → Открыть Flow. На змейке шаг Код = Cursor · Coder, после Git / PR — пунктирная карточка Code Reviewer с Kimi.
3.5. Пример Б — «только документация, без ревьюера»
Название: Docs-only README Flow
Что сделать: Обновить docs/HMVM_FLOW.md. Код сервисов не менять.
Делаем:
- правки только docs/HMVM_FLOW.md и ссылок на него
Не делаем:
- merge в main
- прод
- live PVE из чата
- рестарт hmvm-ai-orchestrator
Готово когда:
- в PR только markdown/ссылки
- нет изменений backend/
- спека в статусе готова
Репо: jnxwl-git/HMVM_PORTAL
Ветка: main
Пишет: Cursor
Смотрит: Никто
На Flow Готовый набор → Только документация → Поставить — мастер покажет, какие карточки добавятся (docs + reviewer). Для «никто не смотрит» ревьюер из набора можно убрать кликом по карточке → убрать шаг.
3.6. Пример В — «я сам пишу, чертёж только для памяти»
Пишет код: Я сам
Смотрит: Позже
Шаг Код получит роль «Я сам», без модели Cursor. Билет всё равно нужен: рамки и «готово когда».
3.7. Пример JSON спеки (как лежит в браузере)
Ключ hmvm:flow:spec. Посмотреть: DevTools → Application → Local Storage → flow.hmvm.ru.
{
"version": 1,
"id": "n_abc12xyz",
"status": "ready",
"title": "Kimi ревьюер на портал",
"goal": "Cursor пишет фичу. Kimi смотрит diff. Прод не трогаем.",
"inScope": ["PR в GitHub jnxwl-git/HMVM_PORTAL", "карточка Code Reviewer после Git"],
"outScope": ["merge в main", "прод", "live PVE из чата"],
"doneWhen": [
"на Flow у Кода подписан Cursor",
"после Git есть Code Reviewer · Kimi",
"замок не prod включён"
],
"repo": "portal",
"branch": "main",
"locks": { "noMerge": true, "noProd": true, "noLivePve": true },
"writer": "cursor",
"reviewer": "kimi"
}
writer: cursor | me | later. reviewer: kimi | claude | none | later.
4. Змейка снята
Живая страница — спека и колонка моделей. Конвейер из 11 шагов не рисуется. Старый UI лежит в hmvm-flow/gold/2026-08-22-snake-wizard/ и оттуда на прод не возвращается сам.
Колонка Модели читает GET /api/orch/connections (сессия Flow). Это факт, не настройка:
- Cursor на шлюзе —
model-default.jsonили env оркестратора - твой Cursor — личный ключ и модель из workspace того же
sub, без шифротекста - чат — есть ли секрет коннектора
Ключ Cursor, master и секрет чата здесь не показываются и не пишутся. Смена модели — в Orch.
Ниже — как змейка была устроена, пока её не вернули.
4a. Бывшая дорога (змейка, не на проде)
Читай змейкой: ряд 1 вправо, вниз, ряд 2 влево, вниз, ряд 3 вправо. После каждого шага голубая стрелка.
Канон 11 шагов:
| № | Карточка | Кто по смыслу |
|---|---|---|
| 01 | Запрос | Ты |
| 02 | Архитектура | Planner |
| 03 | Оркестрация | Policy (allowlist, бюджет) |
| 04 | Код | Coder / Cursor |
| 05 | Git / PR | Git |
| 06 | Инфра | Staging-VM, не live PVE |
| 07 | Docker | Runtime |
| 08 | NPM / TLS | Edge |
| 09 | Staging | Verify |
| 10 | Отчёт | Reporter |
| 11 | PROD | Только ты. Бот не ходит |
Карточки с рамкой акцента — шаги, которые подписала готовая спека (Код и Code Reviewer).
4.1. Мастер на карточке
- Клик по карточке — роль → модель → сохранить (или убрать добавленный шаг).
- + — вставить шаг после этой карточки: тип → роль → модель.
- Готовый набор — не сыплет карточки молча: Поставить сначала объясняет, что добавится.
Модели в мастере (пока пометка, не живой ключ): Kimi, Grok, ChatGPT, Cursor, Claude, позже.
4.2. Чертёж JSON
Кнопки Скачать JSON / Загрузить JSON. Ключ localStorage: hmvm:flow:pipeline.
Сброс змейки: Сбросить чертёж (11 шагов). Спеку не трогает.
5. Что уже живое, а что только чертёж
| Кусок | Сейчас |
|---|---|
| Grok / ChatGPT / Claude → MCP | Живой контур ai.hmvm.ru/mcp. Не Always allow — коннектор отваливается |
| Cursor Cloud Agent | Живой, если задача стартовала из чата через MCP, не из кнопки Run |
| Кнопка Run на Flow | Серая. Включать только после явного окна |
| Kimi / Claude API | Только имя на карточке. Ключ Moonshot/Anthropic в форму не кладём |
| LangChain | Не в ядре. Если понадобится — исполнитель одной карточки, не замена MCP |
6. Оркестратор (MCP) — турникет
Grok или ChatGPT не ходят на PVE и не мержат main. Они вызывают tools оркестратора. Оркестратор:
- проверяет allowlist репо / ветки;
- не стартует с внутренних
cursor/*, если ref не виден на GitHub; - не делает prod/merge;
- при разрешении вызывает Cursor (
cursor_start_taskи соседние tools).
Запрещено без окна: systemctl restart hmvm-ai-orchestrator, смена имён tools, ротация MCP_SHARED_SECRET, сужение ALLOWED_HOSTS.
Проверка, что жив:
curl -sf https://ai.hmvm.ru/healthz
./maintenance/ssh-ai.sh 'systemctl is-active hmvm-ai-orchestrator hmvm-flow-web'
Подключение MCP в ChatGPT / Grok / Claude: URL https://ai.hmvm.ru/mcp. Admin доступ: https://ai.hmvm.ru/admin (SSO grant ai) — именные токены, revoke, ротация master, просмотр настроек. Claude/друг: на Allow ввести именованный токен из admin (не обязательно master). OAuth redirect allowlist: ChatGPT/OpenAI, claude.ai / claude.com, Grok/x.ai (+ loopback для Claude Code).
Когда (потом) Run включат: оркестратор должен требовать spec_id из готовой спеки. Пока спека только в браузере.
7. Git: куда ключи, куда нет
Два Git, разные роли:
| Где | Для чего | Кто ходит |
|---|---|---|
GitHub jnxwl-git/HMVM_PORTAL (и orch) | Зеркало, которое видит Cursor | Cloud Agent, уже залогиненный в Cursor |
GitLab gitlab.hmvm.ru | Канон портала | Ты, CI, деплой |
В SDD / Flow не настраивают Git-логин. Нет поля token, нет OAuth «войти в GitHub».
Где авторизация на самом деле:
- Cursor — GitHub App / token в Cloud Environment / аккаунт агента. Это настраивается в Cursor, не на
flow.hmvm.ru. - Оркестратор — allowlist хостов/репо в своём
.envна LXC 115 (не в git портала). Менять только в окно. - Ты — SSH/HTTPS к GitLab как обычно.
Если агент «не видит репо»: сначала проверь, что зеркало на GitHub существует и ref запушен; потом allowlist MCP; не вставляй PAT в спеку.
Когда Flow сам начнёт читать diff — отдельный GitHub App на сервере LXC, токен не в localStorage.
8. SSO / Auth
Плитка Flow на auth.hmvm.ru. Grant flow. Секрет на auth VM: FLOW_JWT_SECRET (см. auth/.env.example). Пустой → fallback на portal JWT, как у соседних сервисов.
Без входа чертёж в браузере всё равно рисуется (localStorage). SSO нужен как у остальных продуктов хаба, не как ключ Git.
9. Деплой и откат UI
Только статика+python UI, unit hmvm-flow-web. MCP не рестартится скриптом:
./maintenance/deploy-flow-to-prod.sh
curl -sf https://flow.hmvm.ru/health
curl -sf https://ai.hmvm.ru/healthz
Путь на LXC: /opt/hmvm-flow. Скрипт: LAN 10.10.1.51, иначе portal wan-jump.
Вернуть gold-змейку (без вкладок SDD — это снимок до вкладок):
cp hmvm-flow/gold/2026-08-22-snake-wizard/{index.html,app.js,styles.css,favicon.svg} hmvm-flow/web/
./maintenance/deploy-flow-to-prod.sh
Откат «вкладок» — git checkout нужного коммита hmvm-flow/web/, не gold, если нужны SDD-вкладки.
DNS / NPM (уже сделано, не гонять без нужды):
./maintenance/setup-hmvm-flow.sh # DNS
./maintenance/setup-hmvm-flow-npm.sh # NPMplus + LE, не трогает ai.hmvm.ru
10. SSH на LXC
./maintenance/ssh-ai.sh --print-target
./maintenance/ssh-ai.sh 'hostname; ss -lptn | grep -E "8787|8088"; systemctl is-active hmvm-ai-orchestrator hmvm-flow-web'
Не ssh root@10.10.1.51 с ноутбука вне дома — только обёртка.
11. Частые сбои
| Симптом | Что проверить |
|---|---|
| Нет вкладок Flow/SDD | Жёсткое обновление; деплой UI; `curl -sf https://flow.hmvm.ru/ \ |
| Готова ругается | Список «Проверка»: устав, название, цель, история, рамки, три критерия, нет открытых вопросов, план, задача на критерий, репо. У заголовка секции «?» — что писать и пример |
| Kimi не появился на змейке | Спека status: ready, смотрит = Kimi, потом вкладка Flow |
| Run серый | Так и задумано до окна |
| ChatGPT/Grok «коннектор умер» | Не Always allow; не рестартили ли MCP |
| «Нужна авторизация Git» в форме | Не нужна. §7 |
| Спека пропала | Другой браузер / инкогнито: localStorage другой |
| Health UI ок, MCP нет | UI и оркестратор — разные unit. Смотри 8787 |
Очистить только чертёж: сброс на Flow. Очистить спеку: DevTools → удалить hmvm:flow:spec.
12. Что не делать
- Рестартить
hmvm-ai-orchestrator«чтобы Flow заработал». - Класть GitHub PAT, Moonshot, Anthropic,
MCP_SHARED_SECRETв SDD или в JSON чертежа. - Считать выбор репо в SDD логином в Git.
- Включать Run и Always allow без окна.
- Деплоить Flow через
deploy-to-prod.shпортала — для UI естьdeploy-flow-to-prod.sh. - Ломать gold-каталог правками «упростим змейку поверх».
13. Порядок «хочу прогон», когда появится окно
- SDD заполнить → Готова.
- Flow проверить подписи Код / ревьюер.
- В чате Grok/ChatGPT (живой MCP) или будущая кнопка Run — старт Cursor с тем же репо.
- PR на GitHub → ревью (человек / потом Kimi) → ты мержишь на GitLab → прод сам.
До окна шаг 3 из UI не существует.
14. Файлы в репо
| Путь | Роль |
|---|---|
docs/HMVM_FLOW.md | Этот документ (канон). На сайте: https://flow.hmvm.ru/docs |
hmvm-flow/web/ | Live UI |
hmvm-flow/gold/2026-08-22-snake-wizard/ | Снимок змейки |
hmvm-flow/server.py | Статика + /health + /docs + /api/orch/* |
hmvm-flow/orch_model.py | Опрос Cursor и файл основной модели на HMVMAi |
hmvm-flow/systemd/hmvm-flow-web.service | Unit :8088 |
maintenance/deploy-flow-to-prod.sh | Деплой UI |
maintenance/ssh-ai.sh | SSH на 115 |
auth/.env.example | FLOW_JWT_SECRET |
Код оркестратора MCP — отдельный репо GitHub jnxwl-git/hmvm-ai-orchestrator (не путать с UI в этом дереве).
15. Вкладка HMVMAi — основная модель Cursor
https://flow.hmvm.ru/#orch. Нужна сессия Flow (SSO / TG). Ключ Cursor в браузер не попадает.
- Опросить Cursor — Flow на HMVMAi читает каталог
GET /v1/models. - Сделать основной — пишет
/opt/hmvm-ai-orchestrator/data/model-default.json(id, effort, fast, время). Без ключей. - Оркестратор читает этот файл на каждом
cursor_start_task/ follow-up, если в вызове нет своего modelId. Явный modelId в вызове важнее. - Auto основной поставить нельзя.
Пока файла нет, основная — CURSOR_DEFAULT_MODEL_ID из env (grok-4.6 / xhigh / Fast off).