Jira Widgets
Фоновый сервис + виджеты Jira: «Задачи» (канбан «Сегодня» + бэклог, локальная доска в sqlite по пользователю) и «Ворклоги» (календарь). Читает Jira REST API по PAT.
Фоновый сервис
Пакет запускается платформой как долгоживущий процесс. Отдельные навыки в каталоге чата он не регистрирует, зато отдаёт виджеты и HTTP-интерфейс.
Виджеты · 2
- Задачи
/Добавляется на доску виджетов и в панель виджетов EVA Desktop.
- Ворклоги
/logsДобавляется на доску виджетов и в панель виджетов EVA Desktop.
Настройки пакета · 5
Подключение
- URL Jira
jira_urlобязательнообщееБазовый URL Jira Server/DC, напр. https://jira.example.com
- Проверять TLS-сертификат
jira_verify_tlsобщееОтключите только для самоподписанного сертификата.
Учётные данные
- Personal Access Token
jira_patобязательносекретна пользователяЛичный PAT Jira (Profile → Personal Access Tokens). Передаётся как Authorization: Bearer. В фоне не виден: попадает только в запросы этого пользователя.
Отображение
- Часовой пояс
timezoneобщееIANA-пояс для расчёта дат, напр. Europe/Moscow.
- Максимум задач за запрос
jira_max_resultsобщее
Зависит от SDK
README
# Jira Widgets
Фоновый сервис + виджеты Jira (Server/DC) через REST API. Чтение из Jira + локальная
доска задач в sqlite (`ctx.db`) с привязкой к пользователю.
## Виджеты
- **Задачи** (`path=/`): две вкладки:
- **Сегодня**: канбан из трёх колонок (К работе / В работе / Готово) по локальному
плану: drag&drop и кнопки ‹/›, «убрать» из плана, счётчик и мягкий лимит «в работе»
(WIP=2), прогресс плана к дневной норме 8 ч.
- **Бэклог**: мои открытые задачи Jira (`assignee = currentUser() AND
statusCategory != Done`) с поиском, фильтром по проекту, сменой статуса и переключателем
«+ сегодня». Задача берётся из бэклога в локальный план, двигается по канбану и
убирается из плана, оставаясь в бэклоге.
- **Ворклоги** (`path=/logs`): календарь worklog-ов текущего пользователя
(недели × дни) с переходом по неделям.
## Локальное хранилище (sqlite)
`ctx.db` доступен в фоновом сервисе с виджетами. API асинхронный:
`await db.exec(sql)`, `await db.run(sql, ...params)` → `{ rowsAffected }`,
`await db.get(sql, ...params)` → строка, `await db.all(sql, ...params)` → массив.
Таблица `board_tasks`, PK `(user_id, issue_key)`, где `user_id`: id/login пользователя
запроса. Хранится только состояние доски (`status`, `in_today`, `position`) и кэш
метаданных; свежие поля задачи приходят из Jira при чтении. Нет БД: виджет работает
только на данных Jira (без плана).
## Учётные данные
Личный PAT приходит **в HTTP-обработчики** после авторизации (`req.ctx.settings` /
`getContext().settings`); в `main(ctx)` доступны только global-ключи.
| значение | ключ и scope | как читается |
|---|---|---|
| PAT | `jira_pat`, scope `user`, `format: password` | `req.ctx.settings.jira_pat` |
| URL | `jira_url`, `global` (default `https://jira.example.com`) | корневой `ctx.settings` в `main` |
| прочее | `jira_verify_tls`, `jira_max_results`, `timezone`: `global` | корневой `ctx.settings` |
PAT передаётся заголовком `Authorization: Bearer <token>`. Токен нигде не логируется
и в ответах API не возвращается.
## HTTP API
Корень пакета: `/internal/bg-service/jira-widgets/`.
| метод | путь | описание |
|---|---|---|
| GET | `/api/health` | конфиг без секретов, пользователь, полнота настроек |
| GET | `/api/me` | кто пользователь и хватает ли PAT |
| GET | `/api/diagnose` | serverInfo + myself + пробный JQL |
| GET | `/api/tasks?max=&jql=` | мои открытые задачи Jira + локальное состояние доски |
| GET | `/api/board` | локальная доска текущего пользователя |
| POST | `/api/board` | добавить в план: `{ key, status?, in_today? }` |
| PATCH | `/api/board` | сменить статус/«сегодня»: `{ key, status?, in_today?, position? }` |
| DELETE | `/api/board?key=KEY-1` | убрать задачу из локальной доски |
| GET | `/api/logs?start=YYYY-MM-DD&end=&tz=` | worklog-и за период |
| GET | `/api/search?jql=&max=` | произвольный JQL |
Ошибки: `401 need_settings` (нет PAT) · `502` + `error.code`
(`unauthorized` | `forbidden` | `timeout` | `dns` | `tls` | `jira_error`).
## Настройки
| ключ | scope | назначение |
|---|---|---|
| `jira_url` | global | базовый URL Jira |
| `jira_pat` | user | Personal Access Token (Bearer) |
| `jira_verify_tls` | global | проверка TLS-сертификата |
| `jira_max_results` | global | лимит задач за запрос (1-1000) |
| `timezone` | global | IANA-пояс для дат |Как подключить
Администратор загружает пакет в разделе Админ → Пакеты или публикует его из Студии. После публикации пакет появляется у пользователей: навыки в каталоге Навыки, а виджеты фоновых сервисов на доске виджетов. Настройки с меткой «общее» задаёт администратор, с меткой «на пользователя» каждый пользователь заполняет у себя.
Подробнее о жизненном цикле пакета: Студия: публикация и версии. Весь каталог: Пакеты EVA.