Локальная CI построена по блюпринту Agent Enforcer 2 (AE2). Цель — единая проверка качества перед сдачей работы и перед ручным GUI-check, с компактным выводом и машиночитаемым отчётом. GitHub Actions не используется.
| Уровень | Файл | Ответственность |
|---|---|---|
| 1. Обёртка | run.ps1 |
Разбор и валидация флагов, справка, форвард в оркестратор. |
| 2. Оркестратор | build.ps1 |
Каркас стадий, кэш, self-check, coverage/security representation, codebase-memory, отчёты, launch. |
| 3. Язык | tools/ci/rust.ps1, tools/ci/frontend.ps1 |
Rust- и frontend-стадии. |
Уровень 3 подключается в build.ps1 через dot-source и использует его каркас (Invoke-Stage, Invoke-LoggedCommand, New-Outcome, New-Issue, Write-CliDiagnostic).
.\run.ps1 -SkipLaunch # финальный gate агента (полный прогон без GUI; autofix по умолчанию)
.\run.ps1 -Fast -SkipLaunch # быстрый цикл: без coverage и security
.\run.ps1 -NoAutofix -SkipLaunch # check-only: без записи автоисправлений
.\run.ps1 # проверки + npm run tauri dev (ручной GUI-check)
.\run.ps1 -Fast # быстрые проверки + launch
.\run.ps1 -Verbose -SkipLaunch # полный стрим вывода инструментов + cargo --verbose
.\run.ps1 -NoCache -SkipLaunch # игнорировать trust stamps
.\run.ps1 -SelfTest # только валидация CI-скриптов
.\run.ps1 -Help # справка по флагамСтандартная финальная проверка агента —
.\run.ps1 -SkipLaunch. При fail gate печатаетLocal CI failed. Agent work is not ready while this gate is red., пишетpassed=falseв.ci_cache/report.jsonи завершается с exit code1— работа не считается готовой.
-Fastсам по себе не отключает launch — для агентов всегда комбинировать с-SkipLaunch.
По умолчанию CI сначала применяет безопасные автофиксеры существующего toolchain, затем гоняет валидационные проверки на уже исправленном workspace. Новые зависимости не добавляются; инструменты без autofix (tsc --noEmit, Vitest, coverage, security) остаются check-only.
| Область | Autofix (default) | Валидация после |
|---|---|---|
| PowerShell CI | Invoke-ScriptAnalyzer -Fix |
повторный анализ / fail по оставшимся diagnostics |
| Rust style | cargo fmt --all |
cargo fmt --all -- --check |
| Rust lint | cargo clippy --fix --allow-dirty --allow-staged --workspace --all-targets |
cargo clippy --workspace --all-targets -- -D warnings |
| Frontend style | npm run format (prettier --write) |
npm run format:check |
clippy --fix применяет только MachineApplicable suggestions (без __CARGO_FIX_YOLO). Шаг fix без -D warnings: оставшиеся неисправляемые линты сами по себе не валят autofix; non-zero exit у --fix — ошибка самого fixer/tool (например, compile break) и фейлит стадию. Жёсткий gate — на шаге валидации с -D warnings. Opt-out: -NoAutofix — все перечисленные стадии становятся check-only, как раньше.
После autofix memoized fingerprints сбрасываются; trust stamp успешной стадии пишется по пост-fix отпечатку, чтобы следующие стадии и кэш видели актуальный tree. В .ci_cache/report.json поле ci.noAutofix отражает режим прогона (true при -NoAutofix, иначе false).
Порядок: self-check → rust-fmt → rust-clippy → rust-test → frontend-format → frontend-check → frontend-test → coverage → security → codebase-memory, затем интерактивный launch (если не -SkipLaunch).
| Стадия | Инструмент | Назначение |
|---|---|---|
self-check |
Parser + PSScriptAnalyzer (-Fix по умолчанию) |
Валидация CI-скриптов. |
rust-fmt |
cargo fmt --all → --check |
Стиль Rust (autofix + проверка). |
rust-clippy |
clippy --fix --all-targets → clippy --all-targets -D warnings |
MachineApplicable autofix (та же область targets), затем lint+typecheck; warnings = ошибки. |
rust-test |
cargo test --workspace |
Юнит-тесты workspace (единственный member — src-tauri). |
frontend-format |
npm run format → format:check |
Prettier (autofix + проверка). |
frontend-check |
npm run check |
tsc --noEmit (без autofix). |
frontend-test |
npm run test |
Vitest (без autofix). |
coverage |
cargo llvm-cov / vitest coverage |
Representation: warn, если tooling нет. |
security |
cargo audit / npm audit |
Representation: warn при недоступности tooling/БД. |
codebase-memory |
codebase-memory-mcp CLI (index_repository, mode=full, persistence=false) |
Warn-only обновление локального графа кода для агентов перед launch. Отсутствие инструмента или ошибка reindex не блокируют CI. |
launch |
npm run tauri dev |
Ручной GUI-check. |
Статусы стадии: ok | warn | fail | cached | skip.
| Флаг | Действие |
|---|---|
-Fast |
Пропустить coverage + security. codebase-memory и launch не трогает. |
-SkipRust |
Пропустить Rust-стадии. |
-SkipFrontend |
Пропустить frontend-стадии. |
-SkipCoverage |
Пропустить только coverage. |
-SkipSecurity |
Пропустить только security. |
-SkipLaunch |
Только проверки, без Tauri GUI. |
-NoAutofix |
Отключить запись автоисправлений (check-only для fmt/clippy/prettier/PSSA). |
-NoCache |
Игнорировать trust stamps (перезапустить кэшируемые стадии). |
-ForceAll |
Форсировать все стадии (включает -NoCache). |
-Clean |
Удалить .ci_cache перед прогоном. |
-Verbose |
Полный стрим вывода инструментов + cargo --verbose (где применимо). Без флага CI компактна: команды и статусы; при fail — диагностические блоки в консоль. |
-SelfTest |
Только валидация CI-скриптов. |
-Help |
Справка. |
Кэш идемпотентный и основан на хэше исходников (как в AE2/Tower). Отпечатки считаются по git ls-files (учитываются незакоммиченные правки трекнутых файлов через content-hash):
| Ключ | Область | Стадии |
|---|---|---|
| CI scripts | run.ps1, build.ps1, tools/ci/*.ps1, PSScriptAnalyzerSettings.psd1 |
self-check |
| Rust | *.rs, *Cargo.toml, Cargo.lock, rustfmt.toml, rust-toolchain.toml (если есть), src-tauri/tauri.conf.json, capabilities/, icons/ |
rust-fmt, rust-clippy, rust-test |
| Frontend | src/, package.json, package-lock.json, tsconfig.json, vite.config.ts, index.html, Prettier-конфиги |
frontend-* |
| Combined | rust + frontend fingerprints | coverage |
Если отпечаток совпадает с последним успешным прогоном стадии, стадия помечается cached и пропускается. Штампы: .ci_cache/stamps/*.stamp. Сброс: -NoCache, -ForceAll или -Clean.
security, codebase-memory и launch не кэшируются. codebase-memory намеренно warn-only и без CI-stamp: MCP сам делает incremental/no-op при неизменённом дереве; persistence=false, чтобы не создавать .codebase-memory/ artifact.
- По умолчанию вывод компактный: строка команды + статус стадии.
-Verboseстримит полный stdout/stderr инструментов и добавляетcargo --verboseк clippy/test/coverage/audit (cargo fmtфлаг не принимает).- Без
-Verboseприfailв консоль печатаются компактные diagnostic-блоки (rustc/clippy/test), полный лог остаётся в.ci_cache/logs/.
| Файл | Назначение |
|---|---|
.ci_cache/report.json |
Отчёт последнего прогона (стадии, issues, metrics, fingerprints, git, ci.noAutofix). |
.ci_cache/logs/ |
Полный вывод инструментов по стадиям. |
.ci_cache/stamps/ |
Trust stamps кэша. |
.enforcer/Enforcer_last_check.log |
Снимок последнего прогона. |
.enforcer/Enforcer_stats.log |
Append-only история прогонов. |
.ci_cache/ и .enforcer/ в .gitignore.
AgentContinuer — vanilla Vite + TypeScript (не Svelte). frontend-check гоняет tsc --noEmit через npm run check. Prettier без prettier-plugin-svelte.