实现无人值守的自动化代码测试闭环 — 从提示词生成代码到智能评测验证
完整的自动化闭环,无需人工干预
问题:单次执行模式下 CmdCode 不自动退出,导致测试超时失败
// src/cli.ts 第 1104 行(关键修复)
// 在 session save 后添加:
process.exit(0) // 单次执行模式自动退出
修复效果:超时问题彻底解决,5/5 测试全部自动完成
涵盖算法、数学、字符串处理等多类型测试
执行时间:2026-04-29 | 状态:全部通过
tests/
├── test_data.json # 测试题目数据(5题)
├── run_single_test.sh # 单题执行器(60s超时)
├── evaluate_result.sh # 智能评测脚本
├── auto_loop.sh # 自动化循环入口
├── temp/ # 生成的代码文件
│ ├── fibonacci/
│ ├── quick_sort/
│ └── ...
└── results/ # 评测结果JSON
├── fibonacci_evaluation.json
└── ...
以下是完全可行的图灵机级提示词序列,用于修复 CmdCode 单次执行模式下的自动退出问题,并形成自动化测试闭环。
执行对象:Hermes
操作:在 src/cli.ts 中搜索字符串 values.prompt 并定位到 main 函数处理单次执行的 if 块。
期望:找到类似 if (values.prompt) { ... } 的代码段。
操作:在该 if 块内,找到 try { ... } catch (e) { ... } 语句。确认 try 块最后有 return 语句(或没有 return 直接结束 if)。
注意:当前代码在 try 块末尾可能是 return 或没有显式退出,但我们需要它显式退出进程。
操作:在 try 块中,找到 console.log(... session.saved ...) 语句的下一行(这是输出保存成功的日志)。在它之后、return 之前(如果有 return)插入一行:
如果 try 块后没有 return,则直接在该行后添加。同时确保 catch 块中已有 process.exit(1)(通常有 process.exit(1))。保存文件。
操作:运行 bun run src/cli.ts -p "用Python打印Hello World"。
验收:终端输出 AI 回复内容以及 session saved 信息。命令执行完后立即退回 shell 提示符,不挂起,不需要用户按任何键。echo $? 输出 0(表示正常退出)。
操作:在 main 函数中,查找 initMemorySystem() 的调用位置。如果 initMemorySystem() 在单次模式分支之前被执行(它很可能是),那么单次模式也会启动回填定时器,导致即使我们调用了 process.exit 也能退出(因为 process.exit 会强制终止所有定时器)。这已经满足要求,不做额外修改。
验收:无需行动。
操作:运行 CMD_WORKSPACE=/tmp/testworkspace bun run src/cli.ts -p "创建一个文件 test.txt,内容为 hello"。
验收:命令成功执行,文件 /tmp/testworkspace/test.txt 被创建,进程自动退出。若失败:在 cli.ts 的 main 函数开头,在 userAuthFlow() 之前,添加工作区环境变量覆盖逻辑(已在之前任务中完成,此处仅验证)。
操作:进入 CmdCode 项目根目录,运行 bash tests/auto_loop.sh。
验收:框架依次执行题库中的题目。对每个题目,调用 run_single_test.sh,它内部会启动 CmdCode 单次模式,现在应能正常退出而不超时。评估器判断通过/失败,失败时框架自动分析并尝试修复。整个循环运行至所有题目通过或无法修复为止。框架输出最终测试报告。
操作:在 src/cli.ts 的 main 函数中,找到 const userInfo = await userAuthFlow() 之后的代码。在 setUserWorkspace(userInfo.workspaceDir) 之前插入:
验证:重复提示词 6 的验收步骤。
✓ 至此,自动化测试框架的"无人值守"闭环即可完整运行。
所有提示词都精确到可无脑执行,无需额外解释。