Skip to content

Commit 714d6d4

Browse files
committed
CM-62381-resolve-earlier-python-version-failures
1 parent e2319fb commit 714d6d4

3 files changed

Lines changed: 59 additions & 53 deletions

File tree

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,24 @@
11
import typer
22

3-
from cycode.cli.apps.ai_guardrails.install_command import install_command
4-
from cycode.cli.apps.ai_guardrails.scan.scan_command import scan_command
5-
from cycode.cli.apps.ai_guardrails.session_start_command import session_start_command
6-
from cycode.cli.apps.ai_guardrails.status_command import status_command
7-
from cycode.cli.apps.ai_guardrails.uninstall_command import uninstall_command
3+
from cycode.cli.apps.ai_guardrails.install_command import install_command as _install_command
4+
from cycode.cli.apps.ai_guardrails.scan.scan_command import scan_command as _scan_command
5+
from cycode.cli.apps.ai_guardrails.session_start_command import session_start_command as _session_start_command
6+
from cycode.cli.apps.ai_guardrails.status_command import status_command as _status_command
7+
from cycode.cli.apps.ai_guardrails.uninstall_command import uninstall_command as _uninstall_command
88

99
app = typer.Typer(name='ai-guardrails', no_args_is_help=True, hidden=True)
1010

11-
app.command(hidden=True, name='install', short_help='Install AI guardrails hooks for supported IDEs.')(install_command)
11+
app.command(hidden=True, name='install', short_help='Install AI guardrails hooks for supported IDEs.')(_install_command)
1212
app.command(hidden=True, name='uninstall', short_help='Remove AI guardrails hooks from supported IDEs.')(
13-
uninstall_command
13+
_uninstall_command
1414
)
15-
app.command(hidden=True, name='status', short_help='Show AI guardrails hook installation status.')(status_command)
15+
app.command(hidden=True, name='status', short_help='Show AI guardrails hook installation status.')(_status_command)
1616
app.command(
1717
hidden=True,
1818
name='scan',
1919
short_help='Scan content from AI IDE hooks for secrets (reads JSON from stdin).',
20-
)(scan_command)
20+
)(_scan_command)
2121
app.command(hidden=True, name='session-start', short_help='Handle session start: auth, conversation, session context.')(
22-
session_start_command
22+
_session_start_command
2323
)
24-
app.command(hidden=True, name='ensure-auth', short_help='[Deprecated] Alias for session-start.')(session_start_command)
24+
app.command(hidden=True, name='ensure-auth', short_help='[Deprecated] Alias for session-start.')(_session_start_command)

cycode/cli/apps/ai_guardrails/scan/claude_config.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,11 @@ def resolve_plugins(settings: dict) -> tuple[dict, dict]:
149149
entry[field] = metadata[field]
150150

151151
mcp_config = _load_plugin_json_file(plugin_path, '.mcp.json') or {}
152+
plugin_server_names = []
152153
for server_name, server_cfg in (mcp_config.get('mcpServers') or {}).items():
153154
merged_mcp[server_name] = server_cfg
155+
plugin_server_names.append(server_name)
156+
if plugin_server_names:
157+
entry['mcp_server_names'] = plugin_server_names
154158

155159
return merged_mcp, enriched

tests/cli/commands/ai_guardrails/test_session_start_command.py

Lines changed: 44 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import pytest
99
import typer
1010

11+
from cycode.cli.apps.ai_guardrails import session_start_command as _session_start_mod
1112
from cycode.cli.apps.ai_guardrails.session_start_command import session_start_command
1213

1314

@@ -22,7 +23,7 @@ def mock_ctx() -> MagicMock:
2223
# Auth tests
2324

2425

25-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
26+
@patch.object(_session_start_mod, 'get_authorization_info')
2627
def test_already_authenticated_skips_auth(mock_get_auth: MagicMock, mock_ctx: MagicMock) -> None:
2728
"""When already authenticated, AuthManager should not be called."""
2829
mock_get_auth.return_value = MagicMock()
@@ -31,8 +32,8 @@ def test_already_authenticated_skips_auth(mock_get_auth: MagicMock, mock_ctx: Ma
3132
session_start_command(mock_ctx)
3233

3334

34-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.AuthManager')
35-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
35+
@patch.object(_session_start_mod, 'AuthManager')
36+
@patch.object(_session_start_mod, 'get_authorization_info')
3637
def test_not_authenticated_triggers_auth(
3738
mock_get_auth: MagicMock, mock_auth_manager_cls: MagicMock, mock_ctx: MagicMock
3839
) -> None:
@@ -45,9 +46,9 @@ def test_not_authenticated_triggers_auth(
4546
mock_auth_manager_cls.return_value.authenticate.assert_called_once()
4647

4748

48-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.handle_auth_exception')
49-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.AuthManager')
50-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
49+
@patch.object(_session_start_mod, 'handle_auth_exception')
50+
@patch.object(_session_start_mod, 'AuthManager')
51+
@patch.object(_session_start_mod, 'get_authorization_info')
5152
def test_auth_failure_handled_gracefully(
5253
mock_get_auth: MagicMock,
5354
mock_auth_manager_cls: MagicMock,
@@ -67,7 +68,7 @@ def test_auth_failure_handled_gracefully(
6768
# Stdin / payload tests
6869

6970

70-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
71+
@patch.object(_session_start_mod, 'get_authorization_info')
7172
def test_tty_stdin_auth_only(mock_get_auth: MagicMock, mock_ctx: MagicMock) -> None:
7273
"""When stdin is a TTY (old hooks), only auth is performed."""
7374
mock_get_auth.return_value = MagicMock()
@@ -80,8 +81,8 @@ def test_tty_stdin_auth_only(mock_get_auth: MagicMock, mock_ctx: MagicMock) -> N
8081
mock_stdin.read.assert_not_called()
8182

8283

83-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_ai_security_manager_client')
84-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
84+
@patch.object(_session_start_mod, 'get_ai_security_manager_client')
85+
@patch.object(_session_start_mod, 'get_authorization_info')
8586
def test_empty_stdin_skips_session_init(
8687
mock_get_auth: MagicMock, mock_get_client: MagicMock, mock_ctx: MagicMock
8788
) -> None:
@@ -94,8 +95,8 @@ def test_empty_stdin_skips_session_init(
9495
mock_get_client.assert_not_called()
9596

9697

97-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_ai_security_manager_client')
98-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
98+
@patch.object(_session_start_mod, 'get_ai_security_manager_client')
99+
@patch.object(_session_start_mod, 'get_authorization_info')
99100
def test_invalid_json_stdin_skips_session_init(
100101
mock_get_auth: MagicMock, mock_get_client: MagicMock, mock_ctx: MagicMock
101102
) -> None:
@@ -111,10 +112,10 @@ def test_invalid_json_stdin_skips_session_init(
111112
# Conversation creation tests
112113

113114

114-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.extract_from_claude_transcript')
115-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.load_claude_config')
116-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_ai_security_manager_client')
117-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
115+
@patch.object(_session_start_mod, 'extract_from_claude_transcript')
116+
@patch.object(_session_start_mod, 'load_claude_config')
117+
@patch.object(_session_start_mod, 'get_ai_security_manager_client')
118+
@patch.object(_session_start_mod, 'get_authorization_info')
118119
def test_claude_code_creates_conversation(
119120
mock_get_auth: MagicMock,
120121
mock_get_client: MagicMock,
@@ -145,8 +146,8 @@ def test_claude_code_creates_conversation(
145146
assert call_payload.ide_version == '2.1.20'
146147

147148

148-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_ai_security_manager_client')
149-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
149+
@patch.object(_session_start_mod, 'get_ai_security_manager_client')
150+
@patch.object(_session_start_mod, 'get_authorization_info')
150151
def test_cursor_creates_conversation(
151152
mock_get_auth: MagicMock,
152153
mock_get_client: MagicMock,
@@ -175,9 +176,9 @@ def test_cursor_creates_conversation(
175176
assert call_payload.ide_provider == 'cursor'
176177

177178

178-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.load_claude_config')
179-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_ai_security_manager_client')
180-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
179+
@patch.object(_session_start_mod, 'load_claude_config')
180+
@patch.object(_session_start_mod, 'get_ai_security_manager_client')
181+
@patch.object(_session_start_mod, 'get_authorization_info')
181182
def test_conversation_creation_failure_non_blocking(
182183
mock_get_auth: MagicMock,
183184
mock_get_client: MagicMock,
@@ -202,10 +203,10 @@ def test_conversation_creation_failure_non_blocking(
202203
# MCP server reporting tests
203204

204205

205-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.load_claude_settings')
206-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.load_claude_config')
207-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_ai_security_manager_client')
208-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
206+
@patch.object(_session_start_mod, 'load_claude_settings')
207+
@patch.object(_session_start_mod, 'load_claude_config')
208+
@patch.object(_session_start_mod, 'get_ai_security_manager_client')
209+
@patch.object(_session_start_mod, 'get_authorization_info')
209210
def test_claude_code_reports_mcp_servers(
210211
mock_get_auth: MagicMock,
211212
mock_get_client: MagicMock,
@@ -236,10 +237,10 @@ def test_claude_code_reports_mcp_servers(
236237
)
237238

238239

239-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.load_claude_settings')
240-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.load_claude_config')
241-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_ai_security_manager_client')
242-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
240+
@patch.object(_session_start_mod, 'load_claude_settings')
241+
@patch.object(_session_start_mod, 'load_claude_config')
242+
@patch.object(_session_start_mod, 'get_ai_security_manager_client')
243+
@patch.object(_session_start_mod, 'get_authorization_info')
243244
def test_claude_code_merges_plugin_mcp_servers_and_metadata(
244245
mock_get_auth: MagicMock,
245246
mock_get_client: MagicMock,
@@ -289,15 +290,16 @@ def test_claude_code_merges_plugin_mcp_servers_and_metadata(
289290
'name': 'cycode-dev',
290291
'version': '1.0.28',
291292
'description': 'Shared skills',
293+
'mcp_server_names': ['aspire'],
292294
}
293295
},
294296
)
295297

296298

297-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.load_claude_settings')
298-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.load_claude_config')
299-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_ai_security_manager_client')
300-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
299+
@patch.object(_session_start_mod, 'load_claude_settings')
300+
@patch.object(_session_start_mod, 'load_claude_config')
301+
@patch.object(_session_start_mod, 'get_ai_security_manager_client')
302+
@patch.object(_session_start_mod, 'get_authorization_info')
301303
def test_claude_code_no_mcp_servers_no_plugins_skips_report(
302304
mock_get_auth: MagicMock,
303305
mock_get_client: MagicMock,
@@ -320,9 +322,9 @@ def test_claude_code_no_mcp_servers_no_plugins_skips_report(
320322
mock_ai_client.report_session_context.assert_not_called()
321323

322324

323-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.load_cursor_config')
324-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_ai_security_manager_client')
325-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
325+
@patch.object(_session_start_mod, 'load_cursor_config')
326+
@patch.object(_session_start_mod, 'get_ai_security_manager_client')
327+
@patch.object(_session_start_mod, 'get_authorization_info')
326328
def test_cursor_reports_mcp_servers(
327329
mock_get_auth: MagicMock,
328330
mock_get_client: MagicMock,
@@ -344,9 +346,9 @@ def test_cursor_reports_mcp_servers(
344346
mock_ai_client.report_session_context.assert_called_once_with(mcp_servers=mcp_servers, enabled_plugins={})
345347

346348

347-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.load_cursor_config')
348-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_ai_security_manager_client')
349-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
349+
@patch.object(_session_start_mod, 'load_cursor_config')
350+
@patch.object(_session_start_mod, 'get_ai_security_manager_client')
351+
@patch.object(_session_start_mod, 'get_authorization_info')
350352
def test_cursor_no_mcp_servers_skips_report(
351353
mock_get_auth: MagicMock,
352354
mock_get_client: MagicMock,
@@ -367,10 +369,10 @@ def test_cursor_no_mcp_servers_skips_report(
367369
mock_ai_client.report_session_context.assert_not_called()
368370

369371

370-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.handle_auth_exception')
371-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.AuthManager')
372-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_ai_security_manager_client')
373-
@patch('cycode.cli.apps.ai_guardrails.session_start_command.get_authorization_info')
372+
@patch.object(_session_start_mod, 'handle_auth_exception')
373+
@patch.object(_session_start_mod, 'AuthManager')
374+
@patch.object(_session_start_mod, 'get_ai_security_manager_client')
375+
@patch.object(_session_start_mod, 'get_authorization_info')
374376
def test_unauthenticated_skips_session_init(
375377
mock_get_auth: MagicMock,
376378
mock_get_client: MagicMock,

0 commit comments

Comments
 (0)