Skip to content

Commit 346ea0b

Browse files
committed
Make compact output match the console-style command UX
Reformat /compact output for both live and resumed sessions so compaction results are reported in the same structured console style as the rest of the CLI surface. This keeps the behavior unchanged while making skipped and successful compaction runs easier to read. Constraint: Compact output must stay faithful to the real compaction result and not imply summarization details beyond removed/kept message counts Rejected: Expose the generated summary body directly in /compact output | too noisy for a lightweight command-response surface Confidence: high Scope-risk: narrow Reversibility: clean Directive: Keep lifecycle and maintenance command output stylistically consistent as more slash commands reach parity 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 terminal UX review of compact output on very large sessions
1 parent 6076041 commit 346ea0b

1 file changed

Lines changed: 46 additions & 21 deletions

File tree

  • rust/crates/rusty-claude-cli/src

‎rust/crates/rusty-claude-cli/src/main.rs‎

Lines changed: 46 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@ use api::{
1212
ToolResultContentBlock,
1313
};
1414

15-
use commands::{
16-
handle_slash_command, render_slash_command_help, resume_supported_slash_commands, SlashCommand,
17-
};
15+
use commands::{render_slash_command_help, resume_supported_slash_commands, SlashCommand};
1816
use compat_harness::{extract_manifest, UpstreamPaths};
1917
use render::{Spinner, TerminalRenderer};
2018
use runtime::{
@@ -358,6 +356,24 @@ fn format_init_report(path: &Path, created: bool) -> String {
358356
}
359357
}
360358

359+
fn format_compact_report(removed: usize, resulting_messages: usize, skipped: bool) -> String {
360+
if skipped {
361+
format!(
362+
"Compact
363+
Result skipped
364+
Reason session below compaction threshold
365+
Messages kept {resulting_messages}"
366+
)
367+
} else {
368+
format!(
369+
"Compact
370+
Result compacted
371+
Messages removed {removed}
372+
Messages kept {resulting_messages}"
373+
)
374+
}
375+
}
376+
361377
fn parse_git_status_metadata(status: Option<&str>) -> (Option<PathBuf>, Option<String>) {
362378
let Some(status) = status else {
363379
return (None, None);
@@ -402,23 +418,20 @@ fn run_resume_command(
402418
message: Some(render_repl_help()),
403419
}),
404420
SlashCommand::Compact => {
405-
let Some(result) = handle_slash_command(
406-
"/compact",
421+
let result = runtime::compact_session(
407422
session,
408423
CompactionConfig {
409424
max_estimated_tokens: 0,
410425
..CompactionConfig::default()
411426
},
412-
) else {
413-
return Ok(ResumeCommandOutcome {
414-
session: session.clone(),
415-
message: None,
416-
});
417-
};
418-
result.session.save_to_path(session_path)?;
427+
);
428+
let removed = result.removed_message_count;
429+
let kept = result.compacted_session.messages.len();
430+
let skipped = removed == 0;
431+
result.compacted_session.save_to_path(session_path)?;
419432
Ok(ResumeCommandOutcome {
420-
session: result.session,
421-
message: Some(result.message),
433+
session: result.compacted_session,
434+
message: Some(format_compact_report(removed, kept, skipped)),
422435
})
423436
}
424437
SlashCommand::Clear { confirm } => {
@@ -746,14 +759,16 @@ impl LiveCli {
746759
fn compact(&mut self) -> Result<(), Box<dyn std::error::Error>> {
747760
let result = self.runtime.compact(CompactionConfig::default());
748761
let removed = result.removed_message_count;
762+
let kept = result.compacted_session.messages.len();
763+
let skipped = removed == 0;
749764
self.runtime = build_runtime_with_permission_mode(
750765
result.compacted_session,
751766
self.model.clone(),
752767
self.system_prompt.clone(),
753768
true,
754769
permission_mode_label(),
755770
)?;
756-
println!("Compacted {removed} messages.");
771+
println!("{}", format_compact_report(removed, kept, skipped));
757772
Ok(())
758773
}
759774
}
@@ -1384,12 +1399,12 @@ fn print_help() {
13841399
#[cfg(test)]
13851400
mod tests {
13861401
use super::{
1387-
format_cost_report, format_init_report, format_model_report, format_model_switch_report,
1388-
format_permissions_report, format_permissions_switch_report, format_resume_report,
1389-
format_status_report, normalize_permission_mode, parse_args, parse_git_status_metadata,
1390-
render_config_report, render_init_claude_md, render_memory_report, render_repl_help,
1391-
resume_supported_slash_commands, status_context, CliAction, SlashCommand, StatusUsage,
1392-
DEFAULT_MODEL,
1402+
format_compact_report, format_cost_report, format_init_report, format_model_report,
1403+
format_model_switch_report, format_permissions_report, format_permissions_switch_report,
1404+
format_resume_report, format_status_report, normalize_permission_mode, parse_args,
1405+
parse_git_status_metadata, render_config_report, render_init_claude_md,
1406+
render_memory_report, render_repl_help, resume_supported_slash_commands, status_context,
1407+
CliAction, SlashCommand, StatusUsage, DEFAULT_MODEL,
13931408
};
13941409
use runtime::{ContentBlock, ConversationMessage, MessageRole};
13951410
use std::path::{Path, PathBuf};
@@ -1521,6 +1536,16 @@ mod tests {
15211536
assert!(report.contains("Turns 6"));
15221537
}
15231538

1539+
#[test]
1540+
fn compact_report_uses_structured_output() {
1541+
let compacted = format_compact_report(8, 5, false);
1542+
assert!(compacted.contains("Compact"));
1543+
assert!(compacted.contains("Result compacted"));
1544+
assert!(compacted.contains("Messages removed 8"));
1545+
let skipped = format_compact_report(0, 3, true);
1546+
assert!(skipped.contains("Result skipped"));
1547+
}
1548+
15241549
#[test]
15251550
fn cost_report_uses_sectioned_layout() {
15261551
let report = format_cost_report(runtime::TokenUsage {

0 commit comments

Comments
 (0)