blue — the command line.
Every subcommand does one thing, per ★★ CLOSED-LOOP MASS-SYNTHESIS:
a monolithic blue do-everything is the shape this forbids. Each one is a
projection of the same pipeline, so blue ast and blue run cannot
disagree about what a program means — they read the same stages from
blue_lang_runtime::pipeline.
blue run FILE parse, check, erase, execute
blue fmt FILE [--check] the one formatting; --check exits 1 on drift
blue ast FILE the tatara-lisp form — homoiconicity, visible
blue erase FILE the tatara-lisp form after type erasure
blue check FILE [--format json] [--fix] every rule, the typing report
blue explain CODE | --list what a diagnostic code means
blue test FILE check, then run the file's `test` blocks
blue deps BLUEFILE resolve the manifest's dependencies
blue posture BLUEFILE the posture the manifest's floors require
blue bluefile --json BLUEFILE the evaluated manifest, as JSON
blue bluefile --confirm BLUEFILE... exit 1 unless each Bluefile.lock is fresh
blue lock [DIR...] evaluate, pin every source, write Bluefile.lock
blue config [TIER] the bounds blue is running with
blue lsp speak LSP over stdio
blue banner the wordmark — the blueshift ramp
blue shift FILE how far this is shifted, and what is shifting it
blue reference the language, from its own tables, as JSON
blue deps and blue posture read a Bluefile, which is itself a blue
program — see blue_lang_pkg::bluefile. posture was previously absent
because there was no declaration surface to read a floor from; there is one
now.
Neither fetches anything. Resolution is real; there is no registry
client, so deps resolves against the distribution already on
BLUE_PATH (via GitRegistry) and installs nothing. With no distribution
there, it says so rather than printing a hollow resolution.
blue bluefile and blue lock are how nix reads blue without running it
(theory/BLUE-STRUCTURE.md §5.1): lock commits the evaluation, and
--confirm is the offline freshness gate the flake runs over every package.
lock is the one subcommand that starts a process — nix flake prefetch,
behind blue_lang_pkg::lock::Prefetch so no test reaches the network.
Every subcommand runs under the bounds in config — resolved once, here,
and threaded down.
blue ast and blue erase are separate on purpose: the difference
between them is the sliding scale, and being able to print both sides of
it is how a reader sees that annotations are consumed rather than carried.