This document describes how to create a new release of the agentic-workflow-firewall (awf).
- Ability to trigger workflows (Actions tab or
ghCLI)
From the CLI:
# Patch release (0.1.0 -> 0.1.1)
gh workflow run release.yml -f bump=patch
# Minor release (0.1.1 -> 0.2.0)
gh workflow run release.yml -f bump=minor
# Major release (0.2.0 -> 1.0.0)
gh workflow run release.yml -f bump=majorOr from the GitHub UI: go to Actions > Release > Run workflow, select the bump type, and click Run workflow.
The workflow will:
- Bump the version in
package.json - Commit the version change and create a git tag
- Build and push Docker images to GHCR
- Create Linux x64 and arm64 binaries
- Create NPM tarball and checksums
- Generate versioned JSON Schema files with the release tag embedded in their
$idURLs - Publish the GitHub Release with auto-generated changelog
Once the workflow completes:
- Go to Releases page
- Verify the new release is published with:
- Linux x64 binary (
awf-linux-x64) - Linux arm64 binary (
awf-linux-arm64) - NPM tarball (
awf.tgz) - Checksums file (
checksums.txt) - JSON Schema files (
awf-config.schema.json,audit.schema.json,token-usage.schema.json) - Installation instructions with GHCR image references
- Linux x64 binary (
- Go to Packages page (in repository)
- Verify Docker images are published:
squid:<version>andsquid:latestagent:<version>andagent:latestapi-proxy:<version>andapi-proxy:latestcli-proxy:<version>andcli-proxy:latestagent-act:<version>andagent-act:latest(GitHub Actions parity image)
Each release includes:
awf-linux-x64- Linux x64 standalone executableawf-linux-arm64- Linux arm64 standalone executableawf.tgz- NPM package tarball (alternative installation method)checksums.txt- SHA256 checksums for all filesawf-config.schema.json- AWF config JSON Schemaawf-config.v1.schema.json- Deprecated alias ofawf-config.schema.json(kept for backward compatibility)audit.schema.json- AWF audit JSONL record JSON Schematoken-usage.schema.json- AWF token-usage JSONL record JSON Schema
Each release generates all three schemas with a $id URL that includes the release tag, creating stable, pinnable references:
https://github.com/github/gh-aw-firewall/releases/download/v0.26.0/awf-config.schema.json
https://github.com/github/gh-aw-firewall/releases/download/v0.26.0/audit.schema.json
https://github.com/github/gh-aw-firewall/releases/download/v0.26.0/token-usage.schema.json
External consumers (e.g. the gh-aw compiler) should pin to the release URL or the stable raw URL:
| Schema | Pinned to release tag | Always-latest from main |
|---|---|---|
| Config | https://github.com/github/gh-aw-firewall/releases/download/<tag>/awf-config.schema.json |
https://raw.githubusercontent.com/github/gh-aw-firewall/main/docs/awf-config.schema.json |
| Audit | https://github.com/github/gh-aw-firewall/releases/download/<tag>/audit.schema.json |
https://raw.githubusercontent.com/github/gh-aw-firewall/main/schemas/audit.schema.json |
| Token usage | https://github.com/github/gh-aw-firewall/releases/download/<tag>/token-usage.schema.json |
https://raw.githubusercontent.com/github/gh-aw-firewall/main/schemas/token-usage.schema.json |
Migration note: The previously documented URL
…/releases/download/<tag>/awf-config.v1.schema.jsonand the raw URL…/main/docs/awf-config.v1.schema.jsonare now deprecated.awf-config.v1.schema.jsoncontinues to be published as a compatibility alias (identical content toawf-config.schema.json) so existing consumers are not broken, but new consumers should useawf-config.schema.jsoninstead. Thedocs/awf-config.v1.schema.jsonfile in the repository has been removed; usedocs/awf-config.schema.jsonfor the always-latest copy.
JSONL _schema field: Each JSONL record embeds the AWF version in its _schema field, e.g. "_schema": "audit/v0.26.0". For audit logs, the version reflects the AWF CLI version that configured the Squid proxy. For token-usage logs, the version is baked into the api-proxy container image at release build time (via --build-arg AWF_VERSION=…), so it correctly reflects the api-proxy image version even when --image-tag pins the proxy to a different release. Dev/local builds use audit/v<package.json-version> and token-usage/v0.0.0-dev respectively. Consumers should use a prefix match (_schema.startsWith("audit/")) rather than an exact match to handle any version gracefully.
Schema evolution: Breaking changes (field removal, rename, type change, new required field) should be documented in the changelog. Since the repo version is used as the schema version, consumers can pin to a specific release tag to ensure compatibility.
Docker images are published to ghcr.io/github/gh-aw-firewall:
squid:<version>andsquid:latest- Squid proxy containeragent:<version>andagent:latest- Agent execution environment (minimal, ~200MB)api-proxy:<version>andapi-proxy:latest- API proxy sidecar for credential isolationcli-proxy:<version>andcli-proxy:latest- CLI proxy sidecar for gh CLI access via mcpg DIFC proxyagent-act:<version>andagent-act:latest- Agent with GitHub Actions parity (~2GB)
These images are automatically pulled by the CLI when running commands.
The agent-act image is used when running with --agent-image act for workflows that need closer parity with GitHub Actions runner environments.
Before releasing, you can test the build process locally:
# Install pkg globally
npm install -g pkg
# Build TypeScript
npm run build
# Create Linux binary
mkdir -p release
pkg . --targets node18-linux-x64 --output release/awf
# Test the binary (requires Docker images - see below)
./release/awf-linux --help# Build images locally
docker build -t awf-test/squid:local ./containers/squid
docker build -t awf-test/agent:local ./containers/agent
docker build -t awf-test/api-proxy:local ./containers/api-proxy
docker build -t awf-test/cli-proxy:local ./containers/cli-proxy
# Test with local images
sudo ./dist/cli.js \
--build-local \
--allow-domains github.com \
'curl https://github.com'
# Or test with existing GHCR images
sudo ./dist/cli.js \
--allow-domains github.com \
'curl https://github.com'- Check the Actions tab for error logs
- Common issues:
- Build errors: Check TypeScript compilation locally with
npm run build - Docker build errors: Test image builds locally in
containers/directories - GHCR push errors: Ensure
packages: writepermission is granted - Permission errors: Ensure repository has
contents: writepermission
- Build errors: Check TypeScript compilation locally with
- Test locally before release
- Ensure all dependencies are bundled (check
pkg.assetsin package.json) - For dynamic requires, you may need to mark files/directories in
pkg.assets
If users report that Docker images can't be pulled:
- Check Packages page to verify images were published
- Verify image visibility is set to Public (not Private)
- Check image tags match what the CLI expects (version + latest)
- Users can use
--build-localas a workaround while troubleshooting
To make packages public:
- Go to repository Packages page
- Click on the package (squid, agent, api-proxy, cli-proxy, or agent-act)
- Go to Package settings
- Change visibility to Public
If you accidentally released the wrong version:
- Delete the tag remotely:
git push origin :refs/tags/v0.1.0 - Delete the release from GitHub UI
- Delete or retag the GHCR images if needed
- Re-run the workflow with the correct bump type
Pre-release versions are not currently supported via the workflow dispatch input. To create a pre-release, manually bump the version locally and push:
npm version prerelease --preid=alpha # 0.1.0 -> 0.1.1-alpha.0
git push origin main --tagsThe release workflow can then be triggered manually (it will read the pre-release version from package.json and skip the bump step since the tag already exists).
For backporting fixes to older major versions:
- Create a maintenance branch:
git checkout -b v0.x - Cherry-pick or apply fixes
- Push branch:
git push origin v0.x - Run the release workflow on the maintenance branch (select the
v0.xbranch in the UI)