
cli-anything-iterm2 实战指南用一行命令把 iTerm2 变成 Agent 可控的有状态终端【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything本指南面向希望通过脚本、流水线或 AI Agent 直接操控 macOS 上运行中的 iTerm2 的开发者讲解cli-anything-iterm2这一状态化 CLI harness 的安装、命令体系、底层架构与真实工作流。读完本文你将掌握如何用结构化 JSON 输出读取终端屏幕、发送命令、拆分窗格、集成tmux -CC并借助持久化上下文实现设一次焦点、全程免参数的自动化操控。cli-anything-iterm2是 CLI-Anything 生态目标让所有软件具备 Agent 原生能力在 iTerm2 上的落地实现完整文档位于 iterm2/agent-harness/README.md配套的运维规范见 iterm2/agent-harness/ITERM2.md。What it does为什么需要这层 CLI 封装iTerm2 提供了非常强大的 Python API但直接使用它意味着每次操作都要编写一段 async Python 脚本还要自行处理连接生命周期。cli-anything-iterm2把整套 API 折叠进一个干净、可组合的命令行界面并以结构化 JSON 输出结果——Agent 可以像人类操作终端那样驱动 iTerm2完全不需要截图或 UI 自动化。# Send a command to the focused terminal cli-anything-iterm2 session send git status # Read whats on screen cli-anything-iterm2 --json session screen # Split the pane and start a server in the new one cli-anything-iterm2 session split --vertical --use-as-context cli-anything-iterm2 session send python3 -m http.server 8000 # Broadcast a keypress to every pane at once cli-anything-iterm2 broadcast all-panes cli-anything-iterm2 session send clear从源码结构看该工具由 iterm2_ctl_cli.pyClick 入口约 1500 行组织 11 个命令组每个命令组对应 core/ 下一个职责单一的后端模块这一分层使单个命令的实现路径非常清晰。架构与底层原理cli-anything-iterm2自身只是一个薄壳真正做事的是正在运行的 iTerm2.app。官方 README 给出了如下架构cli-anything-iterm2 (Click CLI) │ │ iterm2 Python package │ asyncio WebSocket (ws://localhost:1912) ▼ iTerm2.app ← running macOS terminal emulator同步 Click 与异步 API 之间的桥接所有 iTerm2 API 调用都是异步的。工具使用iterm2.run_until_complete()把异步操作桥接到 Click 的同步命令模型上因此每个命令在脚本、管道和 Agent 工具调用中的行为完全一致。这个桥接集中实现在 iterm2_backend.py 的run_iterm2()函数中见 iterm2_backend.py它要求iterm2Python 包已安装require_iterm2_running否则抛出带安装提示的RuntimeError通过iterm2.run_until_complete(_wrapper)执行传入的协程函数并把返回值/异常分别收集到 holder 中再统一取出当连接层出现connect/refused/websocket关键字错误时会将其包装成带三步排查指引的中文友好提示1. 打开 iTerm22. 在 Preferences → General → Magic 勾选 Enable Python API3. 若刚开启需重启 iTerm2见connection_error_help()。连接凭证由 iTerm2 在运行脚本时自动注入的ITERM2_COOKIE与ITERM2_KEY环境变量提供见 ITERM2.md使用者无需手动配置鉴权。iTerm2 的对象模型工具面向的 iTerm2 对象层级如下理解它就能看懂命令参数里的window_id/tab_id/session_id从何而来App └── Window (one or more) └── Tab (one or more per window) └── Session (one or more per tab — split panes)Session真正的终端模拟器实例可以发送文本、读取屏幕、拆分成窗格Tab窗口内的标签页包含一个或多个 session即分屏窗格Window终端窗口包含一个或多个 tabProfile一组命名配置颜色、字体、Shell 等Arrangement整个窗口/标签/窗格布局的已保存快照。为方便复用工具在 iterm2_backend.py 中提供了async_find_window、async_find_tab、async_find_session三个查找辅助函数按 ID 遍历对象树定位目标找不到时抛出ValueError并列出当前可用 ID——这正是 README 所述对象找不到时给出可选项列表的实现依据。错误处理策略从 ITERM2.md 与命令行装饰器handle_iterm2_error可以归纳出三层错误处理策略iTerm2 未运行给出清晰错误与安装指引对象window/tab/session找不到列出可用 ID连接失败重试一次后失败并附带诊断信息。handle_iterm2_error装饰器见 iterm2_ctl_cli.py会把RuntimeError/ValueError统一转为{error: ...}的 JSON--json模式或友好的Error:文本并令进程以非零码退出——这在 Agent 调用中非常利于判断命令是否真正成功。前置条件与安装前置条件macOS iTerm2 正在运行brew install --cask iterm2启用 iTerm2 的 Python APIiTerm2 → Preferences → General → Magic → Enable Python API ✓注意若刚勾选需要重启 iTerm2 使其生效详见 iterm2_backend.py。Python 3.10以上约束与 setup.py 中的声明一致python_requires3.10依赖click8.0.0、prompt-toolkit3.0.0、iterm22.7。setup.py 还注释说明iTerm2.app 本身是无法用 pip 表达的硬依赖必须单独安装并开启 API。安装从仓库子目录直接安装pip install githttps://gitcode.com/GitHub_Trending/cl/CLI-Anything.git#subdirectoryiterm2/agent-harness源码方式开发用git clone https://gitcode.com/GitHub_Trending/cl/CLI-Anything.git cd CLI-Anything/iterm2/agent-harness pip install -e .安装验证cli-anything-iterm2 --helpsetup.py 中的entry_points将cli-anything-iterm2命令映射到cli_anything.iterm2_ctl.iterm2_ctl_cli:main入口实现见 iterm2_ctl_cli.py因此安装后即可直接使用该命令。除命令行入口外也可以python3 -m cli_anything.iterm2_ctl方式运行见main.py。命令组总览GroupWhat it controlsappWorkspace snapshot, app status, context management, app-level variables, modal dialogs, file panelswindowCreate, list, close, resize, fullscreen windowstabCreate, list, close, activate tabs; navigate split panes by directionsessionSend text, inject raw bytes, read screen, full scrollback, split panes, prompt detectionprofileList profiles, get profile details, list and apply color presetsarrangementSave and restore complete window layoutstmuxFulltmux -CCintegration: bootstrap, connections, windows, send commandsbroadcastSync keystrokes across multiple panes via broadcast domainsmenuInvoke any iTerm2 menu item programmaticallyprefRead and write global iTerm2 preferences; tmux integration settings每个命令组在 core/ 下都有一个同名模块承载真正的异步逻辑session.py、window.py、tab.py、profile.py、arrangement.py、tmux.py、broadcast.py、menu.py、pref.py、prompt.py、dialogs.py外加session_state.py负责上下文持久化。CLI 层只做参数解析、调用后端并格式化输出这种薄 CLI 厚 core的结构让每个功能都可以被单元测试单独覆盖。全局语法与 --json 输出基本语法cli-anything-iterm2 [--json] group command [OPTIONS] [ARGS]使用--json获得机器可读输出——每个命令都支持。这对 Agent 集成至关重要底层统一的output()函数见 iterm2_ctl_cli.py在--json模式下输出缩进 JSON否则输出人类友好的层级文本--json作为根级 option 定义在cligroup 上因此位置固定在组名前。对结果中的 dict/list非 JSON 模式通过_print_data()递归打印为key: value的树形文本JSON 模式则把所有值强制defaultstr序列化确保不因非标准类型如时间戳对象崩溃。不传子命令即进入 REPL根级cligroup 声明了invoke_without_commandTrue当没有调用任何子命令时自动调用repl命令见 iterm2_ctl_cli.py因此cli-anything-iterm2会进入一个维护上下文、可持续交互的 REPL。其皮肤/提示实现位于 utils/repl_skin.py约 560 行基于 prompt-toolkit支持命令历史与逐步补全。命令组逐项详解App context工作区定位与上下文管理cli-anything-iterm2 --json app snapshot # rich workspace orientation: path, process, role, last output per pane cli-anything-iterm2 app status # lightweight window/tab/session inventory cli-anything-iterm2 app current # focus save context cli-anything-iterm2 app context # show saved context cli-anything-iterm2 app get-var hostname # read app-level variableapp status轻量盘点返回每个 window 下的 tab/session 及计数window_count。对应 CLI 内联实现遍历app.windows→w.tabs→t.sessions组装结构。app current读取当前聚焦的 window/tab/session 并把三者 ID 写入持久化上下文见 iterm2_ctl_cli.py随后所有命令自动以该会话为目标。app snapshot落地一个新工作区时建议第一个执行。它调用 session.py 的workspace_snapshot()为每个 session 返回名称、当前目录path、前台进程、user.role标签、最后一条非空可见输出——无需逐个读取窗格屏幕即可获得全景。在非 JSON 模式下它会逐行打印session_id name [role] (process) path以及 last_line。app get-var/app set-var读写 app 级变量映射到iterm2的async_get_variable/async_set_variable。除上述外app组还暴露set-context手动指定--window-id/--tab-id/--session-id、clear-context、以及模态对话框与文件面板命令对应 dialogs.py# 模态对话框返回用户点击的按钮标签 cli-anything-iterm2 app alert Deploy? Push to production? --button Yes --button No # 带输入框的对话框返回用户输入文本或取消状态 cli-anything-iterm2 app text-input Rename Enter new name: --default myapp # macOS 打开文件面板返回所选文件路径 cli-anything-iterm2 app file-panel --path ~/Documents --ext py --ext txt cli-anything-iterm2 app file-panel --dirs --multi # macOS 保存面板返回保存路径 cli-anything-iterm2 app save-panel --path ~/Desktop --filename output.txt这些命令让 Agent 可以在需要人工决策确认按钮或选取本地文件路径输入时优雅地暂停等待用户操作把人机协作编码进工作流。Windows创建、列出、关闭与布局cli-anything-iterm2 window list cli-anything-iterm2 window create --profile Default cli-anything-iterm2 window create --command python3 cli-anything-iterm2 window activate window-id cli-anything-iterm2 window set-title My Window cli-anything-iterm2 window fullscreen on cli-anything-iterm2 window frame # get/set x/y/w/h cli-anything-iterm2 window close window-idwindow list会标注当前窗口is_current打*并给出每个窗口的 tab/session 数量方便 Agent 先盘点再定向操作。底层对应 window.py 的list_windows、create_window、close_window、activate_window、set_window_title、get/set_window_frame、get/set_window_fullscreen、get_current_window等函数。window create支持--use-as-context把新窗口设为当前上下文省略window-id的关闭/激活命令会自动回退到上下文保存的窗口。Tabs标签页管理cli-anything-iterm2 tab list cli-anything-iterm2 tab create --window-id id cli-anything-iterm2 tab activate tab-id cli-anything-iterm2 tab close tab-id对应 tab.py 的list_tabs、create_tab、close_tab、activate_tab与get_tab_info。除基础增删切换外tab组还通过select_pane_in_direction提供按方向在 split pane 间导航的能力CLI 侧体现为 direction 选项配合拆分出的窗格可以实现全键盘式焦点游走。Sessionspanes最核心的读写通道cli-anything-iterm2 session list cli-anything-iterm2 session send echo hello # sends with newline cli-anything-iterm2 session send text --no-newline cli-anything-iterm2 session screen # visible terminal output cli-anything-iterm2 session screen --lines 20 cli-anything-iterm2 session scrollback --tail 200 # full scrollback history cli-anything-iterm2 session scrollback --tail 200 --strip # strip ANSI codes cli-anything-iterm2 session split # horizontal split cli-anything-iterm2 session split --vertical # vertical split cli-anything-iterm2 session split --vertical --use-as-context cli-anything-iterm2 session set-name API Worker cli-anything-iterm2 session restart cli-anything-iterm2 session resize --columns 220 --rows 50 cli-anything-iterm2 session selection # get selected text cli-anything-iterm2 session get-var hostname # session variable cli-anything-iterm2 session set-var user.project myappsession是操纵终端内容的核心命令组底层全部实现在 session.py。从源码可以看到几个值得注意的实现细节send_textL50-L73调用session.async_send_text(text, suppress_broadcast...)返回{session_id, text_length, sent: true}。默认发送即带换行CLI 层--no-newline会阻止追加\nsuppress_broadcast参数对应--suppress-broadcast类选项可在广播域激活时阻止文本被同步到其他窗格。split_paneL76-L119默认水平拆分上下--vertical改为左右并排还支持--before新窗格出现在拆分点之前、--profile新窗格使用的配置与--command。当传入--command时代码通过iterm2.LocalWriteOnlyProfile()构造一个只写 profile把该窗格的自定义启动命令写死。拆分成功返回original_session_id与new_session_id--use-as-context会把新窗格设为当前上下文。screen可见屏幕对应get_screen_contentsL140-L166读取当前可见行--lines N只取前 N 行返回total_lines、returned_lines与lines列表。scrollback完整回滚对应get_scrollbackL169-L229读取全部可用历史 可见屏幕。实现上在一个iterm2.Transaction中先取async_get_line_info()得到scrollback_buffer_height、mutable_area_height、overflow三个关键量再精确计算起始行与数量后调async_get_contents()拉取保证跨命令的缓冲区一致性。--tail N只取最近 N 行--lines N从最旧行取前 N 行。--strip选项在 CLI 层对结果做 ANSI 转义剥离Agent 拿到的就是干净的纯文本。restart对应restart_session模拟关闭并重开该会话CmdR语义适合跑挂了重启一个 shell的场景。selection对应get_selection读取当前选中文本——Agent 可以让人先在终端里选中一段再取走内容。其余如activate_session聚焦窗格、set_session_name重命名、set_grid_sizeresize --columns/--rows、get/set_session_variable会话变量读写、inject_bytes注入原始字节等均在 session.py 中对应实现。Shell integration需安装 iTerm2 Shell Integrationcli-anything-iterm2 session wait-prompt # block until shell prompt appears cli-anything-iterm2 session wait-command-end # block until running command finishes cli-anything-iterm2 session get-prompt # read last prompt string这一组把发命令 → 等完成 → 读结果做成可靠的同步原语底层在 prompt.pywait_for_prompt阻塞直至提示符出现、wait_for_command_end阻塞直至前台命令结束、get_last_prompt/list_prompts读取最近提示符、watch_prompt持续监听。对于 Agent 工作流wait-command-end之后紧接一次scrollback --tail是最稳的等命令跑完再收割输出模式。Profiles配置与配色预设cli-anything-iterm2 profile list cli-anything-iterm2 profile get Default cli-anything-iterm2 profile color-presets cli-anything-iterm2 profile apply-preset Solarized Dark对应 profile.py 的list_profiles支持按名称过滤、get_profile_detail按 GUID 取完整详情、list_color_presets、apply_color_preset。切换配色便于在演示或录制视频时快速改观感且全程不需要手动进入偏好设置。Arrangements一键保存/恢复整套布局cli-anything-iterm2 arrangement list cli-anything-iterm2 arrangement save dev-env cli-anything-iterm2 arrangement restore dev-env对应 arrangement.py 的save_arrangement、restore_arrangement、list_arrangements以及面向在当前窗口内恢复的save_window_arrangement/restore_arrangement_in_window。配合--use-as-context建立的多窗格工作区Agent 可以快速把数据库 后端 前端 日志的开发环境整体拉起或整体还原。tmux -CC integrationiTerm2 原生协作模式cli-anything-iterm2 tmux bootstrap # start tmux -CC and wait for connection cli-anything-iterm2 tmux list # list active tmux connections cli-anything-iterm2 tmux tabs --connection-id id # list tmux windows cli-anything-iterm2 tmux send ls -la --connection-id id cli-anything-iterm2 tmux create-window --connection-id id cli-anything-iterm2 tmux set-visible window-id对应 tmux.py 的list_connections、send_command、create_window、set_window_visible、list_tmux_tabs、bootstrap、run_session_tmux_command等。bootstrap负责启动tmux -CC并等待连接建立内部通过_ensure_app_and_connections与_resolve_connection管理连接解析--connection-id用于在多连接并存时精确定位目标。iTerm2 会把 tmux 的每个窗口渲染为原生 tab/窗格因此 Agent 既能享受 tmux 会话的可分离性又能继续用本 CLI 的屏幕读取与发送能力。Broadcast向多个窗格同步按键cli-anything-iterm2 broadcast list # list broadcast domains cli-anything-iterm2 broadcast all-panes # broadcast to all panes in window cli-anything-iterm2 broadcast add session-id # add pane to broadcast domain cli-anything-iterm2 broadcast clear # stop broadcasting对应 broadcast.py 的get_broadcast_domains、set_broadcast_domains、add_to_broadcast、clear_broadcast、broadcast_all_panes。注意广播域与普通会话变量、session send的suppress_broadcast语义配合使用当需要单独往某个窗格发命令而避免污染广播域时应显式抑制广播。Menu程序化点击任意菜单项cli-anything-iterm2 menu list-common # show common menu actions cli-anything-iterm2 menu select EditFindFind... cli-anything-iterm2 menu state ViewShow Tabs in Fullscreen对应 menu.py 的list_common_menu_items、select_menu_item、get_menu_item_state。用分层定位菜单路径即可触发任意菜单动作state变体则用于读取带勾选状态的菜单项如全屏标签页的显隐把 GUI 菜单变成可查询、可触发的 API。Preferences读写全局偏好cli-anything-iterm2 pref get TabViewType cli-anything-iterm2 pref set TabViewType 1 cli-anything-iterm2 pref list # all valid preference keys cli-anything-iterm2 pref tmux-get # tmux integration settings cli-anything-iterm2 pref theme # current UI theme对应 pref.py。其中的_parse_value()负责把 CLI 字符串参数按类型解析成正确的 Python 值数字、布尔、字符串保证pref set写入 iTerm2 偏好时类型不出错get_tmux_preferences/set_tmux_preference提供对 tmux 集成设置的快捷读写get_theme读取当前 UI 主题。pref list会列出所有合法偏好键避免记忆键名。Stateful Context持久化上下文机制CLI 会把上下文window_id、tab_id、session_id保存到~/.cli-anything-iterm2/session.json。一旦用app current设置过后续命令会自动定位到同一个窗格——无需每次带--session-id。# Set context once cli-anything-iterm2 app current # All subsequent commands use it implicitly cli-anything-iterm2 session send git pull cli-anything-iterm2 --json session screen cli-anything-iterm2 session split --vertical --use-as-context cli-anything-iterm2 session send npm run dev该机制的实现位于 session_state.py上下文默认文件为~/.cli-anything-iterm2/session.jsonL14-L15由SessionStatedataclass 表示含window_id/tab_id/session_id与notes元数据字段load_state()L60-L73在文件不存在或 JSON 损坏时静默返回空状态保证 CLI 永远可用save_state()L76-L102先建目录再用**排他文件锁fcntl.flock(LOCK_EX)**包裹写入防止多个并发 Agent/终端进程同时改写上下文导致状态错乱——这体现了该工具面向多个并发自动化调用方的设计取向。CLI 进程内也用懒加载缓存get_state()首次读取后缓存为全局_state并在每次变更命令后统一save_state_now()落盘。Session Variables会话变量iTerm2 会话暴露一些内建变量可直接读取cli-anything-iterm2 session get-var hostname # current host cli-anything-iterm2 session get-var username # current user cli-anything-iterm2 session get-var path # current directory cli-anything-iterm2 session get-var pid # shell PID自定义变量统一使用user.前缀cli-anything-iterm2 session set-var user.project myapp cli-anything-iterm2 session get-var user.projectuser.*命名空间在app snapshot中被用作角色标签role例如给窗格打上user.role api-server后再次进入工作区即可通过一条 snapshot 命令分辨哪个窗格是 API 服务、哪个是日志流、哪个是编辑器——这是 Agent 长期驻留一个多窗格工作区的关键记忆手段。app 级变量app get-var/app set-var与 session 级变量在 iTerm2 中处于不同作用域底层分别映射到 App 对象与 Session 对象上的async_get_variable/async_set_variable。典型 Agent 工作流README 给出的端到端工作流完整覆盖了定位 → 设焦点 → 交互 → 搭多窗格 → 验证五个阶段# 1. Orient — get every panes name, path, process, role, and last output in one call cli-anything-iterm2 --json app snapshot # 2. Lock onto the focused session cli-anything-iterm2 app current # 3. Send a command and read the result cli-anything-iterm2 session send git log --oneline -10 cli-anything-iterm2 --json session scrollback --tail 50 --strip # 4. Set up a multi-pane workspace — label panes so snapshot identifies them later cli-anything-iterm2 window create --profile Default cli-anything-iterm2 app current cli-anything-iterm2 session split --vertical --use-as-context cli-anything-iterm2 session send python3 -m http.server 8000 cli-anything-iterm2 session set-var user.role http-server # 5. Wait for the server to start, then verify cli-anything-iterm2 session wait-prompt cli-anything-iterm2 --json session screen这个流程把本文涉及的核心能力串成了一条可重复的 Agent 循环先 snapshot 获得全局视野代价最低再锁定当前焦点写入上下文然后用 send scrollback 完成一问一答最后通过 wait-prompt/screen 验证异步任务是否就绪。在第 4 步用set-var user.role给每个窗格贴标签下次进入工作区时 snapshot 就会把角色、路径、进程和最近输出一并呈现实现跨会话的记忆恢复。交互式 REPL不传参数运行即可进入交互式 REPL命令之间自动维持上下文cli-anything-iterm2REPL 适合两类场景人类快速探索命令边敲边看输出以及 Agent 在长会话内以交互方式连续操作而无需重复--session-id。实现上repl命令与一次性命令共享同一套 core 后端区别仅在输入层prompt-toolkit 驱动的 repl_skin.py所以 REPL 中的每一条指令与命令行形态等价。测试体系单元测试无需 iTerm2 即可运行E2E 测试需要一台活跃的 iTerm2。git clone https://gitcode.com/GitHub_Trending/cl/CLI-Anything.git cd CLI-Anything/iterm2/agent-harness pip install -e . # Unit tests (no iTerm2 needed) python3 -m pytest cli_anything/iterm2_ctl/tests/test_core.py -v # E2E tests (iTerm2 must be running) python3 -m pytest cli_anything/iterm2_ctl/tests/test_full_e2e.py -v -s # Full suite CLI_ANYTHING_FORCE_INSTALLED1 python3 -m pytest cli_anything/iterm2_ctl/tests/ -vSuiteRequiresUnitNothing — pure logicE2EiTerm2 runningtmux E2EiTerm2 activetmux -CCsessionSubprocessInstalledcli-anything-iterm2commandtests/test_core.py约 1080 行覆盖纯逻辑层——包括session_state的读写与并发锁、CLI 命令注册结构、输出格式化等不依赖真实 iTerm2 的部分tests/test_full_e2e.py约 600 行则要求真机运行验证真实 WebSocket 连接下的发送、读取、拆分等端到端行为详细测试计划与结果记录见 tests/TEST.md。CLI_ANYTHING_FORCE_INSTALLED1环境变量用于在已安装 console script 的机器上跑全量套件时让测试稳定定位到命令入口避免依赖安装路径差异。项目结构导读cli_anything/iterm2_ctl/ ├── iterm2_ctl_cli.py # CLI entry point (Click groups commands) ├── core/ │ ├── session.py # session send/screen/scrollback/split │ ├── session_state.py # persistent context (window/tab/session IDs) │ ├── window.py # window create/list/close/resize │ ├── tab.py # tab create/list/close/activate │ ├── profile.py # profile list/get/presets │ ├── arrangement.py # save/restore window layouts │ ├── tmux.py # tmux -CC integration │ ├── broadcast.py # broadcast domains │ ├── menu.py # menu item invocation │ ├── pref.py # preferences read/write │ ├── prompt.py # shell integration (wait-prompt etc.) │ └── dialogs.py # modal dialogs file panels ├── utils/ │ ├── iterm2_backend.py # connection helpers, error messages │ └── repl_skin.py # interactive REPL skin ├── skills/ │ ├── SKILL.md # AI-discoverable skill definition │ └── references/ # 12 narrow reference files for agents └── tests/ ├── test_core.py # unit tests ├── test_full_e2e.py # E2E tests └── TEST.md # test plan resultsAI Skill 集成让 Agent 自动发现工具该包还随附一份面向 AI 的 Skill 定义 skills/SKILL.md其 frontmatter 用description字段明确声明当用户想对 iTerm2 做点事在既有工作区定位、发命令、查看运行内容、读取输出、布置布局、走 tmux 工作流、自动操作窗格、改偏好时应读取本 Skill 而非凭通用知识作答。Skill 正文还内置了命令组总览与上文的典型 Agent 工作流并指向 skills/references/ 下的 12 个窄主题参考文件如session-io.md、session-shell-integration.md、layout-arrangement.md、json-session.md、json-tmux-app.md、tmux-guide.md等每个文件只聚焦单一关注点约 10–30 行方便 Agent 按需加载最小上下文。setup.py 的package_data已把skills/*.md与skills/references/*.md打包进安装产物保证 Skill 与 CLI 一同分发。小结与适用边界cli-anything-iterm2的价值可以概括为三点把 iTerm2 的异步 Python API 收敛成确定性 CLIClick run_until_complete桥接、以 JSON 持久化上下文为 Agent 提供可编程的终端读写通道app snapshot/session send/scrollback/wait-prompt、覆盖从窗口到 tmux 的完整对象面10 个命令组。需要特别说明的边界是它仅在macOS 运行中的 iTerm2.app 已开启 Python API的前提下可用本身不包含终端模拟器若要控制其他平台的终端需要寻找 CLI-Anything 生态中对应的 harness。作为 Agent 接入方式配合随包分发的 SKILL.md 即可让 LLM 在收到终端类请求时自动识别并正确调用这些命令。项目采用 MIT 许可证见 iterm2/agent-harness/README.md 末尾声明可在遵守协议的前提下自由集成与二次开发。【免费下载链接】CLI-AnythingCLI-Anything: Making ALL Software Agent-Native -- CLI-Hub: https://clianything.cc/项目地址: https://gitcode.com/GitHub_Trending/cl/CLI-Anything创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考