mirror of
https://github.com/codewhale-hq/Codewhale.git
synced 2026-11-08 01:48:20 -10:00
fix(release): make the crate rerun blocks isolate the build dir with any cargo and stop on a reused root
Second fix-up for8b92463a2c/9ded7ce896after review (Refs CW-7445). All three confirmed findings are addressed. What - Build dir. The preflight and step 5 blocks set CARGO_HOME and CARGO_TARGET_DIR under the new root, and run the script through `python3 scripts/build-lock.py "${lock}" --`. Before, they relied on CODEWHALE_CACHE_ROOT, which only scripts/dev-cargo.sh reads. On this Mac, PATH cargo is ~/.local/bin/cargo (cargowhale), which passes metadata and publish straight through, so the build dir stayed ./target. That holds 0.10.2 tmp-registry units, so the documented blocks were refused as written, and the refusal suggested a nested root that failed the same way. CARGO_TARGET_DIR works with plain cargo and with dev-cargo.sh, which honors an inherited target dir. build-lock.py holds the machine lock whichever cargo is on PATH. publish-crates.sh's refusal now prints the same form, with the absolute build-lock.py path. The "in place of CODEWHALE_CACHE_ROOT" caveat is gone from the script and the runbook. - Token prompt. The step 5 block is wrapped in `{ ... }`, so the shell reads the whole block before `read` runs. It prompts with `printf 'crates.io token: ' >&2`, not `read -p`, which means coprocess in zsh. An empty token stops the block through `[ -n "${token}" ] &&`. The `cargo owner --list` check gets the same shape. - Reused root. Both blocks run `mkdir -p "${cache}" && mkdir "${root}" &&` ahead of the command. A missing fallback cache dir is created, and an existing root (for example a same-second rerun) stops the run. - Wording. "cache root" becomes "build directory" in the runbook, RELEASE_CHECKLIST §6 and the refusal text. web/data/agent-docs.generated.json was regenerated by `npm --prefix web run prebuild`. Verification (source:7af7549c1eplus this diff; CODEWHALE_CACHE_ROOT, CODEWHALE_BUILD_LOCK_FILE and CARGO_TARGET_DIR unset unless stated) - The preflight block was extracted from the doc and run with a cargo shim that execs ~/.local/bin/cargo and exits 99 on `publish`, with XDG_CACHE_HOME pointing at an empty scratch dir and CARGO_NET_OFFLINE=true. - bash and `zsh -f`: the fallback cache dir was created and the guard passed. Each reached "Verifying all 29 release package tarballs", and the shim saw target=<root>/target, home=<root>/cargo-home and CODEWHALE_BUILD_LOCK_HELD=1. - Plain `zsh` (not -f) skipped the shim, because ~/.zshenv prepends ~/.cargo/bin. Real `cargo publish --dry-run` then failed offline, "failed to update registry crates-io", with nothing uploaded. That is a probe artifact. - Same-second rerun: the second run stopped at "mkdir: ... File exists" and ran nothing. - The step 5 block was extracted with publish-crates.sh replaced by an env printer and piped into `bash -s` and `zsh -f -s`: - no token line: prompt only, no root created, nothing run; - token line after the block: "child token=set target=set held=1". - Real-state refusal (shim, default ~/.cargo, repo ./target): exit 1. The printed rerun is `mkdir -p ... && mkdir ... && CARGO_HOME=... CARGO_TARGET_DIR=... python3 .../scripts/build-lock.py ... -- ...`, not nested, and `bash -n` and `zsh -n` pass on it. - publish-crates.test.py under build-lock.py: "Ran 6 tests in 2.767s OK". validate-crate-publish-order.test.sh: passed. .github/scripts/release-workflows.test.js: exit 0. `bash -n` passes. shellcheck shows only SC1091, SC2154 and SC2034, all present before this change. ~/.cargo/registry/src is unchanged. - npm test (final tree, including the CW-7236 follow-up committed next): root 101/101, runtime-sdk 19/19, extension-host 420 (413 pass, 7 skipped), web node 7/7, vitest 772/772. npm run check:web: exit 0. Not verified - A real crates.io token and step 5 end to end. That needs the v0.10.2 tag, the network and a token, which are the founder's. - Interactive tty paste in bash 3.2 and in zsh. The pipe cases stand in for them. - A full cold dry run in a new root (about 19 GB). Not rerun. Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz
This commit is contained in:
1 parent
7af7549c1e
commit
3fd44b5501
4 files changed
+45
-42
No files matched your search
@@ -215,7 +215,7 @@ known limitations and publication approval. These proofs are separate.
|
||||
- [ ] Publish Cargo manually within the approved scope with the
|
||||
[runbook's step 5 block](RELEASE_RUNBOOK.md#rust-crates-release), which
|
||||
runs `./scripts/release/publish-crates.sh publish` from a new, empty
|
||||
`CARGO_HOME` and cache root with the token in `CARGO_REGISTRY_TOKEN`. It
|
||||
`CARGO_HOME` and build directory with the token in `CARGO_REGISTRY_TOKEN`. It
|
||||
verifies every package, skips already-published versions and waits for
|
||||
each new dependency to appear. npm normally uses Trusted Publishing;
|
||||
manual recovery keeps the same clean-source and public-asset guards.
|
||||
|
||||
+38
-35
@@ -148,30 +148,29 @@ directory's `*/deps/` that names such a directory. The refusal lists what it
|
||||
found and deletes nothing; removing shared cache directories still needs
|
||||
explicit cleanup approval. It prints, with the paths filled in, the kind of
|
||||
rerun that produced the 0.10.2 receipt at 14683c9983 on 2026-10-16: a new,
|
||||
empty `CARGO_HOME` and `CODEWHALE_CACHE_ROOT`.
|
||||
empty `CARGO_HOME` and build directory.
|
||||
|
||||
```bash
|
||||
mode=dry-run
|
||||
cache="${CODEWHALE_CACHE_ROOT:-${XDG_CACHE_HOME:-$HOME/.cache}/codewhale}"
|
||||
lock="${CODEWHALE_BUILD_LOCK_FILE:-${cache}/build.lock}"
|
||||
root="${cache}/release-verify-$(git rev-parse --short=10 HEAD)-${mode}-$(date -u +%Y%m%dT%H%M%SZ)"
|
||||
mkdir "${root}"
|
||||
CODEWHALE_BUILD_LOCK_FILE="${lock}" CARGO_HOME="${root}/cargo-home" \
|
||||
CODEWHALE_CACHE_ROOT="${root}" ./scripts/release/publish-crates.sh "${mode}"
|
||||
mkdir -p "${cache}" && mkdir "${root}" &&
|
||||
CARGO_HOME="${root}/cargo-home" CARGO_TARGET_DIR="${root}/target" \
|
||||
python3 scripts/build-lock.py "${lock}" -- ./scripts/release/publish-crates.sh "${mode}"
|
||||
```
|
||||
|
||||
That run was a cold build of about 19 GB and 962 compile steps, so check
|
||||
`df -h` first. `cache` and `lock` use the same fallbacks as
|
||||
`scripts/dev-cache.sh`. `CODEWHALE_CACHE_ROOT` and `CODEWHALE_BUILD_LOCK_FILE`
|
||||
take effect only when `cargo` on `PATH` is `scripts/dev-cargo.sh` or a wrapper
|
||||
that execs it, such as the strict dry-run wrapper used for the 0.10.2 receipt.
|
||||
That run kept its lock file inside the new root and did not serialize with
|
||||
other builds on the machine; `CODEWHALE_BUILD_LOCK_FILE` keeps the machine
|
||||
lock. Plain Cargo ignores both variables and takes no machine lock: set
|
||||
`CARGO_TARGET_DIR="${root}/target"` in place of `CODEWHALE_CACHE_ROOT`, and
|
||||
wrap the command in `python3 scripts/build-lock.py "${lock}" --` if other
|
||||
builds may run. Every run leaves state that the next run at the same version
|
||||
refuses, so the root name carries the SHA, the mode and a UTC timestamp:
|
||||
`scripts/dev-cache.sh`. `CARGO_TARGET_DIR` moves the build directory with
|
||||
plain Cargo and with `scripts/dev-cargo.sh`, which honors an inherited target
|
||||
directory, and `scripts/build-lock.py` holds the machine build lock whichever
|
||||
`cargo` is on `PATH`. The 0.10.2 receipt run set `CODEWHALE_CACHE_ROOT`
|
||||
instead, which only `scripts/dev-cargo.sh` reads, and kept its lock inside the
|
||||
new root. `mkdir` without `-p` refuses a root that already exists, and the
|
||||
`&&` chain stops the run there. Every run leaves state that the next run at
|
||||
the same version refuses, so the root name carries the SHA, the mode and a
|
||||
UTC timestamp:
|
||||
publish mode (step 5 of the Rust crates release) and each partial-publish
|
||||
rerun get their own root. Pass the crates.io token to publish mode as
|
||||
`CARGO_REGISTRY_TOKEN` for that one command, as step 5 shows; Cargo then
|
||||
@@ -398,16 +397,18 @@ and fails branch-only release sources before assets are published.
|
||||
|
||||
```bash
|
||||
./scripts/release/require-release-tag-checkout.sh X.Y.Z
|
||||
mode=publish
|
||||
cache="${CODEWHALE_CACHE_ROOT:-${XDG_CACHE_HOME:-$HOME/.cache}/codewhale}"
|
||||
lock="${CODEWHALE_BUILD_LOCK_FILE:-${cache}/build.lock}"
|
||||
root="${cache}/release-verify-$(git rev-parse --short=10 HEAD)-${mode}-$(date -u +%Y%m%dT%H%M%SZ)"
|
||||
mkdir "${root}"
|
||||
read -rs token
|
||||
CARGO_REGISTRY_TOKEN="${token}" CODEWHALE_BUILD_LOCK_FILE="${lock}" \
|
||||
CARGO_HOME="${root}/cargo-home" CODEWHALE_CACHE_ROOT="${root}" \
|
||||
./scripts/release/publish-crates.sh "${mode}"
|
||||
unset token
|
||||
{
|
||||
mode=publish
|
||||
cache="${CODEWHALE_CACHE_ROOT:-${XDG_CACHE_HOME:-$HOME/.cache}/codewhale}"
|
||||
lock="${CODEWHALE_BUILD_LOCK_FILE:-${cache}/build.lock}"
|
||||
root="${cache}/release-verify-$(git rev-parse --short=10 HEAD)-${mode}-$(date -u +%Y%m%dT%H%M%SZ)"
|
||||
printf 'crates.io token: ' >&2; read -rs token; echo >&2
|
||||
[ -n "${token}" ] && mkdir -p "${cache}" && mkdir "${root}" &&
|
||||
CARGO_REGISTRY_TOKEN="${token}" CARGO_HOME="${root}/cargo-home" \
|
||||
CARGO_TARGET_DIR="${root}/target" \
|
||||
python3 scripts/build-lock.py "${lock}" -- ./scripts/release/publish-crates.sh "${mode}"
|
||||
unset token
|
||||
}
|
||||
```
|
||||
|
||||
Both Cargo and npm publication fail closed unless `HEAD`, the clean local
|
||||
@@ -416,12 +417,12 @@ and fails branch-only release sources before assets are published.
|
||||
second handwritten order in this runbook. The helper waits for each new
|
||||
version to appear on crates.io before moving to dependents and safely skips
|
||||
versions that are already public on a rerun. The block runs it from a new,
|
||||
empty `CARGO_HOME` and cache root of its own, as the package preflight
|
||||
above describes; the dry run's state makes it refuse otherwise. `read -rs`
|
||||
keeps the token out of shell history, and the environment variable keeps
|
||||
it out of `credentials.toml`. The cache and lock variables take effect only
|
||||
through `scripts/dev-cargo.sh` or a wrapper that execs it; see the package
|
||||
preflight for plain Cargo.
|
||||
empty `CARGO_HOME` and build directory of its own, as the package preflight
|
||||
above describes; the dry run's state makes it refuse otherwise. The braces
|
||||
make the shell read the whole block before `read` runs, so a pasted or
|
||||
piped block never takes its own next line as the token. `read -rs` keeps
|
||||
the token out of shell history, an empty token stops the block, and the
|
||||
environment variable keeps the token out of `credentials.toml`.
|
||||
If shared `main` advances or the checkout becomes dirty, stop and coordinate
|
||||
a new candidate or separately authorized recovery with Hunter. Do not switch
|
||||
branches, create another checkout, force-fetch a conflicting tag or bypass
|
||||
@@ -621,15 +622,17 @@ for that version — bump to the next patch instead.
|
||||
credential.
|
||||
|
||||
```bash
|
||||
read -rs token
|
||||
CARGO_REGISTRY_TOKEN="${token}" cargo owner --list codewhale-tui # prints the owner, e.g. `Hmbown (Hunter Bown)`
|
||||
unset token
|
||||
{
|
||||
printf 'crates.io token: ' >&2; read -rs token; echo >&2
|
||||
[ -n "${token}" ] && CARGO_REGISTRY_TOKEN="${token}" cargo owner --list codewhale-tui # prints the owner, e.g. `Hmbown (Hunter Bown)`
|
||||
unset token
|
||||
}
|
||||
```
|
||||
|
||||
A 403 or `401` from this call, or `cargo publish` refusing credentials,
|
||||
means the token is missing/expired. Create a new token, check it with this
|
||||
call, then rerun the step 5 block. It makes another new `CARGO_HOME` and
|
||||
cache root, which the rerun needs because the failed run's own state makes
|
||||
build directory, which the rerun needs because the failed run's own state makes
|
||||
the guard refuse otherwise, and it keeps the token out of that root.
|
||||
- **npm:** the OIDC job publishes only if the npmjs.com Trusted Publisher for
|
||||
`codewhale-hq` / `Codewhale` / workflow `release.yml` / blank environment is
|
||||
@@ -652,7 +655,7 @@ for that version — bump to the next patch instead.
|
||||
with these commands
|
||||
- Crates publish partially:
|
||||
- rerun the Rust crates release step 5 block; its timestamped root gives
|
||||
each rerun another new, empty `CARGO_HOME` and cache root, and the failed
|
||||
each rerun another new, empty `CARGO_HOME` and build directory, and the failed
|
||||
run's own state makes `publish-crates.sh publish` refuse otherwise
|
||||
- already-published crate versions will be skipped
|
||||
- GitHub assets missing or checksum manifest incomplete:
|
||||
|
||||
@@ -90,10 +90,10 @@ if (( ${#reused[@]} > 0 )); then
|
||||
echo "Refusing to package release crates: Cargo would reuse ${workspace_version} state from an earlier package run instead of the current sources:"
|
||||
printf ' %s\n' "${reused[@]}"
|
||||
echo "Cargo treats crates served from its temporary package registry as immutable by name and version. It skips extraction once .cargo-ok exists and keeps compiled units that do not track their sources, so this run would verify old code. Nothing was deleted."
|
||||
echo "Rerun from a new, empty Cargo home and cache root. Every run leaves state the next run at this version refuses, so publish and each partial-publish rerun need their own root:"
|
||||
echo " mkdir \"${verify_root}\""
|
||||
echo " CODEWHALE_BUILD_LOCK_FILE=\"${CODEWHALE_BUILD_LOCK_FILE:-${cache_root}/build.lock}\" CARGO_HOME=\"${verify_root}/cargo-home\" CODEWHALE_CACHE_ROOT=\"${verify_root}\" $0 ${mode}"
|
||||
echo "CODEWHALE_CACHE_ROOT and CODEWHALE_BUILD_LOCK_FILE take effect only when cargo on PATH is scripts/dev-cargo.sh or a wrapper that execs it. Plain cargo ignores both and takes no machine build lock; with it, set CARGO_TARGET_DIR=\"${verify_root}/target\" in place of CODEWHALE_CACHE_ROOT."
|
||||
echo "Rerun from a new, empty Cargo home and build directory. Every run leaves state the next run at this version refuses, so publish and each partial-publish rerun need their own root:"
|
||||
echo " mkdir -p \"${cache_root}\" && mkdir \"${verify_root}\" &&"
|
||||
echo " CARGO_HOME=\"${verify_root}/cargo-home\" CARGO_TARGET_DIR=\"${verify_root}/target\" python3 \"$(dirname "${script_dir}")/build-lock.py\" \"${CODEWHALE_BUILD_LOCK_FILE:-${cache_root}/build.lock}\" -- $0 ${mode}"
|
||||
echo "CARGO_TARGET_DIR moves the build directory with plain cargo and with scripts/dev-cargo.sh, and build-lock.py holds the machine build lock whichever cargo is on PATH."
|
||||
echo "For publish mode, pass the crates.io token as CARGO_REGISTRY_TOKEN for that one command, so Cargo writes no credentials.toml under the new root. After cargo login with that CARGO_HOME instead, run cargo logout with it once the publish finishes. See docs/RELEASE_RUNBOOK.md."
|
||||
} >&2
|
||||
exit 1
|
||||
|
||||
@@ -357,8 +357,8 @@
|
||||
},
|
||||
{
|
||||
"path": "docs/RELEASE_CHECKLIST.md",
|
||||
"sha256": "4a0cab2b895cdc01067f0663b1f77c4993d090b3daa29b9eb29557fdfb9eb88d",
|
||||
"content": "# Release Checklist\n\nFollow this sequence from the canonical `/Volumes/VIXinSSD/CW/codewhale`\ncheckout on `main`. Agent-owned preparation lands as verified slices on `main`;\nit requires no release branch, worktree, nested clone or preparation PR.\nContributor PRs still land as PRs. Treat any unchecked required gate as a release\nblocker.\n\nFor deeper context on the underlying tools (preflight scripts, npm smoke,\npublish-crates), see [`RELEASE_RUNBOOK.md`](RELEASE_RUNBOOK.md).\nFor larger milestone releases, add any version-specific acceptance matrix to\nthe existing release packet before tagging; use it for provider routes, feature\ngates, GUI/runtime smoke, remote-workbench decisions, and credit hygiene that the\ngeneric checklist does not enumerate. Record its candidate SHA, owners, local\ncheck results, hosted run URLs, artifact inventory, install/provider receipts,\nknown limitations and publication approval. These proofs are separate.\n\n## 0. Reconcile the canonical checkout\n\n- [ ] Inspect the branch, status, upstream and alternate checkouts before editing:\n ```bash\n git branch --show-current\n git status --short --branch\n git log -5 --oneline\n git worktree list\n git fetch origin main\n git log --left-right --oneline main...origin/main\n ```\n- [ ] The canonical checkout is on `main`. Recover stranded work only after\n preserving dirty/untracked files and comparing commits with current\n `origin/main`. Keep a recoverable backup and unresolved inventory; do not\n reset away work, stash it indefinitely or create another development lane.\n- [ ] Partition files among active writers. Check status before staging and\n stage only owned paths. Historical branches/checkouts are inventoried;\n deleting them requires explicit Hunter approval even if a helper calls\n their tips safe to delete.\n\n## 1. CHANGELOG entry exists for the version\n\n- [ ] `CHANGELOG.md` has a `## [X.Y.Z] - YYYY-MM-DD` heading at the top\n- [ ] The entry credits every external contributor, harvested PR author,\n linked issue reporter, reproduction/log provider, reviewer, and\n verification helper whose work materially shaped this version. Get the\n commit list with:\n ```\n git log vPREV..HEAD --no-merges --format=\"%h %an <%ae> %s\" \\\n | grep -v '<your-email@…>'\n ```\n For each contributor, link both their display name and (when known)\n `@github-handle`. Then inspect linked issues and harvested PRs so\n reporters/helpers are not lost just because they did not author commits.\n Keep `docs/CONTRIBUTORS.md` and `web/lib/release-credits.ts` consistent.\n- [ ] The entry uses the Keep a Changelog headers — `Added`, `Changed`,\n `Fixed`, `Security`, `Removed`, `Deprecated`. Add `Known issues` only\n if there is something material the user must work around.\n- [ ] The entry mentions all referenced issue/PR numbers as `#NNNN` so the\n auto-linker on GitHub picks them up.\n- [ ] Run `scripts/sync-changelog.sh` to regenerate `crates/tui/CHANGELOG.md`\n (the recent-releases slice embedded in the binary for `/change`). Do\n not edit that file by hand, and do not copy the full root changelog\n into it — older entries live in `docs/CHANGELOG_ARCHIVE.md`.\n- [ ] Run `scripts/release/check-feature-release-notes.sh vPREV HEAD`. Every\n issue-linked `feat` commit must leave a receipt in `CHANGELOG.md` or the\n archive; the Version drift CI gate runs the same check with full history.\n\n## 2. Version pins are in sync\n\n- [ ] Use `./scripts/release/prepare-release.sh X.Y.Z` when version pins or\n generated sources need preparation. Reuse a valid preparation receipt\n when those sources are already current. The helper bumps the\n workspace version, every per-crate dependency pin, the npm wrapper\n (`version` + `codewhaleBinaryVersion`), Runtime SDK, VS Code extension\n and lock, remote-smoke default, public source-candidate facts, and README\n install-tag examples; it refreshes the Cargo/npm locks, regenerates\n `crates/tui/CHANGELOG.md` and `web/lib/facts.generated.ts`, and ends\n by running the version and OHOS gates. Write the CHANGELOG entry\n **before** running it. The helper is safe to rerun at the requested\n workspace version; it skips replacements but refreshes both generated\n files and reruns the gates.\n- [ ] `npm/deepseek-tui/package.json` remains private/compatibility-only and\n is **not** bumped or published.\n- [ ] `./scripts/release/check-versions.sh` reports\n `Version state OK: workspace=X.Y.Z, npm=X.Y.Z, npm-binary=X.Y.Z, lockfile in sync.`\n- [ ] `./scripts/release/check-ohos-deps.sh` reports that the OpenHarmony\n Windows linker keeps the target/sysroot flags, the target enables the\n `rquickjs-sys` bindgen edge, and its graph does not pull the unsupporLine truncated
|
||||
"sha256": "fd05d66251e796ceb80aa9d6864a405cf15297796e7e37ed423acdc04d53111f",
|
||||
"content": "# Release Checklist\n\nFollow this sequence from the canonical `/Volumes/VIXinSSD/CW/codewhale`\ncheckout on `main`. Agent-owned preparation lands as verified slices on `main`;\nit requires no release branch, worktree, nested clone or preparation PR.\nContributor PRs still land as PRs. Treat any unchecked required gate as a release\nblocker.\n\nFor deeper context on the underlying tools (preflight scripts, npm smoke,\npublish-crates), see [`RELEASE_RUNBOOK.md`](RELEASE_RUNBOOK.md).\nFor larger milestone releases, add any version-specific acceptance matrix to\nthe existing release packet before tagging; use it for provider routes, feature\ngates, GUI/runtime smoke, remote-workbench decisions, and credit hygiene that the\ngeneric checklist does not enumerate. Record its candidate SHA, owners, local\ncheck results, hosted run URLs, artifact inventory, install/provider receipts,\nknown limitations and publication approval. These proofs are separate.\n\n## 0. Reconcile the canonical checkout\n\n- [ ] Inspect the branch, status, upstream and alternate checkouts before editing:\n ```bash\n git branch --show-current\n git status --short --branch\n git log -5 --oneline\n git worktree list\n git fetch origin main\n git log --left-right --oneline main...origin/main\n ```\n- [ ] The canonical checkout is on `main`. Recover stranded work only after\n preserving dirty/untracked files and comparing commits with current\n `origin/main`. Keep a recoverable backup and unresolved inventory; do not\n reset away work, stash it indefinitely or create another development lane.\n- [ ] Partition files among active writers. Check status before staging and\n stage only owned paths. Historical branches/checkouts are inventoried;\n deleting them requires explicit Hunter approval even if a helper calls\n their tips safe to delete.\n\n## 1. CHANGELOG entry exists for the version\n\n- [ ] `CHANGELOG.md` has a `## [X.Y.Z] - YYYY-MM-DD` heading at the top\n- [ ] The entry credits every external contributor, harvested PR author,\n linked issue reporter, reproduction/log provider, reviewer, and\n verification helper whose work materially shaped this version. Get the\n commit list with:\n ```\n git log vPREV..HEAD --no-merges --format=\"%h %an <%ae> %s\" \\\n | grep -v '<your-email@…>'\n ```\n For each contributor, link both their display name and (when known)\n `@github-handle`. Then inspect linked issues and harvested PRs so\n reporters/helpers are not lost just because they did not author commits.\n Keep `docs/CONTRIBUTORS.md` and `web/lib/release-credits.ts` consistent.\n- [ ] The entry uses the Keep a Changelog headers — `Added`, `Changed`,\n `Fixed`, `Security`, `Removed`, `Deprecated`. Add `Known issues` only\n if there is something material the user must work around.\n- [ ] The entry mentions all referenced issue/PR numbers as `#NNNN` so the\n auto-linker on GitHub picks them up.\n- [ ] Run `scripts/sync-changelog.sh` to regenerate `crates/tui/CHANGELOG.md`\n (the recent-releases slice embedded in the binary for `/change`). Do\n not edit that file by hand, and do not copy the full root changelog\n into it — older entries live in `docs/CHANGELOG_ARCHIVE.md`.\n- [ ] Run `scripts/release/check-feature-release-notes.sh vPREV HEAD`. Every\n issue-linked `feat` commit must leave a receipt in `CHANGELOG.md` or the\n archive; the Version drift CI gate runs the same check with full history.\n\n## 2. Version pins are in sync\n\n- [ ] Use `./scripts/release/prepare-release.sh X.Y.Z` when version pins or\n generated sources need preparation. Reuse a valid preparation receipt\n when those sources are already current. The helper bumps the\n workspace version, every per-crate dependency pin, the npm wrapper\n (`version` + `codewhaleBinaryVersion`), Runtime SDK, VS Code extension\n and lock, remote-smoke default, public source-candidate facts, and README\n install-tag examples; it refreshes the Cargo/npm locks, regenerates\n `crates/tui/CHANGELOG.md` and `web/lib/facts.generated.ts`, and ends\n by running the version and OHOS gates. Write the CHANGELOG entry\n **before** running it. The helper is safe to rerun at the requested\n workspace version; it skips replacements but refreshes both generated\n files and reruns the gates.\n- [ ] `npm/deepseek-tui/package.json` remains private/compatibility-only and\n is **not** bumped or published.\n- [ ] `./scripts/release/check-versions.sh` reports\n `Version state OK: workspace=X.Y.Z, npm=X.Y.Z, npm-binary=X.Y.Z, lockfile in sync.`\n- [ ] `./scripts/release/check-ohos-deps.sh` reports that the OpenHarmony\n Windows linker keeps the target/sysroot flags, the target enables the\n `rquickjs-sys` bindgen edge, and its graph does not pull the unsupporLine truncated
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
Reference in new issue
Block a user