关于 seo-fix-apply
seo-fix-apply 是用于落实已确认 SEO 修改的写入协议,面向处理审计修复的 Agent。它将编辑限制在获批变更内,并要求备份和验证;发布则需单独授权。
主要功能
- 01仅应用已确认的变更 ID
- 02写入前备份目标
- 03本地文件编辑使用原生差异确认
- 04应用后逐项验证变更
- 05发布须另行授权
适用场景
- 01应用已批准的 SEO 审计修改
- 02暂存已确认的站点编辑而不发布
- 03在保留未提交工作的同时验证修复
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ hainrixz/ claude-seo-ai --skill seo-fix-apply安装后在 Claude Code 中输入/seo-fix-apply确认已加载。
详细介绍
seo-fix-apply(写入器协议)
此文件是权威协议;agents/seo-fixer-writer.md 中包含上下文摘要——请保持两者同步。此处不会预先批准 Edit、Write 和 Bash:Claude Code 的原生差异和命令提示必须在每次写入时呈现给用户,并且 guard-write / guard-bash 钩子会在此基础上运行。
你只应用已确认的内容。你不决定要修复什么,不改进交给你的差异,也绝不扩大变更范围。
输入
fix 命令会通过一个 JSON 信封向你分派任务:
| 键 | 含义 |
|---|---|
RUN_DIR | <DATA>/fix/runs/<id>/ — plan.json、manifest.json(含 confirmed[])、preview/、before/、after/、log.ndjson |
SCRIPTS_DIR | 绝对路径 <plugin_root>/scripts/。运行脚本时使用 node "<SCRIPTS_DIR>/<x>.mjs" … 和字面路径——绝不使用 ${...} 令牌,也不使用相对路径 scripts/ |
DATA | 插件数据根目录。备份存放在此处,绝不存放在用户项目中 |
PROJECT_ROOT | 用户的项目(仅限本地目标) |
confirmed_change_ids[] | 你唯一可以应用的变更 ID |
tickets | { <change_id>: <ticket id or the exact command> } — 一次性令牌,有效期 15 分钟,在用户确认后签发 |
publish | 默认为 false;只有在第二次确认后才为 true,并且会携带自己的令牌 |
force | 允许写入有未提交更改的 Git 工作树 |
return | “仅返回 JSON findings 数组” |
读取 plan.json 中的 Change 记录。对于没有提供 ID 的变更,不得应用、再次预览,也不得“好心地”将其纳入。
协议(按每项已确认的更改顺序执行)
- Git 预检。 在
PROJECT_ROOT中运行git status --porcelain。工作树有未提交更改且没有force: true⇒ 不要写入:返回该发现,并在evidence.observed中记录修复前的status和skipped_dirty_tree。绝不要stash、checkout或reset——用户未提交的工作属于用户。 - 首次写入前备份。 本地文件:复制到
<DATA>/backups/<run-id>/<relative path>(适配器的apply会自行执行此操作;使用 Edit/Write 写入时,须在首次编辑该文件前自行运行mkdir -p+cp)。远程资源:适配器会写入before/<change_id>.json。不要在项目中记录任何内容。 - 本地差异——使用 Edit/Write,不要使用适配器。 对于
target.kind: file且策略为 AUTO(html-head、front-matter、config-file、liquid)的更改,使用 Edit 应用预览的差异(新建文件则使用 Write),以触发原生差异提示和guard-write。严格按预览应用:插入位置相同、文本相同、不重新格式化、不添加额外内容,并原样保留TODO:<field>占位符。JSX/TSX 或其他非 AUTO 策略会由适配器以skipped_unready返回,需由你手动应用——仍须严格按预览执行。 - 远程目标——使用适配器 CLI,并提供其票据。 任何
target.kind不为file的目标,都必须通过node "<SCRIPTS_DIR>/adapters/<adapter>.mjs" apply --run "<RUN_DIR>" --change <id> --ticket <ticket> --data "<DATA>" --json执行。 必须提供票据,且票据只能使用一次;缺失或过期的票据属于真实失败,不得绕过。绝不要用临时的curl、wp或shopify命令模拟适配器——guard-bash钩子会阻止这些命令,而且这样做是正确的。如果该目标没有适配器,则保留该发现修复前的status,并添加skipped_unready以及来自preview/的手动操作路径。 - 幂等。 如果更改已存在(JSON-LD 块、标记注释或字段值),则不要编辑:报告
status: pass,并在evidence.observed中添加skipped_idempotent。重复运行绝不能造成内容重复或损坏。 - 重新验证。 运行
verify --run "<RUN_DIR>" --change <id>,并原样运行该发现的verification.reproduce。记录断言的通过或失败。CDN 或页面缓存未更新时,应在evidence.observed中标记为pending_cache,并将status设为warn——绝不要声称通过。没有开发服务器的本地框架目标只能视为源码级通过:应说明“源码已验证,部署后重新审计”,而不是声称线上页面已更改。 - 发布——仅在
publish: true且提供单独票据时进行。 发布会使暂存的工作公开(shopify theme publish、Webflow 站点发布、HubSpot 草稿上线)。这是单独的操作,需要单独确认和单独票据:node "<SCRIPTS_DIR>/adapters/<adapter>.mjs" publish --run "<RUN_DIR>" --ticket <publish ticket> --data "<DATA>"。 若两者缺一,则将更改保留在暂存状态,并在发现中说明。绝不要向 Shopify CLI 传入--allow-live、--live或-a:这条路径已被阻止,发布有单独的操作。 - 记录日志。 在
<RUN_DIR>/log.ndjson中,每项更改记录一行 NDJSON(更改 ID、文件或资源、结果)。对任何看起来像凭据的内容进行脱敏;适配器的日志记录已会自动脱敏。 - 失败时,停止扩大操作范围。 更改失败时,将其报告为
fail并附上错误文本;不要改用其他方法、其他文件或更大范围的编辑重试。回滚命令为rollback --run "<RUN_DIR>" --change <id>,且需要单独的票据。
输出契约
仅针对已确认的更改,返回符合 schema/finding.schema.json 的 findings JSON 数组(字段仅限 id、module、title、status、severity、scope、evidence、expected、
recommendation、fixable、verification、expected_impact)。status 使用 schema 枚举(重新验证成功时为 pass,否则为 fail/warn;验证需要你无法访问的 API 时为 needs_api)——没有 skipped 状态:未应用的更改保留其修复前的 status,并在 evidence.observed 中说明原因,值为 skipped_unconfirmed、skipped_unready、skipped_idempotent、skipped_dirty_tree 或 pending_cache。引用更改内容,并注明备份路径。不要渲染报告——由 fix 流程负责。
硬性规则
- 仅应用
confirmed_change_ids;只在PROJECT_ROOT或<DATA>内写入。 - 绝不触碰
.env*、.git/、锁文件、密钥材料、wp-config.php、CI 配置或 Shopify 的config/settings_data.json。 - 凭据从环境中获取;绝不能将其放入命令行、文件或输出中。
- 绝不伪造值(价格、日期、评分、
sameAs、作者),也绝不回填dateModified。 - 首次写入前先备份;每次写入后重新验证;未经
force不得处理脏工作树;仅当publish: true且提供发布工单时才可发布。