Skip to content

feat: Ф1 поддержки Cloud — клиент чтения на REST API v2#55

Merged
YuriyEnshin merged 1 commit into
masterfrom
feat/cloud-phase1-read
Jul 2, 2026
Merged

feat: Ф1 поддержки Cloud — клиент чтения на REST API v2#55
YuriyEnshin merged 1 commit into
masterfrom
feat/cloud-phase1-read

Conversation

@YuriyEnshin

Copy link
Copy Markdown
Owner

Что сделано

Фаза 1 плана поддержки Confluence Cloud: Cloud-клиент на чтение. На Cloud теперь работают download update/download merge, compare (включая --detect-source), confluence_ping и confluence_get_page_content.

ConfluenceCloudApiClient (гибрид v2 + v1)

  • Страницы, дети, вложения, версии — через /wiki/api/v2 (v1 content API на Cloud удалён Atlassian в 2025).
  • CQL-поиск (FindPageByTitleAsync) и auth-ping (/user/current) — через v1-эндпоинты, сохранившиеся на Cloud (v2-эквивалентов нет).
  • Cursor-пагинация: из _links.next берётся только query string и применяется к собственному абсолютному URL — относительная база Atlassian не доверяется.
  • Дети: v2 отдаёт стабы без тел → bulk GET /pages?id=…&body-format=storage чанками по 100, порядок листинга сохраняется.
  • Числовые spaceId прозрачно транслируются в ключи пространств (кэш на время жизни клиента) — маркеры .id, конфиг и параметры инструментов остаются на ключах.
  • parentId из v2 отображается в Ancestors; заголовок родителя резолвится через кэш id→title (best-effort: недоступный родитель деградирует до пустого заголовка, не роняя запрос).
  • Ссылки скачивания вложений относительны /wiki — префиксуются корректно.
  • Базовый URL принимается в обеих формах: https://site.atlassian.net и …/wiki.

Read-only контракт

Операции записи (create/update страниц, вложения) бросают NotSupportedException с пояснением; в MCP это код NOT_SUPPORTED (добавлен в классификатор и в agent-instructions). Запись — фаза 2.

Сопутствующее

  • Общие хелперы ошибок/CQL вынесены в ConfluenceApiHelpers — оба клиента дают идентичные типизированные исключения (409 → ConfluenceConflictException и т.д.).
  • Фикс compare: ChildTypes == null (так отвечает Cloud v2) теперь означает «проверить вложения», а не «молча пропустить» — раньше вложения, добавленные только на сервере, ускользали бы из отчёта. Регрессионный тест добавлен; тестовые страницы Server-сценариев переведены на явный hasAttachments: false (точнее моделирует v1-ответ и сохраняет свойство «нет лишних вызовов» под strict-моками).

Тесты

457 зелёные (+30 новых: маппинг v2, кэши, cursor, префиксация ссылок, NOT_SUPPORTED, регрессия compare).

Ограничения (осознанные, до Ф4-проверки на живом Cloud)

  • Тело старой версии страницы (GET /pages/{id}?version=N&body-format=storage) реализовано по спецификации, но на живом Cloud не проверено — риск №1 плана, помечен в коде.
  • Порядок версий: sort=-modified-date (новые первыми, как в v1).

Часть плана: Ф0 ✅ → Ф1 (этот PR) → R2 запись страниц → R3 вложения → Ф4 e2e/канонизация.

🤖 Generated with Claude Code

- ConfluenceCloudApiClient за тем же IConfluenceApiClient: страницы, дети,
  вложения и версии через /wiki/api/v2; CQL-поиск и ping — через v1-эндпоинты,
  сохранившиеся на Cloud; cursor-пагинация (query из _links.next применяется
  к собственному абсолютному URL); дети — стабы + bulk GET /pages?id=…&
  body-format=storage с сохранением порядка
- числовые spaceId Cloud транслируются в ключи пространств (кэш на время
  процесса); parentId из v2 отображается в Ancestors, заголовок родителя
  резолвится через кэш id→title
- операции записи на Cloud бросают NotSupportedException → MCP-код NOT_SUPPORTED
- DI выбирает реализацию клиента по DeploymentType; общие хелперы ошибок и CQL
  вынесены в ConfluenceApiHelpers (используются обоими клиентами)
- compare: отсутствующий childTypes (Cloud) теперь означает «проверить
  вложения», а не «молча пропустить» (+ регрессионный тест)
- 457 тестов зелёные (+30 новых); CHANGELOG и README (RU+EN),
  agent-instructions: код NOT_SUPPORTED и режим Cloud read-only

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@YuriyEnshin
YuriyEnshin merged commit 79890b1 into master Jul 2, 2026
@YuriyEnshin
YuriyEnshin deleted the feat/cloud-phase1-read branch July 2, 2026 19:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant