Repository Analysis

Panniantong/Agent-Reach

Give your AI agent eyes to see the entire internet. Read & search Twitter, Reddit, YouTube, GitHub, Bilibili, XiaoHongShu — one CLI, zero API fees.

19.2 Moderate AI signal View on GitHub
19.2
Adjusted Score
19.2
Raw Score
100%
Time Factor
2026-05-18
Last Push
20,623
Stars
Python
Language
9,795
Lines of Code
74
Files
190
Pattern Hits
2026-05-31
Scan Date

Score History

Severity Breakdown

CRITICAL 0HIGH 1MEDIUM 6LOW 183

Pattern Findings

190 matches across 9 categories. Click a row to expand file-level details.

Hyper-Verbose Identifiers67 hits · 66 pts
SeverityFileLineSnippet
LOWtests/test_xiaoyuzhou_install.py13def test_install_xiaoyuzhou_deps_does_not_raise_when_no_groq_key(capsys):
LOWtests/test_xhs_format.py58 def test_single_note_keeps_useful_fields(self):
LOWtests/test_xhs_format.py73 def test_single_note_drops_useless_fields(self):
LOWtests/test_xhs_format.py84 def test_search_results_wrapper(self):
LOWtests/test_xhs_format.py127 def test_non_dict_passthrough(self):
LOWtests/test_skill_command.py16 def test_skill_resources_include_both_locales(self):
LOWtests/test_skill_command.py26 def test_install_skill_creates_skill_md(self):
LOWtests/test_skill_command.py55 def test_uninstall_skill_removes_dir(self):
LOWtests/test_skill_command.py77 def test_install_creates_dir_if_parent_exists(self):
LOWtests/test_skill_command.py99 def test_install_uses_english_skill_for_english_locale(self):
LOWtests/test_doctor.py29 def test_check_all_collects_channel_results(self, tmp_config, monkeypatch):
LOWtests/test_channels.py322 def test_search_returns_unavailable_notice(self):
LOWtests/test_channels.py330 def test_can_handle_xueqiu_urls(self):
LOWtests/test_channels.py338 def test_check_ok_when_api_reachable(self, monkeypatch):
LOWtests/test_channels.py21 def test_get_unknown_channel_returns_none(self):
LOWtests/test_channels.py24 def test_all_channels_registered(self):
LOWtests/test_channels.py41 def test_check_ok_when_api_reachable(self, monkeypatch):
LOWtests/test_channels.py65 def test_check_warn_when_api_unreachable(self, monkeypatch):
LOWtests/test_channels.py80 def test_get_hot_topics_returns_list(self, monkeypatch):
LOWtests/test_channels.py126 def test_get_hot_topics_respects_limit(self, monkeypatch):
LOWtests/test_channels.py144 def test_get_hot_topics_truncates_content(self, monkeypatch):
LOWtests/test_channels.py198 def test_get_topic_returns_detail_and_replies(self, monkeypatch):
LOWtests/test_channels.py251 def test_get_topic_handles_empty_replies(self, monkeypatch):
LOWtests/test_channels.py286 def test_get_user_returns_profile(self, monkeypatch):
LOWtests/test_channels.py366 def test_check_warn_when_api_unreachable(self, monkeypatch):
LOWtests/test_channels.py469 def test_get_hot_posts_returns_list(self, monkeypatch):
LOWtests/test_channels.py513 def test_get_hot_posts_respects_limit(self, monkeypatch):
LOWtests/test_channels.py590 def test_ensure_cookies_loads_from_config(self, monkeypatch, tmp_path):
LOWtests/test_channels.py624 def test_get_json_sends_referer_and_browser_ua(self, monkeypatch):
LOWtests/test_channels.py650 def test_reports_off_when_not_installed(self, monkeypatch):
LOWtests/test_channels.py658 def test_reports_ok_when_authenticated(self, monkeypatch):
LOWtests/test_channels.py675 def test_reports_warn_when_not_authenticated(self, monkeypatch):
LOWtests/test_channels.py695 def test_reports_warn_when_status_check_fails(self, monkeypatch):
LOWtests/test_channels.py706 def test_can_handle_reddit_urls(self):
LOWtests/test_channels.py716 def test_reports_ok_when_cli_authenticated(self, monkeypatch):
LOWtests/test_channels.py728 def test_reports_warn_when_not_authenticated(self, monkeypatch):
LOWtests/test_channels.py740 def test_reports_off_when_not_installed(self, monkeypatch):
LOWtests/test_twitter_channel.py18def test_check_twitter_cli_found_and_auth_ok():
LOWtests/test_twitter_channel.py31def test_check_twitter_cli_found_auth_missing():
LOWtests/test_twitter_channel.py48def test_check_bird_fallback_auth_ok():
LOWtests/test_twitter_channel.py64def test_check_bird_fallback_auth_missing():
LOWtests/test_twitter_channel.py82def test_check_nothing_installed():
LOWtests/test_twitter_channel.py93def test_twitter_cli_preferred_over_bird():
LOWtests/test_config.py39 def test_config_file_priority_over_env(self, tmp_config, monkeypatch):
LOWtests/test_config.py64 def test_get_configured_features(self, tmp_config):
LOWtests/test_config.py70 def test_to_dict_masks_sensitive(self, tmp_config):
LOWtests/test_config.py77 def test_save_creates_file_with_restricted_permissions(self, tmp_path):
LOWtests/test_cli.py20 def test_no_command_shows_help(self, capsys):
LOWtests/test_cli.py33 def test_parse_twitter_cookie_input_separate_values(self):
LOWtests/test_cli.py38 def test_parse_twitter_cookie_input_cookie_header(self):
LOWtests/test_cli.py47 def test_retry_timeout_classification(self):
LOWtests/test_cli.py66 def test_retry_dns_classification(self):
LOWtests/test_cli.py78 def test_retry_rate_limit_then_success(self):
LOWtests/test_cli.py119 def test_check_update_reports_classified_error(self, capsys):
LOWtests/test_channel_contracts.py8def test_channel_registry_contract():
LOWtests/test_channel_contracts.py21def test_channel_check_contract_with_minimal_runtime(monkeypatch, tmp_path):
LOWtests/test_channel_contracts.py32def test_youtube_warns_when_node_only_and_no_config(monkeypatch, tmp_path):
LOWtests/test_channel_contracts.py53def test_youtube_warns_with_windows_specific_fix_command(monkeypatch, tmp_path):
LOWtests/test_channel_contracts.py75def test_youtube_ok_when_deno_installed(monkeypatch):
LOWtests/test_channel_contracts.py93def test_douyin_check_does_not_call_with_invalid_url(monkeypatch, tmp_path):
7 more matches not shown…
Excessive Try-Catch Wrapping66 hits · 56 pts
SeverityFileLineSnippet
LOWdocs/update.md100except Exception:
MEDIUMagent_reach/cli.py472 print("Error: no input on stdin", file=sys.stderr)
MEDIUMagent_reach/cli.py477 print(f"Error: invalid JSON: {e}", file=sys.stderr)
LOWagent_reach/cli.py34 except Exception:
LOWagent_reach/cli.py274 except Exception:
LOWagent_reach/cli.py363 except Exception:
LOWagent_reach/cli.py385 except Exception as e:
LOWagent_reach/cli.py447 except Exception as e:
LOWagent_reach/cli.py524 except Exception:
LOWagent_reach/cli.py534 except Exception:
LOWagent_reach/cli.py560 except Exception:
LOWagent_reach/cli.py570 except Exception:
LOWagent_reach/cli.py584 except Exception:
LOWagent_reach/cli.py603 except Exception:
LOWagent_reach/cli.py634 except Exception as e:
LOWagent_reach/cli.py672 except Exception:
LOWagent_reach/cli.py695 except Exception:
LOWagent_reach/cli.py718 except Exception:
LOWagent_reach/cli.py741 except Exception:
LOWagent_reach/cli.py764 except Exception:
LOWagent_reach/cli.py775 except Exception as e:
LOWagent_reach/cli.py787 except Exception:
LOWagent_reach/cli.py839 except Exception:
LOWagent_reach/cli.py859 except Exception:
LOWagent_reach/cli.py937 except Exception as e:
LOWagent_reach/cli.py954 except Exception:
LOWagent_reach/cli.py1002 except Exception:
LOWagent_reach/cli.py1011 except Exception:
LOWagent_reach/cli.py1099 except Exception as e:
LOWagent_reach/cli.py1250 except Exception as e:
LOWagent_reach/cli.py1263 except Exception:
LOWagent_reach/cli.py1293 except Exception as e:
LOWagent_reach/cli.py1296 except Exception as e:
LOWagent_reach/cli.py1315 except Exception as e:
LOWagent_reach/cli.py1351 except Exception as e:
LOWagent_reach/cli.py1375 except Exception as e:
LOWagent_reach/cli.py1395 except Exception:
LOWagent_reach/cli.py1475 except Exception:
LOWagent_reach/cli.py1575 except Exception:
LOWagent_reach/cli.py1604 except Exception:
LOWagent_reach/cookie_extract.py95 except Exception as e:
LOWagent_reach/cookie_extract.py110 except Exception as e:
LOWagent_reach/cookie_extract.py172 except Exception:
LOWagent_reach/cookie_extract.py193 except Exception:
LOWagent_reach/cookie_extract.py212 except Exception as e:
LOWagent_reach/integrations/mcp_server.py54 except Exception as e:
LOWagent_reach/channels/xiaoyuzhou.py45 except Exception:
LOWagent_reach/channels/douyin.py43 except Exception:
LOWagent_reach/channels/douyin.py55 except Exception:
LOWagent_reach/channels/exa_search.py37 except Exception:
LOWagent_reach/channels/wechat.py23 except Exception:
LOWagent_reach/channels/weibo.py41 except Exception:
LOWagent_reach/channels/weibo.py51 except Exception:
LOWagent_reach/channels/xueqiu.py70 except Exception:
LOWagent_reach/channels/xueqiu.py98 except Exception:
LOWagent_reach/channels/xueqiu.py173 except Exception as e:
MEDIUMagent_reach/channels/xueqiu.py164def check(self, config=None):
LOWagent_reach/channels/twitter.py60 except Exception:
LOWagent_reach/channels/twitter.py81 except Exception:
LOWagent_reach/channels/bilibili.py23 except Exception:
6 more matches not shown…
Verbosity Indicators11 hits · 20 pts
SeverityFileLineSnippet
LOWagent_reach/cli.py1443 # Step 1: Exa (via mcporter, no API key required)
LOWagent_reach/cli.py1480 # Step 2: GitHub token
LOWagent_reach/cli.py1496 # Step 3: Reddit — rdt-cli
LOWagent_reach/cli.py1501 # Step 4: Groq (Whisper)
LOWagent_reach/scripts/transcribe_xiaoyuzhou.sh35# Step 1: 提取音频 URL 和标题
LOWagent_reach/scripts/transcribe_xiaoyuzhou.sh49# Step 2: 下载音频
LOWagent_reach/scripts/transcribe_xiaoyuzhou.sh56# Step 3: 获取时长
LOWagent_reach/scripts/transcribe_xiaoyuzhou.sh62# Step 4: 转为低码率单声道 MP3
LOWagent_reach/scripts/transcribe_xiaoyuzhou.sh68# Step 5: 按大小切片
LOWagent_reach/scripts/transcribe_xiaoyuzhou.sh90# Step 6: 调用 Groq Whisper API 转录
LOWagent_reach/scripts/transcribe_xiaoyuzhou.sh143# Step 7: 合并输出
Unused Imports16 hits · 15 pts
SeverityFileLineSnippet
LOWtests/test_config.py4
LOWtests/test_config.py5
LOWtests/test_config.py6
LOWtests/test_config.py9
LOWagent_reach/__init__.py7
LOWagent_reach/cli.py803
LOWagent_reach/cli.py808
LOWagent_reach/doctor.py91
LOWagent_reach/cookie_extract.py11
LOWagent_reach/cookie_extract.py12
LOWagent_reach/utils/paths.py3
LOWagent_reach/utils/text.py3
LOWagent_reach/channels/rss.py18
LOWagent_reach/channels/wechat.py42
LOWagent_reach/channels/bilibili.py7
LOWagent_reach/channels/base.py13
Deep Nesting23 hits · 14 pts
SeverityFileLineSnippet
LOWtests/test_skill_command.py26
LOWagent_reach/cli.py47
LOWagent_reach/cli.py155
LOWagent_reach/cli.py323
LOWagent_reach/cli.py484
LOWagent_reach/cli.py654
LOWagent_reach/cli.py677
LOWagent_reach/cli.py700
LOWagent_reach/cli.py723
LOWagent_reach/cli.py793
LOWagent_reach/cli.py975
LOWagent_reach/cli.py1017
LOWagent_reach/cli.py1124
LOWagent_reach/cli.py1145
LOWagent_reach/cli.py1321
LOWagent_reach/cli.py1434
LOWagent_reach/cli.py1582
LOWagent_reach/cli.py1614
LOWagent_reach/cli.py351
LOWagent_reach/doctor.py27
LOWagent_reach/cookie_extract.py44
LOWagent_reach/cookie_extract.py151
LOWagent_reach/channels/xiaohongshu.py31
Redundant / Tautological Comments4 hits · 6 pts
SeverityFileLineSnippet
LOWagent_reach/cli.py753 # Check if already installed and working
LOWagent_reach/cli.py799 # Check if already installed
LOWagent_reach/cli.py1238 # Check if xiaohongshu-mcp container is running
LOWagent_reach/cookie_extract.py123 # Check if cookie belongs to this platform
Cross-Language Confusion1 hit · 5 pts
SeverityFileLineSnippet
HIGHagent_reach/channels/reddit.py71 '"modhash": null, "saved_at": 0, "last_verified_at": null}\n\n'
Self-Referential Comments1 hit · 3 pts
SeverityFileLineSnippet
MEDIUMtests/test_skill_command.py58 # Create a fake skill installation
Decorative Section Separators1 hit · 3 pts
SeverityFileLineSnippet
MEDIUMagent_reach/cli.py152# ── Command handlers ────────────────────────────────