Give your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.
This report presents the forensic synthetic code analysis of Panniantong/Agent-Reach, a Python project with 56,060 GitHub stars. SynthScan v2.0 examined 12,502 lines of code across 83 source files, recording 321 pattern matches distributed across 12 syntactic categories. The overall adjusted score of 26.6 places this repository in the Moderate 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 321 distinct pattern matches across 12 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 | tests/test_xiaoyuzhou_install.py | 13 | def test_install_xiaoyuzhou_deps_does_not_raise_when_no_groq_key(capsys): | CODE |
| LOW | tests/test_probe.py | 26 | def test_broken_shebang_detected_as_broken(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_probe.py | 40 | def test_healthy_command_returns_ok_with_output(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_probe.py | 52 | def test_nonzero_exit_classified_as_error(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_probe.py | 74 | def test_retries_help_transient_failures(tmp_path, monkeypatch): | CODE |
| LOW | tests/test_probe.py | 87 | def test_reinstall_hint_mentions_both_installers(): | CODE |
| LOW | tests/test_xhs_format.py | 58 | def test_single_note_keeps_useful_fields(self): | CODE |
| LOW | tests/test_xhs_format.py | 73 | def test_single_note_drops_useless_fields(self): | CODE |
| LOW | tests/test_xhs_format.py | 84 | def test_search_results_wrapper(self): | CODE |
| LOW | tests/test_xhs_format.py | 127 | def test_non_dict_passthrough(self): | CODE |
| LOW | tests/test_youtube_channel.py | 28 | def test_can_handle_matches_youtube_hosts(): | CODE |
| LOW⚡ | tests/test_youtube_channel.py | 43 | def test_has_js_runtime_config_missing_file_is_false(tmp_path): | CODE |
| LOW⚡ | tests/test_youtube_channel.py | 47 | def test_has_js_runtime_config_true_when_flag_present(tmp_path): | CODE |
| LOW⚡ | tests/test_youtube_channel.py | 53 | def test_has_js_runtime_config_false_when_flag_absent(tmp_path): | CODE |
| LOW⚡ | tests/test_youtube_channel.py | 59 | def test_has_js_runtime_config_swallows_oserror(): | CODE |
| LOW⚡ | tests/test_youtube_channel.py | 68 | def test_check_off_when_ytdlp_missing(): | CODE |
| LOW⚡ | tests/test_youtube_channel.py | 76 | def test_check_error_when_ytdlp_broken(): | CODE |
| LOW⚡ | tests/test_youtube_channel.py | 85 | def test_check_error_when_ytdlp_unrunnable(): | CODE |
| LOW⚡ | tests/test_youtube_channel.py | 95 | def test_check_warn_when_no_js_runtime_but_backend_active(): | CODE |
| LOW⚡ | tests/test_youtube_channel.py | 105 | def test_check_warn_when_node_only_and_config_missing_flag(): | CODE |
| LOW | tests/test_youtube_channel.py | 127 | def test_check_ok_reports_transcription_when_provider_and_ffmpeg_present(): | CODE |
| LOW | tests/test_youtube_channel.py | 139 | def test_check_ok_flags_missing_ffmpeg_for_transcription(): | CODE |
| LOW | tests/test_skill_command.py | 16 | def test_skill_resources_include_both_locales(self): | CODE |
| LOW | tests/test_skill_command.py | 26 | def test_install_skill_creates_skill_md(self): | CODE |
| LOW | tests/test_skill_command.py | 52 | def test_uninstall_skill_removes_dir(self): | CODE |
| LOW | tests/test_skill_command.py | 74 | def test_install_creates_dir_if_parent_exists(self): | CODE |
| LOW | tests/test_skill_command.py | 96 | def test_install_uses_english_skill_for_english_locale(self): | CODE |
| LOW | tests/test_doctor.py | 31 | def test_check_all_collects_channel_results(self, tmp_config, monkeypatch): | CODE |
| LOW | tests/test_doctor.py | 109 | def test_stale_active_backend_does_not_leak_into_errored_result(monkeypatch): | CODE |
| LOW | tests/test_transcribe.py | 46 | def test_routes_to_groq_endpoint(self, monkeypatch, fake_config, chunk_file): | CODE |
| LOW | tests/test_transcribe.py | 63 | def test_routes_to_openai_endpoint(self, monkeypatch, fake_config, chunk_file): | CODE |
| LOW | tests/test_transcribe.py | 78 | def test_raises_when_key_missing(self, fake_config, chunk_file): | CODE |
| LOW | tests/test_transcribe.py | 82 | def test_raises_on_http_error(self, monkeypatch, fake_config, chunk_file): | CODE |
| LOW | tests/test_transcribe.py | 101 | def test_groq_succeeds_no_openai_call(self, monkeypatch, fake_config, chunk_file): | CODE |
| LOW | tests/test_transcribe.py | 134 | def test_skip_unconfigured_provider(self, monkeypatch, fake_config, chunk_file): | CODE |
| LOW | tests/test_transcribe.py | 148 | def test_all_fail_raises_with_last_error(self, monkeypatch, fake_config, chunk_file): | CODE |
| LOW | tests/test_transcribe.py | 164 | def test_local_file_skips_yt_dlp(self, monkeypatch, fake_config, tmp_path, chunk_file): | CODE |
| LOW | tests/test_transcribe.py | 192 | def test_chunks_concatenated_with_newlines( | CODE |
| LOW⚡ | tests/test_transcribe.py | 220 | def test_no_provider_configured_fails_fast(self, fake_config, chunk_file): | CODE |
| LOW⚡ | tests/test_transcribe.py | 224 | def test_invalid_provider_string(self, fake_config, chunk_file): | CODE |
| LOW⚡ | tests/test_transcribe.py | 228 | def test_auto_temp_dir_is_cleaned_up(self, monkeypatch, fake_config, tmp_path): | CODE |
| LOW | tests/test_transcribe.py | 272 | def test_explicit_out_dir_is_preserved(self, monkeypatch, fake_config, tmp_path): | CODE |
| LOW | tests/test_transcribe.py | 301 | def test_rejects_private_network_url_before_yt_dlp(self, monkeypatch, tmp_path): | CODE |
| LOW | tests/test_transcribe.py | 312 | def test_passes_public_url_after_end_of_options_marker(self, monkeypatch, tmp_path): | CODE |
| LOW | tests/test_transcribe.py | 329 | def test_preserves_bare_public_urls_supported_by_yt_dlp(self, monkeypatch, tmp_path): | CODE |
| LOW | tests/test_transcribe.py | 343 | def test_does_not_dns_resolve_public_hostnames(self, monkeypatch, tmp_path): | CODE |
| LOW | tests/test_transcribe.py | 371 | def test_delegates_to_transcribe(self, monkeypatch, fake_config): | CODE |
| LOW | tests/test_transcribe.py | 396 | def test_openai_whisper_feature_registered(self, fake_config): | CODE |
| LOW | tests/test_opencli_backend.py | 35 | def test_broken_node_env_gives_npm_hint(): | CODE |
| LOW | tests/test_opencli_backend.py | 42 | def test_daemon_running_extension_connected_is_ready(): | CODE |
| LOW | tests/test_opencli_backend.py | 53 | def test_extension_never_installed_not_ready_with_store_guide(): | CODE |
| LOW | tests/test_opencli_backend.py | 65 | def test_sleeping_extension_counts_as_ready(): | CODE |
| LOW | tests/test_opencli_backend.py | 81 | def test_daemon_not_running_parsed_correctly(): | CODE |
| LOW | tests/test_opencli_backend.py | 92 | def test_probe_uses_daemon_status_not_doctor(): | CODE |
| LOW⚡ | tests/test_channels.py | 39 | def test_facebook_can_handle_common_urls(self): | CODE |
| LOW⚡ | tests/test_channels.py | 47 | def test_instagram_can_handle_common_urls(self): | CODE |
| LOW⚡ | tests/test_channels.py | 54 | def test_opencli_ready_reports_ok(self, monkeypatch): | CODE |
| LOW⚡ | tests/test_channels.py | 190 | def test_get_hot_topics_respects_limit(self, monkeypatch): | CODE |
| LOW⚡ | tests/test_channels.py | 208 | def test_get_hot_topics_truncates_content(self, monkeypatch): | CODE |
| LOW⚡ | tests/test_channels.py | 386 | def test_search_returns_unavailable_notice(self): | CODE |
| 108 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | agent_reach/cli.py | 520 | print("Error: no input on stdin", file=sys.stderr) | CODE |
| MEDIUM | agent_reach/cli.py | 525 | print(f"Error: invalid JSON: {e}", file=sys.stderr) | CODE |
| LOW⚡ | agent_reach/cli.py | 1537 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 37 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 306 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 401 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 423 | except Exception as e: | CODE |
| LOW | agent_reach/cli.py | 495 | except Exception as e: | CODE |
| LOW | agent_reach/cli.py | 572 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 582 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 608 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 618 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 632 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 651 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 682 | except Exception as e: | CODE |
| LOW | agent_reach/cli.py | 720 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 786 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 837 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 860 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 939 | except Exception as e: | CODE |
| LOW | agent_reach/cli.py | 956 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 1004 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 1013 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 1106 | except Exception as e: | CODE |
| LOW | agent_reach/cli.py | 1304 | except Exception as e: | CODE |
| LOW | agent_reach/cli.py | 1317 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 1347 | except Exception as e: | CODE |
| LOW | agent_reach/cli.py | 1350 | except Exception as e: | CODE |
| LOW | agent_reach/cli.py | 1369 | except Exception as e: | CODE |
| LOW | agent_reach/cli.py | 1405 | except Exception as e: | CODE |
| LOW | agent_reach/cli.py | 1432 | except Exception as e: | CODE |
| LOW | agent_reach/cli.py | 1452 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 1638 | except Exception: | CODE |
| LOW | agent_reach/cli.py | 1667 | except Exception: | CODE |
| LOW | agent_reach/doctor.py | 23 | except Exception as e: # noqa: BLE001 — doctor must survive any channel | CODE |
| LOW | agent_reach/cookie_extract.py | 93 | except Exception as e: | CODE |
| LOW | agent_reach/cookie_extract.py | 108 | except Exception as e: | CODE |
| LOW | agent_reach/cookie_extract.py | 198 | except Exception: | CODE |
| LOW | agent_reach/cookie_extract.py | 223 | except Exception: | CODE |
| LOW | agent_reach/cookie_extract.py | 242 | except Exception as e: | CODE |
| LOW | agent_reach/integrations/mcp_server.py | 54 | except Exception as e: | CODE |
| LOW | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 221 | except Exception as e: | CODE |
| MEDIUM | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 215 | def polish(text, depth=0): | CODE |
| LOW | agent_reach/channels/rss.py | 22 | except Exception as e: | CODE |
| MEDIUM | agent_reach/channels/rss.py | 16 | def check(self, config=None): | CODE |
| LOW | agent_reach/channels/xiaoyuzhou.py | 53 | except Exception: | CODE |
| LOW | agent_reach/channels/xueqiu.py | 70 | except Exception: | CODE |
| LOW | agent_reach/channels/xueqiu.py | 101 | except Exception: | CODE |
| LOW | agent_reach/channels/xueqiu.py | 178 | except Exception as e: | CODE |
| LOW | agent_reach/channels/bilibili.py | 31 | except Exception: | CODE |
| LOW | agent_reach/channels/xiaohongshu.py | 36 | except Exception: | CODE |
| LOW | agent_reach/channels/v2ex.py | 46 | except Exception as e: | CODE |
| LOW | agent_reach/channels/v2ex.py | 140 | except Exception: | CODE |
| MEDIUM | agent_reach/channels/v2ex.py | 39 | def check(self, config=None): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/install.md | 49 | ### Step 1: Install the basics | COMMENT |
| LOW | docs/install.md | 91 | ### Step 2: Ask the user which optional channels they want | COMMENT |
| LOW | docs/install.md | 122 | ### Step 3: Fix what's broken | COMMENT |
| LOW | docs/install.md | 130 | ### Step 3: Configure things that need user input | COMMENT |
| LOW | docs/install.md | 305 | ### Step 4: Final check | COMMENT |
| LOW | docs/install.md | 309 | ### Step 5: Set up daily monitoring (OpenClaw only) | COMMENT |
| LOW | docs/update.md | 29 | ### Step 1: Check current version | COMMENT |
| LOW | docs/update.md | 37 | ### Step 2: Update Agent Reach package | COMMENT |
| LOW | docs/update.md | 48 | ### Step 3: Refresh upstream tools | COMMENT |
| LOW | docs/update.md | 78 | ### Step 4: Coexistence (DO NOT uninstall old tools) | COMMENT |
| LOW | docs/update.md | 85 | ### Step 5: Verify | COMMENT |
| LOW | docs/update.md | 106 | ### Step 6: Report to user | COMMENT |
| LOW⚡ | agent_reach/cli.py | 1542 | # Step 2: GitHub token | COMMENT |
| LOW⚡ | agent_reach/cli.py | 1558 | # Step 3: Reddit — rdt-cli | COMMENT |
| LOW⚡ | agent_reach/cli.py | 1564 | # Step 4: Groq (Whisper) | COMMENT |
| LOW | agent_reach/cli.py | 1505 | # Step 1: Exa (via mcporter, no API key required) | COMMENT |
| LOW | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 53 | # Step 1: 提取音频 URL 和标题 | COMMENT |
| LOW⚡ | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 67 | # Step 2: 下载音频 | COMMENT |
| LOW⚡ | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 74 | # Step 3: 获取时长 | COMMENT |
| LOW⚡ | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 80 | # Step 4: 转为低码率单声道 MP3 | COMMENT |
| LOW⚡ | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 86 | # Step 5: 按大小切片 | COMMENT |
| LOW | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 108 | # Step 6: 调用 Groq Whisper API 转录 | COMMENT |
| LOW | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 238 | # Step 7: 合并输出 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | agent_reach/cli.py | 1542 | # Step 2: GitHub token | COMMENT |
| LOW⚡ | agent_reach/cli.py | 1558 | # Step 3: Reddit — rdt-cli | COMMENT |
| LOW⚡ | agent_reach/cli.py | 1564 | # Step 4: Groq (Whisper) | COMMENT |
| LOW | agent_reach/cli.py | 1505 | # Step 1: Exa (via mcporter, no API key required) | COMMENT |
| LOW | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 53 | # Step 1: 提取音频 URL 和标题 | COMMENT |
| LOW⚡ | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 67 | # Step 2: 下载音频 | COMMENT |
| LOW⚡ | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 74 | # Step 3: 获取时长 | COMMENT |
| LOW⚡ | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 80 | # Step 4: 转为低码率单声道 MP3 | COMMENT |
| LOW⚡ | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 86 | # Step 5: 按大小切片 | COMMENT |
| LOW | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 108 | # Step 6: 调用 Groq Whisper API 转录 | COMMENT |
| LOW | agent_reach/scripts/transcribe_xiaoyuzhou.sh | 238 | # Step 7: 合并输出 | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_skill_command.py | 26 | CODE | |
| LOW | agent_reach/cli.py | 50 | CODE | |
| LOW | agent_reach/cli.py | 171 | CODE | |
| LOW | agent_reach/cli.py | 355 | CODE | |
| LOW | agent_reach/cli.py | 466 | CODE | |
| LOW | agent_reach/cli.py | 532 | CODE | |
| LOW | agent_reach/cli.py | 702 | CODE | |
| LOW | agent_reach/cli.py | 817 | CODE | |
| LOW | agent_reach/cli.py | 842 | CODE | |
| LOW | agent_reach/cli.py | 977 | CODE | |
| LOW | agent_reach/cli.py | 1019 | CODE | |
| LOW | agent_reach/cli.py | 1154 | CODE | |
| LOW | agent_reach/cli.py | 1175 | CODE | |
| LOW | agent_reach/cli.py | 1375 | CODE | |
| LOW | agent_reach/cli.py | 1496 | CODE | |
| LOW | agent_reach/cli.py | 1645 | CODE | |
| LOW | agent_reach/cli.py | 1706 | CODE | |
| LOW | agent_reach/cli.py | 383 | CODE | |
| LOW | agent_reach/doctor.py | 47 | CODE | |
| LOW | agent_reach/cookie_extract.py | 42 | CODE | |
| LOW | agent_reach/cookie_extract.py | 176 | CODE | |
| LOW | agent_reach/channels/xueqiu.py | 74 | CODE | |
| LOW | agent_reach/channels/twitter.py | 19 | CODE | |
| LOW | agent_reach/channels/bilibili.py | 46 | CODE | |
| LOW | agent_reach/channels/xiaohongshu.py | 62 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_channels.py | 193 | fake_data = [ | CODE |
| LOW⚡ | tests/test_channels.py | 202 | def read(self): return json.dumps(fake_data).encode() | CODE |
| LOW⚡ | tests/test_channels.py | 212 | fake_data = [ | CODE |
| LOW⚡ | tests/test_channels.py | 220 | def read(self): return json.dumps(fake_data).encode() | CODE |
| LOW | tests/test_channels.py | 147 | fake_data = [ | CODE |
| LOW | tests/test_channels.py | 178 | return json.dumps(fake_data).encode() | CODE |
| LOW | tests/test_channels.py | 233 | fake_data = [ | CODE |
| LOW | tests/test_channels.py | 248 | def read(self): return json.dumps(fake_data).encode() | CODE |
| LOW | tests/test_channels.py | 353 | fake_user = { | CODE |
| LOW | tests/test_channels.py | 371 | def read(self): return json.dumps(fake_user).encode() | CODE |
| LOW | tests/test_channels.py | 452 | fake_data = { | CODE |
| LOW | tests/test_channels.py | 486 | return json.dumps(fake_data).encode() | CODE |
| LOW | tests/test_channels.py | 505 | fake_data = { | CODE |
| LOW | tests/test_channels.py | 520 | return json.dumps(fake_data).encode() | CODE |
| LOW | tests/test_channels.py | 550 | fake_data = { | CODE |
| LOW | tests/test_channels.py | 565 | return json.dumps(fake_data).encode() | CODE |
| LOW | tests/test_channels.py | 582 | fake_data = { | CODE |
| LOW | tests/test_channels.py | 607 | return json.dumps(fake_data).encode() | CODE |
| LOW | tests/test_channels.py | 622 | fake_data = { | CODE |
| LOW | tests/test_channels.py | 640 | return json.dumps(fake_data).encode() | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_probe.py | 10 | CODE | |
| LOW | agent_reach/__init__.py | 7 | CODE | |
| LOW | agent_reach/transcribe.py | 14 | CODE | |
| LOW | agent_reach/doctor.py | 110 | CODE | |
| LOW | agent_reach/backends/__init__.py | 10 | CODE | |
| LOW | agent_reach/backends/__init__.py | 10 | CODE | |
| LOW | agent_reach/backends/__init__.py | 10 | CODE | |
| LOW | agent_reach/backends/__init__.py | 10 | CODE | |
| LOW | agent_reach/backends/__init__.py | 10 | CODE | |
| LOW | agent_reach/utils/paths.py | 3 | CODE | |
| LOW | agent_reach/utils/text.py | 3 | CODE | |
| LOW | agent_reach/utils/process.py | 3 | CODE | |
| LOW | agent_reach/channels/rss.py | 18 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | agent_reach/channels/reddit.py | 163 | '"modhash": null, "saved_at": 0, "last_verified_at": null}\n\n' | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_skill_command.py | 55 | # Create a fake skill installation | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | agent_reach/cli.py | 168 | # ── Command handlers ──────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | agent_reach/cli.py | 1292 | # Check if xiaohongshu-mcp container is running | COMMENT |
| LOW | agent_reach/cookie_extract.py | 121 | # Check if cookie belongs to this platform | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | agent_reach/__init__.py | 9 | __all__ = ["AgentReach"] | CODE |
| LOW | agent_reach/channels/__init__.py | 58 | __all__ = [ | CODE |