Nova CLI

nova — единая точка входа в инструментарий языка Nova. Заменяет run_tests.ps1 / run_tests.sh / regen_runtime.ps1 (см. Plan 28).

Версия: 0.1.0 (bootstrap). Бинарник публикуется как nova (Cargo package nova, crate nova-cli).


Quickstart

# Внутри Nova-проекта (рядом есть nova.toml). Модули лежат в корне
# пакета — директории `src/` нет (D78).
nova check                       # type-check всего workspace
nova check encoding/             # рекурсивно по директории
nova check lib.nv                # одиночный файл

nova build app.nv -o app         # скомпилировать в native binary (так и запускают код)
./app                            # затем выполнить его
nova add mathlib --path ../mathlib   # добавить зависимость, обновить nova.lock
nova info mathlib                # effect-surface зависимости
nova test nova_tests             # компиляция + запуск всех nova_tests/
nova test nova_tests/plan118     # один поддиректорий
nova test std nova_tests         # несколько путей: std/ + nova_tests/
nova test --filter basics        # подмножество по подстроке

nova doc lib.nv                  # markdown в stdout
nova doc . --format json         # JSON-схема D107
nova doc . --check --strict      # CI-валидация документации

nova bench run bench.nv          # запустить бенчмарки
nova contracts verify foo.nv     # SMT-верификация контрактов

Интерпретатора нет. Nova компилируется в C — команды nova run для запуска нет. Чтобы выполнить программу — nova build, затем запусти бинарник; для тестов — nova test. См. nova run ниже.


Установка и сборка

nova-cli живёт в nova-cli/ рядом с compiler-codegen/. Workspace не используется (см. Plan 28 — оба crate самостоятельные).

# 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.


Глобальные флаги

Применяются ко всем субкомандам:

ФлагЗначенияОписание
--colorauto (default), always, neverУправление ANSI-цветами. См. Plan 36 R10.

Авто-детект цвета (priority high → low):

  1. CLI --color always|never — принудительно
  2. CLICOLOR_FORCE=1 → always
  3. NO_COLOR (любое значение) → never (no-color.org)
  4. CLICOLOR=0 → never
  5. CI=true → never
  6. TERM=dumb → never
  7. По умолчанию — включено

Тюнинг field-cache (advanced)

Каждая субкоманда также принимает «ручки» field-caching из Plan 123. Это forensic / escape-hatch флаги — дефолты корректны для обычного использования; трогать их нужно только при расследовании регрессии codegen-кэша.

ФлагЭффект
--no-field-cacheПолностью выключить field caching (== NOVA_FIELD_CACHE=0)
--no-field-cache-licmВыключить фазу LICM (D218)
--no-field-cache-pureВыключить фазу pure-call cache (D219)
--no-field-cache-chainВыключить фазу chain cache (D217 V4)
--no-field-cache-ipaВыключить IPA-refinements (D223 V7.1)
--field-cache-threshold NМин. чтений @field для кэша (default 2)
--field-cache-licm-threshold NМин. чтений внутри цикла (default 2)
--field-cache-pure-threshold NМин. вызовов @method() (default 2)
--field-cache-chain-threshold NМин. вхождений цепочки (default 2)
--field-cache-max NCap на функцию по всем слоям (default 8)
--field-cache-licm-max NCap на цикл для LICM (default 4)
--field-cache-chain-depth NМакс. глубина цепочки (default 4, min 2)
--field-cache-ipa-iter NCap итеративного замыкания IPA (default 10)

nova check дополнительно открывает --explain-cache, --telemetry-cache, --telemetry-json, --telemetry-baseline FILE, --telemetry-gate-affected-drop F и --telemetry-gate-caches-drop F для отчётов по кэш-анализу и CI-gate против регрессий.

Field-cache флаги опущены в per-command таблицах ниже ради читаемости; считай, что их полное семейство принимает каждая команда.


Коды выхода

Cargo-конвенция (Plan 36 R7):

КодЗначение
0Успех
1Диагностическая ошибка (тип-чек fail, тест fail, contract violation, etc.)
2Usage error (неверный флаг, файл не найден, не .nv, нет nova.toml)
101Internal panic (через std::panic::set_hook для cross-platform consistency)

nova doc --diff дополнительно использует 3 = patch-level breaking change (см. nova doc).


Поиск корня проекта

Большинство команд ищут nova.toml снизу вверх от CWD. Логика вынесена в nova_codegen::test_runner::find_repo_root_from:

  1. Идём от CWD вверх до filesystem root
  2. На каждом уровне читаем nova.toml если есть
  3. Если в нём есть [workspace] — это и есть корень (workspace root), останавливаемся
  4. Иначе запоминаем последний найденный nova.toml и идём дальше
  5. Если найден корень с [workspace] — возвращаем его, иначе — самый верхний nova.toml

Это workspace-aware поведение (D78 AD6, Plan 35) — защищает от ситуации «вложенный nova_tests/nova.toml затмил основной».

Если nova.toml не найден — exit 2:

error: nova.toml not found — are you inside a Nova project?

Под workspace root резолвятся:

  • <root>/nova_tests/ — корпус тестов
  • <root>/std/ — стандартная библиотека
  • <root>/compiler-codegen/ — include-пути C-runtime
  • <root>/compiler-codegen/nova_rt/ — runtime sources (libuv, GC)
  • <root>/target/last-test-results.json — кеш --rerun-failed

Команды

nova check

Type-check одного или нескольких .nv файлов / директорий. Plan 36 MVP — заменяет nova-codegen check.

nova check [PATHS...] [--jobs N] [-q|-v] [--list] [--format human|short]
           [--include-runtime] [--skip PATTERN]...

Позиционные аргументы:

  • PATHS — список файлов или директорий. Если пусто — workspace root (рекурсивно). Файл должен иметь расширение .nv, иначе exit 2.

Флаги:

ФлагПо умолчаниюОписание
--jobs N0 (= num_cpus)Параллельных воркеров
-q, --quietoffТолько FAIL-строки и summary
-v, --verboseoffДополнительная информация (timing)
--listoffПоказать список файлов, не проверяя
--formathumanhuman (цветной) или short (file:line:col: msg для grep)
--include-runtimeoffВключить std/runtime/ (auto-gen, по умолчанию пропускается)
--skip PATTERN[]Пропустить файлы по substring (repeatable)

Hard-coded skip (всегда исключаются):

  • target/, node_modules/, vendor/
  • .git/, .hg/, .svn/
  • директории, начинающиеся с _ или .
  • std/runtime/ (override через --include-runtime)

Поведение:

  • Дедуп через canonicalize
  • Сортировка для детерминизма
  • Параллельный walk через thread::scope + mpsc-channel
  • Per-file warnings (yellow: warning:) после ok:-строки
  • Summary: pass=N fail=N warnings=N (X.YYs)
  • Exit 1 если есть FAIL, 2 если usage-ошибка

--format short:

lib.nv: ok
parser.nv:42:5: error: type mismatch

--format human (default):

ok: lib.nv
FAIL: parser.nv
  parser.nv:42:5: type mismatch

JSON / SARIF / JUnit форматы зарезервированы под sub-plan 36.A, сейчас не реализованы.


nova run

Сейчас НЕ поддерживается. Tree-walking интерпретатор отключён.

nova run остаётся видимой субкомандой, но при вызове падает с ошибкой и направляет на путь C-codegen:

nova run FILE
error: the Nova interpreter (`nova run`) is currently NOT supported.
Use `nova build <file>` to compile to an executable, or `nova test` to
compile and run tests (both via C codegen).

(exit 1).

Nova компилируется в C; поддерживаемого интерпретатора нет. Чтобы выполнить программу — nova build и запусти полученный бинарник; чтобы скомпилировать и прогнать тесты — nova test / nova test-build.


nova add

Добавить зависимость в [dependencies] nova.toml текущего пакета и обновить nova.lock (Plan 03.1).

nova add NAME (--path DIR | --git URL [--tag T | --branch B | --rev R | --version REQ])
ФлагОписание
NAMEИмя зависимости — должно совпадать с [package].name пакета-зависимости
--path DIRЛокальная path-зависимость (другой пакет на диске)
--git URLGit-зависимость (URL репозитория)
--tag TGit-пин: тег (только с --git)
--branch BGit-пин: ветка (только с --git)
--rev RGit-пин: commit / rev (только с --git)
--version REQGit-пин: semver-диапазон, напр. ^1.2 (только с --git, Plan 03.2)
  • --path и --git взаимоисключающие; ровно один обязателен.
  • --tag / --branch / --rev / --version взаимоисключающие; опциональны (без пина — ветка по умолчанию, в lock всё равно пишется точный commit).
  • --version выбирает наибольший подходящий semver-тег репозитория и пишет в nova.lock и версию, и commit.
  • Правит секцию [dependencies] (создаёт при отсутствии). Дубль имени → exit 2.
  • После правки запускает lock-sync: материализует git-зависимость в кэше и пишет резолвнутый commit в nova.lock.
  • Работает только внутри пакета (nova.toml с [package]), не на голом [workspace]-манифесте.
nova add mathlib --path ../mathlib
nova add gitlib  --git https://example.org/gitlib.nv --tag v1.0.0
nova add libfoo  --git https://example.org/libfoo.nv --version "^1.2"

nova update

Пере-резолвить git-зависимости и обновить nova.lock (Plan 03.1 / 03.2).

nova update [NAME] [--precise NAME@VERSION]
  • NAME — конкретная git-зависимость для обновления. Без аргумента — все git-зависимости.
  • Снимает целевые git-записи из nova.lock, затем пере-резолвит: branch/tag-пины берут текущий commit, version-диапазоны — наибольший подходящий тег. Остальные остаются зафиксированными (воспроизводимость).
  • --precise NAME@VERSION — зафиксировать version-диапазонную git-зависимость на точной версии (напр. nova update --precise libfoo@1.2.0). Резолвер обязан согласовать её с остальным деревом, иначе — конфликт.
  • path-зависимости пинов не имеют — такой аргумент отвергается с пояснением.

nova info

Показать effect-surface пакета — агрегированные эффекты его публичного API (Plan 03.4 / D140). Nova-уникальное: в Cargo/npm узнать, что зависимость ходит в сеть, без аудита кода невозможно.

nova info TARGET [--format human|json] [--diff BASE [--fail-on-new]]
ФлагОписание
TARGETПуть к пакету (.nv-файл / каталог) либо имя зависимости из [dependencies] текущего пакета
--formathuman (default) или json
--diff BASEСравнить effect-surface TARGET с BASE (путь либо зависимость) — добавленные/убранные эффекты
--fail-on-newС --diff: ненулевой exit-код при появлении новых эффектов (CI-gate против supply-chain)
  • Effect-surface = объединение эффектов всех export-функций (D28 — публичные функции объявляют эффекты явно → surface точна без межпроцедурного анализа). Приватные функции не входят.
  • --diff — supply-chain сигнал: Net/Fs в patch/minor-релизе ранее «чистого» API — красный флаг.
nova info ./mylib                    # effect-surface локального пакета
nova info somedep                    # объявленной зависимости
nova info somedep --format json
nova info ./v2 --diff ./v1 --fail-on-new   # CI: падение, если v2 добавил эффекты

Capability-confined зависимости. Зависимость можно ограничить через forbid в nova.toml:

[dependencies]
parser = { git = "https://example.org/parser.nv", forbid = ["Net", "Fs"] }

nova build вычисляет effect-surface зависимости и валит сборку, если она использует запрещённый эффект — песочница на уровне типов (сильнее рантаймовых permission-моделей). См. D63 / D140.


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]

Только один файл за раз-o принимает один путь. Для multi-file проектов используй import внутри entry-point.

Аргументы:

ФлагПо умолчаниюОписание
FILEEntry-point .nv с fn main
-o OUTPUT<name>[.exe] в CWDПуть к выходному бинарнику
--modedevdev (unoptimized) или release (-O2 + LTO)
--toolchainautoauto (Clang → MSVC → GCC), clang, msvc, gcc
--vcvarsauto через vswhereПуть к vcvars64.bat (Windows)
--clangauto detectПуть к clang.exe
--timeout120Таймаут компиляции в секундах
--keep-artifactsoffНе удалять .c/.exe/.obj в tmp
--mono-depth N500 (или NOVA_MONO_DEPTH)Лимит monomorphization-инстанциаций (Plan 48 Ф.7.6)

Tmp-директория: $TEMP/nova_tests/build/<path-hash>/ (Windows) или $TMPDIR/nova_tests/build/<path-hash>/ (Unix). Hash через DefaultHasher от абсолютного пути файла — обеспечивает уникальность без crypto-зависимости.

Pipeline:

  1. parse + typecheck + infer_effects
  2. CEmitter::emit_module → C-код
  3. detect_toolchain() (с авто-детектом vcvars)
  4. detect_or_build_libuv() — runtime может зависеть от libuv
  5. compile_c_to_exe(&tc, &build_opts, timeout)
  6. Копирование exe → -o или CWD
  7. Удаление tmp (если не --keep-artifacts)

nova test

Запуск тестов из директории или файла. Plan 28 (вместе с Plan 26, Plan 27, Plan 34).

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]
          [--keep-artifacts] [--gc boehm|malloc]
          [--list] [--filter-from PATH] [--shuffle [SEED]]
          [--skip PATTERN]... [--mono-depth N]
          [--positive] [--compile-error] [--panic] [--timeout-type]
          [--exit] [--slow] [--full]

Аргументы:

ФлагПо умолчаниюОписание
PATH...— (обязательный)Файлы и/или директории с тестами (минимум один)
--filter SUBSTRФильтр по display-name (substring)
--jobs N0 (= num_cpus)Параллельные воркеры
--formattexttext, json, tap, junit
--modedevdev или release
--toolchainautoauto, clang, msvc, gcc
--vcvarsautoПуть к vcvars64.bat
--clangautoПуть к clang.exe
--timeout60Per-test timeout (секунды)
-v, --verboseoffВывод проходящих тестов
-q, --quietoffТолько FAIL + summary
--results-file PATH<root>/target/last-test-results.jsonКуда писать результаты
--rerun-failedoffПерезапустить только failed/timed-out из последнего прогона
--retries N0Повторов на transient-фейлах (AV-races и т.п.)
--keep-artifactsoffНе удалять .c/.exe/.obj
--gcboehmboehm (default) или malloc (internal only)
--listoffСписок тестов без запуска
--filter-from PATHФайл с именами тестов (по одному на строку, exact match)
--shuffle [SEED]offСлучайный порядок; опц. seed для воспроизводимости
--skip PATTERN[]Пропустить тесты по substring имени или пути (repeatable)
--mono-depth N500 (или env)Лимит mono-instantiation
--positiveon (default)Выбрать позитивные тесты (без EXPECT_*-маркера). По умолчанию, когда не задан ни один category-флаг.
--compile-erroroffВыбрать тесты EXPECT_COMPILE_ERROR.
--panicoffВыбрать тесты EXPECT_RUNTIME_PANIC.
--timeout-typeoffВыбрать тесты EXPECT_TIMEOUT.
--exitoffВыбрать тесты EXPECT_EXIT_CODE.
--slowoffДополнительно включить *_slow.nv (любого типа). Алиас: --include-slow.
--fulloffВсе типы + slow (--positive --compile-error --panic --timeout-type --exit --slow).

Category-флаги (Plan 169.1.1, D304) аддитивны — несколько флагов объединяют свои наборы тестов (OR). Без category-флага по умолчанию выбираются только позитивные тесты, быстрые (non-slow). Тип теста определяется по первому EXPECT_*-маркеру в заголовке файла (первые 30 строк), а не по папке — поэтому негативные тесты находятся даже вне neg/.

Multi-path (Plan 36.D.1): передавать любое количество путей — директорий и/или файлов. Минимум один путь обязателен (Plan 172.6). Чтобы добавить std/:

nova test nova_tests             # только nova_tests/
nova test std nova_tests         # std/ + nova_tests/ одновременно
nova test nova_tests/plan118     # конкретная поддиректория

Display name формируется как путь от текущего рабочего каталога (cwd): nova_tests/plan118/t1_parse_ok вместо абсолютного пути.

Форматы вывода:

  • text — человекочитаемый, цветной, в stdout
  • json — массив объектов с полями name, status, duration_ms, stderr
  • tap — Test Anything Protocol v13
  • junit — JUnit XML (для CI-агрегаторов)

--rerun-failed: читает --results-file, выбирает имена с status != "pass", фильтрует suite, запускает только их.

EXPECT-маркеры в тестовых файлах (см. docs/test-conventions.md):

  • // 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]
ФлагПо умолчаниюОписание
FILEПуть к .nv-тесту
--modedevСм. nova test
--toolchainauto
--vcvarsauto
--clangauto
--timeout60
--keep-artifactsoff
--gcboehm
--mono-depth N500

Эквивалентно nova test <FILE>, но без machinery для bulk-runner’а (одиночный exe, single test-block в файле).


nova regen-runtime

Регенерация std/runtime/*.nv стабов из compiler-runtime реестра. Заменяет regen_runtime.ps1.

nova regen-runtime [--check]
ФлагПо умолчаниюОписание
--checkoffТолько сравнить — exit 1 если файлы расходятся с реестром (CI guard)

Под капотом — nova_codegen::codegen::runtime_registry::all() + render каждого модуля. См. Plan 13.


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 файл или директория
--formatmarkdownmarkdown, json (D107 schema), html
--json-schemaoffВывести встроенную JSON Schema 2020-12 и выйти
--include-privateoffВключить non-exported items
--testoffЗапустить doc-tests (Plan 45 Ф.7)
--checkoffВалидировать без рендера (broken links, missing summaries)
--watchoffRe-render по mtime-poll (500ms); Ctrl-C для выхода
--coverageoffМетрики coverage (% items with summary)
--coverage-threshold NCI-gate: exit 1 если coverage% < N
--jobs N0 (= num_cpus)Параллельных parse-jobs для workspace
--diff OLD NEWСравнить два JSON-вывода (semver detection)
--scrape-examples WORKSPACEПривязать top-3 usage examples к каждой fn
--strictoffWarnings → errors (CI)
--mutate-contractsoffMutation testing для contracts (Nova-unique)
--real-execoffРеально исполнять mutants (требует --mutate-contracts)
--output-dir DIRMulti-page HTML; только с --format html

Exit-коды для --diff OLD NEW:

КодЗначение
0Нет breaking changes
1Major change (breaking)
2Minor change (additive)
3Patch change (cosmetic)

Mutation testing (--mutate-contracts):

Генерирует мутанты для каждой функции с контрактами:

  • >>=, <<=
  • ==!=
  • Дроп requires/ensures

Default — text-based heuristic (~1ms/мутант). С --real-exec — запускает мутированные doc-tests через test_runner (~100ms/мутант, true positive guarantee).

Поддерживаемые форматы документации в /// см. Plan 45 (D107).


nova doc-query

DSL-запросы к JSON-выводу nova doc --format json (Plan 45 Ф.32.1). Фундамент для MCP-сервера (nova doc-mcp).

nova doc-query JSON_FILE [QUERY]

Синтаксис query: key=value,key=value,...

КлючЗначения
kindfn, type, effect, protocol, module, …
namesubstring
moduleexact module path
module-prefixпрефикс пути
capabilitycapability-name
effecteffect-name
has-contractstrue, false
verifiedtrue, false
stabilitystable, unstable, experimental
deprecatedtrue, false

Примеры:

nova doc . --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 (Plan 45 Ф.32.3 / Ф.34.1). Совместим с 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-клиент шлёт initializetools/listtools/call.


nova contracts

Инспекция и верификация контрактов (Plan 33 / D24). Output — JSON (AI-friendly schema, см. docs/contracts-diag-schema.json).

nova contracts <SUBCOMMAND>

nova contracts list

Список всех контрактов в файле.

nova contracts list FILE

nova contracts verify

SMT-верификация контрактов. Output — JSON.

nova contracts verify FILE [--backend BACKEND]
ФлагПо умолчаниюОписание
FILE.nv файл
--backend BACKENDenv NOVA_SMT_BACKENDOverride SMT-backend (trivial, z3)

Z3-бэкенд: требует build с --features z3-backend. См. Plan 33.1.

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 N0Индекс контракта (0-based)

nova bench

Бенчмарк-инфраструктура (Plan 57 — MVP+A+B+C+D+E+F+G+H закрыты). Лучше Criterion (Rust) / testing.B+benchstat (Go) / tinybench (TS) по ряду параметров. См. docs/bench-conventions.md.

nova bench <SUBCOMMAND>

Субкоманды: run, diff, gate, calibrate, cpu-instr-check, membw-check, hyperfine, callgrind, callgrind-check, runner-branch, history-anomalies, remote, corpus, history-add, history-list, history-squash, 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]
                    [--vcvars PATH] [--clang PATH]
                    [--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 PATTERNComma-separated bench-name fragments
--samples N100Override sample count
--warmup-ms500Warmup duration в мс
--time-budget10Per-bench бюджет в секундах
--gcboehmСм. nova test
--modereleaserelease (рекомендуется) или dev
--toolchainautoСм. nova build
--compile-timeout120Таймаут компиляции
--run-timeout600Таймаут запуска bench-процесса
--out PATHЗаписать JSON v1
--out-csv PATHЗаписать CSV
--out-md PATHMarkdown (для PR comment)
--out-criterion DIRCriterion-compatible JSON layout
--profile MODE OUTcpu/heap/gc profile, требует samply для cpu
--histogramoffASCII-гистограмма на каждый bench

Output-форматы:

  • --out (JSON v1): полная схема с metadata (git SHA, toolchain, CPU model)
  • --out-criterion: <dir>/<safe-name>/new/{estimates,sample,benchmark}.json, совместимо с cargo-criterion --message-format=criterion
  • --out-md: markdown-таблица для PR
  • --histogram: 40 buckets, Unicode block chars, медиана и Tukey fences

Profile-режимы:

  • cpu — заворачивает в samply (нужен cargo install samply)
  • heapNOVA_BENCH_HEAP_SAMPLE_MS=10
  • gcNOVA_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, NEWJSON-файлы (nova bench run --out)
--formatterminalterminal, markdown, json
--explainoffAI-интерпретация regressions (Plan 57.F.2, opt-in)
--ai-config PATH~/.nova-ai.tomlПуть к AI-конфигу
--ai-max-tokens4000Override max tokens
--ai-dry-runoffПечатает request body без API call
--baseline-sha, --new-shaauto из JSONGit SHA для context

--explain использует system curl (без RustCrypto-стека) и требует NOVA_AI_API_KEY или конфиг.

nova bench gate

CI-gate: применяет пороги из bench.toml. Exit 0 = pass, 1 = regress.

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 (Plan 57.A.3).

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 (Plan 57.B.4).

nova bench cpu-instr-check

Linux: проверяет perf_event_open + measures known loop. Other OS: печатает stub-сообщение.

nova bench membw-check

Диагностика memory-bandwidth measurement (Plan 57.F.3).

nova bench membw-check

Linux: probes /sys/devices/uncore_imc_* + LLC-miss perf counter. Other OS: stub.

nova bench hyperfine

Hyperfine-style cross-binary timing — wall-clock измерение произвольных команд (Plan 57.H.2). 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..."
--warmup3Warmup runs (отбрасываются)
--samples10Sample runs
--timeout300Per-command timeout
--workdir PATHCWD для команд
--out PATHstdoutJSON 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 (Plan 57.H.3). Cross-platform fallback к perf_event_open (Linux-only). Работает на macOS + Linux при наличии valgrind.

nova bench callgrind BINARY [ARGS...] [--cache-sim] [--workdir PATH] [--out PATH]
ФлагПо умолчаниюОписание
BINARYПуть к executable
ARGS...Аргументы executable
--cache-simoffI1/D1/LL miss counts (медленнее)
--workdir PATHCWD для команды
--out PATHJSON CallgrindResult

nova bench callgrind-check

Проверка наличия и версии valgrind.

nova bench callgrind-check

nova bench runner-branch

Печатает рекомендованное имя history-branch на основе env NOVA_BENCH_RUNNER_ID (Plan 57.D.4 — multi-runner CI matrix).

nova bench runner-branch

Возвращает bench-history если env не задан, иначе bench-history-<id>.

nova bench history-anomalies

Детекция changepoints в historical median time-series через PELT algorithm (Plan 57.E.5). Идентифицирует regimes с ≥5% delta.

nova bench history-anomalies [--branch BRANCH] [--format text|json]
ФлагПо умолчаниюОписание
--branchauto (NOVA_BENCH_RUNNER_ID-aware)History branch
--formattexttext или json

nova bench remote

SSH-distributed bench coordination (Plan 57.F.1).

nova bench remote <SUBCOMMAND>
nova bench remote list

Список remotes из ~/.nova-bench-remotes.toml.

nova bench remote list [--config PATH]

--config override через NOVA_BENCH_REMOTES env.

nova bench remote ping

SSH health-check одного remote.

nova bench remote ping NAME [--config PATH]
nova bench remote run

Параллельный bench на N remotes; gathering results.

nova bench remote run BENCH [--remotes LIST] [--gather-into DIR] [--sha SHA] [--config PATH]
ФлагПо умолчаниюОписание
BENCH.nv file path (relative to repo root на remote)
--remotesallComma-separated имена или all
--gather-intoremote-resultsКуда складывать per-remote JSON
--sha SHAОпц. git SHA для checkout перед bench

nova bench corpus

Измерение per-pass compile time для corpus файла(ов) — Plan 57.C.8. Заворачивает nova build с NOVA_PERF_TIMER=1, парсит __PERF__ маркеры.

nova bench corpus PATH [--json] [--html PATH] [--echarts-url URL]
                       [--mode release|dev] [--toolchain auto|clang|msvc]
                       [--gc boehm|malloc]
ФлагПо умолчаниюОписание
PATH.nv файл или директория
--jsonoffJSON output (вместо таблицы)
--html PATHHTML compiler-perf dashboard (Plan 57.D.5)
--echarts-urlhttps://cdn.jsdelivr.net/...Custom echarts URL (offline)
--moderelease
--toolchainauto
--gcboehm

nova bench history-add

Дописать result JSON в orphan history-branch (Plan 57.A.1).

nova bench history-add RESULT [--branch BRANCH] [--push] [--remote NAME] [--dry-run]
ФлагПо умолчаниюОписание
RESULTJSON из nova bench run --out
--branchautoOrphan branch (bench-history по умолчанию)
--pushoffPush после commit
--remoteoriginRemote name при --push
--dry-runoffПоказать что было бы, без commit

nova bench history-list

Список entries в history-branch (newest first).

nova bench history-list [--branch BRANCH]

nova bench history-squash

Squash старых entries по retention policy (Plan 57.C.6 — рекомендуется yearly squash).

nova bench history-squash --before-date YYYY-MM-DD [--branch BRANCH]
                          [--push] [--remote NAME] [--dry-run]
ФлагПо умолчаниюОписание
--before-date— (обязательный)Squash всё старше этой даты UTC
--branchauto
--pushoff
--remoteorigin
--dry-runoffПоказать что было бы удалено

nova bench dashboard

Статический HTML dashboard из history (Plan 57.A.2).

nova bench dashboard [--history-branch BRANCH] [--out DIR] [--max-entries N] [--echarts-url URL]
ФлагПо умолчаниюОписание
--history-branchautoHistory branch
--outdashboardOutput directory
--max-entries200Max entries (newest first)
--echarts-urljsdelivr URLCustom echarts URL (offline = local)

Генерирует index.html + bench-<safe>.html per bench + data.json.

Семейство nova bench также открывает диагностические субкоманды field-cache (реальное wall-clock измерение влияния field-cache из Plan 123), cpu-instr-check, membw-check и callgrind-check. Флаги — через nova bench <sub> --help.


nova consume-analyze

Анализатор покрытия consume-типов (Plan 100.8 / D7). Сканирует файл или директорию, собирает все consume-типизированные биндинги и сообщает, сколько из них покрыто через consume-методы (Cleanup.@cleanup, D188) или defer. Полезно как CI-проверка гигиены.

nova consume-analyze PATH [--format human|json] [--fail-on-uncovered]
ФлагПо умолчаниюОписание
PATH.nv файл или директория для анализа
--formathumanhuman или json
--fail-on-uncoveredoffНенулевой exit при наличии непокрытого consume-биндинга (CI-gate)

Коды выхода:

КодЗначение
0Все consume-биндинги покрыты
1Найдены непокрытые биндинги
2Usage error

Переменные окружения

VarИспользуется вЭффект
NOVA_CODEGEN(зарезервировано)Override пути к nova-codegen binary
NOVA_MONO_DEPTHbuild, test, test-build, benchЛимит monomorphization-инстанциаций (default 500)
NOVA_REACH_DCEbuild, test, test-buildReachability-codegen DCE (Plan 159, D283). Не задана / ≠0ON (default): в C эмитится только достижимое от main. =0OFF: байт-идентичное до-159 поведение (эмитить всё) — escape hatch для диагностики over-prune
NOVA_HOMEadd, build (git-deps)Корень кэша git-зависимостей; default ~/.nova (кэш в <NOVA_HOME>/git)
NOVA_OFFLINEadd, build (git-deps)=1 → запрет сети (clone/fetch); сборка только из готового кэша
NOVA_SMT_BACKENDcontractsSMT-backend (trivial, z3)
NOVA_PERF_TIMERbench corpus (auto-set)Включает __PERF__ маркеры в компиляторе
NOVA_PERF_TIMER_AGGREGATEbench corpusAggregate __PERF__ по проходам
NOVA_BENCH_RUNNER_IDbench history-*, runner-branchMulti-runner CI matrix; используется в branch name
NOVA_BENCH_REMOTESbench remoteOverride пути к .nova-bench-remotes.toml
NOVA_BENCH_FILTERbench run (auto-set)Forwarded в bench-процесс
NOVA_BENCH_SAMPLESbench run (auto-set)Override sample count
NOVA_BENCH_WARMUP_NSbench run (auto-set)Warmup в наносекундах
NOVA_BENCH_TIME_BUDGET_NSbench run (auto-set)Time budget в наносекундах
NOVA_BENCH_HEAP_SAMPLE_MSbench run --profile heapSample interval в мс
NOVA_BENCH_GC_TRACEbench run --profile gcВключает GC tracing
NOVA_AI_PROVIDERbench diff --explainAI-provider (anthropic, openai, …)
NOVA_AI_MODELbench diff --explainМодель override
NOVA_AI_API_KEYbench diff --explainAPI key (или ~/.nova-ai.toml)
NOVA_C_COMPILERbench reproРеальный path к компилятору (фиксируется в metadata)
NOVA_SHAbench repro (compile-time option_env!)Git SHA nova бинарника
NO_COLORglobalОтключить ANSI цвета
CLICOLORglobal=0 → отключить
CLICOLOR_FORCEglobal=1 → принудительно включить
CIglobal=true → отключить цвета
TERMglobal=dumb → отключить цвета
TEMPWindowsTmp-директория для build/test artifacts
TMPDIRUnixТо же

Migration-бинарники

Отдельные one-shot инструменты в nova-cli/src/bin/. Сохраняются в репозитории как reference для будущих атомарных API-rename планов.

migrate_plan60

Lexer-based миграция 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()

Skip conditions: предыдущий значимый token == = (method-value assignment: let f = arr.len).

migrate_plan60 [--apply] [--dry-run] [--md] [--paths DIR...]
ФлагПо умолчаниюОписание
--dry-run(default)Только показать diff
--applyoffРеально записать
--mdoffВключить .md файлы (rewrite внутри ```nova / ```nv блоков)
--paths DIR...std/, nova_tests/, examples/Список директорий

Token-level rewrite — комментарии / whitespace / formatting сохраняются 1:1.

migrate_plan65

Lexer-based миграция 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 codes (специальный набор):

КодЗначение
0Изменений не требуется (idempotent)
1Emitted manual markers — CI gate fails
2Изменения применены (или были бы применены в dry-run)

Token-aware через nova_codegen::lexer — пропускает строки и комментарии естественным образом.


Связанные документы