From cacd808e8f754b98b2d205599b972d1296a09637 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Thu, 22 Oct 2026 12:35:21 +0400 Subject: [PATCH] =?UTF-8?q?=D0=90=D1=80=D1=85=D0=B8=D0=B2=20OpenSpec:=20we?= =?UTF-8?q?b-feed=20(#77)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- .../2026-10-22-web-feed}/.openspec.yaml | 0 .../2026-10-22-web-feed}/design.md | 0 .../2026-10-22-web-feed}/proposal.md | 0 .../specs/web-app/spec.md | 0 openspec/specs/web-app/spec.md | 57 ++++++++++++++++++- 5 files changed, 55 insertions(+), 2 deletions(-) rename openspec/changes/{web-feed => archive/2026-10-22-web-feed}/.openspec.yaml (100%) rename openspec/changes/{web-feed => archive/2026-10-22-web-feed}/design.md (100%) rename openspec/changes/{web-feed => archive/2026-10-22-web-feed}/proposal.md (100%) rename openspec/changes/{web-feed => archive/2026-10-22-web-feed}/specs/web-app/spec.md (100%) diff --git a/openspec/changes/web-feed/.openspec.yaml b/openspec/changes/archive/2026-10-22-web-feed/.openspec.yaml similarity index 100% rename from openspec/changes/web-feed/.openspec.yaml rename to openspec/changes/archive/2026-10-22-web-feed/.openspec.yaml diff --git a/openspec/changes/web-feed/design.md b/openspec/changes/archive/2026-10-22-web-feed/design.md similarity index 100% rename from openspec/changes/web-feed/design.md rename to openspec/changes/archive/2026-10-22-web-feed/design.md diff --git a/openspec/changes/web-feed/proposal.md b/openspec/changes/archive/2026-10-22-web-feed/proposal.md similarity index 100% rename from openspec/changes/web-feed/proposal.md rename to openspec/changes/archive/2026-10-22-web-feed/proposal.md diff --git a/openspec/changes/web-feed/specs/web-app/spec.md b/openspec/changes/archive/2026-10-22-web-feed/specs/web-app/spec.md similarity index 100% rename from openspec/changes/web-feed/specs/web-app/spec.md rename to openspec/changes/archive/2026-10-22-web-feed/specs/web-app/spec.md diff --git a/openspec/specs/web-app/spec.md b/openspec/specs/web-app/spec.md index 7ba2347..7732b98 100644 --- a/openspec/specs/web-app/spec.md +++ b/openspec/specs/web-app/spec.md @@ -37,11 +37,11 @@ SHALL очищать токен и показывать экран входа. ### Requirement: Оболочка и адреса Приложение SHALL открываться под префиксом `/app/` и иметь страницы `/app/board` (доска связей), `/app/issues` (список -задач) и `/app/issues/{key}` (карточка задачи — окно поверх страницы, требование «Карточка задачи»); `/app` и `/app/` SHALL вести на `/app/board`, неизвестный путь — +задач), `/app/feed` (лента изменений, требование «Лента изменений») и `/app/issues/{key}` (карточка задачи — окно поверх страницы, требование «Карточка задачи»); `/app` и `/app/` SHALL вести на `/app/board`, неизвестный путь — на страницу «не найдено» со ссылками на разделы. Боковая панель SHALL быть закреплена у левого края окна на всю его высоту и MUST NOT прокручиваться вместе со страницей; страница занимает остальную ширину. Сверху вниз панель SHALL содержать: название «Хаб Jira» и кнопку «Свернуть панель»; выпадающий список проектов («<метка> — <название>», текущий -отмечен, в конце «+ Новый проект…»; требование «Проект в приложении»); разделы «Доска связей» и «Задачи» — вертикальным +отмечен, в конце «+ Новый проект…»; требование «Проект в приложении»); разделы «Доска связей», «Задачи» и «Лента» — вертикальным списком ссылок со значками (текущий отмечен `aria-current="page"`); внизу — блок данных Jira с действием «Обновить из Jira» (требование «Обновление из Jira»), переключатель темы (требование «Тема») и меню с действием «Сменить токен». Свёрнутая панель SHALL быть узкой полосой с теми же действиями значками: «Развернуть панель», метка текущего проекта, @@ -56,6 +56,10 @@ Jira»; «Меню» открывает развёрнутую панель по - **WHEN** на доске в боковой панели выбран раздел «Задачи» - **THEN** адрес — `/app/issues` с текущим проектом, показан список задач; «назад» возвращает на доску +#### Scenario: Раздел «Лента» +- **WHEN** на доске в боковой панели выбран раздел «Лента» +- **THEN** адрес — `/app/feed` с текущим проектом, показана лента изменений за сегодня; раздел отмечен в панели + #### Scenario: Сменить токен - **WHEN** в меню боковой панели выбрано «Сменить токен» - **THEN** токен очищен, показан экран входа @@ -560,3 +564,52 @@ Semibold 14/20, заголовок страницы Bold 20/28. Страницы #### Scenario: Выбор темы сохраняется - **WHEN** в системе светлая тема, переключатель переведён в «тёмная», страница перезагружена - **THEN** приложение в тёмной теме, в `localStorage` `graph-theme` = `dark` + +### Requirement: Лента изменений +Страница `/app/feed?project=<метка>` SHALL показывать события журнала изменений своих задач текущего проекта за период +(`GET /changes` с `project`, `since`, `until`, `kinds`). Период SHALL выбираться переключателем «2 часа» / «Сегодня» / +«Вчера» / «7 дней» (по умолчанию «Сегодня»; границы — по местному времени браузера: «Сегодня» — с начала текущих суток +до сейчас, «Вчера» — с начала прошлых суток до начала текущих) и храниться в адресе (`period=2h|today|yesterday|7d`; +«Сегодня» в адрес не пишется). Виды событий SHALL выбираться флажками «Статусы», «Описание», «Сроки», «Комментарии», +«Прочие поля» (по умолчанию все, кроме «Прочие поля») и храниться в адресе (`kinds=` через запятую; набор по умолчанию в +адрес не пишется; в адресе нет ни одного известного вида — набор по умолчанию); снятые все флажки — сообщение «выберите +хотя бы один вид», запроса нет. + +События SHALL быть сгруппированы по задаче; задачи — по времени последнего события, новые сверху. У группы: ключ — +ссылка на карточку задачи (окно поверх ленты, требование «Карточка задачи»), тема и текущий статус; под ней события по +времени, новые сверху, каждое — время (`ЧЧ:ММ`, с датой `ДД.ММ`, если событие не в текущих сутках), автор и текст: +статус — «статус «было» → «стало»»; описание — «описание изменено»; срок, плановое начало и окончание — «срок ДД.ММ → +ДД.ММ» (дата по значению `from_value`/`to_value`, иначе строка журнала; пустое — «—»); комментарий — «комментарий:» и +первые 300 символов текста одной строкой с «…»; прочие поля — «<название поля>: «было» → «стало»» (значения до 80 +символов с «…»), где название — подпись из словаря приложения (исполнитель, спринт, метки, приоритет, тема, эпик, связь, +вложение, резолюция), иначе имя поля Jira. Подзаголовок страницы — число событий и границы периода. Событий нет — +сообщение «за период изменений нет»; `truncated` — сообщение «показаны последние N событий — выберите период короче». +Ошибка хаба — сообщение с кнопкой «Повторить». Ленту SHALL перечитывать завершение «Обновить из Jira» (вместе со списками +задач) и возврат на вкладку браузера. + +#### Scenario: Что закрылось за два часа +- **WHEN** открыта лента проекта AWPCA, выбран период «2 часа», сняты все флажки, кроме «Статусы» +- **THEN** адрес — `/app/feed?project=AWPCA&period=2h&kinds=status`; запрос `GET /changes?project=AWPCA&since=<сейчас − 2 ч>&kinds=status`; + задачи сгруппированы, у каждой — события «ЧЧ:ММ автор: статус «В работе» → «Готово»» + +#### Scenario: Карточка из ленты +- **WHEN** в ленте нажат ключ AURORA-9002 +- **THEN** поверх ленты открыто окно карточки AURORA-9002; закрытие окна возвращает ленту с тем же периодом + +#### Scenario: Пустой период +- **WHEN** за выбранный период событий нет +- **THEN** показано «за период изменений нет» + +#### Scenario: Вчера +- **WHEN** выбран период «Вчера», сейчас 22.10 14:05 местного времени +- **THEN** запрос с `since` = 21.10 00:00 и `until` = 22.10 00:00 местного времени + +### Requirement: История в карточке задачи +Карточка задачи SHALL показывать в основной колонке после комментариев блок «История (N)» — события `changes` из +`GET /issues/{key}` (все виды, новые сверху) в том же виде, что в ленте, всегда с датой. Видны 10 последних событий, +остальные — по кнопке «Показать все (N)»; без событий — подсказка «изменений нет»; ответ хаба без поля `changes` — +блока нет. + +#### Scenario: Карточка с историей +- **WHEN** открыта карточка задачи с 12 событиями журнала +- **THEN** блок «История (12)» показывает 10 последних событий и кнопку «Показать все (12)»; после нажатия — все 12 -- 2.47.2