fix: install 自动安装 gh CLI + Node.js,加大 mcporter 超时

问题:新服务器上 gh CLI 和 Node.js 未安装,mcporter npm install 60s 超时
修复:
- 新增 _install_system_deps():自动安装 gh CLI (apt) + Node.js (nodesource)
- mcporter 超时从 60s → 120s
- install.md 更新:去掉过时的 exa-key/xhs-cookie 配置步骤
- install 流程:系统依赖 → mcporter → Exa 配置 → 环境检测 → 测试
This commit is contained in:
Panniantong
2026-02-24 15:05:00 +01:00
parent 47f2925b0d
commit 51f73639e2
2 changed files with 76 additions and 17 deletions
+70 -2
View File
@@ -165,6 +165,10 @@ def _cmd_install(args):
config.set("bilibili_proxy", args.proxy) config.set("bilibili_proxy", args.proxy)
print(f"✅ Proxy configured for Reddit + Bilibili") print(f"✅ Proxy configured for Reddit + Bilibili")
# ── Install system dependencies ──
print()
_install_system_deps()
# ── mcporter (for Exa search + XiaoHongShu) ── # ── mcporter (for Exa search + XiaoHongShu) ──
print() print()
_install_mcporter() _install_mcporter()
@@ -215,7 +219,71 @@ def _cmd_install(args):
print(f"✅ Installation complete! {ok}/{total} channels active.") print(f"✅ Installation complete! {ok}/{total} channels active.")
def _install_mcporter(): def _install_system_deps():
"""Install system-level dependencies: gh CLI, Node.js (for mcporter)."""
import shutil
import subprocess
import platform
print("🔧 Checking system dependencies...")
# ── gh CLI ──
if shutil.which("gh"):
print(" ✅ gh CLI already installed")
else:
print(" 📥 Installing gh CLI...")
os_type = platform.system().lower()
if os_type == "linux":
try:
# Official GitHub method for Linux
cmds = [
"curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg 2>/dev/null",
'echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | tee /etc/apt/sources.list.d/github-cli.list > /dev/null',
"apt-get update -qq 2>/dev/null",
"apt-get install -y -qq gh 2>/dev/null",
]
for cmd in cmds:
subprocess.run(cmd, shell=True, capture_output=True, timeout=60)
if shutil.which("gh"):
print(" ✅ gh CLI installed")
else:
print(" ⚠️ gh CLI install failed. Install manually: https://cli.github.com")
except Exception:
print(" ⚠️ gh CLI install failed. Install manually: https://cli.github.com")
elif os_type == "darwin":
if shutil.which("brew"):
try:
subprocess.run(["brew", "install", "gh"], capture_output=True, timeout=120)
if shutil.which("gh"):
print(" ✅ gh CLI installed")
else:
print(" ⚠️ gh CLI install failed. Try: brew install gh")
except Exception:
print(" ⚠️ gh CLI install failed. Try: brew install gh")
else:
print(" ⚠️ gh CLI not found. Install: https://cli.github.com")
else:
print(" ⚠️ gh CLI not found. Install: https://cli.github.com")
# ── Node.js (needed for mcporter) ──
if shutil.which("node") and shutil.which("npm"):
print(" ✅ Node.js already installed")
else:
print(" 📥 Installing Node.js...")
try:
# Use NodeSource for quick install
subprocess.run(
"curl -fsSL https://deb.nodesource.com/setup_22.x | bash - 2>/dev/null && apt-get install -y -qq nodejs 2>/dev/null",
shell=True, capture_output=True, timeout=120,
)
if shutil.which("node"):
print(" ✅ Node.js installed")
else:
print(" ⚠️ Node.js install failed. Install manually: https://nodejs.org")
except Exception:
print(" ⚠️ Node.js install failed. Install manually: https://nodejs.org")
"""Install mcporter and configure Exa + XiaoHongShu MCP servers.""" """Install mcporter and configure Exa + XiaoHongShu MCP servers."""
import shutil import shutil
import subprocess import subprocess
@@ -233,7 +301,7 @@ def _install_mcporter():
try: try:
subprocess.run( subprocess.run(
["npm", "install", "-g", "mcporter"], ["npm", "install", "-g", "mcporter"],
capture_output=True, text=True, timeout=60, capture_output=True, text=True, timeout=120,
) )
if shutil.which("mcporter"): if shutil.which("mcporter"):
print(" ✅ mcporter installed") print(" ✅ mcporter installed")
+6 -15
View File
@@ -20,9 +20,10 @@ agent-reach install --env=auto
``` ```
This single command does everything automatically: This single command does everything automatically:
- Installs system dependencies (gh CLI, Node.js, mcporter) if missing
- Configures Exa search (free, no API key needed)
- Detects local computer vs server - Detects local computer vs server
- Auto-imports browser cookies on local (Twitter, XiaoHongShu, Bilibili) - Auto-imports browser cookies on local (Twitter)
- Auto-detects Exa API key if already in environment
- Tests all channels - Tests all channels
- Shows what's working and what needs setup - Shows what's working and what needs setup
@@ -33,20 +34,12 @@ This single command does everything automatically:
Based on the install output, you may need to configure one or two things. Based on the install output, you may need to configure one or two things.
Only ask the user for items the install output says are missing. Only ask the user for items the install output says are missing.
**If search is not configured:**
> "Want to unlock web search? Go to https://exa.ai → sign up (free) → send me the API key."
```bash
agent-reach configure exa-key THE_KEY
```
**If cookies were not auto-imported (server users):** **If cookies were not auto-imported (server users):**
> "To unlock Twitter and XiaoHongShu, install the Cookie-Editor Chrome extension, go to the site, click Export → Header String, and paste it to me." > "To unlock Twitter search and posting, install the Cookie-Editor Chrome extension, go to twitter.com, click Export → Header String, and paste it to me."
> Extension: https://chromewebstore.google.com/detail/cookie-editor/hlkenndednhfkekhgcdicdfddnkalmdm > Extension: https://chromewebstore.google.com/detail/cookie-editor/hlkenndednhfkekhgcdicdfddnkalmdm
```bash ```bash
agent-reach configure twitter-cookies "PASTED_STRING" agent-reach configure twitter-cookies "PASTED_STRING"
agent-reach configure xhs-cookie "PASTED_STRING"
``` ```
**If on server and wants Reddit/Bilibili full access:** **If on server and wants Reddit/Bilibili full access:**
@@ -70,11 +63,9 @@ Report what's active. Users can configure more anytime by asking.
| Command | What it does | | Command | What it does |
|---------|-------------| |---------|-------------|
| `agent-reach install --env=auto` | Full auto-setup | | `agent-reach install --env=auto` | Full auto-setup (installs deps + configures) |
| `agent-reach doctor` | Show status | | `agent-reach doctor` | Show status |
| `agent-reach configure exa-key KEY` | Unlock search | | `agent-reach configure twitter-cookies "..."` | Unlock Twitter search + posting |
| `agent-reach configure twitter-cookies "..."` | Unlock Twitter |
| `agent-reach configure xhs-cookie "..."` | Unlock XiaoHongShu |
| `agent-reach configure proxy URL` | Unlock Reddit + Bilibili (server) | | `agent-reach configure proxy URL` | Unlock Reddit + Bilibili (server) |
| `agent-reach read URL` | Read any URL | | `agent-reach read URL` | Read any URL |
| `agent-reach search "query"` | Search the web | | `agent-reach search "query"` | Search the web |