Skip to content

Commit a97e0c8

Browse files
KooshaPariKooshaParicursoragent
authored
chore(release): prepare v0.1.0 tag + crates.io publish path (#146)
Add dated CHANGELOG [0.1.0], cutting-a-release runbook, publish metadata, and version+path CLI deps. klipdot-capture stays publish=false for this cut. Co-authored-by: KooshaPari <koosha@example.com> Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent de706d6 commit a97e0c8

7 files changed

Lines changed: 163 additions & 5 deletions

File tree

CHANGELOG.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,34 @@ All notable changes to this project will be documented in this file.
1616

1717
### Security
1818

19+
## [0.1.0] - 2026-07-20
20+
21+
First crates.io-ready workspace release for the Rust journey harness.
22+
23+
### Added
24+
25+
- Release operator runbook: [`docs/guides/cutting-a-release.md`](docs/guides/cutting-a-release.md)
26+
(tag `v0.1.0` + ordered `cargo publish` for core → observability → CLI).
27+
- Publish-ready package metadata on `phenotype-journey-core`,
28+
`phenotype-journeys-observability`, and `phenotype-journey` (authors,
29+
homepage, keywords, categories, readme).
30+
- Version+path dependency wiring so the CLI can publish after its library
31+
crates are on crates.io.
32+
33+
### Changed
34+
35+
- `klipdot-capture` remains `publish = false` for this cut (local KlipDot
36+
daemon; not part of the journey harness crates.io surface).
37+
38+
### Notes
39+
40+
- T0 honesty still applies until T2 publish completes: prefer path/git
41+
install (`cargo install --path bin/phenotype-journey` /
42+
`cargo install --git …`). Do not advertise crates.io install until
43+
`cargo publish` for the three crates above succeeds.
44+
- npm packages (`@phenotype/journey-viewer`, etc.) stay on the GitHub
45+
Packages path — see `npm/PUBLISHING.md`.
46+
1947
## 🐛 Bug Fixes
2048
- Fix(journey-viewer): pin lightbox toolbar so caption expansion never clips controls
2149

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@
2828
| crates.io | **Not published** — do not use `cargo install phenotype-journey` / `cargo add phenotype-journey-core` |
2929
| npm | **Not on public npmjs.com**; GitHub Packages publish is documented but packages may be absent — prefer path/git |
3030
| Install path | from source — see [Install](#install) |
31-
| Focus | T0 — install/publish honesty + safe Dependabot cargo bumps |
31+
| Focus | T0 honesty (path/git) → T1 tag `v0.1.0` → T2 crates.io (see [cutting-a-release](docs/guides/cutting-a-release.md)) |
3232

3333
> Honest gap: local `cargo test --locked` is the verification gate. End-user
34-
> install is path/git only until a tagged release and crates.io (Rust) /
35-
> registry (npm) publish land (T1).
34+
> install is path/git only until a tagged release **and** crates.io publish
35+
> land ([cutting-a-release](docs/guides/cutting-a-release.md)).
3636
3737
# phenotype-journeys
3838

bin/phenotype-journey/Cargo.toml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@ version.workspace = true
44
edition.workspace = true
55
license.workspace = true
66
repository.workspace = true
7+
authors.workspace = true
8+
homepage = "https://github.com/KooshaPari/phenotype-journeys"
9+
readme = "../../README.md"
710
description = "CLI for recording, validating, verifying and syncing Phenotype journey manifests"
11+
keywords = ["journey", "manifest", "verification", "phenotype", "cli"]
12+
categories = ["command-line-utilities", "development-tools"]
13+
# Publish last (after core + observability) — see docs/guides/cutting-a-release.md.
814

915
[[bin]]
1016
name = "phenotype-journey"
@@ -15,8 +21,9 @@ default = []
1521
vision = ["phenotype-journey-core/vision"]
1622

1723
[dependencies]
18-
phenotype-journey-core = { path = "../../crates/phenotype-journey-core" }
19-
phenotype-journeys-observability = { path = "../../crates/phenotype-journeys-observability" }
24+
# version+path: local builds use path; crates.io publish resolves version.
25+
phenotype-journey-core = { version = "0.1.0", path = "../../crates/phenotype-journey-core" }
26+
phenotype-journeys-observability = { version = "0.1.0", path = "../../crates/phenotype-journeys-observability" }
2027
tracing = "0.1"
2128
clap = { workspace = true }
2229
serde_json = { workspace = true }

crates/klipdot-capture/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ license.workspace = true
66
repository.workspace = true
77
authors.workspace = true
88
description = "KlipDot daemon: terminal image interceptor and clipboard processor"
9+
# Not part of the journey harness crates.io surface for 0.1.0.
10+
# Local/path install only until a dedicated KlipDot publish cut.
11+
publish = false
912

1013
[dependencies]
1114
tokio = { version = "1.52", features = ["full", "process"] }

crates/phenotype-journey-core/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@ version.workspace = true
44
edition.workspace = true
55
license.workspace = true
66
repository.workspace = true
7+
authors.workspace = true
8+
homepage = "https://github.com/KooshaPari/phenotype-journeys"
9+
readme = "../../README.md"
710
description = "Shared types and verification logic for Phenotype journey manifests"
11+
keywords = ["journey", "manifest", "verification", "phenotype", "cli"]
12+
categories = ["development-tools", "command-line-utilities"]
13+
# First crates.io publish is T2 after tag v0.1.0 — see docs/guides/cutting-a-release.md.
814

915
[dependencies]
1016
serde = { workspace = true }

crates/phenotype-journeys-observability/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,13 @@ version.workspace = true
44
edition.workspace = true
55
license.workspace = true
66
repository.workspace = true
7+
authors.workspace = true
8+
homepage = "https://github.com/KooshaPari/phenotype-journeys"
9+
readme = "../../README.md"
710
description = "OTel/OTLP observability for the phenotype-journeys workspace"
11+
keywords = ["opentelemetry", "otlp", "tracing", "phenotype", "observability"]
12+
categories = ["development-tools", "development-tools::debugging"]
13+
# Publish after phenotype-journey-core — see docs/guides/cutting-a-release.md.
814

915
[dependencies]
1016
# Standard tracing facade + OTLP exporter (no external git dep required)

docs/guides/cutting-a-release.md

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
# Cutting a phenotype-journeys release
2+
3+
Operator runbook for tagging `v0.1.0` (T1) and publishing Rust crates to
4+
crates.io (T2). Do **not** run these until `main` has the release-ready
5+
CHANGELOG section and local quality gates are green.
6+
7+
T0 honesty still applies until T2 completes: end-user install remains
8+
**path/git only** — do not advertise `cargo install phenotype-journey` /
9+
`cargo add phenotype-journey-core` until crates.io publish succeeds.
10+
11+
## Preconditions
12+
13+
```bash
14+
cd /path/to/phenotype-journeys # worktree or canonical after merge
15+
git checkout main
16+
git pull --rebase origin main
17+
cargo test --locked
18+
cargo clippy --workspace --all-targets --locked -- -D warnings
19+
grep -A2 '## \[0.1.0\]' CHANGELOG.md # section must exist with a date
20+
```
21+
22+
Confirm root `Cargo.toml` `workspace.package.version = "0.1.0"` matches the
23+
CHANGELOG heading.
24+
25+
## Publish order (crates.io)
26+
27+
Publish in dependency order. Do **not** publish `klipdot-capture` in this
28+
release (`publish = false` — local KlipDot daemon, not part of the journey
29+
harness crates.io surface).
30+
31+
| Order | Crate | Notes |
32+
|------:|-------|-------|
33+
| 1 | `phenotype-journey-core` | No workspace path deps |
34+
| 2 | `phenotype-journeys-observability` | No workspace path deps |
35+
| 3 | `phenotype-journey` | Depends on (1) and (2) via version+path |
36+
37+
## T1 — git tag + GitHub Release (no crates.io yet)
38+
39+
Exact commands (annotated tag preferred):
40+
41+
```bash
42+
git tag -a v0.1.0 -m "phenotype-journeys v0.1.0"
43+
git push origin v0.1.0
44+
45+
gh release create v0.1.0 \
46+
--title "v0.1.0" \
47+
--notes-file <(sed -n '/## \[0.1.0\]/,/^## \[/p' CHANGELOG.md | sed '$d')
48+
```
49+
50+
Alternate notes from the tag:
51+
52+
```bash
53+
gh release create v0.1.0 --title "v0.1.0" --notes-from-tag
54+
```
55+
56+
Publishing the GitHub Release triggers
57+
[`.github/workflows/release-attestation.yml`](../../.github/workflows/release-attestation.yml)
58+
(SLSA build attestation). GitHub Actions billing may block the run — treat
59+
attestation as best-effort; do not block crates.io publish on Actions green.
60+
61+
Do **not** run `cargo publish` in T1.
62+
63+
## T2 — crates.io publish
64+
65+
After the tag exists on the release commit:
66+
67+
```bash
68+
cargo login # once per machine / token
69+
70+
# Pre-T2 local check (path deps): CLI builds without needing crates.io yet
71+
cargo build -p phenotype-journey --locked
72+
73+
# 1) library (types + verify)
74+
cargo publish -p phenotype-journey-core --dry-run --locked
75+
cargo publish -p phenotype-journey-core --locked
76+
77+
# 2) observability adapter
78+
cargo publish -p phenotype-journeys-observability --dry-run --locked
79+
cargo publish -p phenotype-journeys-observability --locked
80+
81+
# 3) CLI — dry-run only works AFTER 1+2 are indexed on crates.io.
82+
# Before that, expect: "no matching package named `phenotype-journey-core`".
83+
# Wait a few seconds / retry if the index lags.
84+
cargo publish -p phenotype-journey --dry-run --locked
85+
cargo publish -p phenotype-journey --locked
86+
```
87+
88+
After a successful publish:
89+
90+
1. Prefer `cargo install phenotype-journey --locked` / `cargo add phenotype-journey-core` in README Install.
91+
2. Update Work State: crates.io = published; keep git tag / Release as done.
92+
3. npm packages remain on the separate GitHub Packages path (`npm/PUBLISHING.md`).
93+
94+
## Rollback / mistakes
95+
96+
- Wrong tag before push: `git tag -d v0.1.0` (local only).
97+
- Wrong tag already pushed: do **not** force-delete without explicit operator
98+
approval; prefer a patch tag (`v0.1.1`) and a forward CHANGELOG entry.
99+
- Never `cargo publish` a version that does not match the git tag / CHANGELOG.
100+
- crates.io versions are immutable — yank only for severe breakage, then ship
101+
a patch.
102+
103+
## Related
104+
105+
- [CHANGELOG.md](../../CHANGELOG.md)
106+
- [docs/slsa.md](../slsa.md) — attestation / provenance
107+
- [README.md](../../README.md) — install honesty until crates.io lands
108+
- [npm/PUBLISHING.md](../../npm/PUBLISHING.md) — npm / GitHub Packages

0 commit comments

Comments
 (0)