How to cut a release and publish the package ecosystem. Two commands do the safe parts; the actual uploads need you to be logged in to each registry.
node scripts/release.mjs check # or: npm run release:check
node scripts/release.mjs dry-run # or: npm run release:dry-run (no uploads, no credentials)
node scripts/release.mjs publish <npm|pypi|cargo|vscode|all> # after you authenticatecheck and dry-run never upload and never need credentials. Run dry-run until it's green, then publish.
The specification is versioned independently of the tools (see
standard/change-control.md). The tools do not share one number; each track
moves on its own. release.mjs check prints the current table and verifies each manifest matches its
in-source constant:
| Artifact | Registry | Version source |
|---|---|---|
aigx (CLI) |
npm | packages/aigx/package.json (+ VERSION const in bin/aigx.mjs) |
@aigx/parser |
npm | packages/parser/package.json |
@aigx/lint |
npm | packages/lint/package.json |
create-aigx |
npm | package.json (repo root) |
aigx (validator) |
PyPI | pyproject.toml (+ __version__ in tools/aigx-lint/aigx_lint.py) |
aigx (CLI) |
crates.io | crates/aigx/Cargo.toml |
| AIGX Language Support | VS Code Marketplace | editors/vscode/package.json |
Bump the version(s) you changed, update CHANGELOG.md, then run check.
node scripts/release.mjs dry-runThis runs the gates (genome lint, the 3-validator conformance suite, format check), then a dry-run of
every registry: npm publish --dry-run per package, cargo publish --dry-run, python -m build +
twine check, and vsce package. Tools that aren't installed are reported as skipped — install them to
exercise those paths (pip install build twine, npm i -g @vscode/vsce, Rust toolchain).
npm login
node scripts/release.mjs publish npmPublishes in dependency order: @aigx/parser → @aigx/lint → aigx → create-aigx. Scoped packages use
--access public (first publish of a scope). Equivalent manual commands:
npm publish --workspace @aigx/parser --access public
npm publish --workspace @aigx/lint --access public
npm publish --workspace @aigx/cli --access public
npm publish # create-aigx (repo root)pip install build twine
node scripts/release.mjs publish pypi # python -m build && twine upload dist/*Use TestPyPI first if you want a rehearsal: twine upload --repository testpypi dist/*.
cargo login # paste your crates.io token
node scripts/release.mjs publish cargo # cargo publish --manifest-path crates/aigx/Cargo.tomlThe icon (editors/vscode/icons/aigx-marketplace.png) and manifest are ready; the only requirement is that
publisher in editors/vscode/package.json is a Marketplace publisher you own (create one at
https://marketplace.visualstudio.com/manage or vsce create-publisher). Then, from editors/vscode/:
npm run package # → aigx-language-support-0.1.0.vsix (validates everything; no auth needed)
vsce login <publisher> # one-time, with your Azure DevOps PAT
npm run publish # publishes to the VS Code Marketplace
npm run publish:ovsx # mirror to Open VSX (Cursor / Windsurf / VSCodium); needs OVSX_PATTo regenerate the icon: python editors/vscode/icons/generate-icon.py.
node scripts/release.mjs publish all # after all logins abovegit tag -a vX.Y.Z -m "AIGX X.Y.Z — <summary>"
git push origin main && git push origin vX.Y.Z
gh release create vX.Y.Z --title "AIGX X.Y.Z — <summary>" --notes-file <notes> --latestPer standard/change-control.md, the notes should record the spec version,
the tool versions, breaking changes, migration notes, and a pointer to the conformance suite.
Heads-up (CI workflow): changing files under
.github/workflows/requires a token with theworkflowscope. If a push is rejected for that reason, rungh auth refresh -s workflow(or use a PAT withworkflow) and push the workflow change separately.