207 lines
7.9 KiB
Markdown
207 lines
7.9 KiB
Markdown
# Scripts
|
||
|
||
## `staging-smoke.sh`
|
||
|
||
Post-deploy smoke helper для staging/production-like окружений.
|
||
|
||
```bash
|
||
./scripts/staging-smoke.sh https://crank.example.com
|
||
```
|
||
|
||
## `authenticated-staging-smoke.sh`
|
||
|
||
Browser-authenticated smoke helper.
|
||
|
||
Обязательные переменные:
|
||
|
||
- `CRANK_STAGING_ADMIN_EMAIL`
|
||
- `CRANK_STAGING_ADMIN_PASSWORD`
|
||
|
||
```bash
|
||
CRANK_STAGING_ADMIN_EMAIL=owner@example.com \
|
||
CRANK_STAGING_ADMIN_PASSWORD=secret \
|
||
./scripts/authenticated-staging-smoke.sh https://crank.example.com
|
||
```
|
||
|
||
## `authenticated-product-smoke.sh`
|
||
|
||
Authenticated product smoke helper. Создает временную REST operation на
|
||
внутренний `admin-api` health endpoint, публикует агента, выпускает API-ключ и
|
||
проверяет MCP `tools/list` / `tools/call`. Внешние публичные API не используются.
|
||
|
||
Обязательные переменные:
|
||
|
||
- `CRANK_STAGING_ADMIN_EMAIL`
|
||
- `CRANK_STAGING_ADMIN_PASSWORD`
|
||
|
||
```bash
|
||
CRANK_STAGING_ADMIN_EMAIL=owner@example.com \
|
||
CRANK_STAGING_ADMIN_PASSWORD=secret \
|
||
./scripts/authenticated-product-smoke.sh https://crank.example.com
|
||
```
|
||
|
||
По умолчанию временные сущности удаляются после успешной проверки. Для отладки
|
||
можно оставить их в workspace:
|
||
|
||
```bash
|
||
CRANK_PRODUCT_SMOKE_KEEP_ASSETS=1 ./scripts/authenticated-product-smoke.sh https://crank.example.com
|
||
```
|
||
|
||
Smoke выполняет Admin test-run до publish и фиксирует точные Operation version
|
||
и Agent revision. Для split-port local stack можно передать `--mcp-base-url` и
|
||
пустой `--mcp-path-prefix`; `--summary-output` пишет bounded safe summary без
|
||
ключей, cookies и payloads.
|
||
|
||
## `check-rust-code-health.sh`
|
||
|
||
Проверяет базовые правила сопровождаемости Rust-кода:
|
||
|
||
- новые `.rs` файлы не больше 1000 строк;
|
||
- существующие крупные файлы не должны расти сверх текущего baseline;
|
||
- крупные inline test modules запрещены вне legacy allowlist.
|
||
|
||
```bash
|
||
./scripts/check-rust-code-health.sh
|
||
```
|
||
|
||
## `check-rust-boundaries.sh`
|
||
|
||
Проверяет направление зависимостей между Rust workspace crates:
|
||
|
||
- приложения из `apps/*` могут зависеть от crates, но не от других приложений;
|
||
- crates не должны зависеть от приложений;
|
||
- `crank-core` не зависит от runtime, registry и adapters;
|
||
- `crank-registry` не зависит от runtime и adapters;
|
||
- `crank-runtime` не зависит от registry.
|
||
|
||
```bash
|
||
./scripts/check-rust-boundaries.sh
|
||
```
|
||
|
||
## Typed runtime configuration contract
|
||
|
||
Единый Rust registry генерирует machine contract, sections `.env.example` и
|
||
таблицу параметров. Проверка drift не изменяет файлы:
|
||
|
||
```bash
|
||
cargo run -p crank-config --bin crank-config-contract -- --check
|
||
python3 scripts/check-runtime-config.py --root .
|
||
python3 scripts/check-config-boundaries.py --root .
|
||
```
|
||
|
||
После намеренного изменения registry artifacts обновляются через
|
||
`crank-config-contract --write`, просматриваются в diff и проверяются командой
|
||
`just config-contract-check`. Explicit `--files` у boundary checker-а
|
||
позволяет проверять новые/untracked Rust-файлы.
|
||
|
||
## Versioned migration contract
|
||
|
||
`just migration-contract-check` сравнивает canonical Rust migration sequence с
|
||
committed machine contract. PostgreSQL DDL вне `crank-registry::migrations`
|
||
блокируется Rust module boundary check.
|
||
|
||
Операторские auth-команды живут в том же `crank-migrate` binary и используют
|
||
database-only config projection:
|
||
|
||
```bash
|
||
crank-migrate admin-auth bootstrap-create --email owner@example.local
|
||
|
||
crank-migrate admin-auth recover \
|
||
--email owner@example.local \
|
||
--password-file /secure/new-admin-password.txt \
|
||
--password-pepper-file /secure/password-pepper.txt \
|
||
--master-key-file /secure/current-master.key
|
||
```
|
||
|
||
Команда создаёт одноразовый local bootstrap contract и выводит token для UI
|
||
`/login`; static startup password не является production bootstrap authority.
|
||
Recovery проверяет active master-key identity, заменяет verifier существующего
|
||
Admin account, отзывает browser sessions и не выводит password, pepper,
|
||
master key или Secret material.
|
||
|
||
## Typed metrics contract
|
||
|
||
`just metrics-contract-check` сверяет Rust registry с versioned JSON snapshot и
|
||
проверяет, что production-код объявляет метрики только через `crank-metrics`.
|
||
Checker распознаёт прямые macro calls, imports, aliases и re-exports; новые
|
||
Rust-файлы можно передать явно через `--files`.
|
||
|
||
## Unified execution boundary
|
||
|
||
`check-execution-boundaries.py` запрещает Admin/MCP route и service слоям
|
||
обходить typed `RuntimeExecutionRequest`: напрямую импортировать REST adapter,
|
||
Reqwest, legacy `execute_with_*` helpers или запускать execution через
|
||
persistence. Проверка видит tracked и untracked файлы, а explicit mode
|
||
fail-closed отклоняет missing, symlink и path escape:
|
||
|
||
```bash
|
||
python3 scripts/check-execution-boundaries.py --root .
|
||
python3 scripts/check-execution-boundaries.py --root . --files <paths...>
|
||
```
|
||
|
||
Canonical composition roots создают adapters, но продуктовые Admin Draft Test
|
||
и MCP snapshot calls проходят только через единый runtime outcome contract.
|
||
|
||
## `check-community-scope.sh`
|
||
|
||
Проверяет, что в community-репозиторий не попали функции и тексты за пределами
|
||
REST -> MCP сценария.
|
||
|
||
```bash
|
||
./scripts/check-community-scope.sh
|
||
```
|
||
|
||
Unit-тесты checker-а лежат в `tests/unit`:
|
||
|
||
```bash
|
||
python3 -m unittest discover -s tests/unit
|
||
```
|
||
|
||
Новые или ещё не tracked файлы по умолчанию не видны wrapper-у. Перед handoff
|
||
передайте только файлы текущего изменения явно:
|
||
|
||
```bash
|
||
python3 scripts/check-community-scope.py --root . --files <paths...>
|
||
```
|
||
|
||
## `validate-capability-inventory.py`
|
||
|
||
Проверяет canonical `docs/capability-inventory.json` по versioned schema,
|
||
обязательным FR, Community boundary и существующим evidence-ссылкам:
|
||
|
||
```bash
|
||
python3 scripts/validate-capability-inventory.py \
|
||
--root . \
|
||
--inventory docs/capability-inventory.json \
|
||
--schema docs/schemas/capability-inventory.schema.json \
|
||
$(for n in $(seq 1 54); do printf -- '--required-fr FR-%s ' "$n"; done)
|
||
```
|
||
|
||
Статусы `planned`, `gap` и `blocked` валидны, но не считаются pass.
|
||
|
||
## Capability baseline tools
|
||
|
||
`collect-capability-baseline.py` принимает только allowlisted command reports
|
||
или bounded Playwright JSON, вычисляет verdict и удаляет raw output, paths и
|
||
attachments. Retry-pass становится `flaky`, а skipped/missing/non-zero result
|
||
не становится pass.
|
||
|
||
```bash
|
||
python3 scripts/collect-capability-baseline.py playwright \
|
||
--report <temporary-report.json> \
|
||
--output <candidate.json> \
|
||
--source-revision <git-sha> \
|
||
--environment-class community-test \
|
||
--flow-id ui-operation-lifecycle
|
||
```
|
||
|
||
После review candidate и обновления canonical artifacts пересчитайте exact-byte
|
||
SHA-256 в manifest и запустите:
|
||
|
||
```bash
|
||
python3 scripts/validate-capability-baseline.py \
|
||
--root . \
|
||
--manifest docs/capability-baseline/manifest.json \
|
||
--schema docs/schemas/capability-baseline.schema.json
|
||
```
|