OH04: CLI / 命令接口 OpenHarness · 对标 S04
与 S04 同主题:用户从 shell 进入 Harness:既要支持 oh / python -m openharness 的进程级入口,又要在交互会话内解析 /command 形态——两层命令面与课内 argv / 斜杠命令叙事一致。
上游:HKUDS/OpenHarness · 本仓库快照:reference/rererence_harness/OpenHarness/ · 路径亦见 专题映射表。
course-s04)。🎯 关键路径(读什么)
在 src/openharness/ 下优先打开:
__main__.py:仅委托cli.app,保证包入口与脚本入口一致。cli.py:typer.Typer根 app,mcp/plugin/auth/provider/cron等子树;默认无子命令时进入会话。commands/registry.py:CommandRegistry、SlashCommand、CommandResult(含continue_pending、refresh_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 的「外环」控制。
⚖️ 与课内叙事对照
| 维度 | 课内 S04 | OpenHarness |
|---|---|---|
| argv 与模式 | claude 的 -p / resume 等 | Typer 参数 + cli.py 内分支 |
| 斜杠命令 | 课内 Command 表 | CommandRegistry + 大文件 handlers |
| 配置落盘 | settings.json 等 | load_settings / save_settings 与多子命令共用 |
🤔 思考题
CommandResult.continue_pending为 True 时,TUI 应调用哪一 API 而不走submit_message?- 把 MCP 配置从 CLI 子命令写入 settings 的路径,与在 TUI 里改配置会冲突吗?谁后写谁生效?
- 若新增 Typer 子命令,最少要改
cli.py的哪几处才能让oh mycmd可见?
📎 延伸阅读
OH01–12 目录 · OH03 · OH05 · S04 · D04