ecko fmt

ecko fmt file.ecko            # format in place
ecko fmt src/ tests/          # several paths
ecko fmt --check file.ecko    # exit non-zero if it would change

One canonical style, zero configuration. There are no options to argue about because there are no options.

Why it is not configurable

Formatting arguments are pure cost. More than that, Ecko treats the canonical form as part of the language contract: any new syntax must round-trip through the formatter byte-identically, and the compiler's own test suite formats every example twice and asserts the output is unchanged. A style knob would multiply that guarantee by the number of settings.

There is a second reason, particular to this language. Ecko is written to be read by models as well as people. One canonical form means a model sees the same shape for the same construct every time, in every codebase.

--check

Formats nothing, exits non-zero if any file is not already canonical, and names the files. This is the CI form:

ecko fmt --check *.ecko

What it does not change

Comments keep their text, and ## doc comments keep their marker. Blank lines between top-level definitions are preserved as paragraph structure - the formatter normalizes indentation, spacing, wrapping and delimiters, not your intent about what belongs together.

That extends to what a comment is attached to. A parameter list written across several lines with a comment per parameter stays broken, so each comment keeps its parameter:

fn area(
    width,  # in metres
    height,  # also in metres
) {
    width * height
}

Collapsing that signature would leave the comments nowhere to go but the body, where they would read as documentation of the first statement. A signature with no comments still collapses to one line, and a comment written after a single-line signature belongs to the statement rather than to the last parameter.

Deprecated syntax

The formatter migrates syntax that has been superseded. The old zero-argument lambda || expr becomes fn() expr, and ecko check reports the old form as a deprecated-syntax warning pointing here. Running ecko fmt is the fix.