diff --git a/openspec/changes/hub-modules/.openspec.yaml b/openspec/changes/archive/2026-10-23-hub-modules/.openspec.yaml similarity index 100% rename from openspec/changes/hub-modules/.openspec.yaml rename to openspec/changes/archive/2026-10-23-hub-modules/.openspec.yaml diff --git a/openspec/changes/hub-modules/design.md b/openspec/changes/archive/2026-10-23-hub-modules/design.md similarity index 100% rename from openspec/changes/hub-modules/design.md rename to openspec/changes/archive/2026-10-23-hub-modules/design.md diff --git a/openspec/changes/hub-modules/proposal.md b/openspec/changes/archive/2026-10-23-hub-modules/proposal.md similarity index 100% rename from openspec/changes/hub-modules/proposal.md rename to openspec/changes/archive/2026-10-23-hub-modules/proposal.md diff --git a/openspec/changes/hub-modules/specs/mcp/spec.md b/openspec/changes/archive/2026-10-23-hub-modules/specs/mcp/spec.md similarity index 100% rename from openspec/changes/hub-modules/specs/mcp/spec.md rename to openspec/changes/archive/2026-10-23-hub-modules/specs/mcp/spec.md diff --git a/openspec/changes/hub-modules/specs/modules/spec.md b/openspec/changes/archive/2026-10-23-hub-modules/specs/modules/spec.md similarity index 100% rename from openspec/changes/hub-modules/specs/modules/spec.md rename to openspec/changes/archive/2026-10-23-hub-modules/specs/modules/spec.md diff --git a/openspec/specs/mcp/spec.md b/openspec/specs/mcp/spec.md index 00b2d9b..d6e6bf7 100644 --- a/openspec/specs/mcp/spec.md +++ b/openspec/specs/mcp/spec.md @@ -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: Инструменты | Инструмент | Параметры | Результат | |---|---|---| diff --git a/openspec/specs/modules/spec.md b/openspec/specs/modules/spec.md new file mode 100644 index 0000000..b50aac6 --- /dev/null +++ b/openspec/specs/modules/spec.md @@ -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 — прежние; агент берёт + команды и отчитывается как раньше