diff --git a/CLAUDE.md b/CLAUDE.md index 60acb4b..373c0cf 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -140,6 +140,9 @@ AGENT_EVENT_BUS_ICON=/path/to/icon.png agent-event-bus # Disable Tailscale auth (for testing/local dev) AGENT_EVENT_BUS_AUTH_DISABLED=1 agent-event-bus + +# CLI session attribution (used by hooks) +AGENT_EVENT_BUS_SESSION_ID=abc123 agent-event-bus-cli publish ... ``` Notifications: Uses terminal-notifier if installed (`brew install terminal-notifier`), falls back to osascript. diff --git a/src/agent_event_bus/cli.py b/src/agent_event_bus/cli.py index 5e5d1b3..8950dc2 100644 --- a/src/agent_event_bus/cli.py +++ b/src/agent_event_bus/cli.py @@ -218,8 +218,10 @@ def cmd_publish(args): } if args.channel: arguments["channel"] = args.channel - if args.session_id: - arguments["session_id"] = args.session_id + # Use explicit --session-id, fall back to env var + session_id = args.session_id or os.environ.get("AGENT_EVENT_BUS_SESSION_ID") + if session_id: + arguments["session_id"] = session_id result = call_tool("publish_event", arguments, url=args.url, debug=args.debug) print(json.dumps(result, indent=2)) @@ -341,7 +343,9 @@ def main(): p_publish.add_argument("--type", required=True, help="Event type") p_publish.add_argument("--payload", required=True, help="Event payload") p_publish.add_argument("--channel", default="all", help="Target channel") - p_publish.add_argument("--session-id", help="Your session ID") + p_publish.add_argument( + "--session-id", help="Your session ID (default: $AGENT_EVENT_BUS_SESSION_ID)" + ) p_publish.set_defaults(func=cmd_publish) # events diff --git a/tests/test_cli.py b/tests/test_cli.py index ebcdbe3..70eac20 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -271,6 +271,39 @@ def test_publish_with_channel(self, mock_call): assert call_args["channel"] == "repo:my-repo" assert call_args["session_id"] == "abc123" + @patch("agent_event_bus.cli.call_tool") + @patch.dict("os.environ", {"AGENT_EVENT_BUS_SESSION_ID": "env-session-123"}) + def test_publish_session_id_from_env(self, mock_call): + """Test publish uses session_id from env var when not provided.""" + mock_call.return_value = {"event_id": 1} + + args = Namespace( + type="test_event", payload="hello", channel=None, session_id=None, url=None, debug=False + ) + cli.cmd_publish(args) + + call_args = mock_call.call_args[0][1] + assert call_args["session_id"] == "env-session-123" + + @patch("agent_event_bus.cli.call_tool") + @patch.dict("os.environ", {"AGENT_EVENT_BUS_SESSION_ID": "env-session-123"}) + def test_publish_explicit_session_id_overrides_env(self, mock_call): + """Test explicit --session-id overrides env var.""" + mock_call.return_value = {"event_id": 1} + + args = Namespace( + type="test_event", + payload="hello", + channel=None, + session_id="explicit-123", + url=None, + debug=False, + ) + cli.cmd_publish(args) + + call_args = mock_call.call_args[0][1] + assert call_args["session_id"] == "explicit-123" + class TestCmdEvents: """Tests for events command."""