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