
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.11pip install black后black命令可能指向任意一个解释器nvm use 18切换 Node 版本后之前全局安装的pnpm可能失效。CLI-Anything 强制所有工具以沙箱化代理模式运行当你执行cli black --check系统不会直接调用/usr/local/bin/black而是启动一个临时 Python 沙箱基于venv或uv按CLI-Hub中该工具声明的requires-python3.8,3.12自动选择兼容解释器并在沙箱内pip install black24.2.0版本由 Hub 元数据锁定。实测对比传统方式下black在 Python 3.12 环境中因依赖tomli版本冲突而崩溃CLI-Anything 自动降级到black23.10.1并成功运行。这不是妥协是主动约束。第二元数据缺失与发现成本高。which curl只告诉你路径curl --help只告诉你参数但没人告诉你“这个curl是否支持 HTTP/3”、“它是否内置了对--json的语法高亮”、“社区推荐的同类替代工具有哪些”。CLI-Anything 要求所有注册工具必须提交结构化元数据JSON Schema 定义包含capabilities如http3: true, json_pretty_print: built-in、compatibilitymacos-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 applyTerraform 却不自动继承 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参数trueapply支持-auto-approvetrue兼容性矩阵表格形式展示terraform v1.5.0在Ubuntu 22.04 Python 3.10下测试通过在macOS Sonoma Python 3.12下因pydantic版本冲突失败最佳实践摘要来自社区的 3 条高频建议如“使用TF_LOGDEBUG调试时确保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: gitgithub.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_formatsGraphQL 的按需查询能减少 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_LDBPF_WBPF_ABS, offsetof(struct seccomp_data, nr)), BPF_JUMP(BPF_JMPBPF_JEQBPF_K, __NR_write, 0, 1), BPF_STMT(BPF_RETBPF_K, SECCOMP_RET_ERRNO | (EACCES 16)),在 macOS 上它生成sandbox-exec配置文件明确声明allow file-read*和deny file-write*的路径模式。关键创新在于权限上下文绑定Permission Context BindingDaemon 不仅检查工具声明的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命令首次调用时按需启动forkexec。这避免了资源浪费也符合 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打成jkClient 会计算编辑距离并查询 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_PROJECT1注入环境变量因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 AdapterShell 脚本适配器。对于#!/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 AdapterPython 模块适配器。对于python -m module形式的工具如python -m http.serverRuntime 会动态生成一个__main__.pyimport 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二进制代理适配器。对于纯二进制如curlRuntime 启动一个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-nativeRuntime 也能赋予它上下文感知和 IPC 能力。我在测试中用cli curl https://httpbin.org/json | cli jq .slideshow.titlecurl的输出直接以 JSON 对象形式传给jq跳过了字符串解析速度提升 40%。提示Agent Runtime 的 SDKpip install cli-agent-sdk提供了agent_capability装饰器让你快速为函数添加能力声明。例如from cli_agent import agent_capability agent_capability( input_formats[text], output_formats[json], streamingTrue ) 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、WindowsWSL的统一方案CLI-Anything 的安装设计遵循“最小侵入”原则不修改系统 PATH不覆盖现有工具所有文件隔离在~/.cli-anything目录。安装过程分为三步全程自动化步骤一一键安装脚本适用于 macOS/Linux打开终端执行curl -fsSL https://get.cli-anything.dev | sh该脚本会检测系统架构uname -m和 OSuname -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 连接状态步骤二WindowsWSL安装WSL2 推荐在 WSL 终端中执行与 macOS/Linux 相同的curl命令。对于原生 WindowsPowerShell使用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管理# 安装 pyenvmacOS 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 工具ghGitHub 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/repoCLI-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.yamlserver: 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.ymlversion: 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_DBhub - POSTGRES_USERhub - POSTGRES_PASSWORDhubpass 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 usernameadminpasswordyour-admin-pass | jq -r .token)现在你的团队可以cli hub publish --private内部工具所有成员通过cli hub install internal-tool即可安装且工具的permissions和 capabilities