CLI-Anything 集成 Intelwatch:一条命令打通 npx 竞争情报、M&A 尽职调查与 OSINT
【免费下载链接】CLI-Anything"CLI-Anything: Making ALL Software Agent-Native" -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything
导读
cli-anything-intelwatch是 CLI-Anything 生态中为 Node.js 工具Intelwatch打造的 Python 桥接 harness,它把基于npx的 Node 命令透明包装成一条本地 Python 入口,让终端用户和 AI Agent 无需接触 npm 调用链即可直接完成公司深度画像、技术栈探测与 AI 尽职调查。读完本文,你将掌握该 harness 的架构原理、安装配置、命令行用法与测试验证方式,并能举一反三地理解 CLI-Anything「Python 包装任意 CLI」的通用接入范式。
Intelwatch 是什么、为何需要 harness
Intelwatch 定位是「连接黑客式 OSINT 与 B2B 销售 / M&A 数据」的工具,可在数秒内执行复杂财务数据聚合、技术栈探测和 AI 驱动的尽职调查。由于它本身是一个npx(Node.js)工具,并不能直接被 Python 生态的 Agent 调用链使用,因此本仓库在 intelwatch/agent-harness 目录下提供了一个thin wrapper(薄包装层):接收命令行参数后原样转发给npx intelwatch,正如 INTELWATCH.md 所述,其本质是「用 Python(cli-anything-intelwatch)包装 Node.js(npx intelwatch)」。
在整体项目语境中,这与 CLI-Anything「让所有软件对 Agent 原生(Agent-Native)」的目标一致——既不需要修改上游软件,也不需要在 Agent 侧手写脆弱的 subprocess 调用,只需统一安装一个 harness 包即可获得一致的命令行入口与可发现的 SKILL 元数据。
架构总览
从 INTELWATCH.md 与源码结构可以归纳出该 harness 的分层设计:
- 上层 CLI:Python 实现的
cli-anything-intelwatch,基于click构建单一命令入口; - 桥接逻辑:不做任何业务解析,仅把参数原样拼接到
npx intelwatch后通过subprocess.call执行(见 intelwatch_cli.py); - 底层工具:由
npx拉取并运行的 Node.jsintelwatch,负责真正的数据聚合与尽职调查逻辑; - Agent 元数据:随包分发
skills/SKILL.md(见 SKILL.md),同时仓库顶层 skills/cli-anything-intelwatch/SKILL.md 提供全局 Skill 描述,供 Agent 发现并调用。
依赖关系非常克制:Python 侧仅需要click(>=8.0.0,由 setup.py 声明),系统侧需要node/npx。整条链路由setup.py中的 console_scripts 入口cli-anything-intelwatch=cli_anything.intelwatch.intelwatch_cli:main收拢为一条命令。
环境准备与安装
系统级前置条件
因为底层执行的是npx intelwatch,Node.js 是硬性依赖。随包分发的 SKILL.md 明确要求:
- Node.js >= 18,且必须可通过
npx调用; - 建议先执行
node -v与npx -v自检,确认两条命令都能正常返回版本号后再安装 harness。
需要说明的是:profile、--ai、--domain等参数的实际处理能力由上游npx intelwatch决定,本 harness 只负责转发、不校验参数合法性,升级底层 npm 包时需回归测试确认兼容性。
安装 harness 包
发布安装(面向终端用户 / Agent 运行时):
pip install cli-anything-intelwatch开发模式安装(面向本仓库源码目录,方便直接调试):
# 在 intelwatch/agent-harness 目录下执行 pip install -e .editable安装会依据 setup.py 注册 console script 入口,同时通过package_data将cli_anything.intelwatch下的skills/*.md一并打包,保证安装后 Agent Skill 元数据始终随包可用。
命令行快速上手
安装完成后即获得统一的cli-anything-intelwatch命令。以下是文档与 Skill 提供的核心用法。
查看帮助
cli-anything-intelwatch --help由于 harness 对未知选项透明透传,帮助信息主要来自底层click生成的入口说明,以及被转发的npx intelwatch自身的输出。
基础画像(无 AI)
对单个公司域名生成深度画像,不含 AI 辅助分析:
cli-anything-intelwatch profile kpmg.fr带 AI 尽职调查的画像
追加--ai标志,让 Intelwatch 自动执行尽职调查:
cli-anything-intelwatch profile kpmg.fr --ai--ai是文档中明确标注的关键开关——不加时输出常规公司深度画像,加上后则由 Intelwatch 自动完成 AI 驱动的 due diligence。
面向 Agent 的编程式调用
SKILL.md「For AI Agents」一节给出了 Agent 程序化使用时的四步要领:
- 提供公司域名(例如
doctolib.fr); - 需要自动尽调时加上
--ai标志; - 直接读取人可读的输出,其中包含对目标公司的深度拆解;
- 运行前确保机器上
npx可用。
从源码与测试还可看到,底层intelwatch同样接收--domain <域名>、--query <关键词>与--format json这类参数(见 test_core.py 与 test_full_e2e.py),因此 harness 可以直接透传,例如:
cli-anything-intelwatch --domain recognity.fr --format json cli-anything-intelwatch --query recognity --format json是否需要额外转义、参数优先级如何,取决于上游npx intelwatch的实现,本 harness 不介入、不重写。
桥接原理:一次参数转发背后的工程细节
整个 harness 的核心逻辑极其精简,值得逐段拆解(intelwatch_cli.py):
@click.command(context_settings=dict( ignore_unknown_options=True, allow_extra_args=True, )) @click.pass_context def main(ctx): """CLI-Anything harness for Intelwatch. ...""" # Simply forward everything to `npx intelwatch` cmd = ["npx", "intelwatch"] + ctx.args ...这里有两个刻意为之的设计点,是 wrapper 类 harness 的通用关键:
ignore_unknown_options=True+allow_extra_args=True:关闭 click 对未知参数的拦截,允许任意数量未被声明的参数进入ctx.args。这是「透传型」harness 的命门——没有这两项,profile、--ai等一切上游参数都会被 click 报错拒绝,转发将无从谈起。subprocess.call与sys.exit直通:子进程的 stdin/stdout/stderr 被自动继承,profile kpmg.fr的交互式输出、进度条、AI 分析文本都能原样流到当前终端;随后把子进程返回码透传为 harness 自身的退出码,保证脚本调用链中的$?判断依然成立。FileNotFoundError兜底:当系统缺少npx(Node.js 未安装或不在 PATH)时,捕获异常并向 stderr 输出红色错误提示Error: 'npx' command not found. Please ensure Node.js is installed ... and available in your PATH.,然后以退出码 1 结束,避免裸异常污染 Agent 的日志解析。
值得一提的是,虽然当前版本的 intelwatch_cli.py 尚未启用本仓库其他模块通用的交互皮肤,目录中已预置了该能力层(见 utils/repl_skin.py 中cli_anything/<software>/utils/repl_skin.py的统一约定),后续若扩展为交互式 REPL,可直接复用其ReplSkin的 banner、prompt、status、table 等样式组件,与整个 CLI-Anything 生态保持一致的终端品牌体验。
测试如何验证转发行为
该 harness 的测试全部围绕「参数是否被忠实转发、退出码是否传播、缺依赖如何报错」三条不变量展开,是理解桥接语义的最佳注脚。
test_core.py 覆盖三个单元场景:
test_argument_forwarding:runner.invoke(..., ['--query', 'recognity', '--format', 'json'])后断言subprocess.call收到的是['npx', 'intelwatch', '--query', 'recognity', '--format', 'json'],证明任意参数均按序透传;test_exit_code_propagation:模拟子进程返回码 2,断言sys.exit(2)被调用,证明退出码逐级传播;test_npx_not_found:模拟FileNotFoundError,断言输出包含Error: 'npx' command not found且退出码为 1,证明缺 Node.js 时给出友好报错而非崩溃。
test_full_e2e.py 则以--domain recognity.fr --format json为例做端到端模拟,在不真正触网、也不要求 CI 安装 npx 的前提下,验证了从 click 入口到npx intelwatch子进程的完整集成点闭环。由于测试通过unittest.mock.patch桩掉了subprocess.call,它们验证的是 harness 自身的接线正确性,而非上游工具的真实网络行为。
典型业务场景
综合文档与 Skill,这套 harness 在以下场景最具实战价值:
M&A 尽职调查(Due Diligence):面向目标公司域名执行带 AI 的深度画像,快速形成尽调初判:
cli-anything-intelwatch profile company-name.com --ai销售情报(Sales Intelligence):对潜在客户公司生成画像,帮助销售团队在触达前掌握技术栈与经营背景:
cli-anything-intelwatch profile target-client.comOSINT 数据桥接:在黑客式 OSINT 与 B2B 结构化数据之间建立快捷通道,把财务数据聚合、技术栈探测等任务压缩到「一次命令」内完成,输出可直接用于后续人工研判或二次处理。
使用注意与边界
- 依赖前置:本 harness 不打包 Node.js,也不负责拉取
intelwatchnpm 包——首次执行会触发npx按需下载,需要网络连通且机器可写 npm 缓存目录。 - 参数语义归属:
profile、--ai、--domain、--format等参数的含义、校验与输出格式完全由上游npx intelwatch决定,本 harness 不解析、不改造,升级上游时需回归验证参数表变化。 - 输出为人可读文本:如 SKILL.md 所述,输出面向人读的深度拆解报告;如需结构化消费,应关注上游是否支持
--format json等输出选项(测试用例中已出现该参数形态)。 - 退出码语义:harness 忠实传播子进程退出码(0 成功、非 0 失败),Agent 可直接依据退出码判断单次调用成败,无需解析 stdout 文本。
延伸:如何自行接入同类 Node 工具
这套 harness 的接入模式在 CLI-Anything 中具有很强的可复制性,核心要点可总结为三步:
- 构造透传管道:用 click 的
ignore_unknown_options=True与allow_extra_args=True关闭参数白名单,让所有上游参数进入ctx.args; - 直通子进程:
subprocess.call(["npx", "<package>"] + ctx.args)继承标准流并透传退出码,捕获FileNotFoundError输出友好提示; - 随包发布 Skill:在包内维护
skills/SKILL.md,通过setup.py的package_data声明随 Python 包分发,记录安装前提(如 Node 版本)、基本命令与场景示例,供pip install后的 Agent 自动发现。
参考 setup.py 可知,正是package_data中的skills/*.md让「Python 外壳 + Node 内核 + Agent Skill」三角结构得以闭环,这也是整个 CLI-Anything 仓库中每个 Node 系 harness 共用的标准做法。
【免费下载链接】CLI-Anything"CLI-Anything: Making ALL Software Agent-Native" -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考