From 5c7a845a6e40952cdb9d112cb688ce572d7ecb91 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sun, 25 Oct 2026 19:59:22 +0400 Subject: [PATCH] =?UTF-8?q?openspec:=20change=20agile-web-polish=20?= =?UTF-8?q?=E2=80=94=20=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B8=20=C2=AB=D0=91=D1=8D=D0=BA=D0=BB=D0=BE=D0=B3=D0=B0=C2=BB?= =?UTF-8?q?=20=D0=B8=20=C2=AB=D0=A1=D0=BF=D1=80=D0=B8=D0=BD=D1=82=D0=B0?= =?UTF-8?q?=C2=BB=20(#112)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../changes/agile-web-polish/.openspec.yaml | 2 + openspec/changes/agile-web-polish/design.md | 123 +++++++++++++++++ openspec/changes/agile-web-polish/proposal.md | 38 +++++ .../agile-web-polish/specs/web-app/spec.md | 130 ++++++++++++++++++ 4 files changed, 293 insertions(+) create mode 100644 openspec/changes/agile-web-polish/.openspec.yaml create mode 100644 openspec/changes/agile-web-polish/design.md create mode 100644 openspec/changes/agile-web-polish/proposal.md create mode 100644 openspec/changes/agile-web-polish/specs/web-app/spec.md 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. **Свёртка секций «Бэклога».** Заголовок секции — `