Skip to content

Commit fc9b601

Browse files
committed
some doc updates, version bump,
1 parent fe92e95 commit fc9b601

22 files changed

Lines changed: 210 additions & 37 deletions

File tree

.github/workflows/release-crate.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ jobs:
4545

4646
- uses: actions-rust-lang/setup-rust-toolchain@v1
4747

48+
- name: Pre-publish compile check (all crates)
49+
run: |
50+
echo "Checking all publishable crates compile cleanly with -D warnings..."
51+
cargo check -p jacs -p jacs-binding-core -p jacs-mcp -p jacs-cli
52+
echo "All crates compile cleanly"
53+
4854
- name: Publish jacs to crates.io
4955
run: |
5056
LATEST=$(curl -sL --retry 3 --retry-delay 5 -H 'User-Agent: jacs-ci (https://github.com/HumanAssisted/JACS)' https://crates.io/api/v1/crates/jacs | python3 -c "import sys,json; print(json.load(sys.stdin)['crate']['max_version'])" 2>/dev/null || echo "")

AGENTS.md

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,49 @@ Welcome.
22

33
You may use the top level Cargo.toml to understand the repo.
44
jacs/ is the directory with the core library.
5-
./jacspy is the python wrapper with functionality for integrations
6-
./jacsnpm is the npm/node wrapper with functionality for integrations
5+
./jacspy is the python wrapper with functionality for integrations
6+
./jacsnpm is the npm/node wrapper with functionality for integrations
77

88
Look for examples in tests for how to use the library.
99
README.md and CHANGELOG.md may be useful to understand some future goals and what has been done.
1010

11+
## Releasing
12+
13+
See **[RELEASING.md](./RELEASING.md)** for the complete release process, including
14+
the full file checklist, tag-based CI workflow, and troubleshooting failed releases.
15+
1116
## Version Bump Checklist
1217

1318
When bumping the JACS version, **all** of the following locations must be updated to the same version. The publish order matters — crates.io requires dependencies to be published before dependents.
1419

20+
### Makefile commands
21+
22+
```bash
23+
make versions # show all detected versions from source files
24+
make check-versions # fail if any main-track versions don't match
25+
26+
# Pre-publish compile check (catches -D warnings failures before publish)
27+
RUSTFLAGS="-D warnings" cargo check -p jacs -p jacs-binding-core -p jacs-mcp -p jacs-cli
28+
29+
# CI-triggered releases (via git tags)
30+
make release-jacs # crates.io (jacs, binding-core, jacs-mcp, jacs-cli)
31+
make release-jacspy # PyPI
32+
make release-jacsnpm # npm
33+
make release-cli # GitHub Release binaries
34+
make release-jacs-storage # storage backend crates
35+
make release-everything # all of the above
36+
37+
# Retry failed releases (deletes tag, retags, pushes)
38+
make retry-jacspy
39+
make retry-jacsnpm
40+
make retry-cli
41+
42+
# Local publish (requires credentials)
43+
make publish-jacs # all Rust crates in dependency order
44+
make publish-jacspy # PyPI
45+
make publish-jacsnpm # npm
46+
```
47+
1548
### Publish Order (crates.io)
1649

1750
Crates must be published in this order with ~30s delays between each for crates.io indexing:
@@ -21,7 +54,7 @@ Crates must be published in this order with ~30s delays between each for crates.
2154
3. `jacs-mcp` (depends on `jacs` + `jacs-binding-core`)
2255
4. `jacs-cli` (depends on `jacs` + `jacs-mcp`)
2356

24-
Use `make publish-jacs` for local publish or `make release-jacs` for CI-triggered publish.
57+
The CI workflow (`release-crate.yml`) and `make publish-jacs` handle this order automatically.
2558

2659
### JACS Repo — Cargo.toml files (package version)
2760

@@ -45,6 +78,19 @@ Use `make publish-jacs` for local publish or `make release-jacs` for CI-triggere
4578
| `jacs-cli/Cargo.toml` | `jacs = { version = "X.Y.Z", path = ... }` |
4679
| `jacs-cli/Cargo.toml` | `jacs-mcp = { version = "X.Y.Z", path = ... }` |
4780

81+
### Storage backend crates
82+
83+
These have their own version track (e.g. `0.1.0`). Bump their package `version`
84+
only when they have actual changes. **Always** keep their `jacs` dependency
85+
version in sync with the main release.
86+
87+
| File | Fields |
88+
|------|--------|
89+
| `jacs-duckdb/Cargo.toml` | `version` (own track), `jacs = { version = "X.Y.Z" }` |
90+
| `jacs-redb/Cargo.toml` | `version` (own track), `jacs = { version = "X.Y.Z" }` |
91+
| `jacs-surrealdb/Cargo.toml` | `version` (own track), `jacs = { version = "X.Y.Z" }` |
92+
| `jacs-postgresql/Cargo.toml` | `version` (own track), `jacs = { version = "X.Y.Z" }` |
93+
4894
### JACS Repo — Non-Rust package manifests
4995

5096
| File | Field |
@@ -65,6 +111,7 @@ Use `make publish-jacs` for local publish or `make release-jacs` for CI-triggere
65111
| `README.md` | Footer version line |
66112
| `jacs/README.md` | Footer version line |
67113
| `jacs-cli/README.md` | Footer version line |
114+
| `CHANGELOG.md` | Add new `## X.Y.Z` section at top |
68115

69116
### haisdk Repo — JACS version pins
70117

@@ -83,13 +130,16 @@ After bumping, verify with:
83130

84131
```bash
85132
# Check all JACS versions match
86-
make versions
133+
make check-versions
134+
135+
# Verify workspace compiles cleanly (same flags as CI)
136+
RUSTFLAGS="-D warnings" cargo check -p jacs -p jacs-binding-core -p jacs-mcp -p jacs-cli
87137

88-
# Verify workspace compiles
89-
cargo check --workspace
138+
# Regenerate lockfile
139+
cargo generate-lockfile
90140

91141
# Run tests
92-
make test
142+
make test-rust-pr
93143
```
94144

95145
## Install Commands

CHANGELOG.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
## 0.9.5
1+
## 0.9.6
22

33
### Fixes
44

5+
- Fix jacs-cli publish failure: remove unused `SimpleAgent` imports that caused `-D warnings` compile errors in CI
6+
- Fix crates.io release workflow: add explicit `cargo check -D warnings` step before publish so compile failures are caught early
57
- Include `deprecation.js` and `deprecation.d.ts` in npm package bundle (was missing from `files` in package.json)
68

9+
### Docs
10+
11+
- Add `RELEASING.md` with complete version bump checklist and release process
12+
713
## 0.9.4
814

915
### API and core

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,4 +234,4 @@ Framework adapters for signing AI outputs with zero infrastructure:
234234

235235
---
236236

237-
v0.9.5 | [Apache-2.0 OR MIT](./LICENSE-APACHE) | [Third-Party Notices](./THIRD-PARTY-NOTICES)
237+
v0.9.6 | [Apache-2.0 OR MIT](./LICENSE-APACHE) | [Third-Party Notices](./THIRD-PARTY-NOTICES)

RELEASING.md

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
# Releasing JACS
2+
3+
## Files to update when bumping versions
4+
5+
All main crates share a single version (e.g. `0.9.6`). Storage backend crates
6+
(`jacs-duckdb`, `jacs-redb`, `jacs-surrealdb`, `jacs-postgresql`) have their
7+
own version track but their `jacs` dependency version must match the main version.
8+
9+
### Package versions (the `version = "X.Y.Z"` line)
10+
11+
| File | Field |
12+
|------|-------|
13+
| `jacs/Cargo.toml` | `version` |
14+
| `binding-core/Cargo.toml` | `version` |
15+
| `jacs-cli/Cargo.toml` | `version` |
16+
| `jacs-mcp/Cargo.toml` | `version` |
17+
| `jacsnpm/Cargo.toml` | `version` |
18+
| `jacspy/Cargo.toml` | `version` |
19+
| `jacsgo/lib/Cargo.toml` | `version` |
20+
| `jacsnpm/package.json` | `"version"` |
21+
| `jacspy/pyproject.toml` | `version` |
22+
| `jacs-mcp/contract/jacs-mcp-contract.json` | `"version"` |
23+
24+
### Inter-crate dependency versions
25+
26+
| File | Dependency |
27+
|------|-----------|
28+
| `binding-core/Cargo.toml` | `jacs = { version = "..." }` |
29+
| `jacs-cli/Cargo.toml` | `jacs = { version = "..." }` |
30+
| `jacs-cli/Cargo.toml` | `jacs-mcp = { version = "..." }` |
31+
| `jacs-mcp/Cargo.toml` | `jacs = { version = "..." }` |
32+
| `jacs-mcp/Cargo.toml` | `jacs-binding-core = { version = "..." }` |
33+
| `jacs-duckdb/Cargo.toml` | `jacs = { version = "..." }` |
34+
| `jacs-redb/Cargo.toml` | `jacs = { version = "..." }` |
35+
| `jacs-surrealdb/Cargo.toml` | `jacs = { version = "..." }` |
36+
| `jacs-postgresql/Cargo.toml` | `jacs = { version = "..." }` |
37+
38+
### Documentation version references
39+
40+
| File | Line pattern |
41+
|------|-------------|
42+
| `README.md` | `vX.Y.Z \| [Apache-2.0 ...` |
43+
| `jacs/README.md` | `**Version**: X.Y.Z \| ...` |
44+
| `jacs-cli/README.md` | `vX.Y.Z \| [Apache 2.0 ...` |
45+
| `CHANGELOG.md` | Add new `## X.Y.Z` section at top |
46+
47+
## Quick version check
48+
49+
```bash
50+
make versions # show all detected versions
51+
make check-versions # fail if versions don't match
52+
```
53+
54+
## Release process
55+
56+
### 1. Bump versions
57+
58+
Update all files listed above. Then verify:
59+
60+
```bash
61+
make check-versions
62+
cargo generate-lockfile
63+
RUSTFLAGS="-D warnings" cargo check -p jacs -p jacs-binding-core -p jacs-mcp -p jacs-cli
64+
```
65+
66+
### 2. Commit and push
67+
68+
```bash
69+
git add -A
70+
git commit -m "Bump version to X.Y.Z"
71+
git push
72+
```
73+
74+
### 3. Release via tags
75+
76+
Release all registries (crates.io + PyPI + npm) plus CLI binaries:
77+
78+
```bash
79+
make release-everything
80+
```
81+
82+
Or release individually:
83+
84+
```bash
85+
make release-jacs # crates.io (jacs, binding-core, jacs-mcp, jacs-cli)
86+
make release-jacspy # PyPI
87+
make release-jacsnpm # npm
88+
make release-cli # GitHub Release binaries
89+
make release-jacs-storage # storage backend crates
90+
```
91+
92+
### 4. Verify
93+
94+
Check each registry:
95+
- https://crates.io/crates/jacs
96+
- https://crates.io/crates/jacs-cli
97+
- https://crates.io/crates/jacs-binding-core
98+
- https://crates.io/crates/jacs-mcp
99+
- https://pypi.org/project/jacs/
100+
- https://www.npmjs.com/package/@hai.ai/jacs
101+
102+
### Retrying failed releases
103+
104+
```bash
105+
make retry-jacspy # delete tag, retag, push
106+
make retry-jacsnpm
107+
make retry-cli
108+
```
109+
110+
For crates.io, if a crate already published but a later one failed, just re-run
111+
`make release-jacs` — the workflow skips already-published crates.
112+
113+
### Storage backend crates
114+
115+
These have independent version tracks. Bump their `version` field only when
116+
they have actual changes. Always keep their `jacs` dependency version in sync
117+
with the main release version.

binding-core/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "jacs-binding-core"
3-
version = "0.9.5"
3+
version = "0.9.6"
44
edition = "2024"
55
rust-version = "1.93"
66
resolver = "3"
@@ -19,7 +19,7 @@ attestation = ["jacs/attestation"]
1919
pq-tests = []
2020

2121
[dependencies]
22-
jacs = { version = "0.9.5", path = "../jacs" }
22+
jacs = { version = "0.9.6", path = "../jacs" }
2323
serde_json = "1.0"
2424
base64 = "0.22.1"
2525
serde = { version = "1.0", features = ["derive"] }

jacs-cli/Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "jacs-cli"
3-
version = "0.9.5"
3+
version = "0.9.6"
44
edition = "2024"
55
rust-version = "1.93"
66
description = "JACS CLI: command-line interface for JSON AI Communication Standard"
@@ -22,8 +22,8 @@ mcp = ["dep:jacs-mcp"]
2222
attestation = ["jacs/attestation"]
2323

2424
[dependencies]
25-
jacs = { version = "0.9.5", path = "../jacs" }
26-
jacs-mcp = { version = "0.9.5", path = "../jacs-mcp", features = ["mcp", "full-tools"], optional = true }
25+
jacs = { version = "0.9.6", path = "../jacs" }
26+
jacs-mcp = { version = "0.9.6", path = "../jacs-mcp", features = ["mcp", "full-tools"], optional = true }
2727
clap = { version = "4.5.4", features = ["derive", "cargo"] }
2828
rpassword = "7.3.1"
2929
reqwest = { version = "0.13.2", default-features = false, features = ["blocking", "json", "rustls"] }

jacs-cli/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,4 @@ The MCP server uses stdio transport only (no HTTP) for security.
7171
- [MCP Integration](https://humanassisted.github.io/JACS/integrations/mcp.html)
7272
- [JACS core library on crates.io](https://crates.io/crates/jacs)
7373

74-
v0.9.5 | [Apache 2.0 with Common Clause](../LICENSE)
74+
v0.9.6 | [Apache 2.0 with Common Clause](../LICENSE)

jacs-cli/src/main.rs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1742,8 +1742,6 @@ pub fn main() -> Result<(), Box<dyn Error>> {
17421742
}
17431743
}
17441744
Some(("serve", serve_matches)) => {
1745-
use jacs::simple::SimpleAgent;
1746-
17471745
let port = *serve_matches.get_one::<u16>("port").unwrap();
17481746
let host = serve_matches
17491747
.get_one::<String>("host")
@@ -1835,8 +1833,6 @@ pub fn main() -> Result<(), Box<dyn Error>> {
18351833
}
18361834
}
18371835
Some(("quickstart", qs_matches)) => {
1838-
use jacs::simple::SimpleAgent;
1839-
18401836
let port = *qs_matches.get_one::<u16>("port").unwrap();
18411837
let host = qs_matches
18421838
.get_one::<String>("host")
@@ -1950,8 +1946,6 @@ pub fn main() -> Result<(), Box<dyn Error>> {
19501946
_ => println!("please enter subcommand see jacs a2a --help"),
19511947
},
19521948
Some(("quickstart", qs_matches)) => {
1953-
use jacs::simple::SimpleAgent;
1954-
19551949
let algorithm = qs_matches
19561950
.get_one::<String>("algorithm")
19571951
.map(|s| s.as_str());
@@ -2255,7 +2249,7 @@ pub fn main() -> Result<(), Box<dyn Error>> {
22552249
process::exit(1);
22562250
});
22572251

2258-
let (agent, _info) = SimpleAgent::ephemeral(Some("ring-Ed25519"))
2252+
let (_agent, _info) = SimpleAgent::ephemeral(Some("ring-Ed25519"))
22592253
.unwrap_or_else(|e| {
22602254
eprintln!("Failed to create agent: {}", e);
22612255
process::exit(1);

jacs-duckdb/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ keywords = ["cryptography", "json", "duckdb", "storage"]
1313
categories = ["database", "data-structures"]
1414

1515
[dependencies]
16-
jacs = { version = "0.9.5", path = "../jacs", default-features = false }
16+
jacs = { version = "0.9.6", path = "../jacs", default-features = false }
1717
duckdb = { version = "1.4", features = ["bundled", "json"] }
1818
serde_json = "1.0"
1919

0 commit comments

Comments
 (0)