bot: Коммит — создание и изменение файлов, черновик #26

Closed
opened 2026-10-13 22:52:05 +03:00 by Eleboba · 1 comment
Owner

Описание

Требования C-10…C-16 из SPEC §4.1, ARCHITECTURE §2.3: изменения копятся в черновике до «Push».

Желаемый результат

  • «➕ Новый файл» → имя (валидное, не существует) → содержимое текстом (снимаются ```) или документом.
  • «✏️ Заменить содержимое» существующего файла с кратким diff (+N/−M); «🗑 Удалить».
  • «📁 Новая папка» — виртуальная, пока в ней нет файлов.
  • Черновик: список A/M/D с «убрать из черновика», хранится в БД, 24 ч, переживает рестарт.
  • Валидация: ≤ 100 КБ, UTF-8, без NUL, ast.parse для .py (ошибка → строка + «исправить»/«всё равно добавить»); запрет .sourcecraft/ и служебных файлов.

Подзадачи

  • app/repo/validate.py
  • app/repo/drafts.py — сервис черновика (drafts, draft_changes)
  • FSM-сценарии ввода имени и содержимого в app/bot/routers/commit.py
  • Рендер черновика и diff
  • Тесты валидации и черновика; сценарий FSM на фейковом боте

Анализ

Затрагиваемые файлы

Файл Что меняется
app/repo/validate.py новый
app/repo/drafts.py новый
app/bot/routers/commit.py сценарии изменений

Ограничения и риски

Telegram: текст ≤ 4096 символов — больше только документом. Код не исполняется при валидации.

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

В черновик: новый utils.py текстом, замена main.py документом, удаление файла; перезапустить бота — черновик на месте.


Лог выполнения

2026-10-13

  • Задача переписана под SPEC v2 (QR-доступ, меню из 4 разделов, командная модель — ADR-011…013).

2026-10-15

  • app/repo/validate.py: имя ([A-Za-z0-9._-]{1,100}), защищённые пути (.sourcecraft/, .tgit/, .git/, ruff.toml), снятие ```-обёртки, размер/UTF-8/NUL, ast.parse для .py, diff_stat.
  • app/repo/drafts.py (DraftService): один черновик на участника, base_sha фиксируется при первом изменении, TTL 24 ч, ≤ 50 изменений; правка нового файла остаётся add, удаление нового файла убирает его из черновика.
  • Роутер «Коммит»: FSM file_name → content → (syntax), dir_name; содержимое текстом или документом; «✏️ Заменить» с +N −M; «🗑 Удалить»; экран «🧾 Черновик» с «↩️ убрать». Дерево = репозиторий + черновик (🆕/✏️/🗑, размер «как будет после пуша»); виртуальные папки живут в FSM, пока в них не добавлен файл.
  • Тест поймал баг: у изменённого файла в дереве показывался старый размер.
  • Тесты: 41 новый (валидация, черновик, 9 сценариев через Dispatcher, черновик переживает «рестарт» — новый Dispatcher на той же БД). Всего 128, покрытие 91 %.
## Описание Требования C-10…C-16 из [SPEC](https://gitea.24studbank.ru/HSE/tgit/src/branch/dev/docs/SPEC.md) §4.1, [ARCHITECTURE](https://gitea.24studbank.ru/HSE/tgit/src/branch/dev/docs/ARCHITECTURE.md) §2.3: изменения копятся в черновике до «Push». ## Желаемый результат - «➕ Новый файл» → имя (валидное, не существует) → содержимое текстом (снимаются ```) или документом. - «✏️ Заменить содержимое» существующего файла с кратким diff (+N/−M); «🗑 Удалить». - «📁 Новая папка» — виртуальная, пока в ней нет файлов. - Черновик: список A/M/D с «убрать из черновика», хранится в БД, 24 ч, переживает рестарт. - Валидация: ≤ 100 КБ, UTF-8, без NUL, `ast.parse` для `.py` (ошибка → строка + «исправить»/«всё равно добавить»); запрет `.sourcecraft/` и служебных файлов. ## Подзадачи - [x] `app/repo/validate.py` - [x] `app/repo/drafts.py` — сервис черновика (`drafts`, `draft_changes`) - [x] FSM-сценарии ввода имени и содержимого в `app/bot/routers/commit.py` - [x] Рендер черновика и diff - [x] Тесты валидации и черновика; сценарий FSM на фейковом боте ## Анализ ### Затрагиваемые файлы | Файл | Что меняется | |------|--------------| | `app/repo/validate.py` | новый | | `app/repo/drafts.py` | новый | | `app/bot/routers/commit.py` | сценарии изменений | ### Ограничения и риски Telegram: текст ≤ 4096 символов — больше только документом. Код не исполняется при валидации. ## Как проверить В черновик: новый `utils.py` текстом, замена `main.py` документом, удаление файла; перезапустить бота — черновик на месте. --- ## Лог выполнения ### 2026-10-13 - Задача переписана под SPEC v2 (QR-доступ, меню из 4 разделов, командная модель — ADR-011…013). ### 2026-10-15 - `app/repo/validate.py`: имя (`[A-Za-z0-9._-]{1,100}`), защищённые пути (`.sourcecraft/`, `.tgit/`, `.git/`, `ruff.toml`), снятие ```-обёртки, размер/UTF-8/NUL, `ast.parse` для `.py`, `diff_stat`. - `app/repo/drafts.py` (`DraftService`): один черновик на участника, `base_sha` фиксируется при первом изменении, TTL 24 ч, ≤ 50 изменений; правка нового файла остаётся `add`, удаление нового файла убирает его из черновика. - Роутер «Коммит»: FSM `file_name → content → (syntax)`, `dir_name`; содержимое текстом или документом; «✏️ Заменить» с `+N −M`; «🗑 Удалить»; экран «🧾 Черновик» с «↩️ убрать». Дерево = репозиторий + черновик (🆕/✏️/🗑, размер «как будет после пуша»); виртуальные папки живут в FSM, пока в них не добавлен файл. - Тест поймал баг: у изменённого файла в дереве показывался старый размер. - Тесты: 41 новый (валидация, черновик, 9 сценариев через Dispatcher, черновик переживает «рестарт» — новый Dispatcher на той же БД). Всего 128, покрытие 91 %.
Eleboba added this to the M1 · MVP: загрузка → коммит → CI milestone 2026-10-13 22:52:05 +03:00
Eleboba added the featurebotsize/1 labels 2026-10-13 22:52:05 +03:00
Eleboba self-assigned this 2026-10-13 22:52:05 +03:00
Author
Owner

Смержено в dev через PR #38 (614f8ea) — закрываю.

Смержено в `dev` через PR #38 (614f8ea) — закрываю.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Reference: HSE/tgit#26