diff --git a/nanobot/command/builtin.py b/nanobot/command/builtin.py index ee8630d1..db788080 100644 --- a/nanobot/command/builtin.py +++ b/nanobot/command/builtin.py @@ -650,7 +650,7 @@ def _format_dream_restore_list(commits: list) -> str: "", ] for c in commits: - lines.append(f"- `{c.sha}` {c.timestamp} - {c.message.splitlines()[0]}") + lines.append(f"- `{c.sha}` {c.timestamp} - {c.subject()}") lines.extend([ "", "Preview a version with `/dream-log ` before restoring it.", diff --git a/nanobot/utils/gitstore.py b/nanobot/utils/gitstore.py index 1ccf3d0c..4d40e2cd 100644 --- a/nanobot/utils/gitstore.py +++ b/nanobot/utils/gitstore.py @@ -22,9 +22,14 @@ class CommitInfo: message: str timestamp: str # Formatted datetime + def subject(self) -> str: + """First line of the commit message, or a placeholder if empty.""" + lines = self.message.splitlines() + return lines[0] if lines else "(no message)" + def format(self, diff: str = "") -> str: """Format this commit for display, optionally with a diff.""" - header = f"## {self.message.splitlines()[0]}\n`{self.sha}` — {self.timestamp}\n" + header = f"## {self.subject()}\n`{self.sha}` — {self.timestamp}\n" if diff: return f"{header}\n```diff\n{diff}\n```" return f"{header}\n(no file changes)" diff --git a/tests/agent/test_git_store.py b/tests/agent/test_git_store.py index 09b16b60..fa893d66 100644 --- a/tests/agent/test_git_store.py +++ b/tests/agent/test_git_store.py @@ -227,6 +227,14 @@ class TestCommitInfoFormat: result = c.format() assert "(no file changes)" in result + def test_format_empty_message(self): + from nanobot.utils.gitstore import CommitInfo + c = CommitInfo(sha="abcd1234", message="", timestamp="2026-04-02 12:00") + result = c.format() + assert "(no message)" in result + assert "`abcd1234`" in result + assert c.subject() == "(no message)" + class TestRevert: def test_returns_none_when_not_initialized(self, git):