# Штурман — единые dev-команды (расширяется по планам реализации). set shell := ["bash", "-uc"] # список целей default: @just --list # собрать весь воркспейс build: cargo build --workspace # тесты (unit + integration) test: cargo test --workspace # линт: формат + clippy (warnings = ошибки) lint: cargo fmt --all --check cargo clippy --workspace --all-targets -- -D warnings # лицензии + advisories deny: cargo deny check # интеграционные тесты на session-шине (нужен dbus: brew install dbus / в Lima). # --test-threads=1: тесты владеют одними well-known именами на общей шине → серийно (иначе кросс-talk/вис). test-integration: dbus-run-session -- cargo test --workspace -- --ignored --test-threads=1 # полный локальный гейт ci: lint test deny # --- плагины (F02/F03) --- # валидировать манифест плагина validate-manifest path: cargo run -q -p shturman-manifest-validator -- {{path}} # сгенерировать каркас плагина в plugins/ и проверить валидатором new-plugin name: #!/usr/bin/env bash set -euo pipefail dest="plugins/{{name}}" [ -e "$dest" ] && { echo "уже существует: $dest"; exit 1; } mkdir -p "$dest" cp -R templates/plugin/. "$dest/" for f in $(find "$dest" -type f); do tmp=$(mktemp); sed "s/__NAME__/{{name}}/g" "$f" > "$tmp" && mv "$tmp" "$f" done echo "создан плагин: $dest" cargo run -q -p shturman-manifest-validator -- "$dest/manifest.yaml" # dev-запуск плагина (каркас; полноценно — с App-Host, v3) plugin-dev-run path: @echo "plugin-dev-run {{path}}: нужен App-Host (приходит в v3). Пока — валидация манифеста:" cargo run -q -p shturman-manifest-validator -- {{path}}/manifest.yaml # Vehicle Simulator (плейсхолдер; домен E, v2) sim: @echo "Vehicle Simulator — v2 (домен E): vcan + ELM327-emu; каркас в sim/." # --- Lima-VM (часть 2 Плана 5: нужен limactl — brew install lima) --- # поднять dev-VM (создание + провижининг). --tty=false: неинтерактивный старт (без редактора YAML). vm-up: limactl start --tty=false --name=shturman lima/shturman.yaml # остановить VM vm-down: limactl stop shturman # шелл в VM vm-shell: limactl shell shturman # пересоздать VM «с нуля» (сброс — ничего на хосте не ломаем) vm-reset: -limactl stop shturman -limactl delete shturman limactl start --tty=false --name=shturman lima/shturman.yaml # собрать + развернуть + поднять target в VM (boot → сервисы → кадр); без reboot (фаза pre) run: limactl shell --workdir /shturman shturman -- bash -lc 'E2E_PHASE=pre bash tests/e2e/run.sh' # сквозной E2E в VM (приёмка v0.1/v0.6 + шагающий скелет): pre → reboot → post e2e: #!/usr/bin/env bash set -euo pipefail echo "== E2E фаза PRE (сборка → подъём → проверки → персист-проба) ==" limactl shell --workdir /shturman shturman -- bash -lc 'E2E_PHASE=pre bash tests/e2e/run.sh' echo echo "== reboot VM (проверка персиста + machine-id every-boot bind) ==" limactl shell --workdir / shturman -- sudo systemctl reboot 2>/dev/null || true echo "== ждём возврат VM ==" for i in $(seq 1 60); do sleep 2 if limactl shell --workdir / shturman -- true 2>/dev/null; then echo "VM вернулась (попытка $i)"; break; fi done limactl shell --workdir / shturman -- bash -lc 'for i in $(seq 1 30); do systemctl is-active --quiet shturman.target && break; sleep 1; done' 2>/dev/null || true echo echo "== E2E фаза POST (персист после reboot) ==" limactl shell --workdir /shturman shturman -- bash -lc 'E2E_PHASE=post bash tests/e2e/run.sh' echo echo "== E2E OK ✅ ==" # ручная инспекция кадра: headless software-render первого кадра → PNG (без дисплея/композитора, §6) shell-frame path="target/shell-frame.png": cargo run -q -p shturman-shell -- --screenshot {{path}} @echo "кадр записан: {{path}}" # инспекция splash-кадра (Stage 0): headless software-render → PNG splash-frame path="target/splash-frame.png": cargo run -q -p shturman-splash -- --screenshot {{path}} @echo "splash записан: {{path}}"