From 77f196f4705dcc642efda99cf426962f0c9a2cdf Mon Sep 17 00:00:00 2001 From: spytensor <17600413737@163.com> Date: Wed, 27 May 2026 09:21:23 +0400 Subject: [PATCH] chore(release): prepare v0.9.20 --- AGENTS.md | 2 +- CHANGELOG.md | 5 ++++- Cargo.lock | 2 +- Cargo.toml | 2 +- README.md | 2 +- npm/package.json | 2 +- src/ansi.rs | 39 +++++++++++---------------------------- src/repl/tests.rs | 2 +- 8 files changed, 21 insertions(+), 35 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 25bd42d..9699b48 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -5,7 +5,7 @@ repository, including Codex, Claude Code, and other terminal coding agents. ## Current Project Phase -Latest release tag: v0.9.19. +Latest release tag: v0.9.20. Active milestone: none. All currently scoped GitHub issues were closed when this file was last aligned (2026-05-27). Do not autonomously pick up new diff --git a/CHANGELOG.md b/CHANGELOG.md index d40e64b..16ba00e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.9.20] - 2026-05-27 + ### Fixed - Aligned project-truth docs and contributor templates with the current `v0.9.19` @@ -1723,7 +1725,8 @@ API stability, not feature completeness. - **No timestamps in CREP events.** `cr cost --since` honors the log file's mtime only; per-event timestamps land in v0.2. -[Unreleased]: https://github.com/spytensor/CoreRoom/compare/v0.9.19...HEAD +[Unreleased]: https://github.com/spytensor/CoreRoom/compare/v0.9.20...HEAD +[0.9.20]: https://github.com/spytensor/CoreRoom/compare/v0.9.19...v0.9.20 [0.9.19]: https://github.com/spytensor/CoreRoom/compare/v0.9.18...v0.9.19 [0.9.18]: https://github.com/spytensor/CoreRoom/compare/v0.9.17...v0.9.18 [0.9.17]: https://github.com/spytensor/CoreRoom/compare/v0.9.16...v0.9.17 diff --git a/Cargo.lock b/Cargo.lock index 0831e75..1f1e495 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -286,7 +286,7 @@ checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] name = "coreroom" -version = "0.9.19" +version = "0.9.20" dependencies = [ "anyhow", "assert_cmd", diff --git a/Cargo.toml b/Cargo.toml index cbde5a5..5a11801 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "coreroom" -version = "0.9.19" +version = "0.9.20" edition = "2021" rust-version = "1.88" authors = ["Charlie Zhu "] diff --git a/README.md b/README.md index 7f78f31..27a3790 100644 --- a/README.md +++ b/README.md @@ -123,7 +123,7 @@ Disable that with `COREROOM_NO_UPDATE_CHECK=1` or Don't have npm? Direct binary install. ```bash -TAG=v0.9.19 +TAG=v0.9.20 ARCH=$(uname -m); case "$ARCH" in arm64|aarch64) ARCH=aarch64 ;; *) ARCH=x86_64 ;; esac OS=$(uname -s | tr '[:upper:]' '[:lower:]') curl -fsSL "https://github.com/spytensor/CoreRoom/releases/download/${TAG}/cr-${TAG}-${OS}-${ARCH}.tar.gz" \ diff --git a/npm/package.json b/npm/package.json index c5d0585..becb459 100644 --- a/npm/package.json +++ b/npm/package.json @@ -1,6 +1,6 @@ { "name": "@spytensor/coreroom", - "version": "0.9.19", + "version": "0.9.20", "description": "CoreRoom is the Engineering Control Room for AI Agents: host-led, GitHub-gated AI-assisted software engineering control.", "keywords": [ "cli", diff --git a/src/ansi.rs b/src/ansi.rs index 7a85341..941a1bc 100644 --- a/src/ansi.rs +++ b/src/ansi.rs @@ -183,14 +183,13 @@ mod tests { } #[test] - fn rgb_foreground_round_trips_through_crossterm() { - let styled = "@backend".with(crossterm::style::Color::Rgb { - r: 0x6b, - g: 0xb6, - b: 0xff, - }); - let raw = styled.to_string(); - let line = ansi_to_line(&raw); + fn rgb_foreground_is_preserved() { + // Keep this as a literal SGR sequence instead of relying on + // crossterm's Display impl. The Display path intentionally honors + // environment such as NO_COLOR, but the parser must remain testable + // in release shells that disable color globally. + let raw = "\x1b[38;2;107;182;255m@backend\x1b[39m"; + let line = ansi_to_line(raw); assert!(line.spans.iter().any(|span| span.content == "@backend" && span.style.fg == Some(Color::Rgb(0x6b, 0xb6, 0xff)))); } @@ -209,12 +208,8 @@ mod tests { #[test] fn reset_returns_to_default_style() { - let raw = format!( - "{}{}", - "red".with(crossterm::style::Color::Rgb { r: 255, g: 0, b: 0 }), - "plain" - ); - let line = ansi_to_line(&raw); + let raw = "\x1b[38;2;255;0;0mred\x1b[39mplain"; + let line = ansi_to_line(raw); // The "plain" span should not inherit the red fg. let plain = line .spans @@ -241,20 +236,8 @@ mod tests { #[test] fn ansi_to_lines_splits_on_newlines() { - let raw = format!( - "{}\n{}", - "one".with(crossterm::style::Color::Rgb { - r: 50, - g: 50, - b: 50 - }), - "two".with(crossterm::style::Color::Rgb { - r: 200, - g: 200, - b: 200 - }) - ); - let lines = ansi_to_lines(&raw); + let raw = "\x1b[38;2;50;50;50mone\x1b[39m\n\x1b[38;2;200;200;200mtwo\x1b[39m"; + let lines = ansi_to_lines(raw); assert_eq!(lines.len(), 2); assert_eq!(span_fg(&lines[0], 0), Some(Color::Rgb(50, 50, 50))); assert_eq!(span_fg(&lines[1], 0), Some(Color::Rgb(200, 200, 200))); diff --git a/src/repl/tests.rs b/src/repl/tests.rs index c9ba9b9..200e441 100644 --- a/src/repl/tests.rs +++ b/src/repl/tests.rs @@ -640,7 +640,7 @@ fn snapshot_boot_dashboard_at_80() { .trim_start_matches('\n') .to_owned(); insta::assert_snapshot!(rendered, @r" -┌─ CoreRoom v0.9.19 ───────────────────────────────────────────────────────────┐ +┌─ CoreRoom v0.9.20 ───────────────────────────────────────────────────────────┐ │ │ │ welcome back, Ada tips for getting started │ │ • type @role to send a task to a sp… │