@specpow/framework 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +307 -0
- package/LICENSE +21 -0
- package/README.md +557 -0
- package/agents/controller/sdd-controller.md +55 -0
- package/agents/execution/java-codegen-agent.md +39 -0
- package/agents/execution/ui-codegen-agent.md +32 -0
- package/agents/ops/deploy-agent.md +181 -0
- package/agents/planning/db-designer-agent.md +30 -0
- package/agents/planning/prd-agent.md +31 -0
- package/agents/quality/review-agent.md +36 -0
- package/agents/quality/test-agent.md +33 -0
- package/bin/specpow.js +10 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +444 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/commands/apply.d.ts +14 -0
- package/dist/commands/apply.d.ts.map +1 -0
- package/dist/commands/apply.js +195 -0
- package/dist/commands/apply.js.map +1 -0
- package/dist/commands/archive.d.ts +30 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +141 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/channel.d.ts +61 -0
- package/dist/commands/channel.d.ts.map +1 -0
- package/dist/commands/channel.js +613 -0
- package/dist/commands/channel.js.map +1 -0
- package/dist/commands/config.d.ts +40 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +130 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/debug.d.ts +45 -0
- package/dist/commands/debug.d.ts.map +1 -0
- package/dist/commands/debug.js +167 -0
- package/dist/commands/debug.js.map +1 -0
- package/dist/commands/doctor.d.ts +20 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +121 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/execute.d.ts +25 -0
- package/dist/commands/execute.d.ts.map +1 -0
- package/dist/commands/execute.js +120 -0
- package/dist/commands/execute.js.map +1 -0
- package/dist/commands/explore.d.ts +71 -0
- package/dist/commands/explore.d.ts.map +1 -0
- package/dist/commands/explore.js +481 -0
- package/dist/commands/explore.js.map +1 -0
- package/dist/commands/init.d.ts +20 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +146 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/memory.d.ts +32 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +455 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/propose.d.ts +13 -0
- package/dist/commands/propose.d.ts.map +1 -0
- package/dist/commands/propose.js +193 -0
- package/dist/commands/propose.js.map +1 -0
- package/dist/commands/review.d.ts +50 -0
- package/dist/commands/review.d.ts.map +1 -0
- package/dist/commands/review.js +198 -0
- package/dist/commands/review.js.map +1 -0
- package/dist/commands/schema.d.ts +22 -0
- package/dist/commands/schema.d.ts.map +1 -0
- package/dist/commands/schema.js +79 -0
- package/dist/commands/schema.js.map +1 -0
- package/dist/commands/status.d.ts +11 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +130 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/store.d.ts +31 -0
- package/dist/commands/store.d.ts.map +1 -0
- package/dist/commands/store.js +109 -0
- package/dist/commands/store.js.map +1 -0
- package/dist/commands/update.d.ts +42 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +239 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +39 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +386 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/commands/workflow/index.d.ts +12 -0
- package/dist/commands/workflow/index.d.ts.map +1 -0
- package/dist/commands/workflow/index.js +435 -0
- package/dist/commands/workflow/index.js.map +1 -0
- package/dist/core/agent-contract.d.ts +133 -0
- package/dist/core/agent-contract.d.ts.map +1 -0
- package/dist/core/agent-contract.js +71 -0
- package/dist/core/agent-contract.js.map +1 -0
- package/dist/core/archive/delta-merger.d.ts +101 -0
- package/dist/core/archive/delta-merger.d.ts.map +1 -0
- package/dist/core/archive/delta-merger.js +398 -0
- package/dist/core/archive/delta-merger.js.map +1 -0
- package/dist/core/archive/delta-parser.d.ts +48 -0
- package/dist/core/archive/delta-parser.d.ts.map +1 -0
- package/dist/core/archive/delta-parser.js +193 -0
- package/dist/core/archive/delta-parser.js.map +1 -0
- package/dist/core/archive/engine.d.ts +136 -0
- package/dist/core/archive/engine.d.ts.map +1 -0
- package/dist/core/archive/engine.js +506 -0
- package/dist/core/archive/engine.js.map +1 -0
- package/dist/core/archive/index.d.ts +11 -0
- package/dist/core/archive/index.d.ts.map +1 -0
- package/dist/core/archive/index.js +9 -0
- package/dist/core/archive/index.js.map +1 -0
- package/dist/core/artifact-graph/graph.d.ts +48 -0
- package/dist/core/artifact-graph/graph.d.ts.map +1 -0
- package/dist/core/artifact-graph/graph.js +170 -0
- package/dist/core/artifact-graph/graph.js.map +1 -0
- package/dist/core/artifact-graph/index.d.ts +13 -0
- package/dist/core/artifact-graph/index.d.ts.map +1 -0
- package/dist/core/artifact-graph/index.js +12 -0
- package/dist/core/artifact-graph/index.js.map +1 -0
- package/dist/core/artifact-graph/instruction-loader.d.ts +60 -0
- package/dist/core/artifact-graph/instruction-loader.d.ts.map +1 -0
- package/dist/core/artifact-graph/instruction-loader.js +166 -0
- package/dist/core/artifact-graph/instruction-loader.js.map +1 -0
- package/dist/core/artifact-graph/outputs.d.ts +17 -0
- package/dist/core/artifact-graph/outputs.d.ts.map +1 -0
- package/dist/core/artifact-graph/outputs.js +27 -0
- package/dist/core/artifact-graph/outputs.js.map +1 -0
- package/dist/core/artifact-graph/resolver.d.ts +34 -0
- package/dist/core/artifact-graph/resolver.d.ts.map +1 -0
- package/dist/core/artifact-graph/resolver.js +99 -0
- package/dist/core/artifact-graph/resolver.js.map +1 -0
- package/dist/core/artifact-graph/state.d.ts +54 -0
- package/dist/core/artifact-graph/state.d.ts.map +1 -0
- package/dist/core/artifact-graph/state.js +149 -0
- package/dist/core/artifact-graph/state.js.map +1 -0
- package/dist/core/artifact-graph/types.d.ts +151 -0
- package/dist/core/artifact-graph/types.d.ts.map +1 -0
- package/dist/core/artifact-graph/types.js +44 -0
- package/dist/core/artifact-graph/types.js.map +1 -0
- package/dist/core/channel/channel-event-log.d.ts +81 -0
- package/dist/core/channel/channel-event-log.d.ts.map +1 -0
- package/dist/core/channel/channel-event-log.js +177 -0
- package/dist/core/channel/channel-event-log.js.map +1 -0
- package/dist/core/channel/channel-inbox.d.ts +70 -0
- package/dist/core/channel/channel-inbox.d.ts.map +1 -0
- package/dist/core/channel/channel-inbox.js +122 -0
- package/dist/core/channel/channel-inbox.js.map +1 -0
- package/dist/core/channel/channel-runtime.d.ts +81 -0
- package/dist/core/channel/channel-runtime.d.ts.map +1 -0
- package/dist/core/channel/channel-runtime.js +291 -0
- package/dist/core/channel/channel-runtime.js.map +1 -0
- package/dist/core/channel/channel-supervisor.d.ts +72 -0
- package/dist/core/channel/channel-supervisor.d.ts.map +1 -0
- package/dist/core/channel/channel-supervisor.js +189 -0
- package/dist/core/channel/channel-supervisor.js.map +1 -0
- package/dist/core/channel/channel-types.d.ts +169 -0
- package/dist/core/channel/channel-types.d.ts.map +1 -0
- package/dist/core/channel/channel-types.js +26 -0
- package/dist/core/channel/channel-types.js.map +1 -0
- package/dist/core/channel/index.d.ts +21 -0
- package/dist/core/channel/index.d.ts.map +1 -0
- package/dist/core/channel/index.js +23 -0
- package/dist/core/channel/index.js.map +1 -0
- package/dist/core/command-generation/index.d.ts +225 -0
- package/dist/core/command-generation/index.d.ts.map +1 -0
- package/dist/core/command-generation/index.js +462 -0
- package/dist/core/command-generation/index.js.map +1 -0
- package/dist/core/config/config-schema.d.ts +745 -0
- package/dist/core/config/config-schema.d.ts.map +1 -0
- package/dist/core/config/config-schema.js +108 -0
- package/dist/core/config/config-schema.js.map +1 -0
- package/dist/core/config/global-config.d.ts +73 -0
- package/dist/core/config/global-config.d.ts.map +1 -0
- package/dist/core/config/global-config.js +225 -0
- package/dist/core/config/global-config.js.map +1 -0
- package/dist/core/config/index.d.ts +8 -0
- package/dist/core/config/index.d.ts.map +1 -0
- package/dist/core/config/index.js +8 -0
- package/dist/core/config/index.js.map +1 -0
- package/dist/core/hooks/hook-registry.d.ts +55 -0
- package/dist/core/hooks/hook-registry.d.ts.map +1 -0
- package/dist/core/hooks/hook-registry.js +172 -0
- package/dist/core/hooks/hook-registry.js.map +1 -0
- package/dist/core/hooks/hook-types.d.ts +87 -0
- package/dist/core/hooks/hook-types.d.ts.map +1 -0
- package/dist/core/hooks/hook-types.js +11 -0
- package/dist/core/hooks/hook-types.js.map +1 -0
- package/dist/core/hooks/index.d.ts +28 -0
- package/dist/core/hooks/index.d.ts.map +1 -0
- package/dist/core/hooks/index.js +28 -0
- package/dist/core/hooks/index.js.map +1 -0
- package/dist/core/hooks/post-tool-call-hook.d.ts +21 -0
- package/dist/core/hooks/post-tool-call-hook.d.ts.map +1 -0
- package/dist/core/hooks/post-tool-call-hook.js +191 -0
- package/dist/core/hooks/post-tool-call-hook.js.map +1 -0
- package/dist/core/hooks/pre-tool-call-hook.d.ts +31 -0
- package/dist/core/hooks/pre-tool-call-hook.d.ts.map +1 -0
- package/dist/core/hooks/pre-tool-call-hook.js +122 -0
- package/dist/core/hooks/pre-tool-call-hook.js.map +1 -0
- package/dist/core/hooks/session-start-hook.d.ts +25 -0
- package/dist/core/hooks/session-start-hook.d.ts.map +1 -0
- package/dist/core/hooks/session-start-hook.js +226 -0
- package/dist/core/hooks/session-start-hook.js.map +1 -0
- package/dist/core/hooks/workflow-state-hook.d.ts +18 -0
- package/dist/core/hooks/workflow-state-hook.d.ts.map +1 -0
- package/dist/core/hooks/workflow-state-hook.js +181 -0
- package/dist/core/hooks/workflow-state-hook.js.map +1 -0
- package/dist/core/init/engine.d.ts +69 -0
- package/dist/core/init/engine.d.ts.map +1 -0
- package/dist/core/init/engine.js +211 -0
- package/dist/core/init/engine.js.map +1 -0
- package/dist/core/init/template-hash.d.ts +86 -0
- package/dist/core/init/template-hash.d.ts.map +1 -0
- package/dist/core/init/template-hash.js +228 -0
- package/dist/core/init/template-hash.js.map +1 -0
- package/dist/core/memory/adapters/json-adapter.d.ts +50 -0
- package/dist/core/memory/adapters/json-adapter.d.ts.map +1 -0
- package/dist/core/memory/adapters/json-adapter.js +273 -0
- package/dist/core/memory/adapters/json-adapter.js.map +1 -0
- package/dist/core/memory/adapters/sqlite-adapter.d.ts +26 -0
- package/dist/core/memory/adapters/sqlite-adapter.d.ts.map +1 -0
- package/dist/core/memory/adapters/sqlite-adapter.js +230 -0
- package/dist/core/memory/adapters/sqlite-adapter.js.map +1 -0
- package/dist/core/memory/index.d.ts +38 -0
- package/dist/core/memory/index.d.ts.map +1 -0
- package/dist/core/memory/index.js +40 -0
- package/dist/core/memory/index.js.map +1 -0
- package/dist/core/memory/memory-indexer.d.ts +39 -0
- package/dist/core/memory/memory-indexer.d.ts.map +1 -0
- package/dist/core/memory/memory-indexer.js +213 -0
- package/dist/core/memory/memory-indexer.js.map +1 -0
- package/dist/core/memory/memory-manager.d.ts +59 -0
- package/dist/core/memory/memory-manager.d.ts.map +1 -0
- package/dist/core/memory/memory-manager.js +194 -0
- package/dist/core/memory/memory-manager.js.map +1 -0
- package/dist/core/memory/memory-store.d.ts +31 -0
- package/dist/core/memory/memory-store.d.ts.map +1 -0
- package/dist/core/memory/memory-store.js +148 -0
- package/dist/core/memory/memory-store.js.map +1 -0
- package/dist/core/memory/memory-types.d.ts +154 -0
- package/dist/core/memory/memory-types.d.ts.map +1 -0
- package/dist/core/memory/memory-types.js +13 -0
- package/dist/core/memory/memory-types.js.map +1 -0
- package/dist/core/migration/index.d.ts +80 -0
- package/dist/core/migration/index.d.ts.map +1 -0
- package/dist/core/migration/index.js +361 -0
- package/dist/core/migration/index.js.map +1 -0
- package/dist/core/parsers/index.d.ts +95 -0
- package/dist/core/parsers/index.d.ts.map +1 -0
- package/dist/core/parsers/index.js +367 -0
- package/dist/core/parsers/index.js.map +1 -0
- package/dist/core/sdd-engine/ai-caller.d.ts +118 -0
- package/dist/core/sdd-engine/ai-caller.d.ts.map +1 -0
- package/dist/core/sdd-engine/ai-caller.js +624 -0
- package/dist/core/sdd-engine/ai-caller.js.map +1 -0
- package/dist/core/sdd-engine/controller.d.ts +107 -0
- package/dist/core/sdd-engine/controller.d.ts.map +1 -0
- package/dist/core/sdd-engine/controller.js +357 -0
- package/dist/core/sdd-engine/controller.js.map +1 -0
- package/dist/core/sdd-engine/dispatcher.d.ts +69 -0
- package/dist/core/sdd-engine/dispatcher.d.ts.map +1 -0
- package/dist/core/sdd-engine/dispatcher.js +146 -0
- package/dist/core/sdd-engine/dispatcher.js.map +1 -0
- package/dist/core/sdd-engine/git-ops.d.ts +73 -0
- package/dist/core/sdd-engine/git-ops.d.ts.map +1 -0
- package/dist/core/sdd-engine/git-ops.js +326 -0
- package/dist/core/sdd-engine/git-ops.js.map +1 -0
- package/dist/core/sdd-engine/index.d.ts +17 -0
- package/dist/core/sdd-engine/index.d.ts.map +1 -0
- package/dist/core/sdd-engine/index.js +15 -0
- package/dist/core/sdd-engine/index.js.map +1 -0
- package/dist/core/sdd-engine/ledger.d.ts +92 -0
- package/dist/core/sdd-engine/ledger.d.ts.map +1 -0
- package/dist/core/sdd-engine/ledger.js +273 -0
- package/dist/core/sdd-engine/ledger.js.map +1 -0
- package/dist/core/sdd-engine/model-selector.d.ts +49 -0
- package/dist/core/sdd-engine/model-selector.d.ts.map +1 -0
- package/dist/core/sdd-engine/model-selector.js +76 -0
- package/dist/core/sdd-engine/model-selector.js.map +1 -0
- package/dist/core/sdd-engine/parallel-dispatcher.d.ts +99 -0
- package/dist/core/sdd-engine/parallel-dispatcher.d.ts.map +1 -0
- package/dist/core/sdd-engine/parallel-dispatcher.js +350 -0
- package/dist/core/sdd-engine/parallel-dispatcher.js.map +1 -0
- package/dist/core/sdd-engine/review-loop.d.ts +61 -0
- package/dist/core/sdd-engine/review-loop.d.ts.map +1 -0
- package/dist/core/sdd-engine/review-loop.js +139 -0
- package/dist/core/sdd-engine/review-loop.js.map +1 -0
- package/dist/core/sdd-engine/types.d.ts +104 -0
- package/dist/core/sdd-engine/types.d.ts.map +1 -0
- package/dist/core/sdd-engine/types.js +7 -0
- package/dist/core/sdd-engine/types.js.map +1 -0
- package/dist/core/store/index.d.ts +78 -0
- package/dist/core/store/index.d.ts.map +1 -0
- package/dist/core/store/index.js +182 -0
- package/dist/core/store/index.js.map +1 -0
- package/dist/core/templates/index.d.ts +58 -0
- package/dist/core/templates/index.d.ts.map +1 -0
- package/dist/core/templates/index.js +158 -0
- package/dist/core/templates/index.js.map +1 -0
- package/dist/core/validation/index.d.ts +34 -0
- package/dist/core/validation/index.d.ts.map +1 -0
- package/dist/core/validation/index.js +153 -0
- package/dist/core/validation/index.js.map +1 -0
- package/dist/core/workflow-state.d.ts +96 -0
- package/dist/core/workflow-state.d.ts.map +1 -0
- package/dist/core/workflow-state.js +284 -0
- package/dist/core/workflow-state.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/index.d.ts +48 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +119 -0
- package/dist/utils/index.js.map +1 -0
- package/hooks/hooks.json +30 -0
- package/hooks/run-hook.cmd +19 -0
- package/hooks/session-start +62 -0
- package/hooks/workflow-state +150 -0
- package/package.json +122 -0
- package/schemas/bug-fix/schema.yaml +64 -0
- package/schemas/bug-fix/templates/analysis.md +43 -0
- package/schemas/bug-fix/templates/fix-plan.md +19 -0
- package/schemas/bug-fix/templates/proposal.md +30 -0
- package/schemas/crud-module/schema.yaml +65 -0
- package/schemas/crud-module/templates/design.md +36 -0
- package/schemas/crud-module/templates/proposal.md +30 -0
- package/schemas/crud-module/templates/spec.md +33 -0
- package/schemas/crud-module/templates/tasks.md +57 -0
- package/schemas/spec-driven/schema.yaml +87 -0
- package/schemas/spec-driven/templates/design.md +54 -0
- package/schemas/spec-driven/templates/proposal.md +31 -0
- package/schemas/spec-driven/templates/spec.md +44 -0
- package/schemas/spec-driven/templates/tasks.md +98 -0
- package/skills/business-code-review/SKILL.md +78 -0
- package/skills/business-db-design/SKILL.md +74 -0
- package/skills/business-deploy-check/SKILL.md +72 -0
- package/skills/business-doc-sync/SKILL.md +72 -0
- package/skills/business-java-codegen/SKILL.md +97 -0
- package/skills/business-menu-register/SKILL.md +63 -0
- package/skills/business-prd-writer/SKILL.md +80 -0
- package/skills/business-test-gen/SKILL.md +82 -0
- package/skills/business-ui-codegen/SKILL.md +104 -0
- package/skills/execution-finish-branch/SKILL.md +58 -0
- package/skills/execution-git-worktrees/SKILL.md +48 -0
- package/skills/execution-parallel-agents/SKILL.md +51 -0
- package/skills/execution-receiving-review/SKILL.md +47 -0
- package/skills/execution-requesting-review/SKILL.md +51 -0
- package/skills/execution-subagent-driven-dev/SKILL.md +148 -0
- package/skills/execution-systematic-debugging/SKILL.md +95 -0
- package/skills/execution-tdd/SKILL.md +74 -0
- package/skills/execution-verification-before-completion/SKILL.md +75 -0
- package/skills/meta-create-skill/SKILL.md +374 -0
- package/skills/meta-using-skills/SKILL.md +97 -0
- package/skills/meta-writing-skills/SKILL.md +66 -0
- package/skills/planning-apply-change/SKILL.md +199 -0
- package/skills/planning-archive-change/SKILL.md +43 -0
- package/skills/planning-explore/SKILL.md +108 -0
- package/skills/planning-onboard/SKILL.md +60 -0
- package/skills/planning-propose/SKILL.md +145 -0
- package/skills/planning-update-change/SKILL.md +45 -0
- package/skills/planning-verify-change/SKILL.md +58 -0
- package/skills/planning-write-design/SKILL.md +59 -0
- package/skills/planning-write-plans/SKILL.md +55 -0
- package/skills/planning-write-specs/SKILL.md +73 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDD 控制器
|
|
3
|
+
*
|
|
4
|
+
* 核心协调器,编排整个子代理驱动开发流程:
|
|
5
|
+
*
|
|
6
|
+
* 1. 设置:工作区、账本、读取计划
|
|
7
|
+
* 2. 对每个任务:
|
|
8
|
+
* a. 提取任务简报
|
|
9
|
+
* b. 分发实现者子代理
|
|
10
|
+
* c. 处理报告
|
|
11
|
+
* d. 生成审查包 → 分发审查子代理
|
|
12
|
+
* e. 修复循环(≤5轮)
|
|
13
|
+
* f. 记录到账本
|
|
14
|
+
* 3. 全分支最终审查
|
|
15
|
+
* 4. 清理工作区
|
|
16
|
+
*
|
|
17
|
+
* 关键原则:
|
|
18
|
+
* - 控制器不自己修复代码(保持上下文干净)
|
|
19
|
+
* - 所有产物通过文件传递(不占用上下文窗口)
|
|
20
|
+
* - 信任账本而非自己的记忆
|
|
21
|
+
*/
|
|
22
|
+
import type { SDDConfig } from './types.js';
|
|
23
|
+
export interface PlanTask {
|
|
24
|
+
number: number;
|
|
25
|
+
title: string;
|
|
26
|
+
description: string;
|
|
27
|
+
files: string[];
|
|
28
|
+
}
|
|
29
|
+
export interface SDDResult {
|
|
30
|
+
success: boolean;
|
|
31
|
+
completedTasks: number;
|
|
32
|
+
totalTasks: number;
|
|
33
|
+
blockedTasks: number;
|
|
34
|
+
parkedFindings: number;
|
|
35
|
+
}
|
|
36
|
+
export declare class SDDController {
|
|
37
|
+
private config;
|
|
38
|
+
private ledger;
|
|
39
|
+
private reviewLoop;
|
|
40
|
+
private modelSelector;
|
|
41
|
+
private aiCaller;
|
|
42
|
+
private inGitRepo;
|
|
43
|
+
constructor(config: SDDConfig);
|
|
44
|
+
/**
|
|
45
|
+
* 初始化 - 设置工作区和账本
|
|
46
|
+
* 注意:当前实现为纯同步操作,保留 async 签名以便未来扩展(如远程账本加载)
|
|
47
|
+
*/
|
|
48
|
+
initialize(): void;
|
|
49
|
+
/**
|
|
50
|
+
* 执行计划
|
|
51
|
+
*
|
|
52
|
+
* 主循环:逐个任务执行,每个任务经过 实现→审查→修复 循环
|
|
53
|
+
*/
|
|
54
|
+
executePlan(tasks: PlanTask[], projectContext: string): Promise<SDDResult>;
|
|
55
|
+
/**
|
|
56
|
+
* 执行单个任务
|
|
57
|
+
*/
|
|
58
|
+
private executeTask;
|
|
59
|
+
/**
|
|
60
|
+
* 创建任务简报
|
|
61
|
+
*/
|
|
62
|
+
private createBrief;
|
|
63
|
+
/**
|
|
64
|
+
* 分发实现者子代理
|
|
65
|
+
*
|
|
66
|
+
* 遵循 Superpowers 原则:
|
|
67
|
+
* - 全新上下文,不继承主会话历史
|
|
68
|
+
* - 通过文件传递任务简报和实现报告
|
|
69
|
+
* - 模型选择基于任务复杂度
|
|
70
|
+
*/
|
|
71
|
+
private dispatchImplementer;
|
|
72
|
+
/**
|
|
73
|
+
* 分发审查者子代理
|
|
74
|
+
*
|
|
75
|
+
* 两阶段审查门(来自 Superpowers):
|
|
76
|
+
* 1. 规格合规裁决
|
|
77
|
+
* 2. 代码质量裁决
|
|
78
|
+
*/
|
|
79
|
+
private dispatchReviewer;
|
|
80
|
+
/**
|
|
81
|
+
* 分发重新审查者子代理(范围限定)
|
|
82
|
+
*
|
|
83
|
+
* 仅审查修复 diff,不重新审查整个任务
|
|
84
|
+
*/
|
|
85
|
+
private dispatchReReviewer;
|
|
86
|
+
/**
|
|
87
|
+
* 获取 HEAD commit SHA
|
|
88
|
+
*/
|
|
89
|
+
private getHeadCommit;
|
|
90
|
+
/**
|
|
91
|
+
* 生成审查包文件
|
|
92
|
+
*
|
|
93
|
+
* 使用 git diff 生成 Markdown 格式的审查包,
|
|
94
|
+
* 审查者子代理读取文件而非接收上下文注入的 diff。
|
|
95
|
+
*/
|
|
96
|
+
private generateReviewPackage;
|
|
97
|
+
/**
|
|
98
|
+
* 运行项目测试 — TDD 门控
|
|
99
|
+
*
|
|
100
|
+
* 智能检测并运行项目测试:
|
|
101
|
+
* 1. 优先使用 package.json 中的 test script(支持 npm/yarn/pnpm)
|
|
102
|
+
* 2. 自动检测常见测试框架(vitest, jest, mocha, ava, tape, pytest 等)
|
|
103
|
+
* 3. 如果项目没有测试框架或测试目录,返回 true(不阻塞流程)
|
|
104
|
+
*/
|
|
105
|
+
private runTests;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=controller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../../src/core/sdd-engine/controller.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAUH,OAAO,KAAK,EAAE,SAAS,EAAgD,MAAM,YAAY,CAAC;AAE1F,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,SAAS,CAAU;gBAEf,MAAM,EAAE,SAAS;IAqB7B;;;OAGG;IACH,UAAU,IAAI,IAAI;IAQlB;;;;OAIG;IACG,WAAW,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAwChF;;OAEG;YACW,WAAW;IA4GzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAkBnB;;;;;;;OAOG;YACW,mBAAmB;IAajC;;;;;;OAMG;YACW,gBAAgB;IAW9B;;;;OAIG;YACW,kBAAkB;IAWhC;;OAEG;YACW,aAAa;IAQ3B;;;;;OAKG;YACW,qBAAqB;IAoBnC;;;;;;;OAOG;YACW,QAAQ;CA8EvB"}
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDD 控制器
|
|
3
|
+
*
|
|
4
|
+
* 核心协调器,编排整个子代理驱动开发流程:
|
|
5
|
+
*
|
|
6
|
+
* 1. 设置:工作区、账本、读取计划
|
|
7
|
+
* 2. 对每个任务:
|
|
8
|
+
* a. 提取任务简报
|
|
9
|
+
* b. 分发实现者子代理
|
|
10
|
+
* c. 处理报告
|
|
11
|
+
* d. 生成审查包 → 分发审查子代理
|
|
12
|
+
* e. 修复循环(≤5轮)
|
|
13
|
+
* f. 记录到账本
|
|
14
|
+
* 3. 全分支最终审查
|
|
15
|
+
* 4. 清理工作区
|
|
16
|
+
*
|
|
17
|
+
* 关键原则:
|
|
18
|
+
* - 控制器不自己修复代码(保持上下文干净)
|
|
19
|
+
* - 所有产物通过文件传递(不占用上下文窗口)
|
|
20
|
+
* - 信任账本而非自己的记忆
|
|
21
|
+
*/
|
|
22
|
+
import { Ledger } from './ledger.js';
|
|
23
|
+
import { ReviewLoop } from './review-loop.js';
|
|
24
|
+
import { ModelSelector } from './model-selector.js';
|
|
25
|
+
import { AICaller } from './ai-caller.js';
|
|
26
|
+
import { getHeadCommit, generateReviewPackage, isGitRepo } from './git-ops.js';
|
|
27
|
+
import { execFileSync } from 'child_process';
|
|
28
|
+
import { existsSync, writeFileSync, readFileSync } from 'fs';
|
|
29
|
+
import { join } from 'path';
|
|
30
|
+
export class SDDController {
|
|
31
|
+
config;
|
|
32
|
+
ledger;
|
|
33
|
+
reviewLoop;
|
|
34
|
+
modelSelector;
|
|
35
|
+
aiCaller;
|
|
36
|
+
inGitRepo;
|
|
37
|
+
constructor(config) {
|
|
38
|
+
this.config = config;
|
|
39
|
+
this.ledger = new Ledger(config.workspaceDir, config.planFile, config.maxFixRounds);
|
|
40
|
+
this.reviewLoop = new ReviewLoop(config.maxFixRounds);
|
|
41
|
+
// Build ModelConfig: per-role overrides take precedence over tier defaults
|
|
42
|
+
const tierDefaults = {
|
|
43
|
+
cheap: 'haiku',
|
|
44
|
+
standard: 'sonnet',
|
|
45
|
+
capable: 'opus',
|
|
46
|
+
};
|
|
47
|
+
this.modelSelector = new ModelSelector({
|
|
48
|
+
cheap: config.modelConfig?.cheap || tierDefaults.cheap,
|
|
49
|
+
standard: config.modelConfig?.standard || tierDefaults.standard,
|
|
50
|
+
capable: config.modelConfig?.capable || tierDefaults.capable,
|
|
51
|
+
});
|
|
52
|
+
this.aiCaller = new AICaller(config.workspaceDir);
|
|
53
|
+
this.inGitRepo = isGitRepo();
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 初始化 - 设置工作区和账本
|
|
57
|
+
* 注意:当前实现为纯同步操作,保留 async 签名以便未来扩展(如远程账本加载)
|
|
58
|
+
*/
|
|
59
|
+
initialize() {
|
|
60
|
+
// 尝试加载已有账本(支持断点续跑)
|
|
61
|
+
const canResume = this.ledger.load();
|
|
62
|
+
if (!canResume) {
|
|
63
|
+
this.ledger.initialize();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 执行计划
|
|
68
|
+
*
|
|
69
|
+
* 主循环:逐个任务执行,每个任务经过 实现→审查→修复 循环
|
|
70
|
+
*/
|
|
71
|
+
async executePlan(tasks, projectContext) {
|
|
72
|
+
await this.initialize();
|
|
73
|
+
let completed = 0;
|
|
74
|
+
let blocked = 0;
|
|
75
|
+
let parkedTotal = 0;
|
|
76
|
+
for (const task of tasks) {
|
|
77
|
+
// 跳过已完成的任务(断点续跑)
|
|
78
|
+
if (this.ledger.isTaskComplete(task.number)) {
|
|
79
|
+
completed++;
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const result = await this.executeTask(task, projectContext);
|
|
83
|
+
switch (result.outcome) {
|
|
84
|
+
case 'complete':
|
|
85
|
+
completed++;
|
|
86
|
+
break;
|
|
87
|
+
case 'blocked':
|
|
88
|
+
blocked++;
|
|
89
|
+
this.ledger.recordBlocked(task.number, result.reason || 'Unknown');
|
|
90
|
+
break;
|
|
91
|
+
case 'adjudicated':
|
|
92
|
+
completed++;
|
|
93
|
+
parkedTotal += result.parkedCount || 0;
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return {
|
|
98
|
+
success: blocked === 0,
|
|
99
|
+
completedTasks: completed,
|
|
100
|
+
totalTasks: tasks.length,
|
|
101
|
+
blockedTasks: blocked,
|
|
102
|
+
parkedFindings: parkedTotal,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 执行单个任务
|
|
107
|
+
*/
|
|
108
|
+
async executeTask(task, projectContext) {
|
|
109
|
+
// 1. 构建任务简报
|
|
110
|
+
const brief = this.createBrief(task);
|
|
111
|
+
// 2. 记录 BASE commit
|
|
112
|
+
const baseCommit = await this.getHeadCommit();
|
|
113
|
+
// 3. 选择实现者模型(基于任务复杂度)
|
|
114
|
+
const model = this.modelSelector.selectImplementerModel(task.files.length, !!this.config.specConstraints, false);
|
|
115
|
+
// 4. 调用实现者子代理
|
|
116
|
+
const report = await this.dispatchImplementer(brief, projectContext, model);
|
|
117
|
+
// 5. 处理报告
|
|
118
|
+
if (report.status === 'blocked') {
|
|
119
|
+
return { outcome: 'blocked', reason: report.concerns };
|
|
120
|
+
}
|
|
121
|
+
// 6. 生成审查包并分发审查者
|
|
122
|
+
const headCommit = await this.getHeadCommit();
|
|
123
|
+
await this.generateReviewPackage(baseCommit, headCommit);
|
|
124
|
+
const review = await this.dispatchReviewer(brief, projectContext);
|
|
125
|
+
// 7. TDD 门控:检测测试是否通过
|
|
126
|
+
const testsPassed = await this.runTests();
|
|
127
|
+
// 8. 审查循环
|
|
128
|
+
let currentRound = 0;
|
|
129
|
+
let decision = this.reviewLoop.analyzeReview(review, currentRound, testsPassed);
|
|
130
|
+
while (decision.type === 'fix') {
|
|
131
|
+
currentRound++;
|
|
132
|
+
if (currentRound > this.config.maxFixRounds) {
|
|
133
|
+
// 断路器触发:将 decision 转为 adjudicate,避免 break 后落入 Unknown decision type
|
|
134
|
+
decision = { type: 'adjudicate', findings: decision.findings };
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
// 修复轮次 4-5 升级模型
|
|
138
|
+
const fixModel = currentRound >= 4
|
|
139
|
+
? this.modelSelector.getEscalatedModel(model)
|
|
140
|
+
: model;
|
|
141
|
+
// 分发实现者修复 — 使用独立的 reportPath 避免覆盖原始实现报告
|
|
142
|
+
const fixBrief = {
|
|
143
|
+
...brief,
|
|
144
|
+
reportPath: `${brief.reportPath}.fix-${currentRound}`,
|
|
145
|
+
};
|
|
146
|
+
const fixBase = await this.getHeadCommit();
|
|
147
|
+
await this.dispatchImplementer(fixBrief, projectContext, fixModel);
|
|
148
|
+
const fixHead = await this.getHeadCommit();
|
|
149
|
+
// 记录修复轮次到账本
|
|
150
|
+
const fixRecord = this.reviewLoop.createFixRecord(currentRound, 0, // addressed 由审查结果确定
|
|
151
|
+
decision.findings.length, decision.findings.map(f => f.description), `${fixBase.slice(0, 7)}..${fixHead.slice(0, 7)}`);
|
|
152
|
+
this.ledger.recordFixRound(task.number, fixRecord);
|
|
153
|
+
// 范围限定的重新审查
|
|
154
|
+
await this.generateReviewPackage(fixBase, fixHead);
|
|
155
|
+
const reReview = await this.dispatchReReviewer(fixBrief, decision.findings);
|
|
156
|
+
// 修复轮次也检查测试
|
|
157
|
+
const fixTestsPassed = await this.runTests();
|
|
158
|
+
decision = this.reviewLoop.analyzeReview(reReview, currentRound, fixTestsPassed);
|
|
159
|
+
}
|
|
160
|
+
// 9. 处理最终结果
|
|
161
|
+
if (decision.type === 'pass') {
|
|
162
|
+
const commits = `${baseCommit.slice(0, 7)}..${(await this.getHeadCommit()).slice(0, 7)}`;
|
|
163
|
+
this.ledger.recordComplete(task.number, commits, true);
|
|
164
|
+
return { outcome: 'complete' };
|
|
165
|
+
}
|
|
166
|
+
if (decision.type === 'blocked') {
|
|
167
|
+
return { outcome: 'blocked', reason: decision.reason };
|
|
168
|
+
}
|
|
169
|
+
if (decision.type === 'adjudicate') {
|
|
170
|
+
let parkedCount = 0;
|
|
171
|
+
for (const finding of decision.findings) {
|
|
172
|
+
const ruling = this.reviewLoop.adjudicateFinding(finding, '');
|
|
173
|
+
if (ruling.action === 'park') {
|
|
174
|
+
this.ledger.recordParkedFinding(task.number, finding, ruling.ruling);
|
|
175
|
+
parkedCount++;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
return { outcome: 'blocked', reason: ruling.ruling };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const commits = `${baseCommit.slice(0, 7)}..${(await this.getHeadCommit()).slice(0, 7)}`;
|
|
182
|
+
this.ledger.recordComplete(task.number, commits, false);
|
|
183
|
+
return { outcome: 'adjudicated', parkedCount };
|
|
184
|
+
}
|
|
185
|
+
return { outcome: 'blocked', reason: 'Unknown decision type' };
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* 创建任务简报
|
|
189
|
+
*/
|
|
190
|
+
createBrief(task) {
|
|
191
|
+
const briefPath = `${this.config.workspaceDir}/task-${task.number}-brief.md`;
|
|
192
|
+
const reportPath = `${this.config.workspaceDir}/task-${task.number}-report.md`;
|
|
193
|
+
return {
|
|
194
|
+
taskNumber: task.number,
|
|
195
|
+
title: task.title,
|
|
196
|
+
description: task.description,
|
|
197
|
+
files: task.files,
|
|
198
|
+
briefPath,
|
|
199
|
+
reportPath,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
// ============================================================
|
|
203
|
+
// AI 子代理分发 — 委托给 AICaller
|
|
204
|
+
// ============================================================
|
|
205
|
+
/**
|
|
206
|
+
* 分发实现者子代理
|
|
207
|
+
*
|
|
208
|
+
* 遵循 Superpowers 原则:
|
|
209
|
+
* - 全新上下文,不继承主会话历史
|
|
210
|
+
* - 通过文件传递任务简报和实现报告
|
|
211
|
+
* - 模型选择基于任务复杂度
|
|
212
|
+
*/
|
|
213
|
+
async dispatchImplementer(brief, projectContext, model) {
|
|
214
|
+
return this.aiCaller.dispatchImplementer(brief, projectContext, this.config.specConstraints, model);
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* 分发审查者子代理
|
|
218
|
+
*
|
|
219
|
+
* 两阶段审查门(来自 Superpowers):
|
|
220
|
+
* 1. 规格合规裁决
|
|
221
|
+
* 2. 代码质量裁决
|
|
222
|
+
*/
|
|
223
|
+
async dispatchReviewer(brief, projectContext) {
|
|
224
|
+
return this.aiCaller.dispatchReviewer(brief, projectContext, this.config.specConstraints);
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* 分发重新审查者子代理(范围限定)
|
|
228
|
+
*
|
|
229
|
+
* 仅审查修复 diff,不重新审查整个任务
|
|
230
|
+
*/
|
|
231
|
+
async dispatchReReviewer(brief, openFindings) {
|
|
232
|
+
return this.aiCaller.dispatchReReviewer(brief, openFindings);
|
|
233
|
+
}
|
|
234
|
+
// ============================================================
|
|
235
|
+
// Git 操作 — 委托给 git-ops 模块
|
|
236
|
+
// ============================================================
|
|
237
|
+
/**
|
|
238
|
+
* 获取 HEAD commit SHA
|
|
239
|
+
*/
|
|
240
|
+
async getHeadCommit() {
|
|
241
|
+
if (!this.inGitRepo) {
|
|
242
|
+
// 非 Git 环境返回占位 SHA
|
|
243
|
+
return `nosha-${Date.now().toString(36)}`;
|
|
244
|
+
}
|
|
245
|
+
return getHeadCommit();
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* 生成审查包文件
|
|
249
|
+
*
|
|
250
|
+
* 使用 git diff 生成 Markdown 格式的审查包,
|
|
251
|
+
* 审查者子代理读取文件而非接收上下文注入的 diff。
|
|
252
|
+
*/
|
|
253
|
+
async generateReviewPackage(base, head) {
|
|
254
|
+
if (!this.inGitRepo || base === head || base.startsWith('nosha-')) {
|
|
255
|
+
// 非 Git 环境:创建空审查包文件(确保文件存在供下游读取)
|
|
256
|
+
const emptyPath = `${this.config.workspaceDir}/review-empty-${Date.now().toString(36)}.md`;
|
|
257
|
+
writeFileSync(emptyPath, [
|
|
258
|
+
'# 审查包',
|
|
259
|
+
'',
|
|
260
|
+
'> 非 Git 环境 — 无 diff 可用',
|
|
261
|
+
'',
|
|
262
|
+
'## 审查清单',
|
|
263
|
+
'',
|
|
264
|
+
'- [ ] 手动验证实现是否满足任务简报要求',
|
|
265
|
+
'- [ ] 代码质量检查',
|
|
266
|
+
'- [ ] 测试覆盖检查',
|
|
267
|
+
].join('\n'), 'utf-8');
|
|
268
|
+
return emptyPath;
|
|
269
|
+
}
|
|
270
|
+
return generateReviewPackage(base, head, '', this.config.workspaceDir);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* 运行项目测试 — TDD 门控
|
|
274
|
+
*
|
|
275
|
+
* 智能检测并运行项目测试:
|
|
276
|
+
* 1. 优先使用 package.json 中的 test script(支持 npm/yarn/pnpm)
|
|
277
|
+
* 2. 自动检测常见测试框架(vitest, jest, mocha, ava, tape, pytest 等)
|
|
278
|
+
* 3. 如果项目没有测试框架或测试目录,返回 true(不阻塞流程)
|
|
279
|
+
*/
|
|
280
|
+
async runTests() {
|
|
281
|
+
// 策略 1: 检测 package.json 中的 test script
|
|
282
|
+
const packageJsonPath = join(process.cwd(), 'package.json');
|
|
283
|
+
if (existsSync(packageJsonPath)) {
|
|
284
|
+
try {
|
|
285
|
+
const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8'));
|
|
286
|
+
if (packageJson.scripts?.test) {
|
|
287
|
+
// 检测包管理器
|
|
288
|
+
const hasYarnLock = existsSync(join(process.cwd(), 'yarn.lock'));
|
|
289
|
+
const hasPnpmLock = existsSync(join(process.cwd(), 'pnpm-lock.yaml'));
|
|
290
|
+
let cmd;
|
|
291
|
+
let args;
|
|
292
|
+
if (hasYarnLock) {
|
|
293
|
+
cmd = 'yarn';
|
|
294
|
+
args = ['test', '--silent'];
|
|
295
|
+
}
|
|
296
|
+
else if (hasPnpmLock) {
|
|
297
|
+
cmd = 'pnpm';
|
|
298
|
+
args = ['test', '--silent'];
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
cmd = 'npm';
|
|
302
|
+
args = ['test', '--silent'];
|
|
303
|
+
}
|
|
304
|
+
try {
|
|
305
|
+
execFileSync(cmd, args, {
|
|
306
|
+
encoding: 'utf-8',
|
|
307
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
308
|
+
timeout: 120_000,
|
|
309
|
+
cwd: process.cwd(),
|
|
310
|
+
});
|
|
311
|
+
return true;
|
|
312
|
+
}
|
|
313
|
+
catch {
|
|
314
|
+
// test script 存在但测试失败
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
catch {
|
|
320
|
+
// package.json 解析失败,继续其他策略
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// 策略 2: 自动检测常见测试框架
|
|
324
|
+
const testFrameworks = [
|
|
325
|
+
{ cmd: 'npx', args: ['vitest', 'run', '--reporter=json'] },
|
|
326
|
+
{ cmd: 'npx', args: ['jest', '--json', '--passWithNoTests'] },
|
|
327
|
+
{ cmd: 'npx', args: ['mocha', '--reporter', 'json'] },
|
|
328
|
+
{ cmd: 'npx', args: ['ava', '--tap'] },
|
|
329
|
+
{ cmd: 'npx', args: ['tape', '**/*.test.js'] },
|
|
330
|
+
{ cmd: 'python3', args: ['-m', 'pytest', '-q'] },
|
|
331
|
+
{ cmd: 'python', args: ['-m', 'pytest', '-q'] },
|
|
332
|
+
];
|
|
333
|
+
for (const framework of testFrameworks) {
|
|
334
|
+
try {
|
|
335
|
+
execFileSync(framework.cmd, framework.args, {
|
|
336
|
+
encoding: 'utf-8',
|
|
337
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
338
|
+
timeout: 120_000,
|
|
339
|
+
cwd: process.cwd(),
|
|
340
|
+
});
|
|
341
|
+
return true;
|
|
342
|
+
}
|
|
343
|
+
catch {
|
|
344
|
+
// 该框架不存在或测试失败,继续尝试下一个
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
// 策略 3: 检查是否有测试目录
|
|
348
|
+
const testDirs = ['test', 'tests', '__tests__', 'src/test', 'src/__tests__'];
|
|
349
|
+
const hasTestDir = testDirs.some(d => existsSync(d));
|
|
350
|
+
if (!hasTestDir) {
|
|
351
|
+
return true; // 无测试目录 — TDD 门控不适用
|
|
352
|
+
}
|
|
353
|
+
// 有测试目录但测试失败
|
|
354
|
+
return false;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
//# sourceMappingURL=controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../src/core/sdd-engine/controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 任务分发器
|
|
3
|
+
*
|
|
4
|
+
* 负责将任务分发给子代理实现者
|
|
5
|
+
* 核心原则:
|
|
6
|
+
* - 每个任务分发一个全新的子代理(上下文隔离)
|
|
7
|
+
* - 分发 prompt 只包含当前任务所需的信息
|
|
8
|
+
* - 不传递历史任务的累积摘要
|
|
9
|
+
*
|
|
10
|
+
* @deprecated 此模块为遗留代码,当前未被任何 CLI 命令使用。
|
|
11
|
+
* 功能已由 SDDController 通过 AICaller 实现。
|
|
12
|
+
* 建议在未来版本中移除此文件,或将其集成到 CLI 命令中。
|
|
13
|
+
*/
|
|
14
|
+
import type { TaskBrief, SDDConfig } from './types.js';
|
|
15
|
+
export interface DispatchPrompt {
|
|
16
|
+
taskContext: string;
|
|
17
|
+
briefPath: string;
|
|
18
|
+
reportPath: string;
|
|
19
|
+
interfaces: string;
|
|
20
|
+
resolutions: string;
|
|
21
|
+
specConstraints: string;
|
|
22
|
+
globalConstraints: string;
|
|
23
|
+
}
|
|
24
|
+
export declare class TaskDispatcher {
|
|
25
|
+
private config;
|
|
26
|
+
constructor(config: SDDConfig);
|
|
27
|
+
/**
|
|
28
|
+
* 构建实现者分发 prompt
|
|
29
|
+
*
|
|
30
|
+
* 关键设计:
|
|
31
|
+
* - 简报路径是需求的唯一来源
|
|
32
|
+
* - 不粘贴历史任务摘要
|
|
33
|
+
* - 只传递接口信息和全局约束
|
|
34
|
+
*/
|
|
35
|
+
buildImplementerPrompt(brief: TaskBrief, projectContext: string, priorInterfaces: string, specConstraints: string): DispatchPrompt;
|
|
36
|
+
/**
|
|
37
|
+
* 构建修复轮次的分发 prompt
|
|
38
|
+
*
|
|
39
|
+
* Rounds 1-3: 恢复原始实现者(上下文完整)
|
|
40
|
+
* Rounds 4-5: 分发全新实现者,使用更强模型
|
|
41
|
+
*/
|
|
42
|
+
buildFixPrompt(brief: TaskBrief, reportPath: string, openFindings: string[], round: number, useFreshAgent: boolean): DispatchPrompt;
|
|
43
|
+
/**
|
|
44
|
+
* 判断是否应该使用全新实现者
|
|
45
|
+
* Rounds 1-3: 恢复原始实现者
|
|
46
|
+
* Rounds 4-5: 全新实现者 + 更强模型
|
|
47
|
+
*/
|
|
48
|
+
shouldUseFreshAgent(round: number): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* 获取修复轮次的模型级别
|
|
51
|
+
*
|
|
52
|
+
* @deprecated 此方法引用已废弃的配置字段,不再使用。
|
|
53
|
+
* 模型选择逻辑已移至 ModelSelector 类。
|
|
54
|
+
*/
|
|
55
|
+
getFixRoundModel(round: number): string;
|
|
56
|
+
/**
|
|
57
|
+
* 提取全局约束
|
|
58
|
+
*
|
|
59
|
+
* 从项目根目录的约束文件中读取全局编码规范,
|
|
60
|
+
* 这些约束会注入到每个子代理的 prompt 中。
|
|
61
|
+
*
|
|
62
|
+
* 约束来源优先级:
|
|
63
|
+
* 1. .specpow/config.json 中的 globalConstraints 字段
|
|
64
|
+
* 2. CLAUDE.md / AGENTS.md / GEMINI.md 中的编码规范
|
|
65
|
+
* 3. 默认约束
|
|
66
|
+
*/
|
|
67
|
+
private extractGlobalConstraints;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatcher.d.ts","sourceRoot":"","sources":["../../../src/core/sdd-engine/dispatcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvD,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAY;gBAEd,MAAM,EAAE,SAAS;IAI7B;;;;;;;OAOG;IACH,sBAAsB,CACpB,KAAK,EAAE,SAAS,EAChB,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,EACvB,eAAe,EAAE,MAAM,GACtB,cAAc;IAYjB;;;;;OAKG;IACH,cAAc,CACZ,KAAK,EAAE,SAAS,EAChB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,OAAO,GACrB,cAAc;IAgBjB;;;;OAIG;IACH,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;;OAKG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAQvC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,wBAAwB;CAsEjC"}
|