From 29cd569157b6059b05092c3020c93edcd2ca8f1e Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Fri, 23 Oct 2026 23:42:27 +0400 Subject: [PATCH 1/2] =?UTF-8?q?chore(openspec):=20=D0=B0=D1=80=D1=85=D0=B8?= =?UTF-8?q?=D0=B2=20hub-modules=20(#87)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../2026-10-23-hub-modules}/.openspec.yaml | 0 .../2026-10-23-hub-modules}/design.md | 0 .../2026-10-23-hub-modules}/proposal.md | 0 .../2026-10-23-hub-modules}/specs/mcp/spec.md | 0 .../specs/modules/spec.md | 0 openspec/specs/mcp/spec.md | 20 +++++++++---- openspec/specs/modules/spec.md | 28 +++++++++++++++++++ 7 files changed, 43 insertions(+), 5 deletions(-) rename openspec/changes/{hub-modules => archive/2026-10-23-hub-modules}/.openspec.yaml (100%) rename openspec/changes/{hub-modules => archive/2026-10-23-hub-modules}/design.md (100%) rename openspec/changes/{hub-modules => archive/2026-10-23-hub-modules}/proposal.md (100%) rename openspec/changes/{hub-modules => archive/2026-10-23-hub-modules}/specs/mcp/spec.md (100%) rename openspec/changes/{hub-modules => archive/2026-10-23-hub-modules}/specs/modules/spec.md (100%) create mode 100644 openspec/specs/modules/spec.md 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 — прежние; агент берёт + команды и отчитывается как раньше From 41a208da8040c61ba644b4230b8c9648388d6b67 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Fri, 23 Oct 2026 23:42:43 +0400 Subject: [PATCH 2/2] =?UTF-8?q?chore(openspec):=20Purpose=20=D1=81=D0=BF?= =?UTF-8?q?=D0=B5=D0=BA=D0=B8=20modules=20(#87)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- openspec/specs/modules/spec.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openspec/specs/modules/spec.md b/openspec/specs/modules/spec.md index b50aac6..0af7a48 100644 --- a/openspec/specs/modules/spec.md +++ b/openspec/specs/modules/spec.md @@ -1,7 +1,7 @@ # modules Specification ## Purpose -TBD - created by archiving change hub-modules. Update Purpose after archive. +Устройство хаба из ядра и подключаемых модулей (первый — `jira`): что принадлежит ядру, как модуль подключается описанием, проверка пересечений при старте и единая схема базы. ## Requirements