Project is now mirrored on AtomGit (auto pull-sync from GitHub, enabled
with pull-f) for faster cloning in China. Badge + mirror notice added to
both READMEs per the G-Star certification requirements.
Mirror: https://atomgit.com/qq_51337814/Agent-Reach
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two factual errors and a batch of stale-world copy found by auditing the
full README against v1.5.0 reality:
- "what install does" claimed twitter-cli/rdt-cli are installed by default
— they never are (opt-in via --channels); now describes the real flow
incl. the channel menu step
- zero-config examples listed "read a tweet" — Twitter is tier 1, not
zero-config; list now shows truly free channels (incl. bili search)
- FAQ rewrites: xiaohongshu (OpenCLI-first, mcp for servers, xhs-cli as
legacy fallback), Reddit (login mandatory, OpenCLI first, pinned rdt
source), free-cost answer (tool list updated, proxy rescoped to
restricted networks)
- platform table stops advertising write ops (发推/Post·Comment·Like) —
aligned with the skill's fetch-only boundary
- bilibili pain-point line updated to the 412 reality
- credits gain OpenCLI and xiaohongshu-mcp
- README_en: same FAQ/table/doctor-sample fixes
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- install --proxy help text: generic network-proxy wording (was
"Reddit/Bilibili")
- setup wizard: Reddit line no longer claims 无需配置 right before
demanding rdt login
- README_en: bilibili proxy-era claims replaced with bili-cli reality
(proxy section rescoped to restricted networks, doctor sample updated)
- install.md: rdt-cli example pinned to the same SHA as _RDT_GIT_SOURCE
Codex final verdict across 3 rounds: SHIP (all earlier fixes verified,
remaining items were these non-blocking nits).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- configure proxy: the bilibili_proxy key lost its only reader when yt-dlp
exited the bilibili channel (PR5), leaving docs promising an unlock that
did nothing. Now saves a generic `proxy` key (legacy key kept in sync),
and every wording — CLI output, server tip, install.md quick reference —
says what it really is: a saved address agents read to export
HTTP(S)_PROXY, not an unlock switch
- transcribe: subprocess calls get timeouts (yt-dlp download 1800s, ffmpeg
600s) so a stalled network read can't hang the CLI forever
- docs/update.md: rdt-cli install uses the same pinned git SHA as the
code's _RDT_GIT_SOURCE instead of floating HEAD
- probe.py: documented as side-effect-free-probes-only (retries re-run
verbatim with no backoff)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- twitter: align backend selection with the two-phase findings pattern —
an unauthenticated twitter-cli (warn) no longer blocks a fully-working
OpenCLI (ok) further down the candidate list
- watch: use _is_newer_version like check-update (the != comparison kept
the downgrade prompt this branch fixed elsewhere)
- uninstall: third copy of the skill-dir removal also gets the symlink
guard (full `agent-reach uninstall` path)
- doctor: a stale active_backend from a previous check on the singleton
channel no longer leaks into an errored result
+4 regression tests (162 total).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The one-liner entry docs were untouched by the backend upgrade — new users
following "帮我安装 Agent Reach" would still get the old world. Now:
- docs/install.md: xiaohongshu section rewritten (desktop OpenCLI with the
one manual extension click / server xiaohongshu-mcp with QR + 150MB
first-run warning / legacy xhs-cli kept as fallback); Reddit section says
plainly there is no zero-config path; optional-channel menu gains OpenCLI;
upstream table matches the new routing with a doctor --json pointer
- docs/update.md: full rewrite — upgrade-only-what-exists tool refresh
(incl. npm update for OpenCLI/mcporter, pinned git source for rdt-cli),
one-time OpenCLI offer for desktops, skill sync now rides doctor's
auto-sync instead of an inline python blob, WeChat-era content removed
- check-update / watch: "update available" now leads with the one-liner
(帮我更新 Agent Reach:<update.md>) which updates package + tools + skill;
bare pip stays as the package-only alternative
- fix: version compare was `!=` — a local build AHEAD of the latest release
(installed from main during a release window) was told to "update" into a
downgrade; now semantic tuple compare with fallback (+4 tests)
- skill (zh+en): description gains a NOT-for boundary (fetch-only, no write
ops, defer to dedicated skills); new standing rule — after substantial
tasks run check-update and append a one-liner update hint to the wrap-up,
never interrupting or nagging
- SKILL_en.md restructured to the same three-layer skeleton as the Chinese
version (124-line body, shared references/) instead of a 263-line
everything-inline page
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
SKILL.md (per the skill-writing guide):
- description rewritten trigger-first: 调研/全网调研/帮我调研/research lead
the text (the owner's own phrasing "去全网调研" previously had NO matching
trigger word — the exact undertrigger the guide warns about); platform
keywords front-loaded against the 1536-char truncation
- standing rules added: probe `doctor --json` active_backend before acting
on multi-backend platforms, announce which skill/backend is in use,
follow the documented retry chains, compose multi-platform research
- quick commands updated to the new reality: bili-cli for bilibili search,
Reddit/xiaohongshu moved to a "login-backed platforms" section
- SKILL_en.md: same description surgery + the actively harmful stale
advice removed (anonymous reddit .json curl, yt-dlp for bilibili)
README / README_en:
- tagline gains the capability-layer subline: backends are chosen,
installed and health-checked for us to swap — the user never notices
- "设计理念" reframed from scaffolding to capability layer (selection /
install / doctor / routing); channels diagram now shows ordered backend
lists; selection table split into primary + fallback columns with the
live-test rationale per row
- platform table: honest rows for bilibili (bili-cli, yt-dlp retired),
Reddit (no zero-config path), xiaohongshu (OpenCLI / mcp / legacy)
Version 1.5.0 across pyproject / __init__ / CLAUDE.md / test fixture.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
bilibili:
- live-verified 2026-06: bilibili 412-blocks yt-dlp in every
configuration (latest version, direct, proxied, warmed cookies) while
bili-cli works fine without login — so yt-dlp no longer serves this
channel (it remains the YouTube backend)
- backends = [bili-cli, OpenCLI, B站搜索 API]: bili-cli covers
search/hot/rank/video-detail/audio, OpenCLI adds subtitles through the
browser session, the search API is the zero-dependency fallback
- when a broken candidate is bypassed by a working fallback, its
reinstall prescription is appended to the winning message instead of
being swallowed
- skill docs (social.md + video.md): "do NOT use yt-dlp for bilibili"
warning, bili-cli/OpenCLI command groups, curl fallback recipe,
B站 audio transcription path via `bili audio` + agent-reach transcribe
twitter:
- OpenCLI joins as the middle candidate [twitter-cli, OpenCLI, bird]
- social.md: explicit 4-step search retry chain (retry → upgrade →
OpenCLI → stable-command detour)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- live-verified 2026-06: anonymous .json endpoints are 403-blocked (all
variants) and the official API closed self-service registration in
2025-11 — so the channel now says plainly: every Reddit backend needs
a logged-in session, mainland China needs a proxy
- backends = [OpenCLI, rdt-cli]: OpenCLI rides the browser session
(desktop preferred); rdt-cli stays for servers and existing installs
(upstream unmaintained since 2026-03, noted in the ok message)
- install: desktop routes to OpenCLI, server installs rdt-cli from the
pinned git source (split out as _install_rdt_cli)
- skill/references/social.md: Reddit section rewritten as two backend
command groups + a PRAW note scoped to users who already hold
pre-2025-11 credentials (explicitly not recommended for new users)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- backends becomes the ordered candidate list [OpenCLI, xiaohongshu-mcp,
xhs-cli]; probing order makes the desktop/server split automatic:
OpenCLI never probes alive headless, so servers fall through to
xiaohongshu-mcp; first fully-usable candidate wins, fixable (warn)
candidates only win when nothing is fully usable
- xiaohongshu-mcp probing: HTTP reachability of localhost:18060
(proxy-bypassed) + mcporter config presence; guides through
`mcporter config add` when half-wired
- opencli backend: treat a sleeping extension service worker as ready —
verified live that `daemon status` reports disconnected while any real
command wakes it; disambiguate "sleeping" vs "never installed" via the
Chrome Extensions directory on disk (fixes active_backend flapping
between OpenCLI and xhs-cli across doctor runs)
- install: desktop installs OpenCLI; server prints the xiaohongshu-mcp
guide (binary to ~/.agent-reach/tools/, QR login, mcporter add);
xhs-cli is no longer installed by default (upstream unmaintained since
2026-03) but existing installs keep working as the last candidate
- skill/references/social.md: xiaohongshu section rewritten as three
backend command groups keyed off `doctor --json` active_backend,
including the 120s-timeout and login-first caveats for the mcp path
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- new agent_reach/backends/opencli.py: probes install + daemon/extension
state via `opencli daemon status` (pure query — `opencli doctor`
auto-starts the daemon, a side effect health checks must avoid)
- `agent-reach install --channels opencli`: npm install + Chrome Web
Store guide (extension install cannot be automated — Chrome security
model — so we print the one-click path)
- server env skips OpenCLI (rides a real desktop Chrome session)
- channels will adopt it as a backend candidate in follow-up PRs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- backends is now an ordered candidate list (first = preferred); channels
report the backend actually serving via active_backend, surfaced in the
doctor text report and --json
- new agent_reach/probe.py really executes upstream commands and tells
apart missing / broken (stale venv shebang after a system Python
upgrade) / timeout, with a reinstall prescription for broken installs
- all 13 channels migrated off which()-only checks: fixes bilibili
false-positive "bili-cli 可用" on broken shims, misleading xiaohongshu
"连接失败", rdt OSError crashing doctor, mcporter breakage masquerading
as "未配置"
- twitter: 15s probe + 1 retry (flaky 10s timeout), broken twitter-cli
now falls back to bird instead of aborting the check
- doctor survives per-channel exceptions; config supports per-channel
backend override (<channel>_backend / <CHANNEL>_BACKEND env)
- fix skill install/uninstall crash on symlinked skill dirs (the
"[Errno None] None" warning from shutil.rmtree on a symlink)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Remove the FluxNode and OpenClaw-for-Enterprise placements from the
friend-links section across README.md / README_en / README_ko; keep the
Tencent Cloud OpenClaw entry.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Routes the two credential-writing call sites (xfetch session sync, no-Docker XHS cookie fallback) through the same atomic os.open(..., 0o600) pattern Config.save() already uses, closing a TOCTOU window where credential files were briefly world-readable (CWE-732). Also hardens _sync_bird_env() with shlex.quote against a shell-injection breakout in the sourceable env file — verified exploitable on the pre-fix code. Maintainer follow-up: scoped the injection-probe test markers to tmp_path so they can't poison reruns. 107 tests pass.
The ok/warn/off symbols had no explanation for non-technical users;
--json gives agents and scripts a machine-readable health check.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
All three had rotted past honest usability:
- Douyin's upstream (yzfly/douyin-mcp-server) is archived and required a
4-step manual local-server setup nobody could complete
- Weibo depended on an unmaintained personal fork (mcp-server-weibo)
- WeChat full-article reading was increasingly blocked by anti-bot
(#339) while doctor still advertised it as zero-config
Removes the channel files, installers, skill routing/trigger entries,
reference sections and README rows (zh+en). Honest counts: 13 platforms,
6 zero-config. They can return when maintained upstreams exist.
Follows the v1.4.0 precedent of removing Discord/Toutiao (#234).
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Extracted from #318 (the UTF-8/doctor core, minus the env-wrapper feature):
- new agent_reach/utils/process.py: utf8_subprocess_env() +
mcporter_utf8_env_args() — Windows GBK consoles otherwise corrupt
Chinese output from mcporter/MCP child processes
- weibo/douyin/linkedin checks and weibo install/registration now pass
the UTF-8 env (and register the MCP server with --env PYTHONUTF8=1)
- youtube: extract _has_js_runtime_config() with an OSError guard so an
unreadable yt-dlp config can't crash doctor
- test_skill_command: open SKILL.md with explicit utf-8 (Windows GBK
default broke these tests)
Co-authored-by: chidao <2980933590@qq.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds agent_reach/transcribe.py (download → compress → chunk → transcribe with provider fallback, fully mocked tests). Maintainer follow-up on the branch: wired an agent-reach transcribe CLI subcommand + skill docs so agents can actually invoke it, added the missing configure openai-key branch the error hint referenced, removed two dead static methods. 103 tests pass; wheel-gate clean.
PyPI still only has rdt-cli 0.4.1 while the doctor hint required >=0.4.2, so the suggested install command always failed. Installs from the upstream GitHub repo pinned to the 0.4.2 commit instead, and syncs all four docs that still taught the PyPI path. Verified locally: clean-venv install from the pinned source yields rdt 0.4.2 and rdt status works. 86 tests pass. Fixes#294.
Adds a punctuation-aware Whisper prompt and an optional --polish step (free Llama 3.3 70B on Groq) for Chinese podcast transcripts. Maintainer follow-up on the branch: replaced ASCII quotes that bash swallowed inside the prompt (hexdump-verified), added the same prompt to the 429-retry call, and documented --polish as optional. bash -n passes.
Rewrites the skill description with platform aliases (zh+en) and action triggers so agents reliably auto-invoke the skill. Maintainer follow-up on the branch: removed nonexistent skill_view tool reference, dropped finance category (no references/finance.md), updated the EN-locale test assertion to the new description. YAML validated, 85 tests pass. Fixes#316.
Four small correctness fixes found while live-testing community PRs:
- SKILL.md taught agents 'twitter search --limit 10' but twitter-cli
v0.8.5 has no --limit (real flag is -n/--max) — every agent following
the skill got a usage error
- transcribe_xiaoyuzhou.sh audio regex only matched lowercase .m4a/.mp3;
current episodes serve uppercase .MP3 (verified on a live episode) —
add /i flag
- reddit.py declared tier=0 (zero-config) while its own docstring says
Reddit requires login since 2024 — set tier=1 to match reality (tier
is doctor display metadata only)
- docs/README_en.md referenced the retired 'bird' CLI name once
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The English README was missing two things present in the Chinese README: the OpenClaw 'exec' permission prerequisite (without it the Agent silently can't run install commands) and the --safe install mode. Both refer to real, supported features (cli.py exposes --safe; install.md documents it). Also align the Chinese README's Python badge alt-text (3.8+ -> 3.10+) with requires-python and the badge image.
Co-authored-by: nyxst4ck <289980115+nyxst4ck@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
It's Claude Code's per-user permission allowlist — auto-modified on every
permission approval, so it kept dirtying the working tree and risked
leaking personal settings into the public repo. Local file is preserved.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Editable installs in CI never exercise wheel packaging, which let the
force-include duplication ship broken source installs while tests stayed
green (#308#315#328#332#334). This gate builds the real wheel, fails
on any duplicate archive entry, asserts SKILL.md/guides/scripts ship,
and smoke-installs into a clean venv.
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Removes the [tool.hatch.build.targets.wheel.force-include] block that duplicated files already included via packages=["agent_reach"], which made modern hatchling fail source installs with 'ValueError: A second file is being added to the wheel archive at the same path'.
Verified before merge: wheel builds clean (48 entries, no duplicates), SKILL.md / guides / scripts all ship in site-packages, 85 tests pass on Python 3.11.
Fixes#334, fixes#332, fixes#328, fixes#315, fixes#308.
Reddit requires authentication since 2024 (all API requests return 403
without a valid session cookie). Updated all 4 language versions (zh, en,
ja, ko) to reflect this: platform tables, tool choice tables, architecture
diagrams, and FAQ sections.
Also fixed Chinese README architecture diagram: reddit.py backend corrected
from Exa to rdt-cli, wechat.py backend corrected from camoufox+miku to Exa.
Fixed Japanese README reddit.py swap suggestions (removed outdated PRAW/Pushshift).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
CRITICAL FIX: update.md was telling agents to uninstall bird CLI,
which broke users who had working bird installations. Now:
- twitter.py: prefers twitter-cli, falls back to bird/birdx if installed
- update.md: removed "clean up deprecated tools" step entirely
- Added explicit rule: "Never uninstall any existing tools the user already has"
- Tests cover twitter-cli primary + bird fallback + preference order
78 tests passing.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Based on investigation of public-clis/twitter-cli 47 issues:
- search may 404 when Twitter changes GraphQL endpoints
- followers command has account ban risk on datacenter IPs
- Cookie auto-extraction fragile (macOS Keychain, Windows DPAPI)
- Recommend Cookie-Editor export + env vars over auto-extraction
- Ensure v0.8.5+ for Windows pipe fix
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Based on upstream issue investigation:
- Reddit (rdt-cli): ensure v0.4.2+, note login-required features
- B站: 412 is overseas-IP + no-cookie, add bili-cli commands
- YouTube: --write-comments is best-effort, auto-subs may duplicate
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Based on investigation of jackwener/xiaohongshu-cli issues:
- xsec_token: can't read by bare note_id, must search/feed first
- Rate limiting: high-freq requests trigger CAPTCHA
- v0.6.4: user/user-posts/favorites may return API error
- POST operations: may 406 due to signature issues in v0.6.x
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- WebChannel.read(): reads any URL via Jina Reader (r.jina.ai), returns Markdown
- _install_skill(): add fallback from importlib.resources to Path(__file__) for editable installs
- Explicit UTF-8 encoding on all file read/write operations
Inspired by PR #215, implemented correctly (Jina instead of raw requests).
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>