第 11 章 · CLI 产品化与毕业
03 · 非交互模式
ask 和 plan 命令支持脚本化调用——适合 CI、自动化和管道操作。
为什么需要非交互模式
交互模式适合人类使用。但在很多场景下,agent 需要被脚本或 CI 系统调用:
- CI 代码审查。 PR 提交后自动让 agent review 代码
- 自动化分析。 每天让 agent 分析项目健康度
- 管道操作。 agent 的输出作为其他工具的输入
这些场景不能有人在终端按 y/n 确认——需要完全非交互的模式。
ask 命令
mca ask "这个项目用什么测试框架?"执行流程:
- 解析命令,识别为 ask 模式
- 创建 PermissionGuard(自动放行)
- 创建新的对话历史(只有一条用户消息)
- 调用 runAgent
- 输出结果
- 退出
退出码:
- 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() 中完成,两种模式共享同一套资源。模式特定的逻辑(权限、输出格式)在各自的函数中处理。
登录以继续阅读
解锁完整文档、代码示例及更多高级功能。