Zero dependencies, exit-code contract

The lint CLI

Kills the whole class crashtest filed upstream (#16: scaffolded manifests pointing at entries that don't exist) at author time, in any fleet repo, with one command.

# human, exit 0 clean / 1 violations / 2 usage
npx packstruct lint packs/

# machine-readable: {schema, packsChecked, violations}
npx packstruct lint packs/ --json

# what the linter validates (SPEC v1, nothing more):
.   schemaVersion === 1
.   kebab-case name that matches its directory
.   dotted MAJOR.MINOR[.PATCH] version, non-empty description
.   relative entry path that physically exists (the #16 class)
.   armedByKey, when present, a non-empty string

Try it now, in the browser

Island below runs the same SPEC v1 rules entirely client-side - your manifest never leaves the tab. It validates the JSON shape only (the CLI additionally checks that the entry file actually ships on disk, the part browsers can't see).

Enable JavaScript to use the in-browser linter, or run npx packstruct lint packs/.