diff --git a/agentrace/cli.py b/agentrace/cli.py index c7cda50..cacf1fb 100644 --- a/agentrace/cli.py +++ b/agentrace/cli.py @@ -122,8 +122,21 @@ def cmd_show(args) -> int: if not match: console.print(f"[red]No run matching {args.id!r}[/]") return 1 - r = match[0] - console.print(f"[bold]{escape(r.description)}[/] [dim]{escape(r.tool_use_id)}[/]") + exact = next((r for r in match if r.tool_use_id == args.id), None) + if exact is not None: + r = exact + elif len(match) > 1: + console.print(f"[red]Run ID {args.id!r} is ambiguous. Matching runs:[/]") + for candidate in match: + description = candidate.description or "(none)" + console.print(f" {escape(candidate.tool_use_id)} {escape(description)}") + console.print("Please provide a more specific run ID.") + return 1 + else: + r = match[0] + console.print( + f"[bold]{escape(r.description or '(none)')}[/] [dim]{escape(r.tool_use_id)}[/]" + ) console.print(f"[dim]duration: {r.duration_s}s | background: {r.background}[/]\n") console.print("[bold cyan]PROMPT[/]") console.print(escape(r.prompt[: args.max]) if r.prompt[: args.max] else "[dim](empty)[/]") diff --git a/tests/test_agentrace.py b/tests/test_agentrace.py index 22ce91a..24a6743 100644 --- a/tests/test_agentrace.py +++ b/tests/test_agentrace.py @@ -11,8 +11,10 @@ from __future__ import annotations import json +from argparse import Namespace from datetime import UTC, datetime, timedelta +from agentrace import cli from agentrace.checks import analyse from agentrace.parse import AgentRun, parse_session @@ -192,6 +194,39 @@ def test_tool_use_without_id_is_skipped(tmp_path): assert s.runs == [] +# --------------------------------------------------------------------------- show + + +def test_show_rejects_ambiguous_short_id(monkeypatch, capsys): + runs = [ + _run(tool_use_id="toolu_alpha_shared", description="alpha"), + _run(tool_use_id="toolu_beta_shared", description=None), + ] + monkeypatch.setattr(cli, "_load", lambda args: runs) + + assert cli.cmd_show(Namespace(id="shared", max=4000)) == 1 + output = capsys.readouterr().out + assert "ambiguous" in output + assert "toolu_alpha_shared" in output + assert "alpha" in output + assert "toolu_beta_shared" in output + assert "(none)" in output + + +def test_show_prefers_exact_id_over_suffix_match(monkeypatch, capsys): + runs = [ + _run(tool_use_id="shared", description=None), + _run(tool_use_id="toolu_other_shared", description="other"), + ] + monkeypatch.setattr(cli, "_load", lambda args: runs) + + assert cli.cmd_show(Namespace(id="shared", max=4000)) == 0 + output = capsys.readouterr().out + assert "(none)" in output + assert "shared" in output + assert "toolu_other_shared" not in output + + # --------------------------------------------------------------------------- checks