用途
seo-audit 用于对目标站点进行每日的页面级(on-page)与技术性(technical)SEO 审计。它面向的是“站点整体”而非抽样模板:发现站点发布的每一个页面,逐页审计,与上一次运行结果对比,并生成报告。
该技能只做页面级与技术性 SEO,不包含关键词研究、排名跟踪或外链分析。如果某项发现需要这些能力,应明确说明,而不是猜测。
主要能力
- 页面发现:以 sitemap 优先。流程为 robots.txt → sitemap.xml(跟随 sitemap 索引),遵守 robots 的 * Disallow 规则;当站点没有 sitemap 时,回退到对首页内部链接的一跳抓取。
- 逐页审计:每个 URL 有独立评分、摘要与发现项(check / status / message / detail)。
- 跨页检查(site_findings):pages_fetched、duplicate_titles、duplicate_descriptions、canonical_targets、sitemap_coverage。这些检查只有在审计整站时才可能实现,例如重复标题、重复 meta 描述、canonical 指向自身页面之外、被链接但缺失于 sitemap 的页面。
- 与上次运行差异对比:识别新增失败、站点分数变动(3 分及以上)、新增/移除页面、新增跨页问题、新出现的坏链,以及已修复项。
- Core Web Vitals(可选):设置 PAGESPEED_API_KEY 后,脚本会纳入 Core Web Vitals,优先使用真实用户字段数据(Chrome UX Report p75:LCP、INP、CLS),优先页面级再站点级,仅在 URL 流量不足时回退到 Lighthouse 实验室分数。站点模式下只采样入口页。未设置时,Core Web Vitals 直接缺失,属于降级运行而非失败。
- 修复清单:每次运行重写 memory/seo-audit/FIXES.md,作为可持续跟进的工作清单,保留历史并标注首次发现时间与已开放运行次数。
- 每日通知:即使没有变化也会发送(只要设置了目标),包含站点分数行、回归项、最弱页面、最高优先级修复项等。
使用方式
目标站点通过变量 ${var} 提供,逗号分隔,填写的是 origin(如 https://www.example.com)而非具体页面。裸主机名会自动补上 https://。若 ${var} 为空,则记录 SEO_NO_TARGET、不发送通知并干净退出,不会使用内置默认站点。
审计命令:
node scripts/seo-audit.mjs --site <origin> --format json
可用参数:--max N(页面上限,默认 50)、--concurrency N(默认 4)。--check-links 建议只在第一个站点使用,它会探测最多 40 个链接,是较慢的部分;站点模式下链接会先跨所有页面去重。
该技能为只读模式(mode: read-only),审计器使用无依赖的 Node 标准库实现,没有安装步骤。技能没有 Write 或 Edit 工具,所有产出文件通过 shell 重定向(>/>>)写入。只读守卫会还原对代码/配置路径的写入,但保留 memory/ 与 output/。
每次运行写入一个以 UTC 时间戳命名的新快照文件(memory/seo-audit/<STAMP>.json),不覆盖已有文件。差异对比的基线是已存在的最新快照(即上一次运行的)。
通知通过 ./notify -f <file>.md 发送,多行内容始终走 -f。通知正文写在 /tmp/ 下,不写入 memory/ 或 output/。指向文件的链接必须是可点击链接,而非裸路径。
适用场景
- 需要每日监控整站页面级与技术性 SEO 状态的站点。
- 需要发现跨页问题(重复标题/描述、canonical 异常、sitemap 覆盖缺口)的场景。
- 需要跟踪 SEO 修复进展、维护长期修复清单的团队。
- 需要将 Core Web Vitals 纳入审计(可选)的场景。
限制
- 仅覆盖页面级与技术性 SEO,不含关键词研究、排名跟踪、外链分析。
- 无内置默认站点,必须显式设置目标。
- 只读模式,无法自行清理旧快照;目录过大时需在带外(写模式维护步骤或手动清理)处理。
- 无 rm 能力,无法自行清理临时文件。
- 差异对比有三条防误报规则:跨审计器版本边界不得声称修复;response_time 不计入修复或回归;修复只能归因于人类可改动的对象(标记、文案、链接、头部)。
- 若某站点无任何页面可抓取,返回 "ok": false 并退出码 1,需记录后继续处理其他站点。
- 通知中不提及缺失的 PAGESPEED_API_KEY。
输出与日志
最终输出以日志记录结尾(守卫会写入 memory/logs/${today}.md 的 ### seo-audit 下),包含每个 URL 的分数、回归项、修复项以及抓取失败的 URL。若 ${var} 为空,只记录一行 SEO_NO_TARGET。