Самое крупное расхождение с ТЗ: входа не было вовсе, экраны открывались ссылкой с номером занятия, и пускало знание адреса. - Таблицы users и audit_log, миграция. Пароль argon2, сессия — подписанная cookie; роль на сокетах читается из той же cookie в момент рукопожатия, отдельного протокола авторизации в канале нет. - Разграничение: control — преподавателю, observe — преподавателю и админу, call и station — обучающемуся и преподавателю. Отказ приходит событием error с кодом forbidden. - Обучающийся не видит чужого: история подменяет фильтр на его собственный идентификатор, разбор и профиль сверяют trainee_id. ТЗ запрещает доступ к чужим результатам, а не только к чужим экранам. - Администратору закрыта правка оценок — ТЗ запрещает это прямо. - make users заводит по записи на роль и печатает случайные пароли один раз: зашитый в репозиторий admin/admin пережил бы сдачу. - Экран входа и проверка роли на каждом маршруте фронта. Наши инструменты не сломались: make lesson и тесты входят через dev-token за флагом dev_auth_bypass, на стенде точка отвечает 404 — выключенной функции не должно быть видно вовсе. У тестов появился conftest.py. Role уехала в домен и в generated.ts через EventCatalog.principal: иначе фронт переписывал бы список ролей руками. 181 тест зелёный (14 новых), make typecheck чистый.
77 lines
4.1 KiB
Makefile
77 lines
4.1 KiB
Makefile
# Подъём стенда и рутина. Цели, которых ещё нет, честно падают
|
||
# и называют карточку, которая их закрывает, — README не должен врать.
|
||
|
||
UV ?= uv
|
||
|
||
# `make test` и `make demo` не запускать одновременно: они просят у uv разные
|
||
# группы зависимостей, и uv пересобирает одно и то же окружение, а второй запуск
|
||
# молча ждёт блокировку. Один раз поставить оба набора:
|
||
# cd backend && uv sync --extra dev --extra voice
|
||
COMPOSE ?= docker compose
|
||
|
||
.DEFAULT_GOAL := help
|
||
|
||
help: ## Список целей
|
||
@grep -hE '^[a-z-]+:.*##' $(MAKEFILE_LIST) | sed 's/:.*##/\t/' | expand -t22
|
||
|
||
dev: ## Поднять стенд: postgres + backend --reload + frontend
|
||
$(COMPOSE) up --build
|
||
|
||
down: ## Погасить стенд
|
||
$(COMPOSE) down
|
||
|
||
back: ## Бэкенд нативно, с голосовым контуром (порт 8000: сначала docker compose stop backend)
|
||
cd backend && $(UV) run --extra voice uvicorn app.main:app --reload --port 8000 --workers 1
|
||
|
||
front: ## Только фронтенд, локально
|
||
npm --prefix frontend install && npm --prefix frontend run dev
|
||
|
||
types: ## domain/events.py → frontend/src/shared/types/generated.ts
|
||
cd backend && $(UV) run --no-project --with 'pydantic>=2.7' python scripts/export_types.py
|
||
|
||
test: ## Тесты бэкенда (голосовой контур пропускается)
|
||
cd backend && $(UV) run --extra dev pytest -q
|
||
|
||
test-voice: ## Тест голосового контура на настоящих моделях: задержка и перебивание
|
||
cd backend && $(UV) run --extra dev --extra voice pytest tests/test_voice_pipeline.py -q -s
|
||
|
||
typecheck: ## Проверить фронтенд компилятором
|
||
npm --prefix frontend run typecheck
|
||
|
||
models: ## Скачать модели в backend/models/: эмбеддинги, GigaAM, Silero VAD; Silero TTS — вручную
|
||
cd backend && $(UV) run python scripts/models.py
|
||
|
||
users: ## Завести учётные записи ролей и напечатать пароли: make users force=1
|
||
cd backend && $(UV) run python scripts/users.py
|
||
|
||
seed: ## Залить сценарии из /scenarios в БД
|
||
cd backend && $(UV) run python scripts/seed.py
|
||
|
||
lesson: ## Запустить занятие и напечатать ссылки: make lesson s=<сценарий> m=<режим>
|
||
cd backend && $(UV) run --no-project --with websockets python scripts/start_lesson.py "$(s)" "$(m)"
|
||
|
||
test-llm: ## Живые проверки LLM по backend/.env.test (медленно: рассуждающая модель)
|
||
cd backend && $(UV) run --extra dev pytest tests/test_llm.py -m llm -q -s
|
||
|
||
llm-check: ## Один запрос к LLM: проверить ключ и адрес из backend/.env
|
||
cd backend && $(UV) run python scripts/llm_check.py
|
||
|
||
latency: ## Замер задержки голосового контура по этапам — запускать на демо-машине
|
||
cd backend && $(UV) run --extra voice python scripts/latency.py
|
||
|
||
migrate: ## Накатить миграции
|
||
cd backend && $(UV) run alembic upgrade head
|
||
|
||
revision: ## Создать миграцию: make revision m="что изменилось"
|
||
cd backend && $(UV) run alembic revision --autogenerate -m "$(m)"
|
||
|
||
repl: ## Текстовый диалог со звонящим без голоса: make repl s=<сценарий>
|
||
cd backend && $(UV) run python scripts/repl.py "$(s)"
|
||
|
||
pregen: ## Построить таблицу реплик звонящего для офлайна: make pregen s=<сценарий> force=1
|
||
cd backend && $(UV) run python scripts/pregenerate.py "$(s)"
|
||
|
||
demo: ## Поднять стенд для занятия: база, сценарии, бэкенд с голосом, фронт
|
||
./scripts/demo.sh
|
||
|
||
.PHONY: help dev down back front types users test test-voice typecheck test-llm lesson llm-check latency migrate revision models seed repl pregen demo
|