Агент v14: список вложений в refresh, команда fetch_attachment (#43) #44

Merged
aep merged 8 commits from feat/43-attachment-fetch into main 2026-10-22 15:05:58 +03:00
Owner

Closes #43. Хаб и спека — aep/jira-hub#83 (change attachment-fetch в jira-hub).

Что сделано (агент v14)

  • Список вложений в refresh: поле attachment в search, у задачи attachments (id, filename, size, mime_type, author, created) без содержимого.
  • Команда fetch_attachment: читает вложение у задачи, качает содержимое с <base_url>/secure/attachment/<id>/<имя> (предел 10 МБ, при неизвестном размере чтение обрывается), отдаёт хабу POST /agent/files; в Jira не пишет; содержимое не попадает в журнал и лог.
  • Перенаправления: все запросы агента (Jira и хаб) идут за 3xx только на свой адрес; на чужой хост — отказ, Authorization туда не уходит.
  • Оборванный ответ при неизвестном размере — обрыв связи с повтором, а не «целый» файл.
  • README и ARCHITECTURE.md — v14.

План — docs/superpowers/plans/2026-10-22-attachment-fetch-agent.md; решения агента — openspec/changes/agent-v14-attachment-fetch/design.md.

Проверка

/usr/bin/python3 -W error::ResourceWarning -m unittest discover -s tests -t . — 329 тестов OK (Python 3.9.6). Финальное ревью (opus): Critical/Important нет; M-1, M-4, M-6 подняты по эффекту и исправлены (3a5bd9a).

Rulings I made

  • R-50: вложение без filename отбрасывается с логом, как без id (хаб требует непустое имя). Цена: такое вложение не видно в мосту.
  • R-51: size не целое / отрицательное / bool → null. Цена: нет.
  • R-52: HubClient.upload_file вместо put_file из плана. Цена: нет.
  • R-53: тесты upload_file через папку — в tests/test_folder.py. Цена: нет.
  • R-54: запрет перенаправлений на чужой адрес — для всех запросов агента, не только скачивания (design хаба #6). Цена: если Jira банка штатно перенаправляет API на другой хост — вызовы падают с понятной ошибкой.
  • R-55: обрыв тела при неизвестном размере — ConnectionError (повтор). Цена: нет.

Deferred (в follow-up при закрытии)

M-2 (Location с нечисловым портом — ValueError наружу), M-3 (перенаправление на свой хост считается одним вызовом), M-5 (308 и цикл перенаправлений — непонятная ошибка), M-7 (нет сквозного теста журнала для fetch_attachment), M-8 (отрицательный size в do_fetch_attachment, текст «не целиком» при len > size, неиспользуемая ветка _fmt_size(None)).

Выкатка

После merge — uv run --project ../jira-hub jira-hub agent publish src/agent.py; min_agent_version не поднимать (хаб сам отвечает 409 агенту ниже v14).

🤖 Generated with Claude Code

Closes #43. Хаб и спека — aep/jira-hub#83 (change `attachment-fetch` в jira-hub). ## Что сделано (агент v14) - **Список вложений в `refresh`:** поле `attachment` в `search`, у задачи `attachments` (`id`, `filename`, `size`, `mime_type`, `author`, `created`) без содержимого. - **Команда `fetch_attachment`:** читает вложение у задачи, качает содержимое с `<base_url>/secure/attachment/<id>/<имя>` (предел 10 МБ, при неизвестном размере чтение обрывается), отдаёт хабу `POST /agent/files`; в Jira не пишет; содержимое не попадает в журнал и лог. - **Перенаправления:** все запросы агента (Jira и хаб) идут за 3xx только на свой адрес; на чужой хост — отказ, `Authorization` туда не уходит. - **Оборванный ответ** при неизвестном размере — обрыв связи с повтором, а не «целый» файл. - README и ARCHITECTURE.md — v14. План — `docs/superpowers/plans/2026-10-22-attachment-fetch-agent.md`; решения агента — `openspec/changes/agent-v14-attachment-fetch/design.md`. ## Проверка `/usr/bin/python3 -W error::ResourceWarning -m unittest discover -s tests -t .` — 329 тестов OK (Python 3.9.6). Финальное ревью (opus): Critical/Important нет; M-1, M-4, M-6 подняты по эффекту и исправлены (3a5bd9a). ## Rulings I made - R-50: вложение без `filename` отбрасывается с логом, как без `id` (хаб требует непустое имя). Цена: такое вложение не видно в мосту. - R-51: `size` не целое / отрицательное / `bool` → `null`. Цена: нет. - R-52: `HubClient.upload_file` вместо `put_file` из плана. Цена: нет. - R-53: тесты `upload_file` через папку — в `tests/test_folder.py`. Цена: нет. - R-54: запрет перенаправлений на чужой адрес — для всех запросов агента, не только скачивания (design хаба #6). Цена: если Jira банка штатно перенаправляет API на другой хост — вызовы падают с понятной ошибкой. - R-55: обрыв тела при неизвестном размере — `ConnectionError` (повтор). Цена: нет. ## Deferred (в follow-up при закрытии) M-2 (`Location` с нечисловым портом — `ValueError` наружу), M-3 (перенаправление на свой хост считается одним вызовом), M-5 (308 и цикл перенаправлений — непонятная ошибка), M-7 (нет сквозного теста журнала для `fetch_attachment`), M-8 (отрицательный `size` в `do_fetch_attachment`, текст «не целиком» при `len > size`, неиспользуемая ветка `_fmt_size(None)`). ## Выкатка После merge — `uv run --project ../jira-hub jira-hub agent publish src/agent.py`; `min_agent_version` не поднимать (хаб сам отвечает 409 агенту ниже v14). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 8 commits 2026-10-22 14:24:28 +03:00
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
По финальному ревью: M-1, M-4, M-6.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 78e4f02ba8 into main 2026-10-22 15:05:58 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: aep/jira-agent#44
No description provided.