6.6 KiB
6.6 KiB
MODIFIED Requirements
Requirement: Маршруты интерфейсов
Хаб SHALL предоставлять интерфейсам (MCP, позже просмотрщик) следующие маршруты под клиентским токеном:
GET /issuesс фильтрамиsprint,assignee,work_kind,fact_status,status,label,epic,neighbor,q(подстрока темы),hide_closed(1/true— без задач, чейstatusвходит в настройкуclosed_statuses; задача без статуса не закрыта),limit/offset— строки зеркала (все поляissue) сfact_statusиwork_kindиз заметок; сокращение до карточки — дело интерфейса.GET /issues/{key}— задача целиком: поля,epic_summary(тема эпика из зеркала илиnull), связи в обе стороны (links_out: [{target_key, link_type, summary, status}],links_in: [{source_key, link_type, summary, status}], гдеsummaryиstatus— связанной задачи из зеркала илиnull, если её там нет), заметки, последние 10 команд по ней,comments: [{comment_id, author, created, updated, body}]— все комментарии, новые сверху (поcreated, затемcomment_id, по убыванию).PUT /issues/{key}/note— заметки (частичное обновление,updated_byиз тела).POST /batches{title, author, commands: [...]}→{id, estimate_seconds}; 422 при неизвестном типе, неверных параметрах (в том числе неверного типа значения), временном ключе безensure_issue, двух и болееensure_issueс одинаковойsummary(сравнение после обрезки пробелов по краям; в ответе перечислены повторяющиеся темы), а также по проверкам постановки изcommands(типbugбез настройки, файл вложения не загружен).POST /files{content}(content— base64 содержимого файла) →{file, size}, гдеfile— sha256 содержимого (64 hex-символа, нижний регистр); см. «Хранилище файлов вложений».GET /batches?limit=,GET /batches/{id}(с командами),POST /batches/{id}/cancel— отменяетqueuedкоманды пакета; ответ — вид пакета с полемstill_claimed: список{id, type}команд пакета вclaimed(они будут выполнены агентом; остановить — отмена команды сforce).POST /commands/{id}/retry— новая команда с теми же параметрами в новом пакете «Повтор команды N».POST /commands/{id}/cancel— только дляqueued; дляclaimed— 409, если не переданforce: true.POST /refresh{keys | jql | full: true}→ пакет из одногоrefresh.GET /agent,GET /sync-runs?limit=,GET /settings,PUT /settings(частично; поднимаетsettings_version; ответ — все настройки после записи, как уGET /settings, включаяsettings_version).
Scenario: Фильтр по спринту
- WHEN
GET /issues?sprint=Спринт 2 - THEN только задачи с таким
sprint, отсортированы по сроку, затем по ключу
Scenario: Отмена взятой команды
- WHEN
POST /commands/15/cancelбезforce, командаclaimed - THEN 409 с
claimed_at; сforce: true—cancelled, следующий отчёт агента по ней принимается, статус не меняется
Scenario: Поздний отчёт по отменённому созданию
- WHEN
ensure_issue {temp_key: new:7, …}отменена сforce: true, затем агент прислалdoneсresult.key = AURORA-1620 - THEN команда
cancelled, вresult—AURORA-1620; заметкаnew:7перенесена наAURORA-1620
Scenario: Дубль темы в пакете
- WHEN
POST /batchesс двумяensure_issue, у обеихsummary = "Шахматка: комментарии" - THEN 422 с темой «Шахматка: комментарии», пакет не создан
Scenario: Тема не строка
- WHEN
POST /batchesсensure_issue {temp_key: new:1, summary: 42, …} - THEN 422 с указанием параметра
summary, пакет не создан
Scenario: Отмена пакета с командой у агента
- WHEN в пакете 9 команда 30
claimed, команды 31 и 32queued;POST /batches/9/cancel - THEN 31 и 32
cancelled; в ответеstill_claimed = [{id: 30, type: …}]; 30 остаётсяclaimed
Scenario: Ответ на запись настроек
- WHEN
PUT /settings {relay_dir: "/Volumes/externalSSD/utm/rshb/jira-bridge"} - THEN 200; ответ содержит
relay_dirс записанным значением, новуюsettings_versionи остальные настройки; токенов в ответе нет
Scenario: Карточка с комментариями и связями
- WHEN у AURORA-9001 два комментария (14.10 и 15.10), исходящая связь на AURORA-9002 («API свода», «Новая») и на AURORA-1, которой нет в зеркале; эпик AURORA-9100 «Тестовый эпик»
- THEN
GET /issues/AURORA-9001отдаётcommentsс комментарием от 15.10 первым, у связи на AURORA-9002 —summary = "API свода",status = "Новая", у связи на AURORA-1 —summary = null,status = null;epic_summary = "Тестовый эпик"
Scenario: Без закрытых
- WHEN
closed_statuses = ["Готово", "Снято"], в зеркале задачи в статусах «В работе», «Готово», «Снято» и без статуса;GET /issues?hide_closed=1 - THEN в ответе задачи «В работе» и без статуса; без
hide_closed— все четыре