diff --git a/src/fenris/tui.py b/src/fenris/tui.py index 6ad5800..23d8e60 100644 --- a/src/fenris/tui.py +++ b/src/fenris/tui.py @@ -67,6 +67,11 @@ from .themes import THEMES, THEME_NAMES, get_theme, get_graph_colors # Helpers # --------------------------------------------------------------------------- +_RESUME_HINT = "r resume — enable monitoring and future boots" +_ACTION_LEGEND = ( + "p pause · " + _RESUME_HINT + " · c collect · t theme · m motion · d disclosures" +) + def _format_remaining(seconds: float) -> str: """Format remaining lifespan as human-readable string.""" if seconds <= 0: @@ -1164,7 +1169,7 @@ class FenrisTuiApp(App): # Empty store — greeting with enable hint (IN-3) self._render_headline( "[bold]No observations yet[/bold]\n\n" - "Enable monitoring: fenris monitor resume" + "[bold]%s[/bold]" % _RESUME_HINT ) self.query_one("#usage-history").set_data([]) if self._is_constrained_mode: @@ -1173,10 +1178,10 @@ class FenrisTuiApp(App): ) self.query_one("#drive-health").update("") self.query_one("#service-strip").update( - "boot: disabled · timer: inactive · last collect: unknown · freshness: empty\n" - "[bold]CONTINUITY[/bold] %s\n" - "p pause · r resume · c collect · t theme · m motion · d disclosures" - % monitoring_continuity({"boot_enabled": False}) + ( + "boot: disabled · timer: inactive · last collect: unknown · freshness: empty\n" + "[bold]CONTINUITY[/bold] %s\n" + _ACTION_LEGEND + ) % monitoring_continuity({"boot_enabled": False}) ) else: # Store fault (FL-4) @@ -1191,7 +1196,7 @@ class FenrisTuiApp(App): ) self.query_one("#drive-health").update("") self.query_one("#service-strip").update( - "p pause · r resume · c collect · t theme · m motion · d disclosures" + _ACTION_LEGEND ) def _render_all_regions(self, conn: sqlite3.Connection) -> None: @@ -1279,16 +1284,14 @@ class FenrisTuiApp(App): status_text = render_status_tui(comp) # Add TUI-only actions self.query_one("#service-strip").update( - "%s\n" - "p pause · r resume · c collect · t theme · m motion · d disclosures" - % status_text + "%s\n%s" % (status_text, _ACTION_LEGEND) ) self._render_paused_banner(comp) except Exception: self._hide_paused_banner() self.query_one("#service-strip").update( "boot: unknown · timer: unknown · last collect: unknown · freshness: unknown\n" - "p pause · r resume · c collect · t theme · m motion · d disclosures" + + _ACTION_LEGEND ) def _render_paused_banner(self, comp) -> None: diff --git a/tests/test_tui.py b/tests/test_tui.py index 72e81e6..603e5fb 100644 --- a/tests/test_tui.py +++ b/tests/test_tui.py @@ -425,7 +425,7 @@ class TestDenseScreen: quit_rail = app.query_one("#quit-rail") assert "continuity" in strip assert "monitoring: active in background · persists across reboots" in strip - assert "p pause · r resume · c collect · t theme · m motion · d disclosures" in strip + assert "r resume — enable monitoring and future boots" in strip assert "q quit" not in strip assert rail == "q QUIT TUI" assert usage.region.y < service.region.y < quit_rail.region.y @@ -597,13 +597,14 @@ class TestDisclosuresAndGreeting: class TestFirstRun: @pytest.mark.asyncio async def test_first_run_prompt(self, tmp_path): - """First-run prompt enables timer and opens first period.""" + """First-run prompt makes the keyboard action and boot effect explicit.""" app = FenrisTuiApp(store_path=tmp_path / "nonexistent.db") async with app.run_test() as pilot: headline = str(app.query_one("#headline-band").render()) + strip = str(app.query_one("#service-strip").render()) assert "no observations yet" in headline.lower() - # The enable hint should mention resume - assert "resume" in headline.lower() + assert "r resume — enable monitoring and future boots" in headline.lower() + assert "r resume — enable monitoring and future boots" in strip.lower() # ---------------------------------------------------------------------------