首页/OpenHarness 源码课/OH04: CLI / 命令接口

OH04: CLI / 命令接口 OpenHarness · 对标 S04

S04 同主题:用户从 shell 进入 Harness:既要支持 oh / python -m openharness进程级入口,又要在交互会话内解析 /command 形态——两层命令面与课内 argv / 斜杠命令叙事一致。

上游:HKUDS/OpenHarness · 本仓库快照:reference/rererence_harness/OpenHarness/ · 路径亦见 专题映射表

与 S04 站内导图对齐course-s04)。

🎯 关键路径(读什么)

src/openharness/ 下优先打开:

  • __main__.py:仅委托 cli.app,保证包入口与脚本入口一致。
  • cli.pytyper.Typer 根 app,mcp / plugin / auth / provider / cron 等子树;默认无子命令时进入会话。
  • commands/registry.pyCommandRegistrySlashCommandCommandResult(含 continue_pendingrefresh_runtime 等与 TUI 协作的字段)。

🔍 源码导读

入口三行

Python
# __main__.py
from openharness.cli import app
if __name__ == "__main__":
    app()

Typer 根 app

invoke_without_command=True 允许直接 oh 进交互;-p/--print 等 flags 与课内管道模式同题。子命令与设置读写(如 mcp add)集中在同一文件,阅读时可用「搜索 @app.callback / def main」定位默认行为。

斜杠命令与 Loop

Slash 命令处理器异步返回 CommandResult,可触发清屏、退出、或不追加用户句而续跑 QueryEngine.continue_pending——这是 CLI 层对 OH01 Loop 的「外环」控制。

⚖️ 与课内叙事对照

维度课内 S04OpenHarness
argv 与模式claude 的 -p / resume 等Typer 参数 + cli.py 内分支
斜杠命令课内 Command 表CommandRegistry + 大文件 handlers
配置落盘settings.json 等load_settings / save_settings 与多子命令共用

🤔 思考题

  1. CommandResult.continue_pending 为 True 时,TUI 应调用哪一 API 而不走 submit_message
  2. 把 MCP 配置从 CLI 子命令写入 settings 的路径,与在 TUI 里改配置会冲突吗?谁后写谁生效?
  3. 若新增 Typer 子命令,最少要改 cli.py 的哪几处才能让 oh mycmd 可见?

📎 延伸阅读

OH01–12 目录 · OH03 · OH05 · S04 · D04