OpenCLI 项目技术分析报告
目录
执行摘要
OpenCLI 是一个开源的通用 CLI 聚合框架,旨在将任何网站、浏览器会话、Electron 桌面应用或本地工具转化为统一的命令行接口【17†source】。其核心价值在于为人类用户和 AI 代理提供确定性 、零LLM成本 且账号安全 的自动化操作能力【17†source】。通过内置 90+ 适配器和浏览器桥接技术,OpenCLI 实现了从热门社交媒体(如 Bilibili、Zhihu、Xiaohongshu)到开发工具(如 GitHub CLI、Docker)的广泛覆盖【17†source】。同时,它创新性地引入技能(Skills) 机制,使 Claude Code、Cursor 等 AI 代理能够直接驱动浏览器执行任务,而无需人工干预【17†source】。本报告将深入分析 OpenCLI 的技术架构、功能特性、AI 集成能力,并提供详尽的安装与使用指南,以帮助开发者全面了解该项目的技术细节和实用价值。
技术架构分析
核心架构概览
OpenCLI 采用 Node.js 编写,基于 Commander.js 框架构建 CLI 入口,整体架构围绕命令发现与注册 、适配器执行引擎 和浏览器自动化桥接 三大核心模块展开【33†source】。项目源码结构清晰,主要包含以下模块:
命令注册与调度 :通过 registry.ts 实现命令的注册表和生命周期管理,commanderAdapter.ts 负责将注册的命令对接到 Commander 框架【33†source】。启动时,主入口 main.ts 会动态导入 cli.ts 和 discovery.ts 等模块,完成命令的发现与注册【33†source】。
适配器发现与加载 :discovery.ts 提供两种发现模式:快速路径(manifest)和传统文件扫描【35†source】。在生产环境,预先编译的 cli-manifest.json 可让命令注册几乎瞬时完成,模块按需懒加载;在开发环境下,则扫描 clis/ 目录下的 JS 文件动态注册【35†source】。此外,ensureUserCliCompatShims 和 ensureUserAdapters 等函数确保用户目录 ~/.opencli/ 下也具备运行适配器的环境(如创建必要的符号链接和目录结构)【35†source】。
浏览器自动化桥接 :这是 OpenCLI 与网站交互的关键模块。它通过一个轻量级的 Chrome 扩展(Browser Bridge)与本地微守护进程(daemon)协同工作【40†source】。daemon 自动启动并监听在 localhost:19825,作为 CLI 与 Chrome 扩展之间的 WebSocket 中继【40†source】。当执行浏览器相关命令时,CLI 通过 daemon 将指令发送给 Chrome 扩展,扩展在已登录的浏览器环境中执行 JavaScript,从而操作网页【40†source】。这种架构确保复用用户已登录的会话 ,无需重复登录,实现“账号安全”和“零风控”【17†source】。
命令执行引擎 :cli.ts 中定义了实际的命令处理逻辑,包括内置命令和动态适配器命令的执行【37†source】。内置命令如 list、doctor、daemon 等直接在此实现;对于动态适配器命令,则通过 commanderAdapter 注册后,由 runCli 框架调度执行【33†source】。执行引擎负责解析命令参数、调用适配器逻辑,并将结果通过 output.ts 渲染成表格、JSON、YAML 等多种格式【33†source】。
扩展与插件体系 :OpenCLI 设计了完善的插件机制,允许社区贡献新的适配器【17†source】。plugin.ts 和 plugin-scaffold.ts 等模块负责插件的安装、列表、更新和卸载等管理功能【33†source】。插件本质上是符合规范的适配器包,可从 GitHub 仓库安装,扩展 OpenCLI 的命令集【17†source】。
整体而言,OpenCLI 的架构在保证高性能启动 (通过 manifest 缓存和并行发现)的同时,实现了高度解耦 和可扩展性 。各模块职责分明:注册表管理命令元数据,适配器负责具体逻辑,浏览器桥接提供统一的自动化能力,而插件体系则为生态扩展预留了空间。
代码组织与模块划分
OpenCLI 的源码按照功能模块进行组织,主要目录结构如下:
src/ :核心代码目录,采用 TypeScript 编写,编译后输出到 dist/src/。主要模块包括:
main.ts:程序入口,负责初始化环境、动态导入核心模块并启动 CLI【33†source】。
cli.ts:定义内置命令和执行逻辑,如 list、validate、explore 等,以及适配器命令的执行流程【37†source】。
registry.ts:命令注册表,管理所有已知命令的元数据(站点、名称、策略、参数、列定义等)【37†source】。
discovery.ts:命令发现机制,实现 manifest 快速加载和文件系统扫描两种模式【35†source】。
browser/:浏览器自动化相关模块,包括与 daemon 通信的客户端、目标解析、网络请求拦截、页面分析等【37†source】。
commands/:一些独立的命令模块,如 daemon.ts 提供 daemon 管理,doctor.ts 提供诊断等【37†source】。
output.ts、serialization.ts:输出格式化和序列化,将命令结果转换为表格、JSON、YAML、Markdown、CSV 等格式【33†source】。
plugin.ts、plugin-scaffold.ts:插件管理,包括安装、列表、卸载等【33†source】。
launcher.ts、runtime.ts、diagnostic.ts:辅助模块,如进程启动、运行时检测、诊断信息收集等【33†source】。
clis/ :适配器脚本目录,按站点分组织。每个站点一个子目录,其中包含该站点下所有命令的 JS 文件。例如 clis/hackernews/top.js 定义了 HackerNews 的“top”命令【44†source】。这些适配器文件使用 OpenCLI 提供的注册 API(如 cli())声明命令元数据和执行逻辑【44†source】。
extension/ :Chrome 扩展源码目录,包含 Browser Bridge 扩展的实现。该扩展负责在浏览器中执行由 CLI 发来的自动化指令,并与本地 daemon 通信【40†source】。
docs/ :文档目录,包含用户指南和开发文档。使用 VitePress 构建,提供详细的安装、使用和开发指南【32†source】。
skills/ :AI 代理技能目录,包含预定义的技能模块,如 opencli-adapter-author、opencli-browser 等【42†source】。这些技能可通过 npx skills add 安装到 Claude Code 等代理中,赋予其使用 OpenCLI 的能力【17†source】。
这种组织方式使项目结构清晰,核心运行时与适配器逻辑分离,便于维护和扩展。适配器作为独立模块存在,可由社区贡献或用户自定义,而核心框架负责统一调度和提供基础能力。
启动流程与运行机制
OpenCLI 的启动流程经过精心优化,以实现快速响应 和按需加载 :
环境准备 :在 main.ts 中,首先确保非 Windows 平台下系统路径(如 /usr/local/bin 等)可用,以避免某些环境下外部命令找不到的问题【33†source】。然后,它检查命令行参数中是否包含 --live 或 --focus 等会话生命周期标志,并将其从 argv 中移除,转换为环境变量供后续使用【33†source】。
快速路径判断 :接下来,程序进入“超快路径”判断,针对一些高频或轻量命令直接处理,无需完整启动框架【33†source】。例如:
若命令为 --version,则直接输出版本号并退出【33†source】。
若命令为 completion,则尝试直接生成对应 shell 的补全脚本并退出【33†source】。
若命令包含 --get-completions,则尝试从预生成的 manifest 中获取补全候选并退出【33†source】。如果 manifest 不存在,则继续下一步。
核心模块动态加载 :对于非快速路径的命令,程序开始加载核心模块。为了减少启动开销,这些模块采用动态 import() 导入,仅在需要时加载【33†source】。加载的模块包括:
discovery.js:命令发现模块,用于注册命令。
node-network.js:网络拦截模块(用于浏览器自动化)。
update-check.js:后台更新检查模块。
并行命令发现 :加载完模块后,程序并行执行内置适配器 和用户适配器 的发现过程【33†source】。内置适配器位于安装包的 clis/ 目录,用户适配器位于 ~/.opencli/clis/。发现过程通过 discoverClis 函数完成,该函数优先尝试从 manifest 加载命令,若 manifest 不存在则回退到文件系统扫描【35†source】。由于内置和用户适配器相互独立,可以同时发现,从而加速启动。
插件发现 :在用户适配器发现完成后,程序继续调用 discoverPlugins,扫描 ~/.opencli/plugins/ 目录下的插件【35†source】。插件发现最后执行,以确保插件的命令可以覆盖同名内置或用户命令(用户命令优先级最高,插件次之,内置最低)。
注册退出钩子与后台更新 :在所有命令注册完成后,程序注册一个退出钩子,在命令执行完毕后检查并显示更新提示【33†source】。同时,它会异步触发后台更新检查,为下次运行准备更新信息【33†source】。
补全回退处理 :如果之前因 manifest 不存在而跳过了补全快速路径,此时会使用完整注册表来计算补全候选并退出【33†source】。
生命周期钩子 :最后,程序触发 onStartup 生命周期钩子,通知所有注册的插件或模块启动完成【33†source】。
进入命令执行 :启动流程结束后,调用 runCli 进入 Commander 框架的命令解析与执行循环,处理用户输入的命令【33†source】。
通过上述流程,OpenCLI 实现了零启动延迟 的体验:对于简单命令(如查看版本、补全),几乎无需加载任何模块即可响应;对于复杂命令,也通过并行发现和懒加载模块将启动开销降至最低。这种设计保证了 OpenCLI 在实际使用中的响应速度和资源效率。
适配器与命令注册
OpenCLI 的核心概念之一是适配器(Adapter) ,它封装了对特定网站或工具的访问逻辑。每个适配器对应一个站点或工具,可以包含多个命令。适配器通过统一的 API 与 OpenCLI 框架交互,主要包括:
命令注册 API :适配器使用 cli() 函数(从 @jackwener/opencli/registry 导入)来声明命令【44†source】。该函数接收一个配置对象,定义命令的元数据和执行逻辑。例如:
import { cli, Strategy } from '@jackwener /opencli/registry';
cli({
site: 'hackernews',
name: 'top',
description: 'Hacker News top stories',
domain: 'news.ycombinator.com',
strategy: Strategy.PUBLIC,
browser: false,
args: [ { name: 'limit', type: 'int', default: 20, help: 'Number of stories' } ],
columns: ['rank', 'title', 'score', 'author', 'comments'],
pipeline: [ ... ],
});
上述代码注册了 HackerNews 站点的“top”命令,声明了其名称、描述、域名、策略(无需登录)、参数、输出列以及执行管道【44†source】。
策略(Strategy) :策略定义了访问站点所需的认证方式,包括 PUBLIC、COOKIE、HEADER 和 INTERCEPT 等【37†source】。例如,PUBLIC 表示无需认证,COOKIE 表示需要浏览器的 Cookie,HEADER 表示需要特定的请求头,INTERCEPT 则表示需要拦截网络请求获取令牌【37†source】。策略由适配器在注册时指定,运行时由注册表和执行引擎根据策略类型决定如何获取数据。
执行管道(Pipeline) :适配器的核心是执行管道 ,它定义了命令执行的步骤序列【44†source】。管道由一系列操作组成,如网络请求、数据过滤、映射转换、结果限制等【44†source】。例如,HackerNews 的“top”命令管道首先抓取 HN 的 Top Stories JSON,然后限制条目数量,再逐个获取每条新闻的详情,最后映射输出列并限制结果数量【44†source】。管道通过声明式的方式组合这些操作,使适配器逻辑清晰且易于维护。
内置命令与生命周期 :除了动态适配器命令,OpenCLI 还内置了一些基础命令,如 list(列出所有命令)、doctor(诊断浏览器连接)、validate(验证适配器)等【37†source】。这些命令直接在 cli.ts 中实现,不通过适配器注册。此外,适配器还可以注册生命周期钩子(如 onStartup、onBeforeExecute、onAfterExecute),在特定事件触发时执行自定义逻辑【35†source】。
通过这种声明式注册+管道执行 的模型,OpenCLI 实现了高度模块化和可组合的命令体系。开发者只需关注如何获取和转换数据,而框架负责调度、认证和输出格式化,大大降低了开发适配器的门槛。
浏览器桥接与自动化
OpenCLI 的一大技术亮点是其浏览器自动化桥接 能力。通过这一机制,OpenCLI 可以操作用户已登录的浏览器,执行如导航、点击、提取等操作,从而访问需要登录的网站或复杂的动态网页。其架构和工作流程如下:
架构组成 :浏览器桥接由两部分组成:
Chrome 扩展(Browser Bridge) :一个轻量级的 Chrome 扩展,安装在用户浏览器中【40†source】。该扩展负责在浏览器上下文中执行 JavaScript,与网页交互,并将结果返回给守护进程。
本地守护进程(Daemon) :一个随 OpenCLI 安装的后台进程,默认监听在 localhost:19825【40†source】。CLI 通过 WebSocket 与 daemon 通信,daemon 再通过 Chrome DevTools Protocol (CDP) 与扩展通信【40†source】。
通信流程 :当执行一个需要浏览器的命令时,流程如下:
CLI 将命令请求发送给本地 daemon(通过 HTTP 或 WebSocket)【40†source】。
daemon 将请求转发给 Chrome 扩展(通过 CDP)【40†source】。
扩展在浏览器中执行相应的操作(如导航到 URL、执行 JavaScript 等)【40†source】。
执行结果(如页面内容、网络请求、元素状态等)由扩展返回给 daemon,再由 daemon 返回给 CLI【40†source】。
会话复用 :由于扩展运行在用户已登录的浏览器环境中,因此可以直接访问受保护的页面,而无需重新登录【40†source】。这保证了账号安全 (凭证不离开浏览器)和零风控 (使用真实浏览器会话,不易触发反爬)【17†source】。
守护进程生命周期 :daemon 在首次需要时自动启动,并持续运行【40†source】。用户可以通过 opencli daemon stop 命令优雅地停止守护进程【40†source】。守护进程会保持活跃,直到用户显式停止或卸载 OpenCLI【40†source】。
命令示例 :用户可以使用 opencli browser 系列命令直接与浏览器交互,例如:
opencli browser open <url>:在默认标签页中打开指定 URL【40†source】。
opencli browser tab list:列出当前打开的标签页及其 targetId【40†source】。
opencli browser tab new <url>:在新标签页中打开 URL,并返回 targetId【40†source】。
opencli browser click <selector>:点击页面上的元素。
opencli browser type <selector> <text>:在输入框中输入文本。
opencli browser extract <selector>:提取页面元素的内容。
opencli browser network:捕获页面的网络请求【37†source】。
通过浏览器桥接,OpenCLI 能够处理那些没有公开 API 或需要复杂交互的网站。例如,小红书(Xiaohongshu)、知乎(Zhihu)等网站的很多操作需要登录和模拟交互,OpenCLI 可以通过浏览器直接完成,而无需逆向工程其 API。这使得 OpenCLI 在网站自动化 方面具备强大的能力。
桌面应用控制(CDP集成)
除了网站,OpenCLI 还支持将Electron 桌面应用 转化为 CLI 命令,通过 Chrome DevTools Protocol (CDP) 与应用交互【48†source】。其架构与浏览器桥接类似,但目标对象是本地 Electron 应用。主要流程和特点如下:
前提条件 :目标 Electron 应用必须支持远程调试端口(通常通过 --remote-debugging-port=<port> 启动参数开启)【48†source】。例如,Cursor IDE 可以通过 /Applications/Cursor.app/Contents/MacOS/Cursor --remote-debugging-port=9226 启动【48†source】。
环境配置 :在运行 OpenCLI 前,需要设置环境变量 OPENCLI_CDP_ENDPOINT 指向该调试端口,例如 export OPENCLI_CDP_ENDPOINT="http://127.0.0.1:9226"【48†source】。这样 OpenCLI 就知道通过 CDP 与哪个应用通信。
适配器模式 :对于 Electron 应用,OpenCLI 提供了一种5命令模式 作为开发适配器的起点【48†source】。建议的实现顺序是:
status.js:验证 CDP 连接是否可达,获取应用的基本信息(如 URL、标题等)【48†source】。
dump.js:导出应用的 DOM 结构和 Accessibility 快照,用于分析页面结构【48†source】。
read.js:提取应用当前可见的关键内容(如聊天记录、文档内容等)【48†source】。
send.js:向应用发送输入(如在编辑器中输入文本并发送)【48†source】。
new.js:创建新的会话/标签页(如新建聊天、新建文档)【48†source】。
这5个命令覆盖了连接检查、逆向工程、读取、写入和会话重置,是开发 Electron 适配器的基础【48†source】。
实现要点 :在实现 Electron 适配器时,需要注意以下几点:
获取正确的窗口/标签 :由于 Electron 应用可能有多个窗口或标签,需要确保操作的是目标窗口【48†source】。
等待渲染完成 :应用界面可能动态加载,需要等待关键元素加载完毕再提取数据【48†source】。
避免猜测选择器 :不要凭肉眼猜测元素选择器,而应通过 dump 分析真实的 DOM 结构和属性(如 data-testid、role 等)【48†source】。
处理受控编辑器 :许多 Electron 应用使用 React 等框架的受控组件,直接设置 .value 可能无效。应优先使用模拟用户输入的方式(如聚焦后调用 document.execCommand('insertText') 或模拟键盘事件)【48†source】。
示例:Cursor IDE :OpenCLI 已经为 Cursor IDE 提供了适配器。通过 opencli cursor 系列命令,可以控制 Cursor 的 Composer、聊天等核心功能【48†source】。例如:
opencli cursor status:检查 Cursor 的 CDP 连接状态【48†source】。
opencli cursor dump:导出 Cursor 的 DOM 和 Accessibility 快照到本地文件【48†source】。
opencli cursor screenshot:截取 Cursor 当前窗口的屏幕快照【48†source】。
opencli cursor new:模拟按下 Cmd+N 新建文件/标签【48†source】。
opencli cursor send "message":在 Composer 中输入文本并提交【48†source】。
opencli cursor ask "message":发送消息并等待回复,再读取回复【48†source】。
opencli cursor read:读取当前聊天面板的完整对话历史【48†source】。
opencli cursor composer "prompt":打开 Composer 并发送提示【48†source】。
opencli cursor model:获取当前使用的 AI 模型名称【48†source】。
opencli cursor extract-code:从当前对话中提取所有代码块【48†source】。
opencli cursor history:列出最近的聊天/Composer 会话【48†source】。
opencli cursor export:将当前对话导出为 Markdown【48†source】。
通过 CDP 集成,OpenCLI 将桌面应用自动化 纳入了其能力版图。这使其不仅局限于 Web,还可以控制本地安装的 Electron 应用,极大地扩展了适用范围。开发者可以按照文档指引,为其他 Electron 应用编写适配器,将它们也变成 OpenCLI 可驱动的命令。
AI Agent 集成设计
OpenCLI 的设计初衷之一是服务 AI 代理,使其能够像人类一样使用各种工具。为此,项目在架构上做了专门的设计,包括技能(Skills)机制 、自适应修复 和智能搜索 等模块,以降低 AI 代理使用 OpenCLI 的门槛。
技能(Skills)机制 :OpenCLI 引入了“技能”概念,本质上是预定义的提示或脚本,用于指导 AI 代理如何使用 OpenCLI 的能力【17†source】。每个技能对应一类任务,例如:
opencli-adapter-author:用于实时操作网站或编写新适配器的技能【42†source】。当 AI 代理需要访问一个新网站时,该技能会引导它完成从侦察站点、发现 API、解码字段、编写适配器到验证的整个流程【42†source】。
opencli-autofix:用于修复损坏适配器的技能【42†source】。当内置命令返回空数据或出错时,AI 代理可以调用此技能,自动诊断并尝试修复适配器。
opencli-browser:浏览器自动化参考技能【42†source】。提供 OpenCLI 浏览器命令的详细用法,供 AI 代理查询。
opencli-usage:命令和站点参考技能【42†source】。提供 OpenCLI 所有命令和站点的索引,方便 AI 代理查询可用功能。
smart-search:智能搜索技能【42†source】。AI 代理可以通过自然语言查询,在现有适配器和命令中搜索所需功能。
技能通过 npx skills add 安装到代理的上下文中【17†source】。安装后,AI 代理在对话中可以引用这些技能,将其作为“工具”来调用。例如,Claude Code 可以在对话中调用 opencli-adapter-author 技能来帮助用户检查小红书通知【17†source】。技能机制使 AI 代理无需理解 OpenCLI 的底层实现 ,只需按照技能指引操作即可,大大降低了集成难度。
自适应修复(Autofix) :当适配器因为网站改版等原因失效时,OpenCLI 提供了自动修复能力。opencli-autofix 技能会尝试重新侦察站点、发现新的接口或选择器,并更新适配器代码【42†source】。这一过程对 AI 代理是透明的,它只需在适配器失败时调用 autofix 技能即可。这种设计保证了 OpenCLI 的持续可用性 ,即使目标站点变化,也能通过 AI 自主修复,无需人工介入。
智能搜索与发现 :OpenCLI 内置了丰富的命令和适配器,对于 AI 代理来说,如何快速找到所需的命令是关键。smart-search 技能提供了自然语言搜索能力,AI 代理可以用自然语言描述需求,技能会在命令注册表中搜索匹配的适配器【42†source】。例如,AI 代理可以询问“如何获取抖音热门视频”,smart-search 会返回相关适配器信息。此外,opencli-usage 技能提供了命令和站点的索引查询,AI 代理可以列出所有支持的网站或命令,以发现可用功能【42†source】。
统一的 AGENT.md 集成 :OpenCLI 的 README 中提到,它通过“统一的 AGENT.md 集成”让 AI 代理发现、学习和执行工具【17†source】。这意味着 OpenCLI 为 AI 代理提供了一个统一的接口或文档,使其能够自动获取 OpenCLI 的能力和用法,而无需人工编写集成代码。这体现了 OpenCLI 在设计上对 AI 代理的友好性:AI 可以像人类一样“阅读”OpenCLI 的文档并使用其命令,而无需特殊适配。
综上,OpenCLI 在架构上充分考虑了 AI 代理的使用场景。通过技能、自动修复和智能搜索等机制,它降低了 AI 集成的复杂度,使 AI 代理能够自主地发现和使用工具 。这与 OpenCLI “AI-native runtime”的定位相符,使其成为 AI 代理的强大工具库。
功能特性分析
OpenCLI 提供了丰富的功能特性,既面向人类用户,也面向 AI 代理。下面将从网站与工具支持 、命令行接口 、账号安全与性能 、扩展性 等方面进行分析。
丰富的网站与工具适配
OpenCLI 内置了大量适配器,覆盖了国内外主流网站和开发工具,包括但不限于:
内置适配器示例
社交媒体与内容平台 :Bilibili(B站)、Zhihu(知乎)、Xiaohongshu(小红书)、Reddit、Twitter/X、HackerNews、Douban(豆瓣)等【17†source】。例如,opencli bilibili hot 可获取B站热门视频,opencli zhihu hot 可获取知乎热门问题,opencli xiaohongshu search note 可搜索小红书笔记等【17†source】。
开发者工具 :GitHub CLI (gh)、Docker、Obsidian 笔记、Lark/飞书 CLI、DingTalk CLI、WeCom CLI、Vercel CLI 等【17†source】。OpenCLI 将这些工具作为CLI Hub 集成,用户可以通过 opencli gh pr list 或 opencli docker ps 等命令直接调用,而无需记忆不同工具的命令【17†source】。如果目标工具未安装,OpenCLI 甚至会尝试自动安装(如通过 Homebrew)再执行【17†source】。
桌面应用 :Cursor IDE、ChatGPT App、ChatWise、Notion、Discord、Doubao 等 Electron 应用【17†source】。通过 CDP 集成,OpenCLI 可以控制这些应用的核心功能,如 Cursor 的 Composer 和聊天、Notion 的页面读写等【48†source】。
其他 :还包括 Amazon(商品搜索)、1688(商品与店铺)、Gitee(开源项目)、Google/Baidu 学术搜索、Spotify(音乐控制)、Xianyu(闲鱼二手交易)、Xiaoe(小鹅通课程)、Quark(网盘)等【17†source】。几乎涵盖了社交媒体、电商、开发、办公等常见领域。
这些适配器使用统一的命令格式,例如 opencli <site> <command> [options],让用户和 AI 代理可以用一致的方式 访问不同网站和工具。OpenCLI 还支持自定义注册 本地命令,通过 opencli register mycli 可以将任意本地可执行命令暴露到 OpenCLI 的发现表面,供 AI 代理发现和调用【17†source】。这进一步扩展了 OpenCLI 的适用范围。
统一的命令行接口
OpenCLI 为所有适配器提供了统一的命令行接口 和输出格式,这带来了几个显著优势:
一致的用法 :用户无需记忆不同网站或工具的复杂用法,只需遵循 OpenCLI 的通用格式。例如,要获取某站点的热门内容,通常命令格式为 opencli <site> hot;要搜索内容,通常为 opencli <site> search <query>。这种一致性降低了学习成本。
多格式输出 :所有命令均支持 --format/-f 选项,可输出为表格(默认)、JSON、YAML、Markdown、CSV 等格式【17†source】。例如,opencli bilibili hot -f json 会以 JSON 格式输出结果,方便程序处理;-f csv 则便于导入电子表格【17†source】。这保证了 OpenCLI 的输出既人类可读 ,又机器友好 。
可管道与脚本化 :由于输出格式统一且命令遵循 Unix 哲学(如退出码规范),OpenCLI 的命令可以方便地串联到 shell 管道或脚本中【17†source】。例如,可以将 opencli hackernews top -f json 的结果通过管道传给 jq 进行进一步筛选,或者将多个 OpenCLI 命令写入脚本自动化执行。
CI 友好 :OpenCLI 的命令输出和退出码设计使其非常适合在 CI/CD 环境中使用【17†source】。命令执行成功返回 0,不同错误情况返回不同的非0退出码(如通用错误1、用法错误2、空结果66、服务不可用69、临时失败75、需认证77、配置错误78等)【17†source】。这种设计让 CI 脚本可以可靠地判断命令执行结果并采取相应措施。
通过这些设计,OpenCLI 实现了“一个表面,多种用途” :既可以直接作为人类命令行工具使用,又可以作为 AI 代理的底层执行引擎,还能无缝融入自动化脚本和持续集成系统。
账号安全与零凭证存储
在需要登录的网站操作时,OpenCLI 采用了账号安全 的设计:它复用用户已登录的浏览器会话 ,而不需要用户在命令行中输入密码或存储凭证【17†source】。具体而言,当执行需要登录的命令时,OpenCLI 会通过浏览器桥接访问用户浏览器中已打开的标签页,利用浏览器的 Cookie 和会话信息来完成请求【40†source】。这意味着:
零风控 :由于使用真实浏览器会话,网站的反爬虫机制几乎无法检测,因为请求来自用户自身的浏览器环境【17†source】。
零凭证存储 :OpenCLI 不存储用户的密码或 Token,所有认证信息都留在浏览器中【17†source】。这避免了在命令行工具中保存敏感信息的安全风险。
无需重新登录 :只要用户在浏览器中保持登录状态,OpenCLI 就能直接使用,省去了在命令行工具中重新登录的麻烦【40†source】。
这种设计在保证安全的同时,也极大方便了用户。用户只需确保在 Chrome/Chromium 中登录目标网站,然后使用 OpenCLI 命令即可,无需在命令行中传递任何敏感信息。对于 AI 代理来说,这同样重要——代理可以代表用户执行操作,但不需要获取用户的密码,从而降低了安全风险。
零LLM运行成本
OpenCLI 的另一个显著特点是零 LLM 运行成本 【17†source】。这意味着使用 OpenCLI 执行命令时,不会消耗任何大模型(LLM)的 Token 或调用次数。原因在于 OpenCLI 的所有操作都是基于预先编写好的适配器逻辑和浏览器自动化,而不需要实时调用 LLM 来生成行为。例如,获取知乎热门问题,OpenCLI 是通过浏览器或接口直接抓取,而不是让 LLM 去理解页面或编写脚本。这种设计带来几个优势:
成本固定 :无论执行多少次命令,OpenCLI 本身不产生额外的 AI 调用费用【17†source】。这对于需要频繁调用 CLI 的场景(如批量数据处理、持续监控)非常重要,避免了高昂的 LLM 使用成本。
性能稳定 :由于不依赖 LLM 的响应速度,OpenCLI 的执行延迟主要取决于目标网站或工具的响应,而不会因为 LLM 调用而变慢。这使得 OpenCLI 的性能更加可预测和稳定。
确定性 :相同命令始终产生相同输出结构【17†source】。因为行为是预定义的,不会因为 LLM 的不确定性而变化。这对于需要可靠输出的场景(如数据管道、自动化测试)至关重要。
当然,这并不意味着 OpenCLI 不能与 LLM 结合。实际上,OpenCLI 正是为 LLM 提供了一个强大的工具层,让 LLM 可以通过调用 OpenCLI 的命令来与外部世界交互,而 LLM 自身不需要直接处理网络请求或页面解析。这种解耦 既降低了 LLM 的负担,也保证了工具层的稳定和高效。
可扩展性与插件生态
OpenCLI 设计了完善的扩展机制,鼓励社区和用户扩展其功能:
适配器扩展 :任何人都可以编写新的适配器来支持新的网站或工具。适配器可以放在 ~/.opencli/clis/<site>/ 目录下,OpenCLI 会自动发现并注册【35†source】。开发者只需遵循适配器 API 规范,使用 cli() 注册命令,定义策略和管道即可【44†source】。OpenCLI 还提供了 opencli browser init 和 opencli browser verify 等命令,帮助开发者初始化适配器骨架和验证适配器输出【42†source】。
插件体系 :对于更复杂的功能,OpenCLI 引入了插件机制【17†source】。插件可以是新的命令集,也可以是增强现有功能(如提供新的输出格式、集成第三方服务等)。用户可以通过 opencli plugin install <plugin> 安装插件【17†source】。OpenCLI 已经有一些社区插件,如 GitHub Trending、多平台热门聚合、掘金热门等【17†source】。插件机制遵循 OpenCLI 的统一接口,安装后即可像内置命令一样使用。
技能扩展 :技能本质上是面向 AI 代理的插件。开发者可以为特定任务编写技能脚本,让 AI 代理更高效地使用 OpenCLI。例如,可以编写一个技能专门处理电商数据抓取,或编写一个技能将 OpenCLI 输出直接导入某数据库。技能通过 npx skills add 安装,方便 AI 代理获取【17†source】。
开放源码与贡献 :OpenCLI 是开源项目,遵循 Apache-2.0 许可【17†source】。项目欢迎社区贡献适配器、修复和文档。贡献指南(CONTRIBUTING.md)详细说明了如何参与开发,包括代码风格、测试和提交流程等【17†source】。这种开放模式保证了 OpenCLI 的持续演进和生态繁荣。
通过适配器、插件和技能三层扩展体系,OpenCLI 构建了一个可生长的工具生态 。用户和开发者可以根据自己的需求,灵活地扩展 OpenCLI 的功能,使其成为一个真正通用且可定制 的 CLI 运行时。
AI 集成能力分析
OpenCLI 在 AI 代理集成方面表现出色,其设计充分考虑了 AI 代理的使用场景和需求。下面从AI 代理友好性 、技能系统 、自动修复 和智能搜索 等方面进行分析。
AI Agent 友好设计
OpenCLI 的很多特性都直接服务于 AI 代理:
统一接口 :AI 代理不需要学习不同网站或工具的专用 API,只需掌握 OpenCLI 的命令格式和用法。这大大降低了 AI 集成的复杂度,使其可以一通百通 地访问各种服务。
确定性输出 :AI 代理依赖稳定的输出格式来解析结果。OpenCLI 保证相同命令始终返回相同结构的输出【17†source】,并支持多种格式,方便代理根据需要选择。例如,代理可以要求 JSON 格式输出,然后用代码直接解析,而无需处理 HTML 或自然语言的歧义。
账号安全 :AI 代理在代表用户操作时,无需获取用户的密码等敏感信息【17†source】。这通过复用浏览器会话实现,既方便又安全,符合 AI 代理作为“助手”的定位。
零 LLM 成本 :AI 代理调用 OpenCLI 命令不会消耗自身的 Token 或调用次数【17†source】。这使得代理可以频繁调用 CLI 而无需担心成本,非常适合需要大量工具调用的场景(如信息检索、数据抓取)。
丰富的功能集 :OpenCLI 提供了从社交媒体到开发工具的广泛命令集,AI 代理可以用它来完成从内容获取、数据分析到自动化运维等各种任务,而无需额外集成其他工具。
这些特性使 OpenCLI 成为一个AI 代理的理想工具库 。代理可以像人类一样使用命令行工具,但借助 OpenCLI,它有了统一、安全且强大的工具接口。这降低了 AI 代理与外部世界交互的门槛,使其能更专注于高层决策而非底层实现。
技能(Skills)机制
OpenCLI 的技能系统是其 AI 集成的核心创新之一。每个技能相当于一个AI 代理的“工具包” ,封装了一类任务的执行流程和知识。技能机制带来的价值包括:
任务引导 :技能为 AI 代理提供了明确的指引。例如,opencli-adapter-author 技能会引导代理一步步完成从访问网站、发现接口到编写适配器的全过程【42†source】。代理只需按照技能提示执行,无需自己摸索。
知识沉淀 :技能包含了领域知识,如如何解析特定网站的结构、如何处理分页、如何解码字段等。这些知识通过技能传递给 AI 代理,使其能处理复杂任务,而不需要人类反复提示。
可组合性 :AI 代理可以组合使用多个技能。例如,先用 opencli-adapter-author 技能发现一个网站的接口,再用 opencli-browser 技能执行浏览器操作,最后用 opencli-usage 技能查询其他命令。这种组合使代理能完成端到端的复杂工作流。
可扩展性 :开发者可以创建新的技能来扩展 AI 代理的能力。例如,可以编写一个技能专门处理某类数据可视化,或将 OpenCLI 输出转化为特定格式。技能通过 npx skills add 安装,AI 代理即可获取新能力【17†source】。
技能机制本质上解决了AI 代理如何使用工具 的问题。通过将工具的使用方法编码为技能,OpenCLI 让 AI 代理无需理解工具底层实现 就能高效使用,这大大降低了 AI 集成的门槛。同时,技能也为人类开发者提供了一种封装复杂流程的方式,使得 OpenCLI 的能力可以被模块化地扩展和复用 。
自适应适配器修复
网站和应用的改版常常导致适配器失效,这是自动化工具的一大痛点。OpenCLI 通过 opencli-autofix 技能引入了自适应修复 能力,使 AI 代理能够自动应对适配器失败的情况:
自动诊断 :当内置命令返回空数据或错误时,AI 代理可以调用 opencli-autofix 技能。该技能会自动诊断问题,例如检查是否需要登录、接口是否变化、选择器是否失效等【42†source】。
自动修复 :在诊断后,autofix 会尝试修复适配器。这可能包括重新运行站点侦察(site-recon)以发现新的接口,更新字段映射,调整选择器,甚至重写部分适配器逻辑【42†source】。修复完成后,会重新验证适配器输出是否正常。
闭环流程 :Autofix 技能确保了适配器的维护形成一个闭环:当适配器失效时,AI 代理可以自主修复,而无需人工介入。这极大地提高了 OpenCLI 的健壮性 和持续可用性 。
这种自适应修复能力是 OpenCLI 区别于传统 CLI 工具的重要特征。它意味着 OpenCLI 不会因为目标站点的一点变化就完全失效,而是可以通过 AI 自主调整,继续提供服务。对于 AI 代理来说,这提供了更高的可靠性;对于人类用户,这也降低了维护成本,因为很多问题可以被自动解决。
智能搜索与发现
OpenCLI 提供了智能搜索 功能,帮助 AI 代理快速找到所需的命令或适配器:
自然语言搜索 :AI 代理可以通过 smart-search 技能用自然语言查询所需功能【42†source】。例如,代理可以问“如何获取抖音热门视频”,smart-search 会在命令注册表中搜索相关关键词,返回匹配的适配器和命令。这解决了 AI 代理在面对庞大命令集时不知道从何下手的问题。
命令索引 :opencli-usage 技能提供了对所有命令和站点的索引【42†source】。AI 代理可以列出所有支持的网站,或查询某站点下有哪些命令。这类似于一个命令字典,供代理参考。
上下文感知 :OpenCLI 的技能和搜索机制还考虑了上下文。例如,当 AI 代理在执行某网站相关任务时,可以调用 opencli-browser 技能获取该网站的浏览器自动化参考,从而知道如何操作该网站【42†source】。这种上下文相关的帮助使代理能更精确地获取所需信息。
通过智能搜索和发现,AI 代理可以自主地探索 OpenCLI 的功能 ,而无需人类逐一指导。这赋予了代理更强的自主性和灵活性,使其能够在面对新任务时,自行找到合适的工具和方法。对于人类用户,这些功能也提供了便利,比如可以用自然语言查询 OpenCLI 能做什么,而不必阅读完整文档。
安装指南
要开始使用 OpenCLI,需要完成以下安装步骤:
安装 OpenCLI 主程序
OpenCLI 通过 npm 发布为全局包,可以使用 npm 或 yarn 安装:
npm install -g @jackwener /opencli
或者使用 yarn:
yarn global add @jackwener /opencli
安装完成后,即可在命令行使用 opencli 命令。请确保 Node.js 版本在 21.0.0 以上(或使用 Bun 1.0 以上)【17†source】。
安装浏览器桥接扩展
为了使 OpenCLI 能够访问需要登录的网站,需要安装浏览器桥接扩展。该扩展连接用户浏览器与 OpenCLI 的本地守护进程,实现会话复用。安装方法有两种:
浏览器桥接扩展安装方式
方法一(推荐):从 Chrome 网上应用店安装 。在 Chrome 浏览器中访问 OpenCLI 的扩展页面,点击“添加至 Chrome”即可完成安装【17†source】。这是最简单的方式,扩展会自动更新。
方法二:手动加载扩展 。从 OpenCLI 的 GitHub Releases 页面下载最新版本的扩展压缩包(如 opencli-extension-v{version}.zip),解压后在 Chrome 浏览器中打开 chrome://extensions,启用“开发者模式”,然后点击“加载已解压的扩展程序”,选择解压后的目录【17†source】。这种方式适合开发或离线环境。
安装扩展后,需要确保 Chrome 浏览器正在运行且已登录目标网站。OpenCLI 的守护进程会自动启动并与扩展通信,无需手动配置【40†source】。
验证安装
安装完成后,可以使用 opencli doctor 命令检查环境是否正常:
opencli doctor
该命令会验证 Node.js 版本、守护进程连接、浏览器扩展状态等,并给出提示【17†source】。如果一切正常,会显示类似“Everything looks good”的信息。如果浏览器未连接,会提示“Browser Bridge not connected”【17†source】,此时需要确保 Chrome 扩展已安装且 Chrome 浏览器已打开。
安装和验证完成后,即可开始使用 OpenCLI 的各种命令。例如,可以运行 opencli list 查看所有可用命令,或尝试 opencli hackernews top --limit 5 获取 Hacker News 的前5条新闻【17†source】。
使用指南
OpenCLI 的使用分为人类用户 和AI 代理 两种视角。下面分别介绍,以及提供一些常用命令示例。
人类用户使用
对于人类用户,OpenCLI 提供了直接且强大的命令行工具体验:
查看可用命令 :使用 opencli list 可以列出所有已注册的命令,包括内置适配器和自定义注册的命令【17†source】。这有助于发现 OpenCLI 能做什么。
执行适配器命令 :使用 opencli <site> <command> [options] 的格式执行具体命令。例如:
opencli bilibili hot:获取B站热门视频【17†source】。
opencli zhihu hot --limit 10:获取知乎前10个热门问题。
opencli xiaohongshu search note "关键词":在小红书搜索笔记。
opencli hackernews top --limit 5:获取 Hacker News 前5条新闻【17†source】。
opencli gh pr list --limit 5:使用 GitHub CLI 列出当前仓库前5个 Pull Request【17†source】。
诊断与调试 :如果遇到问题,可以使用 opencli doctor 检查环境【17†source】;使用 opencli <site> <command> --verbose 或设置环境变量 OPENCLI_VERBOSE=1 获取详细日志,帮助定位问题。
输出格式 :通过 --format/-f 选项选择输出格式。例如 -f json 输出 JSON,-f csv 输出 CSV【17†source】。默认输出表格,人类可读性好。
自定义命令 :使用 opencli register <name> 可以将本地命令注册到 OpenCLI,使其出现在 opencli list 中【17†source】。例如,opencli register mycli 会注册一个名为 mycli 的命令,之后就可以用 opencli mycli 调用。
人类用户可以像使用其他 CLI 工具一样使用 OpenCLI,但享受到了统一的接口 和丰富的功能 。OpenCLI 的命令设计遵循 Unix 哲学,输出友好且可管道,非常适合脚本和日常命令行操作。
AI Agent 使用
对于 AI 代理,OpenCLI 提供了更高级的使用方式,通常不需要代理直接运行 opencli 命令,而是通过技能 来调用:
通过技能,AI 代理可以像人类一样使用 OpenCLI ,而无需理解其底层实现。这大大降低了 AI 集成的门槛,使代理能够专注于与用户的交互和高层决策,而不必关心如何与各种网站交互的技术细节。
常用命令示例
下面列出一些 OpenCLI 的常用命令示例,涵盖不同站点和功能:
常用命令示例
社交媒体 :
opencli bilibili hot --limit 10:获取B站前10个热门视频。
opencli zhihu hot --limit 10:获取知乎前10个热门问题。
opencli xiaohongshu search note "旅行":在小红书搜索包含“旅行”的笔记。
opencli reddit hot:获取 Reddit 热门帖子。
opencli twitter trending:获取 Twitter/X 的趋势话题。
开发工具 :
opencli gh pr list --limit 5:使用 GitHub CLI 列出当前仓库前5个 PR【17†source】。
opencli docker ps:列出运行中的 Docker 容器【17†source】。
opencli obsidian search "AI":在 Obsidian 中搜索包含“AI”的笔记【17†source】。
桌面应用 :
opencli cursor status:检查 Cursor IDE 的 CDP 连接状态【48†source】。
opencli cursor read:读取 Cursor 当前聊天面板的对话历史【48†source】。
opencli notion search "项目计划":在 Notion 中搜索包含“项目计划”的页面。
通用功能 :
opencli list:列出所有可用命令【17†source】。
opencli doctor:检查 OpenCLI 环境是否正常【17†source】。
opencli browser open https://www.baidu.com:在默认浏览器标签页中打开百度【40†source】。
opencli browser tab list:列出当前打开的浏览器标签页【40†source】。
这些示例展示了 OpenCLI 的广泛适用性。无论是获取信息、自动化操作还是开发调试,OpenCLI 都提供了相应的命令。用户和 AI 代理可以根据需求组合使用这些命令,完成复杂的任务。
输出格式与管道
OpenCLI 的命令输出支持多种格式,方便不同场景使用:
表格(默认) :以表格形式输出,适合人类阅读。例如 opencli bilibili hot 默认输出表格,包含视频标题、作者、播放量等列。
JSON :使用 -f json 输出 JSON 格式。例如 opencli bilibili hot -f json 会输出 JSON 数组,每个元素包含完整的数据对象。这便于程序解析或存入数据库。
YAML :使用 -f yaml 输出 YAML 格式。YAML 格式可读性好,也常用于配置文件。
Markdown :使用 -f md 输出 Markdown 表格。可以直接嵌入 Markdown 文档。
CSV :使用 -f csv 输出 CSV 格式。适合导入电子表格或数据清洗工具。
此外,OpenCLI 的命令遵循标准的退出码规范【17†source】。例如,成功返回0,参数错误返回2,未登录返回77等【17†source】。这使得 OpenCLI 的命令可以方便地与 shell 脚本、CI 系统集成,通过退出码判断执行结果。
通过丰富的输出格式和规范的退出码,OpenCLI 实现了人机两宜 :既可以直接为人所用,又可以被程序和 AI 代理可靠地调用和解析。
总结
OpenCLI 是一个雄心勃勃且功能强大的项目,它将网站、浏览器、桌面应用和本地工具 统一到了一个命令行接口下,为人类用户和 AI 代理提供了前所未有的自动化能力。通过其精巧的架构设计——包括模块化的适配器系统、浏览器桥接、CDP 集成、技能机制等——OpenCLI 实现了高性能、高扩展性和高安全性 的统一。它内置的丰富适配器覆盖了日常所需,而其开放的插件和技能体系又保证了生态的持续繁荣。对于开发者而言,OpenCLI 提供了一套完善的 API 和工具,使其可以轻松扩展新功能;对于 AI 代理而言,OpenCLI 是一个强大的工具库,让其能够像人类一样使用各种工具,而无需关心底层实现细节。总而言之,OpenCLI 代表了 CLI 工具和 AI 集成的新范式,其“Make Any Website & Tool Your CLI” 的愿景正在成为现实,为未来的自动化和智能化提供了坚实的基础。【17†source】