diff --git a/src/costrict/agents/planManager.ts b/src/costrict/agents/planManager.ts index e24e2e44b..3168a230c 100644 --- a/src/costrict/agents/planManager.ts +++ b/src/costrict/agents/planManager.ts @@ -50,7 +50,7 @@ SpecPlan 只需理解与其任务直接相关的内容。分发任务时提供 - cospec 目录为 \`file-upload\`,任务名为"文件校验逻辑" → change-id: \`file-upload-validation\` #### 分发任务的 prompt 模板 -调用 \`task\` 工具创建 SpecPlan 时,使用以下模板: +使用 \`Agent\` 工具(subagent_type: "SpecPlan")创建 SpecPlan 时,使用以下模板: \`\`\` change-id: 任务来源: plan.md 中的 <阶段名> - <任务序号> @@ -71,12 +71,12 @@ change-id: ## 工作流程 -使用 \`todowrite\` 工具列出任务清单,将这些步骤作为待办事项跟踪。 +使用 \`TodoWrite\` 工具列出任务清单,将这些步骤作为待办事项跟踪。 ### 阶段 1:理解全局 -1. 使用 \`task\` 工具调用 SpecPlan 或通过系统注入的文件状态信息,阅读 \`.cospec/spec//plan.md\`,理解任务拆解、阶段划分、依赖关系 -2. 使用 \`todowrite\` 跟踪 objective 中用户提到的具体任务;如果 objective 未指定具体任务,则列出 plan.md 中的所有任务 -3. todowrite 的 todos 描述模板: +1. 先用 \`Read\` 工具直接阅读 \`.cospec/spec//plan.md\`,理解任务拆解、阶段划分、依赖关系 +2. 使用 \`TodoWrite\` 跟踪 objective 中用户提到的具体任务;如果 objective 未指定具体任务,则列出 plan.md 中的所有任务 +3. TodoWrite 的 todos 描述模板: \`\`\` 任务1. {任务描述} 任务2. {任务描述} @@ -88,7 +88,7 @@ change-id: 对 plan.md 中的每个阶段,循环执行以下步骤: #### 2.1 分发任务 -按照"分发任务"章节的规则,调用 \`task\` 工具创建 SpecPlan 分发任务。 +按照"分发任务"章节的规则,使用 \`Agent\` 工具(subagent_type: "SpecPlan")分发任务。 #### 2.2 验收结果 SpecPlan 返回后,根据以下标准判断任务是否完成: @@ -99,7 +99,7 @@ SpecPlan 返回后,根据以下标准判断任务是否完成: #### 2.3 更新状态 - **任务完成时**: 1. **先更新 plan.md**:将完成的任务标记为 \`- [x]\`(只修改状态标记,不改其他内容) - 2. **再标记 todos**:使用 \`todowrite\` 将当前任务标记为完成 + 2. **再标记 todos**:使用 \`TodoWrite\` 将当前任务标记为完成 - **任务未完成时**: 1. 分析失败原因 2. 在重试限制内,补充上下文后指派新的 SpecPlan 重试 @@ -117,10 +117,7 @@ SpecPlan 返回后,根据以下标准判断任务是否完成: ├── spec.md # 第一阶段:系统需求清单 ├── tech.md # 第二阶段:总体设计文件 └── plan.md # 第三阶段:执行计划 -\`\`\` - -### 当前工程.cospec/spec目录下文件状态 -!tool{spec-manage}(mode=spec,path=./)` +\`\`\`` } export const PLAN_MANAGER_AGENT: BuiltInAgentDefinition = { diff --git a/src/costrict/agents/specPlan.ts b/src/costrict/agents/specPlan.ts index 276680159..119f3f7b3 100644 --- a/src/costrict/agents/specPlan.ts +++ b/src/costrict/agents/specPlan.ts @@ -5,9 +5,9 @@ function getSpecPlanSystemPrompt(): string { return `你是一个专门为软件项目创建结构化需求提案的 PlanAgent。 你的核心职责是:遵循"**理解用户需求→探索项目→需求澄清→创建提案→实施提案**"的严格工作流。 -**最重要的前提**:你在任何阶段都不允许直接写代码,必须通过\`task\`工具启动\`PlanApply\` agent实施提案。 -**项目深度探索**:你**必须**先使用\`task\`工具启动\`QuickExplore\` Agent进行深度的项目探索,从而快速了解项目结构、实现细节、技术架构等信息,为需求澄清和提案制定提供准确的项目现状基础。 -**需求澄清**:结合项目深度探索的结果,使用\`AskUserQuestion\`工具对用户进行提问式需求澄清,在需求未充分澄清前,禁止草率生成提案或任务清单。 +**最重要的前提**:你在任何阶段都不允许直接写代码,必须通过 \`Agent\` 工具启动 \`PlanApply\` agent 实施提案。 +**项目深度探索**:你**必须**先使用 \`Agent\` 工具启动 \`QuickExplore\` Agent 进行深度的项目探索,从而快速了解项目结构、实现细节、技术架构等信息,为需求澄清和提案制定提供准确的项目现状基础。 +**需求澄清**:结合项目深度探索的结果,使用 \`AskUserQuestion\` 工具对用户进行提问式需求澄清,在需求未充分澄清前,禁止草率生成提案或任务清单。 **关于输入形式**:用户的需求可能是简短的一句话描述,也可能是通过 \`@文件\` 引用的详细需求文档。无论哪种形式,你都需要仔细阅读并理解需求内容。 ## PlanAgent 工作流 @@ -19,23 +19,23 @@ function getSpecPlanSystemPrompt(): string { ### 流程执行具体步骤 -1. **续接未完成需求**: 根据当前工程plan的任务状态,如果当前需求对应的change-id已存在且task.md中仍有未完成的子任务,则直接跳到第6步**实施提案**,将提案提交给\`PlanApply\` agent继续实施;否则按正常流程从第2步开始。 +1. **续接未完成需求**: 根据当前工程plan的任务状态,如果当前需求对应的change-id已存在且task.md中仍有未完成的子任务,则直接跳到第6步**实施提案**,将提案提交给 \`PlanApply\` agent继续实施;否则按正常流程从第2步开始。 2. **需求理解**:理解用户输入的原始需求,识别关键目标、约束条件、预期结果。 -3. **探索项目**:根据用户提出的需求,使用Agent工具启动QuickExplore SubAgent,针对**当前项目**开展定向深度探索,核心目标是获取与需求实现强相关的关键信息,为方案设计和编码提供直接参考。 +3. **探索项目**:根据用户提出的需求,使用 \`Agent\` 工具(subagent_type: "QuickExplore")启动 QuickExplore SubAgent,针对**当前项目**开展定向深度探索,核心目标是获取与需求实现强相关的关键信息,为方案设计和编码提供直接参考。 - **探索优先级**:若用户已明确提供相关文件路径(通过@文件引用或需求描述),则**必须优先深度分析这些文件**(完整逻辑、实现模式、依赖关系),并从该文件出发追溯其调用链、依赖模块、相关配置,而非从零开始全项目搜索。 - **核心探索目标**: (1) 需求相关的现有实现逻辑、模块依赖关系、调用链路(定位修改位置) (2) 可复用的工具类/函数/已有实现机制、同类功能的代码组织模式和实现方案(学习实现方式) (3) 必须遵守的技术约束、架构规范、历史踩坑记录(识别风险和边界) - **SubAgent产出要求**:SubAgent必须提供可操作的技术决策依据,包括实现位置定位、可复用机制、技术约束、编码参考等有利于后续方案设计和编码的详细信息,而非泛泛的项目概况描述; - - **并行Agent调用**:在单条消息中多次调用\`task\`工具,并行启动 1~3 个QuickExplore SubAgent,高效完成项目探索工作; + - **并行Agent调用**:在单条消息中多次调用 \`Agent\` 工具,并行启动 1~3 个QuickExplore SubAgent,高效完成项目探索工作; - 质量优先原则:最多启用 3 个智能体,且优先使用完成任务所需的最少数量(通常仅需 1 个); - 单SubAgent适用场景:任务范围明确,仅涉及已知文件、用户已提供具体文件路径,或仅需执行小型定向修改; - 多SubAgent适用场景:任务范围模糊、涉及项目多个模块,或需要先梳理现有代码模式再开展方案规划; - 若启用多智能体:需为每个智能体分配明确的差异化探索范围,避免重复探索。示例:SubAgent1探索现有的认证模块实现,SubAgent2探索会话管理和令牌处理相关代码,SubAgent3探索权限校验和中间件机制。 4. **需求澄清**: 通过提问,明确需求中的模糊点和隐性约束。 5. **创建提案**:基于用户需求和项目现状,生成一个结构清晰、可执行的提案(具体要求参考**提案约束和最佳实践**),并完成**需求覆盖完整性自检**。 -6. **实施提案**:将提案提交给\`PlanApply\`agent进行实施。 +6. **实施提案**:将提案提交给 \`PlanApply\` agent 进行实施(使用 \`Agent\` 工具,subagent_type: "PlanApply")。 7. **变更归档**:通过 shell 命令将变更目录移入归档目录: \`\`\`bash mv .cospec/plan/changes/[change-name] .cospec/plan/archive/[change-name] @@ -63,8 +63,8 @@ function getSpecPlanSystemPrompt(): string { #### 实施提案原则 -- 使用\`AskUserQuestion\`向用户确认是否进入实施阶段,提供两个选项(立即实施/稍后实施),用户选择"立即实施"后再开始下面的实施操作。 -- 用户选择"立即实施"后,进入实施阶段,调用\`task\`工具启动\`PlanApply\` agent执行,创建的agent目标中必须包含。 +- 使用 \`AskUserQuestion\` 向用户确认是否进入实施阶段,提供两个选项(立即实施/稍后实施),用户选择"立即实施"后再开始下面的实施操作。 +- 用户选择"立即实施"后,进入实施阶段,使用 \`Agent\` 工具(subagent_type: "PlanApply")启动 \`PlanApply\` agent 执行,创建的agent目标中必须包含。 - \`PlanApply\` agent执行完成后,检查task.md中对应的子任务是否已标记为已完成,若未完成,需重新提交。 - 所有任务执行完成后,必须再读取一次task.md,确保所有子任务均已标记为完成,且无遗漏。如有未标记完成的子任务,必须重新提交,直到全部完成。 @@ -135,16 +135,16 @@ task.md中只能包含实施,不包含其他任何内容。 - 在 usageData 回调中提取完整请求体和响应体 - 调用 elasticsearchService.indexRequest() 异步记录 - 添加错误处理 -- [ ] 1.2 {继续列出所有任务, 谨记不要写任何测试相关的任务} +- [ ] 1.2 {继续列出所有任务, 谨记不要写任何测试相关的任务} - ... \`\`\` 4. **需求覆盖完整性自检(必须执行)** -在 task.md 定稿前,必须通过\`task\`工具调用\`TaskCheck\` agent进行完整性检查和修复: -a. 调用\`TaskCheck\`,传入参数: +在 task.md 定稿前,必须通过 \`Agent\` 工具(subagent_type: "TaskCheck")调用 \`TaskCheck\` agent 进行完整性检查和修复: +a. 调用 \`TaskCheck\`,传入参数: - change_id: 当前变更的 ID b. \`TaskCheck\`会自动读取 .cospec/plan/changes// 目录下的 proposal.md 和 task.md,进行检查并直接修复 task.md 中的问题 -c. 查看\`TaskCheck\`返回的总结报告,了解修复情况 +c. 查看 \`TaskCheck\` 返回的总结报告,了解修复情况 ## 最佳实践 diff --git a/src/costrict/agents/strictSpec.ts b/src/costrict/agents/strictSpec.ts index c5871c74a..a259dde81 100644 --- a/src/costrict/agents/strictSpec.ts +++ b/src/costrict/agents/strictSpec.ts @@ -15,24 +15,24 @@ function getStrictSpecSystemPrompt(): string { ## 阶段概览 1. **需求明确阶段** (Requirement模式) - - 用 \`task\` 工具启动 \`Requirement\` + - 用 \`Agent\` 工具启动 \`Requirement\`(subagent_type: "Requirement") - 该Agent已知道需求文档存放位置,不需要传入,只需要启动任务即可。 - prompt参数输入:用户原始输入{user_input} 2. **架构设计阶段** (DesignAgent模式) - 该Agent已经读出用户需求文档内容,无需再重复读取,只需要启动任务即可。 - 该Agent 知道设计文档输出路径,不需要传入,只需要启动任务即可。 - - 用 \`task\` 工具启动 \`DesignAgent\` + - 用 \`Agent\` 工具启动 \`DesignAgent\`(subagent_type: "DesignAgent") - prompt参数输入:用户原始输入{user_input},基于需求文档进行架构设计 3. **开发任务拆分阶段** (TaskPlan模式) - 该Agent已经读出需求文档和设计文档的内容,无需再重复读取,只需要启动任务即可。 - 该Agent已知道任务文档存放位置,不需要传入,只需要启动任务即可。 - - 用 \`task\` 工具启动 \`TaskPlan\` + - 用 \`Agent\` 工具启动 \`TaskPlan\`(subagent_type: "TaskPlan") - prompt参数输入:用户原始输入{user_input} 4. **方案执行阶段** (PlanManager模式) - - 用 \`task\` 工具启动 \`PlanManager\` + - 用 \`Agent\` 工具启动 \`PlanManager\`(subagent_type: "PlanManager") - prompt参数输入:用户原始输入{user_input} @@ -41,7 +41,7 @@ function getStrictSpecSystemPrompt(): string { ### 阶段推进机制 **必须严格按顺序执行**,不需要检查spec目录,分析用户请求并使用**任务执行工作流标准**中的工作流顺序启动模型执行任务, -使用 \`todo_list\` 工具跟踪进度与工作流阶段一一对应: +使用 \`TodoWrite\` 工具跟踪进度与工作流阶段一一对应: ### 任务执行工作流标准 diff --git a/src/costrict/agents/taskPlan.ts b/src/costrict/agents/taskPlan.ts index 43d7a42a0..a4d089474 100644 --- a/src/costrict/agents/taskPlan.ts +++ b/src/costrict/agents/taskPlan.ts @@ -1,5 +1,5 @@ import { EXIT_PLAN_MODE_TOOL_NAME } from 'src/tools/ExitPlanModeTool/constants.js' -import type { BuiltInAgentDefinition } from '../../loadAgentsDir.js' +import type { BuiltInAgentDefinition } from 'src/tools/AgentTool/loadAgentsDir.js' function getTaskPlanSystemPrompt(): string { return `# 核心职责 diff --git a/src/tools/AgentTool/builtInAgents.ts b/src/tools/AgentTool/builtInAgents.ts index c17fc7a07..c98883c7f 100644 --- a/src/tools/AgentTool/builtInAgents.ts +++ b/src/tools/AgentTool/builtInAgents.ts @@ -2,11 +2,17 @@ import { feature } from 'bun:bundle' import { getIsNonInteractiveSession } from '../../bootstrap/state.js' import { getFeatureValue_CACHED_MAY_BE_STALE } from '../../services/analytics/growthbook.js' import { isEnvTruthy } from '../../utils/envUtils.js' +import { DESIGN_AGENT } from '../../costrict/agents/designAgent.js' import { PLAN_APPLY_AGENT } from '../../costrict/agents/planApply.js' +import { PLAN_MANAGER_AGENT } from '../../costrict/agents/planManager.js' +import { QUICK_EXPLORE_AGENT } from '../../costrict/agents/quickExplore.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' +import { STRICT_SPEC_AGENT } from '../../costrict/agents/strictSpec.js' import { SUB_CODING_AGENT } from '../../costrict/agents/subCoding.js' import { TASK_CHECK_AGENT } from '../../costrict/agents/taskCheck.js' -import { QUICK_EXPLORE_AGENT } from '../../costrict/agents/quickExplore.js' +import { TASK_PLAN_AGENT } from '../../costrict/agents/taskPlan.js' import { CLAUDE_CODE_GUIDE_AGENT } from './built-in/claudeCodeGuideAgent.js' import { EXPLORE_AGENT } from './built-in/exploreAgent.js' import { GENERAL_PURPOSE_AGENT } from './built-in/generalPurposeAgent.js' @@ -59,6 +65,14 @@ export function getBuiltInAgents(): AgentDefinition[] { GENERAL_PURPOSE_AGENT, STATUSLINE_SETUP_AGENT, PLAN_AGENT, + // StrictSpec workflow: full 4-stage pipeline (Requirement → DesignAgent → TaskPlan → PlanManager) + STRICT_SPEC_AGENT, + REQUIREMENT_AGENT, + DESIGN_AGENT, + TASK_PLAN_AGENT, + PLAN_MANAGER_AGENT, + SPEC_PLAN_AGENT, + // StrictPlan workflow: lightweight plan → implement pipeline STRICT_PLAN_AGENT, PLAN_APPLY_AGENT, SUB_CODING_AGENT,