The Unofficial and Awesome Home Assistant MCP Server
This report presents the forensic synthetic code analysis of homeassistant-ai/ha-mcp, a Python project with 4,543 GitHub stars. SynthScan v2.0 examined 592,385 lines of code across 1187 source files, recording 15865 pattern matches distributed across 21 syntactic categories. The overall adjusted score of 31.1 places this repository in the Strong AI signal band.
The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).
This chart maps the temporal evolution of the adjusted synthetic code score across successive scan runs. An upward trajectory indicates ongoing incorporation of AI-generated code or expanding LLM-assisted scaffolding; a stable or declining trajectory may reflect active human refactoring, code removal, or the adoption of stricter authorship policies. The dashed secondary line (right axis) independently tracks total raw pattern hit count, which can diverge from the normalised score when codebase size changes significantly between scans.
Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.
This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.
The scanner identified 15865 distinct pattern matches across 21 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packaging/mcpb/generate_manifest.py | 12 | def _get_docstring_description(node: ast.AsyncFunctionDef) -> str: | CODE |
| LOW | packaging/mcpb/generate_manifest.py | 18 | def _extract_title_and_decorator_description( | CODE |
| LOW | homeassistant-addon/start.py | 37 | def widen_fastmcp_log_console(width: int = 200) -> None: | CODE |
| LOW | homeassistant-addon/start.py | 82 | def get_or_create_secret_path(data_dir: Path, custom_path: str = "") -> str: | CODE |
| LOW | homeassistant-addon/start.py | 165 | def maybe_persist_secret_path( | CODE |
| LOW | homeassistant-addon/start.py | 230 | def resolve_effective_log_level() -> int: | CODE |
| LOW | homeassistant-addon/start.py | 289 | def maybe_auto_enable_beta_master(config: dict[str, Any]) -> None: | CODE |
| LOW | homeassistant-addon/start.py | 335 | def cleanup_stale_migration_marker(data_dir: Path) -> None: | CODE |
| LOW | homeassistant-addon/start.py | 422 | def _warn_gated_off_beta_subflags( | CODE |
| LOW | homeassistant-addon/start.py | 449 | def _arm_kill_signal_diagnostics_if_debug(effective_log_level: int) -> None: | CODE |
| LOW⚡ | tests/uat/test_openai_agent.py | 776 | async def test_none_when_model_not_listed(self, monkeypatch): | CODE |
| LOW⚡ | tests/uat/test_openai_agent.py | 785 | async def test_none_when_entry_has_no_quant(self, monkeypatch): | CODE |
| LOW⚡ | tests/uat/test_openai_agent.py | 792 | async def test_none_on_transport_error(self, monkeypatch): | CODE |
| LOW⚡ | tests/uat/test_openai_agent.py | 801 | async def test_none_on_http_error_status(self, monkeypatch): | CODE |
| LOW⚡ | tests/uat/test_openai_agent.py | 825 | def test_extracts_requested_and_context_tokens(self): | CODE |
| LOW⚡ | tests/uat/test_openai_agent.py | 831 | def test_none_for_unrelated_bad_request(self): | CODE |
| LOW⚡ | tests/uat/test_openai_agent.py | 835 | def test_marker_without_numbers_returns_none_pair(self): | CODE |
| LOW⚡ | tests/uat/test_openai_agent.py | 840 | def test_extracts_from_sdk_wire_format(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 24 | def test_missing_required_args_exits(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 63 | def test_basic_tool_conversion(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 93 | def test_tool_with_no_parameters(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 112 | async def test_direct_text_response(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 139 | async def test_no_think_sends_enable_thinking_false(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 173 | async def test_no_think_default_omits_extra_body(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 195 | async def test_no_think_warns_when_backend_still_reasons(self, caplog): | CODE |
| LOW | tests/uat/test_openai_agent.py | 223 | async def test_no_think_silent_when_backend_honors_it(self, caplog): | CODE |
| LOW | tests/uat/test_openai_agent.py | 251 | async def test_reasoning_tokens_captured_in_tokens_thoughts(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 278 | async def test_tokens_thoughts_zero_when_backend_omits_details(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 303 | async def test_no_think_warns_on_reasoning_content_without_token_detail( | CODE |
| LOW | tests/uat/test_openai_agent.py | 335 | async def test_no_think_warns_on_inline_think_block(self, caplog): | CODE |
| LOW | tests/uat/test_openai_agent.py | 364 | async def test_no_think_warns_only_once_across_turns(self, caplog): | CODE |
| LOW | tests/uat/test_openai_agent.py | 458 | async def test_tool_call_failure_counted(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 499 | async def test_malformed_tool_arguments_reported_as_error(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 540 | async def test_max_iterations_reached(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 605 | async def test_empty_choices_raises(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 643 | async def test_no_think_prepends_token_and_sends_kwarg(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 661 | async def test_default_omits_prepend_and_kwarg(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 684 | def test_non_text_content_falls_back_to_str(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 694 | def test_no_content_falls_back_to_str(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 708 | async def test_returns_first_model_id(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 717 | async def test_raises_when_no_models(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 859 | async def test_overflow_raises_context_window_exceeded(self): | CODE |
| LOW | tests/uat/test_openai_agent.py | 882 | async def test_unrelated_bad_request_propagates(self): | CODE |
| LOW | tests/uat/openai_agent.py | 541 | async def create_and_warm_openai_client( | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 74 | def test_tokens_thoughts_defaults_to_zero_when_absent(tmp_path): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 83 | def test_model_from_call_site_param(tmp_path): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 89 | def test_model_call_site_arg_wins_over_test_phase(tmp_path): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 95 | def test_model_from_test_phase(tmp_path): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 101 | def test_model_defaults_to_none_when_absent(tmp_path): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 108 | def test_quantization_threaded_into_record(tmp_path): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 114 | def test_quantization_defaults_to_none_when_absent(tmp_path): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 121 | def test_extract_model_reads_claude_session(tmp_path): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 127 | def test_extract_model_none_on_malformed_session(tmp_path): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 134 | def test_model_from_claude_session_fallback(tmp_path): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 144 | def test_compute_passed_incomplete_run_fails_despite_verify(): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 233 | def test_clean_record_omits_error_fields(tmp_path): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 245 | def test_run_completed_uses_explicit_flag(): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 251 | def test_run_completed_fail_closed_on_missing_summary(): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 261 | def test_run_completed_present_summary_missing_flag_uses_exit_code(): | CODE |
| LOW⚡ | tests/uat/stories/test_run_story_record.py | 268 | async def test_context_overflow_degraded_counts_still_fails(monkeypatch): | CODE |
| 11503 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/uat/run_uat.py | 73 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/run_uat.py | 75 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/run_uat.py | 137 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/run_uat.py | 139 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/run_uat.py | 297 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/run_uat.py | 299 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/run_uat.py | 643 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/run_uat.py | 645 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/run_uat.py | 763 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/run_uat.py | 765 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/conftest.py | 43 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/conftest.py | 45 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/conftest.py | 62 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/conftest.py | 64 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/conftest.py | 123 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/conftest.py | 125 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/conftest.py | 135 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/conftest.py | 137 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/test_run_story_record.py | 141 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/test_run_story_record.py | 143 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/test_run_story_record.py | 240 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/test_run_story_record.py | 244 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/test_run_story_record.py | 304 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/test_run_story_record.py | 309 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/run_story.py | 91 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/run_story.py | 93 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/run_story.py | 100 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/run_story.py | 102 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/run_story.py | 294 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/run_story.py | 296 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/run_story.py | 338 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/run_story.py | 357 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/run_story.py | 359 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/run_story.py | 170 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/run_story.py | 172 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/run_story.py | 663 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/run_story.py | 665 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/run_story.py | 713 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/run_story.py | 715 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/run_story.py | 766 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/run_story.py | 768 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/run_story.py | 986 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/run_story.py | 988 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/scripts/verify_story.py | 130 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/uat/stories/scripts/verify_story.py | 132 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/scripts/verify_story.py | 26 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/scripts/verify_story.py | 28 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/scripts/verify_story.py | 209 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/scripts/verify_story.py | 211 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/scripts/verify_story.py | 300 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/scripts/verify_story.py | 302 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/scripts/verify_story.py | 360 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/scripts/verify_story.py | 362 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/scripts/verify_story.py | 386 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/uat/stories/scripts/verify_story.py | 388 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/haos_image_build/build_image.py | 119 | # ┌──────────────────────┬────────────────────────────────────────────────┐ | COMMENT |
| MEDIUM | tests/haos_image_build/build_image.py | 121 | # ├──────────────────────┼────────────────────────────────────────────────┤ | COMMENT |
| MEDIUM | tests/haos_image_build/build_image.py | 135 | # └──────────────────────┴────────────────────────────────────────────────┘ | COMMENT |
| MEDIUM | tests/haos_image_build/build_image.py | 274 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/haos_image_build/build_image.py | 276 | # --------------------------------------------------------------------------- | COMMENT |
| 1143 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/addon/test_webhook_proxy.py | 0 | a valid (code_verifier, code_challenge) pair per rfc 7636 s256. | STRING |
| HIGH | tests/src/unit/test_oauth_autoapprove.py | 0 | a valid (code_verifier, code_challenge) pair per rfc 7636 s256. | STRING |
| HIGH | tests/src/unit/test_oauth_legacy_component.py | 0 | a valid (code_verifier, code_challenge) pair per rfc 7636 s256. | STRING |
| HIGH | tests/src/unit/test_alias_fetch_chunking.py | 0 | create smartsearchtools with mocked global settings. | STRING |
| HIGH | tests/src/unit/test_deep_search_tier3_parallel.py | 0 | create smartsearchtools with mocked global settings. | STRING |
| HIGH | tests/src/unit/test_performance_parallelization.py | 0 | create smartsearchtools with mocked global settings. | STRING |
| HIGH | tests/src/unit/test_smart_search_flow_helpers.py | 0 | construct smartsearchtools without loading global settings. | STRING |
| HIGH | tests/src/unit/test_smart_search_scene_phase25.py | 0 | construct smartsearchtools without loading global settings. | STRING |
| HIGH | …/src/unit/test_deep_search_helper_dashboard_partial.py | 0 | construct smartsearchtools without loading global settings. | STRING |
| HIGH | tests/src/unit/test_deep_search_helper_rename_1794.py | 0 | construct smartsearchtools without loading global settings. | STRING |
| HIGH | tests/src/unit/test_radio_management.py | 0 | register tools onto a mock mcp and return {tool_name: bound_method}. | STRING |
| HIGH | tests/src/unit/test_radio_thread.py | 0 | register tools onto a mock mcp and return {tool_name: bound_method}. | STRING |
| HIGH | tests/src/unit/test_radio_zwave.py | 0 | register tools onto a mock mcp and return {tool_name: bound_method}. | STRING |
| HIGH | tests/src/unit/test_radio_zigbee.py | 0 | register tools onto a mock mcp and return {tool_name: bound_method}. | STRING |
| HIGH | tests/src/unit/test_helper_param_rejection.py | 0 | register helper config tools and return the captured tool functions. | STRING |
| HIGH | tests/src/unit/test_helper_registry_id_validation.py | 0 | register helper config tools and return the captured tool functions. | STRING |
| HIGH | tests/src/unit/test_action_and_collision.py | 0 | register helper config tools and return the captured tool functions. | STRING |
| HIGH | tests/src/unit/test_helper_update_persistence.py | 0 | register helper config tools and return the captured tool functions. | STRING |
| HIGH | tests/src/unit/test_helper_field_persistence.py | 0 | register helper config tools and return the captured tool functions. | STRING |
| HIGH | tests/src/unit/test_flow_name_injection.py | 0 | register helper config tools and return the captured tool functions. | STRING |
| HIGH | tests/src/unit/test_action_discriminator.py | 0 | register helper config tools and return the captured tool functions. | STRING |
| HIGH | tests/src/unit/test_yaml_themes.py | 0 | minimal hass mock that runs executor jobs synchronously. | STRING |
| HIGH | tests/src/unit/test_yaml_whole_file_replace.py | 0 | minimal hass mock that runs executor jobs synchronously. | STRING |
| HIGH | tests/src/unit/test_yaml_edit_untouched_content.py | 0 | minimal hass mock that runs executor jobs synchronously. | STRING |
| HIGH | tests/src/unit/test_yaml_dashboards.py | 0 | minimal hass mock that runs executor jobs synchronously. | STRING |
| HIGH | tests/src/unit/test_oauth_autoapprove.py | 0 | return whether a module name is ``root`` or one of its children. | STRING |
| HIGH | tests/src/unit/test_oauth_ha_auth.py | 0 | return whether a module name is ``root`` or one of its children. | STRING |
| HIGH | tests/src/unit/test_oauth_dcr.py | 0 | return whether a module name is ``root`` or one of its children. | STRING |
| HIGH | …/unit/test_ha_config_list_helpers_component_routing.py | 0 | a non-unknown command error → legacy path and a warnings[] entry. | STRING |
| HIGH | tests/src/unit/test_ha_search_component_routing.py | 0 | a non-unknown command error → legacy path and a warnings[] entry. | STRING |
| HIGH | tests/src/unit/test_ha_get_zone_component_routing.py | 0 | a non-unknown command error → legacy path and a warnings[] entry. | STRING |
| HIGH | tests/src/unit/test_ha_overview_component_routing.py | 0 | a non-unknown command error → legacy path and a warnings[] entry. | STRING |
| HIGH | tests/src/unit/test_ws_connect_auth_classification.py | 0 | yield the singleton manager with isolated, restored pool state. | STRING |
| HIGH | tests/src/unit/test_ws_pool_loop_change_1994.py | 0 | yield the singleton manager with isolated, restored pool state. | STRING |
| HIGH | tests/src/unit/test_ws_pool_stale_client_2127.py | 0 | yield the singleton manager with isolated, restored pool state. | STRING |
| HIGH | tests/src/e2e/conftest.py | 0 | parse a streamable-http mcp response (json body or sse) to a json-rpc dict. | STRING |
| HIGH | tests/src/e2e/haos_only/test_embedded_server_haos.py | 0 | parse a streamable-http mcp response (json body or sse) to a json-rpc dict. | STRING |
| HIGH | …sts/src/e2e/workflows/embedded/test_embedded_server.py | 0 | parse a streamable-http mcp response (json body or sse) to a json-rpc dict. | STRING |
| HIGH | …/src/e2e/workflows/dashboards/test_python_transform.py | 0 | test that python_transform is mutually exclusive with config. | STRING |
| HIGH | …sts/src/e2e/workflows/scripts/test_python_transform.py | 0 | test that python_transform is mutually exclusive with config. | STRING |
| HIGH | …/src/e2e/workflows/automation/test_python_transform.py | 0 | test that python_transform is mutually exclusive with config. | STRING |
| HIGH | custom_components/ha_mcp_tools/oauth_dcr.py | 0 | (scheme, host, port) origin identity with the scheme default applied. the one normalizer shared by registration validati | STRING |
| HIGH | …ant-addon-webhook-proxy-dev/mcp_proxy_dev/oauth_dcr.py | 0 | (scheme, host, port) origin identity with the scheme default applied. the one normalizer shared by registration validati | STRING |
| HIGH | …meassistant-addon-webhook-proxy/mcp_proxy/oauth_dcr.py | 0 | (scheme, host, port) origin identity with the scheme default applied. the one normalizer shared by registration validati | STRING |
| HIGH | custom_components/ha_mcp_tools/oauth_dcr.py | 0 | the request body, or none when it exceeds ``max_dcr_body_bytes``. reads to eof rather than taking one ``streamreader.rea | STRING |
| HIGH | …ant-addon-webhook-proxy-dev/mcp_proxy_dev/oauth_dcr.py | 0 | the request body, or none when it exceeds ``max_dcr_body_bytes``. reads to eof rather than taking one ``streamreader.rea | STRING |
| HIGH | …meassistant-addon-webhook-proxy/mcp_proxy/oauth_dcr.py | 0 | the request body, or none when it exceeds ``max_dcr_body_bytes``. reads to eof rather than taking one ``streamreader.rea | STRING |
| HIGH | custom_components/ha_mcp_tools/oauth_dcr.py | 0 | bind the view to the ha instance; liveness is resolved per request. | STRING |
| HIGH | custom_components/ha_mcp_tools/mcp_webhook.py | 0 | bind the view to the ha instance; liveness is resolved per request. | STRING |
| HIGH | custom_components/ha_mcp_tools/oauth_autoapprove.py | 0 | bind the view to the ha instance; liveness is resolved per request. | STRING |
| HIGH | …n-webhook-proxy-dev/mcp_proxy_dev/oauth_autoapprove.py | 0 | bind the view to the ha instance; liveness is resolved per request. | STRING |
| HIGH | …ant-addon-webhook-proxy/mcp_proxy/oauth_autoapprove.py | 0 | bind the view to the ha instance; liveness is resolved per request. | STRING |
| HIGH | custom_components/ha_mcp_tools/mcp_webhook.py | 0 | rfc 8414 authorization-server metadata for none-mode auto-approve. points mcp clients at our own ``oauth_base`` ``/autho | STRING |
| HIGH | …n-webhook-proxy-dev/mcp_proxy_dev/oauth_autoapprove.py | 0 | rfc 8414 authorization-server metadata for none-mode auto-approve. points mcp clients at our own ``oauth_base`` ``/autho | STRING |
| HIGH | …ant-addon-webhook-proxy/mcp_proxy/oauth_autoapprove.py | 0 | rfc 8414 authorization-server metadata for none-mode auto-approve. points mcp clients at our own ``oauth_base`` ``/autho | STRING |
| HIGH | custom_components/ha_mcp_tools/oauth_legacy.py | 0 | stable fingerprint of the oauth identity bound to the root views. | STRING |
| HIGH | …tant-addon-webhook-proxy-dev/mcp_proxy_dev/__init__.py | 0 | stable fingerprint of the oauth identity bound to the root views. | STRING |
| HIGH | homeassistant-addon-webhook-proxy/mcp_proxy/__init__.py | 0 | stable fingerprint of the oauth identity bound to the root views. | STRING |
| HIGH | custom_components/ha_mcp_tools/oauth_legacy.py | 0 | shape of an entry in oauthprovider._codes. typeddict so a typo on one of these keys (`expires`/`redirect_uri`/`code_chal | STRING |
| HIGH | …sistant-addon-webhook-proxy-dev/mcp_proxy_dev/oauth.py | 0 | shape of an entry in oauthprovider._codes. typeddict so a typo on one of these keys (`expires`/`redirect_uri`/`code_chal | STRING |
| 164 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | AGENTS.md | 658 | except Exception as e: | CODE |
| LOW | CLAUDE.md | 658 | except Exception as e: | CODE |
| LOW | homeassistant-addon/start.py | 122 | except Exception as e: | CODE |
| LOW | homeassistant-addon/start.py | 132 | except Exception as e: | CODE |
| LOW | homeassistant-addon/start.py | 251 | except Exception as e: | CODE |
| LOW | homeassistant-addon/start.py | 466 | except Exception as e: | CODE |
| LOW | homeassistant-addon/start.py | 739 | except Exception as e: | CODE |
| LOW | homeassistant-addon/start.py | 931 | except Exception as e: | CODE |
| LOW | tests/test_env_manager.py | 232 | except Exception as e: | CODE |
| LOW | tests/test_env_manager.py | 262 | except Exception: | CODE |
| LOW | tests/test_env_manager.py | 353 | except Exception as e: | CODE |
| LOW | tests/uat/run_uat.py | 124 | except Exception: | CODE |
| LOW | tests/uat/openai_agent.py | 160 | except Exception as e: # best-effort enrichment, never fatal | CODE |
| LOW | tests/uat/openai_agent.py | 299 | except Exception as e: | CODE |
| LOW | tests/uat/openai_agent.py | 586 | except Exception: | CODE |
| LOW | tests/uat/openai_agent.py | 597 | except Exception: | CODE |
| LOW⚡ | tests/uat/stories/conftest.py | 146 | except Exception as e: | CODE |
| LOW | tests/uat/stories/conftest.py | 159 | except Exception as e: | CODE |
| LOW⚡ | tests/uat/stories/run_story.py | 287 | except Exception as exc: | CODE |
| LOW⚡ | tests/uat/stories/run_story.py | 347 | except Exception: | CODE |
| LOW | tests/uat/stories/run_story.py | 148 | except Exception: | CODE |
| LOW | tests/uat/stories/run_story.py | 206 | except Exception as exc: | CODE |
| LOW | tests/uat/stories/run_story.py | 232 | except Exception as exc: | CODE |
| LOW | tests/uat/stories/run_story.py | 543 | except Exception as e: | CODE |
| LOW | tests/uat/stories/run_story.py | 679 | except Exception as e: | CODE |
| LOW | tests/uat/stories/run_story.py | 699 | except Exception as e: | CODE |
| LOW | tests/uat/stories/run_story.py | 1056 | except Exception as e: | CODE |
| LOW | tests/uat/stories/run_story.py | 1078 | except Exception as e: | CODE |
| LOW | tests/uat/stories/scripts/verify_story.py | 69 | except Exception: | CODE |
| LOW | tests/uat/stories/scripts/verify_story.py | 88 | except Exception: | CODE |
| LOW | tests/uat/stories/scripts/verify_story.py | 151 | except Exception: | CODE |
| LOW | tests/uat/stories/scripts/verify_story.py | 231 | except Exception as e: | CODE |
| LOW | tests/uat/stories/scripts/verify_story.py | 257 | except Exception as e: | CODE |
| LOW | tests/uat/stories/scripts/verify_story.py | 285 | except Exception as e: | CODE |
| MEDIUM | tests/uat/stories/scripts/ha_query.py | 250 | print(f"Error: {args.agent} CLI not found", file=sys.stderr) | CODE |
| LOW | tests/uat/stories/scripts/measure_tools.py | 147 | except Exception as e: | STRING |
| MEDIUM | tests/haos_image_build/build_image.py | 809 | def send() -> None: | CODE |
| LOW | tests/haos_image_build/build_image.py | 484 | except Exception as e: | CODE |
| LOW | tests/haos_image_build/build_image.py | 817 | except Exception as exc: | CODE |
| LOW | tests/haos_image_build/build_image.py | 2716 | except Exception: | CODE |
| LOW | …itial_test_state/custom_components/hacs/data_client.py | 56 | except Exception as exception: | CODE |
| LOW | …t_state/custom_components/hacs/websocket/repository.py | 50 | except Exception as exception: # pylint: disable=broad-except | CODE |
| LOW | …t_state/custom_components/hacs/websocket/repository.py | 266 | except Exception as exception: # pylint: disable=broad-except | CODE |
| LOW | …t_state/custom_components/hacs/websocket/repository.py | 351 | except Exception as exception: | CODE |
| LOW | …ate/custom_components/hacs/repositories/integration.py | 216 | except Exception: # pylint: disable=broad-except | CODE |
| LOW | …test_state/custom_components/hacs/repositories/base.py | 1374 | except Exception: # pylint: disable=broad-except | CODE |
| LOW | tests/addon/test_addon_structure.py | 457 | except Exception as exc: | CODE |
| LOW | tests/src/haos_runtime.py | 268 | except Exception as probe_err: # pragma: no cover - diagnostics best-effort | CODE |
| LOW | tests/src/unit/_embedded_stubs.py | 269 | except Exception as err: # matches real HA's broad catch-and-log | CODE |
| MEDIUM | tests/src/unit/_embedded_stubs.py | 266 | def async_refresh(self) -> None: | CODE |
| LOW | tests/src/unit/test_session_disconnect_log_filter.py | 49 | except Exception as exc: | CODE |
| LOW | tests/src/unit/test_component_backup_prep_contract.py | 53 | except Exception as exc: # the REAL component's raise path | CODE |
| LOW | tests/src/unit/test_identifier_validation_family.py | 877 | except Exception: | CODE |
| MEDIUM | tests/src/unit/test_usage_logger.py | 113 | def writer_thread(thread_id): | CODE |
| MEDIUM | tests/src/unit/test_usage_logger.py | 125 | def reader_thread(): | CODE |
| LOW | tests/src/unit/test_usage_logger.py | 122 | except Exception as e: | CODE |
| LOW | tests/src/unit/test_usage_logger.py | 130 | except Exception as e: | CODE |
| LOW | tests/src/e2e/conftest.py | 1546 | except Exception as exc: | CODE |
| LOW | tests/src/e2e/conftest.py | 1609 | except Exception as exc: | CODE |
| LOW | tests/src/e2e/conftest.py | 1754 | except Exception as exc: | CODE |
| 669 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packaging/mcpb/generate_manifest.py | 4 | CODE | |
| LOW | packaging/binary/pyinstaller_hooks/runtime_hook.py | 7 | CODE | |
| LOW | packaging/binary/pyinstaller_hooks/runtime_hook.py | 15 | CODE | |
| LOW | tests/uat/run_uat.py | 18 | CODE | |
| LOW | tests/uat/_logging.py | 3 | CODE | |
| LOW | tests/uat/ha_wait.py | 8 | CODE | |
| LOW | tests/uat/test_openai_agent.py | 3 | CODE | |
| LOW | tests/uat/openai_agent.py | 15 | CODE | |
| LOW | tests/uat/_inprocess.py | 8 | CODE | |
| LOW | tests/uat/stories/conftest.py | 10 | CODE | |
| LOW | tests/uat/stories/test_stories.py | 13 | CODE | |
| LOW | tests/uat/stories/test_run_story_record.py | 3 | CODE | |
| LOW | tests/uat/stories/test_verify_story.py | 3 | CODE | |
| LOW | tests/uat/stories/run_story.py | 35 | CODE | |
| LOW | tests/uat/stories/scripts/verify_story.py | 3 | CODE | |
| LOW | tests/uat/stories/scripts/ha_query.py | 27 | CODE | |
| LOW | tests/uat/stories/scripts/measure_tools.py | 19 | CODE | |
| LOW | tests/haos_image_build/build_image.py | 16 | CODE | |
| LOW | tests/haos_image_build/screenshot_engine_mock/server.py | 24 | CODE | |
| LOW | …ts/initial_test_state/custom_components/hacs/update.py | 3 | CODE | |
| LOW | …itial_test_state/custom_components/hacs/coordinator.py | 3 | CODE | |
| LOW | …itial_test_state/custom_components/hacs/diagnostics.py | 3 | CODE | |
| LOW | …/initial_test_state/custom_components/hacs/frontend.py | 3 | CODE | |
| LOW | …/initial_test_state/custom_components/hacs/__init__.py | 7 | CODE | |
| LOW | …/initial_test_state/custom_components/hacs/__init__.py | 112 | CODE | |
| LOW | …ts/initial_test_state/custom_components/hacs/switch.py | 3 | CODE | |
| LOW | …s/initial_test_state/custom_components/hacs/repairs.py | 3 | CODE | |
| LOW | …itial_test_state/custom_components/hacs/data_client.py | 3 | CODE | |
| LOW | …ts/initial_test_state/custom_components/hacs/entity.py | 3 | CODE | |
| LOW | tests/initial_test_state/custom_components/hacs/base.py | 3 | CODE | |
| LOW | …itial_test_state/custom_components/hacs/config_flow.py | 3 | CODE | |
| LOW | …ustom_components/hacs/validate/integration_manifest.py | 1 | CODE | |
| LOW | …l_test_state/custom_components/hacs/validate/issues.py | 1 | CODE | |
| LOW | …test_state/custom_components/hacs/validate/archived.py | 1 | CODE | |
| LOW | …t_state/custom_components/hacs/validate/description.py | 1 | CODE | |
| LOW | …t_state/custom_components/hacs/validate/information.py | 1 | CODE | |
| LOW | …test_state/custom_components/hacs/validate/hacsjson.py | 1 | CODE | |
| LOW | …l_test_state/custom_components/hacs/validate/topics.py | 1 | CODE | |
| LOW | …l_test_state/custom_components/hacs/validate/brands.py | 1 | CODE | |
| LOW | …l_test_state/custom_components/hacs/validate/images.py | 1 | CODE | |
| LOW | …_test_state/custom_components/hacs/validate/manager.py | 3 | CODE | |
| LOW | …ial_test_state/custom_components/hacs/validate/base.py | 3 | CODE | |
| LOW | …est_state/custom_components/hacs/websocket/critical.py | 3 | CODE | |
| LOW | …est_state/custom_components/hacs/websocket/__init__.py | 3 | CODE | |
| LOW | …state/custom_components/hacs/websocket/repositories.py | 3 | CODE | |
| LOW | …t_state/custom_components/hacs/websocket/repository.py | 3 | CODE | |
| LOW | …tial_test_state/custom_components/hacs/utils/backup.py | 3 | CODE | |
| LOW | …ial_test_state/custom_components/hacs/utils/version.py | 3 | CODE | |
| LOW | …l_test_state/custom_components/hacs/utils/decorator.py | 3 | CODE | |
| LOW | …al_test_state/custom_components/hacs/utils/validate.py | 3 | CODE | |
| LOW | …test_state/custom_components/hacs/utils/file_system.py | 3 | CODE | |
| LOW | …nitial_test_state/custom_components/hacs/utils/path.py | 3 | CODE | |
| LOW | …nitial_test_state/custom_components/hacs/utils/json.py | 3 | CODE | |
| LOW | …itial_test_state/custom_components/hacs/utils/regex.py | 3 | CODE | |
| LOW | …ial_test_state/custom_components/hacs/utils/filters.py | 3 | CODE | |
| LOW | …nitial_test_state/custom_components/hacs/utils/data.py | 3 | CODE | |
| LOW | …st_state/custom_components/hacs/utils/queue_manager.py | 3 | CODE | |
| LOW | …est_state/custom_components/hacs/repositories/theme.py | 3 | CODE | |
| LOW | …_state/custom_components/hacs/repositories/__init__.py | 3 | CODE | |
| LOW | …ate/custom_components/hacs/repositories/integration.py | 3 | CODE | |
| 588 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/haos_image_build/build_image.py | 2364 | # the config_entries/disable WS command (disabled_by=null). | COMMENT |
| HIGH⚡ | tests/lab-setup/test_setup_script.py | 14 | assert 'git -C "$SETUP_HOME/ha-mcp" pull --ff-only || true' not in content | CODE |
| HIGH | tests/src/conftest.py | 8 | cd tests && uv run pytest src/unit/ -n2 | STRING |
| HIGH | tests/src/conftest.py | 9 | cd tests && uv run pytest src/e2e/ -n2 --dist loadscope | STRING |
| HIGH | tests/src/unit/test_webhook_proxy_oauth_unified.py | 980 | b'{"refresh_token":null}', | CODE |
| HIGH | tests/src/unit/test_alias_fetch_chunking.py | 208 | then carries ``aliases: [null, ...]``. Ingesting the null would put | STRING |
| HIGH | tests/src/unit/test_helper_list_registry_join.py | 112 | """When the registry entry has no custom name (name is null), the current | STRING |
| HIGH | tests/src/unit/test_anti_fouc_behavior.py | 168 | getItem: (k) => _storage[k] || null, | CODE |
| HIGH | tests/src/unit/test_anti_fouc_behavior.py | 246 | getItem: (k) => _storage[k] || null, | CODE |
| HIGH | tests/src/unit/test_anti_fouc_behavior.py | 295 | getItem: (k) => _storage[k] || null, | CODE |
| HIGH⚡ | tests/src/unit/test_oauth_ha_auth.py | 1181 | b'{"refresh_token":null}', | CODE |
| HIGH⚡ | tests/src/unit/test_best_practice_checker.py | 2439 | """A variables key reading a LATER sibling renders undefined, silently.""" | STRING |
| HIGH⚡ | tests/src/unit/test_server_prefs_seed.py | 55 | getItem: (k) => _storage[k] || null, | CODE |
| HIGH⚡ | tests/src/unit/test_server_prefs_seed.py | 63 | value: {{ getAttribute: (name) => name === 'data-prefs' ? serverPrefsJson : null }}, | CODE |
| HIGH⚡ | tests/src/unit/test_server_prefs_seed.py | 83 | getItem: (k) => _storage[k] || null, | CODE |
| HIGH⚡ | tests/src/unit/test_server_prefs_seed.py | 90 | value: { getAttribute: (name) => name === 'data-prefs' ? '__HA_MCP_THEME_PREFS__' : null }, | CODE |
| HIGH⚡ | tests/src/unit/test_server_prefs_seed.py | 105 | getItem: (k) => _storage[k] || null, | CODE |
| HIGH⚡ | tests/src/unit/test_server_prefs_seed.py | 111 | value: { getAttribute: (name) => name === 'data-prefs' ? 'not valid json {{{' : null }, | CODE |
| HIGH | tests/src/unit/test_server_prefs_seed.py | 130 | getItem: (k) => _storage[k] || null, | CODE |
| HIGH | tests/src/unit/test_server_prefs_seed.py | 137 | value: {{ getAttribute: (name) => name === 'data-prefs' ? serverPrefsJson : null }}, | CODE |
| HIGH⚡ | tests/src/unit/test_graceful_shutdown.py | 510 | """Stdin should not be available when char device but not tty (like /dev/null).""" | STRING |
| HIGH | tests/src/unit/test_astro_setup_js_behavior.py | 552 | document.body.dataset.configCode = (codeEl && codeEl.textContent) || ''; | CODE |
| HIGH | tests/src/unit/test_astro_setup_js_behavior.py | 554 | (instructionsEl && instructionsEl.innerHTML || '').length | CODE |
| HIGH | tests/src/unit/test_astro_setup_js_behavior.py | 699 | (instructionsEl && instructionsEl.innerHTML) || '' | CODE |
| HIGH | tests/src/unit/test_astro_setup_js_behavior.py | 839 | (instructionsEl && instructionsEl.innerHTML) || '' | CODE |
| HIGH | tests/src/unit/test_settings_ui_js_behavior.py | 93 | # returns null) and the behavioural tests find an empty body. | COMMENT |
| HIGH⚡ | tests/src/unit/test_settings_ui_js_behavior.py | 1661 | master.indeterminate || master.disabled); | CODE |
| HIGH⚡ | tests/src/unit/test_settings_ui_js_behavior.py | 1663 | tool.indeterminate && tool.disabled); | CODE |
| HIGH⚡ | tests/src/unit/test_settings_ui_js_behavior.py | 1665 | !!notice && notice.classList.contains('show')); | CODE |
| HIGH⚡ | tests/src/unit/test_settings_ui_js_behavior.py | 1766 | !!notice && notice.classList.contains('show')); | CODE |
| HIGH⚡ | tests/src/unit/test_settings_ui_js_behavior.py | 1768 | master.indeterminate && master.disabled); | CODE |
| HIGH⚡ | tests/src/unit/test_settings_ui_js_behavior.py | 1770 | tool.indeterminate && tool.disabled); | CODE |
| HIGH⚡ | tests/src/unit/test_settings_ui_js_behavior.py | 2156 | (r && r.querySelector('code')) ? r.querySelector('code').textContent : ''; | CODE |
| HIGH⚡ | tests/src/unit/test_settings_ui_js_behavior.py | 2158 | String(!!(r && r.querySelector('.policy-edit-predicate'))); | CODE |
| HIGH⚡ | tests/src/unit/test_settings_ui_js_behavior.py | 2164 | const rem = card ? card.querySelector('.policy-remember-minutes') : null; | CODE |
| HIGH | tests/src/unit/test_settings_ui_js_behavior.py | 1610 | probe.dataset.blocked = String(cb.indeterminate && cb.disabled); | CODE |
| HIGH | tests/src/unit/test_settings_ui_js_behavior.py | 1612 | !!notice && notice.classList.contains('show')); | CODE |
| HIGH | tests/src/unit/test_settings_ui_js_behavior.py | 4570 | document.body.setAttribute('data-rendered', String(!!cb && cb.checked)); | CODE |
| HIGH | tests/src/unit/test_settings_ui_js_behavior.py | 5934 | !!notice && notice.classList.contains('show')); | CODE |
| HIGH | tests/src/unit/test_settings_ui_js_behavior.py | 6080 | + `dismiss=${!!(t && t.querySelector('.ha-toast-dismiss'))}`); | CODE |
| HIGH | tests/src/unit/test_settings_ui_js_behavior.py | 6118 | + `dismiss=${!!(t && t.querySelector('.ha-toast-dismiss'))}`); | CODE |
| HIGH | tests/src/unit/test_settings_ui_js_behavior.py | 6408 | if (document.activeElement && document.activeElement.blur) { | CODE |
| HIGH | tests/src/unit/test_settings_ui_js_behavior.py | 6476 | const checkedBefore = !!(before && before.checked); | CODE |
| HIGH | tests/src/unit/test_settings_ui_js_behavior.py | 6481 | document.body.setAttribute('data-after', String(!!(after && after.checked))); | CODE |
| HIGH | tests/src/unit/test_theme_toggle_behavior.py | 109 | getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null, | CODE |
| HIGH | tests/src/unit/test_theme_toggle_behavior.py | 161 | getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null, | CODE |
| HIGH | tests/src/unit/test_theme_toggle_behavior.py | 218 | getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null, | CODE |
| HIGH | tests/src/unit/test_theme_toggle_behavior.py | 264 | getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null, | CODE |
| HIGH | tests/src/unit/test_theme_toggle_behavior.py | 324 | getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null, | CODE |
| HIGH | tests/src/unit/test_theme_toggle_behavior.py | 423 | getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null, | CODE |
| HIGH | tests/src/unit/test_theme_toggle_behavior.py | 523 | getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null, | CODE |
| HIGH | tests/src/unit/test_theme_toggle_behavior.py | 588 | getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null, | CODE |
| HIGH | tests/src/unit/test_theme_toggle_behavior.py | 665 | getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null, | CODE |
| HIGH | tests/src/unit/test_theme_toggle_behavior.py | 671 | let _mqlListener = null; | CODE |
| HIGH | tests/src/unit/test_theme_toggle_behavior.py | 742 | getItem: (k) => _storage.hasOwnProperty(k) ? _storage[k] : null, | CODE |
| HIGH | tests/src/unit/test_util_helpers.py | 771 | instead of ``{"data": null}``, which would be indistinguishable from a | STRING |
| HIGH | tests/src/unit/test_e2e_wait_helpers.py | 62 | wrapper = _mcp_result('{"data": null}') | CODE |
| HIGH | tests/src/unit/test_websocket_client.py | 511 | emits ``{"id": N, "type": "result", "success": true, "result": null}``. | STRING |
| HIGH | tests/src/unit/visibility/test_enforcement.py | 1148 | # A degenerate success payload ({"result": [null]}) passes the shape | COMMENT |
| HIGH | tests/src/e2e/haos_only/test_embedded_server_haos.py | 349 | # carrying type=null), both land before any change event — drain them so | COMMENT |
| 25 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | pyproject.toml | 41 | # conflicting version demands and any of their installs can replace or | COMMENT |
| LOW | pyproject.toml | 261 | ] | COMMENT |
| LOW | docker-compose.screenshot.yml | 1 | # Example: dashboard-screenshot engine sidecar for Docker / Container installs | COMMENT |
| LOW | docker-compose.screenshot.yml | 21 | # No `volumes:` here on purpose. Compose merges service volumes by their | COMMENT |
| LOW | docker-compose.yml | 21 | # and several settings ask you to restart before they take effect. | COMMENT |
| LOW | docker-compose.yml | 41 | # `docker run` recipe, the OAuth persistence-failure hint, and the | COMMENT |
| LOW | .coderabbit.yaml | 1 | # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json | COMMENT |
| LOW | .coderabbit.yaml | 21 | # Bot-authored PRs are knowingly excluded from automatic review. Nothing | COMMENT |
| LOW | .coderabbit.yaml | 41 | # the app install got an enrichment comment until this was set explicitly. | COMMENT |
| LOW | .coderabbit.yaml | 101 | planning: | COMMENT |
| LOW | homeassistant-addon/config.yaml | 21 | # homeassistant-addon-dev/config.yaml. | COMMENT |
| LOW | homeassistant-addon/start.py | 261 | return logging.INFO | COMMENT |
| LOW | homeassistant-addon/start.py | 781 | os.environ["READ_ONLY_MODE"] = str(read_only_mode).lower() | COMMENT |
| LOW | homeassistant-addon/start.py | 861 | os.environ["ENABLE_BETA_FEATURES"] = str(enable_beta_features).lower() | COMMENT |
| LOW | homeassistant-addon/start.py | 961 | # under the secret path (for direct port access). See | COMMENT |
| LOW | tests/pytest.ini | 81 | # Per-test timeout (pytest-timeout). A stuck server-side await otherwise | COMMENT |
| LOW | tests/uat/stories/run_story.py | 521 | # degenerate-loop generation on a local model can outrun even a generous | COMMENT |
| LOW | tests/haos_image_build/requirements.txt | 1 | # Build-script dependencies. Installed in CI by the haos-e2e-tests and | COMMENT |
| LOW | tests/haos_image_build/build_image.py | 61 | # QEMU's hostfwd needs the port up front (no equivalent of bind-to-0-then- | COMMENT |
| LOW | tests/haos_image_build/build_image.py | 121 | # ├──────────────────────┼────────────────────────────────────────────────┤ | COMMENT |
| LOW | tests/haos_image_build/build_image.py | 141 | # start=False addons fail to start without config and would block the build: | COMMENT |
| LOW | tests/haos_image_build/build_image.py | 181 | # Advanced SSH & Web Terminal — used by the inaddon CI tier for network | COMMENT |
| LOW | tests/haos_image_build/build_image.py | 201 | # | COMMENT |
| LOW | tests/haos_image_build/build_image.py | 221 | # | COMMENT |
| LOW | tests/haos_image_build/build_image.py | 241 | COMMENT | |
| LOW | tests/haos_image_build/build_image.py | 1121 | if addon.repo is not None and c.get("repository") != "core": | COMMENT |
| LOW | tests/haos_image_build/build_image.py | 1141 | # these makes the bake's start-state stable across boots. | COMMENT |
| LOW | tests/haos_image_build/build_image.py | 1201 | _add_repository(ws, addon.repo) | COMMENT |
| LOW | tests/haos_image_build/build_image.py | 1441 | if not src_dir.exists(): | COMMENT |
| LOW | tests/haos_image_build/build_image.py | 2661 | ws.reconnect() | COMMENT |
| LOW | tests/initial_test_state/configuration.yaml | 21 | # NO `http:` BLOCK HERE, DELIBERATELY. HA 2026.8 moved HTTP config into a | COMMENT |
| LOW | tests/initial_test_state/configuration.yaml | 41 | input_number: | COMMENT |
| LOW | tests/addon/test_webhook_proxy.py | 3401 | with patch.object(start, "Path", side_effect=path_factory): | COMMENT |
| LOW | tests/src/haos_runtime.py | 81 | OVMF_CODE_PATH = os.environ.get("HAOS_BUILD_OVMF", "/usr/share/OVMF/OVMF_CODE.fd") | COMMENT |
| LOW | tests/src/haos_runtime.py | 101 | # deps into the test runtime path). | COMMENT |
| LOW | tests/src/haos_runtime.py | 121 | # build_image.install_advanced_ssh; available on host port | COMMENT |
| LOW | tests/src/haos_runtime.py | 161 | # of ``-p`` on the command line — ``-p`` makes the credential | COMMENT |
| LOW | tests/src/haos_runtime.py | 421 | COMMENT | |
| LOW | tests/src/haos_runtime.py | 601 | # ``home-assistant_v2.db-shm`` in the supervisor data dir. Our | COMMENT |
| LOW | …/unit/test_ha_config_list_helpers_component_routing.py | 61 | # HA's PersonStorageCollectionWebsocket overrides the base ws_list_item to send | COMMENT |
| LOW | tests/src/unit/test_backup_manager.py | 1441 | result = await mgr.diff_snapshot(path.name) | COMMENT |
| LOW | tests/src/unit/test_locale_parity.py | 81 | COMPONENT_STRINGS = _REPO_ROOT / "custom_components" / "ha_mcp_tools" / "strings.json" | COMMENT |
| LOW | tests/src/unit/test_locale_parity.py | 1021 | ) | COMMENT |
| LOW | tests/src/unit/test_locale_parity.py | 1241 | _component_catalog("en"), | COMMENT |
| LOW | tests/src/unit/test_locale_parity.py | 1441 | (TOOL_SOURCES_SURFACE, key, text, sent[key]) | COMMENT |
| LOW | tests/src/unit/test_locale_parity.py | 1461 | # one surface, and the only other test that sees surface drift is | COMMENT |
| LOW | tests/src/unit/test_locale_parity.py | 2041 | ("Range 1–600.", "Bereich 1-600.", []), | COMMENT |
| LOW | tests/src/unit/test_locale_parity.py | 2341 | # the one for the other. The second row is why the run is compared | COMMENT |
| LOW | tests/src/unit/test_locale_parity.py | 2361 | ("limit is 1-256 MB", "limite de 1-256 go", ["256 MB"]), | COMMENT |
| LOW | tests/src/unit/test_settings_ui_js_behavior.py | 81 | # enable_security_policy_tool (#2148) — registers | COMMENT |
| LOW | tests/src/unit/test_settings_ui_js_behavior.py | 2321 | # | COMMENT |
| LOW | tests/src/unit/test_settings_ui_js_behavior.py | 4261 | _assert_clean_init(result) | COMMENT |
| LOW | tests/src/unit/test_config_flow.py | 801 | # replaces. No override stored -> empty field. | COMMENT |
| LOW | tests/src/unit/test_translate_locales.py | 41 | # Catalogs that carry translated text. A catalog with no `messages` yet has no | COMMENT |
| LOW | tests/src/unit/test_helper_classifier.py | 161 | "error_str,expected_code", | COMMENT |
| LOW | tests/src/unit/test_advanced_settings_coverage.py | 181 | # becomes a Settings field, so it stays invisible to the web Settings UI | COMMENT |
| LOW | …/unit/test_fields_projection_docstring_completeness.py | 41 | # ``fields=`` Annotated[..., Field(description=...)] text | COMMENT |
| LOW | …/unit/test_fields_projection_docstring_completeness.py | 681 | f"them, or document why the tool is intentionally excluded." | COMMENT |
| LOW | tests/src/unit/test_context_injection.py | 581 | ) | COMMENT |
| LOW | tests/src/unit/test_wait_helpers.py | 321 | mock_client, | COMMENT |
| 349 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_env_manager.py | 34 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | tests/uat/stories/conftest.py | 36 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/uat/stories/test_stories.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | …ts/initial_test_state/custom_components/hacs/update.py | 148 | def _update_download_progress(self, data: dict) -> None: | CODE |
| LOW⚡ | …ts/initial_test_state/custom_components/hacs/update.py | 155 | def _update_in_progress(self, progress: int | bool) -> None: | CODE |
| LOW | …ts/initial_test_state/custom_components/hacs/entity.py | 68 | def _update_and_write_state(self, _: Any) -> None: | CODE |
| LOW | tests/initial_test_state/custom_components/hacs/base.py | 136 | def update_from_dict(self, data: dict) -> None: | CODE |
| LOW | tests/initial_test_state/custom_components/hacs/base.py | 388 | def set_stage(self, stage: HacsStage | None) -> None: | CODE |
| LOW | tests/initial_test_state/custom_components/hacs/base.py | 765 | def set_active_categories(self) -> None: | CODE |
| LOW | tests/initial_test_state/custom_components/hacs/base.py | 994 | async def update_repository(repository: HacsRepository) -> None: | CODE |
| LOW | tests/initial_test_state/custom_components/hacs/base.py | 1010 | async def update_coordinators() -> None: | CODE |
| LOW | …nitial_test_state/custom_components/hacs/utils/json.py | 5 | __all__ = ["json_loads"] | CODE |
| LOW | …est_state/custom_components/hacs/repositories/theme.py | 113 | def update_filenames(self) -> None: | CODE |
| LOW | …st_state/custom_components/hacs/repositories/plugin.py | 111 | def update_filenames(self) -> None: | CODE |
| LOW | …st_state/custom_components/hacs/repositories/plugin.py | 205 | async def update_dashboard_resources(self) -> None: | CODE |
| LOW | …e/custom_components/hacs/repositories/python_script.py | 105 | def update_filenames(self) -> None: | CODE |
| LOW | …test_state/custom_components/hacs/repositories/base.py | 194 | def update_data(self, data: dict, action: bool = False) -> None: | CODE |
| LOW | …test_state/custom_components/hacs/repositories/base.py | 256 | def update_data(self, data: dict) -> None: | CODE |
| LOW | …test_state/custom_components/hacs/repositories/base.py | 467 | async def update_repository(self, ignore_issues=False, force=False) -> None: | CODE |
| LOW | …test_state/custom_components/hacs/repositories/base.py | 1018 | def update_filenames(self) -> None: | CODE |
| LOW | tests/src/unit/_embedded_stubs.py | 355 | def set_cookie(self, name: str, value: str, **attrs: Any) -> None: | CODE |
| LOW | …src/unit/test_ha_dev_server_entry_component_routing.py | 69 | def set_flow(self, entry_id: str, flow: Any) -> None: | CODE |
| LOW | tests/src/unit/test_ha_search_component_routing.py | 127 | def _setup_visibility_disabled(tmp_path: Any, monkeypatch: Any) -> None: | CODE |
| LOW | tests/src/unit/test_ha_overview_component_routing.py | 153 | def _setup_visibility_disabled(tmp_path: Any, monkeypatch: Any) -> None: | CODE |
| LOW | tests/src/unit/test_wait_helpers.py | 374 | def set_unsubscribe_failure(self, exc: Exception | None) -> None: | CODE |
| LOW | tests/src/e2e/conftest.py | 96 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/conftest.py | 665 | def _setup_config_permissions(config_path: Path) -> None: | CODE |
| LOW | tests/src/e2e/tools/test_radio_management.py | 35 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/tools/test_security_policy_tool.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | tests/src/e2e/tools/test_deep_search_exact_match.py | 17 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/tools/test_bm25_fuzzy_search.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/tools/test_skills_resources.py | 19 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/tools/test_search_entities.py | 21 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/tools/test_create_custom_tool.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/tools/test_dev_mode_tools.py | 32 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/tools/test_deep_search_many_configs.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/tools/test_deep_search.py | 12 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/tools/test_logbook.py | 15 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/tools/test_search_reference_graph.py | 45 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/tools/test_tools_knx.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/tools/test_tools_energy.py | 18 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/tools/test_ha_call_event.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | …s/src/e2e/haos_only/test_dashboard_screenshot_addon.py | 202 | async def _set_options(mcp_client: Any, slug: str, options: dict[str, Any]) -> None: | CODE |
| LOW | tests/src/e2e/haos_only/test_manage_addon_modes.py | 50 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/haos_only/test_stdio_entity_visibility.py | 20 | logger = logging.getLogger(__name__) | CODE |
| LOW⚡ | tests/src/e2e/haos_only/test_webhook_proxy_addon.py | 164 | async def _set_options(mcp_client: Any, slug: str, options: dict[str, Any]) -> None: | CODE |
| LOW | tests/src/e2e/basic/test_connection.py | 11 | logger = logging.getLogger(__name__) | CODE |
| LOW | …/src/e2e/workflows/webhook_proxy/test_webhook_proxy.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | …rc/e2e/workflows/scenes/test_yaml_scene_not_storage.py | 37 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/workflows/scenes/test_lifecycle.py | 28 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/workflows/blueprints/test_blueprints.py | 25 | logger = logging.getLogger(__name__) | CODE |
| LOW | …flows/device_control/test_action_service_resolution.py | 27 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/workflows/device_control/test_lights.py | 23 | logger = logging.getLogger(__name__) | CODE |
| LOW | …/e2e/workflows/device_control/test_operation_status.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/workflows/calendar/test_calendar.py | 29 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/workflows/core/test_service.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/workflows/core/test_templates.py | 14 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/workflows/core/test_assist_pipeline.py | 16 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/workflows/core/test_bulk.py | 24 | logger = logging.getLogger(__name__) | CODE |
| LOW | tests/src/e2e/workflows/core/test_state.py | 14 | logger = logging.getLogger(__name__) | CODE |
| 249 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/src/e2e/workflows/device_control/test_lights.py | 27 | Validate and return entity state data. Args: state_data: Parsed MCP result from ha_get_state entity | STRING |
| HIGH | tests/src/e2e/utilities/wait_helpers.py | 358 | Poll an MCP tool until the result satisfies a predicate. Useful when an entity was just created and needs time | STRING |
| HIGH | tests/src/e2e/utilities/wait_helpers.py | 667 | Subscribe → sample-after-subscribe → wait-for-event pattern, test-side. Mirrors :func:`ha_mcp.tools.util_helpers._w | STRING |
| HIGH | src/ha_mcp/tools/backup.py | 209 | Retrieve default backup password from Home Assistant configuration. Args: ws_client: Connected WebSock | STRING |
| HIGH | src/ha_mcp/tools/device_control.py | 108 | Universal smart device control with async verification. This tool provides intelligent device control | STRING |
| HIGH | src/ha_mcp/tools/util_helpers.py | 99 | Parse flexibly JSON string or return existing dict/list. Args: param: JSON string, dict, list, or None | STRING |
| HIGH | src/ha_mcp/tools/tools_utility.py | 131 | Evaluate Jinja2 templates using Home Assistant's template engine. This tool allows testing and debuggi | STRING |
| HIGH | src/ha_mcp/tools/helpers.py | 124 | Reject ``None``, empty, or whitespace-only identifier values. Surfaces a structured ``VALIDATION_INVALID_PARAMETER` | STRING |
| HIGH | src/ha_mcp/tools/helpers.py | 456 | Convert an exception to a structured error response. This function maps common exception types to appropriate | STRING |
| HIGH | src/ha_mcp/tools/smart_search/_entities.py | 71 | Search entities with fuzzy matching and typo tolerance. Args: query: Search query (can be | STRING |
| HIGH | src/ha_mcp/tools/smart_search/_entities.py | 454 | Get entities grouped by area/room using the HA registries for accurate area resolution. Uses the entit | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/server.py | 238 | Check a handshake request and negotiate extensions and subprotocol. This function doesn't check the `` | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/server.py | 317 | Handle the Origin HTTP request header. Args: headers: WebSocket handshake request headers. | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/server.py | 355 | Handle the Sec-WebSocket-Extensions HTTP request header. Accept or reject each extension proposed in t | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/server.py | 433 | Handle the Sec-WebSocket-Protocol HTTP request header. Args: headers: WebSocket handshake | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/server.py | 460 | Pick a subprotocol among those offered by the client. If several subprotocols are supported by both th | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/proxy.py | 49 | Parse and validate a proxy. Args: proxy: proxy. Returns: Parsed proxy. Raises: | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/client.py | 178 | Handle the Sec-WebSocket-Extensions HTTP response header. Check that each extension is supported, as w | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/uri.py | 61 | Parse and validate a WebSocket URI. Args: uri: WebSocket URI. Returns: Parsed WebSocket U | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/trio/connection.py | 266 | Receive the next message. When the connection is closed, :meth:`recv` raises :exc:`~websockets | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/trio/connection.py | 344 | Receive the next message frame by frame. This method is designed for receiving fragmented messages. It | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/trio/connection.py | 683 | Send a Ping_. .. _Ping: https://datatracker.ietf.org/doc/html/rfc6455#section-5.5.2 A ping ma | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/legacy/handshake.py | 38 | Check a handshake request received from the client. This function doesn't verify that the request is an HTTP/1 | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/legacy/server.py | 560 | Perform the server side of the opening handshake. Args: origins: List of acceptable values | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/legacy/protocol.py | 787 | Send a Ping_. .. _Ping: https://datatracker.ietf.org/doc/html/rfc6455#section-5.5.2 A ping ma | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/extensions/base.py | 22 | Decode an incoming frame. Args: frame: Incoming frame. max_size: Maximum paylo | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/extensions/base.py | 76 | Process parameters received from the server. Args: params: Parameters received from the se | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/extensions/base.py | 107 | Process parameters received from the client. Args: params: Parameters received from the cl | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/sync/connection.py | 273 | Receive the next message. When the connection is closed, :meth:`recv` raises :exc:`~websockets | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/sync/connection.py | 352 | Receive the next message frame by frame. This method is designed for receiving fragmented messages. It | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/sync/connection.py | 616 | Send a Ping_. .. _Ping: https://datatracker.ietf.org/doc/html/rfc6455#section-5.5.2 A ping ma | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/sync/utils.py | 26 | Calculate a timeout from a deadline. Args: raise_if_elapsed: Whether to raise :exc:`Timeou | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/asyncio/connection.py | 250 | Receive the next message. When the connection is closed, :meth:`recv` raises :exc:`~websockets | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/asyncio/connection.py | 328 | Receive the next message frame by frame. This method is designed for receiving fragmented messages. It | STRING |
| HIGH | src/ha_mcp/_vendor/websockets/asyncio/connection.py | 659 | Send a Ping_. .. _Ping: https://datatracker.ietf.org/doc/html/rfc6455#section-5.5.2 A ping ma | STRING |
| HIGH | src/ha_mcp/utils/python_sandbox.py | 340 | Execute a validated Python expression in a restricted environment. The expression runs with ``variables`` avai | STRING |
| HIGH | src/ha_mcp/utils/python_sandbox.py | 410 | Execute validated Python expression against a ``config`` dict. Thin wrapper around :func:`safe_execute_express | STRING |
| HIGH | src/ha_mcp/client/supervisor_client.py | 31 | Construct an ``httpx.AsyncClient`` pre-configured for the Supervisor REST API. Args: timeout: Per-request t | STRING |
| HIGH | src/ha_mcp/client/rest_client.py | 409 | Make authenticated request to Home Assistant API and parse JSON body. Args: method: HTTP m | STRING |
| HIGH | src/ha_mcp/client/rest_client.py | 1173 | Convert entity_id to unique_id if needed, or return unique_id as-is. Args: identifier: Eit | STRING |
| HIGH | src/ha_mcp/client/rest_client.py | 1209 | Get automation configuration by unique_id or entity_id. Args: identifier: Either automatio | STRING |
| HIGH | src/ha_mcp/client/rest_client.py | 1244 | Create new automation or update existing one. Args: config: Automation configuration dicti | STRING |
| HIGH | src/ha_mcp/client/rest_client.py | 1381 | Delete automation configuration by entity_id or unique_id. Args: identifier: Either automa | STRING |
| HIGH | src/ha_mcp/client/rest_client.py | 1437 | Start a config entry flow. Args: handler: Integration domain (e.g., "template", "group") | STRING |
| HIGH | src/ha_mcp/client/rest_client.py | 1482 | Submit data for a config flow step. Args: flow_id: Flow ID from start_config_flow or previ | STRING |
| HIGH | src/ha_mcp/client/rest_client.py | 1505 | Abort an in-progress config entry flow. Args: flow_id: Flow ID to abort Returns: | STRING |
| HIGH | src/ha_mcp/client/rest_client.py | 1521 | Start an options flow for a config entry. The options flow allows configuring an existing integration | STRING |
| HIGH | src/ha_mcp/client/rest_client.py | 1547 | Submit data for an options flow step. Args: flow_id: Flow ID from start_options_flow or pr | STRING |
| HIGH | src/ha_mcp/client/rest_client.py | 1568 | Abort an in-progress options flow without saving changes. Args: flow_id: Flow ID to abort | STRING |
| HIGH | src/ha_mcp/client/rest_client.py | 1692 | Get config entry details. Note: Home Assistant doesn't have a direct REST API endpoint for individual | STRING |
| HIGH | src/ha_mcp/client/rest_client.py | 1722 | Delete a config entry via REST API. The WebSocket command ``config_entries/delete`` is not supported by | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …s/uat/stories/catalog/s02_automation_motion_light.yaml | 18 | # Create an input_boolean to simulate a motion sensor | COMMENT |
| MEDIUM | …ories/catalog/s07_automation_update_add_condition.yaml | 18 | # Create the automation to be modified | COMMENT |
| MEDIUM | …ories/catalog/s07_automation_update_add_condition.yaml | 34 | # Create a presence indicator | COMMENT |
| MEDIUM | tests/addon/test_webhook_proxy.py | 543 | # Create the package object first so submodules have a parent with __path__. | COMMENT |
| MEDIUM | tests/src/unit/test_oauth.py | 377 | # Create a stateless refresh token (as exchange_authorization_code would) | COMMENT |
| MEDIUM | tests/src/unit/test_oauth.py | 1303 | # Create a cached client | COMMENT |
| MEDIUM | tests/src/unit/test_graceful_shutdown.py | 74 | # Create a mock event | COMMENT |
| MEDIUM | tests/src/unit/test_graceful_shutdown.py | 226 | # Create a mock MCP that runs forever | COMMENT |
| MEDIUM | tests/src/unit/policy/test_approval_queue.py | 275 | # Create a second entry — forces eviction of 'a' (only one pending) | COMMENT |
| MEDIUM | tests/src/e2e/test_entity_visibility.py | 147 | # Create a label and assign it to the probe so the entity-registry entry | COMMENT |
| MEDIUM⚡ | tests/src/e2e/tools/test_deep_search_exact_match.py | 25 | # Create an automation with a distinctive entity reference | COMMENT |
| MEDIUM | tests/src/e2e/tools/test_deep_search_exact_match.py | 141 | # Create a dashboard with a distinctive entity reference | COMMENT |
| MEDIUM | tests/src/e2e/tools/test_bm25_fuzzy_search.py | 106 | # Create an automation with terms that are non-adjacent | COMMENT |
| MEDIUM | tests/src/e2e/tools/test_deep_search.py | 46 | # Create the automation | COMMENT |
| MEDIUM | tests/src/e2e/tools/test_deep_search.py | 116 | # Create a test script with distinctive content | COMMENT |
| MEDIUM | tests/src/e2e/tools/test_deep_search.py | 128 | # Create the script | COMMENT |
| MEDIUM | tests/src/e2e/tools/test_deep_search.py | 203 | # Create a test input_select helper with distinctive options | COMMENT |
| MEDIUM | tests/src/e2e/tools/test_deep_search.py | 209 | # Create the helper | COMMENT |
| MEDIUM | tests/src/e2e/workflows/calendar/test_calendar.py | 215 | # Create an event for tomorrow | COMMENT |
| MEDIUM | tests/src/e2e/workflows/core/test_service.py | 194 | # Create a test automation first | COMMENT |
| MEDIUM | tests/src/e2e/workflows/core/test_service.py | 373 | # Create a test input_boolean | COMMENT |
| MEDIUM⚡ | tests/src/e2e/workflows/config/test_label_crud.py | 307 | # Create a test label | COMMENT |
| MEDIUM | tests/src/e2e/workflows/config/test_label_crud.py | 397 | # Create a test label | COMMENT |
| MEDIUM | tests/src/e2e/workflows/config/test_label_crud.py | 438 | # Create a test label | COMMENT |
| MEDIUM | tests/src/e2e/workflows/config/test_label_crud.py | 479 | # Create a test label | COMMENT |
| MEDIUM | tests/src/e2e/workflows/config/test_helper_crud.py | 1907 | # Create a dedicated area | COMMENT |
| MEDIUM | tests/src/e2e/workflows/config/test_helper_crud.py | 1971 | # Create a dedicated label | COMMENT |
| MEDIUM | tests/src/e2e/workflows/config/test_helper_crud.py | 2042 | # Create a dedicated area | COMMENT |
| MEDIUM | tests/src/e2e/workflows/config/test_helper_crud.py | 2332 | # Create a dedicated area + label | COMMENT |
| MEDIUM | …/e2e/workflows/auto_backup/test_capture_and_restore.py | 228 | # Create an automation to snapshot. We do NOT edit it — the | COMMENT |
| MEDIUM | tests/src/e2e/workflows/labels/test_label_operations.py | 49 | # Create the test label | COMMENT |
| MEDIUM | tests/src/e2e/workflows/labels/test_label_operations.py | 341 | # Create a test label | COMMENT |
| MEDIUM | tests/src/e2e/workflows/filesystem/test_yaml_config.py | 733 | # Create a file with a list value | COMMENT |
| MEDIUM | tests/src/e2e/workflows/filesystem/test_yaml_config.py | 1038 | # Create a file with !secret tag under 'template' key | COMMENT |
| MEDIUM | tests/src/e2e/workflows/filesystem/test_yaml_config.py | 1264 | # Create the theme file. | COMMENT |
| MEDIUM | tests/src/e2e/workflows/filesystem/test_yaml_config.py | 1437 | # Create the key — no prior value, so capture is skipped. | COMMENT |
| MEDIUM | …s/src/e2e/workflows/filesystem/test_file_operations.py | 686 | # Create a file to delete | COMMENT |
| MEDIUM | tests/src/e2e/workflows/groups/test_verification.py | 69 | # Create a group first | COMMENT |
| MEDIUM | …/workflows/integrations/test_integration_management.py | 95 | # Create a temporary light group helper | COMMENT |
| MEDIUM | tests/src/e2e/workflows/system/test_system_tools.py | 825 | # Create a test notification | COMMENT |
| MEDIUM | tests/src/e2e/workflows/dashboards/test_resources.py | 374 | # Create a resource first | COMMENT |
| MEDIUM | tests/src/e2e/workflows/dashboards/test_resources.py | 414 | # Create a known inline resource so the flag has something to act on; | COMMENT |
| MEDIUM | …sts/src/e2e/workflows/registry/test_voice_assistant.py | 96 | # Create a test entity first | COMMENT |
| MEDIUM | …sts/src/e2e/workflows/registry/test_voice_assistant.py | 145 | # Create a test entity | COMMENT |
| MEDIUM | …sts/src/e2e/workflows/registry/test_voice_assistant.py | 202 | # Create a test entity | COMMENT |
| MEDIUM | …sts/src/e2e/workflows/registry/test_device_registry.py | 399 | # Create the labels this test assigns. Creation happens inside the | COMMENT |
| MEDIUM | tests/src/e2e/workflows/automation/test_lifecycle.py | 921 | # Create the automation - THIS IS THE KEY TEST | COMMENT |
| MEDIUM | …/src/e2e/workflows/automation/test_python_transform.py | 578 | # Create a category | COMMENT |
| MEDIUM | tests/src/e2e/workflows/convenience/test_backup.py | 271 | # Create a backup (which internally retrieves config/password) | COMMENT |
| MEDIUM⚡ | …2e/workflows/categories/test_config_tool_categories.py | 28 | # Create a category first | COMMENT |
| MEDIUM | …2e/workflows/categories/test_config_tool_categories.py | 87 | # Create a category first | COMMENT |
| MEDIUM | …2e/workflows/categories/test_config_tool_categories.py | 145 | # Create a category | COMMENT |
| MEDIUM | …2e/workflows/categories/test_config_tool_categories.py | 254 | # Create a category | COMMENT |
| MEDIUM | …2e/workflows/categories/test_config_tool_categories.py | 317 | # Create a category | COMMENT |
| MEDIUM | …2e/workflows/categories/test_config_tool_categories.py | 361 | # Create a category for helpers | COMMENT |
| MEDIUM | …sts/src/e2e/workflows/categories/test_category_crud.py | 235 | # Create a test category | COMMENT |
| MEDIUM | …sts/src/e2e/workflows/categories/test_category_crud.py | 281 | # Create a test category | COMMENT |
| MEDIUM⚡ | tests/src/e2e/workflows/entities/test_entity_remove.py | 19 | # Create a temporary input_boolean to remove | COMMENT |
| MEDIUM | …s/src/e2e/workflows/entities/test_entity_management.py | 41 | # Create a test area | COMMENT |
| MEDIUM | …s/src/e2e/workflows/entities/test_entity_management.py | 349 | # Create a test area | COMMENT |
| 17 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packaging/mcpb/generate_manifest.py | 18 | CODE | |
| LOW | homeassistant-addon/start.py | 82 | CODE | |
| LOW | tests/test_env_manager.py | 284 | CODE | |
| LOW | tests/test_env_manager.py | 307 | CODE | |
| LOW | tests/test_env_manager.py | 145 | CODE | |
| LOW | tests/uat/run_uat.py | 560 | CODE | |
| LOW | tests/uat/ha_wait.py | 24 | CODE | |
| LOW | tests/uat/ha_wait.py | 60 | CODE | |
| LOW | tests/uat/openai_agent.py | 137 | CODE | |
| LOW | tests/uat/stories/run_story.py | 173 | CODE | |
| LOW | tests/uat/stories/run_story.py | 213 | CODE | |
| LOW | tests/uat/stories/run_story.py | 257 | CODE | |
| LOW | tests/haos_image_build/build_image.py | 349 | CODE | |
| LOW | tests/haos_image_build/build_image.py | 373 | CODE | |
| LOW | tests/haos_image_build/build_image.py | 391 | CODE | |
| LOW | tests/initial_test_state/custom_components/hacs/base.py | 430 | CODE | |
| LOW | tests/initial_test_state/custom_components/hacs/base.py | 523 | CODE | |
| LOW | tests/initial_test_state/custom_components/hacs/base.py | 838 | CODE | |
| LOW | tests/initial_test_state/custom_components/hacs/base.py | 433 | CODE | |
| LOW | …t_state/custom_components/hacs/validate/information.py | 21 | CODE | |
| LOW | …ial_test_state/custom_components/hacs/utils/filters.py | 8 | CODE | |
| LOW | …nitial_test_state/custom_components/hacs/utils/data.py | 156 | CODE | |
| LOW | …st_state/custom_components/hacs/repositories/plugin.py | 111 | CODE | |
| LOW | …test_state/custom_components/hacs/repositories/base.py | 194 | CODE | |
| LOW | …test_state/custom_components/hacs/repositories/base.py | 360 | CODE | |
| LOW | …test_state/custom_components/hacs/repositories/base.py | 410 | CODE | |
| LOW | …test_state/custom_components/hacs/repositories/base.py | 657 | CODE | |
| LOW | …test_state/custom_components/hacs/repositories/base.py | 781 | CODE | |
| LOW | …test_state/custom_components/hacs/repositories/base.py | 1046 | CODE | |
| LOW | …test_state/custom_components/hacs/repositories/base.py | 1171 | CODE | |
| LOW | …test_state/custom_components/hacs/repositories/base.py | 684 | CODE | |
| LOW | tests/src/haos_runtime.py | 476 | CODE | |
| LOW | tests/src/haos_runtime.py | 1654 | CODE | |
| LOW | tests/src/haos_runtime.py | 1986 | CODE | |
| LOW | tests/src/haos_runtime.py | 2033 | CODE | |
| LOW | tests/src/unit/test_area_filter_search.py | 46 | CODE | |
| LOW | tests/src/unit/test_haos_image_workflow_shape.py | 91 | CODE | |
| LOW | tests/src/unit/test_lite_docstrings.py | 736 | CODE | |
| LOW | tests/src/unit/test_lite_docstrings.py | 303 | CODE | |
| LOW | tests/src/unit/test_graceful_shutdown.py | 354 | CODE | |
| LOW | tests/src/unit/test_locale_parity.py | 399 | CODE | |
| LOW | tests/src/unit/test_read_only.py | 881 | CODE | |
| LOW | tests/src/unit/test_read_only.py | 888 | CODE | |
| LOW | tests/src/unit/test_settings_ui_handler_selection.py | 84 | CODE | |
| LOW | tests/src/unit/test_advanced_settings_coverage.py | 246 | CODE | |
| LOW | tests/src/unit/test_advanced_settings_coverage.py | 297 | CODE | |
| LOW | …/unit/test_fields_projection_docstring_completeness.py | 242 | CODE | |
| LOW | …/unit/test_fields_projection_docstring_completeness.py | 293 | CODE | |
| LOW | …/unit/test_fields_projection_docstring_completeness.py | 386 | CODE | |
| LOW | …/unit/test_fields_projection_docstring_completeness.py | 433 | CODE | |
| LOW | …/unit/test_fields_projection_docstring_completeness.py | 654 | CODE | |
| LOW | tests/src/unit/test_skill_content_wiring.py | 282 | CODE | |
| LOW | tests/src/unit/test_skill_content_wiring.py | 310 | CODE | |
| LOW | tests/src/e2e/conftest.py | 548 | CODE | |
| LOW | tests/src/e2e/conftest.py | 567 | CODE | |
| LOW | tests/src/e2e/conftest.py | 1062 | CODE | |
| LOW | tests/src/e2e/conftest.py | 1427 | CODE | |
| LOW | tests/src/e2e/conftest.py | 1555 | CODE | |
| LOW | tests/src/e2e/conftest.py | 1964 | CODE | |
| LOW | tests/src/e2e/conftest.py | 2479 | CODE | |
| 217 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/src/unit/test_oauth.py | 758 | # Step 5: Verify access token contains only ha_token (no ha_url - SSRF fix) | COMMENT |
| LOW⚡ | tests/src/unit/test_oauth.py | 764 | # Step 6: Use stateless refresh token to get new access token | COMMENT |
| LOW⚡ | tests/src/unit/test_oauth.py | 778 | # Step 7: Verify refreshed access token is valid and carries HA credentials | COMMENT |
| LOW⚡ | tests/src/unit/test_oauth.py | 785 | # Step 8: Verify chained refresh also works | COMMENT |
| LOW | tests/src/unit/test_oauth.py | 688 | # Step 1: Client registration | COMMENT |
| LOW | tests/src/unit/test_oauth.py | 702 | # Step 2: Authorization request | COMMENT |
| LOW | tests/src/unit/test_oauth.py | 722 | # Step 3: Simulate consent form submission | COMMENT |
| LOW | tests/src/unit/test_oauth.py | 746 | # Step 4: Exchange auth code for tokens | COMMENT |
| LOW⚡ | tests/src/unit/test_flow_multistep.py | 563 | # Step 1: the user step | COMMENT |
| LOW⚡ | tests/src/unit/test_flow_multistep.py | 571 | # Step 2: the state_characteristic step — MUST receive its key, | COMMENT |
| LOW⚡ | tests/src/e2e/tools/test_create_custom_tool.py | 1053 | # Step 1: save a tool we'll then delete. | COMMENT |
| LOW | tests/src/e2e/tools/test_create_custom_tool.py | 1065 | # Step 2: delete it from inside the sandbox. | COMMENT |
| LOW | tests/src/e2e/tools/test_create_custom_tool.py | 1086 | # Step 3: confirm running it now fails (entry is gone). | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 554 | # Step 1: List automation blueprints | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 564 | # Step 2: List script blueprints | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 574 | # Step 3: If blueprints exist, explore one | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 640 | # Step 1: List available blueprints | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 655 | # Step 2: Get blueprint details to understand required inputs | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 664 | # Step 3: Create automation from blueprint (no trigger/action fields) | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 712 | # Step 4: Wait for automation to be registered, then verify no trigger/action fields | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 720 | # Step 5: Clean up | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/system/test_system_tools.py | 716 | # Step 1: Check configuration (folded into ha_get_system_health) | COMMENT |
| LOW | tests/src/e2e/workflows/system/test_system_tools.py | 728 | # Step 2: Reload automations | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/scripts/test_lifecycle.py | 1183 | # Step 2: Get blueprint details to understand required inputs | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/scripts/test_lifecycle.py | 1192 | # Step 3: Create script from blueprint (no sequence field) | COMMENT |
| LOW | tests/src/e2e/workflows/scripts/test_lifecycle.py | 1238 | # Step 4: Wait for script to be registered, then verify no sequence field | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/services/test_list_services.py | 373 | # Step 1: Discover light services (use full detail to see fields) | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/services/test_list_services.py | 383 | # Step 2: Find a light entity to test with | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/services/test_list_services.py | 400 | # Step 3: Use discovered service to control light | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/services/test_list_services.py | 410 | # Step 4: Call discovered service | COMMENT |
| LOW | .claude/skills/bat-story-eval/SKILL.md | 31 | ## Step 0: Triage (Diff Analysis + Custom Story Design) | COMMENT |
| LOW | .claude/skills/bat-story-eval/SKILL.md | 108 | ## Step 1: Run Baseline Version | COMMENT |
| LOW | .claude/skills/bat-story-eval/SKILL.md | 167 | ## Step 2: Run Target Version | COMMENT |
| LOW | .claude/skills/bat-story-eval/SKILL.md | 182 | ## Step 3: White-Box Analysis | COMMENT |
| LOW | .claude/skills/bat-story-eval/SKILL.md | 215 | ## Step 4: Score & Compare | COMMENT |
| LOW | .claude/skills/bat-story-eval/SKILL.md | 259 | ## Step 5: Update JSONL | COMMENT |
| LOW | .claude/skills/bat-story-eval/SKILL.md | 270 | ## Step 6: Report | COMMENT |
| LOW | .claude/skills/bat-story-eval/SKILL.md | 327 | ## Step 7: Investigate Outliers | COMMENT |
| LOW | .claude/skills/bat-story-eval/SKILL.md | 341 | ## Step 8: Tool Description Size | COMMENT |
| LOW | …kills/bat-story-eval/references/regression-protocol.md | 29 | ## Step 1: Re-Run (Flakiness Check) | COMMENT |
| LOW | …kills/bat-story-eval/references/regression-protocol.md | 45 | ## Step 2: Control Run (Baseline Version) | COMMENT |
| LOW | …kills/bat-story-eval/references/regression-protocol.md | 62 | ## Step 3: Cross-Agent Check | COMMENT |
| LOW | …kills/bat-story-eval/references/regression-protocol.md | 92 | ## Step 4: Diagnose | COMMENT |
| LOW | …kills/bat-story-eval/references/regression-protocol.md | 133 | ## Step 5: Report | COMMENT |
| LOW | .claude/skills/my-pr-checker/SKILL.md | 12 | ## Step 1: Full PR Assessment | COMMENT |
| LOW | .claude/skills/my-pr-checker/SKILL.md | 34 | ## Step 2: Triage Comments | COMMENT |
| LOW | .claude/skills/my-pr-checker/SKILL.md | 42 | ## Step 3: Fix Code Issues | COMMENT |
| LOW | .claude/skills/my-pr-checker/SKILL.md | 59 | ## Step 4: Resolve Each Thread (both steps required) | COMMENT |
| LOW | .claude/skills/my-pr-checker/SKILL.md | 80 | ## Step 5: Wait and Re-check | COMMENT |
| LOW | .claude/skills/my-pr-checker/SKILL.md | 91 | ## Step 6: Final Report | COMMENT |
| LOW | .claude/skills/issue-analysis/SKILL.md | 15 | ## Step 1: Fetch Issue Details | COMMENT |
| LOW⚡ | .claude/skills/issue-analysis/SKILL.md | 26 | ## Step 2: Research Phase (before drawing conclusions) | COMMENT |
| LOW⚡ | .claude/skills/issue-analysis/SKILL.md | 33 | ## Step 3: Assess Other Open Issues (for priority context) | COMMENT |
| LOW⚡ | .claude/skills/issue-analysis/SKILL.md | 39 | ## Step 4: Determine Labels | COMMENT |
| LOW | .claude/skills/issue-analysis/SKILL.md | 51 | ## Step 5: Draft Analysis for User | COMMENT |
| LOW | .claude/skills/issue-analysis/SKILL.md | 57 | ## Step 6: Apply Labels and Post Comment | COMMENT |
| LOW | docs/macOS-uv-guide.md | 7 | ## Step 1: Create a Claude Account | COMMENT |
| LOW | docs/macOS-uv-guide.md | 11 | ## Step 2: Run the Installer | COMMENT |
| LOW⚡ | docs/macOS-uv-guide.md | 60 | ## Step 3: Install or Restart Claude Desktop | COMMENT |
| LOW⚡ | docs/macOS-uv-guide.md | 66 | ## Step 4: Test It | COMMENT |
| 19 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | homeassistant-addon/start.py | 109 | # Check if we have a stored secret path | COMMENT |
| LOW | tests/src/unit/_js_harness.py | 469 | # Check if this is a data-purpose script and incorporate that | COMMENT |
| LOW | tests/src/e2e/conftest.py | 872 | # Check if HACS is installed and frontend is missing or invalid. | COMMENT |
| LOW | tests/src/e2e/conftest.py | 2525 | # Check if container is actually running | COMMENT |
| LOW | tests/src/e2e/workflows/blueprints/test_blueprints.py | 686 | # Check if it was our validation or HA's validation that failed | COMMENT |
| LOW | tests/src/e2e/workflows/device_control/test_lights.py | 39 | # Check if this is a successful response with entity data | COMMENT |
| LOW | tests/src/e2e/workflows/core/test_history.py | 527 | # Check if requested types are in response | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/config/test_label_crud.py | 317 | # Assign label to entity | COMMENT |
| LOW | tests/src/e2e/workflows/config/test_helper_crud.py | 1176 | # Check if 'data' key exists (not 'success' key which doesn't exist in parse_mcp_result) | COMMENT |
| LOW | tests/src/e2e/workflows/config/test_helper_crud.py | 1195 | # Check if 'data' key exists (not 'success' key which doesn't exist in parse_mcp_result) | COMMENT |
| LOW | …s/src/e2e/workflows/filesystem/test_file_operations.py | 154 | # Check if we got the "not installed" error | COMMENT |
| LOW | …s/src/e2e/workflows/filesystem/test_file_operations.py | 638 | # Write file with nested directories | COMMENT |
| LOW | …s/src/e2e/workflows/filesystem/test_file_operations.py | 964 | # Check if the ha_mcp_tools service is actually available | COMMENT |
| LOW | tests/src/e2e/workflows/todo/test_lifecycle.py | 581 | # Check if any todo entities found | COMMENT |
| LOW | tests/src/e2e/workflows/scripts/test_lifecycle.py | 1212 | # Check if it was our validation or HA's validation that failed | COMMENT |
| LOW | tests/src/e2e/workflows/scripts/test_lifecycle.py | 356 | if state_data.get("success"): # Check if state is accessible | CODE |
| LOW | tests/src/e2e/workflows/automation/test_helpers.py | 54 | # Check if we have valid entity data | COMMENT |
| LOW | tests/src/e2e/workflows/automation/test_helpers.py | 1156 | # Check if our test helper is in the results | COMMENT |
| LOW | tests/src/e2e/workflows/convenience/test_backup.py | 59 | # Check if backup password is configured | COMMENT |
| LOW | tests/src/e2e/workflows/convenience/test_backup.py | 131 | # Check if backup password is configured | COMMENT |
| LOW | tests/src/e2e/workflows/convenience/test_backup.py | 289 | # Check if error is about missing password | COMMENT |
| LOW | …sts/src/e2e/workflows/categories/test_category_crud.py | 247 | # Assign category to entity | COMMENT |
| LOW | …s/src/e2e/workflows/entities/test_entity_management.py | 52 | # Assign entity to area | COMMENT |
| LOW | …s/src/e2e/workflows/entities/test_entity_management.py | 96 | # Assign entity to area first | COMMENT |
| LOW | tests/src/e2e/utilities/wait_helpers.py | 170 | # Check if 'data' key exists (not 'success' key which doesn't exist in parse_mcp_result) | COMMENT |
| LOW | tests/src/e2e/utilities/assertions.py | 62 | # Check if this is an error response (from ToolError). fastmcp's | COMMENT |
| LOW | tests/src/e2e/utilities/cleanup.py | 201 | # Check if entity ID or name contains test patterns | COMMENT |
| LOW | custom_components/ha_mcp_tools/__init__.py | 1208 | # Check if it's one of the explicitly allowed files in config root | COMMENT |
| LOW | custom_components/ha_mcp_tools/__init__.py | 1212 | # Check if path starts with an allowed directory | COMMENT |
| LOW | scripts/install.sh | 250 | # Check if config file exists and handle accordingly | COMMENT |
| LOW | scripts/install.sh | 258 | # Check if ha-mcp is already configured | COMMENT |
| LOW | .github/workflows/_build-and-release.yml | 186 | # Check if release exists and is draft | COMMENT |
| LOW | site/src/data/tools.json | 3655 | "description": "Evaluate Jinja2 templates using Home Assistant's template engine.\n\nThis tool allows testing and de | CODE |
| LOW | homeassistant-addon-webhook-proxy-dev/start.py | 970 | # Check if integration already loaded (user restarted fast) | COMMENT |
| LOW | homeassistant-addon-webhook-proxy/start.py | 968 | # Check if integration already loaded (user restarted fast) | COMMENT |
| LOW | src/ha_mcp/__main__.py | 834 | # Check if stdin is available (fails in Docker without -i flag) | COMMENT |
| LOW | src/ha_mcp/__main__.py | 213 | # Check if stdin is closed | STRING |
| LOW | src/ha_mcp/tools/tools_yaml_config.py | 466 | # Check if custom component is available | COMMENT |
| LOW⚡ | src/ha_mcp/tools/tools_traces.py | 488 | # Check if enabled (state is 'on' for automations, 'off' is disabled) | COMMENT |
| LOW⚡ | src/ha_mcp/tools/tools_traces.py | 498 | # Check if tracing is stored - only for automations | COMMENT |
| LOW⚡ | src/ha_mcp/tools/tools_filesystem.py | 830 | # Check if custom component is available | COMMENT |
| LOW | src/ha_mcp/tools/tools_filesystem.py | 545 | # Check if custom component is available | COMMENT |
| LOW | src/ha_mcp/tools/tools_filesystem.py | 688 | # Check if custom component is available | COMMENT |
| LOW | src/ha_mcp/tools/tools_filesystem.py | 955 | # Check if custom component is available | COMMENT |
| LOW | src/ha_mcp/tools/tools_updates.py | 389 | # Check if rate limited | COMMENT |
| LOW | src/ha_mcp/tools/tools_updates.py | 451 | # Check if rate limited | COMMENT |
| LOW | src/ha_mcp/tools/tools_config_dashboards.py | 2544 | # Check if request failed (after potential retry) | COMMENT |
| LOW | src/ha_mcp/tools/tools_hacs.py | 394 | # Check if HACS is available | COMMENT |
| LOW | src/ha_mcp/tools/tools_hacs.py | 458 | # Check if HACS is available | COMMENT |
| LOW | src/ha_mcp/tools/tools_hacs.py | 551 | # Check if HACS is available | COMMENT |
| LOW | src/ha_mcp/tools/tools_hacs.py | 846 | # Check if HACS is available | COMMENT |
| LOW | src/ha_mcp/tools/tools_utility.py | 183 | {{ is_state('light.living_room', 'on') }} # Check if entity has specific state | STRING |
| LOW | src/ha_mcp/tools/tools_service.py | 1103 | # Check if this is a timeout - for service calls, timeouts typically | COMMENT |
| LOW | src/ha_mcp/_vendor/websockets/trio/connection.py | 1023 | # Check if the connection is expected to close soon. | COMMENT |
| LOW | src/ha_mcp/_vendor/websockets/sync/connection.py | 978 | # Check if the connection is expected to close soon. | COMMENT |
| LOW | src/ha_mcp/_vendor/websockets/asyncio/connection.py | 902 | # Check if the connection is expected to close soon. | COMMENT |
| LOW | src/ha_mcp/auth/provider.py | 660 | # Check if authorization request is expired (5 minutes) | COMMENT |
| LOW | src/ha_mcp/utils/operation_manager.py | 133 | # Check if operation has timed out | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pyproject.toml | 166 | "ASYNC", # async best practices | CODE |
| MEDIUM | pyproject.toml | 168 | "LOG", # logging best practices | CODE |
| MEDIUM | pyproject.toml | 275 | # runtime harness, the image bake, wait_helpers) to talk to Home | COMMENT |
| MEDIUM | tests/haos_image_build/build_image.py | 202 | # The secret_path option must be set deterministically so the test harness | COMMENT |
| MEDIUM | tests/src/haos_runtime.py | 1918 | # The e2e harness logs at INFO, so a DEBUG-only cause would leave a | COMMENT |
| MEDIUM | tests/src/unit/_js_harness.py | 28 | # Path to the harness — repo-relative, resolved once at import time. | COMMENT |
| MEDIUM | tests/src/unit/_js_harness.py | 193 | # degrade to U+FFFD and surface in the harness's own error reporting. | COMMENT |
| MEDIUM | tests/src/unit/test_oauth_autoapprove.py | 227 | # this HTTP-level harness and must not leak into the rest of the unit suite. | COMMENT |
| MEDIUM⚡ | tests/src/unit/test_server_prefs_seed.py | 71 | # the harness result, but we can infer correctness by re-running the | STRING |
| MEDIUM | tests/src/unit/test_tools_utility_supervisor_logs.py | 251 | # module attribute) is robust to either `import httpx` or a future | COMMENT |
| MEDIUM | tests/src/unit/test_locale_parity.py | 2436 | # The harness puts `scripts/` on PYTHONPATH, and the child would inherit | COMMENT |
| MEDIUM | tests/src/unit/test_astro_setup_js_behavior.py | 796 | # placeholder in this harness), so this doesn't assert its contents. | STRING |
| MEDIUM⚡ | tests/src/unit/test_build_skill_content.py | 115 | assert result == {"SKILL.md": "# best practices\n"} | CODE |
| MEDIUM | tests/src/unit/test_build_skill_content.py | 49 | (skill / "SKILL.md").write_text("# best practices\n") | CODE |
| MEDIUM | tests/src/unit/test_settings_ui_js_behavior.py | 965 | // assertion below — querying via JS is more robust than | COMMENT |
| MEDIUM | tests/src/unit/test_settings_ui_js_behavior.py | 996 | # flipped one. The harness's `responses: [...]` shape advances | STRING |
| MEDIUM | tests/src/unit/test_settings_ui_js_behavior.py | 4262 | # The harness serialises window globals into result.dom — pick | STRING |
| MEDIUM⚡ | tests/src/unit/test_helper_schema_inline.py | 509 | """The high-leverage simple-helper validation gates inside | STRING |
| MEDIUM | tests/src/e2e/tools/test_radio_management.py | 68 | # robust to exactly where they land. | COMMENT |
| MEDIUM | tests/src/e2e/tools/test_search_entities.py | 1788 | # penalty → 80. Asserting ``< 100`` keeps the test robust to small | COMMENT |
| MEDIUM | tests/src/e2e/tools/test_deep_search_many_configs.py | 120 | # failing setup — keeps the fixture robust if the WS path drops | COMMENT |
| MEDIUM | …/e2e/workflows/auto_backup/test_capture_and_restore.py | 515 | # ``replace`` ops on a path ending in ``/alias`` to stay robust | COMMENT |
| MEDIUM | tests/src/e2e/workflows/filesystem/test_yaml_config.py | 1544 | # robust whether the read fails because the file is missing or | COMMENT |
| MEDIUM | …/workflows/integrations/test_integration_management.py | 397 | # integration in the harness that implements async_step_reconfigure, and it | COMMENT |
| MEDIUM | …/workflows/integrations/test_integration_management.py | 555 | # only observable because the harness installs ha_mcp_tools | COMMENT |
| MEDIUM | tests/src/e2e/workflows/system/test_system_tools.py | 783 | # Log comprehensive overview | COMMENT |
| MEDIUM | tests/src/e2e/workflows/automation/test_lifecycle.py | 185 | # Extract automation entity ID with robust error handling | COMMENT |
| MEDIUM | custom_components/ha_mcp_tools/websocket_api.py | 5844 | # the unit-test harness MagicMock-stubs ``homeassistant.core``, so the decorator | COMMENT |
| MEDIUM⚡ | custom_components/ha_mcp_tools/ui_panel.py | 519 | # harness for every surface); coverage = the node --check syntax test plus the | COMMENT |
| MEDIUM | scripts/bake_pagination_seed.py | 38 | HOST_PORT = 32788 # off the dev-harness 32769 to avoid clashes | CODE |
| MEDIUM | src/ha_mcp/settings_ui/__init__.py | 107 | # esbuild/jsdom JS harness (tests/js/harness.mjs) -- `const DEFAULT_PINNED = | COMMENT |
| MEDIUM | src/ha_mcp/tools/tools_bug_report.py | 620 | # Broad by design — the bug-report path must stay robust whatever the | COMMENT |
| MEDIUM | src/ha_mcp/_vendor/websockets/frames.py | 194 | # and robust. Also support frames fragmented within UTF-8 sequences. | COMMENT |
| MEDIUM | src/ha_mcp/utils/fuzzy_search.py | 465 | """Calculate a comprehensive fuzzy score for an entity name/domain. | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/src/unit/test_oauth.py | 758 | # Step 5: Verify access token contains only ha_token (no ha_url - SSRF fix) | COMMENT |
| LOW⚡ | tests/src/unit/test_oauth.py | 764 | # Step 6: Use stateless refresh token to get new access token | COMMENT |
| LOW⚡ | tests/src/unit/test_oauth.py | 778 | # Step 7: Verify refreshed access token is valid and carries HA credentials | COMMENT |
| LOW⚡ | tests/src/unit/test_oauth.py | 785 | # Step 8: Verify chained refresh also works | COMMENT |
| LOW | tests/src/unit/test_oauth.py | 688 | # Step 1: Client registration | COMMENT |
| LOW | tests/src/unit/test_oauth.py | 702 | # Step 2: Authorization request | COMMENT |
| LOW | tests/src/unit/test_oauth.py | 722 | # Step 3: Simulate consent form submission | COMMENT |
| LOW | tests/src/unit/test_oauth.py | 746 | # Step 4: Exchange auth code for tokens | COMMENT |
| LOW⚡ | tests/src/unit/test_flow_multistep.py | 563 | # Step 1: the user step | COMMENT |
| LOW⚡ | tests/src/unit/test_flow_multistep.py | 571 | # Step 2: the state_characteristic step — MUST receive its key, | COMMENT |
| LOW⚡ | tests/src/e2e/tools/test_create_custom_tool.py | 1053 | # Step 1: save a tool we'll then delete. | COMMENT |
| LOW | tests/src/e2e/tools/test_create_custom_tool.py | 1065 | # Step 2: delete it from inside the sandbox. | COMMENT |
| LOW | tests/src/e2e/tools/test_create_custom_tool.py | 1086 | # Step 3: confirm running it now fails (entry is gone). | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 554 | # Step 1: List automation blueprints | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 564 | # Step 2: List script blueprints | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 574 | # Step 3: If blueprints exist, explore one | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 640 | # Step 1: List available blueprints | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 655 | # Step 2: Get blueprint details to understand required inputs | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 664 | # Step 3: Create automation from blueprint (no trigger/action fields) | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 712 | # Step 4: Wait for automation to be registered, then verify no trigger/action fields | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/blueprints/test_blueprints.py | 720 | # Step 5: Clean up | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/system/test_system_tools.py | 716 | # Step 1: Check configuration (folded into ha_get_system_health) | COMMENT |
| LOW | tests/src/e2e/workflows/system/test_system_tools.py | 728 | # Step 2: Reload automations | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/scripts/test_lifecycle.py | 1183 | # Step 2: Get blueprint details to understand required inputs | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/scripts/test_lifecycle.py | 1192 | # Step 3: Create script from blueprint (no sequence field) | COMMENT |
| LOW | tests/src/e2e/workflows/scripts/test_lifecycle.py | 1238 | # Step 4: Wait for script to be registered, then verify no sequence field | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/services/test_list_services.py | 373 | # Step 1: Discover light services (use full detail to see fields) | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/services/test_list_services.py | 383 | # Step 2: Find a light entity to test with | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/services/test_list_services.py | 400 | # Step 3: Use discovered service to control light | COMMENT |
| LOW⚡ | tests/src/e2e/workflows/services/test_list_services.py | 410 | # Step 4: Call discovered service | COMMENT |
| LOW | scripts/install.sh | 89 | # Step 1: Check/install uv | COMMENT |
| LOW | scripts/install.sh | 200 | # Step 3: Pre-download dependencies | COMMENT |
| LOW⚡ | scripts/install.sh | 239 | # Step 2: Configure Claude Desktop | COMMENT |
| LOW | scripts/install.sh | 372 | # Step 3: Pre-download dependencies | COMMENT |
| LOW⚡ | src/ha_mcp/tools/tools_integrations.py | 2485 | # Step 1: resolve target → entry_id (typed reason on failure) | COMMENT |
| LOW⚡ | src/ha_mcp/tools/tools_integrations.py | 2492 | # Step 2: collect sub-entity IDs for the wait phase | COMMENT |
| LOW⚡ | src/ha_mcp/tools/tools_integrations.py | 2498 | # Step 3: delete the config entry | COMMENT |
| LOW⚡ | src/ha_mcp/tools/tools_integrations.py | 2508 | # Step 4: wait for all sub-entities to be removed in parallel | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/src/unit/test_settings_ui_js_behavior.py | 122 | # Full modal scaffold (mirrors settings.html) so the focus-trap | COMMENT |
| MEDIUM | tests/src/unit/test_e2e_wait_helpers.py | 3 | The test-side migration in #1382 added a WS-event-driven path to three | STRING |
| MEDIUM⚡ | tests/src/unit/test_tools_bug_report.py | 2007 | # what biases agents and invites hallucinations). | COMMENT |
| MEDIUM⚡ | tests/src/unit/test_tools_bug_report.py | 2015 | # hallucination bait we removed. | COMMENT |
| MEDIUM | tests/src/unit/test_tools_bug_report.py | 1838 | # hallucination-bait we removed. | COMMENT |
| MEDIUM | tests/src/e2e/haos_only/test_integration_setup.py | 59 | # substantial new test scaffolding; for now the integration-setup | COMMENT |
| MEDIUM | tests/src/e2e/workflows/config/test_ws_event_waiter.py | 2 | E2E regression coverage for #1152 — WS-event-driven entity-registration wait. | STRING |
| MEDIUM | tests/src/e2e/workflows/config/test_ws_event_waiter.py | 46 | """Regression coverage for the #1152 WS-event-driven waiter.""" | STRING |
| MEDIUM | tests/src/e2e/utilities/wait_helpers.py | 285 | # event-driven re-samples against the right baseline. | COMMENT |
| MEDIUM | tests/src/e2e/utilities/wait_helpers.py | 440 | PR #1382 for the broader event-driven-wait migration. | STRING |
| MEDIUM | tests/src/e2e/utilities/wait_helpers.py | 1047 | # the sample-after-subscribe pattern the other event-driven waiters | COMMENT |
| MEDIUM | src/ha_mcp/config.py | 992 | # Bounds added purely as UI/POST guardrails (no Field constraint): | COMMENT |
| MEDIUM | src/ha_mcp/tools/log_sources.py | 231 | # the LLM context window during debugging workflows. | COMMENT |
| MEDIUM | src/ha_mcp/tools/util_helpers.py | 820 | # --- WS-event-driven wait helpers (#1152) ----------------------------------- | COMMENT |
| MEDIUM | src/ha_mcp/tools/util_helpers.py | 831 | # The new pattern is WS-event-driven with a REST sample after subscribe and a | COMMENT |
| MEDIUM | src/ha_mcp/tools/tools_code.py | 65 | # scaffolding rather than per-user data, that ``run_saved`` executes with the | COMMENT |
| MEDIUM | src/ha_mcp/tools/hacs_registration.py | 158 | # dominant cost in the HAOS E2E suite per #1515); 10 s still leaves event-driven | COMMENT |
| MEDIUM | src/ha_mcp/tools/hacs_registration.py | 253 | # we subscribed successfully but the event-driven path | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/uat/stories/run_story.py | 400 | CODE | |
| LOW | tests/src/unit/test_config_get_component_routing.py | 88 | CODE | |
| LOW | tests/src/unit/_js_harness.py | 132 | CODE | |
| LOW | tests/src/unit/test_component_ws_search.py | 189 | CODE | |
| LOW | tests/src/unit/test_component_ws_search.py | 285 | CODE | |
| LOW | tests/src/unit/test_component_ws_search.py | 431 | CODE | |
| LOW | tests/src/unit/test_component_ws_search.py | 557 | CODE | |
| LOW | tests/src/unit/test_component_ws_search.py | 652 | CODE | |
| LOW | src/ha_mcp/tools/tools_config_helpers.py | 4392 | CODE | |
| LOW | src/ha_mcp/tools/tools_energy.py | 380 | CODE | |
| LOW | src/ha_mcp/tools/log_sources.py | 181 | CODE | |
| LOW | src/ha_mcp/tools/tools_history.py | 137 | CODE | |
| LOW | src/ha_mcp/tools/backup.py | 1684 | CODE | |
| LOW | src/ha_mcp/tools/tools_search.py | 2030 | CODE | |
| LOW | src/ha_mcp/tools/tools_search.py | 2755 | CODE | |
| LOW | src/ha_mcp/tools/tools_search.py | 3894 | CODE | |
| LOW | src/ha_mcp/tools/tools_search.py | 4471 | CODE | |
| LOW | src/ha_mcp/tools/tools_traces.py | 48 | CODE | |
| LOW | src/ha_mcp/tools/tools_dev.py | 825 | CODE | |
| LOW | src/ha_mcp/tools/tools_logs.py | 165 | CODE | |
| LOW | src/ha_mcp/tools/tools_registry.py | 860 | CODE | |
| LOW | src/ha_mcp/tools/tools_config_automations.py | 524 | CODE | |
| LOW | src/ha_mcp/tools/tools_system.py | 583 | CODE | |
| LOW | src/ha_mcp/tools/tools_dashboard_screenshot.py | 118 | CODE | |
| LOW | src/ha_mcp/tools/tools_assist_pipeline.py | 540 | CODE | |
| LOW | src/ha_mcp/tools/tools_config_dashboards.py | 1769 | CODE | |
| LOW | src/ha_mcp/tools/tools_config_dashboards.py | 2740 | CODE | |
| LOW | src/ha_mcp/tools/tools_integrations.py | 468 | CODE | |
| LOW | src/ha_mcp/tools/tools_integrations.py | 1805 | CODE | |
| LOW | src/ha_mcp/tools/tools_addons.py | 1637 | CODE | |
| LOW | src/ha_mcp/tools/tools_addons.py | 2266 | CODE | |
| LOW | src/ha_mcp/tools/tools_addons.py | 3532 | CODE | |
| LOW | src/ha_mcp/tools/tools_entities.py | 1533 | CODE | |
| LOW | src/ha_mcp/tools/tools_service.py | 1638 | CODE | |
| LOW | src/ha_mcp/tools/tools_service.py | 1970 | CODE | |
| LOW | src/ha_mcp/tools/smart_search/_deep.py | 122 | CODE | |
| LOW | src/ha_mcp/tools/smart_search/_deep.py | 1244 | CODE | |
| LOW | src/ha_mcp/tools/smart_search/_deep.py | 1352 | CODE | |
| LOW | src/ha_mcp/tools/smart_search/_overview.py | 20 | CODE | |
| LOW | src/ha_mcp/tools/smart_search/_entities.py | 58 | CODE | |
| LOW | src/ha_mcp/_vendor/websockets/trio/server.py | 361 | CODE | |
| LOW | src/ha_mcp/_vendor/websockets/trio/client.py | 236 | CODE | |
| LOW | src/ha_mcp/_vendor/websockets/legacy/server.py | 90 | CODE | |
| LOW | src/ha_mcp/_vendor/websockets/legacy/server.py | 970 | CODE | |
| LOW | src/ha_mcp/_vendor/websockets/legacy/protocol.py | 156 | CODE | |
| LOW | src/ha_mcp/_vendor/websockets/legacy/client.py | 418 | CODE | |
| LOW | src/ha_mcp/_vendor/websockets/sync/server.py | 467 | CODE | |
| LOW | src/ha_mcp/_vendor/websockets/sync/client.py | 131 | CODE | |
| LOW | src/ha_mcp/_vendor/websockets/asyncio/server.py | 478 | CODE | |
| LOW | src/ha_mcp/_vendor/websockets/asyncio/client.py | 302 | CODE | |
| LOW | src/ha_mcp/dashboard_screenshot/capture.py | 832 | CODE | |
| LOW | src/ha_mcp/transforms/categorized_search.py | 314 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | tests/src/unit/test_webhook_proxy_liveness.py | 100 | assert oauth.web.json_response.call_args.kwargs.get("status") in (None, 200) | CODE |
| CRITICAL | tests/src/unit/test_session_disconnect_log_filter.py | 32 | exception -- reproducing the actual shape mcp.server.lowlevel.server.Server.run() | STRING |
| CRITICAL | src/ha_mcp/log_filters.py | 95 | ``mcp.server.lowlevel.server.Server.run()`` dispatches each incoming | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/src/unit/test_config.py | 457 | monkeypatch.setenv("SUPERVISOR_TOKEN", "fake-token-for-test") | CODE |
| LOW | tests/src/unit/test_config.py | 494 | monkeypatch.setenv("SUPERVISOR_TOKEN", "fake-token-for-test") | CODE |
| LOW⚡ | tests/src/e2e/policy/test_redact_secrets.py | 119 | assert "placeholder" in error.get("message", ""), body | CODE |
| LOW | src/ha_mcp/settings_ui/settings.js | 109 | for (const attribute of ['placeholder', 'title', 'aria-label']) { | CODE |
| LOW | src/ha_mcp/tools/tools_bug_report.py | 1689 | - Email addresses -> Replace with "user@example.com" | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docker-compose.screenshot.yml | 57 | # Usage: | COMMENT |
| LOW | docker-compose.yml | 45 | # Usage: | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/src/unit/test_python_sandbox.py | 330 | expr = "def helper():\n return 1" | CODE |