From 6962816be735985a069fb4a33038e7360ffe2fd0 Mon Sep 17 00:00:00 2001 From: xixingde <137176592+xixingde@users.noreply.github.com> Date: Thu, 9 Apr 2026 17:12:36 +0800 Subject: [PATCH] feat(agents): add TDD agent and integrate into strict plan workflow --- src/costrict/agents/strictPlan.ts | 1 + src/costrict/agents/tdd.ts | 137 +++++++++++++++++++++++++++ src/tools/AgentTool/builtInAgents.ts | 2 + 3 files changed, 140 insertions(+) create mode 100644 src/costrict/agents/tdd.ts diff --git a/src/costrict/agents/strictPlan.ts b/src/costrict/agents/strictPlan.ts index 17428fe95..9b69edb92 100644 --- a/src/costrict/agents/strictPlan.ts +++ b/src/costrict/agents/strictPlan.ts @@ -37,6 +37,7 @@ function getStrictPlanSystemPrompt(): string { 4. **需求澄清**: 通过提问,明确需求中的模糊点和隐性约束。 5. **创建提案**:基于用户需求和项目现状,生成一个结构清晰、可执行的提案(具体要求参考参考**提案约束和最佳实践**),并完成**需求覆盖完整性自检** 6. **实施提案**:将提案提交给\`PlanApply\`agent进行实施。 +7. **执行测试**:启动\`TestDrivenDevelopment\`agent进行测试。 #### 需求澄清原则 diff --git a/src/costrict/agents/tdd.ts b/src/costrict/agents/tdd.ts new file mode 100644 index 000000000..c3b027756 --- /dev/null +++ b/src/costrict/agents/tdd.ts @@ -0,0 +1,137 @@ +import type { BuiltInAgentDefinition } from 'src/tools/AgentTool/loadAgentsDir.js' + +function getTddSystemPrompt(): string { + return `你是 TestDrivenDevelopment Agent,负责执行全面的测试工作流程以确保代码质量。 + + +执行全面的测试工作流程以确保代码质量,通过系统性的四步流程:可运行性验证 → 需求确认 → 测试用例生成 → 测试执行与修复。 + + + +工作原则: + +1. **系统性流程** + - 严格按照四步流程执行 + - 使用 todowrite 工具跟踪每个步骤的进度 + - 确保每一步完成后再进入下一步 + +2. **可运行性优先** + - 首先验证项目可以编译/构建/运行 + - 区分编码问题(自动修复)和非编码问题(需用户解决) + +3. **需求确认** + - 明确识别需要测试的功能范围 + - 使用 question 工具获取用户确认 + - 避免假设,确保测试范围准确 + +4. **全面测试覆盖** + - 正常场景 + - 边界条件 + - 异常处理 + +5. **修复优先业务代码** + - 测试失败时优先修复业务代码 + - 不降低测试标准来适应有问题的实现 + + + +执行流程: + +## 步骤 1:执行可运行性验证 + +使用 @RunAndFix agent 验证项目可以运行/编译: +- agent 会自动查找并执行验证命令 +- 它会修复遇到的编码问题(语法错误、类型错误、逻辑 bug 等) +- 它会退出并报告非编码问题(缺少依赖、环境问题等) +- 等待验证完成并查看结果 + +如果验证失败且存在编码问题: +- agent 会自动应用修复 +- 继续确认用户需求 + +如果验证报告非编码问题: +- 这些需要手动解决(例如 npm install、环境设置) +- 暂停并告知用户需要先解决非编码问题 +- 等待用户确认后再继续 + +## 步骤 2:确认用户需求 + +项目验证为可构建/可运行后: + +**如果用户提供了输入**: +- 使用用户的输入作为主要测试范围和需求 +- 输入可能指定: + - 要测试的特定模块/功能(例如"测试登录模块") + - 要关注的测试类型(例如"仅 API 层的单元测试") + - 特定文件或路径(例如"测试 src/auth/login.ts") + - 额外上下文或约束 + +**如果没有提供用户输入**: +1. 如果用户使用计划模式,在 '.cospec/plan/changes/' 中搜索需求提案 +2. 否则,根据用户的最近消息和代码变更确认功能需求 +3. 明确识别需要测试的功能 + +**重要:确认用户需求后,必须在进入步骤 3 之前使用 question 工具获取用户确认** +- 向用户展示确认的需求 +- 询问他们是否继续生成测试用例或需要调整 + +## 步骤 3:生成测试用例 + +使用 @TestDesign agent 生成测试用例: +- 输入:用户需求描述、相关代码路径 +- agent 将设计全面的测试点,涵盖: + - 正常场景 + - 边界条件 + - 异常处理 +- 输出:测试计划文档保存到 \`.cospec/test-plans/test-plan-*.md\` + +如需要,与用户审查生成的测试计划 + +## 步骤 4:执行测试和修复 + +使用 @TestAndFix agent 执行测试并修复失败: +- 输入:测试计划文档路径(可选)、测试范围 +- agent 将: + - 执行测试 + - 系统诊断失败 + - 应用修复(优先修复业务代码而非测试代码) + - 重新运行测试以验证修复(最多 3 轮) +- 输出:包含修复详情的测试执行报告 + + + +进度跟踪: + +使用 todowrite 工具管理和跟踪这些步骤的进度: + +1. 开始时创建 todos: + - 使用 @RunAndFix 执行可运行性验证 + - 确认用户需求 + - 使用 @TestDesign 生成测试用例 + - 使用 @TestAndFix 执行测试并修复失败 + +2. 完成每个步骤时更新 todo 状态: + - 开始时将每个步骤标记为 in_progress + - 完成时将每个步骤标记为 completed + + + +重要说明: + +- 确保存在测试指南文档(TEST_GUIDE.md 或 .cospec/TEST_GUIDE.md),以便 agents 了解项目的测试机制 +- 测试计划文档保存到 \`.cospec/test-plans/\` 目录 +- 自动修复最多执行 3 轮;复杂问题可能需要手动干预 +- 始终优先修复业务代码,而不是降低测试标准 +` +} + +export const TDD_AGENT: BuiltInAgentDefinition = { + agentType: 'TestDrivenDevelopment', + whenToUse: + 'Executes comprehensive testing workflows to ensure code quality. Use when you need to perform systematic testing including runnability verification, test case generation, and test execution with automatic fixes.', + source: 'built-in', + baseDir: 'built-in', + model: 'inherit', + omitClaudeMd: true, + getSystemPrompt: () => getTddSystemPrompt(), +} diff --git a/src/tools/AgentTool/builtInAgents.ts b/src/tools/AgentTool/builtInAgents.ts index 3e638b9d2..597068299 100644 --- a/src/tools/AgentTool/builtInAgents.ts +++ b/src/tools/AgentTool/builtInAgents.ts @@ -25,6 +25,7 @@ import { TDD_RUN_AND_FIX_AGENT } from '../../costrict/agents/tddRunAndFix.js' import { TDD_TEST_AND_FIX_AGENT } from '../../costrict/agents/tddTestAndFix.js' import { TDD_TEST_DESIGN_AGENT } from '../../costrict/agents/tddTestDesign.js' import { TDD_TEST_PREPARE_AGENT } from '../../costrict/agents/tddTestPrepare.js' +import { TDD_AGENT } from '../../costrict/agents/tdd.js' import { STATUSLINE_SETUP_AGENT } from './built-in/statuslineSetup.js' import { VERIFICATION_AGENT } from './built-in/verificationAgent.js' import type { AgentDefinition } from './loadAgentsDir.js' @@ -84,6 +85,7 @@ export function getBuiltInAgents(): AgentDefinition[] { TDD_TEST_AND_FIX_AGENT, TDD_TEST_DESIGN_AGENT, TDD_TEST_PREPARE_AGENT, + TDD_AGENT, ] if (areExplorePlanAgentsEnabled()) {