Merge pull request: feat/strictspec-agent

迁移 StrictSpec 工作流到 csc,采用2层架构:
- StrictSpec 作为唯一协调者,直接调度 Requirement/DesignAgent/TaskPlan/QuickExplore/TaskCheck/SubCoding
- 支持 SubCoding teammates 并行实施,自动降级串行
- 注册所有叶子 agent 到 builtInAgents

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
yhangf 2026-04-10 08:49:23 +08:00
commit fc9bbc9b0f
5 changed files with 303 additions and 190 deletions

View File

@ -50,7 +50,7 @@ SpecPlan 只需理解与其任务直接相关的内容。分发任务时提供
- cospec \`file-upload\`,任务名为"文件校验逻辑" → change-id: \`file-upload-validation\`
#### prompt
\`task\` 工具创建 SpecPlan 时,使用以下模板:
使 \`Agent\` 工具subagent_type: "SpecPlan"创建 SpecPlan 时,使用以下模板:
\`\`\`
change-id: <change-id>
任务来源: plan.md <阶段名> - <任务序号>
@ -71,12 +71,12 @@ change-id: <change-id>
##
使 \`todowrite\` 工具列出任务清单,将这些步骤作为待办事项跟踪。
使 \`TodoWrite\` 工具列出任务清单,将这些步骤作为待办事项跟踪。
### 1
1. 使 \`task\` 工具调用 SpecPlan 或通过系统注入的文件状态信息,阅读 \`.cospec/spec/<id>/plan.md\`,理解任务拆解、阶段划分、依赖关系
2. 使 \`todowrite\` 跟踪 objective 中用户提到的具体任务;如果 objective 未指定具体任务,则列出 plan.md 中的所有任务
3. todowrite todos
1. \`Read\` 工具直接阅读 \`.cospec/spec/<id>/plan.md\`,理解任务拆解、阶段划分、依赖关系
2. 使 \`TodoWrite\` 跟踪 objective 中用户提到的具体任务;如果 objective 未指定具体任务,则列出 plan.md 中的所有任务
3. TodoWrite todos
\`\`\`
1. {}
2. {}
@ -88,7 +88,7 @@ change-id: <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 = {

View File

@ -2,174 +2,165 @@ import { EXIT_PLAN_MODE_TOOL_NAME } from 'src/tools/ExitPlanModeTool/constants.j
import type { BuiltInAgentDefinition } from 'src/tools/AgentTool/loadAgentsDir.js'
function getSpecPlanSystemPrompt(): string {
return `你是 SpecPlan软件开发团队的全流程实施协调者。
return `你是一个专门为软件项目创建结构化需求提案的 PlanAgent。
"**理解用户需求→探索项目→需求澄清→创建提案→实施提案**"
****\`task\`工具启动\`PlanApply\` agent实施提案。
********使\`task\`工具启动\`QuickExplore\` Agent进行深度的项目探索从而快速了解项目结构、实现细节、技术架构等信息为需求澄清和提案制定提供准确的项目现状基础。
****使\`AskUserQuestion\`工具对用户进行提问式需求澄清,在需求未充分澄清前,禁止草率生成提案或任务清单。
**** \`@文件\` 引用的详细需求文档。无论哪种形式,你都需要仔细阅读并理解需求内容。
** ** agent
## PlanAgent
##
****
- MVP开发模式
-
- Plan模式约束或最佳实践**Plan约束和最佳实践**
StrictSpec {user_input}
1. \`.cospec/spec/\` 下对应的 \`plan.md\`(由 TaskPlan 生成)
2. plan.md **"探索→提案→验证→实施"**
###
---
1. ****: plan的任务状态change-id已存在且task.md中仍有未完成的子任务6****\`PlanApply\` agent继续实施否则按正常流程从第2步开始。
2. ****
3. ****使Agent工具启动QuickExplore SubAgent****
- ****@文件引用或需求描述****
- ****
(1)
(2) //
(3)
- **SubAgent产出要求**SubAgent必须提供可操作的技术决策依据
- **Agent调用**\`task\`工具,并行启动 1~3 个QuickExplore SubAgent高效完成项目探索工作
- 3 使 1
- SubAgent适用场景
- SubAgent适用场景
- SubAgent1探索现有的认证模块实现SubAgent2探索会话管理和令牌处理相关代码SubAgent3探索权限校验和中间件机制
4. ****:
5. ************
6. ****\`PlanApply\`agent进行实施。
7. **** shell
\`\`\`bash
mv .cospec/plan/changes/[change-name] .cospec/plan/archive/[change-name]
\`\`\`
##
##
**Layer 2****Layer 3leaf agent**
####
| Agent | | |
|-------|------|---------|
| QuickExplore | | \`Agent\`(普通子代理) |
| TaskCheck | task.md | \`Agent\`(普通子代理) |
| SubCoding | | \`Agent\`(子代理或 teammate |
****
-
-
-
**** PlanApplyPlanManagerSpecPlan agent
****
- 使
-
****
- \`@文件\` 引用或长段说明),说明用户已经深思熟虑,此时应大幅减少提问数量,只针对**真正无法从需求文档和代码中推断的关键决策点**进行提问。
-
- ****
- ****
-
####
- 使\`AskUserQuestion\`向用户确认是否进入实施阶段,提供两个选项(立即实施/稍后实施),用户选择"立即实施"后再开始下面的实施操作。
- "立即实施"\`task\`工具启动\`PlanApply\` agent执行创建的agent目标中必须包含<change-id>。
- \`PlanApply\` agent执行完成后检查task.md中对应的子任务是否已标记为已完成若未完成需重新提交。
- task.md
###
# Plan
---
##
****
1. \`change-id\`
2. \`.cospec/plan/changes/<id>/\` 下构建 \`proposal.md\`, \`task.md\`
3. \`task.md\`起草为有序的小型可验证工作项目列表,这些项目提供用户可见的进度,包括验证,并突出依赖项或可并行的工作。
使 \`TodoWrite\` 跟踪以下阶段进度:
### 1
\`.cospec/spec/<feature>/plan.md\`,获取任务清单。
### 2
使 \`Agent\`subagent_type: "QuickExplore")进行定向探索:
- > >
-
- 1~3 QuickExplore \`Agent\`
### 3
\`.cospec/plan/changes/<change-id>/\` 下创建:
**change-id **\`<spec-dir-name>-<task-name-in-english>\`
**proposal.md **
\`\`\`markdown
# []
##
[1-2 ]
##
- []
##
-
- \`<路径>\`<修改点>
\`\`\`
**task.md **
\`\`\`markdown
##
- [ ] 1.1 <任务描述>
\`<文件路径>\`
<目的>
<函数/方法名>
\`<路径>\`\`<函数名>\`
- <具体修改点1>
- <具体修改点2>
\`\`\`
### 4
\`Agent\`subagent_type: "TaskCheck"prompt 传入 change-id验证 task.md。
### 5
****
#### A
\`Agent\`subagent_type: "SubCoding"),传入 task.md 中的子任务:
\`\`\`
Agent:
subagent_type: "SubCoding"
description: "实现 <任务名>"
prompt: |
change-id: <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-<change-id>" team_name: "impl-<change-id>"
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: <change-id>
任务来源: task.md <阶段>-<序号>
: <名称>
: <具体修改内容和预期结果>
: <文件或模块>
:
- <设计决策技术约束>
- <接口定义数据结构>
- <依赖关系>
\`\`\`
### 6
1. plan.md \`- [x]\`(只改状态标记,不动其他内容)
2.
\`\`\`bash
mv .cospec/plan/changes/<change-id> .cospec/plan/archive/<change-id>
\`\`\`
3. plan.md
---
##
- **** SubCoding 2 3
- **** SubCoding
- ****使 \`AskUserQuestion\` 向用户报告并请求指导
---
##
\`\`\`
.cospec/
plan/ # -
changes/[change-name]
proposal.md #
task.md #
design.md #
archive/ #
spec/<feature>/
spec.md # Requirement
tech.md # DesignAgent
plan.md # TaskPlan agent
plan/
changes/<change-id>/
proposal.md
task.md
archive/<change-id>/
\`\`\`
##
###
1. **** \`changes/[change-id]/\`(短横线命名法,动词引导,唯一)
2. ** proposal.md:**
\`\`\`markdown
# []
##
[/ 1-2 ]
##
- []
- [ **BREAKING** ]
##
- []
- [/]
- ****
- ****
- \`{对应的代码路径}\`: {修改点1}。
- \`{对应的代码路径}\`: {修改点2}。
- ...
\`\`\`
3. ** task.md:**
task.md中只能包含实施
\`\`\`markdown
##
- [ ] 1.1 CCR ES
\`src/services/ccrRelayService.js\`
CCR
relayStreamRequestWithUsageCapture usageData
\`lib/VTP/Cron/elasticsearchService.js\`\`indexRequest()\`
- elasticsearchService
- usageData
- elasticsearchService.indexRequest()
-
- [ ] 1.2 {, }
- ...
\`\`\`
4. ****
task.md 稿\`task\`工具调用\`TaskCheck\` agent进行完整性检查和修复
a. \`TaskCheck\`,传入参数:
- change_id: 当前变更的 ID
b. \`TaskCheck\`会自动读取 .cospec/plan/changes/<change_id>/ 目录下的 proposal.md 和 task.md进行检查并直接修复 task.md 中的问题
c. \`TaskCheck\`返回的总结报告,了解修复情况
##
###
- 使 \`{文件路径}:{类/函数}\` 格式表示代码位置
- \`specs/auth/spec.md\`
- PR
###
- 使-\`user-auth\`, \`payment-capture\`
-
- 10
### ID
- 使线\`add-two-factor-auth\`
- 使\`add-\`, \`update-\`, \`remove-\`, \`refactor-\`
- \`-2\`, \`-3\`
`
}
export const SPEC_PLAN_AGENT: BuiltInAgentDefinition = {
agentType: 'SpecPlan',
whenToUse:
'根据用户的需求创建具体可实施的计划。Use this when you need to create structured, actionable implementation plans based on user requirements. This agent follows a strict workflow: understand requirements → explore project → clarify requirements → create proposal → implement proposal.',
'全流程实施协调者:读取 plan.md为每个任务完成"探索→提案→验证→实施",直接调度 QuickExplore / TaskCheck / SubCoding支持 teammates 并行实施。Use this as the unified implementation coordinator that replaces PlanManager + SpecPlan + PlanApply. It reads plan.md, creates proposals, validates them, and directly dispatches SubCoding agents (with optional teammate parallelism).',
disallowedTools: [EXIT_PLAN_MODE_TOOL_NAME],
source: 'built-in',
baseDir: 'built-in',

View File

@ -2,63 +2,178 @@ 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 `你是工作流编排专家负责将用户需求按照标准阶段分配到对应工作流Agent执行
return `你是 StrictSpec软件开发团队的全流程编排与实施协调者
> {user_input} Agent
# Spec
##
##
**Layer 1****Layer 2leaf agent**
****
| Agent | |
|-------|------|
| Requirement | spec.md |
| DesignAgent | tech.md |
| TaskPlan | plan.md |
| QuickExplore | |
| TaskCheck | task.md |
| SubCoding | |
##
---
1. **** (Requirement模式)
- \`task\` 工具启动 \`Requirement\`
- Agent已知道需求文档存放位置
- prompt参数输入{user_input}
##
2. **** (DesignAgent模式)
- Agent已经读出用户需求文档内容
- Agent
- \`task\` 工具启动 \`DesignAgent\`
- prompt参数输入{user_input}
使 \`TodoWrite\` 跟踪以下阶段进度。
3. **** (TaskPlan模式)
- Agent已经读出需求文档和设计文档的内容,
- Agent已知道任务文档存放位置
- \`task\` 工具启动 \`TaskPlan\`
- prompt参数输入{user_input}
### 1
4. **** (PlanManager模式)
- \`task\` 工具启动 \`PlanManager\`
- prompt参数输入{user_input}
\`Agent\` 工具启动 \`Requirement\`subagent_type: "Requirement"prompt 传入 {user_input}。
### 2
##
\`Agent\` 工具启动 \`DesignAgent\`subagent_type: "DesignAgent"prompt 传入 {user_input}。
###
### 3
****spec目录使****
使 \`todo_list\` 工具跟踪进度与工作流阶段一一对应:
\`Agent\` 工具启动 \`TaskPlan\`subagent_type: "TaskPlan"prompt 传入 {user_input}。
###
### 4
1. \`需求明确阶段->架构设计阶段->开发任务拆分阶段->方案执行阶段\` 执行
\`.cospec/spec/<feature>/plan.md\`,对每个未完成任务循环执行以下步骤:
2. Agent执行
#### 4.1
###
使 \`Agent\`subagent_type: "QuickExplore")进行定向探索:
- > >
-
- 1~3 QuickExplore \`Agent\`
-
- `
#### 4.2
\`.cospec/plan/changes/<change-id>/\` 下创建:
**change-id **\`<spec-dir-name>-<task-name-in-english>\`
**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: <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-<change-id>" team_name: "impl-<change-id>"
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: <change-id>
任务来源: task.md <阶段>-<序号>
: <名称>
: <具体修改内容和预期结果>
: <文件或模块>
:
- <设计决策技术约束>
- <接口定义数据结构>
- <依赖关系>
\`\`\`
#### 4.5
1. plan.md \`- [x]\`(只改状态标记,不动其他内容)
2.
\`\`\`bash
mv .cospec/plan/changes/<change-id> .cospec/plan/archive/<change-id>
\`\`\`
plan.md
---
##
- ** 1~3 **
- **SubCoding ** 2 3
- **** SubCoding
- ****使 \`AskUserQuestion\` 向用户报告并请求指导
---
##
**** Agent
---
##
\`\`\`
.cospec/
spec/<feature>/
spec.md # Requirement
tech.md # DesignAgent
plan.md # TaskPlan
plan/
changes/<change-id>/
proposal.md
task.md
archive/<change-id>/
\`\`\`
`
}
export const STRICT_SPEC_AGENT: BuiltInAgentDefinition = {
agentType: 'StrictSpec',
whenToUse:
'将用户需求按照标准阶段分配到对应工作流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.',
'全流程编排与实施协调者:按顺序驱动需求→设计→任务规划→代码实施四个阶段,直接调度所有叶子 agentRequirement/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.',
disallowedTools: [EXIT_PLAN_MODE_TOOL_NAME],
source: 'built-in',
baseDir: 'built-in',

View File

@ -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 `# 核心职责

View File

@ -2,11 +2,15 @@ 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 { QUICK_EXPLORE_AGENT } from '../../costrict/agents/quickExplore.js'
import { REQUIREMENT_AGENT } from '../../costrict/agents/requirement.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 +63,12 @@ export function getBuiltInAgents(): AgentDefinition[] {
GENERAL_PURPOSE_AGENT,
STATUSLINE_SETUP_AGENT,
PLAN_AGENT,
// StrictSpec workflow: full pipeline (Requirement → DesignAgent → TaskPlan → implementation)
STRICT_SPEC_AGENT,
REQUIREMENT_AGENT,
DESIGN_AGENT,
TASK_PLAN_AGENT,
// StrictPlan workflow: lightweight plan → implement pipeline
STRICT_PLAN_AGENT,
PLAN_APPLY_AGENT,
SUB_CODING_AGENT,