Replace cargo-release with just release recipe
cargo-release assumes git branches and push semantics that conflict
with jj. A justfile recipe handles the same steps directly: validate
version, check for clean working copy, bump Cargo.toml, commit, push
bookmark via jj, and create/push the git tag.

Assisted-by: Claude Opus 4.6 via pi
change yrsnqrsvpmwrzvqykmnnnxvtsrqlxnlv
commit 28a17aeca8a12761498117d1db9a87baf9a5601a
author Alpha Chen <alpha@kejadlen.dev>
date
parent klytkwlu
diff --git a/README.md b/README.md
index c851c8c..822fdcc 100644
--- a/README.md
+++ b/README.md
@@ -163,13 +163,8 @@ let doc: kdl::KdlDocument = serde_kdl2::to_doc(&config)?;
 
 ## Releasing
 
-Releases use [cargo-release](https://github.com/crates-io/cargo-release).
-Run one of the following locally:
-
 ```sh
-cargo release patch  # 0.1.0 → 0.1.1
-cargo release minor  # 0.1.0 → 0.2.0
-cargo release major  # 0.1.0 → 1.0.0
+just release X.Y.Z
 ```
 
 This bumps the version in `Cargo.toml`, commits, tags, and pushes. GitHub
diff --git a/justfile b/justfile
index 1df132b..0e87341 100644
--- a/justfile
+++ b/justfile
@@ -53,4 +53,23 @@ mutants:
     fi
     exit "$rc"
 
+release version:
+    #!/usr/bin/env bash
+    set -euo pipefail
+    if ! echo "{{ version }}" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9.]+)?$'; then
+        echo "Usage: just release X.Y.Z[-pre]"
+        exit 1
+    fi
+    if ! jj diff --quiet; then
+        echo "Error: working copy has uncommitted changes"
+        exit 1
+    fi
+    sed -i '' 's/^version = ".*"/version = "{{ version }}"/' Cargo.toml
+    cargo check --quiet
+    jj commit -m 'Release {{ version }}'
+    jj bookmark set main -r @-
+    jj git push --remote origin -b main
+    git -C "$(jj git root)" tag "v{{ version }}" "$(jj log -r @- --no-graph -T 'commit_id')"
+    git -C "$(jj git root)" push origin "v{{ version }}"
+
 all: fmt clippy coverage
diff --git a/release.toml b/release.toml
deleted file mode 100644
index 7f575eb..0000000
--- a/release.toml
+++ /dev/null
@@ -1,4 +0,0 @@
-allow-branch = ["main"]
-sign-commit = false
-sign-tag = false
-push-remote = "origin"