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:
parent
5c62a21f32
commit
ebbb69c372
12 changed files with 286 additions and 96 deletions
|
|
@ -1,6 +1,6 @@
|
|||
# Agent Eyes Configuration
|
||||
# Agent Reach Configuration
|
||||
# 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_API_KEY=exa-your-key-here
|
||||
|
|
|
|||
2
.gitignore
vendored
2
.gitignore
vendored
|
|
@ -6,5 +6,5 @@ __pycache__/
|
|||
dist/
|
||||
build/
|
||||
.env
|
||||
.agent-eyes/
|
||||
.agent-reach/
|
||||
*.log
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
||||
<p align="center">
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@ pip install git+https://github.com/Panniantong/agent-reach.git
|
|||
|
||||
## 解锁更多功能
|
||||
|
||||
运行 `agent-reach setup` 进行交互式配置,或者读取以下指南:
|
||||
运行 `agent-reach configure` 进行交互式配置,或者读取以下指南:
|
||||
|
||||
| 功能 | 指南文件 |
|
||||
|------|---------|
|
||||
|
|
|
|||
|
|
@ -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
|
||||
```
|
||||
|
||||
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>
|
||||
<summary>Manual install</summary>
|
||||
|
|
@ -26,7 +85,6 @@ Your Agent handles everything. You answer 1-2 questions at most.
|
|||
```bash
|
||||
pip install https://github.com/Panniantong/agent-reach/archive/main.zip
|
||||
agent-reach install --env=auto
|
||||
agent-reach doctor
|
||||
```
|
||||
</details>
|
||||
|
||||
|
|
@ -34,97 +92,114 @@ agent-reach doctor
|
|||
|
||||
## Works Out of the Box
|
||||
|
||||
No configuration needed:
|
||||
No configuration needed — just tell your Agent:
|
||||
|
||||
- 🌐 **Web pages** — read any URL
|
||||
- 📦 **GitHub** — repos, issues, PRs, code search
|
||||
- 📺 **YouTube** — video transcripts
|
||||
- 📺 **Bilibili** — video info + subtitles
|
||||
- 📡 **RSS** — any feed
|
||||
- 🐦 **Twitter** — read individual tweets
|
||||
- "Read this link" → any web page
|
||||
- "What's this GitHub repo about?" → repos, issues, code
|
||||
- "What does this video cover?" → YouTube / Bilibili subtitles
|
||||
- "Read this tweet" → Twitter posts
|
||||
- "Subscribe to this RSS" → RSS / Atom feeds
|
||||
- "Search GitHub for LLM frameworks" → GitHub search
|
||||
|
||||
```bash
|
||||
agent-reach read "https://github.com/openai/gpt-4"
|
||||
agent-reach search-github "LLM framework"
|
||||
**No commands to remember.** The Agent knows what to call.
|
||||
|
||||
---
|
||||
|
||||
## 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
|
||||
# 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.
|
||||
Want to add a new platform? Copy any channel file, tweak it — each one is only ~50 lines.
|
||||
|
||||
## 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
|
||||
|
||||
MIT
|
||||
[MIT](../LICENSE)
|
||||
|
|
|
|||
BIN
docs/assets/logo-1.png
Normal file
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
34
docs/assets/logo-1.svg
Normal 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
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
51
docs/assets/logo-2.svg
Normal 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
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
34
docs/assets/logo-3.svg
Normal 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 |
|
|
@ -1,5 +1,5 @@
|
|||
#!/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
|
||||
#
|
||||
|
|
@ -12,9 +12,9 @@ set -e
|
|||
UPSTREAM_REPO="runesleo/x-reader"
|
||||
UPSTREAM_BRANCH="main"
|
||||
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 ""
|
||||
|
||||
|
|
@ -48,9 +48,9 @@ for upstream_file in "$TMPDIR/upstream/$UPSTREAM_DIR"/*.py; do
|
|||
fi
|
||||
|
||||
# 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"
|
||||
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 ""
|
||||
CHANGES=$((CHANGES + 1))
|
||||
|
|
@ -58,7 +58,7 @@ for upstream_file in "$TMPDIR/upstream/$UPSTREAM_DIR"/*.py; do
|
|||
done
|
||||
|
||||
if [ $CHANGES -eq 0 ]; then
|
||||
echo "✅ All readers are up to date with upstream!"
|
||||
echo "✅ All channels are up to date with upstream!"
|
||||
else
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
|
|
@ -66,7 +66,7 @@ else
|
|||
echo ""
|
||||
echo "To merge a specific file:"
|
||||
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 "Then review changes, run tests, and commit."
|
||||
fi
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue