Несколько проектов-меток в мосте (#61) #62

Merged
aep merged 16 commits from feat/61-projects into main 2026-10-19 22:03:57 +03:00
Owner

Closes #61. Спека — openspec/changes/projects/ (proposal, design — решения 1–15 и «Decisions made without discussion» 1–51, дельты 7 спек). План — docs/superpowers/plans/2026-10-19-projects-hub.md. Агентская часть — aep/jira-agent#36 (v12, слит и опубликован, agent_status: ok v11 → v12).

Что сделано

  • Проект — сущность хаба: таблица project (схема v4), GET/POST /projects; миграция v3→v4 заводит AWPCA «АРМ КА» с доской 4216, ключи base_jql/board_id в setting не удаляет.
  • Базовая JQL собирается из проектов: project = AURORA AND labels in ("AWPCA", …) — для автообновления, кнопки и refresh из MCP.
  • Разрез по проекту: GET /board?project=, GET /issues?project= (свои + соседи по связям + эпики своих).
  • Пакет проекта: метка проекта дописывается в ensure_issue сама, чужие метки и задачи вне проекта — 422; batch.project, GET /batches?project=, retry с project.
  • Доски в параметрах команд: ensure_sprint.board_id при постановке (канбан / без доски / тип неизвестен — 422), refresh.boards при выдаче, типы досок из результата агента.
  • MCP: jira-hub mcp --project <метка>; без привязки — только служебные инструменты; projects, project_create (с фрагментом .mcp.json).
  • Веб-приложение: выпадающий список проектов, «Новый проект», ?project= в адресе и память браузера; раскладка доски по проектам (AWPCA — прежние ключи); фильтр спринтов по своим задачам.

Проверка

make check: pytest 571 passed, vitest 340 passed, lint/tsc чисто; npm run e2e: 29 passed (5 новых в projects.spec.ts). Ревью каждой задачи — без critical/important; финальное ревью ветки (opus): I-1, I-2 — исправлены.

Rulings I made

  • R-1 — нумерация решений Task 10 продолжена после занятых 22–36 (design 37–48). Цена: нумерация.
  • R-2 (design #36) — сообщение «проекта P нет» без префикса «команда i» (ошибка пакетная). Цена: текст.
  • R-3 (design #27) — типы досок из refresh пишутся в любом статусе отчёта. Цена: тип доезжает на следующий удачный refresh.
  • R-4 — отдельная чистка по minor-находкам после Task 9. Цена: лишний коммит.
  • R-5 (design #49) — I-1: boards() отдаёт type = None, если тип неизвестен хотя бы у одного проекта с доской. Цена: лишний запрос типа агентом.
  • R-6 — I-2 вынесен владельцу; решение владельца (а): метки в JQL в кавычках, запрет \ и управляющих символов (1f2fc14).
  • R-7 (design #50, #51) — labels_add нормализуется до метки проекта; лёгкий SELECT в _assign_boards; пустой project в retry/POST /batches — 422. Цена: малая.
  • Решения исполнителей и спеки без обсуждения — design.md, «Decisions made without discussion» 1–51.

Находки

Исправлены: T2.1, T2.2, T3.1, T3.2, T5.1, T5.4, T6.1, T7.2, T8.1, T8.2, T8.4, T10.1–T10.7, I-1, I-2, T1.3, M-1…M-5. Отклонены: T2.4 (design #14), T6.3 (JSON даёт строки), T7.3 (спека, design #29), T8.6 (по плану), T9.3 (подпись коммитов по инструкции владельца). Полная таблица — ledger SDD.

Deferred

  • T1.1 — устаревший комментарий над MIGRATIONS, пустая строка перед _migrate_projects.
  • T1.2 — record_board_types принимает ключи "0", "-1".
  • T1.4 — нет теста на некорректный board_id в setting при миграции.
  • T1.5 — не сохранён RED-лог Task 1.
  • T2.3 — смена набора проектов во время refresh не сбрасывает neighbor (узкое окно).
  • T3.3 — нет теста author="" → api.
  • T4.1–T4.4 — два похожих SELECT в mirror.board; подмена neighbor в Python в list_issues; нет тестов разреза с hide_closed/epic/регистром; пустой project= без теста.
  • T5.2 — тяжело читаемое условие в queue.py.
  • T5.3 — нет тестов ensure_sprint/ensure_attachment в пакете проекта, ensure_link только по target, GET /batches?project=NOPE.
  • T6.2 — тексты 422 для досок сверяются подстрокой.
  • T7.1 — описание issues в MCP не упоминает ограничение проектом.
  • T8.3 — «+ Новый проект…» внутри нативного select открывается стрелками.
  • T8.5 — нет юнит-теста подхвата пакета viewer после создания проекта (покрыт e2e).
  • T9.1 — hasSprint = true, если спринт только у своего эпика.
  • T9.2 — набор ключей storage.ts как модульное состояние (design #46).
  • T9.4 / O-5 — строка jsdom в выводе vitest (была до ветки).
  • M-6 — у ProjectGate при ошибке загрузки нет «Повторить».
  • агент M-1 — ensure_sprint сравнивает текущий спринт по имени без учёта доски (aep/jira-agent#36).

Выкатка (design, решение 14; README «Выкатка проектов»)

  1. ✅ Агент v12 опубликован, agent_status — v12.
  2. Merge → git pull на Mac mini → make web → перезапуск хаба (владелец). Между pull и перезапуском не открывать новые сессии MCP.
  3. «Обновить из Jira», projects в MCP показывает у AWPCA scrum (до этого ensure_sprint AWPCA — 422 «тип доски ещё не известен»).
  4. min_agent_version = 12.
  5. В awp-ca — .mcp.json с --project AWPCA, /mcp → reconnect (без него сессии awp-ca не работают с задачами).

🤖 Generated with Claude Code

Closes #61. Спека — `openspec/changes/projects/` (proposal, design — решения 1–15 и «Decisions made without discussion» 1–51, дельты 7 спек). План — `docs/superpowers/plans/2026-10-19-projects-hub.md`. Агентская часть — aep/jira-agent#36 (v12, слит и опубликован, `agent_status`: ok v11 → v12). ## Что сделано - Проект — сущность хаба: таблица `project` (схема v4), `GET/POST /projects`; миграция v3→v4 заводит AWPCA «АРМ КА» с доской 4216, ключи `base_jql`/`board_id` в `setting` не удаляет. - Базовая JQL собирается из проектов: `project = AURORA AND labels in ("AWPCA", …)` — для автообновления, кнопки и `refresh` из MCP. - Разрез по проекту: `GET /board?project=`, `GET /issues?project=` (свои + соседи по связям + эпики своих). - Пакет проекта: метка проекта дописывается в `ensure_issue` сама, чужие метки и задачи вне проекта — 422; `batch.project`, `GET /batches?project=`, `retry` с `project`. - Доски в параметрах команд: `ensure_sprint.board_id` при постановке (канбан / без доски / тип неизвестен — 422), `refresh.boards` при выдаче, типы досок из результата агента. - MCP: `jira-hub mcp --project <метка>`; без привязки — только служебные инструменты; `projects`, `project_create` (с фрагментом `.mcp.json`). - Веб-приложение: выпадающий список проектов, «Новый проект», `?project=` в адресе и память браузера; раскладка доски по проектам (AWPCA — прежние ключи); фильтр спринтов по своим задачам. ## Проверка `make check`: pytest 571 passed, vitest 340 passed, lint/tsc чисто; `npm run e2e`: 29 passed (5 новых в `projects.spec.ts`). Ревью каждой задачи — без critical/important; финальное ревью ветки (opus): I-1, I-2 — исправлены. ## Rulings I made - R-1 — нумерация решений Task 10 продолжена после занятых 22–36 (design 37–48). Цена: нумерация. - R-2 (design #36) — сообщение «проекта P нет» без префикса «команда i» (ошибка пакетная). Цена: текст. - R-3 (design #27) — типы досок из `refresh` пишутся в любом статусе отчёта. Цена: тип доезжает на следующий удачный refresh. - R-4 — отдельная чистка по minor-находкам после Task 9. Цена: лишний коммит. - R-5 (design #49) — I-1: `boards()` отдаёт `type = None`, если тип неизвестен хотя бы у одного проекта с доской. Цена: лишний запрос типа агентом. - R-6 — I-2 вынесен владельцу; решение владельца (а): метки в JQL в кавычках, запрет `\` и управляющих символов (`1f2fc14`). - R-7 (design #50, #51) — `labels_add` нормализуется до метки проекта; лёгкий SELECT в `_assign_boards`; пустой `project` в `retry`/`POST /batches` — 422. Цена: малая. - Решения исполнителей и спеки без обсуждения — `design.md`, «Decisions made without discussion» 1–51. ## Находки Исправлены: T2.1, T2.2, T3.1, T3.2, T5.1, T5.4, T6.1, T7.2, T8.1, T8.2, T8.4, T10.1–T10.7, I-1, I-2, T1.3, M-1…M-5. Отклонены: T2.4 (design #14), T6.3 (JSON даёт строки), T7.3 (спека, design #29), T8.6 (по плану), T9.3 (подпись коммитов по инструкции владельца). Полная таблица — ledger SDD. ## Deferred - T1.1 — устаревший комментарий над `MIGRATIONS`, пустая строка перед `_migrate_projects`. - T1.2 — `record_board_types` принимает ключи `"0"`, `"-1"`. - T1.4 — нет теста на некорректный `board_id` в `setting` при миграции. - T1.5 — не сохранён RED-лог Task 1. - T2.3 — смена набора проектов во время `refresh` не сбрасывает `neighbor` (узкое окно). - T3.3 — нет теста `author=""` → `api`. - T4.1–T4.4 — два похожих SELECT в `mirror.board`; подмена `neighbor` в Python в `list_issues`; нет тестов разреза с `hide_closed`/`epic`/регистром; пустой `project=` без теста. - T5.2 — тяжело читаемое условие в `queue.py`. - T5.3 — нет тестов `ensure_sprint`/`ensure_attachment` в пакете проекта, `ensure_link` только по `target`, `GET /batches?project=NOPE`. - T6.2 — тексты 422 для досок сверяются подстрокой. - T7.1 — описание `issues` в MCP не упоминает ограничение проектом. - T8.3 — «+ Новый проект…» внутри нативного `select` открывается стрелками. - T8.5 — нет юнит-теста подхвата пакета `viewer` после создания проекта (покрыт e2e). - T9.1 — `hasSprint = true`, если спринт только у своего эпика. - T9.2 — набор ключей `storage.ts` как модульное состояние (design #46). - T9.4 / O-5 — строка jsdom в выводе vitest (была до ветки). - M-6 — у `ProjectGate` при ошибке загрузки нет «Повторить». - агент M-1 — `ensure_sprint` сравнивает текущий спринт по имени без учёта доски (aep/jira-agent#36). ## Выкатка (design, решение 14; README «Выкатка проектов») 1. ✅ Агент v12 опубликован, `agent_status` — v12. 2. Merge → `git pull` на Mac mini → `make web` → перезапуск хаба (владелец). Между pull и перезапуском не открывать новые сессии MCP. 3. «Обновить из Jira», `projects` в MCP показывает у AWPCA `scrum` (до этого `ensure_sprint` AWPCA — 422 «тип доски ещё не известен»). 4. `min_agent_version = 12`. 5. В `awp-ca` — `.mcp.json` с `--project AWPCA`, `/mcp` → reconnect (без него сессии awp-ca не работают с задачами). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 16 commits 2026-10-19 21:56:10 +03:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
R-3/T6.1 типы досок из результата refresh пишутся в любом статусе отчёта; T5.1, T3.1 (author), T3.2, T2.1, T2.2, T7.2,
T8.1, T8.2 (ошибка фонового рефетча проектов не сносит страницу), T8.4 (окно «Новый проект» не закрывается во время
создания). Решения 22, 27 переписаны, добавлено 36 в design.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
I-1: boards() отдаёт type=null, если тип неизвестен у любого проекта доски.
M-2: labels_add ensure_fields нормализуется к метке проекта. M-3: light_list
вместо list_projects в _assign_boards. M-4/T5.4: пустой project — 422.
M-1, M-5, T10.1-T10.7: README, ARCHITECTURE, CLAUDE.md, design.md (49-51), e2e.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 36266104a0 into main 2026-10-19 22:03:57 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: aep/sdlc-hub#62
No description provided.