hermes-bsd/tests/cli
Teknium c06898098b
fix(cli): clear viewport on width-change resize so the status bar can't duplicate (#49120)
The classic CLI status bar could appear twice after a horizontal terminal
resize — two bars at two widths with two different elapsed readings.

Root cause: prompt_toolkit's Application._on_resize() calls renderer.erase(),
which does cursor_up(_cursor_pos.y) + erase_down() using the _cursor_pos.y
cached from the LAST render at the OLD width (renderer.py:745). On a column
shrink the terminal reflows the already-painted full-width chrome into extra
physical rows, so the cached y undershoots: cursor_up doesn't climb past the
reflowed rows and erase_down leaves the old bar stranded ABOVE the live
origin. The next paint stacks a fresh bar below it. The existing post-resize
suppression hides the NEW bar for ~0.35s but never erases the already-reflowed
OLD one, so the ghost survives the whole window. Ctrl+L / /redraw clears it,
confirming a viewport wipe is the fix.

Fix: on a WIDTH change, _recover_after_resize now routes through the same
recovery as Ctrl+L — _clear_prompt_toolkit_screen(rebuild_scrollback=False)
(CSI 2J, visible viewport only) + _replay_output_history() — BEFORE delegating
to prompt_toolkit's resize. Banner-safe: 2J never touches scrollback history
(that's CSI 3J, which we don't send here), so the startup banner is preserved.
Rows-only resizes skip the clear (no reflow → no ghost) to avoid an extra
repaint. Tracks _last_resize_width to distinguish the two.

Tests: replace the now-obsolete 'never clears on resize' assertion with two
tests — rows-only resize delegates without clearing; width change clears the
viewport + replays and never wipes scrollback.
2026-06-19 08:43:42 -07:00
..
__init__.py
test_bracketed_paste_timeout.py fix(cli): bracketed-paste timeout prevents permanent input freeze (#16263) 2026-05-25 05:07:11 -07:00
test_branch_command.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_busy_input_mode_command.py
test_cli_approval_ui.py feat(cli): persist resolved approval/clarify prompts in scrollback (#44702) 2026-06-12 01:14:35 -07:00
test_cli_background_status_indicator.py feat(cli): show live background terminal-process count in status bar (#32061) 2026-05-25 05:35:02 -07:00
test_cli_background_tui_refresh.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_cli_bracketed_paste_sanitizer.py
test_cli_browser_connect.py refactor(cli): extract 32 slash-command handlers into CLICommandsMixin (god-file Phase 4) 2026-06-08 02:13:07 -07:00
test_cli_context_warning.py fix(context): align guidance with 64k minimum 2026-05-24 23:23:12 -07:00
test_cli_copy_command.py
test_cli_extension_hooks.py
test_cli_external_editor.py
test_cli_file_drop.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_cli_force_redraw.py fix(cli): clear viewport on width-change resize so the status bar can't duplicate (#49120) 2026-06-19 08:43:42 -07:00
test_cli_goal_interrupt.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_cli_image_command.py
test_cli_init.py fix: preserve Ctrl+J newlines in Ghostty 2026-05-28 23:30:39 -07:00
test_cli_insights_command.py
test_cli_interrupt_subagent.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_cli_light_mode.py fix(cli): stop OSC 11 bg probe from trapping users in a stray editor (#35441) 2026-05-30 11:55:12 -05:00
test_cli_loading_indicator.py
test_cli_markdown_rendering.py
test_cli_mcp_config_watch.py
test_cli_new_session.py
test_cli_prefix_matching.py
test_cli_preloaded_skills.py
test_cli_provider_resolution.py feat(tools): surface the free tool pool in entitlement + setup (#36153) 2026-06-01 06:32:48 +05:30
test_cli_reload_skills.py
test_cli_resume_command.py fix(cli): use Rich [dim] tag instead of ANSI escape in _restore_session_cwd 2026-06-05 10:00:21 +08:00
test_cli_retry.py
test_cli_save_config_value.py
test_cli_secret_capture.py fix(cli): show masked feedback for secret prompts 2026-05-25 01:20:33 -07:00
test_cli_shift_enter_newline.py
test_cli_shutdown_memory_messages.py
test_cli_skin_integration.py
test_cli_status_bar.py fix(cli): status bar no longer stays hidden after resize during idle (#49105) 2026-06-19 07:53:58 -07:00
test_cli_status_command.py
test_cli_steer_busy_path.py
test_cli_terminal_response_sanitizer.py
test_cli_terminal_shortcuts.py fix(cli): ignore terminal focus reports (salvage of #16780) 2026-05-29 00:31:44 -07:00
test_cli_tools_command.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_cli_user_message_preview.py
test_cli_yolo_toggle.py fix(cli): /yolo in chat must enable session bypass, not just set env var 2026-05-28 12:10:21 -07:00
test_compress_focus.py
test_compress_here.py Inspired by Claude Code: /compress here [N] — boundary-aware 'summarize up to here' (#35048) 2026-05-29 17:49:15 -07:00
test_cprint_bg_thread.py
test_ctrl_enter_newline.py fix: preserve Ctrl+J newlines in Ghostty 2026-05-28 23:30:39 -07:00
test_cwd_env_respect.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_destructive_slash_confirm.py fix(cli): add inline --yes/now skip for destructive slash commands (#30768) 2026-05-24 16:13:03 -07:00
test_destructive_slash_inline_skip_e2e.py fix(cli): add inline --yes/now skip for destructive slash commands (#30768) 2026-05-24 16:13:03 -07:00
test_exit_delete_session.py
test_exit_summary_resume_hint.py test(cli): cover exit resume hint -p flag across profiles 2026-05-25 01:41:54 -07:00
test_fast_command.py feat(desktop): inline model picker in the status bar 2026-06-02 19:09:41 -05:00
test_gquota_command.py
test_manual_compress.py
test_partial_compress.py Inspired by Claude Code: /compress here [N] — boundary-aware 'summarize up to here' (#35048) 2026-05-29 17:49:15 -07:00
test_personality_none.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_prefill_config.py fix(config): align prefill messages key handling 2026-06-03 23:51:44 -06:00
test_prepend_note_to_message.py refactor(cli): normalize note and avoid blank lines in prepend helper 2026-06-01 20:30:08 -07:00
test_prompt_text_input_thread_safety.py feat(billing): /billing terminal billing — interactive TUI + CLI client (#45449) 2026-06-19 01:53:32 +05:30
test_quick_commands.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_reasoning_command.py
test_resume_display.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_resume_quiet_stderr.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_save_conversation_location.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_session_boundary_hooks.py feat(observability): observer-grade telemetry hooks + NeMo-Relay plugin 2026-06-03 06:36:46 -07:00
test_single_query_session_finalize.py fix(cli): prevent duplicate one-shot finalize on interrupted cleanup (#43320) 2026-06-09 22:41:04 -07:00
test_slash_command_interrupt.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_slash_confirm_windows.py test(cli): exercise real _prompt_text_input for native-Windows confirm deadlock 2026-06-08 15:53:28 -07:00
test_steer_inline_repaint_34569.py fix(cli): repaint input area after inline /steer and /model submit (#34839) 2026-05-29 19:04:40 -07:00
test_stream_delta_think_tag.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_surrogate_sanitization.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_tool_progress_scrollback.py
test_tui_terminal_reset_on_exit.py fix(cli): reset terminal input modes on TUI exit to stop focus/mouse leaks 2026-06-01 23:27:44 +08:00
test_update_command.py
test_version_command.py Add /version slash command across CLI, gateway, TUI, and desktop. 2026-06-05 18:05:05 -07:00
test_worktree.py chore: prune unused imports and duplicate import redefinitions 2026-05-28 22:26:25 -07:00
test_worktree_security.py