第 11 章 · CLI 产品化与毕业

03 · 非交互模式

ask 和 plan 命令支持脚本化调用——适合 CI、自动化和管道操作。

为什么需要非交互模式

交互模式适合人类使用。但在很多场景下,agent 需要被脚本或 CI 系统调用:

  • CI 代码审查。 PR 提交后自动让 agent review 代码
  • 自动化分析。 每天让 agent 分析项目健康度
  • 管道操作。 agent 的输出作为其他工具的输入

这些场景不能有人在终端按 y/n 确认——需要完全非交互的模式。

ask 命令

mca ask "这个项目用什么测试框架?"

执行流程:

  1. 解析命令,识别为 ask 模式
  2. 创建 PermissionGuard(自动放行)
  3. 创建新的对话历史(只有一条用户消息)
  4. 调用 runAgent
  5. 输出结果
  6. 退出

退出码:

  • 0:成功完成
  • 1:启动失败(缺少 API key 等)
  • 2:任务执行达到迭代上限

--json 输出

mca ask "入口文件是什么?" --json

输出格式化的 JSON:

{
  "answer": "入口文件是 src/main.ts",
  "todos": [],
  "stats": {
    "modelCalls": 2,
    "toolCallCount": 1,
    "hitLimit": false
  }
}

JSON 输出包含三个字段:

  • answer:agent 的回答
  • todos:计划步骤列表(可能为空)
  • stats:执行统计

JSON 模式方便脚本解析。例如配合 jq 提取回答:

mca ask "测试覆盖率?" --json | jq '.answer'

plan 命令

mca plan "把测试框架从 Jest 迁移到 Vitest"

plan 模式和 ask 模式的区别:plan 模式会在系统提示词中追加"只生成计划"的指令,让模型只输出分析结果和执行步骤,不实际修改代码。

代码结构

main.ts 被重构为三个函数:

main()                           // 入口:解析参数、初始化资源
  ├── runInteractiveMode()       // 交互模式:REPL 循环
  └── runSingleTask()            // 单次模式:ask/plan

共享的初始化逻辑(Model、工具、emitter 等)在 main() 中完成,两种模式共享同一套资源。模式特定的逻辑(权限、输出格式)在各自的函数中处理。

登录以继续阅读

解锁完整文档、代码示例及更多高级功能。

立即登录

On this page