The description field was 1204 characters, exceeding the 1024-character
maximum enforced by Codex and other MCP clients. This caused
'invalid description: exceeds maximum length of 1024 characters'
errors that prevented the skill from loading.
Changes:
- Removed star count (changes frequently, not essential for matching)
- Removed Chinese aliases in parentheses (redundant with trigger list)
- Consolidated 'Use when' into a single concise sentence
- Deduplicated trigger keywords (kept most distinctive ones)
New length: 661 chars (well within 1024 limit).
- Replace brittle '"status": "ok"' string match with proper JSON parsing
in _mcporter_status_ok(). Handles Windows BOM, CRLF line endings, and
whitespace variations that caused false negatives on Windows + mcporter 0.7.3.
- Fallback to normalised string matching for backward compatibility.
- Extend config-get timeout to 15 s and list timeout to 30 s on Windows
(unchanged on Linux/macOS: 5 s / 10 s).
Fixes#159
* feat(channels): add V2EX support via public API
V2EX provides a public JSON API that requires no authentication.
This PR adds:
- agent_reach/channels/v2ex.py: V2EXChannel (tier=0, zero-config)
- can_handle() matches v2ex.com URLs
- check() verifies API reachability via urllib (no extra deps)
- Register V2EXChannel in channels/__init__.py
- SKILL.md: add V2EX section with curl examples for hot topics,
node browsing, topic detail, replies, and user info
- tests/test_channels.py: URL matching + mocked ok/warn check tests
V2EX API endpoints used:
GET /api/v2/topics/hot — hot topics
GET /api/topics/show.json — node topics / topic detail
GET /api/replies/show.json — topic replies
GET /api/members/show.json — user info
* feat(channels): expand V2EX channel with data-fetching methods
Add get_hot_topics, get_node_topics, get_topic, get_user, and search
methods to V2EXChannel using stdlib urllib only (no new dependencies).
Update unit tests and SKILL.md with Python call examples.
* feat(v2ex): add data fetching methods to V2EXChannel
Upstream bzd6661/wechat-article-for-ai has a bug where Tag.new_tag
is None in BS4 4.12+. Our fork fixes this.
Co-authored-by: Panniantong <panniantong@users.noreply.github.com>
Config class writes YAML (config.yaml), but xiaoyuzhou.py, cli.py, and
transcribe.sh were hardcoded to read config.json (JSON format). Users who
configured groq-key via 'agent-reach configure' would not have their key
detected because the wrong file was being read.
Fixes#128 (related to config loading)
Co-authored-by: Panniantong <panniantong@users.noreply.github.com>
xreach-cli v0.3.2 added:
- extractTweetText() preferring note_tweet.text for long tweets
- X Article URL support (/article/ path)
Previously, doctor reported 'ok' even when the user had v0.3.0/v0.3.1
installed, silently failing to read longform tweets. Now check() reads
`xreach --version` and returns a warn with upgrade instructions if the
version is below 0.3.2.
Closes#126
Co-authored-by: neo_minion1 <minion@openclaw.ai>
Fixes#128
Two bugs:
1. doctor warn message said 'agent-reach configure groq-api-key' but the
actual CLI arg is 'groq-key' (see cli.py:75 choices list and :993 handler).
Same typo existed in cli.py _install_xiaoyuzhou_deps() output.
2. check() had a logic flaw: the inner 'if not has_key' was nested inside
'if not os.environ.get(...)', so when GROQ_API_KEY env var was absent but
config.json read succeeded, the outer condition never triggered the warning.
Refactored to a flat has_key variable — cleaner and correct.
Verified: 36/36 tests pass, manual unit tests confirm warn uses 'groq-key'
and ok is returned when groq_api_key is present in config.json.
Co-authored-by: 小白(Agent) <neo@agent-reach.dev>
Both _install_weibo_deps() and _install_xiaoyuzhou_deps() use
shutil.which() but didn't import shutil, causing NameError during
agent-reach install.
Co-authored-by: Panniantong <panniantong@users.noreply.github.com>
Add author contact section to both Chinese and English READMEs.
Placed after Credits, before License — clean and non-intrusive.
Co-authored-by: Panniantong <panniantong@users.noreply.github.com>
Fixes#110 and #115. Since OpenClaw 2026-01 disabled the exec tool by
default, users on OpenClaw can't run any agent-reach commands unless
exec is explicitly enabled.
Added:
- Warning callout before '快速上手' explaining exec requirement for
OpenClaw users with the exact config command to use
- Note in the FAQ 'Compatible with Claude Code / OpenClaw...' entry
with the same fix instructions
Closes#110Closes#115
Co-authored-by: neo-minion1 <bot@openclaw.ai>
- Weibo now auto-installs during 'agent-reach install' (no login needed)
- Uses Panniantong/mcp-server-weibo fork with visitor passport auth fix
- Works from overseas servers without proxy or cookies
- Updated README (CN/EN), install.md, and channel check to point to fork
- 10 tools: trending, search content/users/topics, profile, feeds, comments
Co-authored-by: Panniantong <panniantong@users.noreply.github.com>
The m.weibo.cn API works from overseas IPs (browsers handle the
visitor passport flow automatically). The issue is that
mcp-server-weibo doesn't handle the visitor auth flow, so it
needs a valid Cookie to work.
Co-authored-by: Panniantong <panniantong@users.noreply.github.com>
Adds install steps for mcp-server-weibo and documents that the
Weibo mobile API (m.weibo.cn) only works from mainland China IPs.
Co-authored-by: Panniantong <panniantong@users.noreply.github.com>
- YouTube: warn when only Node.js is installed but yt-dlp config file
is missing (previously returned "ok" incorrectly)
- Douyin: use `mcporter list` instead of calling with a hardcoded
invalid share URL that always fails
- cli: replace bare `except:` with `except Exception:` in
`_detect_environment` to avoid catching KeyboardInterrupt/SystemExit
- cli: fix unclosed file handle for cloud VM detection
- config: use `os.open()` with 0o600 mode to eliminate permission
race window when saving credentials
Adds a proper way for AI agents to import XiaoHongShu cookies into
the xiaohongshu-mcp Docker container. Previously agents had no clear
command to use, leading to confusion loops (issue #108).
Supports two input formats:
- Cookie-Editor JSON export (array of cookie objects)
- Header String format (key1=val1; key2=val2; ...)
The command:
1. Parses and validates the cookie input
2. Finds the running xiaohongshu-mcp container
3. Reads COOKIES_PATH from container env
4. Writes cookies via docker cp
5. Verifies login status via mcporter
Also updates install.md with the new command.
Closes#108
Co-authored-by: Panniantong <panniantong@users.noreply.github.com>
Previously, Extracting cookies from chrome...
✅ Twitter/X: auth_token + ct0
✅ Cookies configured! Run `agent-reach doctor` to see updated status. stored Twitter
cookies in ~/.agent-reach/config.yaml but did NOT write them to
~/.config/xfetch/session.json. This caused xreach CLI to report
'Not authenticated' even after a successful configure.
The xfetch bridge existed only in the manual
code path (cli.py:829). This commit extracts it into a shared helper
_sync_xfetch_session() in cookie_extract.py and calls it from
configure_from_browser() too, so both paths behave consistently.
Fix is non-fatal: if the xfetch dir/file cannot be written, the error
is swallowed silently (agent-reach config.yaml remains the source of truth).
Co-authored-by: Panniantong <panniantong@users.noreply.github.com>
The isatty() check skipped UTF-8 wrapping when agent-reach was called
as a subprocess by AI agents (non-TTY). On Windows with GBK encoding,
any remaining non-ASCII chars would crash with UnicodeEncodeError.
Now UTF-8 wrapping applies in all environments on Windows.
Closes#95
Co-authored-by: Panniantong <panniantong@users.noreply.github.com>
- Remove all decorative emoji (👁️🔍📦🍪💡🔧📥🧩🛡️📡💻🤖⭐🙏🆕ℹ️) from cli.py and doctor.py
- Replace ⚠️ with [!] and ❌ with [X] (ASCII-safe status markers)
- Replace ⬜ with -- (ASCII-safe)
- Keep ✅ only for final success confirmations
- Fixes Windows GBK encoding crash during 'agent-reach install' (issue #95)
Closes#95
A friendly, non-intrusive message after successful installation
asking users to star the repo.
Co-authored-by: Panniantong <panniantong@users.noreply.github.com>
* feat: auto-install WeChat article tools during agent-reach install
WeChat (微信公众号) deps are now auto-installed during 'agent-reach install':
- Python packages: camoufox[geoip], markdownify, beautifulsoup4, httpx, miku_ai
- Tool repo: wechat-article-for-ai cloned to ~/.agent-reach/tools/
No login or configuration needed — works out of the box like YouTube/RSS.
Updated README tables to reflect zero-config status.
Also covers safe mode and dry-run.
* feat: auto-install WeChat + add channel-setup reference to SKILL.md
1. WeChat auto-install during 'agent-reach install':
- pip install camoufox[geoip], markdownify, bs4, httpx, miku_ai
- clone wechat-article-for-ai to ~/.agent-reach/tools/
- covers safe mode and dry-run
- README tables: WeChat → zero-config
2. SKILL.md improvements:
- Added 'configure' triggers to description
- Added references/channel-setup.md with install steps for all
login-required platforms (Twitter, XHS, Douyin, LinkedIn, Boss)
- Principle: user only provides cookies, agent does everything else
* simplify: point to install.md URL instead of bundled reference
No need to maintain a separate channel-setup.md. Just tell agents
to fetch install.md when they need setup instructions.
---------
Co-authored-by: Panniantong <panniantong@users.noreply.github.com>
Changed '怎么配' column from raw pip command to '告诉 Agent「帮我配微信公众号」',
matching the pattern of all other channels. Updated both Chinese and English READMEs.
Co-authored-by: Panniantong <panniantong@users.noreply.github.com>