Архив OpenSpec: hub-modules (#87) #89

Merged
aep merged 2 commits from chore/87-archive-hub-modules into main 2026-10-23 22:42:51 +03:00
7 changed files with 43 additions and 5 deletions
Showing only changes of commit 29cd569157 - Show all commits

View File

@ -6,16 +6,26 @@ MCP-сервер хаба (`jira-hub mcp`, stdio) для Claude: инструм
## Requirements
### Requirement: Сервер и регистрация
`jira-hub mcp [--project <метка>]` SHALL запускать MCP-сервер по stdio (пакет `mcp`), ходящий в HTTP API хаба клиентским
токеном из настроек. Общая регистрация — в user scope Claude Code как `jira-hub` (`uv run --project <путь> jira-hub mcp`),
без проекта. Репозиторий проекта SHALL регистрировать `jira-hub` в своём `.mcp.json` (project scope) с
`--project <метка>`; эта запись перекрывает общую. Если хаб недоступен, каждый инструмент SHALL вернуть текст «хаб не
запущен: jira-hub serve», а не исключение.
`jira-hub mcp [<модуль>] [--project <метка>]` SHALL запускать MCP-сервер модуля хаба по stdio (пакет `mcp`), ходящий в
HTTP API хаба клиентским токеном из настроек. Модуль по умолчанию — `jira`: `jira-hub mcp [--project <метка>]` и
`jira-hub mcp jira [--project <метка>]` SHALL поднимать один и тот же сервер с именем `jira-hub` и одним и тем же набором
инструментов. Неизвестный модуль — код выхода 2 и список модулей в stderr, сервер не запускается. Общая регистрация — в
user scope Claude Code как `jira-hub` (`uv run --project <путь> jira-hub mcp`), без проекта. Репозиторий проекта SHALL
регистрировать `jira-hub` в своём `.mcp.json` (project scope) с `--project <метка>`; эта запись перекрывает общую. Если хаб
недоступен, каждый инструмент SHALL вернуть текст «хаб не запущен: jira-hub serve», а не исключение.
#### Scenario: Хаб выключен
- **WHEN** вызван `issues` при остановленном хабе
- **THEN** ответ инструмента — одна строка с подсказкой, сервер MCP продолжает работать
#### Scenario: Модуль по умолчанию
- **WHEN** запущены `jira-hub mcp --project AWPCA` и `jira-hub mcp jira --project AWPCA`
- **THEN** оба сервера называются `jira-hub`, список инструментов и их описания совпадают, сессия привязана к `AWPCA`
#### Scenario: Неизвестный модуль
- **WHEN** запущен `jira-hub mcp nope`
- **THEN** код выхода 2, в stderr — «неизвестный модуль nope» и список модулей (`jira`)
### Requirement: Инструменты
| Инструмент | Параметры | Результат |
|---|---|---|

View File

@ -0,0 +1,28 @@
# modules Specification
## Purpose
TBD - created by archiving change hub-modules. Update Purpose after archive.
## Requirements
### Requirement: Ядро и модули хаба
Хаб SHALL состоять из ядра и подключаемых модулей. Ядро SHALL владеть базой и миграциями, настройками хаба, проектами
(метка, название), хранилищем файлов, реле общей папки, релизом агента, очередью пакетов команд, HTTP-сервером с
авторизацией, раздачей веб-приложения и общим слоем MCP. Модуль SHALL подключаться к ядру описанием: таблицы, типы команд
и их обработчики в очереди, маршруты HTTP, ключи настроек, фоновые работы, инструменты MCP, подкоманды CLI. Первый модуль —
`jira` (зеркало задач, журнал изменений, вложения, команды Jira). Ядро MUST NOT импортировать модули, кроме списка
подключённых модулей и истории миграций схемы.
При старте хаб SHALL проверять, что типы команд, ключи настроек и маршруты (метод и шаблон адреса) ядра и модулей не
пересекаются; пересечение — ошибка старта с указанием конфликта.
Схема базы SHALL оставаться одной, с одной версией `setting.schema_version` на весь хаб; таблицы модуля входят в неё.
#### Scenario: Конфликт типов команд
- **WHEN** два подключённых модуля объявляют тип команды `refresh`
- **THEN** хаб не стартует, ошибка называет тип и оба модуля
#### Scenario: Поведение без изменений
- **WHEN** хаб после перестройки стартует на базе v6 с агентом v14
- **THEN** схема остаётся v6, копия базы не создаётся; адреса API, веба, ответы и инструменты MCP — прежние; агент берёт
команды и отчитывается как раньше