---
name: ganttbang
description: Build or update a Gantt chart (roadmap, release plan, project timeline) from Jira, GitLab, wiki or any task list, and hand back an edit link and a view link. Use when someone asks for a Gantt, roadmap, timeline, release plan, "диаграмма Ганта", "дорожная карта", "план релиза", or wants such a chart refreshed from the tracker.
---

# GanttBang — Gantt-диаграммы для агентов

GanttBang превращает список задач в интерактивную Gantt-диаграмму и возвращает
две ссылки: **редактирование** (полный доступ) и **просмотр** (только чтение).
Данные шифруются локально в MCP-процессе `ganttbang-mcp`; сервер хранит только
шифротекст, а ключ находится в ссылке после `#`.

Инструменты (MCP-сервер `ganttbang`): `create_gantt`, `get_gantt`, `update_gantt`.
Если MCP недоступен, используйте CLI (см. в конце).

## Порядок работы

1. **Уточните рамки**, если они неочевидны: какой проект/эпики/релиз, период, что
   считать вехами. Не задавайте вопросов, на которые можно ответить из данных.
2. **Соберите задачи** из источников (Jira, GitLab, вики) и сведите в план (ниже).
3. **Вызовите `create_gantt` одним вызовом** со всем планом. Если ответ
   `isError` — он перечисляет проблемы по `key`; исправьте именно их и повторите.
4. **Отдайте результат пользователю** (формат ответа ниже).
5. **Запомните edit-ссылку** (в памяти/заметках) — по ней потом обновлять план.

## Как переводить данные трекеров в план

| Источник | В плане |
|---|---|
| Jira Epic / GitLab Epic / раздел roadmap | задача-родитель: `type: "task"`, без дат (растянется по детям) |
| Story / Task / Bug / Issue / MR | задача с `parent: "<key эпика>"` |
| Sub-task | задача с `parent: "<key родителя>"` |
| fixVersion / Release / Milestone GitLab / дедлайн | `type: "milestone"`, `start` = дата релиза |
| Связь «blocks» / «is blocked by» / «depends on» | `after: ["<key блокирующей>"]` у зависимой задачи |
| Assignee / команда / компонент | `owner` |
| Ссылка на issue | `url` |

- **key** — всегда стабильный ключ источника (`PAY-123`, `gitlab#42`,
  `wiki:Roadmap-Q4`). По нему работают `parent`, `after` и повторная синхронизация.
- **Даты** (`YYYY-MM-DD`). Берите первое, что есть, отдельно для начала и конца:

  | | начало `start` | конец `end` |
  |---|---|---|
  | 1. план | Start date / Target start | Due date / Target end |
  | 2. спринт | начало спринта | конец спринта |
  | 3. история | когда задачу перевели в работу (первый переход в категорию In Progress из changelog; для задачи в работе годится `statuscategorychangedate`) | когда закрыли (`resolutiondate`) |
  | 4. для задачи в работе без срока | — | сегодня (полоса «до сих пор») |

  Changelog в Jira: `GET /rest/api/2/issue/<key>?expand=changelog` или
  `search` с `expand=changelog` по всей выборке одним запросом. Если есть только
  начало, конец = начало (однодневная полоса). Задача «не начата» без планового
  срока и спринта остаётся **без дат**: это честнее выдуманных сроков, не ставьте
  всем «сегодня» и не берите `created`: дата создания не про работу.
  Даты из истории — факт, а не план; напишите это в `description` диаграммы
  («сроки по датам работы из истории Jira»). Эпику даты не задавайте: он
  растянется по детям.
- **Статус**: категория статуса Jira To Do → `not_started`, In Progress →
  `in_progress`, Done → `completed`. **progress**: по подзадачам/оценкам, если
  есть; иначе не передавайте.
- **Приоритет**: Highest/Blocker → `critical`, High → `high`, Medium → `medium`,
  Low/Lowest → `low`.
- **Порядок** задач в массиве = порядок строк на диаграмме: эпик, затем его
  задачи по дате начала, затем следующий эпик. Вехи — в конце своего эпика или
  в самом конце.

## Размер и читаемость

- Хорошая диаграмма — до ~150 строк. **Посчитайте задачи до вызова.** Если
  больше 150, не отправляйте всё: оставьте эпики и задачи, у которых есть сроки
  или которые в работе, мелочь (саб-таски, баги, «не начатые» без сроков) не
  переносите. Или сузьте выборку (ближайший квартал, активные спринты, одна
  команда) и предложите детализировать отдельный эпик второй диаграммой.
  Диаграмма на 500 строк без дат бесполезна: таймлайн пустой, список не читается.
- Проверьте долю задач без дат. Если без сроков больше половины, скажите об
  этом в ответе прямо («у 430 из 504 задач нет сроков в Jira») и предложите, что
  заполнить, вместо того чтобы молча отдавать пустой таймлайн.
- `title` — конкретный: «Платежи: релиз 2.0 (Q4 2026)», не «Gantt».
- `description` — откуда данные: «Jira PAY, спринты 14–18, выгрузка 28.09».

## Ответ пользователю

Верните обе ссылки **целиком, включая часть после `#`** (без неё диаграмму не
открыть), и коротко — что внутри:

> Готово — «Платежи: релиз 2.0»: 24 задачи в 4 эпиках, 3 вехи, 18 зависимостей.
> ✏️ Редактирование (только для вас): https://gantt.codelab.vc/c/…#k=…&e=…
> 👁 Просмотр (для команды): https://gantt.codelab.vc/c/…#k=…
> Без сроков остались PAY-31, PAY-40 — уточните даты, и я обновлю план.

- Ссылку **редактирования** — только заказчику, в личном ответе. В общие каналы,
  тикеты, вики — **только ссылку просмотра**.
- Встроить в Confluence/вики: ссылка просмотра с `?embed=1` перед `#`
  (`…/c/<id>?embed=1#k=…`) в iframe — встроенная диаграмма только для чтения.

## Обновление и повторная синхронизация

- Точечно: `update_gantt` с edit-ссылкой и задачами, у которых меняются поля
  (передавайте только изменившиеся поля + `key`).
- Полная пересинхронизация из трекера: `update_gantt` с `mode: "replace"` и
  полным планом — задачи, которых больше нет в трекере, удалятся. Повтор с тем
  же планом ничего не меняет.
- Удалить задачи: `remove: ["PAY-7"]`.
- Перед ответом на вопросы о плане («что горит?», «что сдвинулось?») —
  `get_gantt` (markdown: разделы «Просрочено», «В работе», «Без дат»).
- Задачи, добавленные людьми вручную в интерфейсе, не имеют ключа трекера:
  в `get_gantt` у них `key` = внутренний id — используйте его как есть.

## Ошибки

- «ссылка только для просмотра» — нужна edit-ссылка (с `&e=`); попросите её.
- «в ссылке нет ключа / cut off» — ссылку обрезали по `#`; попросите полную.
- «не найдена» (404) — диаграмму удалили или ссылки перевыпустили.
- Ошибки проверки перечисляют `key` и поле — исправьте и повторите вызов.

## Без MCP: CLI

```bash
npx -y --package=https://gantt.codelab.vc/downloads/ganttbang-mcp.tgz ganttbang-mcp create plan.json
npx -y --package=https://gantt.codelab.vc/downloads/ganttbang-mcp.tgz ganttbang-mcp get "<ссылка>" --json
npx -y --package=https://gantt.codelab.vc/downloads/ganttbang-mcp.tgz ganttbang-mcp update "<edit-ссылка>" plan.json
```

`plan.json` — тот же объект, что аргументы `create_gantt`:

```json
{
  "title": "Платежи: релиз 2.0",
  "description": "Jira PAY, спринты 14–18",
  "tasks": [
    { "key": "PAY-1", "name": "Эпик: оплата картой" },
    { "key": "PAY-12", "parent": "PAY-1", "name": "API платежей",
      "start": "2026-10-01", "end": "2026-10-20", "status": "in_progress",
      "owner": "Core", "url": "https://jira.example.com/browse/PAY-12" },
    { "key": "PAY-13", "parent": "PAY-1", "name": "UI оплаты",
      "start": "2026-10-15", "end": "2026-11-05", "after": ["PAY-12"] },
    { "key": "v2.0", "type": "milestone", "name": "Релиз 2.0",
      "start": "2026-11-20", "after": ["PAY-13"] }
  ]
}
```

Никогда не пытайтесь шифровать или вызывать HTTP API GanttBang вручную —
шифрование делает только `ganttbang-mcp`.
