ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

零代码搭 CLI:用声明式 YAML 把脚本、HTTP、SQL 全收进一条命令

零代码搭 CLI:用声明式 YAML 把脚本、HTTP、SQL 全收进一条命令 零代码搭 CLI用声明式 YAML 把脚本、HTTP、SQL 全收进一条命令【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything终端里的脚本越来越多风格却越来越乱有人习惯bash有人写python xx.py --input还有人直接 curl 一串 HTTP 接口、连库跑一段 SQL。散落各处、参数各异、输出千奇百怪——这正是很多团队在自动化规模上去之后遇到的第一道墙。CLI-Anything 给出的解法很直接把命令行工具本身变成一个可声明的 YAML 描述层脚本、HTTP、SQL 乃至 GUI 操作统一收敛成一条带--json的标准命令让人类和 AI Agent 都能稳定调用。这篇文章不写概念空谈直接从仓库源码出发拆解这条零代码搭 CLI的完整链路一个 YAML 文件如何长出一条命令、参数如何被自动校验、多后端适配器如何路由执行、输出又如何一键切到机器可读模式。从一个 YAML 文件长出一条命令仓库中 macrocli 是最典型的配置即命令实现。它把整个 CLI 的壳抽象成一组 YAML 宏定义集中放在macro_definitions/目录下由manifest.yaml作为索引注册macros: - name: export_file path: examples/export_file.yaml version: 1.0 - name: transform_json path: examples/transform_json.yaml version: 1.0每一条命令的定义就是一份可读的 YAML。以 transform_json.yaml 为例——读取 JSON、改一个嵌套键、写回完整声明如下name: transform_json version: 1.0 description: Read a JSON file, set a nested key to a new value, and write it back. parameters: file: type: string required: true description: Path to the JSON file to transform. key: type: string required: true example: settings.theme value: type: string required: true preconditions: - file_exists: ${file} steps: - id: step_set_key backend: file_transform action: json_set params: input_file: ${file} output_file: ${file} path: ${key} value: ${value} timeout_ms: 10000 on_failure: fail postconditions: - file_exists: ${file} outputs: - name: modified_file path: ${file} agent_hints: danger_level: moderate side_effects: [modifies_file] reversible: false注意几个细节${file}这种占位符由运行时解析源码中的substitute()负责${param}模板替换preconditions在动手前先确认输入文件存在postconditions执行后再验证产物——整条命令从输入假设到结果验收全部在描述层闭环而不是散落在过程式代码里。这也正是社区评价里反复提到的零样板 CLI新增一条命令不需要改任何 Python 代码核心模型中的load_from_yaml()一行加载运行时按定义走完整生命周期。三类适配器函数、HTTP、SQL 统一进命令YAML 描述层之下真正干活的是 backends/ 里的一组后端适配器。它们把目标能力抽象成标准接口路由引擎按优先级自动挑选最可靠的那个执行。函数 / 脚本适配器native_api最基础的适配器直接对接 subprocess——任何 Shell 命令、Python 脚本、二进制工具都被封装成命令步。看 native_api.py 中run_command的写法命令参数、工作目录、环境变量、stdout 捕获全部可声明steps: - id: export backend: native_api action: run_command params: command: [inkscape, --export-filename, /tmp/out.png, input.svg] cwd: /optional/working/dir env: {KEY: value} capture_stdout: true timeout_ms: 30000 on_failure: fail它还能做find_executable——执行前先用候选路径探测工具是否安装找不到就抛出带install_hint的友好错误。这让脚本散落的痛点变成不管脚本是 bash 还是 python纳管后对外只有一条命令。HTTP 适配器REST API 即命令HTTP 类型的适配在仓库中通过每个 harness 的utils/*_backend.py体现——用requests把远端 REST API 包装成命令。以 adguardhome_backend.py 所在的 AdGuardHome harness 为例CLI 层只声明 host/port/username 等连接参数业务命令内部统一走 HTTPcli-anything-adguardhome status --json cli-anything-adguardhome filtering add --domain example.com命令背后的逻辑全是requests.get/post调用测试代码 中可以看到对/control/status、/control/install/get_addresses等端点的真实请求。AnyGen 的 harness 同理anygen_backend.py 把云端 API 收编成cli-anything-anygen命令。对一个团队而言这意味着团队内部工具的 HTTP 接口、第三方 SaaS 的 API都能以同一种命令语法暴露Agent 不需要理解 HTTP 细节。SQL 适配器数据库查询进命令SQL 能力的证据同样扎实。多个 harness 直接内嵌 SQLite 读写cc-switch的 db.py 封装了sqlite3.connect、WAL 模式与 JSON 配置读写zotero的 zotero_sqlite.py 更是把桌面软件的本地数据库变成可查询的命令后端。它们在命令层统一表现为子命令 参数底层则是标准 SQL——数据查询由此被纳入了与脚本、HTTP 完全一致的调用范式。参数校验、补全与多输出模式YAML 描述层 适配器执行层已经能长命令但要让它被安全、稳定地调用还需要三件配套能力。参数模型与自动校验参数校验不是靠每个命令手写 if-else而是由 MacroParameter 的validate_value()统一驱动声明type、required、min/max、enum运行时自动完成类型强制转换、必填检查、范围与枚举校验。YAML 中只需写parameters: output: type: string required: true example: /tmp/diagram.png quality: type: integer min: 1 max: 100 default: 85结构性错误未知 backend、缺失 action、非法参数类型由MacroDefinition.validate()在加载阶段就拦截——配置错误在命令跑起来之前就被拒之门外这正是零代码不等于零防护的关键设计。补全与 REPL命令对人对 Agent 都可发现命令的可发现性来自三处Click 组的--help自动文档、REPL 交互皮肤repl_skin.py 对接 prompt_toolkit 实现高亮与补全、以及.pi-extension中为 Agent 提供的getArgumentCompletions动态参数补全.pi-extension/cli-anything/index.ts。结合 skill_generator.py 为每条命令生成的SKILL.md技能定义Agent 可以自动发现有什么命令、参数怎么填无需阅读源码。多输出模式human 与 machine 一键切换仓库里所有 harness 都遵守同一约定默认人类可读--json切机器可读。看 macrocli_cli.py 的output()与错误处理——--json模式下输出json.dumps(..., indent2)错误也以{error: ..., type: ...}结构化返回非 JSON 模式则缩进打印 dict/list。AdGuardHome 的 adguardhome_cli.py 同样在根命令上挂--jsonflag 统一接管输出格式。这个设计对 AI Agent 的意义怎么强调都不过分结构化 JSON 输出让 Agent 免去文本解析的脆弱环节配合--dry-run无副作用模拟执行macrocli 根命令自带该开关命令在接入自动化流水线前可以先空跑验证。一条命令整个生态把视野从单个 harness 拉远CLI-Anything 的价值在于统一。仓库根部的 registry.json 与 public_registry.json 记录了上百条可安装命令的元数据——名称、入口点、安装命令、SKILL.md 路径、分类devops/database/generation/testing...cli-hub 则提供cli-hub install/search/launch一条命令管理整个生态registry.py 处理注册表拉取、缓存与合并。于是零代码搭 CLI最终收敛为一句话写一个 YAML 定义能力装一个 harness 暴露命令配一个 SKILL.md 让 Agent 学会用它。无论底层是 Python 函数、远端 HTTP 接口还是本地 SQLite 数据库调用方看到的始终是同一套语法、同一套输出协议。对团队而言这是把脚本资产管理变成命令资产管理的最小路径对 AI Agent 而言这是把整个软件生态变成可稳定调用的函数库。这套设计正在被仓库里 50 个 harness 实践着——从 AdGuardHome 的 DNS 管理、WireMock 的 API 打桩到 CC Switch 的配置数据库、MacroCLI 的 GUI 宏无一例外都跑在声明式 YAML 适配器 标准输出这条主线上。当零代码真正落到工程执行的每一条命令上CLI 才第一次同时取悦了人类与机器。【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进