From cf8d5a8389e85902fae3229ed228aaddd89f106d Mon Sep 17 00:00:00 2001 From: Yeachan-Heo Date: Tue, 31 Mar 2026 21:04:42 +0000 Subject: [PATCH] Polish session resume messaging to match the console UX Update in-REPL /resume success output to the same structured console style used elsewhere so session lifecycle commands feel consistent with status, model, permissions, config, and cost. This preserves the same behavior while improving operator readability. Constraint: Resume output must stay grounded in real restored session metadata already available after load Rejected: Add more restored-session details like cwd snapshot | that data is not yet persisted in session files Confidence: high Scope-risk: narrow Reversibility: clean Directive: Keep lifecycle command outputs stylistically aligned as the CLI surface grows Tested: cargo fmt --manifest-path ./rust/Cargo.toml --all; cargo clippy --manifest-path ./rust/Cargo.toml --workspace --all-targets -- -D warnings; cargo test --manifest-path ./rust/Cargo.toml --workspace Not-tested: Manual interactive comparison of /resume output before and after multiple restores --- rust/crates/rusty-claude-cli/src/main.rs | 31 ++++++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/rust/crates/rusty-claude-cli/src/main.rs b/rust/crates/rusty-claude-cli/src/main.rs index 994099e..fc425b0 100644 --- a/rust/crates/rusty-claude-cli/src/main.rs +++ b/rust/crates/rusty-claude-cli/src/main.rs @@ -327,6 +327,15 @@ fn format_cost_report(usage: TokenUsage) -> String { ) } +fn format_resume_report(session_path: &str, message_count: usize, turns: u32) -> String { + format!( + "Session resumed + Session file {session_path} + Messages {message_count} + Turns {turns}" + ) +} + fn run_resume_command( session_path: &Path, session: &Session, @@ -657,7 +666,10 @@ impl LiveCli { true, permission_mode_label(), )?; - println!("Resumed session from {session_path} ({message_count} messages)."); + println!( + "{}", + format_resume_report(&session_path, message_count, self.runtime.usage().turns()) + ); Ok(()) } @@ -1274,10 +1286,10 @@ fn print_help() { mod tests { use super::{ format_cost_report, format_model_report, format_model_switch_report, - format_permissions_report, format_permissions_switch_report, format_status_report, - normalize_permission_mode, parse_args, render_init_claude_md, render_repl_help, - resume_supported_slash_commands, status_context, CliAction, SlashCommand, StatusUsage, - DEFAULT_MODEL, + format_permissions_report, format_permissions_switch_report, format_resume_report, + format_status_report, normalize_permission_mode, parse_args, render_init_claude_md, + render_repl_help, resume_supported_slash_commands, status_context, CliAction, SlashCommand, + StatusUsage, DEFAULT_MODEL, }; use runtime::{ContentBlock, ConversationMessage, MessageRole}; use std::path::{Path, PathBuf}; @@ -1400,6 +1412,15 @@ mod tests { ); } + #[test] + fn resume_report_uses_sectioned_layout() { + let report = format_resume_report("session.json", 14, 6); + assert!(report.contains("Session resumed")); + assert!(report.contains("Session file session.json")); + assert!(report.contains("Messages 14")); + assert!(report.contains("Turns 6")); + } + #[test] fn cost_report_uses_sectioned_layout() { let report = format_cost_report(runtime::TokenUsage {