Skip to content

Latest commit

 

History

History
121 lines (91 loc) · 10.4 KB

File metadata and controls

121 lines (91 loc) · 10.4 KB

Локальная CI

Локальная 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 code 1 — работа не считается готовой.

-Fast сам по себе не отключает launch — для агентов всегда комбинировать с -SkipLaunch.

Autofix (по умолчанию)

По умолчанию 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-targetsclippy --all-targets -D warnings MachineApplicable autofix (та же область targets), затем lint+typecheck; warnings = ошибки.
rust-test cargo test --workspace Юнит-тесты workspace (единственный member — src-tauri).
frontend-format npm run formatformat: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 и диагностика

  • По умолчанию вывод компактный: строка команды + статус стадии.
  • -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.

Стек frontend

AgentContinuer — vanilla Vite + TypeScript (не Svelte). frontend-check гоняет tsc --noEmit через npm run check. Prettier без prettier-plugin-svelte.