polish: 全面清理旧名引用 + 英文 README 对齐中文版质量

- .gitignore/.env.example: agent-eyes → agent-reach
- README.md: 暂去掉 logo 图片标签(logo 待定)
- docs/README_en.md: 完全重写,对齐中文版的表格/徽章/结构
- SKILL.md: setup → configure
- sync-upstream.sh: 更新路径到 agent_reach/channels
- 提交 3 个 logo 候选文件(最终选定后改名 logo.png)
This commit is contained in:
Panniantong 2026-02-24 12:15:30 +01:00
parent 5c62a21f32
commit ebbb69c372
12 changed files with 286 additions and 96 deletions

View file

@ -1,6 +1,6 @@
# Agent Eyes Configuration # Agent Reach Configuration
# Copy to .env and fill in your values # Copy to .env and fill in your values
# Or use: agent-eyes setup # Or use: agent-reach configure
# Exa Search (free 1000/month) — https://exa.ai # Exa Search (free 1000/month) — https://exa.ai
# EXA_API_KEY=exa-your-key-here # EXA_API_KEY=exa-your-key-here

2
.gitignore vendored
View file

@ -6,5 +6,5 @@ __pycache__/
dist/ dist/
build/ build/
.env .env
.agent-eyes/ .agent-reach/
*.log *.log

View file

@ -1,7 +1,3 @@
<p align="center">
<img src="docs/assets/logo.png" alt="Agent Reach" width="200">
</p>
<h1 align="center">👁️ Agent Reach</h1> <h1 align="center">👁️ Agent Reach</h1>
<p align="center"> <p align="center">

View file

@ -22,7 +22,7 @@ pip install git+https://github.com/Panniantong/agent-reach.git
## 解锁更多功能 ## 解锁更多功能
运行 `agent-reach setup` 进行交互式配置,或者读取以下指南: 运行 `agent-reach configure` 进行交互式配置,或者读取以下指南:
| 功能 | 指南文件 | | 功能 | 指南文件 |
|------|---------| |------|---------|

View file

@ -1,12 +1,71 @@
# 👁️ Agent Reach <h1 align="center">👁️ Agent Reach</h1>
**Give your AI Agent eyes to see the entire internet.** <p align="center">
<strong>Give your AI Agent one-click access to the entire internet</strong>
</p>
Your AI Agent is smart but blind. It can't browse Reddit, search Twitter, or read Bilibili videos. Agent Reach fixes this — once installed, your Agent can search and read content across 10+ platforms. <p align="center">
<a href="../LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg?style=for-the-badge" alt="MIT License"></a>
<a href="https://www.python.org/"><img src="https://img.shields.io/badge/Python-3.10+-green.svg?style=for-the-badge&logo=python&logoColor=white" alt="Python 3.10+"></a>
<a href="https://github.com/Panniantong/agent-reach/stargazers"><img src="https://img.shields.io/github/stars/Panniantong/agent-reach?style=for-the-badge" alt="GitHub Stars"></a>
</p>
> Install once. Superpowers unlocked. Most features work with zero config, zero cost. <p align="center">
<a href="#get-started-in-30-seconds">Quick Start</a> · <a href="../README.md">中文</a> · <a href="#supported-platforms">Platforms</a> · <a href="#design-philosophy">Philosophy</a>
</p>
[中文文档](../README.md) ---
## Why Agent Reach?
AI Agents can already access the internet — but "can go online" is barely the start.
The most valuable information lives across social and niche platforms: Twitter discussions, Reddit feedback, XiaoHongShu reviews, Bilibili videos, GitHub activity… **These are where information density is highest**, but each platform has its own barriers:
| Pain Point | Reality |
|------------|---------|
| Twitter API | Starts at $100/month |
| Reddit | Server IPs get 403'd |
| XiaoHongShu | Login required to browse |
| Bilibili | Blocks overseas/server IPs |
To connect your Agent to these platforms, you'd have to find tools, install dependencies, and debug configs — one by one.
**Agent Reach turns this into one command:**
```
Install Agent Reach: https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md
```
Copy that to your Agent. 30 seconds later, it can read tweets, search Reddit, and watch Bilibili.
### ✅ Before you start, you might want to know
| | |
|---|---|
| 💰 **Completely free** | All tools are open source, all APIs are free. The only possible cost is a server proxy ($1/month) — local computers don't need one |
| 🔒 **Privacy safe** | Cookies stay local. Never uploaded. Fully open source — audit anytime |
| 🔄 **Kept up to date** | Upstream tools (yt-dlp, birdx, Jina Reader, etc.) are tracked and updated regularly |
| 🤖 **Works with any Agent** | Claude Code, OpenClaw, Cursor, Windsurf… any Agent that can run commands |
| 🩺 **Built-in diagnostics** | `agent-reach doctor` — one command shows what works, what doesn't, and how to fix it |
---
## Supported Platforms
| Platform | Capabilities | Setup | Notes |
|----------|-------------|:-----:|-------|
| 🌐 **Web** | Read | Zero config | Any URL → clean Markdown ([Jina Reader](https://github.com/jina-ai/reader) ⭐9.8K) |
| 🐦 **Twitter/X** | Read · Search | Zero config / Cookie | Single tweets readable out of the box. Cookie unlocks search, timeline, posting ([birdx](https://github.com/runesleo/birdx)) |
| 📕 **XiaoHongShu** | Read · Search · **Post · Comment · Like** | Cookie | Full functionality with browser cookie |
| 🔍 **Web Search** | Search | Free key | One key unlocks web + Reddit + Twitter search ([Exa](https://exa.ai), free 1000/month) |
| 📦 **GitHub** | Read · Search | Zero config | Public repos work immediately. `gh` CLI or token unlocks Fork, Issue, PR |
| 📺 **YouTube** | Read | Zero config | Subtitles from 1800+ video sites ([yt-dlp](https://github.com/yt-dlp/yt-dlp) ⭐148K) |
| 📺 **Bilibili** | Read | Zero config / Proxy | Video info + subtitles. Local works directly, servers need a proxy |
| 📡 **RSS** | Read | Zero config | Any RSS/Atom feed ([feedparser](https://github.com/kurtmckee/feedparser) ⭐2.3K) |
| 📖 **Reddit** | Search · Read | Free / Proxy | Search via Exa (free). Reading posts needs a proxy on servers. OAuth bot unlocks posting |
> **Setup levels:** Zero config = install and go · Free key = 30-second signup · Cookie = export from browser · Proxy = $1/month
--- ---
@ -18,7 +77,7 @@ Copy this to your AI Agent (Claude Code, OpenClaw, Cursor, etc.):
Install Agent Reach: https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md Install Agent Reach: https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md
``` ```
Your Agent handles everything. You answer 1-2 questions at most. The Agent auto-installs, detects your environment, and tells you what's ready.
<details> <details>
<summary>Manual install</summary> <summary>Manual install</summary>
@ -26,7 +85,6 @@ Your Agent handles everything. You answer 1-2 questions at most.
```bash ```bash
pip install https://github.com/Panniantong/agent-reach/archive/main.zip pip install https://github.com/Panniantong/agent-reach/archive/main.zip
agent-reach install --env=auto agent-reach install --env=auto
agent-reach doctor
``` ```
</details> </details>
@ -34,97 +92,114 @@ agent-reach doctor
## Works Out of the Box ## Works Out of the Box
No configuration needed: No configuration needed — just tell your Agent:
- 🌐 **Web pages** — read any URL - "Read this link" → any web page
- 📦 **GitHub** — repos, issues, PRs, code search - "What's this GitHub repo about?" → repos, issues, code
- 📺 **YouTube** — video transcripts - "What does this video cover?" → YouTube / Bilibili subtitles
- 📺 **Bilibili** — video info + subtitles - "Read this tweet" → Twitter posts
- 📡 **RSS** — any feed - "Subscribe to this RSS" → RSS / Atom feeds
- 🐦 **Twitter** — read individual tweets - "Search GitHub for LLM frameworks" → GitHub search
```bash **No commands to remember.** The Agent knows what to call.
agent-reach read "https://github.com/openai/gpt-4"
agent-reach search-github "LLM framework" ---
## Unlock on Demand
Don't use it? Don't configure it. Every step is optional.
### 🔍 Search — Free, 30 seconds
Go to [exa.ai](https://exa.ai), sign up for a free key (1000 searches/month), and send it to your Agent. One key unlocks web search + Reddit search + Twitter search.
### 🍪 Cookies — Free, 2 minutes
Tell your Agent "help me configure Twitter cookies" or "set up XiaoHongShu" — it'll guide you through exporting from your browser. Local computers can auto-import.
### 🌐 Proxy — $1/month, servers only
Reddit and Bilibili block server IPs. Get a proxy ([Webshare](https://webshare.io) recommended, $1/month) and send the address to your Agent.
> Local computers don't need a proxy. Reddit search works free via Exa even without one.
---
## Status at a Glance
```
$ agent-reach doctor
👁️ Agent Reach Status
========================================
✅ Ready to use:
✅ GitHub repos and code — public repos readable and searchable
✅ Twitter/X tweets — readable. Cookie unlocks search and posting
✅ YouTube video subtitles — yt-dlp
⚠️ Bilibili video info — server IPs may be blocked, configure proxy
✅ RSS/Atom feeds — feedparser
✅ Web pages (any URL) — Jina Reader API
🔍 Search (free Exa key to unlock):
⬜ Web semantic search — sign up at exa.ai for free key
🔧 Configurable:
⬜ Reddit posts and comments — search via Exa (free). Reading needs proxy
⬜ XiaoHongShu notes — needs cookie. Export from browser
Status: 6/9 channels available
``` ```
--- ---
## One Key Unlocks Search ## Design Philosophy
Sign up at [Exa](https://exa.ai) (free, 1000 searches/month). One key unlocks **web + Reddit + Twitter search**: **Agent Reach is a setup scaffold, not a framework.**
Every time you spin up a new Agent, you spend time finding tools, installing deps, and debugging configs — what reads Twitter? How do you bypass Reddit blocks? How do you extract YouTube subtitles? Every time, you re-do the same work.
Agent Reach does one simple thing: **it makes those tool selection and configuration decisions for you.**
| Scenario | Tool | Why |
|----------|------|-----|
| Read web pages | [Jina Reader](https://github.com/jina-ai/reader) | 9.8K stars, free, no API key needed |
| Read tweets | [birdx](https://github.com/runesleo/birdx) | Cookie auth, no $100/month official API |
| Extract subtitles | [yt-dlp](https://github.com/yt-dlp/yt-dlp) | 148K stars, 1800+ video sites |
| Search the web | [Exa](https://exa.ai) | AI semantic search, 1000 free/month |
| Read RSS | [feedparser](https://github.com/kurtmckee/feedparser) | Python ecosystem standard, 2.3K stars |
One file per platform, ~50 lines each. Swap any backend by editing one file — everything else stays untouched.
<details>
<summary>Project structure</summary>
```bash
agent-reach configure exa-key YOUR_KEY
agent-reach search "best open source LLM 2025"
agent-reach search-reddit "self-hosted LLM" --sub LocalLLaMA
agent-reach search-twitter "AI agent"
``` ```
agent_reach/channels/
├── web.py → Jina Reader
├── twitter.py → birdx
├── youtube.py → yt-dlp
├── github.py → GitHub API
├── bilibili.py → Bilibili API
├── reddit.py → Reddit JSON API
├── xiaohongshu.py → XHS Web API
├── rss.py → feedparser
└── exa_search.py → Exa Search API
```
</details>
--- ---
## Unlock More ## Contributing
### 🍪 Cookie-based (free, 2 minutes) [Issues](https://github.com/Panniantong/agent-reach/issues) and [PRs](https://github.com/Panniantong/agent-reach/pulls) welcome.
```bash Want to add a new platform? Copy any channel file, tweak it — each one is only ~50 lines.
# Local: auto-import all cookies
agent-reach configure --from-browser chrome
# Server: use Cookie-Editor extension, export Header String
agent-reach configure twitter-cookies "cookie_string"
agent-reach configure xhs-cookie "cookie_string"
```
Unlocks: Twitter deep search, XiaoHongShu notes
### 🌐 Proxy ($1/month, servers only)
Reddit and Bilibili block server IPs. Local computers are fine.
```bash
agent-reach configure proxy http://user:pass@ip:port
```
Recommend [Webshare](https://webshare.io). One proxy covers both Reddit and Bilibili.
---
## Three Ways to Use
**CLI** · **Python API** · **MCP Server**
```bash
agent-reach read "URL"
agent-reach search "query"
agent-reach doctor
```
```python
from agent_reach import AgentReach
eyes = AgentReach()
result = asyncio.run(eyes.read("https://example.com"))
```
```json
{"mcpServers": {"agent-reach": {"command": "python", "args": ["-m", "agent_reach.integrations.mcp_server"]}}}
```
---
## Why Agent Reach?
Not a framework. Not an SDK. Just glue — beautifully simple glue.
- Aggregates the best free tools: Jina Reader, birdx, yt-dlp, Exa, feedparser
- Each channel is ~50 lines. Swap any backend by editing one file.
- CLI, MCP Server, Python API
- 99% free. The remaining 1% costs $1/month.
## Credits ## Credits
[Jina Reader](https://r.jina.ai) · [birdx](https://github.com/runesleo/birdx) · [Exa](https://exa.ai) · [yt-dlp](https://github.com/yt-dlp/yt-dlp) · [feedparser](https://github.com/kurtmckee/feedparser) [Jina Reader](https://github.com/jina-ai/reader) · [yt-dlp](https://github.com/yt-dlp/yt-dlp) · [birdx](https://github.com/runesleo/birdx) · [Exa](https://exa.ai) · [feedparser](https://github.com/kurtmckee/feedparser)
## License ## License
MIT [MIT](../LICENSE)

BIN
docs/assets/logo-1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

34
docs/assets/logo-1.svg Normal file
View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
<defs>
<linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#0066FF"/>
<stop offset="100%" style="stop-color:#00AAFF"/>
</linearGradient>
<clipPath id="clip-circle">
<circle cx="256" cy="256" r="140"/>
</clipPath>
</defs>
<rect width="512" height="512" fill="#0A0A1A"/>
<!-- 外圆环 - "边界" -->
<circle cx="256" cy="256" r="160" fill="none" stroke="url(#grad1)" stroke-width="8" opacity="0.3"/>
<circle cx="256" cy="256" r="140" fill="none" stroke="url(#grad1)" stroke-width="3" opacity="0.6"/>
<!-- 内部Agent 核心点 -->
<circle cx="220" cy="256" r="24" fill="url(#grad1)"/>
<!-- "穿越"弧线 — 从核心出发,穿过圆环边界,延伸到外面 -->
<path d="M 230 256 Q 320 180, 420 200"
fill="none" stroke="url(#grad1)" stroke-width="6" stroke-linecap="round" opacity="0.9"/>
<path d="M 230 256 Q 320 256, 420 256"
fill="none" stroke="url(#grad1)" stroke-width="6" stroke-linecap="round" opacity="0.7"/>
<path d="M 230 256 Q 320 330, 420 312"
fill="none" stroke="url(#grad1)" stroke-width="6" stroke-linecap="round" opacity="0.5"/>
<!-- 目标点:穿越后的落脚 -->
<circle cx="420" cy="200" r="8" fill="#00AAFF" opacity="0.9"/>
<circle cx="420" cy="256" r="8" fill="#00AAFF" opacity="0.7"/>
<circle cx="420" cy="312" r="8" fill="#00AAFF" opacity="0.5"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
docs/assets/logo-2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

51
docs/assets/logo-2.svg Normal file
View file

@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
<defs>
<radialGradient id="glow2" cx="50%" cy="50%" r="50%">
<stop offset="0%" style="stop-color:#0066FF;stop-opacity:0.3"/>
<stop offset="100%" style="stop-color:#0066FF;stop-opacity:0"/>
</radialGradient>
<linearGradient id="line-grad" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" style="stop-color:#0066FF"/>
<stop offset="100%" style="stop-color:#00CCFF"/>
</linearGradient>
</defs>
<rect width="512" height="512" fill="#0A0A1A"/>
<!-- 光晕背景 -->
<circle cx="230" cy="256" r="200" fill="url(#glow2)"/>
<!-- 连接线 — 6 条,不同长度、粗细、透明度 -->
<line x1="230" y1="256" x2="130" y2="140" stroke="#0066FF" stroke-width="2" opacity="0.4"/>
<line x1="230" y1="256" x2="100" y2="256" stroke="#0066FF" stroke-width="2" opacity="0.35"/>
<line x1="230" y1="256" x2="130" y2="372" stroke="#0066FF" stroke-width="2" opacity="0.3"/>
<line x1="230" y1="256" x2="310" y2="140" stroke="#0066FF" stroke-width="2" opacity="0.45"/>
<line x1="230" y1="256" x2="310" y2="372" stroke="#0066FF" stroke-width="2" opacity="0.35"/>
<!-- "Reach" 线 — 更长、更粗、有渐变 -->
<line x1="230" y1="256" x2="440" y2="220" stroke="url(#line-grad)" stroke-width="4" opacity="0.9"/>
<!-- 中心Agent 核心 -->
<polygon points="230,232 246,248 246,264 230,280 214,264 214,248"
fill="#0066FF" opacity="0.9"/>
<circle cx="230" cy="256" r="10" fill="#00CCFF"/>
<!-- 普通节点 -->
<circle cx="130" cy="140" r="6" fill="#0066FF" opacity="0.4"/>
<circle cx="100" cy="256" r="6" fill="#0066FF" opacity="0.35"/>
<circle cx="130" cy="372" r="6" fill="#0066FF" opacity="0.3"/>
<circle cx="310" cy="140" r="6" fill="#0066FF" opacity="0.45"/>
<circle cx="310" cy="372" r="6" fill="#0066FF" opacity="0.35"/>
<!-- "Reach" 节点 — 更大,带光环 -->
<circle cx="440" cy="220" r="20" fill="#0066FF" opacity="0.15"/>
<circle cx="440" cy="220" r="12" fill="#00AAFF" opacity="0.6"/>
<circle cx="440" cy="220" r="6" fill="#00CCFF" opacity="0.9"/>
<!-- Reach 节点的信号弧 -->
<path d="M 454 200 A 20 20 0 0 1 454 240"
fill="none" stroke="#00CCFF" stroke-width="2" stroke-linecap="round" opacity="0.5"/>
<path d="M 464 192 A 30 30 0 0 1 464 248"
fill="none" stroke="#00CCFF" stroke-width="1.5" stroke-linecap="round" opacity="0.3"/>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
docs/assets/logo-3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

34
docs/assets/logo-3.svg Normal file
View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512">
<defs>
<linearGradient id="grad3" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#0066FF"/>
<stop offset="100%" style="stop-color:#00BBFF"/>
</linearGradient>
</defs>
<rect width="512" height="512" fill="#0A0A1A"/>
<!-- 容器圆环 -->
<circle cx="240" cy="256" r="155" fill="none" stroke="url(#grad3)" stroke-width="4" opacity="0.5"/>
<!-- 字母 A — 极简三角 -->
<path d="M 160 360 L 220 150 L 280 360"
fill="none" stroke="#0066FF" stroke-width="14" stroke-linecap="round" stroke-linejoin="round"/>
<!-- A 的横线 -->
<line x1="178" y1="290" x2="262" y2="290" stroke="#0066FF" stroke-width="10" stroke-linecap="round"/>
<!-- 字母 R — 共用 A 的右竖线 -->
<!-- R 的弧顶 -->
<path d="M 280 360 L 280 150 Q 340 150, 340 210 Q 340 270, 280 270"
fill="none" stroke="#00AAFF" stroke-width="14" stroke-linecap="round" stroke-linejoin="round"/>
<!-- R 的腿 — "Reach" 线,穿出圆环 -->
<line x1="300" y1="270" x2="420" y2="390"
stroke="url(#grad3)" stroke-width="10" stroke-linecap="round"/>
<!-- Reach 末端信号 -->
<circle cx="420" cy="390" r="8" fill="#00CCFF" opacity="0.8"/>
<circle cx="420" cy="390" r="16" fill="none" stroke="#00CCFF" stroke-width="2" opacity="0.4"/>
<circle cx="420" cy="390" r="26" fill="none" stroke="#00CCFF" stroke-width="1.5" opacity="0.2"/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -1,5 +1,5 @@
#!/bin/bash #!/bin/bash
# sync-upstream.sh — Sync readers from x-reader upstream # sync-upstream.sh — Sync channel implementations from upstream tools
# #
# Usage: ./scripts/sync-upstream.sh # Usage: ./scripts/sync-upstream.sh
# #
@ -12,9 +12,9 @@ set -e
UPSTREAM_REPO="runesleo/x-reader" UPSTREAM_REPO="runesleo/x-reader"
UPSTREAM_BRANCH="main" UPSTREAM_BRANCH="main"
UPSTREAM_DIR="x_reader/fetchers" UPSTREAM_DIR="x_reader/fetchers"
LOCAL_DIR="agent_eyes/readers" LOCAL_DIR="agent_reach/channels"
echo "👁️ Agent Eyes — Upstream Sync" echo "👁️ Agent Reach — Upstream Sync"
echo "Checking for updates from $UPSTREAM_REPO..." echo "Checking for updates from $UPSTREAM_REPO..."
echo "" echo ""
@ -48,9 +48,9 @@ for upstream_file in "$TMPDIR/upstream/$UPSTREAM_DIR"/*.py; do
fi fi
# Compare (ignoring import path differences) # Compare (ignoring import path differences)
if ! diff -q <(sed 's/x_reader\.fetchers/agent_eyes.readers/g' "$upstream_file") "$local_file" > /dev/null 2>&1; then if ! diff -q <(sed 's/x_reader\.fetchers/agent_reach.channels/g' "$upstream_file") "$local_file" > /dev/null 2>&1; then
echo "📝 CHANGED: $filename" echo "📝 CHANGED: $filename"
diff --color -u <(sed 's/x_reader\.fetchers/agent_eyes.readers/g' "$upstream_file") "$local_file" | head -20 diff --color -u <(sed 's/x_reader\.fetchers/agent_reach.channels/g' "$upstream_file") "$local_file" | head -20
echo " ..." echo " ..."
echo "" echo ""
CHANGES=$((CHANGES + 1)) CHANGES=$((CHANGES + 1))
@ -58,7 +58,7 @@ for upstream_file in "$TMPDIR/upstream/$UPSTREAM_DIR"/*.py; do
done done
if [ $CHANGES -eq 0 ]; then if [ $CHANGES -eq 0 ]; then
echo "✅ All readers are up to date with upstream!" echo "✅ All channels are up to date with upstream!"
else else
echo "" echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@ -66,7 +66,7 @@ else
echo "" echo ""
echo "To merge a specific file:" echo "To merge a specific file:"
echo " cp $TMPDIR/upstream/$UPSTREAM_DIR/FILENAME.py $LOCAL_DIR/FILENAME.py" echo " cp $TMPDIR/upstream/$UPSTREAM_DIR/FILENAME.py $LOCAL_DIR/FILENAME.py"
echo " sed -i 's/x_reader\\.fetchers/agent_eyes.readers/g' $LOCAL_DIR/FILENAME.py" echo " sed -i 's/x_reader\\.fetchers/agent_reach.channels/g' $LOCAL_DIR/FILENAME.py"
echo "" echo ""
echo "Then review changes, run tests, and commit." echo "Then review changes, run tests, and commit."
fi fi