From e38d21fff180ab17a83be6b9f9cb559db8f6cf14 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sat, 24 Oct 2026 16:10:15 +0400 Subject: [PATCH] =?UTF-8?q?docs,=20e2e:=20=D1=85=D0=B0=D0=B1=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B8=D0=BC=D0=B5=D0=BD=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=20=D0=B2=20sdlc-hub=20(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Пути ../sdlc-hub, sdlc-hub tokens / agent publish; scripts/e2e-hub.sh — SDLC_HUB_HOME, CLI sdlc-hub, хаб по умолчанию из основного checkout sdlc-hub workspace (worktree jira-hub/.wt/wiki больше нет). Co-Authored-By: Claude Opus 5.5 --- ARCHITECTURE.md | 4 ++-- CLAUDE.md | 10 +++++----- README.md | 6 +++--- scripts/e2e-hub.sh | 12 +++++++----- src/agent.example.json | 2 +- 5 files changed, 18 insertions(+), 16 deletions(-) diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 61d47dc..d4e4d45 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -1,7 +1,7 @@ # Архитектура Агент — один файл `src/agent.py` и запускатель `src/run.py` (Python 3.9, только стандартная библиотека). Тесты в -`tests/` работают на фейках хаба и Eva. Спека: `../jira-hub/openspec/changes/wiki-module/`; решения агента: +`tests/` работают на фейках хаба и Eva. Спека: `../sdlc-hub/openspec/changes/wiki-module/`; решения агента: `openspec/changes/eva-agent-mvp/design.md`. Общие части — копия jira-agent v14 (`../jira-agent/ARCHITECTURE.md`). ## Разделы файла `src/agent.py` @@ -39,7 +39,7 @@ - Тесты не ходят во внешние сервисы. ## Сквозной прогон -`scripts/e2e-hub.sh`: настоящий хаб (`jira-hub serve` из worktree `jira-hub/.wt/wiki`, временный `JIRA_HUB_HOME`, свободный +`scripts/e2e-hub.sh`: настоящий хаб (`sdlc-hub serve` из основного checkout `sdlc-hub`, временный `SDLC_HUB_HOME`, свободный порт) + `scripts/fake_eva_serve.py` + `agent.py run --once` по HTTP. Живой хаб и его данные не затрагиваются. ## Открытые вопросы diff --git a/CLAUDE.md b/CLAUDE.md index d84c610..34fb648 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,11 +1,11 @@ # eva-agent ## Что это -Клиент модуля wiki хаба (sdlc-hub, `../jira-hub`) для виртуалки с доступом к Eva банка. Опрашивает хаб, по командам +Клиент модуля wiki хаба (sdlc-hub, `../sdlc-hub`) для виртуалки с доступом к Eva банка. Опрашивает хаб, по командам `wiki_sync` (выгрузить поддерево страниц с корня) и `wiki_fetch` (скачать вложение) читает Eva и отдаёт данные хабу; в Eva ничего не пишет. Главный сценарий: хаб ставит `wiki_sync` с кодом корня, агент обходит дерево страниц, шлёт страницы пачками в стадию хаба и отчитывается списком кодов. -Спека и дизайн: `../jira-hub/openspec/changes/wiki-module/` (hub#91, PR hub#92); решения агента — +Спека и дизайн: `../sdlc-hub/openspec/changes/wiki-module/` (hub#91, PR hub#92); решения агента — `openspec/changes/eva-agent-mvp/design.md`. Issue агента — aep/eva-agent#1. ## Стек и ограничения @@ -32,7 +32,7 @@ ресурсы (так проверяем перед коммитом). - `/usr/bin/python3 src/agent.py check` — доступность хаба и Eva (`CmfDocument.list`, 1 запись), без записи; код 0 или 3. - `/usr/bin/python3 src/agent.py run --once` — выполнить выданное и выйти при первом пустом claim. -- `bash scripts/e2e-hub.sh` — сквозной прогон с тестовым хабом из `../../../jira-hub/.wt/wiki` (временный `JIRA_HUB_HOME`, свободный порт, фейковая Eva); «e2e: ok». Живой хаб не трогать. +- `bash scripts/e2e-hub.sh` — сквозной прогон с тестовым хабом из основного checkout `sdlc-hub` workspace (временный `SDLC_HUB_HOME`, свободный порт, фейковая Eva); «e2e: ok». Живой хаб не трогать. - `/usr/bin/python3 src/agent.py` — основной цикл (нужен `agent.json` рядом с `agent.py`). - `/usr/bin/python3 src/agent.py prune` — очистка журнала (при работающем агенте откажет). - `/usr/bin/python3 src/agent.py selftest` — версия + `check`; код 0 или 3. @@ -49,8 +49,8 @@ ## Первая подсистема MVP агента: каркас с общими частями (задача 1 плана `docs/superpowers/plans/`), затем клиент Eva, обход дерева, -`wiki_sync`, `wiki_fetch`, установка и живая проверка. Версия агента — 1. Выкатка: `uv run --project ../jira-hub -jira-hub agent publish --module wiki src/agent.py` (из основного checkout; без `--module` версия уйдёт агенту jira); +`wiki_sync`, `wiki_fetch`, установка и живая проверка. Версия агента — 1. Выкатка: `uv run --project ../sdlc-hub +sdlc-hub agent publish --module wiki src/agent.py` (из основного checkout; без `--module` версия уйдёт агенту jira); порог — настройка хаба `wiki_min_agent_version`; токен — «агент wiki». ## OpenSpec и superpowers diff --git a/README.md b/README.md index 027640d..d563e98 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Eva (`wiki_sync`) и скачивает вложения (`wiki_fetch`); в Eva 2. Положить в него `agent.py` и `run.py` (из `src/`) и `agent.json` (из `agent.example.json`): - `hub_url` — тот же `folder:<путь>`, что у jira-agent (общая папка с хабом; при VPN виртуалка не видит Mac mini по сети), либо `http://<хост>:8790`; - - `hub_token` — строка «агент wiki» из `jira-hub tokens` (токен именно агента wiki, не jira и не клиентский); + - `hub_token` — строка «агент wiki» из `sdlc-hub tokens` (токен именно агента wiki, не jira и не клиентский); - `eva.base_url` — адрес Eva **только origin**: схема, хост и порт, без пути и без `/` в конце, например `https://eva.example.ru`. Агент сам добавляет к нему `/api/` (JSON-RPC), `/files/…` (вложения) и `/project/Document/<код>` (ссылка на страницу); «свой» адрес вложения сравнивается с ним же, поэтому путь в @@ -69,7 +69,7 @@ launchctl unload ~/Library/LaunchAgents/ru.aepif.eva-agent.plist Из основного checkout репозитория (не из worktree), при поднятой версии `AGENT_VERSION` в `src/agent.py`: - uv run --project ../jira-hub jira-hub agent publish --module wiki src/agent.py + uv run --project ../sdlc-hub sdlc-hub agent publish --module wiki src/agent.py Агент подтянет её сам (`auto_update`); настройку хаба `wiki_min_agent_version` (не `min_agent_version` — та у агента jira) поднимать после того, как `agent_status` покажет новую версию агента wiki. @@ -79,6 +79,6 @@ jira) поднимать после того, как `agent_status` покаже Настройки — `src/agent.example.json`. Тесты: `/usr/bin/python3 -W error::ResourceWarning -m unittest discover -s tests -t .` Сквозной прогон с настоящим хабом и фейковой Eva: `bash scripts/e2e-hub.sh` (печатает «e2e: ok», ~1 мин). Хаб берётся из -`../../../jira-hub/.wt/wiki` (переменная `HUB_SRC`), запускается на свободном порту с временным `JIRA_HUB_HOME`; +основного checkout `sdlc-hub` workspace (переменная `HUB_SRC`), запускается на свободном порту с временным `SDLC_HUB_HOME`; живой хаб не затрагивается. Проверяет: проект с `wiki_root`, `wiki_sync` на 5 страниц, Markdown со ссылкой `attachment:`, `wiki_fetch` вложения и его содержимое. diff --git a/scripts/e2e-hub.sh b/scripts/e2e-hub.sh index 2fae2f3..bf17c92 100755 --- a/scripts/e2e-hub.sh +++ b/scripts/e2e-hub.sh @@ -1,17 +1,19 @@ #!/usr/bin/env bash # Сквозной прогон eva-agent с настоящим хабом (модуль wiki) и фейковой Eva. Печатает «e2e: ok». -# Хаб — ТОЛЬКО из worktree jira-hub/.wt/wiki, ТОЛЬКО с временным JIRA_HUB_HOME и портом не 8790; живой хаб не трогаем. +# Хаб — код из HUB_SRC (по умолчанию основной checkout sdlc-hub workspace), ТОЛЬКО с временным SDLC_HUB_HOME и портом +# не 8790; живой хаб и его данные не трогаем. set -euo pipefail HERE="$(cd "$(dirname "$0")/.." && pwd)" -HUB_SRC="${HUB_SRC:-$HERE/../../../jira-hub/.wt/wiki}" +BRIDGE="$(cd "$(git -C "$HERE" rev-parse --path-format=absolute --git-common-dir)/../.." && pwd)" # workspace jira-bridge (из worktree тоже) +HUB_SRC="${HUB_SRC:-$BRIDGE/sdlc-hub}" HUB_SRC="$(cd "$HUB_SRC" && pwd)" PORT="${E2E_PORT:-$(/usr/bin/python3 -c 'import socket; s = socket.socket(); s.bind(("127.0.0.1", 0)); print(s.getsockname()[1]); s.close()')}" [ "$PORT" != "8790" ] || { echo "e2e: порт 8790 занят живым хабом" >&2; exit 2; } TMP="$(mktemp -d)" -export JIRA_HUB_HOME="$TMP/hub-home" -mkdir -p "$JIRA_HUB_HOME" +export SDLC_HUB_HOME="$TMP/hub-home" +mkdir -p "$SDLC_HUB_HOME" PIDS=() stop_tree() { # остановить процесс и его детей (uv run запускает хаб дочерним процессом) local p="$1" c @@ -32,7 +34,7 @@ cleanup() { } trap cleanup EXIT INT TERM -hub() { uv run --project "$HUB_SRC" --no-sync jira-hub "$@"; } +hub() { uv run --project "$HUB_SRC" --no-sync sdlc-hub "$@"; } fail() { echo "e2e: ОШИБКА — $*" >&2; echo "--- лог хаба ---" >&2; tail -n 30 "$TMP/hub.log" >&2 || true; exit 1; } jget() { /usr/bin/python3 -c 'import json,sys; d=json.load(sys.stdin) for k in sys.argv[1].split("."): diff --git a/src/agent.example.json b/src/agent.example.json index 2457a8c..82bcc98 100644 --- a/src/agent.example.json +++ b/src/agent.example.json @@ -1,6 +1,6 @@ { "hub_url": "folder:/путь/к/общей/папке/jira-bridge", - "hub_token": "токен агента wiki из `jira-hub tokens`", + "hub_token": "токен агента wiki из `sdlc-hub tokens`", "eva": { "base_url": "https://eva.example.ru", "token": "токен Eva (Bearer)"