Four packages, one version, published together from a tag.
# 1. Everything green locally
pnpm verify # format, lint, typecheck, tests
pnpm build
pnpm security:audit # the toolkit scans itself
# 2. Bump every package to the same version, and write the changelog section
# (## [x.y.z] - YYYY-MM-DD) before tagging.
# 3. Preflight — versions agree, tag matches, every package has a readme,
# a licence, a description and a working bin
pnpm release:check v0.1.0
# 4. Tag and push. The workflow does the rest.
git tag -a v0.1.0 -m "v0.1.0"
git push origin v0.1.0The Release workflow re-runs every CI gate, runs the preflight against the tag, inspects what
would be published, and publishes with pnpm publish -r — which resolves workspace:* ranges to the
versions being released and publishes in dependency order.
workflow_dispatch runs the same job without publishing — that is the rehearsal, and there is
no switch to make it publish. Publishing is gated on the run being for a pushed tag, so a release
is always a commit that exists in the repository rather than a button someone can hit by accident.
npm publishes are immutable, and the unpublish window is not a plan. scripts/check-release.mjs
fails on:
- packages that disagree on a version, or a version that does not match the tag
- a missing
CHANGELOG.mdsection for the version - a missing
README.mdorLICENSEin any package — npm shows both on the package page - missing
description,license,repository,homepage,bugsorauthor publishConfig.provenancenot set, or a scoped package withoutaccess: public- a
binentry pointing at a file that does not exist - a
file:dependency range, which would resolve to nothing for a consumer
NPM_TOKENin repository secrets, as an automation token with publish rights.- The
publishjob holdsid-token: writeso npm can attach provenance, linking the artefact to the workflow run that built it. Verify it appeared after the first release — the npm page shows a provenance badge, andnpm view <package> --jsonincludes the attestation. - Every third-party action is pinned to a commit SHA, not a tag.
The project brief sets the bar for calling anything 1.0. This is where it actually stands.
| Criterion | State |
|---|---|
| Android builds; iOS builds; New Architecture works | ✅ verified in CI on every change |
| Root, jailbreak, debugger, emulator/simulator, hook, integrity, secure hardware, biometrics, network, screen checks implemented | ✅ |
| Results are structured, with signals, confidence and evidence | ✅ |
| Platform limitations documented per check | ✅ docs/runtime |
| Verified on physical rooted / jailbroken devices | ❌ outstanding |
| Criterion | State |
|---|---|
| JS/TS analysis, native analysis, manifest and plist analysis | ✅ |
| Dependency analysis | ✅ resolution only — advisories are out of scope by design |
| Secret detection | ✅ |
| Findings deduplicated; suppressions work; severity works | ✅ |
| OWASP/CWE mapping works | ✅ generated from official sources and validated at startup |
| Criterion | State |
|---|---|
| AI is optional and disabled by default | ✅ it is a separate package, and nothing calls a model |
| Source is redacted / not uploaded | ✅ nothing is uploaded; the MCP server runs locally |
| Prompt injection is handled | ✅ labelled as untrusted data, reported as a finding, never obeyed |
| AI findings clearly identified; AI cannot control security decisions | ✅ by construction — every finding comes from a deterministic rule |
| Criterion | State |
|---|---|
| No telemetry, no hidden network requests | ✅ |
| Malicious repositories cannot execute code | ✅ threat model, adversarial test suite |
| No secrets in the package; no arbitrary command execution | ✅ verified by npm pack inspection and the self-audit |
| No dangerous automatic remediation | ✅ nothing in the toolkit modifies a project |
| Criterion | State |
|---|---|
| Unit tests, native tests, integration tests pass | ✅ 569 tests |
| Lint, typecheck, CI pass | ✅ |
| npm package builds; contents reviewed | ✅ |
| Documentation, SECURITY.md, threat model, changelog | ✅ |
| The package can audit itself | ✅ pnpm security:audit, gating CI |
No any or @ts-ignore in security paths |
✅ none in shipped source |
| External security review | ❌ not yet performed |
Two criteria are unmet, and both are the kind that cannot be satisfied by writing more code:
- No physical-device validation. The detector logic is tested; the probes underneath it have never met a real rooted phone. Until that matrix is filled in, a runtime result is a well-reasoned expectation rather than an observed one.
- No external review. The project has been reviewed by the people who wrote it.
A 1.0 that claimed otherwise would be exactly the overclaim this toolkit exists to avoid.