All main crates share a single version (e.g. 0.9.6). Storage backend crates
(jacs-duckdb, jacs-redb, jacs-surrealdb, jacs-postgresql) have their
own version track but their jacs dependency version must match the main version.
| File | Field |
|---|---|
jacs/Cargo.toml |
version |
binding-core/Cargo.toml |
version |
jacs-cli/Cargo.toml |
version |
jacs-mcp/Cargo.toml |
version |
jacsnpm/Cargo.toml |
version |
jacspy/Cargo.toml |
version |
jacsgo/lib/Cargo.toml |
version |
jacsnpm/package.json |
"version" |
jacspy/pyproject.toml |
version |
jacs-mcp/contract/jacs-mcp-contract.json |
"version" |
| File | Dependency |
|---|---|
binding-core/Cargo.toml |
jacs = { version = "..." } |
jacs-cli/Cargo.toml |
jacs = { version = "..." } |
jacs-cli/Cargo.toml |
jacs-mcp = { version = "..." } |
jacs-mcp/Cargo.toml |
jacs = { version = "..." } |
jacs-mcp/Cargo.toml |
jacs-binding-core = { version = "..." } |
jacs-duckdb/Cargo.toml |
jacs = { version = "..." } |
jacs-redb/Cargo.toml |
jacs = { version = "..." } |
jacs-surrealdb/Cargo.toml |
jacs = { version = "..." } |
jacs-postgresql/Cargo.toml |
jacs = { version = "..." } |
| File | Line pattern |
|---|---|
README.md |
vX.Y.Z | [Apache-2.0 ... |
jacs/README.md |
**Version**: X.Y.Z | ... |
jacs-cli/README.md |
vX.Y.Z | [Apache 2.0 ... |
CHANGELOG.md |
Add new ## X.Y.Z section at top |
make versions # show all detected versions
make check-versions # fail if versions don't matchUse the bump script to update all files automatically:
make bump-patch # 0.9.6 -> 0.9.7
make bump-minor # 0.9.6 -> 0.10.0
make bump-major # 0.9.6 -> 1.0.0This updates all Cargo.toml, package.json, pyproject.toml, contract JSON,
README footers, CHANGELOG, and storage backend crates. It also runs
cargo generate-lockfile and make check-versions automatically.
Then verify the compile:
RUSTFLAGS="-D warnings" cargo check -p jacs -p jacs-binding-core -p jacs-mcp -p jacs-cligit add -A
git commit -m "Bump version to X.Y.Z"
git pushRelease all registries (crates.io + PyPI + npm) plus CLI binaries:
make release-everythingOr release individually:
make release-jacs # crates.io (jacs, binding-core, jacs-mcp, jacs-cli)
make release-jacspy # PyPI
make release-jacsnpm # npm
make release-cli # GitHub Release binaries
make release-jacs-storage # storage backend cratesCheck each registry:
- https://crates.io/crates/jacs
- https://crates.io/crates/jacs-cli
- https://crates.io/crates/jacs-binding-core
- https://crates.io/crates/jacs-mcp
- https://pypi.org/project/jacs/
- https://www.npmjs.com/package/@hai.ai/jacs
make retry-jacspy # delete tag, retag, push
make retry-jacsnpm
make retry-cliFor crates.io, if a crate already published but a later one failed, just re-run
make release-jacs — the workflow skips already-published crates.
IMPORTANT: Storage backend crates (jacs-duckdb, jacs-redb, jacs-surrealdb,
jacs-postgresql) depend on the jacs core crate. When you bump the main JACS
version, you must also bump the storage crate versions (at least a patch bump)
because:
- Their
jacs = { version = "X.Y.Z" }dependency changes - crates.io won't let you re-publish the same version
make release-jacs-storagewill skip them if the tag already exists
So on every main version bump: update their jacs dep version and bump their
own package version (e.g. 0.1.0 -> 0.1.1).
| File | What to bump |
|---|---|
jacs-duckdb/Cargo.toml |
version + jacs dep version |
jacs-redb/Cargo.toml |
version + jacs dep version |
jacs-surrealdb/Cargo.toml |
version + jacs dep version |
jacs-postgresql/Cargo.toml |
version + jacs dep version |