14 KiB
14 KiB
Context
main bb54d0a: схема v7, модули jira и wiki, агенты jira v14 и wiki v1. Имя jira-hub живёт в:
- коде: пакет
src/jira_hub/(≈30 файлов импортируютjira_hub),pyproject.toml(дистрибутив и скриптjira-hub),core/paths.py(JIRA_HUB_HOME,~/.local/share/jira-hub),core/cli.py(prog, модуль MCP по умолчаниюjira),core/mcp.py(mcp_json: серверыjira-hub/jira-hub-<модуль>),FastMCP("jira-hub")иFastMCP("jira-hub-wiki"), подсказки «jira-hub serve»,api.py(текст «make web в каталоге jira-hub», строка запуска); - тестах:
JIRA_HUB_HOMEв фикстурах, эталонtests/fixtures/baseline/mcp_wiki_tools.expected.json, проверки имён серверов и фрагментов.mcp.json, путиsrc/jira_hubвtest_layout,test_registry,test_web_app,test_wiki_projects; - вебе:
<title>Хаб Jira</title>, бренд вshell/Sidebar.tsx, ключиjira-hub-token|sidebar|legend,JIRA_HUB_URLвvite.config.ts,web/scripts/test-hub.sh,package.json(jira-hub-web), подсказка входа; - документации: README (launchd, MCP, выкатка), CLAUDE.md, ARCHITECTURE.md, Makefile,
openspec/specs/(18 требований в 7 спеках); - проектах-потребителях (не git):
awp-ca—.mcp.json,enabledMcpjsonServersв.claude/settings.local.json,CLAUDE.md, скиллbuilding-customer-error-report(mcp__jira-hub__*);stocks_drrk—.mcp.json,enabledMcpjsonServers; - живой установке: launchd
ru.aepif.jira-hub(uv run --project …/jira-bridge/jira-hub jira-hub serve, лог~/Library/Logs/jira-hub.log), данные~/.local/share/jira-hub/,.mcp.jsonв~/projects/awp-caи~/projects/stocks_drrk(серверыjira-hub,jira-hub-wiki), user scope MCPjira-hub, репозиторий Giteaaep/jira-hub, checkout~/projects/jira-bridge/jira-hubс worktree в.wt/; - соседях: jira-agent и eva-agent упоминают
jira-hubтолько в документации,agent.example.jsonи e2e-скрипте eva-agent (JIRA_HUB_HOME,jira-hubCLI). Протокол агента имени хаба не содержит: агенты ходят через общую папку.
Goals / Non-Goals
Goals: одно имя sdlc-hub в коде, CLI, данных, MCP, вебе и документации; живой хаб переключается одним скриптом
владельца с сухим прогоном; новый код не может молча работать с пустым каталогом данных рядом с живым.
Non-Goals и Anti-Goals: см. proposal.md.
Decisions
- Имя —
sdlc-hub(решение владельца 23.10.2026). Бренд в вебе — «SDLC Hub». - Псевдонима
jira-hubнет. Старые записи MCP и launchd после переключения должны падать явно, а не работать «почти». Переключение делает скрипт сразу для всех известных потребителей. - MCP-серверы
sdlc-<модуль>, модуль вsdlc-hub mcpобязателен. Модуль по умолчанию был нужен только ради неизменных записей.mcp.jsonв hub-modules; при переименовании записи меняются всё равно. Имена инструментов в Claude станутmcp__sdlc-jira__*иmcp__sdlc-wiki__*. - Каталог данных не переносится кодом. Хаб, MCP-серверы открытых сессий Claude и CLI открывают одну базу; перенос «на лету» при старте любого из них рискует WAL и гонкой. Код только отказывает с подсказкой (требование «Каталог данных прежнего имени»), перенос — шаг скрипта при остановленном хабе.
- Скрипт переключения в репозитории (
scripts/cutover.sh— обёртка надscripts/cutover.pyна stdlib, вне пакета хаба), сухой прогон по умолчанию. Шагов много, они касаются launchd, двух чужих репозиториев и user scope Claude; руками их легко сделать не в том порядке (I-2 wiki-module). Скрипт одноразовый, после переключения остаётся в истории как образец; тесты — на сухой прогон и проверки шага 1 (во временномHOME), без launchd. - Переименование репозитория в Gitea — руками владельца в интерфейсе (Settings → Repository name). Gitea оставляет
перенаправление со старого адреса;
teaиoriginпосле этого работают по новому адресу. Скрипт проверяет, что переименование сделано, и меняетorigin. - Checkout переезжает в
jira-bridge/sdlc-hub, workspacejira-bridgeостаётся: от его пути зависят каталог памяти Claude, workspaceCLAUDE.md, путь общей папки реле (…/utm/rshb/jira-bridge) и настройки агентов на виртуалке. Переименование workspace — отдельно, если понадобится. - Ключи
localStorage— с разовым переносом изjira-hub-*: браузер владельца не должен снова просить токен и терять свёрнутость панели и легенды. Ключи доскиgraph-*имени хаба не содержат и не меняются. - История не переписывается:
docs/superpowers/plans/,openspec/changes/archive/остаются со старыми именами. РазделPurposeспекhub-api,mcp,web-app(дельтами не меняется) правится в PR архива. - Агенты без релиза.
src/agent.pyиsrc/run.pyjira-agent и eva-agent не трогаются (строки документации — со следующим релизом); README, CLAUDE.md, ARCHITECTURE.md,agent.example.jsonиscripts/e2e-hub.sheva-agent — мелкими PR в своих репозиториях (bounded, без change). - Порядок с #98 (веб под модули). Переименование сливается первым; ветка #98 перебазируется на него. Бренд и ключи хранилища меняет этот change, устройство боковой панели — #98.
Переключение (для владельца)
- Слить PR этого change; переименовать репозиторий в Gitea
aep/jira-hub→aep/sdlc-hub. - Закрыть или не трогать сессии Claude с MCP хаба (после переключения —
/mcpreconnect). git -C ~/projects/jira-bridge/jira-hub pull --ff-onlyи сразуbash ~/projects/jira-bridge/jira-hub/scripts/cutover.sh— сухой прогон, проверить вывод. Между pull и переключением работающий хаб живёт на загруженном коде, а новые сессии Claude не поднимут MCP — окно в несколько минут.bash ~/projects/jira-bridge/jira-hub/scripts/cutover.sh --apply.- Просмотреть правки в awp-ca и stocks_drrk (
.mcp.json,.claude/,CLAUDE.mdawp-ca; копии*.pre-sdlcрядом) и удалить копии. Это не git-репозитории — коммитить нечего. - Проверить:
agent_statusчерезsdlc-jira,statusчерезsdlc-wiki, вебhttp://127.0.0.1:8790/app/без повторного входа.
Откат: остановить ru.aepif.sdlc-hub, перенести каталоги обратно, вернуть plist ru.aepif.jira-hub из README
предыдущей версии, git checkout прежнего коммита, вернуть записи MCP — порядок в README.
Risks / Trade-offs
- Сессии Claude с открытым MCP держат старый путь к пакету: после переноса checkout их серверы падают до reconnect. Принято: переключение — разовое событие владельца.
- codegraph-индексы в
.codegraph/checkout и worktree содержат абсолютные пути: после переноса —codegraph initзаново (шаг в сводке скрипта). - Гонка с #98: массовый перенос
src/jira_hub→src/sdlc_hubконфликтует с любой веткой, трогающей Python; #98 — толькоweb/, поэтому конфликт ограничен брендом и ключами хранилища (решение 11).
Decisions made without discussion
Владелец 24.10.2026 ответил «делай» на вопросы brainstorming — все решения ниже приняты агентом.
| # | Дата | Решение | Обоснование | Цена ошибки |
|---|---|---|---|---|
| 1 | 24.10.2026 | Бренд «SDLC Hub» | имя из решения владельца, латиница как в имени репозитория | правка строки в вебе |
| 2 | 24.10.2026 | Без псевдонима jira-hub |
явный отказ лучше тихой работы старых записей | вернуть точку входа в pyproject.toml |
| 3 | 24.10.2026 | MCP sdlc-jira/sdlc-wiki, модуль обязателен |
симметрия модулей, ядро без «jira по умолчанию» | переименовать серверы ещё раз во всех .mcp.json |
| 4 | 24.10.2026 | Каталог данных переносит скрипт, код только отказывает | гонка открытых баз при переносе на лету | ручной mv при остановленном хабе |
| 5 | 24.10.2026 | Скрипт scripts/cutover.sh с сухим прогоном |
много шагов в чужих конфигурациях, порядок важен | шаги руками по README |
| 6 | 24.10.2026 | Gitea переименовывает владелец | действие на сервере, вне репозитория | — |
| 7 | 24.10.2026 | Workspace jira-bridge не переименовывается |
от пути зависят память Claude, реле, агенты | отдельный change позже |
| 8 | 24.10.2026 | Перенос ключей localStorage |
не просить токен заново | повторный вход в веб |
| 9 | 24.10.2026 | История (планы, архив) не меняется | это запись прошлого | — |
| 10 | 24.10.2026 | Агенты без релиза, документация — мелкими PR | протокол не меняется | строки документации в agent.py со старым именем до следующего релиза |
| 11 | 24.10.2026 | Сначала переименование, потом #98 | #98 перебазируется на новые пути | перебазирование веток |
| 12 | 24.10.2026 | R-1: трейлер коммитов Co-Authored-By: Claude Sonnet 5.5 вместо Opus 5.5 из плана |
указание системы сессии новее плана | правка трейлера |
| 13 | 24.10.2026 | R-2: правки web/playwright.config.ts, web/scripts/seed-hub.py и JIRA_HUB_URL→SDLC_HUB_URL (vite.config.ts) сделаны уже в Task 1 | без них e2e, test-hub.sh и seed-скрипт ломаются между задачами | откат трёх файлов |
| 14 | 24.10.2026 | R-3: autouse-фикстура _isolated_home в tests/conftest.py подменяет HOME временным каталогом |
реальный ~/.local/share/jira-hub на машине владельца иначе влиял бы на набор тестов | удаление фикстуры |
| 15 | 24.10.2026 | R-4: ключи commentsPref → sdlc-hub-comments-hidden (localStorage, с миграцией через readMigrated) и IssueFilters → sdlc-hub-issue-filters (sessionStorage, без миграции) |
остатки jira-hub- в вебе нарушали проверку «только legacyStorage»; настройка комментариев переживает сессии, фильтры живут в рамках вкладки |
однократный сброс настройки/фильтров, откат двух ключей |
| 16 | 24.10.2026 | R-5: комментарий в RefreshProvider.tsx «jira-hub#20» → «hub#20» |
это номер issue, а не имя пакета | правка комментария |