尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

CLI-Anything 把GUI软件变成AI命令行:3个决策定生死

CLI-Anything 把GUI软件变成AI命令行:3个决策定生死 CLI-Anything 把GUI软件变成AI命令行3个决策定生死【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-AnythingCLI-Anything 是一个为任意软件构建 AI 原生命令行接口的开源项目。它把 Blender、GIMP、LibreOffice 这类原本为人类设计的 GUI 应用包一层 AI 代理能直接在终端操作的 CLI让你的 AI agent 不用再看屏幕就能干活。 场景钩子你让 AI 把那份 PPT 导出成 PDF它盯着 GUI 界面愣了十秒——然后你开始想如果它有一根命令行会怎样CLI-Anything 就是干这个的把任意 GUI 软件包一层 AI 能直接操作的命令行接口。️ 全景拆解看这张架构图把整个项目当成一条流水线。输入端喂进一个目标软件的代码库分析出它的后端引擎、API 映射和数据模型处理端按分析结果设计状态模型和命令结构写出 CLI 与真实软件调用层再过三道测试关输出端是一个可pip安装的 PyPI 包外加一份 AI 代理能直接读的 SKILL.md。任何新软件走的是同一条流水线产出同一形态的交付物。⚖️ 三个关键设计决策调真实软件还是用 Python 重模拟这条是红线问题你希望 CLI 真能产出成品但成品只能从软件的渲染引擎里长出来。错误做法拿 Pillow 拼图层去模拟 GIMP或者只生成 bpy 脚本却从不调用 Blender。我踩过这类坑的评审现场它产出一个处理不了真实工作负载的玩具行为和真实软件完全脱节——用户装的 GIMP 是哪个版本、滤镜参数怎么命名、alpha 通道怎么处理全对不上。正确做法直接拿软件的 CLI/脚本接口当后端。GIMP 是gimp -i -b (script-fu-console-eval ...)Blender 是blender --background --python script.pyLibreOffice 是libreoffice --headless --convert-to pdf。生成合法的项目文件或中间文件然后交给真实软件渲染。软件是必需依赖不是可选项。为什么CLI 的职责是理解项目、表达意图按真实行为渲染交给真正的引擎。职责一拆开行为就永远和真实软件一致。交互模型选型有状态 REPL 和无状态子命令各管什么问题同一个 CLI 要伺候两个主人——AI 代理的管线和人的交互操作。错误做法二选一硬推。纯无状态子命令人编辑 20 步就要传 20 次--project还没有撤销纯有状态 REPL代理没法把它拼进一次性管线里。正确做法同一个 CLI 里两者都有。子命令无状态、一条命令一件事、输出 JSON代理爱用REPL 持一个会话带 undo/redo人爱用。交互层统一用repl_skin.py里的ReplSkin横幅、提示符、颜色消息全套皮肤所有 CLI 长得一样from cli_anything.gimp.utils.repl_skin import ReplSkin skin ReplSkin(gimp, version1.0.0) skin.print_banner() pt_session skin.create_prompt_session() # prompt_toolkit 会话 line skin.get_input(pt_session, project_namedemo) skin.success(Saved) # ✓ 绿色 skin.error(Not found) # ✗ 红色为什么状态是 session 层的实现细节命令层保持无状态。代理的调用不依赖你之前做了什么测试才能用 subprocess 一条命令一条命令地写。命名空间包怎么配才不冲突问题仓库里 60 多个 CLI每个都是独立 PyPI 包包路径全在cli_anything前缀下。错误做法在每个包的cli_anything/目录里放__init__.py。后果装第二个包时第一个包的命名空间目录被覆盖先装的命令直接消失。这里你别那么写原因是普通包会独占cli_anything这个顶层目录两个包必然打架。正确做法cli_anything/目录不放__init__.pyPEP 420 命名空间包每个子包gimp/、blender/自己带__init__.py。为什么这样site-packages/cli_anything/下多个独立安装的包的子目录可以并排共存互不覆盖。这是硬约束违反就装不了第二个。 动手搭建先看标准骨架注意那个关键注释gimp/ └── agent-harness/ ├── GIMP.md # 项目特定分析与 SOP ├── setup.py └── cli_anything/ # ← 注意这里没有 __init__.pyPEP 420 命名空间包 └── gimp/ ├── __init__.py # 子包有 __init__.py ├── __main__.py # python -m cli_anything.gimp 入口 ├── gimp_cli.py # 主 CLIClick REPL ├── core/ # 领域模块project/export/session... ├── utils/ │ ├── gimp_backend.py # 真实软件调用层 │ └── repl_skin.py # 统一 REPL 皮肤 └── tests/ ├── TEST.md # 测试计划 结果 ├── test_core.py └── test_full_e2e.py先跑通最小闭环。别一上来就碰真实软件先用纯 Python 把建项目 → 查项目跑通import click, json click.group() def cli(): pass cli.command click.option(--out, defaultproject.json) def new(out): json.dump({name: demo, layers: []}, open(out, w)) click.echo(f✓ created {out}) if __name__ __main__: cli()这一步的价值是逼你想清楚状态模型项目存成什么结构、哪些字段会变。后面所有模块都挂在它上面。再接真实后端。写utils/gimp_backend.py这是唯一允许subprocess的地方import shutil, subprocess def batch_script_fu(script: str) - dict: 调用真实 GIMP无界面 Script-Fu 批处理模式 gimp shutil.which(gimp) if not gimp: raise RuntimeError(GIMP 未安装apt install gimp) cmd [gimp, -i, -b, script, -b, (gimp-quit 0)] r subprocess.run(cmd, capture_outputTrue, textTrue, timeout120) return {stdout: r.stdout, returncode: r.returncode}注意缺软件时直接抛错不降级、不假装成功。再补测试。三道质量关对应三个位置test_core.py放合成数据单测test_full_e2e.py里放文件管道验证和真实后端全流程最后一条子进程测试从命令行调自己class TestRealBackendE2E: def test_render_real_output(self, tmp_path): proj, out tmp_path / p.json, tmp_path / r.png self._run([canvas, new, -o, str(proj)]) # _run 即 subprocess.run self._run([--project, str(proj), export, render, str(out)]) assert out.exists() and out.stat().st_size 0 print(ARTIFACT:, out) # 打印工件路径留给人工核查最后打包。命名空间包加入口点就这几行from setuptools import setup, find_namespace_packages setup( namecli-anything-gimp, # ← 关键1PyPI 包名 version1.0.0, packagesfind_namespace_packages(include[cli_anything.*]), # ← 关键2 install_requires[click8.0.0, prompt-toolkit3.0.0], entry_points{ # ← 关键3 console_scripts: [ cli-anything-gimpcli_anything.gimp.gimp_cli:main, ], }, python_requires3.10, ) 三个质量关卡关卡一合成数据自测。验什么项目构建、状态流转、参数转换这些纯逻辑对不对。怎么验全部写在test_core.py合成数据不碰真实软件整套 5 秒内跑完。不通过bug 一定在你自己代码里定位精准直接修。这层最便宜先跑它。关卡二文件管道验证。验什么中间文件ODF/MLT/项目 JSON结构对不对、是否良构、该有的元素在不在。怎么验解析生成的中间文件断言结构——XML 里滤镜节点有没有、图层字段全不全。不通过问题在构建层别让坏的项目文件漏给真实软件否则后面排查成本翻十倍。关卡三真实后端全流程。验什么最终成品PDF、渲染图、视频是不是真出自真实软件且内容正确。怎么验断言输出文件存在、大小 0、格式正确比如 PDF 前 5 字节是%PDF-并打印工件路径供人工检查。不通过真实软件没装测试直接 fail。禁止 skip更禁止 mock。这条是红线——没有软件这个 CLI 就是摆设绿测试是假象。 上线与分发上面那个 setup.py 就是核心重点三处name决定 PyPI 上叫什么packages用find_namespace_packages只收cli_anything.*下的子包entry_points把控制台命令cli-anything-gimp绑到main()。命名空间包下各子包的关系一句话讲清cli_anything本身不装任何东西cli_anything.gimp、cli_anything.blender是各自独立安装、互不干扰的兄弟包同一个 Python 环境里随便并排装。装一个试试复制即可跑pip install cli-anything-gimp cli-anything-gimp --help️ 避坑手册1. 输出和输入一模一样症状导出的视频/图片看起来和源文件没区别。根因渲染器读的是原始媒体跳过了项目级效果比如 ffmpeg concat 解复用器会忽略 MLT 项目文件里的全部滤镜。解法优先用应用原生渲染器如melt读项目文件不行就建一层滤镜转换把项目效果翻译成渲染工具的原生语法。2. 长视频切点漂移两三帧症状短片段准10 分钟的片子越来越偏。根因非整数帧率29.97 30000/1001用int()截断做浮点转帧误差逐帧累积。解法浮点转帧用round()时间码显示用整数算术往返测试接受 ±1 帧容差。3. 导出成功但内容是错的症状退出码 0文件生成了内容是源文件的复刻。根因没有报错不等于正确你从没验证过输出。解法验魔术字节、用 ffmpeg 探指定帧、比对音频首尾 RMS验证要落到具体字节上。4. 装了第二个 CLI第一个命令消失症状cli-anything-gimp还能用装上另一个包后某个命令找不到了。根因cli_anything/里误加了__init__.py两个包互相覆盖命名空间目录。解法cli_anything/保持无__init__.pyPEP 420__init__.py只放在各子包内。5. 测试全绿真环境一跑就废症状CI 通过真机导出却没产出。根因e2e 测试碰到缺软件时静默 skip 或伪造了结果。解法真实软件是硬依赖缺了直接 fail跳过和造假都不允许。 下一步三个动作现在就做git clone https://gitcode.com/GitHub_Trending/cl/CLI-Anything然后pip install cli-anything-hub用cli-hub search gimp看看社区都建了什么。读一份完整 SOPGIMP.md这是代码库分析 → CLI 设计的标尺样本方法论正文在 HARNESS.md。自己过一遍三道关pip install -e gimp/agent-harness再跑pytest gimp/agent-harness/cli_anything/gimp/tests/真实后端那关缺 GIMP 会直接 fail——这是预期行为。【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表