1实现原理 · 为什么它能做到
GEO-first 的六维加权评分是整套工具的主轴:AI 可引用性权重最高(25%),品牌权威 20%、内容 E-E-A-T 20%,传统技术 SEO 只剩 15%、结构化数据 10%、平台面 10%;公式、0-100 分档与 Critical/High/Medium/Low 整改时限都写死在技能文件里,agent 的自由裁量被压缩成『按 rubric 给六个分』。
GEO_Score = (Citability * 0.25) + (Brand * 0.20) + (EEAT * 0.20) + (Technical * 0.15) + (Schema * 0.10) + (Platform * 0.10)
可引用性(citability)不是口号而是可执行代码:citability_scorer.py 把『AI 偏爱 134-167 词、自洽、含事实数字的段落』落成五个维度的正则打分器(答案块 30 / 自洽 25 / 结构 20 / 统计密度 15 / 独特性 10),逐段 0-100 并给 A-F 档。
if 134 <= word_count <= 167:
全站审计靠 5 个并行 subagent 分工:geo/SKILL.md 用表格把每个 agent 文件与它负责的子技能绑好,主 skill 只做 Phase 1 探测、Phase 2 并发委派、Phase 3 合成。
Launch these 5 subagents simultaneously:
AI 爬虫准入判定有实体依据:fetch_page.py 内硬编码 14 个 AI/搜索爬虫名单并逐条解析 robots.txt,agent 侧再给 100 分制扣分规则(关键爬虫被封各扣 15 分、次级各扣 5 分、无 sitemap 引用再扣 10 分)。
ai_crawlers = [ "GPTBot", "OAI-SearchBot",
llms.txt 既能校验也能生成:脚本按『H1 标题 / > 描述 / ## 分节 / 链接条目』四项判定 format_valid 并逐条给 issues,generate 模式爬首页+内链(默认 30 页)输出 llms.txt 与 llms-full.txt 文本。
result["format_valid"] = (
品牌提及扫描是『半个真调用 + 半个交办』:Wikipedia/Wikidata 走真实 API 请求给出 yes/no 结论,YouTube/Reddit/LinkedIn/G2 等其余平台只生成 search_url 与核查清单,真实抓取交给 agent 的 WebFetch/搜索。
api_url = f"https://en.wikipedia.org/w/api.php?action=query&list=search&srsearch={quote_plus(brand_name)}&format=json"
PDF 交付物零 Python 依赖:v2.0.0 的 geo-report-pdf 用 pandoc 把 GEO-AUDIT-REPORT.md 渲染成自包含 HTML(自带封面模板 + CSS),再用本机 Google Chrome headless 打印成 PDF;分数与严重度上色由模板内联 JS 在打印前完成。
No Python dependencies. No ReportLab. No JSON data wrangling.
/geo update 是一条自更新通道:clone 上游 main(--depth 1,无 commit pin、无校验),diff 后把 geo/、skills/、agents/、scripts/、schema/ 覆盖到 ~/.claude/,再 pip install -r 更新依赖,并且明确不删除本地已定制文件。
git clone --depth 1 https://github.com/zubair-trabzada/geo-seo-claude.git "$TEMP_DIR/repo"
2核心能力
3外部依赖
| 类型 | 依赖 |
|---|---|
| package | requests |
| package | beautifulsoup4 |
| package | lxml(BeautifulSoup 解析器) |
| package | playwright(可选,截图用;安装器会拉 Chromium 二进制) |
| package | flask(CRM Web 看板) |
| package | rich(终端 CRM 看板) |
| package | Pillow / urllib3 / validators(requirements 其余依赖,脚本中未直接调用点) |
| cli | pandoc |
| cli | Google Chrome(headless 打印 PDF) |
| cli | git(安装与 /geo update 拉取上游) |
| cli | uv(可选,加速 venv/依赖安装) |
| api | Wikipedia MediaWiki 搜索 API |
| api | Wikidata wbsearchentities API |
| network | 被审计目标站点本身(任意 http/https 主机,含 /robots.txt、/llms.txt、/llms-full.txt、/sitemap.xml、/sitemap_index.xml 及页面与页面内同域链接) |
| network | Google Fonts(PDF 样式表 @import,pandoc/Chrome 渲染时取字体) |
| network | Bootstrap 与 HTMX CDN(CRM Web 看板模板) |
| network | raw.githubusercontent.com 一键安装(curl 管道执行 install.sh,不进 skill 运行时) |
| api | GitHub REST stargazers API(仅 CI 生成星标图,不进 skill 运行路径) |
4风险提醒 风险提醒:黄色 · 留意使用
- 文档与代码不同步,会让用户走不通路径或误解能力。 — README/docs/commands-reference 仍写 scripts/generate_pdf_report.py + ReportLab(文件不存在、依赖未列),现行 PDF 走 pandoc+Chrome;子技能数量三处互斥(README/architecture 13、geo/SKILL.md 14、实际 15);router 的 /geo page 与 /geo quick 无对应子技能目录。
- 品牌提及能力表述夸大。 — brand_scanner.py 仅对 Wikipedia/Wikidata 发真实请求,YouTube/Reddit/LinkedIn 及 7 个其它平台只输出 search_url 与核查清单,靠 agent 的 WebFetch/搜索补完;对外交付时说成『已扫描 N 个平台』会高估证据强度。
- prompt injection → 执行权:不可信页面内容进入上下文,同时 Bash/Write 被授权且无隔离约定。 — 被审计站点的 HTML/文本经脚本与 WebFetch 进入模型上下文,而主/子技能声明 Bash + Write;文档未要求把外部内容当数据而非指令,也未要求执行前确认。结果是审计结论可能被对抗文本污染(并交付给客户),或被诱导执行命令——必须人工复核外部触发的命令与报告结论。
- 安装/自更新链路无 pin、无校验。 — README 一键安装为 `curl -fsSL .../install.sh | bash`;/geo update 无 commit pin 地 clone 上游 main、覆盖 ~/.claude 下已安装文件并 pip install -r;install-win.sh 用 pip install --user 写用户级 Python,与 README 的隔离 venv 承诺在 Windows 路径上不符。
- 启发式分数容易被误当实测事实。 — citability/robots/SSR 判定均为正则与阈值启发式(如 SSR 以 root 容器 <50 字符且整页 <200 词判为客户端渲染),不执行 JS、不查询任何 AI 平台;所谓『AI 可见性分数』是本工具自洽的近似值,客户报告应标注方法论与误差来源,避免被当成真实引用率。
- 客户数据与本地看板:~/.geo-prospects 含联系人/合同额,卸载不清除,Web 看板无鉴权。 — app.py/crm_dashboard.py 直接读写 ~/.geo-prospects/prospects.json,Flask 服务监听本机 5050(默认 127.0.0.1,无认证机制);uninstall.sh 明确保留该目录('Note: Prospect data at ~/.geo-prospects/ was not removed.'),多人共用机器时需自行管理隐私数据。
5第二遍独立确认
- [ok] skill.path 定位 — 候选位置逐一排查:仓库根无 SKILL.md(git ls-tree 确认根目录只有 README/LICENSE/install*/uninstall/requirements 与各功能目录);`geo/SKILL.md` 是唯一带 `name: geo` 的路由入口,frontmatter 声明 17 条 /geo 命令并提供 sub-skill/agent 分工表;install.sh 把 `geo/` 装成 ~/.claude/skills/geo 并把 `$INSTALL_DIR/SKILL.md` 当作主技能文件(`INSTALL_DIR="${SKILLS_DIR}/geo"`),geo-update 亦称 Main skill = ~/.claude/skills/geo/;docs/architecture.md 与 README 同称 'geo/ # Main skill orchestrator'。skills/* 是子技能(无 flagship 地位,安装时被平铺到 ~/.claude/skills/geo-*)。故取 skill.path="geo"——仓库根不是 skill,子技能目录是下级组件。
- [discrepancy] README/docs 的 PDF 实现描述(generate_pdf_report.py + ReportLab) — README 架构图写 '│ ├── generate_pdf_report.py # PDF report generator (ReportLab)',docs/commands-reference.md 写 '- Calls `python3 ~/.claude/skills/geo/scripts/generate_pdf_report.py` (requires `pip install reportlab`).';但 71 个受管文件中并无该脚本,requirements.txt 没有 reportlab,现行 skills/geo-report-pdf/SKILL.md(version 2.0.0)明确 'No Python dependencies. No ReportLab.',改用 pandoc + Chrome headless + 仓内模板/CSS。结论:README 与 commands-reference 是未同步的旧文档,应以 geo-report-pdf v2.0.0 为准。
- [discrepancy] 子技能数量与实际目录数 — 三处口径互斥:README '├── skills/ # 13 specialized sub-skills'、docs/architecture.md 同写 13;geo/SKILL.md 标题 '## Sub-Skills (14 Specialized Components)' 且表格缺 geo-report-pdf;实际 `skills/` 下有 15 个目录(含 geo-report-pdf)。另外 router 命令表共 17 条命令,其中 `/geo page` 与 `/geo quick` 没有对应子技能目录(由其它技能组合实现)。用户按文档理解能力边界会有偏差。
- [discrepancy] 品牌提及『扫描 10+ 平台』的夸大检查 — README 称 'Scans YouTube, Reddit, Wikipedia, LinkedIn, and 7+ other platforms'。实读 scripts/brand_scanner.py:只有 Wikipedia API 与 Wikidata API 两处 requests.get 是真实网络判定;YouTube/Reddit/LinkedIn/Quora/Stack Overflow/GitHub/Crunchbase/Product Hunt/G2/Trustpilot 分支仅返回 search_url + check_instructions,并由代码注释明示 'Actual YouTube API would be used in production / This provides the framework for Claude Code to use WebFetch'。属能力边界夸大(真实核查转由 agent 的 WebFetch/搜索完成)。
- [discrepancy] 安装器『隔离 venv、不动系统 Python』承诺 — README 声明 'Python dependencies are installed into a dedicated virtual environment at `~/.claude/skills/geo/.venv/`. Your system Python is **not** touched',install.sh 确实如此(venv + `uv pip install --python "$VENV_PY"`/`$VENV_PY -m pip install` + 把脚本 shebang 与 SKILL.md 中 python3 调用 sed 成 venv 解释器)。但 install-win.sh 走的是 `$PYTHON_CMD -m pip install --user -r "$SOURCE_DIR/requirements.txt"`(写用户级 site-packages),与承诺不符;/geo update 也用 `python3 -m pip install -r ...`(非 venv 路径)。
- [ok] hooks 安装路径 — 两个安装器都 `mkdir -p "$INSTALL_DIR/scripts" "$INSTALL_DIR/schema" "$INSTALL_DIR/hooks"` 并在 `[ -d "$SOURCE_DIR/hooks" ]` 守卫下复制 hooks;仓库内确无 hooks/ 目录(本地 ls 报 No such file or directory,git ls-tree 亦无),故该分支在源码态为惰性空操作,不构成未列出的执行面。
- [ok] 全部 external_deps 二次定位 — 18 条依赖逐条回到调用点复核:requests 在 fetch_page.py/citability_scorer.py/brand_scanner.py/llmstxt_generator.py 四处 requests.get;beautifulsoup4+lxml 在 fetch_page/llmstxt 的 BeautifulSoup(..., "lxml");flask 在 webapp/app.py 顶层 import 且 `app.run(debug=debug, port=5050)`;rich 在 crm_dashboard.py import 块;playwright 由 install.sh 的 venv 内 `-m playwright install chromium` 触发(requirements 亦列 playwright>=1.56.0);pandoc/Chrome/git/uv 均为命令行调用点;Wikipedia/Wikidata/fonts.googleapis.com/jsdelivr/unpkg/api.github.com/raw.githubusercontent.com 均有原文出处。Pillow/urllib3/validators 仅见于 requirements.txt,仓内无直接调用点(已在条目 note 中标注)。
- [ok] 是否漏掉网络调用/隐藏脚本/混淆内容 — 全量 grep `requests\.|urllib|urlopen|getenv|environ|api_key|API_KEY|token|Authorization|https?://` 无遗漏命中:除已列条目外只剩示例/文档里的 schema.org、w3.org 等纯参考资料 URL,无上传/回传/统计端点;全文无 base64 长串、无 eval/exec、无 subprocess 拼装执行远端内容(webapp 与 crm_dashboard 只读写本地 JSON)。资产面 71 文件全部为文本,无二进制/压缩包。
6结论
3a969f95e983e9c4…25f6ae8d6c