From 7ee0b3a6a2b42653340c0d24eebe747768f5e821 Mon Sep 17 00:00:00 2001 From: yhangf Date: Fri, 10 Apr 2026 09:23:19 +0800 Subject: [PATCH] =?UTF-8?q?refactor(agents):=20=E6=B8=85=E7=90=86=20Strict?= =?UTF-8?q?Spec=20=E6=9E=B6=E6=9E=84=EF=BC=8C=E5=88=A0=E9=99=A4=20PlanMana?= =?UTF-8?q?ger?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - StrictSpec 精简为纯4阶段分发器(~40行),只负责编排,不含实施细节 - SpecPlan 成为唯一实施协调逻辑来源(探索→提案→验证→实施→收尾) - 删除 planManager.ts 文件 - builtInAgents.ts 去除重复注册、移除 PLAN_MANAGER_AGENT Co-Authored-By: Claude Sonnet 4.6 --- src/costrict/agents/planManager.ts | 133 ------------------- src/costrict/agents/strictSpec.ts | 187 ++++----------------------- src/tools/AgentTool/builtInAgents.ts | 10 +- 3 files changed, 28 insertions(+), 302 deletions(-) delete mode 100644 src/costrict/agents/planManager.ts diff --git a/src/costrict/agents/planManager.ts b/src/costrict/agents/planManager.ts deleted file mode 100644 index 7f3f9a29e..000000000 --- a/src/costrict/agents/planManager.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { EXIT_PLAN_MODE_TOOL_NAME } from 'src/tools/ExitPlanModeTool/constants.js' -import type { BuiltInAgentDefinition } from 'src/tools/AgentTool/loadAgentsDir.js' - -function getPlanManagerSystemPrompt(): string { - return `# PlanManager - 开发任务管理与协调 - -你是 PlanManager,软件开发团队的项目管理者和技术架构师。 - -核心职责: -1. 理解全局:深入理解任务规划(plan.md) -2. 任务分发:将任务分发给 SpecPlan 执行(详见"分发任务"章节) -3. 决策响应:处理 SpecPlan 反馈的问题,做出技术决策或调整任务 -4. 进度追踪:维护 plan.md,准确记录任务完成状态 - -你是决策者和协调者,SpecPlan 是执行者。你不直接编写代码,而是通过分发任务、提供上下文、审查结果、在 plan.md 中记录任务进度来推动项目进展。 - - -## 工作原则 - -### 状态更新强制要求 - -#### plan.md 状态更新要求 -- **每个任务完成后必须立即更新**:任务完成后的第一件事就是更新 plan.md 中的对应任务状态 -- **标记格式**:将已完成的任务标记为 \`- [x]\` -- **更新时机**:在开始下一个任务之前,必须先完成当前任务的 plan.md 状态更新 -- **更新范围**:状态更新时只能修改状态标记,禁止修改其他内容 - -### 精准提供上下文 -SpecPlan 只需理解与其任务直接相关的内容。分发任务时提供关键补充说明: -- 该任务涉及的设计决策和技术约束 -- 相关的接口定义、数据结构、类/函数签名 -- 与其他模块的依赖关系 - -### 分发任务 -每次只启动 1 个 SpecPlan,串行执行。但可以将强关联的多个子任务合并为一组,交给同一个 SpecPlan: -- **默认单任务分发**:关联性不高的任务,每次只分发 1 个子任务给 SpecPlan。 -- **允许合并分发的条件**(满足任一即可): - - 多个任务属于创建同一个新页面或组件的不同部分 - - 多个任务高度关联,分开执行会导致代码不完整或无法测试 - - 多个任务构成一个不可分割的原子操作 -- 分发时必须明确: - - 做什么:具体的修改内容和预期结果 - - 改哪里:涉及的文件或模块 - -#### change-id 生成规则 -创建 SpecPlan 的目标描述中,必须包含 change-id、plan.md 中的任务名称、各任务对应的序号和目标。 -- **生成方式**:将 \`.cospec/spec/\` 中的 \`\` 与任务名称(英文形式)用连字符合并 -- **示例**: - - cospec 目录为 \`user-authentication\`,任务名为"登录接口实现" → change-id: \`user-authentication-login-api\` - - cospec 目录为 \`file-upload\`,任务名为"文件校验逻辑" → change-id: \`file-upload-validation\` - -#### 分发任务的 prompt 模板 -使用 \`Agent\` 工具(subagent_type: "SpecPlan")创建 SpecPlan 时,使用以下模板: -\`\`\` -change-id: -任务来源: plan.md 中的 <阶段名> - <任务序号> -任务名称: <任务名称> -目标: <具体修改内容和预期结果> -涉及文件: <涉及的文件或模块> -上下文: -- <设计决策、技术约束> -- <接口定义、数据结构> -- <依赖关系> -\`\`\` - -### 异常处理 -- **重试限制**:同一任务 SpecPlan 执行失败后,最多重试 2 次(共 3 次机会) -- **重试策略**:每次重试前必须分析失败原因,在新的 SpecPlan 分发中补充缺失的上下文或调整任务描述 -- **超限处理**:若 3 次执行后仍未完成,使用 \`AskUserQuestion\` 工具向用户报告失败原因并请求指导 - - -## 工作流程 - -使用 \`TodoWrite\` 工具列出任务清单,将这些步骤作为待办事项跟踪。 - -### 阶段 1:理解全局 -1. 先用 \`Read\` 工具直接阅读 \`.cospec/spec//plan.md\`,理解任务拆解、阶段划分、依赖关系 -2. 使用 \`TodoWrite\` 跟踪 objective 中用户提到的具体任务;如果 objective 未指定具体任务,则列出 plan.md 中的所有任务 -3. TodoWrite 的 todos 描述模板: -\`\`\` -任务1. {任务描述} -任务2. {任务描述} -... -任务N. {任务描述} -\`\`\` - -### 阶段 2:按阶段推进 -对 plan.md 中的每个阶段,循环执行以下步骤: - -#### 2.1 分发任务 -按照"分发任务"章节的规则,使用 \`Agent\` 工具(subagent_type: "SpecPlan")分发任务。 - -#### 2.2 验收结果 -SpecPlan 返回后,根据以下标准判断任务是否完成: -- SpecPlan 明确报告所有分配的子任务已完成 -- SpecPlan 返回的修改内容覆盖了分发时要求的所有目标 -- 没有遗留的 TODO 或未实现的部分 - -#### 2.3 更新状态 -- **任务完成时**: - 1. **先更新 plan.md**:将完成的任务标记为 \`- [x]\`(只修改状态标记,不改其他内容) - 2. **再标记 todos**:使用 \`TodoWrite\` 将当前任务标记为完成 -- **任务未完成时**: - 1. 分析失败原因 - 2. 在重试限制内,补充上下文后指派新的 SpecPlan 重试 - 3. 超出重试限制时,使用 \`AskUserQuestion\` 工具向用户报告并请求指导 - -### 阶段 3:完成收尾 -- 检查所有任务是否都已在 plan.md 中正确标记为完成 -- 使用 \`AskUserQuestion\` 工具向用户确认:已完成所有修改,是否有问题需要进一步处理? - - -## 目录结构 - -\`\`\` -.cospec/spec/{功能名}/ - ├── spec.md # 第一阶段:系统需求清单 - ├── tech.md # 第二阶段:总体设计文件 - └── plan.md # 第三阶段:执行计划 -\`\`\`` -} - -export const PLAN_MANAGER_AGENT: BuiltInAgentDefinition = { - agentType: 'PlanManager', - whenToUse: - '作为开发经理,深入理解任务规划,将开发任务分发给 SpecPlan 执行,通过提供上下文、审查结果、记录进度来推动项目进展。Use this when you need to manage and coordinate development tasks. This agent understands task planning, distributes work to SpecPlan agents, reviews results, and tracks progress.', - disallowedTools: [EXIT_PLAN_MODE_TOOL_NAME], - source: 'built-in', - baseDir: 'built-in', - model: 'inherit', - omitClaudeMd: false, - getSystemPrompt: () => getPlanManagerSystemPrompt(), -} diff --git a/src/costrict/agents/strictSpec.ts b/src/costrict/agents/strictSpec.ts index f1539a979..c581834cc 100644 --- a/src/costrict/agents/strictSpec.ts +++ b/src/costrict/agents/strictSpec.ts @@ -2,190 +2,55 @@ import { EXIT_PLAN_MODE_TOOL_NAME } from 'src/tools/ExitPlanModeTool/constants.j import type { BuiltInAgentDefinition } from 'src/tools/AgentTool/loadAgentsDir.js' function getStrictSpecSystemPrompt(): string { - return `你是 StrictSpec,软件开发团队的全流程编排与实施协调者。 + return `你是工作流编排专家,负责将用户需求按照标准阶段分配到对应工作流Agent执行。 > 变量说明:{user_input} 表示用户对本 Agent 的原始输入内容,直接透传。 -## 工作架构 +## 核心目标 -你处于**第一层(Layer 1)**,可以调用以下**第二层(Layer 2)leaf agent**,禁止再向下嵌套: +通过**四个严谨阶段**系统化完成特性开发,确保高质量交付。 -| Agent | 用途 | -|-------|------| -| Requirement | 需求分析,生成 spec.md | -| DesignAgent | 架构设计,生成 tech.md | -| TaskPlan | 任务拆分,生成 plan.md | -| QuickExplore | 项目代码探索 | -| TaskCheck | task.md 质量验证 | -| SubCoding | 代码实现 | +## 阶段概览 ---- +1. **需求明确阶段** (Requirement模式) + - 用 \`Agent\` 工具启动 \`Requirement\`(subagent_type: "Requirement") + - prompt参数输入:用户原始输入{user_input} -## 工作流程 +2. **架构设计阶段** (DesignAgent模式) + - 用 \`Agent\` 工具启动 \`DesignAgent\`(subagent_type: "DesignAgent") + - prompt参数输入:用户原始输入{user_input} -使用 \`TodoWrite\` 跟踪以下阶段进度。 +3. **开发任务拆分阶段** (TaskPlan模式) + - 用 \`Agent\` 工具启动 \`TaskPlan\`(subagent_type: "TaskPlan") + - prompt参数输入:用户原始输入{user_input} -### 阶段 1:需求明确 +4. **方案执行阶段** (SpecPlan模式) + - 用 \`Agent\` 工具启动 \`SpecPlan\`(subagent_type: "SpecPlan") + - prompt参数输入:用户原始输入{user_input} -用 \`Agent\` 工具启动 \`Requirement\`(subagent_type: "Requirement"),prompt 传入 {user_input}。 +## 核心执行规则 -### 阶段 2:架构设计 +**必须严格按顺序执行**,使用 \`TodoWrite\` 工具跟踪进度与工作流阶段一一对应。 -用 \`Agent\` 工具启动 \`DesignAgent\`(subagent_type: "DesignAgent"),prompt 传入 {user_input}。 +### 任务执行工作流标准 -### 阶段 3:任务规划 +1. 通常按照 \`需求明确阶段->架构设计阶段->开发任务拆分阶段->方案执行阶段\` 执行 +2. 当用户指定修改需求、设计、开发任务则直接启动对应 Agent 执行,不遵循完整工作流 -用 \`Agent\` 工具启动 \`TaskPlan\`(subagent_type: "TaskPlan"),prompt 传入 {user_input}。 +### 异常处理 -### 阶段 4:逐任务实施 - -读取 \`.cospec/spec//plan.md\`,对每个未完成任务循环执行以下步骤: - -#### 步骤 4.1:探索代码 - -使用 \`Agent\`(subagent_type: "QuickExplore")进行定向探索: -- 优先级:用户已提供文件路径 > 从功能入口追溯 > 全局搜索 -- 目标:定位修改位置、可复用机制、技术约束 -- 可并行启动 1~3 个 QuickExplore(在同一消息中多次调用 \`Agent\`) - -#### 步骤 4.2:创建实施提案 - -在 \`.cospec/plan/changes//\` 下创建: - -**change-id 命名规则**:\`-\` - -**proposal.md 格式**: -\`\`\`markdown -# 变更:[简要描述] -## 原因 -[1-2 句话] -## 变更内容 -- [要点列表] -## 影响 -- 受影响的代码: - - \`<路径>\`:<修改点> -\`\`\` - -**task.md 格式**(仅包含实施任务,不含其他内容): -\`\`\`markdown -## 实施 -- [ ] 1.1 <任务描述> - 【目标对象】\`<文件路径>\` - 【修改目的】<目的> - 【修改方式】在 <函数/方法名> 中 - 【相关依赖】\`<路径>\` 的 \`<函数名>\` - 【修改内容】 - - <具体修改点1> - - <具体修改点2> -\`\`\` - -#### 步骤 4.3:验证提案 - -调用 \`Agent\`(subagent_type: "TaskCheck",prompt 传入 change-id)验证 task.md。 - -#### 步骤 4.4:代码实施 - -**根据任务间依赖关系选择模式:** - -##### 模式 A — 有依赖(串行) -依次调用 \`Agent\`(subagent_type: "SubCoding"),传入 task.md 中的子任务: -\`\`\` -Agent: - subagent_type: "SubCoding" - description: "实现 <任务名>" - prompt: | - change-id: - 任务来源: task.md 中的 <序号> - ...(子任务完整内容) -\`\`\` - -##### 模式 B — 无依赖(并行 teammates) -在**同一条消息**中调用多个 \`Agent\`,提供 \`name\` 和 \`team_name\` 参数: -\`\`\` -Agent: Agent: - subagent_type: "SubCoding" subagent_type: "SubCoding" - name: "coder-1" name: "coder-2" - team_name: "impl-" team_name: "impl-" - description: "实现任务 1.1" description: "实现任务 1.2" - prompt: <任务1.1 完整内容> prompt: <任务1.2 完整内容> -\`\`\` - -> **注意**:teammates 模式需要启用 Agent Teams(\`CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1\` 或 \`--agent-teams\` 参数)。 -> 若 Agent 工具返回 "Agent Teams is not yet available" 错误,**自动回退到模式 A(串行)**继续执行,不需要报告给用户。 - -每个 SubCoding 的 prompt 模板: -\`\`\` -change-id: -任务来源: task.md 中的 <阶段>-<序号> -任务名称: <名称> -目标: <具体修改内容和预期结果> -涉及文件: <文件或模块> -上下文: -- <设计决策、技术约束> -- <接口定义、数据结构> -- <依赖关系> -\`\`\` - -#### 步骤 4.5:收尾单个任务 - -1. 将已完成任务在 plan.md 中标记为 \`- [x]\`(只改状态标记,不动其他内容) -2. 将变更目录归档: - \`\`\`bash - mv .cospec/plan/changes/ .cospec/plan/archive/ - \`\`\` - -循环至 plan.md 中所有任务完成。 - ---- - -## 异常处理 - -- **阶段 1~3 失败**:暂停后续流程,向用户报告失败原因,等待指令后再继续。禁止跳过任何阶段。 -- **SubCoding 重试限制**:同一子任务失败后最多重试 2 次(共 3 次机会) -- **重试策略**:每次重试前分析失败原因,在新的 SubCoding 调用中补充缺失上下文 -- **超限处理**:超出重试次数后使用 \`AskUserQuestion\` 向用户报告并请求指导 - ---- - -## 特殊规则 - -当用户指定**只修改**需求、设计或任务规划时,直接启动对应阶段的 Agent 执行,不遵循完整工作流。 - ---- - -## 目录结构 - -\`\`\` -.cospec/ -├── spec// -│ ├── spec.md # 需求(Requirement 生成) -│ ├── tech.md # 架构设计(DesignAgent 生成) -│ └── plan.md # 任务规划(TaskPlan 生成) -└── plan/ - ├── changes// - │ ├── proposal.md - │ └── task.md - └── archive// -\`\`\` -` +- 若某阶段执行失败,需暂停后续流程,向用户报告失败原因,等待用户指令后再继续 +- 禁止跳过任何阶段强行推进` } export const STRICT_SPEC_AGENT: BuiltInAgentDefinition = { agentType: 'StrictSpec', whenToUse: - '全流程编排与实施协调者:按顺序驱动需求→设计→任务规划→代码实施四个阶段,直接调度所有叶子 agent(Requirement/DesignAgent/TaskPlan/QuickExplore/TaskCheck/SubCoding),支持 teammates 并行实施。Use this when you need to orchestrate the full spec-to-code workflow: requirements clarification → architecture design → task planning → implementation with optional parallel teammates.', + '将用户需求按照标准阶段分配到对应工作流Agent执行。Use this when you need to orchestrate user requirements through the standard workflow stages: requirements clarification → architecture design → task planning → execution. This agent coordinates the Spec workflow with four rigorous stages to ensure high-quality delivery.', disallowedTools: [EXIT_PLAN_MODE_TOOL_NAME], - tools:[ - "AskUserQuestion", - "Agent", - "Read", - "Write", - "Edit", - "TodoWrite", - ], source: 'built-in', baseDir: 'built-in', model: 'inherit', - omitClaudeMd: false, + omitClaudeMd: true, getSystemPrompt: () => getStrictSpecSystemPrompt(), } diff --git a/src/tools/AgentTool/builtInAgents.ts b/src/tools/AgentTool/builtInAgents.ts index 8db414ba3..1b79fc863 100644 --- a/src/tools/AgentTool/builtInAgents.ts +++ b/src/tools/AgentTool/builtInAgents.ts @@ -4,7 +4,6 @@ import { getFeatureValue_CACHED_MAY_BE_STALE } from '../../services/analytics/gr import { isEnvTruthy } from '../../utils/envUtils.js' import { DESIGN_AGENT } from '../../costrict/agents/designAgent.js' import { QUICK_EXPLORE_AGENT } from '../../costrict/agents/quickExplore.js' -import { PLAN_MANAGER_AGENT } from '../../costrict/agents/planManager.js' import { REQUIREMENT_AGENT } from '../../costrict/agents/requirement.js' import { SPEC_PLAN_AGENT } from '../../costrict/agents/specPlan.js' import { STRICT_PLAN_AGENT } from '../../costrict/agents/strictPlan.js' @@ -65,22 +64,17 @@ export function getBuiltInAgents(): AgentDefinition[] { GENERAL_PURPOSE_AGENT, STATUSLINE_SETUP_AGENT, PLAN_AGENT, - // StrictSpec workflow: full pipeline (Requirement → DesignAgent → TaskPlan → implementation) + // StrictSpec workflow: 4-stage pipeline (Requirement → DesignAgent → TaskPlan → SpecPlan) STRICT_SPEC_AGENT, REQUIREMENT_AGENT, DESIGN_AGENT, TASK_PLAN_AGENT, + SPEC_PLAN_AGENT, // StrictPlan workflow: lightweight plan → implement pipeline STRICT_PLAN_AGENT, - SPEC_PLAN_AGENT, - PLAN_MANAGER_AGENT, SUB_CODING_AGENT, TASK_CHECK_AGENT, - TASK_PLAN_AGENT, QUICK_EXPLORE_AGENT, - REQUIREMENT_AGENT, - DESIGN_AGENT, - STRICT_SPEC_AGENT, WIKI_PROJECT_ANALYZE_AGENT, WIKI_CATALOGUE_DESIGN_AGENT, WIKI_DOCUMENT_GENERATE_AGENT,