# yaml-language-server: $schema=https://taskfile.dev/schema.json # # Запуск команд проекта через Task (https://taskfile.dev). # Список задач: `task --list`. version: '3' vars: BINARY: healthlog PKG: ./cmd/healthlog # Версии инструментов для воспроизводимой установки (см. задачу setup). GOLANGCI_VERSION: v2.12.2 # Проверка раскладки документов по канону av-dev-pm. Пусто — путь ищется в # кеше плагинов (версия в пути меняется при обновлении, поэтому не зашита). DOCS_PY: '{{.DOCS_PY | default ""}}' tasks: default: desc: Список доступных задач cmds: - task --list silent: true run: desc: 'Локальный запуск (config.toml не обязателен — есть умолчания)' cmds: - go run {{.PKG}} --config ./config.toml | hl build: desc: Статический бинарь linux/amd64 для сервера cmds: - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -trimpath -ldflags='-s -w' -o {{.BINARY}} {{.PKG}} test: desc: Прогон тестов cmds: - go test ./... verify:archive: desc: 'Сходимость на живом архиве: весь ./data/raw через разбор, повторный прогон обязан дать то же состояние' cmds: # Не входит в `task test` и `task gate` намеренно: архив в репозиторий не # попадает, прогон занимает минуту, и держать его на каждом гейте значит # платить за проверку, которая возможна только на этой машине. - go test ./internal/replay -run TestReplay -healthlog.archive={{.ARCHIVE | default (printf "%s/data/raw" .ROOT_DIR)}} -v -count=1 verify:busy: desc: 'Свёртка под удерживаемой блокировкой базы: доставка остаётся в очереди, а витрина не расходится с пересборкой (около 50 секунд)' cmds: # Не входит в `task test` и `task gate` намеренно: busy_timeout — пять # секунд, повторов транзакции пять, и гейт гоняет тесты трижды. Проверяет # при этом центральное решение задачи «разнести ответ и свёртку»: # занятость базы — обстоятельство, а не свойство доставки. - go test ./internal/fold -run TestBusy -healthlog.busy -v -count=1 # Второй прогон — композиция, ради которой заведён барьер журнального # порядка: занятость откладывает доставку, проход прекращается на ней, и # живая витрина всё равно совпадает с пересборкой. Порознь барьер и # сходимость проверены в гейте; вместе — только здесь, потому что # настоящая занятость стоит те же двадцать пять секунд. - go test ./internal/replay -run TestBusy -healthlog.busy -v -count=1 lint: desc: Запуск golangci-lint cmds: - golangci-lint run up: desc: 'Собрать и поднять сервис в контейнере (данные в ./data переживают пересборку)' deps: [build] cmds: - docker compose up -d --build - task: wait down: desc: Остановить контейнер cmds: - docker compose down restart: desc: 'Пересобрать бинарь и перезапустить сервис — основной цикл разработки' deps: [build] cmds: - docker compose up -d --build - task: wait wait: desc: 'Дождаться, пока сервис ответит на /healthz' internal: true cmds: - | for i in $(seq 1 30); do if curl -fsS --max-time 2 http://127.0.0.1:8080/healthz >/dev/null 2>&1; then echo "healthlog отвечает на :8080"; exit 0 fi sleep 1 done echo "healthlog не поднялся за 30 секунд, смотри: task logs" >&2 exit 1 logs: desc: 'Логи сервиса (LINES=N — сколько строк, по умолчанию 50)' vars: LINES: '{{.LINES | default "50"}}' cmds: - docker compose logs --tail {{.LINES}} healthlog ps: desc: Состояние контейнера cmds: - docker compose ps gate: desc: 'Детерминированный гейт ревью: build/vet/lint/test/race/покрытие диффа/миграции/секреты/раскладка документов. BASE= — база диффа' cmds: - python3 scripts/gate.py {{.BASE}} # Раскладка документов по канону av-dev-pm. Путь переопределяется # переменной DOCS_PY — переустановка плагина не должна править Taskfile. # Шаг обязан краснеть внятно, если скрипта нет: молча пропущенная # проверка раскладки хуже отсутствующей. - | ds="{{.DOCS_PY}}" if [ -z "$ds" ]; then ds=$(ls -t "$HOME"/.claude/plugins/cache/*/av-dev-pm/*/skills/canon/scripts/docs.py 2>/dev/null | head -1) fi if [ -z "$ds" ] || [ ! -f "$ds" ]; then echo "гейт: docs.py не найден" echo " плагин av-dev-pm не установлен либо переехал —" echo " поставь его или задай DOCS_PY=<путь> при вызове task gate" exit 1 fi python3 "$ds" check --dir . {{if .BASE}}--base {{.BASE}}{{end}} review:context: desc: 'Вход для архитектурного прохода ревью: пакеты, граф зависимостей, инвентарь концепций' cmds: - python3 scripts/review-context.py tidy: desc: go mod tidy cmds: - go mod tidy clean: desc: Удалить собранный бинарь cmds: - rm -f {{.BINARY}} setup: desc: Установка инструментов разработки cmds: - go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@{{.GOLANGCI_VERSION}}