feat(bot): клиент SourceCraft API #32

Merged
Eleboba merged 2 commits from feat/10-sourcecraft-client into dev 2026-10-15 18:52:05 +03:00
Owner

Что меняется

Клиент SourceCraft API для наблюдателя CI/CD: прогоны, статусы, логи кубов (постранично), sha коммита прогона, ретраи на нестабильное соединение. CLI для отладки.

Closes #10

Важно — ADR-014

У прогона в API нет sha коммита. Чтобы связать пуш с прогоном, CI tgit-uploads первым кубом check/meta печатает TGIT_COMMIT_SHA=…, клиент читает его лог. Шаблон обновлён и уже залит в tgit-uploads; проверено на живом прогоне.

Как проверить

make lint && make test
set -a; . ./.env; set +a; uv run python -m app.sourcecraft.cli runs

Нужно подтвердить

Ссылка на прогон в UI: открой https://sourcecraft.dev/rogachevegorushka/tgit-uploads/cicd/runs/1000002 — если это не страница прогона, пришли правильный адрес, поменяю шаблон.

Чек-лист

  • ветка от origin/dev
  • lint + тесты зелёные (порог покрытия поднят до 80)
  • секретов в диффе нет
  • лог в issue дописан

🤖 Generated with Claude Code

## Что меняется Клиент SourceCraft API для наблюдателя CI/CD: прогоны, статусы, логи кубов (постранично), sha коммита прогона, ретраи на нестабильное соединение. CLI для отладки. Closes #10 ## Важно — ADR-014 У прогона в API нет sha коммита. Чтобы связать пуш с прогоном, CI `tgit-uploads` первым кубом `check/meta` печатает `TGIT_COMMIT_SHA=…`, клиент читает его лог. Шаблон обновлён и уже залит в `tgit-uploads`; проверено на живом прогоне. ## Как проверить ```bash make lint && make test set -a; . ./.env; set +a; uv run python -m app.sourcecraft.cli runs ``` ## Нужно подтвердить Ссылка на прогон в UI: открой `https://sourcecraft.dev/rogachevegorushka/tgit-uploads/cicd/runs/1000002` — если это не страница прогона, пришли правильный адрес, поменяю шаблон. ## Чек-лист - [x] ветка от origin/dev - [x] lint + тесты зелёные (порог покрытия поднят до 80) - [x] секретов в диффе нет - [x] лог в issue дописан 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Eleboba added 2 commits 2026-10-15 18:46:20 +03:00
- app/db/models.py: 13 таблиц (ARCHITECTURE §2.10); перечисления — VARCHAR + CHECK,
  JSON → JSONB на Postgres, BIGINT/INTEGER-ключи для SQLite
- миграция 0001 (автогенерация + ручная чистка: импорт sa.Text, дубли CHECK)
- миграции применяются при старте бота программно (app.db.migrate), script_location из пакета
- SqlStorage: FSM aiogram поверх fsm_state — состояние переживает рестарт (перенесено из #4)
- cleanup_loop: истёкшие черновики, снимки контейнеров и попытки входа старше суток
- тесты: upgrade/downgrade, дрейф моделей и миграций, CHECK, CASCADE, FSM, чистка

Refs #5

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- SourceCraftClient (httpx): list_runs, get_run, get_cube_logs (постранично), run_commit_sha;
  ретраи на сетевые ошибки и 5xx с экспоненциальной задержкой, 4xx — SourceCraftError без повторов
- модели: RunStatus/EventType из swagger, «1970-01-01» = не задано, failed_cubes без служебных #-кубов
- у прогона в API нет sha → куб check/meta в tgit-uploads печатает TGIT_COMMIT_SHA (ADR-014)
- CLI: python -m app.sourcecraft.cli runs
- тесты на реальных ответах API (фикстуры), порог покрытия 45 → 80

Refs #10

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Eleboba force-pushed feat/10-sourcecraft-client from c016b47a8a to 25735fee96 2026-10-15 18:46:20 +03:00 Compare
Eleboba merged commit 4e5930b4c0 into dev 2026-10-15 18:52:05 +03:00
Sign in to join this conversation.