AOF Release Checklist
Step-by-step process for cutting a public AOF release to npm.
Pre-Release Verification
1. Sync and verify clean state
git checkout maingit pull origin maingit status # should be clean2. Run the full test suite
npm run test # unit + integration (2,195+ tests)npm run test:e2e # end-to-end testsBoth must pass with zero failures before proceeding.
3. Run type-check
npm run typecheck # tsc --noEmit — must produce zero errors4. Verify the build is clean
rm -rf dist/npm run build # tsc + copy-extension-entry.jsBuild must complete with no errors. Verify dist/ is populated.
5. Verify CLI entry point
node dist/cli/index.js --version # should print current versionnode dist/daemon/index.js --help # should print daemon helpVersion Bump
6. Update version in package.json
# For a patch release:npm version patch --no-git-tag-version
# For a minor release:npm version minor --no-git-tag-version
# For a major release:npm version major --no-git-tag-version7. Sync version to openclaw.plugin.json
# Set the version field to match package.jsonnode -e "const fs = require('fs');const pkg = JSON.parse(fs.readFileSync('package.json','utf8'));const plugin = JSON.parse(fs.readFileSync('openclaw.plugin.json','utf8'));plugin.version = pkg.version;fs.writeFileSync('openclaw.plugin.json', JSON.stringify(plugin, null, 2) + '\n');console.log('openclaw.plugin.json updated to', pkg.version);"8. Commit version bump
git add package.json package-lock.json openclaw.plugin.jsongit commit -m "chore: release v$(node -p 'require(\"./package.json\").version')"Package Verification
9. Run npm pack dry-run
npm pack --dry-runVerify the output includes:
dist/— all compiled JS, d.ts, and map filesprompts/— agent guides and contextindex.ts— OpenClaw plugin entryopenclaw.plugin.json— OpenClaw plugin manifestREADME.md— package documentationpackage.json
Must NOT include: src/, tests/, docs/, mailbox/, tasks/, scripts/, .beads/, .learnings/
Update docs/internal/PACK-MANIFEST.txt:
npm pack --dry-run 2>&1 | grep "npm notice" > docs/internal/PACK-MANIFEST.txtgit add docs/internal/PACK-MANIFEST.txtgit commit -m "chore: update pack manifest for release"10. Verify exports work
node -e "import('./dist/index.js').then(m => console.log('Exports OK:', Object.keys(m).length, 'symbols'))"node -e "import('./dist/plugin.js').then(m => console.log('Plugin OK, default type:', typeof m.default))"Publish
11. Tag the release
VERSION=$(node -p 'require("./package.json").version')git tag "v${VERSION}"git push origin main --tags12. Publish to npm
# Dry run firstnpm publish --dry-run
# Actual publishnpm publish --access publicNote: Do NOT run
npm publishuntil CI passes on the version bump commit.
Post-Release
13. Verify installation
# In a temp directorymkdir /tmp/aof-install-test && cd /tmp/aof-install-testnpm init -ynpm install aofnode -e "import('aof').then(m => console.log('Install OK'))"14. Test CLI via npx
npx aof --version15. Create GitHub release
- Go to https://github.com/demerzel-ops/aof/releases/new
- Tag:
v{version} - Title:
AOF v{version} - Body: Summarize key changes (release-it auto-generates from conventional commits)
Notes
- Peer dependency:
openclaw >=2026.2.0is marked optional — AOF can be used as a standalone CLI and library without OpenClaw - Plugin loading: OpenClaw uses
openclaw.plugin.json’smainfield (dist/plugin.js) for plugin loading — notpackage.jsonmain - Library consumers:
import 'aof'resolves todist/index.js(full library barrel) via theexportsmap - Repository move: When repo moves to
Seldon-Engine/aof, updaterepository.urlinpackage.json