diff --git a/openspec/changes/agile-web-polish/.openspec.yaml b/openspec/changes/agile-web-polish/.openspec.yaml new file mode 100644 index 0000000..7ccf7c3 --- /dev/null +++ b/openspec/changes/agile-web-polish/.openspec.yaml @@ -0,0 +1,2 @@ +schema: spec-driven +created: 2026-10-25 diff --git a/openspec/changes/agile-web-polish/design.md b/openspec/changes/agile-web-polish/design.md new file mode 100644 index 0000000..10ac145 --- /dev/null +++ b/openspec/changes/agile-web-polish/design.md @@ -0,0 +1,123 @@ +## Context + +После выкатки #108 (25.10.2026) владелец посмотрел «Бэклог», «Спринт» и «Kanban» на живой доске AWPCA (4216, три +спринта) и записал 10 замечаний в sdlc-hub#112. Владелец попросил не проводить brainstorming-вопросы и писать дизайн +по тексту issue, поэтому всё, что в issue не сказано прямо, — решения агента (раздел «Decisions made without +discussion»). + +Текущее состояние (`web/src/modules/jira/agile/`): `BacklogPage` рисует секции `Panel` без свёртки, эпики идут строками +наравне с задачами; `SprintPage` показывает один активный спринт, переключатель `Segmented` — только между активными; +`BoardColumns` — flex-ряд с `align-items:flex-start` и `overflow-x:auto`; `TypeIcon` знает три вида (эпик — +`IconBoard`, ошибка — `IconCritical` (молния), прочее — `IconCheck`). Фильтров нет. Все нужные данные уже приходят в +`GET /agile` (`AgileIssue`: `issue_type`, `assignee`, `epic_key`, `done`, `rank`, `status`) — сервер не меняется. + +## Goals / Non-Goals + +Цели — 10 пунктов #112 и попутно веб-маркеры из hub#111 (M-6, T10.3, T9.4, T12.2–T12.4). Не цели — правки Jira из +веба, изменения API/схемы/агента/MCP, настройки доски AWPCA в Jira, серверные пункты hub#111. + +## Decisions + +1. **Фильтры — на клиенте, чистой моделью.** Новый модуль `agile/filters.ts`: тип состояния страницы + (`q`, `assignee`, `epic`, `hideDone`, `collapsed`, `hiddenColumns`, `epicsPanel`), функция «видна ли задача» + (поиск по `key` и `summary` без учёта регистра; `assignee`: `""` — все, `"-"` — без исполнителя; `epic`: `""` — все, + `"-"` — без эпика, иначе `epic_key === epic`; `hideDone`), списки вариантов исполнителей и эпиков. Страницы и + компоненты только рисуют. Модель покрыта unit-тестами, страницы — тестами поведения. + +2. **Запоминание — один ключ `sdlc-hub-agile`.** JSON `{ "<метка>": { "backlog": {...}, "sprint": {...}, + "kanban": {...} } }`; хранится всё, кроме `q` и выбора спринтов. Чтение и запись — в `try/catch` (закрытое + хранилище, мусор, чужая форма — значения по умолчанию), как `sidebarPref`/`legendPref`. Миграция `jira-hub-` не нужна + — ключ новый. Свёрнутые секции — по id спринта и `"backlog"`; id закрытых/удалённых спринтов при чтении не мешают + (просто не совпадают). Скрытые колонки — по имени колонки (`"Без колонки"` — тоже имя). + +3. **Панель фильтров** — общий компонент `AgileToolbar` для трёх страниц, набор элементов — пропсами. Используются + готовые `SearchInput`, `Select`, `Checkbox`/`Button aria-pressed`, `Dropdown`/`Menu` из `web/src/ui`; новые элементы + UI-кита не вводятся, кроме значков (п. 7). Устаревшее значение исполнителя/эпика остаётся в списке (как + `withCurrent` у списка задач), чтобы пустой результат объяснялся видимым фильтром. + +4. **Свёртка секций «Бэклога».** Заголовок секции — `