用途
OpenCLI AutoFix 用于自动修复因网站改版而失效的 OpenCLI 适配器。当某条 opencli 命令因为网站改动了 DOM、API 或响应结构而失败时,该技能引导完成诊断、修复适配器并重试,而不是仅报告错误。
适用错误类型
适用于 opencli <site> <command> 出现以下可修复错误时:
- SELECTOR —— 元素未找到(DOM 变化)
- EMPTY_RESULT —— 未返回数据(API 响应变化)
- API_ERROR / NETWORK —— 端点迁移或损坏
- PAGE_CHANGED —— 页面结构不再匹配
- COMMAND_EXEC —— 适配器逻辑运行时错误
- TIMEOUT —— 页面加载方式变化,适配器等待对象错误
前置条件
运行 opencli doctor 以验证扩展与守护进程(daemon)连接。
进入修复前的判断:"空" ≠ "坏"
EMPTY_RESULT(有时还包括结构合法但返回空的 SELECTOR)往往不是适配器 bug。平台会在反爬启发式下主动降级结果,网站返回的“未找到”不代表内容真的缺失。在开始修复前应先排除:
- 用替代查询或入口重试。例如 opencli xiaohongshu search "X" 返回 0,但 opencli xiaohongshu search "X 攻略" 返回 20,说明适配器正常,只是平台对首个查询做了结果塑形。
- 在普通 Chrome 标签页中抽查。若用户在浏览器中能看到数据而适配器返回空,通常是认证状态、限流或软封锁问题,应使用 opencli doctor / 重新登录,而不是改源码。
- 识别软 404。小红书 / 微博 / 抖音等站点在内容被隐藏或删除时返回 HTTP 200 加空载荷而非真正 404,快照结构看起来正常。等 2–3 秒重试常可区分“暂时隐藏”与“确实消失”。
- 搜索结果“0 条”也是一种答案。若适配器成功到达搜索端点、拿到 HTTP 200 且平台返回 results: [],这是有效结果,应告知用户“该查询无匹配”,而非修补适配器。
只有在空结果 / 选择器缺失在多次重试和替代入口下均可复现时,才进入第 1 步。
修复流程
第 1 步:采集诊断上下文。以诊断模式运行失败命令:
OPENCLI_DIAGNOSTIC=1 opencli <site> <command> [args...] 2>diagnostic.json
该命令会在 stderr 的 OPENCLI_DIAGNOSTIC 标记之间输出 RepairContext JSON,包含 error(code、message、hint)、adapter(site、command、sourcePath、source)、page(url、snapshot、networkRequests、consoleErrors)以及 timestamp。可用以下方式提取:
cat diagnostic.json | sed -n '/___OPENCLI_DIAGNOSTIC___/{n;p;}'
第 2 步:分析失败。读取诊断上下文与适配器源码,判定根因并选择修复策略:
- SELECTOR:DOM 重构、class/id 改名 → 探查当前 DOM,寻找新选择器
- EMPTY_RESULT:API 响应结构变化或数据位置迁移 → 查看网络请求,寻找新的响应路径
- API_ERROR:端点 URL 变化、需要新参数 → 通过网络拦截发现新 API
- AUTH_REQUIRED:登录流程变化、cookie 过期 → 停止,提示用户登录,不要改代码
- TIMEOUT:页面加载方式变化、加载动画/懒加载 → 添加或更新等待条件
- PAGE_CHANGED:重大改版 → 可能需整体重写适配器
需回答的关键问题:适配器想做什么(source 字段)、失败时页面是什么样(snapshot 字段)、发生了哪些网络请求(networkRequests)、适配器期望与页面实际之间的差距在哪里。
第 3 步:探查当前网站。使用 opencli browser 检查线上站点,不要使用已损坏的适配器。DOM 变化时:
opencli browser open https://example.com/target-page && opencli browser state
API 变化时,开启网络拦截后再手动触发操作:
opencli browser open https://example.com/target-page && opencli browser state
opencli browser click <N> && opencli browser network
opencli browser network --detail <index>
第 4 步:修补适配器。读取 RepairContext.adapter.sourcePath 指定的文件并做定点修复;该路径是权威位置,可能在仓库的 clis/ 下,也可能在 npm 安装的 ~/.opencli/clis/ 下。
cat <RepairContext.adapter.sourcePath>
常见修复示例(保持代码原样):
-
选择器更新:
// Before: page.evaluate('document.querySelector(".old-class")...') // After: page.evaluate('document.querySelector(".new-class")...')
-
API 端点变更:
// Before: const resp = await page.evaluate(
fetch('/api/v1/old-endpoint')...) // After: const resp = await page.evaluate(fetch('/api/v2/new-endpoint')...) -
响应结构变更:
// Before: const items = data.results // After: const items = data.data.items // API now nests under "data"
-
等待条件更新:
// Before: await page.waitForSelector('.loading-spinner', { hidden: true }) // After: await page.waitForSelector('[data-loaded="true"]')
修补规则:做最小改动,只修坏的部分,不要重构;保持输出结构不变,列和返回格式必须兼容;优先使用 API 而非 DOM 抓取,若探查中发现 JSON API 就切换过去;只使用 @jackwener/opencli/* 导入,绝不添加第三方包导入;修补后要测试,再次运行命令验证。
第 5 步:验证修复。正常运行命令(不带诊断模式):
opencli <site> <command> [args...]
若仍失败,回到第 1 步采集新诊断。修复预算为 3 轮(诊断 → 修复 → 重试)。若修复后同一错误持续出现,尝试不同思路。3 轮后停止并报告已尝试的内容。
安全边界与停止条件
开始任何修复前检查硬性停止条件:
- AUTH_REQUIRED(退出码 77)—— 停止。不要修改代码。提示用户在 Chrome 中登录该站点。
- BROWSER_CONNECT(退出码 69)—— 停止。不要修改代码。提示用户运行 opencli doctor。
- CAPTCHA / 限流 —— 停止。这不是适配器问题。
作用域约束:
- 只修改 RepairContext.adapter.sourcePath 处的文件,这是权威适配器位置(仓库中可能是 clis/<site>/,npm 安装为 ~/.opencli/clis/<site>/)
- 绝不修改 src/、extension/、tests/、package.json 或 tsconfig.json
- 重试预算:每次失败最多 3 轮修复。若 3 轮诊断 → 修复 → 重试仍未解决,停止并报告已尝试内容
硬停止(不修改代码):AUTH_REQUIRED / BROWSER_CONNECT 属于环境问题而非适配器 bug;站点要求验证码无法自动化;被限流 / IP 封锁不属于适配器问题。
软停止(尝试后报告):3 轮修复用尽;功能被彻底移除,数据已不存在;重大改版需要借助 opencli-explorer 技能整体重写适配器。所有停止场景都应向用户清晰说明情况,而不是做无效的修补。
示例修复过程
- 用户运行 opencli zhihu hot,失败:SELECTOR "Could not find element: .HotList-item"
- AI 运行 OPENCLI_DIAGNOSTIC=1 opencli zhihu hot 2>diag.json,获得包含 DOM 快照的 RepairContext
- AI 读取诊断:快照显示页面已加载,但使用的是 ".HotItem" 而非 ".HotList-item"
- AI 探查:opencli browser open https://www.zhihu.com/hot && opencli browser state,确认新类名 ".HotItem" 及子元素 ".HotItem-content"
- AI 修补:编辑 RepairContext.adapter.sourcePath 处的适配器,将 ".HotList-item" 替换为 ".HotItem"
- AI 验证:运行 opencli zhihu hot,成功返回热榜话题
限制
除上述错误类型与硬性停止条件外,该技能的收费、价格、平台支持范围等信息暂未提供。