From fa2dc0f295fb644e32f759325f695be4def1de17 Mon Sep 17 00:00:00 2001 From: jihoson Date: Tue, 17 Feb 2026 06:17:36 +0900 Subject: [PATCH] Allow /stop without target argument --- src/lazy_enter/bridge.py | 7 +++---- src/lazy_enter/slack_handler.py | 13 +------------ tests/test_bridge.py | 15 +++++++++++++++ tests/test_slack_handler.py | 18 ++++++++++++++++-- 4 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/lazy_enter/bridge.py b/src/lazy_enter/bridge.py index 0946cc4..f3088b0 100644 --- a/src/lazy_enter/bridge.py +++ b/src/lazy_enter/bridge.py @@ -96,11 +96,10 @@ class Bridge: def _handle_command(self, action: str, target: str, channel: str) -> None: """슬래시 커맨드를 처리한다.""" - if target not in {"claude", "codex"}: - self.slack.send_message(channel, ":warning: 지원하지 않는 대상입니다.") - return - if action == "start": + if target not in {"claude", "codex"}: + self.slack.send_message(channel, ":warning: 지원하지 않는 대상입니다.") + return self._start_session(channel, target) elif action == "stop": self._stop_session(channel) diff --git a/src/lazy_enter/slack_handler.py b/src/lazy_enter/slack_handler.py index 0814ed0..f86238d 100644 --- a/src/lazy_enter/slack_handler.py +++ b/src/lazy_enter/slack_handler.py @@ -86,23 +86,12 @@ class SlackHandler: ack() user_id = body.get("user_id", "") channel_id = body.get("channel_id", "") - target = self._parse_target(body.get("text", "")) if not self._is_authorized(user_id, channel_id): return - if target is None: - self.send_message( - channel_id, - ( - ":warning: 대상은 `claude` 또는 `codex`여야 합니다. " - "예: `/stop claude`" - ), - ) - return - if self._on_command_callback: - self._on_command_callback("stop", target, channel_id) + self._on_command_callback("stop", "", channel_id) @staticmethod def _parse_target(text: str) -> str | None: diff --git a/tests/test_bridge.py b/tests/test_bridge.py index c0fc0f3..efdc33a 100644 --- a/tests/test_bridge.py +++ b/tests/test_bridge.py @@ -132,6 +132,21 @@ def test_unknown_target_is_rejected(monkeypatch) -> None: ) +def test_stop_command_ignores_empty_target(monkeypatch) -> None: + FakePtyManager.instances.clear() + bridge = _make_bridge(monkeypatch) + bridge._handle_command("start", "codex", "C1") + + bridge._handle_command("stop", "", "C1") + + assert bridge.pty is None + assert bridge._active_target is None + assert bridge.slack.sent_messages[-1] == ( + "C1", + ":electric_plug: 세션 연결이 해제되었습니다.", + ) + + def test_handle_message_resets_last_sent_output_after_input(monkeypatch) -> None: FakePtyManager.instances.clear() bridge = _make_bridge(monkeypatch) diff --git a/tests/test_slack_handler.py b/tests/test_slack_handler.py index 260b665..60d9e4c 100644 --- a/tests/test_slack_handler.py +++ b/tests/test_slack_handler.py @@ -111,7 +111,7 @@ def test_start_command_normalizes_target(monkeypatch) -> None: assert called == [("start", "claude", "C1")] -def test_stop_command_routes_target_from_text(monkeypatch) -> None: +def test_stop_command_ignores_target_text(monkeypatch) -> None: handler = _build_handler(monkeypatch) called = _capture_commands(handler) @@ -121,7 +121,21 @@ def test_stop_command_routes_target_from_text(monkeypatch) -> None: {"user_id": "U1", "channel_id": "C1", "text": "claude"}, ) - assert called == [("stop", "claude", "C1")] + assert called == [("stop", "", "C1")] + + +def test_stop_command_without_target_routes_immediately(monkeypatch) -> None: + handler = _build_handler(monkeypatch) + called = _capture_commands(handler) + + stop_handler = handler.app.command_handlers["/stop"] + stop_handler( + lambda: None, + {"user_id": "U1", "channel_id": "C1", "text": ""}, + ) + + assert called == [("stop", "", "C1")] + assert handler.app.client.messages == [] def test_invalid_target_sends_warning_message(monkeypatch) -> None: -- 2.49.1