Commit Graph
34 Commits
Author SHA1 Message Date
ElebobaandClaude Opus 5.5 0f27f405a7 chore: локальный запуск без Docker и SourceCraft; fix: относительный GIT_CLONE_DIR
- make demo-repo: локальный bare-репозиторий загрузок из infra/uploads-template
- make run: бот на этой машине (SQLite, настройки из .env)
- fix: при относительном clone_dir клон уезжал в data/data/uploads (git clone
  запускается из родительской папки) — путь теперь абсолютный; тест на это
- data/ в .gitignore

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 19:53:40 +03:00
Eleboba b5fbbaf904 Merge pull request 'feat(bot): Коммит — сообщение, Push, конфликты' (#38) from feat/9-push into dev
Reviewed-on: #38
2026-10-15 19:30:23 +03:00
ElebobaandClaude Opus 5.5 ae0cd5d42d feat(bot): Коммит — сообщение, Push, конфликты, публикация в репозиторий загрузок
- Publisher: пуши по одному (lock), fetch → проверка конфликта с base_sha → чистое дерево
  origin/main → черновик → коммит от tgit-bot с трейлером Telegram-User → push;
  отказ push → rebase и повтор (до 3 раз); защита от путей вне клона; лимит 20 пушей/час
- «💬 Сообщение коммита» (1–200 символов, первая строка ≤ 72) и «🚀 Push» с подтверждением;
  исходы: запушено (sha, ссылка, ⏳ CI) · конфликт → «Перезаписать» · нечего коммитить · лимит · сбой
- запись в pushes (chat_id, message_id — для обновления статуса CI/CD в #11), черновик очищается
- ruff: RUF001–003 выключены — кириллица в текстах это норма

Refs #9

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 19:23:09 +03:00
ElebobaandClaude Opus 5.5 614f8eafd5 feat(bot): Коммит — создание, замена и удаление файлов, черновик
- новый файл: имя → содержимое текстом (```-обёртка снимается) или документом
- новая папка (виртуальная, пока в ней нет файлов), замена с diff +N/−M, удаление
- валидация: имя, ≤ 100 КБ, UTF-8, без NUL; .py — ast.parse с выбором «исправить / всё равно»;
  .sourcecraft/, .tgit/, ruff.toml из бота не меняются
- DraftService: черновик в БД, 24 ч, ≤ 50 изменений; удаление нового файла убирает его из черновика
- дерево показывает черновик поверх репозитория: 🆕 / ✏️ / 🗑, размер — как будет после пуша
- экран черновика (A/M/D) с «↩️ убрать»

Refs #26

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 19:18:49 +03:00
ElebobaandClaude Opus 5.5 dbb17bd774 feat(bot): Коммит — навигация по дереву репозитория загрузок
- UploadsRepo: локальный клон, fetch не чаще fetch_interval, ls-tree -z (пробелы/кириллица),
  cat-file, последний коммит по пути; git без shell, ssh с -F /dev/null (без конфига хоста)
- «📝 Коммит»: папки/файлы с размерами, ⬆️ Вверх, страницы по 20, карточка файла
  с последним коммитом, «👁 Показать» (<pre> или документом); в кнопках только индексы
- ключ для контейнера: GIT_SSH_KEY_B64 → временный файл 0600 (смонтированный файл хоста
  контейнерному uid не прочитать); volume /data для клона
- тесты на настоящем bare-репозитории во временной папке

Refs #8

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 19:10:30 +03:00
ElebobaandClaude Opus 5.5 219bebd5a2 feat(bot): доступ по QR-приглашениям, раздел «Участники», отзыв доступа
- AccessService: одноразовые приглашения (128 бит, в БД только sha256, TTL 24 ч),
  атомарный захват приглашения (условный UPDATE — из двух сканов одного QR проходит один),
  антиперебор (> 5 неудач в час — молчание), отзыв (черновик и FSM удаляются), повторное приглашение
- ADMIN_IDS заводятся в БД при старте; дальше — только по приглашению
- AccessMiddleware: участники из БД (+ last_seen раз в 5 мин), новичкам — только /start <токен>
- «👥 Участники» для админов: список, QR (segno) + ссылка, отзыв с подтверждением
- один ответ на неверный/истёкший/использованный токен — без подсказок

Refs #25

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 19:03:50 +03:00
Eleboba 4e5930b4c0 Merge pull request 'feat(bot): клиент SourceCraft API' (#32) from feat/10-sourcecraft-client into dev
Reviewed-on: #32
2026-10-15 18:52:04 +03:00
ElebobaandClaude Opus 5.5 25735fee96 feat(bot): клиент SourceCraft API — прогоны, логи кубов, sha коммита, ретраи
- 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>
2026-10-15 18:45:42 +03:00
ElebobaandClaude Opus 5.5 282920e06b feat(bot): модель данных, миграции Alembic, FSM в БД, TTL-чистка
- 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>
2026-10-15 18:45:16 +03:00
Eleboba b70797c805 Merge pull request 'feat(llm): провайдер за протоколом, OpenAI-совместимый API и mock' (#33) from feat/17-llm-provider into dev
Reviewed-on: #33
2026-10-15 18:43:27 +03:00
Eleboba 1be665a765 Merge pull request 'docs: guardrails в CLAUDE.md' (#34) from docs/21-guardrails into dev
Reviewed-on: #34
2026-10-14 18:25:44 +03:00
ElebobaandClaude Opus 5.5 8508405b0f docs: guardrails в CLAUDE.md
Refs #21

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:08:31 +03:00
ElebobaandClaude Opus 5.5 ab988e6ed0 feat(llm): провайдер за протоколом — OpenAI-совместимый API и mock, фабрика по конфигу
- LLMProvider: complete(messages, schema) -> LLMResult (текст, разобранный JSON, токены)
- openai_compat: /chat/completions, structured output через response_format json_schema,
  JSON из ```-обёртки тоже разбирается; ретраи на 429/5xx и сетевые ошибки, 4xx — сразу ошибка
- mock: детерминированные правила для тестов и демо без сети
- LLMSettings (LLM_PROVIDER/BASE_URL/MODEL/API_KEY…), CLI python -m app.llm.cli

Refs #17

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:06:30 +03:00
Eleboba 15f354d06b Merge pull request 'feat(bot): точка входа, конфиг, главное меню, healthcheck' (#29) from feat/4-entrypoint-menu into dev
Reviewed-on: #29
2026-10-14 16:56:07 +03:00
Eleboba b0586c9f03 Merge pull request 'feat(infra): репозиторий загрузок tgit-uploads и шаблон CI/CD' (#30) from infra/7-uploads-repo into dev
Reviewed-on: #30
2026-10-14 16:55:58 +03:00
Eleboba 5744e8fae9 Merge pull request 'ci: проверки бота в SourceCraft CI' (#28) from ci/6-bot-checks into dev
Reviewed-on: #28
2026-10-14 16:55:11 +03:00
ElebobaandClaude Opus 5.5 d4dba9748d feat(infra): шаблон репозитория загрузок tgit-uploads — CI/CD, служебные скрипты, демо-сервис
- .sourcecraft/ci.yaml: push в main → check (compile · ruff мягкий · bandit · pytest по сервисам) → deploy
- .tgit/changed_services.py: изменённые services/<name>/ (без родителя — все сервисы)
- .tgit/run_tests.py: pytest каждого сервиса со своими requirements.txt
- deploy пока заглушка со списком сервисов — tgit-runner в #13
- services/hello: демо-сервис с тестом; tgit.yaml — формат настроек сервиса

Refs #7

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 23:59:41 +03:00
ElebobaandClaude Opus 5.5 0ce5285da1 feat(bot): точка входа, конфиг, главное меню, доступ для ADMIN_IDS, healthcheck
- config: pydantic-settings по подсистемам, ADMIN_IDS через запятую
- texts.yaml + валидация при старте (лишний/пропущенный ключ — ошибка сразу)
- меню: reply-клавиатура разделов (Участники — только админам), инлайн «Назад»/«Отмена»
  с редактированием сообщения на месте, /start, /menu, /help
- AccessMiddleware (outer) на сообщениях и кнопках: до #25 пускает только ADMIN_IDS,
  постороннему — одна фраза в сутки, устаревшие кнопки молча гасятся
- heartbeat-файл + HEALTHCHECK в Dockerfile; JSON-логи
- FSM пока в памяти (фабрика), хранилище в БД — в #5
- тесты на фейковой сессии aiogram через настоящий Dispatcher

Refs #4

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 23:53:52 +03:00
ElebobaandClaude Opus 5.5 cccab8ba78 docs: CI SourceCraft — формат прогонов и логов, ручной запуск, триггеры из основной ветки
Refs #6

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 23:49:10 +03:00
ElebobaandClaude Opus 5.5 d81f230407 ci: триггер push без фильтра веток
Refs #6

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 23:43:13 +03:00
ElebobaandClaude Opus 5.5 9e13da0189 ci: проверки бота в SourceCraft CI — ruff, mypy, pytest с порогом покрытия
push в любую ветку (зеркало из Gitea, ADR-010) → кубы lint и test параллельно.
Порог покрытия — храповик в pyproject (fail_under), одинаков локально и в CI.

Refs #6

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 23:39:05 +03:00
Eleboba bbd4ac5bc1 Merge pull request 'feat(infra): каркас проекта — uv, линтеры, тесты, Docker Compose' (#27) from feat/3-skeleton into dev
Reviewed-on: #27
2026-10-13 23:36:22 +03:00
ElebobaandClaude Opus 5.5 8dfcef94c9 feat(infra): каркас проекта — uv, ruff, mypy, pytest, Docker Compose
- pyproject: Python 3.12, зависимости ADR-009, ruff/mypy strict/pytest/coverage
- app/: точка входа-заглушка с graceful shutdown по SIGTERM
- Dockerfile: multi-stage, uv, non-root (uid 10001), git+ssh для коммитов (#9);
  apt по HTTPS — в некоторых сетях обычный HTTP к deb.debian.org заблокирован
- docker-compose: bot + postgres 16, healthcheck, лимиты памяти, ротация логов
- Makefile: install/lint/fmt/test/cov/up/down/logs/ps; .env.example

Refs #3

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 23:14:53 +03:00
Eleboba 6ea414752b Merge pull request 'docs: ТЗ v2, архитектура, ADR, переезд в Gitea' (#23) from docs/2-spec-architecture into dev
Reviewed-on: #23
2026-10-13 22:59:14 +03:00
ElebobaandClaude Opus 5.5 d34bc33aeb docs: ТЗ v2 — QR-доступ, меню разделов, коммит по дереву, агент со стражем, общие алерты
ADR-011 (QR-приглашения), ADR-012 (командная модель), ADR-013 (агент логов).

Refs #24

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 22:50:31 +03:00
ElebobaandClaude Opus 5.5 af1585c634 docs: Gitea — основной репозиторий и трекер, SourceCraft — зеркало (ADR-010)
Refs #22

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 19:49:04 +03:00
ElebobaandClaude Opus 5.5 c79059f778 docs(api): формат значения секрета — base64
Refs #2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 18:36:43 +03:00
ElebobaandClaude Opus 5.5 0244da0b0e docs(api): вехи, связи issue, CI-эндпоинты, нюансы ключей ответов
Refs #2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 18:36:22 +03:00
ElebobaandClaude Opus 5.5 018e3d26c4 docs: ТЗ v1, архитектура, ADR-002..009, открытые вопросы
Refs #2

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 18:32:54 +03:00
rogachevegorushkaandSourceCraft 74aabba5dc docs: шпаргалка по SourceCraft API (!1)
## Что меняется
Шпаргалка по REST API SourceCraft (issues, метки, PR) с проверенными нюансами; `CLAUDE.md` теперь первым делом загружает `.env` с `SOURCECRAFT_TOKEN`.

Closes #1

## Как проверить
`set -a; . ./.env; set +a` и выполнить команды чтения из `docs/dev/SOURCECRAFT_API.md` — ответ 200.

## Чек-лист
- [x] ветка от origin/dev
- [x] секретов в диффе нет
- [x] лог в issue дописан

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-10-12 15:23:41 +00:00
ElebobaandClaude Opus 5.5 47dd849528 docs: ретраи curl для нестабильного соединения с API
Refs #1

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 18:22:22 +03:00
ElebobaandClaude Opus 5.5 21eb8331d2 docs: шпаргалка по SourceCraft API, загрузка .env в начале сессии
Refs #1

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 18:20:04 +03:00
ElebobaandClaude Opus 5.5 b973397827 docs: скелет проекта — CLAUDE.md, регламент, шаблон issue, черновик ТЗ
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 18:11:22 +03:00
rogachevegorushka a5d1e90aab Initial commit 2026-10-12 15:10:50 +00:00