背景
在调研 DARE 接入外部编排平台(类似 Cat Café)时,我们发现 DARE 的 example CLI(examples/06-dare-coding-agent-mcp/cli.py)与 Claude Code / Codex CLI 这类“可被宿主系统稳定编排”的 CLI 存在接口层 gap。
这不是在否定 DARE 的能力(A2A 路径已经可行),而是聚焦在:
- 如果把 DARE example CLI 当作“可嵌入的外部 Agent CLI”
- 目前和主流 CLI 在“可观测 + 可控制 + 可自动化”上的差异
关键 gap(对比 Claude Code / Codex CLI)
| 维度 |
Claude Code / Codex CLI(集成友好) |
DARE example CLI 现状 |
影响 |
| 输出协议 |
提供稳定 machine-readable 流(stream-json / --json) |
以 print 人类可读文案为主([INFO]/[WARN]/[OK]),无稳定事件 schema |
宿主很难可靠解析生命周期、工具事件、审批状态 |
| 控制面 |
宿主可通过 CLI flags / structured input 控制行为 |
审批/MCP 控制依赖 CLI 内部命令环(/approvals ...、/mcp ...) |
运行中外部编排很难自动化接管 |
| 输入模型 |
易于“非交互式编排” |
主循环依赖 input("dare> ") + slash 命令解析 |
需要伪终端/人工输入,不适合 server-to-server 调度 |
| 审批接口 |
常有外部可调用接口或稳定协议面 |
审批 action 通过进程内 DirectClientChannel + TransportEnvelope 调用 |
外部系统无法直接复用审批能力(需深度嵌入 Python 进程) |
代码证据(当前 example CLI)
-
交互输入主循环依赖 input("dare> ")
examples/06-dare-coding-agent-mcp/cli.py:991
-
输出主要是人类可读 print(...)
examples/06-dare-coding-agent-mcp/cli.py:148(CLIDisplay)
-
审批命令通过内部 Action envelope 调用
examples/06-dare-coding-agent-mcp/cli.py:538(_invoke_approval_action)
examples/06-dare-coding-agent-mcp/cli.py:544-546(TransportEnvelope + EnvelopeKind.ACTION)
-
运行中控制通过 slash 命令(非结构化控制面)
examples/06-dare-coding-agent-mcp/cli.py:798(/approvals ... /mcp ...)
建议(最小改造,不破坏现有 UX)
Phase 1(P1,低风险)
新增 --output-format ndjson(默认保持现状)
- 事件建议:
session.started
model.response
tool.invoke
tool.result
approval.pending
approval.resolved
task.completed / task.failed
这样外部宿主至少可以稳定消费事件流。
Phase 2(P1)
新增结构化控制面(建议二选一):
--control-port 暴露本地 HTTP/JSON-RPC 控制接口(审批、mcp reload/list、status)
--control-stdin 接收 JSON 命令帧(避免依赖 dare> 文本命令)
这样外部系统可以在任务执行中做审批与热重载。
Phase 3(P2)
统一命令语义(interactive vs headless)
- interactive: 保留当前体验
- headless: 禁止
input(),仅结构化 I/O
备注
- DARE 的 A2A server(
examples/05-dare-coding-agent-enhanced/a2a_serve.py)已经是很好的外部接入路径。
- 本 issue 的目标是:如果团队希望 “example CLI 本身”也达到 Claude Code/Codex 那种集成友好度,需要补齐哪些最小能力。
背景
在调研 DARE 接入外部编排平台(类似 Cat Café)时,我们发现 DARE 的 example CLI(
examples/06-dare-coding-agent-mcp/cli.py)与 Claude Code / Codex CLI 这类“可被宿主系统稳定编排”的 CLI 存在接口层 gap。这不是在否定 DARE 的能力(A2A 路径已经可行),而是聚焦在:
关键 gap(对比 Claude Code / Codex CLI)
stream-json/--json)print人类可读文案为主([INFO]/[WARN]/[OK]),无稳定事件 schema/approvals ...、/mcp ...)input("dare> ")+ slash 命令解析DirectClientChannel + TransportEnvelope调用代码证据(当前 example CLI)
交互输入主循环依赖
input("dare> ")examples/06-dare-coding-agent-mcp/cli.py:991输出主要是人类可读
print(...)examples/06-dare-coding-agent-mcp/cli.py:148(CLIDisplay)审批命令通过内部 Action envelope 调用
examples/06-dare-coding-agent-mcp/cli.py:538(_invoke_approval_action)examples/06-dare-coding-agent-mcp/cli.py:544-546(TransportEnvelope+EnvelopeKind.ACTION)运行中控制通过 slash 命令(非结构化控制面)
examples/06-dare-coding-agent-mcp/cli.py:798(/approvals ... /mcp ...)建议(最小改造,不破坏现有 UX)
Phase 1(P1,低风险)
新增
--output-format ndjson(默认保持现状)session.startedmodel.responsetool.invoketool.resultapproval.pendingapproval.resolvedtask.completed/task.failed这样外部宿主至少可以稳定消费事件流。
Phase 2(P1)
新增结构化控制面(建议二选一):
--control-port暴露本地 HTTP/JSON-RPC 控制接口(审批、mcp reload/list、status)--control-stdin接收 JSON 命令帧(避免依赖dare>文本命令)这样外部系统可以在任务执行中做审批与热重载。
Phase 3(P2)
统一命令语义(
interactivevsheadless)input(),仅结构化 I/O备注
examples/05-dare-coding-agent-enhanced/a2a_serve.py)已经是很好的外部接入路径。