Quickstart
# Внутри Nova-проекта (рядом есть nova.toml):
nova check # type-check всего workspace
nova check src/ # рекурсивно по директории
nova check src/lib.nv # одиночный файл
nova run hello.nv # запустить через интерпретатор
nova build app.nv -o app # скомпилировать в native binary
nova test # запустить все nova_tests/
nova test --filter basics # подмножество по подстроке
nova doc src/lib.nv # markdown в stdout
nova doc src/ --format json # JSON-схема D107
nova doc src/ --check --strict # CI-валидация документации
nova bench run bench.nv # запустить бенчмарки
nova contracts verify foo.nv # SMT-верификация контрактов
Установка и сборка
nova-cli живёт в nova-cli/ рядом с compiler-codegen/. Оба crate самостоятельные (workspace не используется).
# Debug-сборка (default, opt-level=0)
cargo build --manifest-path nova-cli/Cargo.toml
# Release (opt-level=2, LTO thin)
cargo build --release --manifest-path nova-cli/Cargo.toml
# С Z3-бэкендом для контрактов (Plan 33.1)
cargo build --release --manifest-path nova-cli/Cargo.toml --features z3-backend
Результаты сборки:
nova-cli/target/{debug,release}/nova[.exe]nova-cli/target/{debug,release}/migrate_plan60[.exe]nova-cli/target/{debug,release}/migrate_plan65[.exe]
nova имеет path-зависимость на nova_codegen (../compiler-codegen) — rebuild compiler автоматически перекомпилирует CLI.
Глобальные флаги
Применяются ко всем субкомандам:
| Флаг | Значения | Описание |
|---|---|---|
--color | auto (default), always, never | Управление ANSI-цветами. |
Авто-детект цвета (priority high → low):
- CLI
--color always|never— принудительно CLICOLOR_FORCE=1→ alwaysNO_COLOR(любое значение) → neverCLICOLOR=0→ neverCI=true→ neverTERM=dumb→ never- По умолчанию — включено
Коды выхода
| Код | Значение |
|---|---|
0 | Успех |
1 | Диагностическая ошибка (тип-чек fail, тест fail, contract violation, etc.) |
2 | Usage error (неверный флаг, файл не найден, не .nv, нет nova.toml) |
101 | Internal panic |
nova doc --diff дополнительно использует 3 = patch-level breaking change. См. nova doc.
Поиск корня проекта
Большинство команд ищут nova.toml снизу вверх от CWD (workspace-aware, D78 AD6):
- Идём от CWD вверх до filesystem root.
- На каждом уровне читаем
nova.tomlесли есть. - Если в нём есть
[workspace]— это корень, останавливаемся. - Иначе запоминаем последний найденный
nova.tomlи идём дальше. - Возвращаем workspace root если найден; иначе — самый верхний
nova.toml.
Защищает от ситуации «вложенный nova_tests/nova.toml затмил основной». Если nova.toml не найден — exit 2:
error: nova.toml not found — are you inside a Nova project?
Пути, резолвящиеся под workspace root: nova_tests/, std/, compiler-codegen/, target/last-test-results.json.
nova check
Type-check одного или нескольких .nv файлов / директорий.
nova check [PATHS...] [--jobs N] [-q|-v] [--list] [--format human|short]
[--include-runtime] [--skip PATTERN]...
| Флаг | По умолчанию | Описание |
|---|---|---|
PATHS | workspace root | Файлы или директории. Пусто = workspace root (рекурсивно). |
--jobs N | 0 (= num_cpus) | Параллельных воркеров. |
-q, --quiet | off | Только FAIL-строки и summary. |
-v, --verbose | off | Дополнительная информация (timing). |
--list | off | Показать список файлов, не проверяя. |
--format | human | human (цветной) или short (file:line:col: msg). |
--include-runtime | off | Включить std/runtime/ (auto-gen, по умолчанию пропускается). |
--skip PATTERN | [] | Пропустить файлы по substring (repeatable). |
Всегда пропускаются: target/, node_modules/, vendor/, .git/, .hg/, .svn/, директории начинающиеся с _ или ., std/runtime/.
Summary: pass=N fail=N warnings=N (X.YYs). Exit 1 при наличии FAIL.
nova run
Запустить .nv-файл через интерпретатор (без компиляции в C).
nova run FILE
FILE — путь к .nv-файлу с fn main.
nova build
Скомпилировать один .nv-файл в native binary (через C-backend).
nova build FILE [-o OUTPUT] [--mode dev|release] [--toolchain auto|clang|msvc|gcc]
[--vcvars PATH] [--clang PATH] [--timeout SECS] [--keep-artifacts]
[--mono-depth N]
| Флаг | По умолчанию | Описание |
|---|---|---|
FILE | — | Entry-point .nv с fn main. |
-o OUTPUT | <name>[.exe] в CWD | Путь к выходному бинарнику. |
--mode | dev | dev (unoptimized) или release (-O2 + LTO). |
--toolchain | auto | auto (Clang → MSVC → GCC), clang, msvc, gcc. |
--vcvars | auto via vswhere | Путь к vcvars64.bat (Windows). |
--clang | auto detect | Путь к clang.exe. |
--timeout | 120 | Таймаут компиляции в секундах. |
--keep-artifacts | off | Не удалять .c/.exe/.obj в tmp. |
--mono-depth N | 500 | Лимит monomorphization-инстанциаций. |
Только один файл за раз. Для multi-file проектов используй import внутри entry-point.
Pipeline: parse + typecheck + infer_effects → C emit → toolchain detect → libuv detect/build → compile → copy → cleanup tmp.
nova test
Запуск тестов из директории или файла.
nova test [PATH] [--filter SUBSTR] [--jobs N] [--format text|json|tap|junit]
[--mode dev|release] [--toolchain auto|clang|msvc|gcc]
[--vcvars PATH] [--clang PATH] [--timeout SECS] [-v|-q]
[--results-file PATH] [--rerun-failed] [--retries N]
[--include-stdlib] [--keep-artifacts] [--gc boehm|malloc]
[--list] [--filter-from PATH] [--shuffle [SEED]]
[--skip PATTERN]... [--mono-depth N]
| Флаг | По умолчанию | Описание |
|---|---|---|
PATH | <root>/nova_tests/ | Файл или директория с тестами. |
--filter SUBSTR | — | Фильтр по display-name (substring). |
--jobs N | 0 (= num_cpus) | Параллельные воркеры. |
--format | text | text, json, tap, junit. |
--mode | dev | dev или release. |
--toolchain | auto | См. nova build. |
--timeout | 60 | Per-test timeout (секунды). |
-v, --verbose | off | Вывод проходящих тестов. |
-q, --quiet | off | Только FAIL + summary. |
--results-file PATH | <root>/target/last-test-results.json | Куда писать результаты. |
--rerun-failed | off | Перезапустить только failed/timed-out из последнего прогона. |
--retries N | 0 | Повторов на transient-фейлах. |
--include-stdlib | off | Включить std/. |
--keep-artifacts | off | Не удалять .c/.exe/.obj. |
--gc | boehm | boehm (default) или malloc. |
--list | off | Список тестов без запуска. |
--filter-from PATH | — | Файл с именами тестов (по одному на строку, exact match). |
--shuffle [SEED] | off | Случайный порядок; опц. seed для воспроизводимости. |
--skip PATTERN | [] | Пропустить тесты по substring имени или пути (repeatable). |
--mono-depth N | 500 | Лимит mono-instantiation. |
Форматы вывода: text (человекочитаемый, цветной), json (массив с name/status/duration_ms/stderr), tap (TAP v13), junit (JUnit XML для CI-агрегаторов).
EXPECT-маркеры в тестовых файлах:
// EXPECT: <stdout-line>— точное совпадение строки// EXPECT_STDERR: <line>— для stderr// EXPECT_COMPILE_ERROR: <substring>— должно упасть при компиляции// EXPECT_RUNTIME_ERROR: <substring>— panic с подстрокой// REQUIRES_SMT_BACKEND— пропуск если SMT недоступен
nova test-build
Build + run одного тестового файла. Используется IDE / CI для точечной отладки.
nova test-build FILE [--mode dev|release] [--toolchain auto|clang|msvc|gcc]
[--vcvars PATH] [--clang PATH] [--timeout SECS]
[--keep-artifacts] [--gc boehm|malloc] [--mono-depth N]
Эквивалентно nova test <FILE>, но без machinery для bulk-runner'а. Дефолты: --timeout 60, --gc boehm, --mono-depth 500.
nova regen-runtime
Регенерация std/runtime/*.nv стабов из compiler-runtime реестра. Заменяет regen_runtime.ps1.
nova regen-runtime [--check]
| Флаг | По умолчанию | Описание |
|---|---|---|
--check | off | Только сравнить — exit 1 если файлы расходятся с реестром (CI guard). |
nova doc
Production-grade документация (Plan 45 / D107). Markdown / JSON / HTML + doc-tests + coverage + mutation testing + watch + workspace-mode.
nova doc [FILE] [--format markdown|json|html] [--json-schema]
[--include-private] [--test] [--check] [--watch]
[--coverage [--coverage-threshold PERCENT]] [--jobs N]
[--diff OLD NEW] [--scrape-examples WORKSPACE]
[--strict] [--mutate-contracts [--real-exec]]
[--output-dir DIR]
| Флаг | По умолчанию | Описание |
|---|---|---|
FILE | — (обязателен кроме --json-schema) | .nv файл или директория. |
--format | markdown | markdown, json (D107 schema), html. |
--json-schema | off | Вывести встроенную JSON Schema 2020-12 и выйти. |
--include-private | off | Включить non-exported items. |
--test | off | Запустить doc-tests. |
--check | off | Валидировать без рендера (broken links, missing summaries). |
--watch | off | Re-render по mtime-poll (500 мс); Ctrl-C для выхода. |
--coverage | off | Метрики coverage (% items with summary). |
--coverage-threshold N | — | CI-gate: exit 1 если coverage% < N. |
--jobs N | 0 (= num_cpus) | Параллельных parse-jobs для workspace. |
--diff OLD NEW | — | Сравнить два JSON-вывода (semver detection). |
--scrape-examples WORKSPACE | — | Привязать top-3 usage examples к каждой fn. |
--strict | off | Warnings → errors (CI). |
--mutate-contracts | off | Mutation testing для contracts. |
--real-exec | off | Реально исполнять mutants (требует --mutate-contracts). |
--output-dir DIR | — | Multi-page HTML; только с --format html. |
Exit-коды для --diff OLD NEW:
| Код | Значение |
|---|---|
0 | Нет breaking changes |
1 | Major change (breaking) |
2 | Minor change (additive) |
3 | Patch change (cosmetic) |
Mutation testing (--mutate-contracts): генерирует мутанты для каждой функции с контрактами (>↔>=, ==↔!=, дроп requires/ensures). Default — text heuristic (~1 мс/мутант). С --real-exec — запускает мутированные doc-tests (~100 мс/мутант, true positive guarantee).
Doc-комментарии
Используются два вида:
///(outer) — относится к следующей декларации.//!(inner) — относится к module целиком.
//! Модульный doc — описание всего файла.
module my.module
/// Краткое summary в одно предложение.
///
/// Длинное описание ниже. Может занимать несколько строк.
///
/// # Examples
///
/// ```nova
/// let x = double(3)
/// assert(x == 6)
/// ```
export fn double(x int) -> int => x * 2
Секции
Распознаются стандартные секции (D107, fixed order):
| Секция | Назначение |
|---|---|
# Examples | Примеры использования. ```nova блоки — doc-tests. |
# Errors | Какие Fail[X] функция может вернуть. |
# Panics | Условия runtime panic. |
# Safety | Invariants для unsafe-вызывающих. |
# Effects | Список effects (если не очевиден из signature). |
# Contracts | Pre/post-conditions. |
# Since | Версия, с которой fn появилась. |
# See also | Cross-references. |
# Deprecated | Причина + рекомендация замены. |
Другие # Heading сохраняются в текущей секции как часть text'а.
Intra-doc ссылки
/// Возвращает [Point] для координаты.
/// См. также [translate] и [std.math.abs].
Резолвинг:
[Name]— short-match по item-id.[Type.method]— короткая форма метода.[mod.path.Name]— fully-qualified.
Broken links → target_id: null в JSON и сообщение от nova doc --check.
Doc-тесты
```nova-блоки в doc'е — это doc-tests, исполняемые nova doc --test.
Модификаторы
```nova,no_run — компилируется, не запускается
```nova,ignore — не компилируется (только display)
```nova,compile_fail — ожидается compile-error
```nova,should_panic — ожидается runtime panic
```nova,must_verify — ожидается successful SMT verify
Можно комбинировать: ```nova,no_run,ignore.
Скрытые строки
Строки # code скрыты в визуальном выводе, но включаются в компиляцию:
/// ```nova
/// # import std.io
/// let r = compute()
/// assert(r == 42)
/// ```
Стабильность и deprecation
Через секции (version-based):
/// API.
///
/// # Since
///
/// 1.0.0
export fn add(a int, b int) -> int => a + b
# Since >= 1.0 → stability.tier = "stable", иначе unstable.
Через doc-attrs (D96 синтаксис #name(...) — пишется отдельной строкой между doc-comment'ом и item'ом, не внутри ///):
/// Экспериментальное API.
#experimental(note = "may change in 0.5")
#since("0.3.0")
export fn experimental_api() -> int => 0
| Атрибут | Параметры |
|---|---|
#deprecated(since = "X", note = "...", until = "Y"?) | since/note обязательны, until опционален |
#since("X.Y") или #since(version = "X.Y") | версия появления |
#stable или #stable(since = "X.Y") | stable API |
#unstable(feature = "name") | за named feature-флагом |
#experimental(note = "..."?) | proof-of-concept |
#hide_doc | item exported, но скрыт из nova doc |
#doc_alias("alt", ...) | search-aliases |
#doc(inline) / #doc(no_inline) | re-export rendering |
#doc(summary = "...") | override автосаммари |
#deprecated приоритетнее, чем # Deprecated section.
JSON-вывод
D107 schema v1. Ключи в алфавитном порядке, byte-for-byte deterministic. Top-level fields:
format_version: 1nova_version: "0.1.0"generated_at— опускается по умолчанию; управляется черезNOVA_DOC_GENERATED_ATилиSOURCE_DATE_EPOCH.doc_tests[]— извлечённые```novaблоки.links[]— intra-doc-links (resolved + broken).modules[]— DocModule entries.items[]— DocItem entries (fn/type/const/effect/protocol).
Полная спецификация: nova doc --json-schema.
jq-рецепты
# Список всех public fn с summary
nova doc src/api.nv --format json \
| jq '[.items[] | select(.kind=="fn" and .visibility=="export") | {id,summary}]'
# Все items без summary (не задокументированные)
nova doc src/api.nv --format json \
| jq '[.items[] | select(.summary == null) | .id]'
# Все #unstable или #experimental items
nova doc src/api.nv --format json \
| jq '[.items[] | select(.stability.tier != null and .stability.tier != "stable") | {id, tier: .stability.tier}]'
# Все #deprecated items с заменой
nova doc src/api.nv --format json \
| jq '[.items[] | select(.deprecation != null) | {id, note: .deprecation.note}]'
# Функции с @realtime
nova doc src/api.nv --format json \
| jq '[.items[] | select(.capabilities.realtime==true) | .id]'
# Функции с SMT-контрактами (Proven)
nova doc src/api.nv --format json \
| jq '[.items[] | select(.signature?.verify_status=="proven") | .id]'
# Все re-exports (doc_inline=true)
nova doc src/api.nv --format json \
| jq '[.items[] | select(.kind=="reexport" and .doc_inline==true) | {id, source: .reexport_from}]'
# Items с scraped examples
nova doc src/api.nv --format json --scrape-examples . \
| jq '[.items[] | select(.scraped_examples | length > 0) | {id, count: (.scraped_examples | length)}]'
# Все broken intra-doc links (target_id == null)
nova doc src/api.nv --format json \
| jq '[.links[] | select(.target_id == null) | .text]'
# Семver diff: список major changes
nova doc --diff old.json new.json 2>&1 | grep '\[major\]'
CI-интеграция
# Проверить, что doc валиден (broken links, missing summaries)
nova doc src/api.nv --check
# Прогнать doc-tests (exit 1 на failure)
nova doc src/api.nv --test
# Reproducible builds
SOURCE_DATE_EPOCH=1700000000 nova doc src/api.nv --format json > api.json
Стиль (§11.5)
- Первое предложение — summary, терминатор
.. - Imperative mood: "Returns X" а не "This function returns X".
- Fixed section order (см. таблицу выше).
- Markdown subset: CommonMark +
```novafenced blocks. - Examples обязательны для public fn.
- Deprecation note содержит замену +
# Since. - Stability tiers: stable / unstable / experimental.
nova doc-query
DSL-запросы к JSON-выводу nova doc --format json (Plan 45). Фундамент для MCP-сервера.
nova doc-query JSON_FILE [QUERY]
Синтаксис query: key=value,key=value,...
| Ключ | Значения |
|---|---|
kind | fn, type, effect, protocol, module, … |
name | substring |
module | exact module path |
module-prefix | префикс пути |
capability | capability-name |
effect | effect-name |
has-contracts | true, false |
verified | true, false |
stability | stable, unstable, experimental |
deprecated | true, false |
nova doc src/ --format json > out.json
nova doc-query out.json "kind=fn,capability=pure"
nova doc-query out.json "name=add,has-contracts=true"
nova doc-query out.json "module-prefix=std,effect=Fs"
Пустой query → весь файл as-is.
nova doc-mcp
MCP-сервер (Model Context Protocol) — JSON-RPC over stdio или HTTP. Совместим с MCP-клиентами (Claude Code, MCP Inspector).
nova doc-mcp FILE [--port PORT]
| Флаг | По умолчанию | Описание |
|---|---|---|
FILE | — | .nv-исходник или pre-generated .json. |
--port PORT | — (stdio) | HTTP-режим на 127.0.0.1:PORT, POST /mcp. |
Tools (через tools/list):
query_items(query)— поиск через DSL (см. nova doc-query)list_modules()— список module-путейget_item(item_id)— полный JSON одного item
Protocol: MCP-клиент шлёт initialize → tools/list → tools/call.
nova contracts
Инспекция и верификация контрактов (Plan 33 / D24). Output — JSON (AI-friendly schema, см. docs/contracts-diag-schema.json).
nova contracts list
Список всех контрактов в файле.
nova contracts list FILE
nova contracts verify
SMT-верификация контрактов. Z3-бэкенд требует build с --features z3-backend.
nova contracts verify FILE [--backend BACKEND]
| Флаг | По умолчанию | Описание |
|---|---|---|
FILE | — | .nv файл. |
--backend BACKEND | env NOVA_SMT_BACKEND | Override SMT-backend: trivial, z3. |
nova contracts suggest
AI-assisted предложения для контрактов (стабы).
nova contracts suggest FILE FN_NAME
nova contracts counterexample
Контрпример для падающего контракта.
nova contracts counterexample FILE FN_NAME [--contract-id N]
| Флаг | По умолчанию | Описание |
|---|---|---|
FN_NAME | — | Имя функции. |
--contract-id N | 0 | Индекс контракта (0-based). |
nova bench
Бенчмарк-инфраструктура (Plan 57). Субкоманды:
run · diff · gate · calibrate · cpu-instr-check · membw-check · hyperfine · callgrind · callgrind-check · runner-branch · history-anomalies / history-add / history-list / history-squash · remote · corpus · dashboard
nova bench run
Запустить bench "..." { measure { ... } } декларации в файле.
nova bench run FILE [--filter PATTERN] [--samples N] [--warmup-ms MS]
[--time-budget SECS] [--gc boehm|malloc]
[--mode release|dev] [--toolchain auto|clang|msvc|gcc]
[--compile-timeout SECS] [--run-timeout SECS]
[--keep-artifacts] [--mono-depth N]
[--out PATH] [--out-csv PATH] [--out-md PATH]
[--out-criterion DIR] [--profile MODE OUT]
[--histogram]
| Флаг | По умолчанию | Описание |
|---|---|---|
FILE | — | .nv файл с bench "..." блоками. |
--filter PATTERN | — | Comma-separated bench-name fragments. |
--samples N | 100 | Override sample count. |
--warmup-ms | 500 | Warmup duration в мс. |
--time-budget | 10 | Per-bench бюджет в секундах. |
--gc | boehm | GC-режим. |
--mode | release | release (рекомендуется) или dev. |
--toolchain | auto | См. nova build. |
--compile-timeout | 120 | Таймаут компиляции. |
--run-timeout | 600 | Таймаут запуска bench-процесса. |
--out PATH | — | Записать JSON v1. |
--out-csv PATH | — | Записать CSV. |
--out-md PATH | — | Markdown (для PR comment). |
--out-criterion DIR | — | Criterion-compatible JSON layout. |
--profile MODE OUT | — | cpu / heap / gc profile. |
--histogram | off | ASCII-гистограмма на каждый bench. |
Output-форматы: --out (JSON v1 с git SHA, toolchain, CPU model); --out-criterion (<dir>/<name>/new/{estimates,sample,benchmark}.json); --out-md (markdown-таблица для PR); --histogram (40 buckets, Unicode blocks, медиана + Tukey fences).
Profile-режимы: cpu — заворачивает в samply (нужен cargo install samply); heap — NOVA_BENCH_HEAP_SAMPLE_MS=10; gc — NOVA_BENCH_GC_TRACE=1.
nova bench diff
Сравнение двух bench-результатов. Welch's t-test, geomean delta, reproducibility check.
nova bench diff BASELINE NEW [--format terminal|markdown|json]
[--explain [--ai-config PATH] [--ai-max-tokens N] [--ai-dry-run]]
[--baseline-sha SHA] [--new-sha SHA]
| Флаг | По умолчанию | Описание |
|---|---|---|
BASELINE, NEW | — | JSON-файлы из nova bench run --out. |
--format | terminal | terminal, markdown, json. |
--explain | off | AI-интерпретация regressions (opt-in). |
--ai-config PATH | ~/.nova-ai.toml | Путь к AI-конфигу. |
--ai-max-tokens | 4000 | Override max tokens. |
--ai-dry-run | off | Печатает request body без API call. |
--explain использует system curl и требует NOVA_AI_API_KEY или конфиг.
nova bench gate
CI-gate: применяет пороги из bench.toml. Exit 0 = pass, 1 = regression.
nova bench gate BASELINE NEW [--config PATH] [--noise PATH]
| Флаг | По умолчанию | Описание |
|---|---|---|
--config | ./bench.toml | Путь к bench.toml. |
--noise | ./.nova-bench-noise.json если есть | Auto-calibrated noise-floor (см. calibrate). |
nova bench calibrate
Авто-калибровка noise-floor из ≥2 повторных прогонов того же baseline.
nova bench calibrate RUNS... [--out PATH]
| Флаг | По умолчанию | Описание |
|---|---|---|
RUNS... | — | ≥2 JSON-результата одного и того же source. |
--out | .nova-bench-noise.json | Куда записать noise-floor. |
Файл machine-specific; в git добавлять не нужно.
nova bench cpu-instr-check
Диагностика доступности CPU-instruction-counter. Linux: проверяет perf_event_open. Other OS: stub.
nova bench cpu-instr-check
nova bench membw-check
Диагностика memory-bandwidth measurement. Linux: probes /sys/devices/uncore_imc_*. Other OS: stub.
nova bench membw-check
nova bench hyperfine
Hyperfine-style cross-binary timing. Output совместим с nova bench diff.
nova bench hyperfine SPECS... [--warmup N] [--samples N]
[--timeout SECS] [--workdir PATH] [--out PATH]
| Флаг | По умолчанию | Описание |
|---|---|---|
SPECS... | ≥1 | "name=binary args..." или просто "binary args...". |
--warmup | 3 | Warmup runs (отбрасываются). |
--samples | 10 | Sample runs. |
--timeout | 300 | Per-command timeout. |
--workdir PATH | — | CWD для команд. |
--out PATH | stdout | JSON output. |
nova bench hyperfine \
"old=./nova-old build large.nv" \
"new=./nova-new build large.nv" \
--samples 10 --warmup 2 --out result.json
nova bench callgrind
Запуск под Valgrind Callgrind — deterministic CPU-instructions count. Работает на macOS + Linux при наличии valgrind.
nova bench callgrind BINARY [ARGS...] [--cache-sim] [--workdir PATH] [--out PATH]
| Флаг | По умолчанию | Описание |
|---|---|---|
BINARY | — | Путь к executable. |
--cache-sim | off | I1/D1/LL miss counts (медленнее). |
--workdir PATH | — | CWD для команды. |
--out PATH | — | JSON CallgrindResult. |
nova bench callgrind-check — проверить наличие и версию valgrind.
nova bench runner-branch — рекомендованное имя history-branch на основе NOVA_BENCH_RUNNER_ID (возвращает bench-history или bench-history-<id>).
nova bench remote
SSH-distributed bench coordination.
nova bench remote list [--config PATH] # список remotes
nova bench remote ping NAME [--config PATH] # SSH health-check
nova bench remote run BENCH [--remotes LIST] [--gather-into DIR] [--sha SHA] [--config PATH]
Remote config: ~/.nova-bench-remotes.toml (override через NOVA_BENCH_REMOTES).
nova bench corpus PATH — per-pass compile time. Флаги: --json, --html PATH, --echarts-url URL, --mode, --toolchain, --gc.
nova bench history
Управление orphan history-branch для CI regression tracking.
# Добавить результат в history-branch
nova bench history-add RESULT [--branch BRANCH] [--push] [--remote NAME] [--dry-run]
# Список entries (newest first)
nova bench history-list [--branch BRANCH]
# Squash старых entries по дате (рекомендуется ежегодно)
nova bench history-squash --before-date YYYY-MM-DD [--branch BRANCH] [--push] [--remote NAME] [--dry-run]
# Детекция changepoints в historical median time-series (PELT)
nova bench history-anomalies [--branch BRANCH] [--format text|json]
Default history branch: bench-history (или bench-history-<NOVA_BENCH_RUNNER_ID> для multi-runner CI).
nova bench dashboard
Статический HTML dashboard из history.
nova bench dashboard [--history-branch BRANCH] [--out DIR] [--max-entries N] [--echarts-url URL]
| Флаг | По умолчанию | Описание |
|---|---|---|
--history-branch | auto | History branch. |
--out | dashboard | Output directory. |
--max-entries | 200 | Max entries (newest first). |
--echarts-url | jsdelivr URL | Custom echarts URL (offline = local). |
Генерирует index.html + bench-<safe>.html per bench + data.json.
Переменные окружения
| Переменная | Используется в | Эффект |
|---|---|---|
NOVA_MONO_DEPTH | build, test, test-build, bench | Лимит monomorphization-инстанциаций (default 500). |
NOVA_SMT_BACKEND | contracts | SMT-backend (trivial, z3). |
NOVA_PERF_TIMER | bench corpus (auto-set) | Включает __PERF__ маркеры в компиляторе. |
NOVA_PERF_TIMER_AGGREGATE | bench corpus | Aggregate __PERF__ по проходам. |
NOVA_BENCH_RUNNER_ID | bench history-*, runner-branch | Multi-runner CI matrix; используется в branch name. |
NOVA_BENCH_REMOTES | bench remote | Override пути к .nova-bench-remotes.toml. |
NOVA_BENCH_FILTER | bench run (auto-set) | Forwarded в bench-процесс. |
NOVA_BENCH_SAMPLES | bench run (auto-set) | Override sample count. |
NOVA_BENCH_WARMUP_NS | bench run (auto-set) | Warmup в наносекундах. |
NOVA_BENCH_TIME_BUDGET_NS | bench run (auto-set) | Time budget в наносекундах. |
NOVA_BENCH_HEAP_SAMPLE_MS | bench run --profile heap | Sample interval в мс. |
NOVA_BENCH_GC_TRACE | bench run --profile gc | Включает GC tracing. |
NOVA_AI_PROVIDER | bench diff --explain | AI-provider (anthropic, openai, …). |
NOVA_AI_MODEL | bench diff --explain | Модель override. |
NOVA_AI_API_KEY | bench diff --explain | API key (или ~/.nova-ai.toml). |
NO_COLOR | global | Отключить ANSI цвета. |
CLICOLOR | global | =0 → отключить. |
CLICOLOR_FORCE | global | =1 → принудительно включить. |
CI | global | =true → отключить цвета. |
TEMP | Windows | Tmp-директория для build/test artifacts. |
TMPDIR | Unix | То же. |
Migration-бинарники
Одноразовые lexer-based инструменты в nova-cli/src/bin/. Хранятся в репозитории как reference для будущих атомарных API-rename планов.
migrate_plan60
Миграция field-style size-accessors в method-form (D117 / Plan 60):
| До | После |
|---|---|
expr.len | expr.len() |
expr.is_empty | expr.is_empty() |
expr.byte_len | expr.byte_len() |
expr.cap | expr.capacity() |
expr.capacity | expr.capacity() |
migrate_plan60 [--apply] [--dry-run] [--md] [--paths DIR...]
| Флаг | По умолчанию | Описание |
|---|---|---|
--dry-run | (default) | Только показать diff. |
--apply | off | Реально записать. |
--md | off | Включить .md файлы (rewrite внутри ```nova / ```nv блоков). |
--paths DIR... | std/, nova_tests/, examples/ | Список директорий. |
Skip condition: предыдущий значимый token == = (method-value assignment). Комментарии / whitespace / formatting сохраняются 1:1.
migrate_plan65
Миграция Time.after(<lit>) → ChanReader.close_after(Duration.from_*(<lit>)) (Plan 65 AD11):
| До | После |
|---|---|
Time.after(<INT>) | ChanReader.close_after(Duration.from_millis(<INT>)) |
Time.after(<FLOAT>) | ChanReader.close_after(Duration.from_secs_f64(<FLOAT>)) |
Time.after(<expr>) | без изменений + // MIGRATE_MANUAL: Plan 65 — non-literal arg |
migrate_plan65 [--apply] [--dry-run] [--md] [--paths DIR...]
Специальные exit-коды:
| Код | Значение |
|---|---|
0 | Изменений не требуется (idempotent). |
1 | Emitted manual markers — CI gate fails. |
2 | Изменения применены (или были бы применены в dry-run). |