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 the sliding-scale report: analysis and seams
blue test FILE 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 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.