CLI · Node 22+Offline tarballFixture sample or caller file

Download the kit, then either run the bundled sample or pass your own job JSON. It reports what matches and what is still missing so you can repeat with a changed file.

§ 01Acquire

Unpack into a new directory.

Needs Node 22+, curl, and tar. The directory capability-preflight-download must not already exist. Digest, size, and MIME are checked before extraction. Pins live with the archive metadata.

Download · verify · unpack · status

if [ -e capability-preflight-download ]; then echo "capability-preflight-download already exists" >&2; exit 1; fi
mkdir capability-preflight-download || exit 1
cd capability-preflight-download || exit 1
response=$(curl --disable -fsS --max-time 30 --max-filesize 143275 -o capability-preflight.tar.gz \
  --write-out '%{http_code} %{content_type}' \
  https://neomorphic.io/downloads/capability-preflight/capability-preflight.tar.gz) || exit 1
case "${response%%;*}" in
  "200 application/gzip"|"200 application/x-gzip"|"200 application/octet-stream") ;;
  *) echo "Unexpected archive HTTP status or MIME" >&2; exit 1 ;;
esac
test -f capability-preflight.tar.gz || exit 1
actual=$(wc -c < capability-preflight.tar.gz | tr -d ' ') || exit 1
test "$actual" = "143275" || { echo "Unexpected archive size" >&2; exit 1; }
node --input-type=module -e 'import {readFileSync} from "node:fs"; import {createHash} from "node:crypto"; const b=readFileSync("capability-preflight.tar.gz"); if(b.length!==143275 || createHash("sha256").update(b).digest("hex")!=="477e31cb09818409ff9fe81b9d8401bc227591be100a2aca7edf73ca1a45e551") throw Error("Untrusted or incomplete release; extraction stopped");' || exit 1
tar -xzf capability-preflight.tar.gz || exit 1
test -f capability-preflight/bin/capability-consumer-kit.mjs || exit 1
node capability-preflight/bin/capability-consumer-kit.mjs status || exit 1
cd capability-preflight || exit 1

§ 02Sample

Bundled demo, not your job.

From the unpacked kit directory. These commands load the labelled sample. They are not a substitute for a caller file.

Sample status, cold-start, and journey

node bin/capability-consumer-kit.mjs status

node bin/capability-consumer-kit.mjs cold-start --probe

node bin/capability-consumer-kit.mjs journey

§ 03Caller

Your JSON, then the same path again.

A real job is a file you write: requirements, declared source, tests, composed parts, context. The kit does not fill gaps from the sample. Repeat with the same --input path; do not swap in a same-named file from the kit tree.

Caller journey

node bin/capability-consumer-kit.mjs journey --input ./your-job.json --out ./out/last-journey.json

If a required field, digest, or prerequisite is missing or contradictory, the result is partial and names the gap. Sample cold-start writes its own directory and does not overwrite your input file.

§ 04Tests

Offline suite in the extract.

Consumer suite · Node 22+

node --test --test-concurrency=1 tests/*.test.mjs

§ 05Nearby

Other laboratory packs.