Skip to content

Testing and CI

Run checks from the repository root. The root package.json intentionally rejects a generic test command so package-specific isolation is preserved.

Command Coverage
make typecheck Code-principle checks and TypeScript type checking
make test-bun Application, Pi runtime, provider, and browser tests
make test-python cyberful-os Python unit tests
make runtime-build Native unified cyberful-os image
make test-runtime Full image, ZAP, Ghidra, bridge, and lifecycle contract
make test-cyberful-os Real image, catalog, MCP, and gateway contract
make test-network Browser socket integration
make test-zap Docker ZAP, bridge, browser proxy, scan, and cleanup
make test-ghidra Real Ghidra import, analysis, MCP, and restart state
make docs-build Strict documentation build and link validation

Before publishing a change, scan the checkout for secrets. This is a safety net, not permission to place a real credential in Git history even briefly.

make test runs the default Bun, Python, and live cyberful-os tiers. make runtime-build followed by make test-runtime is the complete tooling image gate; focused ZAP and Ghidra targets reuse that image without rebuilding separate runtimes. make test-all adds the remaining network contracts. Pi provider-wire, system-message, security-block, delegation, and fallback behavior is covered by the isolated Bun tier without requiring a live model turn.

The network tier exercises the browser socket contract. It remains outside the default Bun tier because restricted sandboxes may forbid binding a loopback socket.

GitHub CI runs make typecheck test-bun test-python and the strict documentation build for every pull request and push to main. Every pull request also builds and tests linux/amd64 and linux/arm64 concurrently on dedicated native self-hosted runners; a manual runtime.yml run outside main has the same non-publishing behavior. Pull requests and non-main manual runs upload logs only. Main builds and pushes each native platform with BuildKit SBOM and provenance, pulls and tests that exact published digest, assembles one OCI index, and signs its digest through GitHub OIDC. No QEMU is installed or used.

Main runtime runs use the runtime-main FIFO concurrency queue. The OCI index stores its source commit, and the next run compares from that revision so a failed publication cannot make a later non-runtime commit copy a stale image. When no runtime boundary changed, the workflow verifies edge and its Cosign signature before copying the same digest registry-side to the new sha-* tag. Before moving edge, a build also checks that its commit is still the live head of main, so an older queued run cannot regress the tag.

Each runtime runner needs the labels self-hosted, linux, cyberful-container, and its architecture (amd64 or arm64), plus at least 100 GB free, Docker BuildKit/buildx, Bun, Python, a C compiler, and the isolated browser test dependencies. The workflow does not import persistent BuildKit or Bun caches into publishable builds; per-job BuildKit state is pruned to an 80 GB bound and then cleaned up.