Skip to content

Commit b8faea7

Browse files
committed
chore: bump version to 0.1.92
1 parent 7bd9f3c commit b8faea7

File tree

9 files changed

+57
-21
lines changed

9 files changed

+57
-21
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [0.1.92] - 2026-03-14
11+
12+
### Changed
13+
- Added clipboard copy support for selected UI text and extracted agent-text streaming into a dedicated UI module.
14+
15+
16+
### Fixed
17+
- Relaxed clipboard copy verification so successful copies no longer fail when verification is unavailable.
18+
- Stabilized tmux system tool coverage by making discover stats and skill-load confirmations explicit and by deflaking tmux wait logic around persistent evidence.
19+
1020
## [0.1.91] - 2026-03-13
1121

1222
### Changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ build-backend = "hatchling.build"
55
[project]
66
name = "tunacode-cli"
77

8-
version = "0.1.91"
8+
version = "0.1.92"
99
description = "Your agentic CLI developer."
1010
keywords = ["cli", "agent", "development", "automation"]
1111
readme = "README.md"

src/tunacode/constants.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
MB = KB * 1024
1919

2020
APP_NAME = "TunaCode"
21-
APP_VERSION = "0.1.91"
21+
APP_VERSION = "0.1.92"
2222

2323

2424
AGENTS_MD = "AGENTS.md"

src/tunacode/tools/utils/discover_types.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ def to_context(self) -> str:
5757
lines: list[str] = []
5858
lines.append(f"# Discovery: {self.query}")
5959
lines.append(self.summary)
60-
lines.append(f"({self.total_files_scanned} scanned → {self.total_candidates} relevant)\n")
60+
lines.append(f"({self.total_files_scanned} scanned → {self.total_candidates} relevant)")
61+
lines.append(f"scanned: {self.total_files_scanned} | relevant: {self.total_candidates}\n")
6162

6263
if self.file_tree:
6364
lines.append("```")

src/tunacode/ui/commands/skills.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -289,17 +289,13 @@ def _build_skill_notification_content(self, summary: SkillSummary, *, status: st
289289
content = Text()
290290

291291
if status == "loaded":
292-
content.append(" ", style=STYLE_SUCCESS)
292+
content.append("Loaded skill: ", style=STYLE_SUCCESS)
293293
content.append(summary.name, style=f"bold {STYLE_PRIMARY}")
294294
else:
295-
content.append("", style=STYLE_MUTED)
295+
content.append("Skill already loaded: ", style=STYLE_WARNING)
296296
content.append(summary.name, style=STYLE_PRIMARY)
297297

298298
content.append(f" [{summary.source.value}]", style=f"dim {STYLE_MUTED}")
299-
300-
if status == "already-loaded":
301-
content.append(" (already attached)", style=STYLE_WARNING)
302-
303299
content.append(f"\n{summary.description}", style=f"dim {STYLE_MUTED}")
304300

305301
return content

src/tunacode/ui/lifecycle.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,13 +86,18 @@ def _start_repl(self) -> None:
8686
app = self._app
8787
app.set_focus(app.editor)
8888
app.run_worker(app._request_worker, exclusive=False)
89-
self._start_slopgotchi_timer()
89+
if not self._is_tmux_test_mode():
90+
self._start_slopgotchi_timer()
9091
app._update_resource_bar()
9192

9293
from tunacode.ui.welcome import show_welcome
9394

9495
show_welcome(app.chat_container)
95-
self._emit_ready_file_if_configured()
96+
app.call_after_refresh(self._emit_ready_file_if_configured)
97+
98+
def _is_tmux_test_mode(self) -> bool:
99+
"""Return True when startup is running under tmux E2E test orchestration."""
100+
return bool(os.environ.get(TEST_READY_FILE_ENV_VAR))
96101

97102
def _emit_ready_file_if_configured(self) -> None:
98103
"""Write a test-only readiness marker after the REPL is fully initialized."""

tests/system/cli/test_tmux_tools.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -231,24 +231,21 @@ def wait_for_stable_capture(
231231
timeout: float = DEFAULT_TIMEOUT_SECONDS,
232232
initial_output: str | None = None,
233233
) -> str:
234-
"""Poll until matching pane output stops changing across consecutive captures."""
234+
"""Poll until the matching pane evidence persists across consecutive captures."""
235235
deadline = time.monotonic() + timeout
236236
last_output = initial_output or session.capture()
237-
stable_polls = 0
237+
stable_polls = 1 if predicate(last_output) else 0
238238
while time.monotonic() < deadline:
239239
time.sleep(POLL_INTERVAL_SECONDS)
240240
output = session.capture()
241241
if not predicate(output):
242242
last_output = output
243243
stable_polls = 0
244244
continue
245-
if output == last_output:
246-
stable_polls += 1
247-
if stable_polls >= STABLE_CAPTURE_POLLS:
248-
return output
249-
else:
250-
last_output = output
251-
stable_polls = 0
245+
last_output = output
246+
stable_polls += 1
247+
if stable_polls >= STABLE_CAPTURE_POLLS:
248+
return output
252249
raise TimeoutError(
253250
f"Timed out after {timeout}s waiting for stable {description}.\n"
254251
f"Last capture:\n{last_output or session.capture()}"

tests/unit/ui/test_lifecycle.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def _build_app() -> SimpleNamespace:
3232
set_focus=lambda _target: None,
3333
run_worker=lambda _worker, **_kwargs: None,
3434
set_interval=lambda _interval, _callback: "timer",
35+
call_after_refresh=lambda callback: callback(),
3536
)
3637

3738

@@ -72,3 +73,29 @@ def test_start_repl_does_not_write_ready_file_without_env_var(
7273
lifecycle._start_repl()
7374

7475
assert not ready_file.exists()
76+
77+
78+
def test_start_repl_skips_slopgotchi_timer_when_ready_file_is_configured(
79+
tmp_path: Path,
80+
monkeypatch: pytest.MonkeyPatch,
81+
) -> None:
82+
ready_file = tmp_path / "ready.txt"
83+
logger = FakeLogger()
84+
timer_started = False
85+
86+
def set_interval(_interval: float, _callback: object) -> str:
87+
nonlocal timer_started
88+
timer_started = True
89+
return "timer"
90+
91+
app = _build_app()
92+
app.set_interval = set_interval
93+
monkeypatch.setenv(TEST_READY_FILE_ENV_VAR, str(ready_file))
94+
monkeypatch.setattr("tunacode.core.logging.get_logger", lambda: logger)
95+
monkeypatch.setattr("tunacode.ui.welcome.show_welcome", lambda _container: None)
96+
97+
lifecycle = AppLifecycle(app)
98+
lifecycle._start_repl()
99+
100+
assert timer_started is False
101+
assert app._slopgotchi_timer is None

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)