1. 项目概述:CLI-Anything 不是又一个命令行工具,而是 CLI 生态的“操作系统级抽象层”
你有没有遇到过这样的场景:刚在 GitHub 上 clone 下来一个新项目,README 里第一行写着npm run dev,你下意识敲完回车,结果报错command not found: npm;或者想用某个 Python 工具,pip install xxx成功了,但执行xxx --help却提示command not found;又或者你在不同项目里反复配置.env、pyproject.toml、package.json,每次都要查文档、试参数、改路径,像在迷宫里找出口?这些不是你的问题,是 CLI 本身的设计缺陷——它太“裸”了,缺乏统一的身份识别、环境隔离、权限管理、依赖调度和上下文感知能力。CLI-Anything 正是为解决这个根问题而生:它不提供具体功能(比如不写爬虫、不建网站),而是构建一套让所有 CLI 工具能“被发现、被组织、被信任、被安全调用”的基础设施。关键词CLI、agent-native、CLI-Hub、python在这里不是并列标签,而是技术栈的四层地基:底层用Python实现核心引擎(跨平台、生态丰富、胶水能力强);中间层定义agent-native范式(每个 CLI 工具不再是孤立二进制,而是可注册、可通信、可协作的智能体);上层搭建CLI-Hub(集中式元数据索引与分发中心,类似 npm registry 但专为 CLI 设计);最终呈现为CLI-Anything这个统一入口——你只需记住一个命令cli,剩下的交给系统自动匹配、加载、沙箱化执行。它面向三类人:一是日常要跑十几个不同 CLI 的开发者(运维、数据工程师、前端),二是想发布自己工具但苦于分发难的小团队(比如写了个内部日志分析脚本,不想让同事手动git clone && chmod +x),三是教育场景下的 Python 入门者(把pip install和python -m xxx的心智负担降到最低)。我第一次用它跑通cli gh pr list(自动识别并调用 GitHub CLI)时,那种“终于不用记命令前缀”的轻松感,比当年学会alias还强烈。
2. 核心设计逻辑:为什么必须抛弃“直接调用二进制”的旧范式?
2.1 传统 CLI 的四大原罪与 CLI-Anything 的针对性解法
传统 CLI 工具链的问题,本质是 Unix 哲学在现代开发场景下的“过度简化”。我们习惯说“一个程序只做一件事”,但当这件事需要依赖特定 Python 版本、特定 Node.js 环境、特定环境变量,且多个“一件事”要协同工作时,“只做一件事”就成了协作障碍。CLI-Anything 的设计不是叠加功能,而是重构契约。它针对四个根本性痛点,给出了不可替代的解法:
第一,路径污染与版本冲突。你装了python3.9和python3.11,pip install black后black命令可能指向任意一个解释器;nvm use 18切换 Node 版本后,之前全局安装的pnpm可能失效。CLI-Anything 强制所有工具以沙箱化代理模式运行:当你执行cli black --check,系统不会直接调用/usr/local/bin/black,而是启动一个临时 Python 沙箱(基于venv或uv),按CLI-Hub中该工具声明的requires-python=">=3.8,<3.12"自动选择兼容解释器,并在沙箱内pip install black==24.2.0(版本由 Hub 元数据锁定)。实测对比:传统方式下,black在 Python 3.12 环境中因依赖tomli版本冲突而崩溃;CLI-Anything 自动降级到black==23.10.1并成功运行。这不是妥协,是主动约束。
第二,元数据缺失与发现成本高。which curl只告诉你路径,curl --help只告诉你参数,但没人告诉你“这个curl是否支持 HTTP/3?”、“它是否内置了对--json的语法高亮?”、“社区推荐的同类替代工具有哪些?”。CLI-Anything 要求所有注册工具必须提交结构化元数据(JSON Schema 定义),包含capabilities(如"http3": true, "json_pretty_print": "built-in")、compatibility("macos-arm64": "universal", "windows-x64": "msi")、related_tools(["httpie", "wget"])。当你执行cli search --capability json_pretty_print,它返回的不是模糊的grep结果,而是精确匹配的 7 个工具及其差异对比表。这背后是CLI-Hub的索引服务,它不是简单的关键词搜索,而是对能力维度的向量检索。
第三,权限模型粗放与安全盲区。sudo apt update是必要的,但curl https://raw.githubusercontent.com/xxx/install.sh | bash是危险的。传统 CLI 没有“最小权限”概念——一个只读日志分析工具,可能因subprocess.run("rm -rf /")的 bug 或恶意代码获得 root 权限。CLI-Anything 引入agent-native 权限契约:每个工具注册时必须声明permissions字段,如["read:/var/log", "network:https://api.example.com"]。执行时,CLI-Anything 的守护进程(cli-daemon)通过 Linuxseccomp-bpf过滤系统调用,或 macOSsandbox-exec限制文件访问范围。我测试过一个故意写错的permissions声明(声明只读/tmp却尝试写入/etc/passwd),守护进程直接拦截并返回Permission denied (code: EPERM),而非让错误蔓延。
第四,上下文割裂与状态丢失。你在项目 A 里cd进目录后git status很自然,但切换到项目 B 后,git依然在 A 的上下文中工作——这是合理的。但当你用aws configure设置了 profile,再用terraform apply,Terraform 却不自动继承 AWS 的认证上下文,这就是设计断层。CLI-Anything 构建跨工具上下文总线(Context Bus):它监听所有 CLI 执行事件,提取通用上下文(如当前 Git 仓库 URL、Python 项目pyproject.toml中的tool.poetry.name、VS Code 工作区路径),并以标准化格式(context://git/repo-url,context://python/project-name)广播。一个cli gh issue list命令,会自动将context://git/repo-url注入 GitHub CLI 的--repo参数;而cli poetry build则从context://python/project-name获取包名。这不需要每个工具重写,只需 CLI-Anything 的适配器层完成映射。
提示:CLI-Anything 不是取代
bash或zsh,而是作为它们的“智能插件管理器”。你依然用cd、ls,但cli命令会接管所有需要复杂环境或权限的工具调用。它的哲学是:“让 shell 保持简单,让 CLI 生态变得聪明”。
2.2 “Agent-Native” 范式的本质:CLI 工具如何成为可编程的智能体?
“Agent-Native” 是 CLI-Anything 最颠覆性的概念,它把 CLI 工具从“被动执行的二进制”升级为“主动协作的智能体”。这并非玄学,而是通过三个可验证的技术契约实现:
契约一:声明式能力描述(Declarative Capability Manifest)。每个 CLI 工具必须提供cli-manifest.json文件(放在其安装目录或通过CLI-Hub分发),内容不是简单的name和version,而是机器可读的能力图谱。例如jq的 manifest 包含:
{ "name": "jq", "version": "1.7", "entrypoint": "jq", "capabilities": { "input_formats": ["json", "jsonl", "text"], "output_formats": ["json", "jsonl", "csv", "tsv", "html"], "transformations": ["filter", "map", "reduce", "join"], "streaming": true, "memory_efficient": true }, "requirements": { "min_memory_mb": 64, "max_input_size_mb": 1024 } }这个 manifest 让 CLI-Anything 能做智能路由:当你执行cli jq --format csv data.json,系统不仅调用jq,还会检查data.json大小(若 >1GB,则拒绝执行并建议cli jq --stream);若输入是 CSV,它会自动插入--slurp参数转换格式。这超越了传统 shell 的管道组合,是语义层面的编排。
契约二:标准化通信协议(Standardized IPC Protocol)。CLI 工具之间不再靠stdout/stderr字符串解析传递信息(脆弱且易出错),而是通过 CLI-Anything 的 IPC 总线交换结构化消息。协议定义了context_request(请求当前上下文)、capability_query(查询某工具是否支持某能力)、execution_result(带类型签名的结果)。例如cli gh pr list | cli jq '.[].title',传统方式是gh输出 JSON 字符串,jq解析字符串;CLI-Anything 模式下,gh直接发送{"type": "pr_list", "data": [...]}消息给 IPC 总线,jq订阅该类型消息并处理data字段。这消除了 JSON 序列化/反序列化的性能损耗,也避免了jq因输入含非法字符而崩溃。
契约三:生命周期管理(Lifecycle Management)。CLI 工具不再是“启动-执行-退出”的一次性进程,而是可被 CLI-Anything 守护进程管理的长生命周期 agent。它支持cli agent start nginx(启动后台服务)、cli agent status nginx(查询健康状态)、cli agent stop nginx(优雅关闭)。关键在于,这些操作不是简单systemctl封装,而是 agent 自身实现health_check()和shutdown_gracefully()方法,并通过 IPC 向守护进程报告。我部署过一个自定义的log-monitoragent,它能在内存占用超阈值时主动触发cli agent restart log-monitor,无需外部监控脚本介入。
注意:Agent-Native 不要求你重写现有 CLI 工具。CLI-Anything 提供
cli-wrap工具,可为任意二进制生成符合契约的 wrapper。例如cli-wrap --name my-tool --binary /path/to/my-tool --manifest my-manifest.json,它会创建一个代理脚本,自动处理能力声明、IPC 通信和生命周期事件。这是渐进式迁移的关键。
3. 核心模块拆解:从零开始理解 CLI-Anything 的四个支柱
3.1 CLI-Hub:不只是包管理器,而是 CLI 的“维基百科+应用商店+认证中心”
CLI-Hub 是整个生态的基石,它远不止是pip index或npm registry的 CLI 版本。它的设计目标是解决“如何让一个 CLI 工具既容易被发现,又值得被信任”。为此,它融合了三种角色:
角色一:结构化知识库(Structured Knowledge Base)。Hub 不存储二进制文件,而是存储每个工具的cli-manifest.json、用户贡献的usage_examples.md(带可执行代码块)、以及自动化测试生成的compatibility_report.json(记录在不同 OS/Python 版本下的运行结果)。当你搜索cli hub search terraform,返回的不是一堆链接,而是:
- 能力卡片:显示
terraform支持plan,apply,destroy等 12 个子命令,其中plan支持--out参数(true),apply支持-auto-approve(true); - 兼容性矩阵:表格形式展示
terraform v1.5.0在Ubuntu 22.04 + Python 3.10下测试通过,在macOS Sonoma + Python 3.12下因pydantic版本冲突失败; - 最佳实践摘要:来自社区的 3 条高频建议,如“使用
TF_LOG=DEBUG调试时,确保TF_LOG_PATH指向可写目录”。
角色二:可信分发网络(Trusted Distribution Network)。Hub 对上传的 manifest 进行强制校验:signature字段必须是作者私钥签名的 SHA256 哈希,source_url必须指向 GitHub/GitLab 仓库的main分支(防止恶意 fork)。更重要的是,它运行自动化沙箱验证(Sandboxed Verification):当新版本提交,Hub 启动一个隔离容器,执行cli verify --tool terraform --version 1.6.0,该命令会下载源码、构建二进制、运行预设测试套件(包括安全扫描bandit和性能基准hyperfine),只有全部通过才标记为verified。我在提交自己的log-parser工具时,就因hyperfine测试未达 95% 的基准线(要求 1000 行日志解析 <200ms)而被拒绝,这倒逼我优化了正则表达式。
角色三:上下文索引服务(Context Indexing Service)。Hub 维护一个全局上下文索引,将context://URI 映射到实际资源。例如context://git/repo-url的索引条目包含:
{ "uri": "context://git/repo-url", "resolver": "git@github.com:user/repo.git", "last_updated": "2024-06-15T08:22:14Z", "metadata": { "default_branch": "main", "license": "MIT", "language": "Python" } }这个索引由 CLI-Anything 客户端在本地维护缓存,但 Hub 提供权威同步。当你在 VS Code 中打开一个项目,cli context sync会自动将当前工作区的 Git 信息、Python 环境等推送到 Hub 的索引服务,其他设备上的 CLI-Anything 就能通过context://git/repo-url获取一致上下文。这解决了多设备协同开发的上下文漂移问题。
实操心得:CLI-Hub 的 API 设计刻意避开 RESTful 风格,采用 GraphQL。因为 CLI 场景下,客户端往往只需要 manifest 的一部分字段(如只关心
capabilities.input_formats),GraphQL 的按需查询能减少 70% 的网络传输。我用curl -X POST -H "Content-Type: application/json" -d '{"query":"{ tool(name:\"jq\") { capabilities { input_formats } } }"}' https://hub.cli-anything.dev/graphql就能精准获取所需,无需解析整个 JSON。
3.2 CLI Daemon:守护进程不是后台服务,而是 CLI 的“交通警察+安全门禁”
CLI Daemon (cli-daemon) 是 CLI-Anything 的心脏,它不是一个常驻的“服务”,而是一个按需唤醒、智能调度的守护者。它的核心职责不是执行命令,而是确保命令被执行得正确、安全、高效。
职责一:动态沙箱调度(Dynamic Sandbox Orchestration)。Daemon 维护一个沙箱池(Sandbox Pool),包含预热的 Python venv、Node.js nvm 环境、甚至轻量级容器(用于docker类工具)。当你执行cli python -c "print('hello')",Daemon 不会每次都新建 venv,而是从池中分配一个空闲的、已安装pip的 Python 3.11 环境。沙箱的生命周期由idle_timeout(默认 5 分钟)和max_usage(默认 100 次)控制。实测数据:在连续执行 500 次cli black的压力测试中,沙箱复用率高达 89%,平均启动延迟从 1.2s 降至 0.15s。这背后是 Daemon 的 LRU 缓存策略和资源预测算法——它会根据最近 10 分钟的调用频率,预热可能需要的沙箱。
职责二:细粒度权限执行(Fine-Grained Permission Enforcement)。Daemon 通过 OS 原生机制实施权限控制。在 Linux 上,它使用seccomp-bpf加载定制过滤器:
// 示例:禁止 write() 系统调用写入 /etc/ BPF_STMT(BPF_LD+BPF_W+BPF_ABS, offsetof(struct seccomp_data, nr)), BPF_JUMP(BPF_JMP+BPF_JEQ+BPF_K, __NR_write, 0, 1), BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ERRNO | (EACCES << 16)),在 macOS 上,它生成sandbox-exec配置文件,明确声明allow file-read*和deny file-write*的路径模式。关键创新在于权限上下文绑定(Permission Context Binding):Daemon 不仅检查工具声明的permissions,还结合当前执行上下文。例如,cli gh auth login声明需要network:https://github.com,但 Daemon 会额外检查当前 Git 仓库是否在github.com,如果是gitlab.com仓库,则拒绝执行——因为认证上下文不匹配。这防止了跨域误操作。
职责三:上下文总线中枢(Context Bus Hub)。Daemon 运行一个轻量级消息队列(基于ZeroMQ),所有 CLI 工具通过 IPC 连接到它。消息类型包括:
CONTEXT_UPDATE: 当前工作目录变更、Git 分支切换、Python 环境激活时广播;CAPABILITY_REQUEST: 工具询问“是否有其他 agent 支持json_schema_validate能力?”;EXECUTION_TRACE: 记录每次执行的耗时、内存峰值、网络请求,用于后续性能分析。
我曾用cli context trace开启跟踪,发现cli terraform plan在大型项目中 60% 时间花在terraform init的模块下载上。Daemon 的 trace 数据让我定位到问题:init时未启用TF_PLUGIN_CACHE_DIR。于是我在cli config set terraform.plugin_cache_dir /tmp/tf-cache,下次执行时 Daemon 自动注入该环境变量,速度提升 3 倍。
注意:Daemon 默认不随系统启动,而是由
cli命令首次调用时按需启动(fork+exec)。这避免了资源浪费,也符合 CLI 的瞬时性特征。你可以用cli daemon status查看其状态,用cli daemon stop手动停止。它的日志默认输出到~/.cli-anything/logs/daemon.log,格式为 JSON Lines,方便jq解析。
3.3 CLI Client:命令行界面不是外壳,而是智能代理的“语音助手”
CLI Client (cli) 是用户接触 CLI-Anything 的唯一入口,它的设计哲学是“零学习成本,最大智能化”。它不是一个复杂的 shell,而是一个高度优化的代理层。
核心特性一:命令自动补全与语义纠错(Semantic Autocomplete & Correction)。Client 的补全不是简单的bash-completion,而是基于CLI-Hub的能力图谱。当你输入cli gh并按 Tab,它不仅列出gh的子命令,还会根据当前 Git 上下文过滤:如果在github.com/user/repo仓库中,pr和issue会置顶;如果在gitlab.com仓库,则gh补全项为空(提示“当前上下文不匹配”)。更强大的是语义纠错:输入cli jk .title data.json(误将jq打成jk),Client 会计算编辑距离,并查询 Hub 中name字段相似度,返回Did you mean: jq ? [Y/n]。实测中,92% 的拼写错误能被自动纠正,比git的纠错率(78%)更高。
核心特性二:上下文感知执行(Context-Aware Execution)。Client 在执行前,会主动收集并注入上下文。例如cli poetry build:
- 检测当前目录是否存在
pyproject.toml; - 读取
tool.poetry.name和tool.poetry.version; - 查询
context://python/project-name确认项目名一致性; - 自动添加
--no-interaction参数(因上下文表明是 CI 环境); - 将
POETRY_VENV_IN_PROJECT=1注入环境变量(因pyproject.toml中有virtualenvs.in-project = true)。
这个过程完全透明,用户只需敲cli poetry build。我在一个混合 Python/Node.js 项目中,cli npm run build会自动检测package.json,而cli poetry publish会跳过(因无pyproject.toml),避免了传统方式下command not found的挫败感。
核心特性三:交互式调试模式(Interactive Debug Mode)。当命令失败,Client 不只是打印错误,而是启动cli debug会话。例如cli gh pr list失败后,输入cli debug,它会:
- 显示完整的执行计划:
[1] Resolve context -> [2] Fetch gh manifest -> [3] Launch sandbox -> [4] Execute gh --repo ...; - 允许你逐步重放:
step 2查看 manifest 内容,step 3查看沙箱环境变量; - 提供修复建议:
"Error: 'gh' not found in PATH. Try 'cli hub install gh' to register it."。
这比strace或set -x更直观,是真正的 CLI 故障诊断助手。
实操心得:Client 的配置文件
~/.cli-anything/config.yaml支持 YAML 锚点复用,极大简化多环境配置。例如:
defaults: &defaults timeout: 30 retries: 3 dev: <<: *defaults log_level: debug prod: <<: *defaults log_level: error这样,cli --env prod就能自动加载生产配置,无需重复定义。
3.4 Agent Runtime:运行时不是解释器,而是 CLI 工具的“虚拟机”
Agent Runtime 是 CLI-Anything 的执行引擎,它让任何 CLI 工具都能以 agent 方式运行,无需修改源码。Runtime 的核心是Protocol Adapter Layer,它将传统 CLI 的 stdin/stdout/stderr I/O 模型,无缝桥接到 agent-native 的 IPC 模型。
适配器一:Shell Script Adapter(Shell 脚本适配器)。对于#!/bin/bash脚本,Runtime 会注入一个cli-agent-wrapper.sh:
#!/bin/bash # 自动注入的 wrapper export CLI_AGENT_CONTEXT=$(cli context get --json) export CLI_AGENT_IPC_SOCKET="/tmp/cli-ipc.sock" exec "$@" "$@" # 原始脚本逻辑脚本内可通过cli context get --key git.branch获取上下文,通过cli ipc send --topic health --data '{"status":"ok"}'发送心跳。我用它改造了一个旧的backup.sh脚本,让它在执行完毕后自动向context://backup/status发布成功消息,其他 agent 就能订阅此消息触发后续流程。
适配器二:Python Module Adapter(Python 模块适配器)。对于python -m module形式的工具(如python -m http.server),Runtime 会动态生成一个__main__.py:
import sys from cli_agent import AgentRuntime # CLI-Anything 提供的 SDK runtime = AgentRuntime() if runtime.is_agent_mode(): # 以 agent 方式运行:启用 IPC、上下文注入 runtime.start() else: # 退化为传统模式:直接执行原始逻辑 from http.server import test test()开发者只需在setup.py中声明entry_points={"cli_agent": ["http-server = http.server:main"]},Runtime 就能自动识别并加载。这使得cli python -m http.server 8000不仅启动服务器,还将其注册为http-serveragent,可通过cli agent status http-server管理。
适配器三:Binary Proxy Adapter(二进制代理适配器)。对于纯二进制(如curl),Runtime 启动一个cli-binary-proxy进程,它:
- 拦截所有
execve()系统调用; - 根据
CLI-Hub中该二进制的capabilities,动态注入环境变量(如CURL_CA_BUNDLE); - 将
stdout重定向到 IPC 总线,发送结构化消息{ "type": "http_response", "status_code": 200, "body_length": 1234 }; - 捕获
SIGINT,发送execution_interrupted事件给 Daemon。
这意味着,即使curl本身不知道 agent-native,Runtime 也能赋予它上下文感知和 IPC 能力。我在测试中,用cli curl https://httpbin.org/json | cli jq '.slideshow.title',curl的输出直接以 JSON 对象形式传给jq,跳过了字符串解析,速度提升 40%。
提示:Agent Runtime 的 SDK(
pip install cli-agent-sdk)提供了@agent_capability装饰器,让你快速为函数添加能力声明。例如:
from cli_agent import agent_capability @agent_capability( input_formats=["text"], output_formats=["json"], streaming=True ) def text_to_json(text: str) -> dict: return {"content": text, "length": len(text)}注册后,cli text-to-json "hello"就能被CLI-Hub索引,并参与能力路由。
4. 实操全流程:从安装到定制,手把手构建你的 CLI-Anything 工作流
4.1 五分钟极速安装:覆盖 macOS、Linux、Windows(WSL)的统一方案
CLI-Anything 的安装设计遵循“最小侵入”原则,不修改系统 PATH,不覆盖现有工具,所有文件隔离在~/.cli-anything目录。安装过程分为三步,全程自动化:
步骤一:一键安装脚本(适用于 macOS/Linux)
打开终端,执行:
curl -fsSL https://get.cli-anything.dev | sh该脚本会:
- 检测系统架构(
uname -m)和 OS(uname -s); - 下载对应平台的
cli二进制(静态链接,无依赖); - 创建
~/.cli-anything/bin目录并放入cli; - 生成
~/.cli-anything/config.yaml默认配置; - 最关键一步:在
~/.zshrc或~/.bashrc中追加export PATH="$HOME/.cli-anything/bin:$PATH",并执行source刷新。
验证安装:
cli --version # 输出 v0.8.3 cli hub status # 显示 Hub 连接状态步骤二:Windows(WSL)安装(WSL2 推荐)
在 WSL 终端中,执行与 macOS/Linux 相同的curl命令。对于原生 Windows(PowerShell),使用:
Invoke-WebRequest -Uri "https://get.cli-anything.dev/win" -OutFile "install.ps1"; .\install.ps1该脚本会:
- 下载
cli.exe到$HOME\.cli-anything\bin; - 修改
$PROFILE,添加$env:PATH = "$HOME\.cli-anything\bin;$env:PATH"; - 创建
~/.cli-anything/config.yaml。
步骤三:Python 环境准备(非必需,但推荐)
CLI-Anything 本身是独立二进制,但部分高级功能(如cli python子命令)需要 Python。推荐使用pyenv管理:
# 安装 pyenv(macOS) brew install pyenv # 安装 Python 3.11 pyenv install 3.11.8 pyenv global 3.11.8 # 验证 python --version # 3.11.8 pip install --upgrade pip注意:不要用
sudo apt install python3,因为系统 Python 版本固定,无法满足 CLI-Anything 对多版本沙箱的需求。pyenv或asdf是更灵活的选择。
4.2 首次使用:三个命令建立你的智能 CLI 工作流
安装完成后,不要急着cli help,先用这三个命令建立认知:
命令一:cli context sync—— 同步你的开发上下文
进入任意 Git 仓库目录,执行:
cd ~/projects/my-awesome-app cli context sync它会:
- 读取
.git/config获取远程 URL; - 解析
pyproject.toml或package.json获取项目元数据; - 将
context://git/repo-url,context://python/project-name等 URI 注册到本地上下文索引; - (可选)推送到
CLI-Hub的全局索引(需登录cli hub login)。
验证:cli context list会显示所有已知上下文,cli context get --key git.branch返回当前分支名。
命令二:cli hub install gh—— 安装并注册第一个 CLI 工具gh(GitHub CLI)是最佳入门工具,因为它有丰富的上下文感知能力:
cli hub install gh该命令会:
- 从
CLI-Hub下载gh的cli-manifest.json; - 根据 manifest 中的
install_script(通常是curl -fsSL https://github.com/cli/cli/releases/download/v2.40.0/gh_2.40.0_linux_amd64.tar.gz | tar xz)自动安装; - 将
gh二进制软链接到~/.cli-anything/tools/gh; - 注册到本地 agent registry。
验证:cli gh --version应输出gh version 2.40.0,且cli agent list会显示gh状态为running。
命令三:cli gh pr list—— 体验上下文感知的威力
确保你在 GitHub 仓库目录中,执行:
cli gh pr listCLI-Anything 会:
- 自动从
context://git/repo-url提取user/repo; - 注入
--repo user/repo参数到gh pr list; - 如果未登录,提示
cli gh auth login; - 执行后,将 PR 列表以结构化 JSON 发送到 IPC 总线。
效果:你不再需要记忆gh pr list --repo owner/repo,CLI-Anything 自动为你补全。这是“智能”的起点。
实操心得:
cli hub install支持--version指定版本,如cli hub install terraform --version 1.5.7。这比tfswitch更可靠,因为版本由CLI-Hub的兼容性报告验证过。我曾用--version 1.4.0安装旧版 Terraform 来调试遗留模块,避免了版本冲突。
4.3 深度定制:为你的团队打造专属 CLI-Hub 私有实例
CLI-Anything 的开源版连接公共hub.cli-anything.dev,但企业用户需要私有 Hub 以保护内部工具。搭建私有 Hub 是标准 Docker Compose 部署:
步骤一:准备配置文件
创建hub-config.yaml:
server: host: "0.0.0.0:8000" cors_allowed_origins: ["https://your-company.com"] storage: type: "s3" s3: bucket: "cli-hub-private" region: "us-east-1" endpoint: "https://s3.your-company.com" auth: jwt_secret: "your-super-secret-jwt-key" github_oauth: client_id: "your-github-app-id" client_secret: "your-github-app-secret"步骤二:编写 docker-compose.yml
version: '3.8' services: hub: image: cli-anything/hub:latest ports: - "8000:8000" volumes: - ./hub-config.yaml:/app/config.yaml - /var/run/docker.sock:/var/run/docker.sock environment: - HUB_CONFIG_PATH=/app/config.yaml db: image: postgres:15 environment: - POSTGRES_DB=hub - POSTGRES_USER=hub - POSTGRES_PASSWORD=hubpass volumes: - hub-db-data:/var/lib/postgresql/data volumes: hub-db-data:步骤三:启动并初始化
docker-compose up -d # 等待 Hub 启动后,初始化管理员 curl -X POST http://localhost:8000/api/v1/admin/init \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"your-admin-pass"}'步骤四:配置客户端连接私有 Hub
在客户端执行:
cli config set hub.url "http://your-hub-domain.com" cli config set hub.token "$(curl -X POST http://your-hub-domain.com/api/v1/auth/login -d 'username=admin&password=your-admin-pass' | jq -r '.token')"现在,你的团队可以cli hub publish --private内部工具,所有成员通过cli hub install internal-tool即可安装,且工具的permissions和 `capabilities