Use this when you are ready to go public. Nothing here runs automatically until secrets and registry ownership are configured.
- CI green on
main(Python matrix + Docker build + npmbuild:js). - Public production gate (if shipping an internet-facing gateway): confirm docs/deploy/docker.md checklist —
AIRLOCK_ENV=production, seed,AIRLOCK_SERVICE_TOKEN,AIRLOCK_SESSION_VIEW_SECRET, explicit CORS + issuer allowlist, Redis whenAIRLOCK_EXPECT_REPLICAS> 1, single-writer LanceDB story documented for operators. - Bump versions in lockstep where needed:
pyproject.toml→versionsdks/typescript/package.json→versionintegrations/airlock-mcp/package.json→version(and dependency range onairlock-clientif you bump major)
- Changelog / release notes (GitHub Release body): breaking changes, new env vars (
AIRLOCK_ENV,AIRLOCK_SERVICE_TOKEN,AIRLOCK_SESSION_VIEW_SECRET,AIRLOCK_PUBLIC_BASE_URL,AIRLOCK_REDIS_URL,AIRLOCK_ADMIN_TOKEN, signed/feedbackand/heartbeat). - PyPI: trusted publisher linked (see below); optional GitHub Environment
pypifor approval. - npm: repository secret
NPM_TOKEN(Automation publish). - Create GitHub Release with tag
vX.Y.Z(or run workflows manually viaworkflow_dispatch).
Workflow publish-ghcr.yml runs on published Releases (tags the image as vX.Y.Z and latest) and supports workflow_dispatch for ad-hoc tags. Images: ghcr.io/shivdeep1/airlock-protocol:<tag> (owner/repo are lowercased from GitHub).
- One-time: repo Settings → Actions → General → Workflow permissions must allow read and write for packages (or use a PAT with
write:packagesif you restrictGITHUB_TOKEN). - Packages visibility: repo Packages sidebar → package settings → make Internal or Public as appropriate.
- Pull:
docker pull ghcr.io/shivdeep1/airlock-protocol:v0.1.0
Docker deploy (gateway image) is separate from npm/PyPI: see docs/deploy/docker.md — docker compose + .env.example.
Dependabot (.github/dependabot.yml) opens weekly PRs for GitHub Actions, pip, and npm — review and merge before releases when practical.
- Create the project on pypi.org (or claim the name if unused).
- Trusted publishing (recommended, no long-lived PyPI password in GitHub):
- PyPI → your project → Manage → Publishing → add a trusted publisher.
- Provider: GitHub, repository (owner/name), workflow:
publish-pypi.yml, environment: leave unspecified unless you add one later.
- GitHub (optional hardening): add an Environment named
pypiwith required reviewers; then setenvironment: pypion the publish job in.github/workflows/publish-pypi.yml. - Ship: create a GitHub Release (tag e.g.
v0.1.0) or run workflow Publish PyPI manually (workflow_dispatch).
Local check: pip install hatch && hatch build → artifacts under dist/.
- Names:
airlock-clientandairlock-mcpmust be available under your npm account (or org). - Token: npm → Access Tokens → create an Automation (classic) token with Publish.
- GitHub: Settings → Secrets and variables → Actions → create repository secret
NPM_TOKENwith that token. - Ship: run workflow Publish npm (or trigger via release; same workflow). Publishes workspace order:
airlock-client, thenairlock-mcp.
Dry run locally:
npm ci
npm run build:js
npm publish -w airlock-client --access public --dry-run
npm publish -w airlock-mcp --access public --dry-run- Python: edit
versioninpyproject.toml, tag the release, then publish. - npm: bump
versioninsdks/typescript/package.jsonandintegrations/airlock-mcp/package.json(keep compatible semver for the^0.1.0dependency range, or bump both and widen the range inairlock-mcpif needed).
To reserve an alternate name later without duplicating code: publish a tiny package that re-exports airlock-client or depends on it and documents the preferred import path.