soloforge 1.4.10 → 1.4.12
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/dist/adapters/claude_code/tools.d.ts +3 -0
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +119 -182
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/engine/brainstorm_contract.d.ts +2 -0
- package/dist/engine/brainstorm_contract.d.ts.map +1 -1
- package/dist/engine/brainstorm_contract.js +11 -1
- package/dist/engine/brainstorm_contract.js.map +1 -1
- package/dist/engine/expand_pipeline.d.ts +121 -0
- package/dist/engine/expand_pipeline.d.ts.map +1 -0
- package/dist/engine/expand_pipeline.js +141 -0
- package/dist/engine/expand_pipeline.js.map +1 -0
- package/dist/engine/first_principles.d.ts +2 -0
- package/dist/engine/first_principles.d.ts.map +1 -1
- package/dist/engine/first_principles.js +14 -1
- package/dist/engine/first_principles.js.map +1 -1
- package/dist/engine/intent_expander.d.ts +3 -0
- package/dist/engine/intent_expander.d.ts.map +1 -1
- package/dist/engine/intent_expander.js +252 -306
- package/dist/engine/intent_expander.js.map +1 -1
- package/dist/engine/intent_route_scorer.d.ts +1 -1
- package/dist/engine/intent_route_scorer.d.ts.map +1 -1
- package/dist/engine/intent_route_scorer.js +18 -3
- package/dist/engine/intent_route_scorer.js.map +1 -1
- package/dist/engine/intent_router.d.ts +2 -2
- package/dist/engine/intent_router.d.ts.map +1 -1
- package/dist/engine/intent_router.js +28 -6
- package/dist/engine/intent_router.js.map +1 -1
- package/dist/engine/intent_signal_extractor.d.ts +1 -1
- package/dist/engine/intent_signal_extractor.d.ts.map +1 -1
- package/dist/engine/intent_signal_extractor.js +12 -0
- package/dist/engine/intent_signal_extractor.js.map +1 -1
- package/dist/engine/release_readiness_gate.d.ts.map +1 -1
- package/dist/engine/release_readiness_gate.js +38 -37
- package/dist/engine/release_readiness_gate.js.map +1 -1
- package/dist/engine/source_code_matcher.d.ts +53 -0
- package/dist/engine/source_code_matcher.d.ts.map +1 -0
- package/dist/engine/source_code_matcher.js +165 -0
- package/dist/engine/source_code_matcher.js.map +1 -0
- package/dist/engine/task_context.d.ts +5 -0
- package/dist/engine/task_context.d.ts.map +1 -1
- package/dist/engine/task_context.js +37 -5
- package/dist/engine/task_context.js.map +1 -1
- package/dist/engine/technology_decision.d.ts +2 -0
- package/dist/engine/technology_decision.d.ts.map +1 -1
- package/dist/engine/technology_decision.js +18 -1
- package/dist/engine/technology_decision.js.map +1 -1
- package/dist/engine/traceability.d.ts.map +1 -1
- package/dist/engine/traceability.js +4 -0
- package/dist/engine/traceability.js.map +1 -1
- package/dist/engine/workflow_contract_registry.d.ts.map +1 -1
- package/dist/engine/workflow_contract_registry.js +24 -0
- package/dist/engine/workflow_contract_registry.js.map +1 -1
- package/dist/knowledge/index_manager.d.ts +1 -0
- package/dist/knowledge/index_manager.d.ts.map +1 -1
- package/dist/knowledge/index_manager.js +15 -0
- package/dist/knowledge/index_manager.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -172,6 +172,7 @@ export declare function checkDecisionSovereigntyGate(params: {
|
|
|
172
172
|
reason_zh?: string;
|
|
173
173
|
requires_human_gate?: boolean;
|
|
174
174
|
not_applicable_with_reason?: string;
|
|
175
|
+
expected_schema?: Record<string, unknown>;
|
|
175
176
|
}>;
|
|
176
177
|
/**
|
|
177
178
|
* 细节纪律门 — 复杂任务缺关键细节维度时阻断。
|
|
@@ -200,6 +201,7 @@ export declare function checkFirstPrinciplesGate(params: {
|
|
|
200
201
|
reason_zh?: string;
|
|
201
202
|
failures?: string[];
|
|
202
203
|
not_applicable_with_reason?: string;
|
|
204
|
+
expected_schema?: Record<string, unknown>;
|
|
203
205
|
}>;
|
|
204
206
|
/**
|
|
205
207
|
* 脑暴/方案探索门 — 不确定项需多方案+推荐理由+用户确认。
|
|
@@ -214,6 +216,7 @@ export declare function checkBrainstormGate(params: {
|
|
|
214
216
|
reason_zh?: string;
|
|
215
217
|
violations?: string[];
|
|
216
218
|
not_applicable_with_reason?: string;
|
|
219
|
+
expected_schema?: Record<string, unknown>;
|
|
217
220
|
}>;
|
|
218
221
|
/**
|
|
219
222
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/tools.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAkB,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAE9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAG9D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGvE,OAAO,EAOL,KAAK,UAAU,EAKhB,MAAM,mDAAmD,CAAC;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -125,21 +125,38 @@ function decodeIndexedJsonString(value) {
|
|
|
125
125
|
function parseContractObject(value, fieldName) {
|
|
126
126
|
if (value === undefined || value === null)
|
|
127
127
|
return {};
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
128
|
+
// 字符串 → 尝试 JSON 解析(可能被 MCP 客户端序列化为 JSON 字符串)
|
|
129
|
+
let parsed;
|
|
130
|
+
if (typeof value === "string") {
|
|
131
|
+
try {
|
|
132
|
+
parsed = JSON.parse(value);
|
|
133
|
+
}
|
|
134
|
+
catch (parseErr) {
|
|
135
|
+
return { error: `${fieldName} 的 JSON 解析失败: ${parseErr.message}。请检查 JSON 格式是否正确` };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
parsed = value;
|
|
140
|
+
}
|
|
141
|
+
const candidate = decodeIndexedJsonString(parsed);
|
|
138
142
|
if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) {
|
|
139
|
-
return { error: `${fieldName}
|
|
143
|
+
return { error: `${fieldName} 必须是 JSON 对象(当前类型: ${Array.isArray(candidate) ? "array" : typeof candidate})。期望格式请参考 expected_schema` };
|
|
140
144
|
}
|
|
141
145
|
return { value: candidate };
|
|
142
146
|
}
|
|
147
|
+
/** 需要通过 parseContractObject 校验的契约字段列表 */
|
|
148
|
+
const CONTRACT_OBJECT_FIELDS = [
|
|
149
|
+
"architecture_decision_workshop", "decision_workshop",
|
|
150
|
+
"technology_decision_contract", "technology_decision_record",
|
|
151
|
+
"detail_discipline_contract", "provided_details",
|
|
152
|
+
"first_principles_frame", "brainstorm_session",
|
|
153
|
+
"design_artifact_pack", "ood_solid_summary",
|
|
154
|
+
"backend_implementation_work_package", "code_observability_work_package",
|
|
155
|
+
];
|
|
156
|
+
/** 需要规范化的字段 */
|
|
157
|
+
const NORMALIZED_FIELDS = {
|
|
158
|
+
decision_workshop: "decision_workshop",
|
|
159
|
+
};
|
|
143
160
|
// ── Zod Schema 定义 ──
|
|
144
161
|
const ClassifySchema = {
|
|
145
162
|
intent: z.string().describe("开发者意图描述"),
|
|
@@ -149,18 +166,18 @@ const ExpandSchema = {
|
|
|
149
166
|
task_id: z.string().describe("sf_classify 返回的任务 ID"),
|
|
150
167
|
clarification_answers: z.array(z.string()).optional().describe("对澄清问题的回答"),
|
|
151
168
|
input_material_confirmations: z.array(z.string()).optional().describe("已确认安全的输入材料路径列表"),
|
|
152
|
-
architecture_decision_workshop: z.unknown().optional().describe("
|
|
153
|
-
decision_workshop: z.unknown().optional().describe("
|
|
154
|
-
technology_decision_contract: z.unknown().optional().describe("
|
|
155
|
-
technology_decision_record: z.unknown().optional().describe("
|
|
156
|
-
detail_discipline_contract: z.unknown().optional().describe("
|
|
157
|
-
provided_details: z.unknown().optional().describe("
|
|
158
|
-
first_principles_frame: z.unknown().optional().describe("
|
|
159
|
-
brainstorm_session: z.unknown().optional().describe("
|
|
160
|
-
design_artifact_pack: z.unknown().optional().describe("
|
|
161
|
-
ood_solid_summary: z.unknown().optional().describe("
|
|
162
|
-
backend_implementation_work_package: z.unknown().optional().describe("
|
|
163
|
-
code_observability_work_package: z.unknown().optional().describe("
|
|
169
|
+
architecture_decision_workshop: z.record(z.unknown()).optional().describe("架构设计前六域决策记录。示例 {domains:[{domain:'backend',options:[{id:'opt-a',title:'...'}],recommended_option_id:'opt-a',user_confirmation_ref:'confirm:...'}],status:'confirmed'}"),
|
|
170
|
+
decision_workshop: z.record(z.unknown()).optional().describe("通用决策研讨合同。示例 {activated_packs:['delivery_validation'],domains:[{domain:'delivery_validation',options:[{id:'opt-a',title:'...'}],recommended_option_id:'opt-a',user_confirmation_ref:'confirm:...'}],status:'confirmed'}"),
|
|
171
|
+
technology_decision_contract: z.record(z.unknown()).optional().describe("技术决策主权契约。示例 {decision_id:'TECH-001',decision_scope:'architecture',options:[{option_id:'opt-a',title:'A',description:'...'}],recommended_option:'opt-a',rejected_options:[{option:'opt-b',reason:'...'}],evidence:[{claim:'...',supporting_facts:['...']}],falsification:['...'],failure_conditions:['...'],validation_plan:['...'],rollback_or_exit_plan:['...'],human_gate_required:true,human_gate_evidence:'confirm:...',executable_without_human:false}"),
|
|
172
|
+
technology_decision_record: z.record(z.unknown()).optional().describe("技术决策执行记录。示例 {decision_id:'TECH-001',selected_option:'opt-a',status:'approved',approved_by:'user',evidence_refs:['confirm:...']}"),
|
|
173
|
+
detail_discipline_contract: z.record(z.unknown()).optional().describe("细节纪律契约。示例 {contract_id:'detail-001',required_dimensions:['boundary','failure_path','rollback'],blocking_dimensions:['boundary'],status:'ready'}"),
|
|
174
|
+
provided_details: z.record(z.unknown()).optional().describe("细节纪律已提供证据。示例 {boundary:['只检查 readiness,不改代码'],failure_path:['unknown 时标记证据不足'],rollback:['无写入,无需回滚']}"),
|
|
175
|
+
first_principles_frame: z.record(z.unknown()).optional().describe("高影响任务第一性原理框架。示例 {fundamental_need:'...',known_facts:['...'],assumptions:['...'],candidate_solutions:[{solution_id:'s1',description:'...',complexity:'low'}],simplest_viable_solution:'s1',chosen_solution:'s1',falsification_questions:['...'],why_not_legacy_path:'...'}"),
|
|
176
|
+
brainstorm_session: z.record(z.unknown()).optional().describe("不确定项/方案选择会话。示例 {trigger:'uncertainty',options:[{option_id:'opt-a',title:'...',description:'...',pros:['...'],cons:['...']}],recommended_option_id:'opt-a',rejected_option_ids:['opt-b'],failure_conditions:['...'],brainstorm_status:'options_ready'}"),
|
|
177
|
+
design_artifact_pack: z.record(z.unknown()).optional().describe("设计产物包路径映射或复验状态。示例 {status:'implementation_ready',paths:{architecture_document:'docs/architecture/01-架构设计文档.md'},verification_refs:['verification:...']}"),
|
|
178
|
+
ood_solid_summary: z.record(z.unknown()).optional().describe("复杂编码任务 OOD/SOLID 摘要。示例 {status:'confirmed',responsibilities:['...'],interfaces:['...'],risks:['...'],evidence_refs:['...']}"),
|
|
179
|
+
backend_implementation_work_package: z.record(z.unknown()).optional().describe("后端接口实现工程工作包。示例 {status:'confirmed',api_boundary:['...'],transaction_boundary:['...'],error_contract:['...'],evidence_refs:['...']}"),
|
|
180
|
+
code_observability_work_package: z.record(z.unknown()).optional().describe("代码可维护性与可观测性工作包。示例 {status:'confirmed',logging_plan:['...'],comment_plan:['...'],sensitive_logging_policy:'redact',evidence_refs:['...']}"),
|
|
164
181
|
};
|
|
165
182
|
const VerifySchema = {
|
|
166
183
|
task_id: z.string().describe("任务 ID"),
|
|
@@ -178,7 +195,7 @@ const LearnSchema = {
|
|
|
178
195
|
};
|
|
179
196
|
const StatusSchema = {
|
|
180
197
|
task_id: z.string().optional().describe("任务 ID(不传则查当前任务)"),
|
|
181
|
-
action: z.enum(["current", "recent", "resume", "cancel", "archive_stale"]).optional().describe("操作类型"),
|
|
198
|
+
action: z.enum(["current", "recent", "resume", "cancel", "archive_stale", "retry_expand"]).optional().describe("操作类型"),
|
|
182
199
|
confirm: z.boolean().optional().describe("确认执行会写入状态的操作,例如 cancel/archive_stale/job_cancel"),
|
|
183
200
|
authorized: z.boolean().optional().describe("confirm 的兼容别名"),
|
|
184
201
|
job_id: z.string().optional().describe("Job ID(用于 job_status / job_resume / job_cancel)"),
|
|
@@ -607,7 +624,7 @@ export async function checkDecisionSovereigntyGate(params) {
|
|
|
607
624
|
const decisionModule = await lazyTechnologyDecision();
|
|
608
625
|
const validation = decisionModule.validateTechnologyDecision(decisionContract);
|
|
609
626
|
if (!validation.valid) {
|
|
610
|
-
return { allowed: false, reason_zh: `技术选型决策校验失败: ${validation.violations.join("; ")}
|
|
627
|
+
return { allowed: false, reason_zh: `技术选型决策校验失败: ${validation.violations.join("; ")}`, expected_schema: validation.expected_schema };
|
|
611
628
|
}
|
|
612
629
|
// 有决策记录时评估执行状态
|
|
613
630
|
const decisionRecord = params.ctx.technology_decision_record;
|
|
@@ -672,7 +689,7 @@ export async function checkFirstPrinciplesGate(params) {
|
|
|
672
689
|
const fpModule = await lazyFirstPrinciples();
|
|
673
690
|
const validation = fpModule.validateFirstPrinciplesForHighImpact(fpFrame);
|
|
674
691
|
if (!validation.passed) {
|
|
675
|
-
return { allowed: false, reason_zh: `高影响任务缺第一性原理推理: ${validation.violations.join("; ")}`, failures: validation.violations };
|
|
692
|
+
return { allowed: false, reason_zh: `高影响任务缺第一性原理推理: ${validation.violations.join("; ")}`, failures: validation.violations, expected_schema: validation.expected_schema };
|
|
676
693
|
}
|
|
677
694
|
return { allowed: true };
|
|
678
695
|
}
|
|
@@ -695,7 +712,7 @@ export async function checkBrainstormGate(params) {
|
|
|
695
712
|
const brainstormModule = await lazyBrainstormContract();
|
|
696
713
|
const validation = brainstormModule.validateBrainstormSession(brainstormSession);
|
|
697
714
|
if (!validation.valid) {
|
|
698
|
-
return { allowed: false, reason_zh: `方案探索不完整: ${validation.violations.join("; ")}`, violations: validation.violations };
|
|
715
|
+
return { allowed: false, reason_zh: `方案探索不完整: ${validation.violations.join("; ")}`, violations: validation.violations, expected_schema: validation.expected_schema };
|
|
699
716
|
}
|
|
700
717
|
// 脑暴推荐永远不能自动执行 — 需 Decision Sovereignty human gate
|
|
701
718
|
const canAutoExec = brainstormModule.canBrainstormAutoExecute(brainstormSession);
|
|
@@ -1329,7 +1346,7 @@ export async function registerTools(server, deps) {
|
|
|
1329
1346
|
}
|
|
1330
1347
|
catch (err) {
|
|
1331
1348
|
const errorNextTools = name === "sf_expand"
|
|
1332
|
-
? ["sf_status", "sf_debug", "sf_governance_report"]
|
|
1349
|
+
? ["sf_expand", "sf_status", "sf_debug", "sf_governance_report"]
|
|
1333
1350
|
: contract.default_next_tools;
|
|
1334
1351
|
const errorForbiddenTools = name === "sf_expand"
|
|
1335
1352
|
? ["sf_verify", "sf_review", "sf_deliver", "sf_scaffold"]
|
|
@@ -1484,161 +1501,27 @@ export async function registerTools(server, deps) {
|
|
|
1484
1501
|
if (!ctx || !ctx.classification) {
|
|
1485
1502
|
return { result: { error: "任务不存在或尚未分类,请先调用 sf_classify" } };
|
|
1486
1503
|
}
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
const existingTechnologyDecisionContract = parseContractObject(ctx.technology_decision_contract, "technology_decision_contract");
|
|
1496
|
-
if (existingTechnologyDecisionContract.error) {
|
|
1497
|
-
return { result: { error: existingTechnologyDecisionContract.error, status: "invalid_input" } };
|
|
1498
|
-
}
|
|
1499
|
-
const existingTechnologyDecisionRecord = parseContractObject(ctx.technology_decision_record, "technology_decision_record");
|
|
1500
|
-
if (existingTechnologyDecisionRecord.error) {
|
|
1501
|
-
return { result: { error: existingTechnologyDecisionRecord.error, status: "invalid_input" } };
|
|
1502
|
-
}
|
|
1503
|
-
const existingDetailContract = parseContractObject(ctx.detail_discipline_contract, "detail_discipline_contract");
|
|
1504
|
-
if (existingDetailContract.error) {
|
|
1505
|
-
return { result: { error: existingDetailContract.error, status: "invalid_input" } };
|
|
1506
|
-
}
|
|
1507
|
-
const existingProvidedDetails = parseContractObject(ctx.provided_details, "provided_details");
|
|
1508
|
-
if (existingProvidedDetails.error) {
|
|
1509
|
-
return { result: { error: existingProvidedDetails.error, status: "invalid_input" } };
|
|
1510
|
-
}
|
|
1511
|
-
const existingFirstPrinciplesFrame = parseContractObject(ctx.first_principles_frame, "first_principles_frame");
|
|
1512
|
-
if (existingFirstPrinciplesFrame.error) {
|
|
1513
|
-
return { result: { error: existingFirstPrinciplesFrame.error, status: "invalid_input" } };
|
|
1514
|
-
}
|
|
1515
|
-
const existingBrainstormSession = parseContractObject(ctx.brainstorm_session, "brainstorm_session");
|
|
1516
|
-
if (existingBrainstormSession.error) {
|
|
1517
|
-
return { result: { error: existingBrainstormSession.error, status: "invalid_input" } };
|
|
1518
|
-
}
|
|
1519
|
-
const existingDesignArtifactPack = parseContractObject(ctx.design_artifact_pack, "design_artifact_pack");
|
|
1520
|
-
if (existingDesignArtifactPack.error) {
|
|
1521
|
-
return { result: { error: existingDesignArtifactPack.error, status: "invalid_input" } };
|
|
1522
|
-
}
|
|
1523
|
-
const existingOodSolidSummary = parseContractObject(ctx.ood_solid_summary, "ood_solid_summary");
|
|
1524
|
-
if (existingOodSolidSummary.error) {
|
|
1525
|
-
return { result: { error: existingOodSolidSummary.error, status: "invalid_input" } };
|
|
1526
|
-
}
|
|
1527
|
-
const existingBackendImplementationWorkPackage = parseContractObject(ctx.backend_implementation_work_package, "backend_implementation_work_package");
|
|
1528
|
-
if (existingBackendImplementationWorkPackage.error) {
|
|
1529
|
-
return { result: { error: existingBackendImplementationWorkPackage.error, status: "invalid_input" } };
|
|
1530
|
-
}
|
|
1531
|
-
const existingCodeObservabilityWorkPackage = parseContractObject(ctx.code_observability_work_package, "code_observability_work_package");
|
|
1532
|
-
if (existingCodeObservabilityWorkPackage.error) {
|
|
1533
|
-
return { result: { error: existingCodeObservabilityWorkPackage.error, status: "invalid_input" } };
|
|
1534
|
-
}
|
|
1535
|
-
if (existingArchitectureWorkshop.value)
|
|
1536
|
-
ctx.architecture_decision_workshop = existingArchitectureWorkshop.value;
|
|
1537
|
-
if (existingDecisionWorkshop.value) {
|
|
1538
|
-
ctx.decision_workshop = (await lazyDecisionWorkshop()).normalizeDecisionWorkshopContract(existingDecisionWorkshop.value, args.task_id) ?? existingDecisionWorkshop.value;
|
|
1539
|
-
}
|
|
1540
|
-
if (existingTechnologyDecisionContract.value)
|
|
1541
|
-
ctx.technology_decision_contract = existingTechnologyDecisionContract.value;
|
|
1542
|
-
if (existingTechnologyDecisionRecord.value)
|
|
1543
|
-
ctx.technology_decision_record = existingTechnologyDecisionRecord.value;
|
|
1544
|
-
if (existingDetailContract.value)
|
|
1545
|
-
ctx.detail_discipline_contract = existingDetailContract.value;
|
|
1546
|
-
if (existingProvidedDetails.value)
|
|
1547
|
-
ctx.provided_details = existingProvidedDetails.value;
|
|
1548
|
-
if (existingFirstPrinciplesFrame.value)
|
|
1549
|
-
ctx.first_principles_frame = existingFirstPrinciplesFrame.value;
|
|
1550
|
-
if (existingBrainstormSession.value)
|
|
1551
|
-
ctx.brainstorm_session = existingBrainstormSession.value;
|
|
1552
|
-
if (existingDesignArtifactPack.value)
|
|
1553
|
-
ctx.design_artifact_pack = existingDesignArtifactPack.value;
|
|
1554
|
-
if (existingOodSolidSummary.value)
|
|
1555
|
-
ctx.ood_solid_summary = existingOodSolidSummary.value;
|
|
1556
|
-
if (existingBackendImplementationWorkPackage.value)
|
|
1557
|
-
ctx.backend_implementation_work_package = existingBackendImplementationWorkPackage.value;
|
|
1558
|
-
if (existingCodeObservabilityWorkPackage.value)
|
|
1559
|
-
ctx.code_observability_work_package = existingCodeObservabilityWorkPackage.value;
|
|
1560
|
-
if (args.architecture_decision_workshop) {
|
|
1561
|
-
const parsed = parseContractObject(args.architecture_decision_workshop, "architecture_decision_workshop");
|
|
1562
|
-
if (parsed.error)
|
|
1563
|
-
return { result: { error: parsed.error, status: "invalid_input" } };
|
|
1564
|
-
ctx.architecture_decision_workshop = parsed.value;
|
|
1565
|
-
}
|
|
1566
|
-
if (args.decision_workshop) {
|
|
1567
|
-
const parsed = parseContractObject(args.decision_workshop, "decision_workshop");
|
|
1568
|
-
if (parsed.error)
|
|
1569
|
-
return { result: { error: parsed.error, status: "invalid_input" } };
|
|
1570
|
-
ctx.decision_workshop = (await lazyDecisionWorkshop()).normalizeDecisionWorkshopContract(parsed.value, args.task_id) ?? parsed.value;
|
|
1571
|
-
}
|
|
1572
|
-
if (args.technology_decision_contract) {
|
|
1573
|
-
const parsed = parseContractObject(args.technology_decision_contract, "technology_decision_contract");
|
|
1574
|
-
if (parsed.error)
|
|
1575
|
-
return { result: { error: parsed.error, status: "invalid_input" } };
|
|
1576
|
-
ctx.technology_decision_contract = parsed.value;
|
|
1577
|
-
}
|
|
1578
|
-
if (args.technology_decision_record) {
|
|
1579
|
-
const parsed = parseContractObject(args.technology_decision_record, "technology_decision_record");
|
|
1580
|
-
if (parsed.error)
|
|
1581
|
-
return { result: { error: parsed.error, status: "invalid_input" } };
|
|
1582
|
-
ctx.technology_decision_record = parsed.value;
|
|
1583
|
-
}
|
|
1584
|
-
if (args.detail_discipline_contract) {
|
|
1585
|
-
const parsed = parseContractObject(args.detail_discipline_contract, "detail_discipline_contract");
|
|
1586
|
-
if (parsed.error)
|
|
1587
|
-
return { result: { error: parsed.error, status: "invalid_input" } };
|
|
1588
|
-
ctx.detail_discipline_contract = parsed.value;
|
|
1589
|
-
}
|
|
1590
|
-
if (args.provided_details) {
|
|
1591
|
-
const parsed = parseContractObject(args.provided_details, "provided_details");
|
|
1592
|
-
if (parsed.error)
|
|
1593
|
-
return { result: { error: parsed.error, status: "invalid_input" } };
|
|
1594
|
-
ctx.provided_details = parsed.value;
|
|
1595
|
-
}
|
|
1596
|
-
if (args.first_principles_frame) {
|
|
1597
|
-
const parsed = parseContractObject(args.first_principles_frame, "first_principles_frame");
|
|
1598
|
-
if (parsed.error)
|
|
1599
|
-
return { result: { error: parsed.error, status: "invalid_input" } };
|
|
1600
|
-
ctx.first_principles_frame = parsed.value;
|
|
1601
|
-
}
|
|
1602
|
-
if (args.brainstorm_session) {
|
|
1603
|
-
const parsed = parseContractObject(args.brainstorm_session, "brainstorm_session");
|
|
1604
|
-
if (parsed.error)
|
|
1605
|
-
return { result: { error: parsed.error, status: "invalid_input" } };
|
|
1606
|
-
ctx.brainstorm_session = parsed.value;
|
|
1607
|
-
}
|
|
1608
|
-
if (args.design_artifact_pack) {
|
|
1609
|
-
const parsed = parseContractObject(args.design_artifact_pack, "design_artifact_pack");
|
|
1610
|
-
if (parsed.error)
|
|
1611
|
-
return { result: { error: parsed.error, status: "invalid_input" } };
|
|
1612
|
-
ctx.design_artifact_pack = parsed.value;
|
|
1613
|
-
}
|
|
1614
|
-
if (args.ood_solid_summary) {
|
|
1615
|
-
const parsed = parseContractObject(args.ood_solid_summary, "ood_solid_summary");
|
|
1616
|
-
if (parsed.error)
|
|
1617
|
-
return { result: { error: parsed.error, status: "invalid_input" } };
|
|
1618
|
-
ctx.ood_solid_summary = parsed.value;
|
|
1619
|
-
}
|
|
1620
|
-
if (args.backend_implementation_work_package) {
|
|
1621
|
-
const parsed = parseContractObject(args.backend_implementation_work_package, "backend_implementation_work_package");
|
|
1504
|
+
// 合并校验 + 应用:ctx 已存储值 → args 覆盖值,统一解析和规范化
|
|
1505
|
+
let needsSave = false;
|
|
1506
|
+
for (const field of CONTRACT_OBJECT_FIELDS) {
|
|
1507
|
+
// args 优先,其次 ctx 已存储值
|
|
1508
|
+
const raw = args[field] ?? ctx[field];
|
|
1509
|
+
if (!raw)
|
|
1510
|
+
continue;
|
|
1511
|
+
const parsed = parseContractObject(raw, field);
|
|
1622
1512
|
if (parsed.error)
|
|
1623
1513
|
return { result: { error: parsed.error, status: "invalid_input" } };
|
|
1624
|
-
|
|
1514
|
+
if (parsed.value) {
|
|
1515
|
+
ctx[field] = field === "decision_workshop"
|
|
1516
|
+
? ((await lazyDecisionWorkshop()).normalizeDecisionWorkshopContract(parsed.value, args.task_id) ?? parsed.value)
|
|
1517
|
+
: parsed.value;
|
|
1518
|
+
needsSave = true;
|
|
1519
|
+
}
|
|
1625
1520
|
}
|
|
1626
|
-
if (
|
|
1627
|
-
const parsed = parseContractObject(args.code_observability_work_package, "code_observability_work_package");
|
|
1628
|
-
if (parsed.error)
|
|
1629
|
-
return { result: { error: parsed.error, status: "invalid_input" } };
|
|
1630
|
-
ctx.code_observability_work_package = parsed.value;
|
|
1631
|
-
}
|
|
1632
|
-
if (args.architecture_decision_workshop || args.decision_workshop
|
|
1633
|
-
|| args.technology_decision_contract || args.technology_decision_record
|
|
1634
|
-
|| args.detail_discipline_contract || args.provided_details
|
|
1635
|
-
|| args.first_principles_frame || args.brainstorm_session
|
|
1636
|
-
|| args.design_artifact_pack
|
|
1637
|
-
|| args.ood_solid_summary || args.backend_implementation_work_package || args.code_observability_work_package) {
|
|
1521
|
+
if (needsSave)
|
|
1638
1522
|
await taskContext.save(ctx);
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
if (ctx.status === "classifying" || ctx.status === "clarifying") {
|
|
1523
|
+
// 状态守卫:classifying/expanding/clarifying/failed → expanding
|
|
1524
|
+
if (ctx.status === "classifying" || ctx.status === "clarifying" || ctx.status === "failed") {
|
|
1642
1525
|
await taskContext.updateStatus(args.task_id, "expanding");
|
|
1643
1526
|
ctx.status = "expanding";
|
|
1644
1527
|
}
|
|
@@ -1699,6 +1582,7 @@ export async function registerTools(server, deps) {
|
|
|
1699
1582
|
plan_context: planContext,
|
|
1700
1583
|
input_material_confirmations: args.input_material_confirmations,
|
|
1701
1584
|
task_id: args.task_id,
|
|
1585
|
+
brainstorm_session: ctx.brainstorm_session ?? undefined,
|
|
1702
1586
|
});
|
|
1703
1587
|
}
|
|
1704
1588
|
catch (expandErr) {
|
|
@@ -1960,7 +1844,8 @@ export async function registerTools(server, deps) {
|
|
|
1960
1844
|
result: {
|
|
1961
1845
|
error: decisionGate.reason_zh,
|
|
1962
1846
|
status: "blocked",
|
|
1963
|
-
|
|
1847
|
+
expected_schema: decisionGate.expected_schema,
|
|
1848
|
+
recovery: decisionGate.requires_human_gate ? "请提供技术决策确认证据(human_gate_evidence)" : "技术选型决策校验失败,请按照 expected_schema 格式提供 technology_decision_contract",
|
|
1964
1849
|
},
|
|
1965
1850
|
};
|
|
1966
1851
|
}
|
|
@@ -1987,8 +1872,9 @@ export async function registerTools(server, deps) {
|
|
|
1987
1872
|
result: {
|
|
1988
1873
|
error: fpGate.reason_zh,
|
|
1989
1874
|
failures: fpGate.failures,
|
|
1875
|
+
expected_schema: fpGate.expected_schema,
|
|
1990
1876
|
status: "blocked",
|
|
1991
|
-
recovery: "高影响任务缺 first_principles_frame
|
|
1877
|
+
recovery: "高影响任务缺 first_principles_frame,请按照 expected_schema 格式提供后重新 sf_expand",
|
|
1992
1878
|
},
|
|
1993
1879
|
};
|
|
1994
1880
|
}
|
|
@@ -2001,8 +1887,9 @@ export async function registerTools(server, deps) {
|
|
|
2001
1887
|
result: {
|
|
2002
1888
|
error: brainstormGate.reason_zh,
|
|
2003
1889
|
violations: brainstormGate.violations,
|
|
1890
|
+
expected_schema: brainstormGate.expected_schema,
|
|
2004
1891
|
status: "blocked",
|
|
2005
|
-
recovery: "不确定项/方案选择缺 brainstorm_session
|
|
1892
|
+
recovery: "不确定项/方案选择缺 brainstorm_session,请按照 expected_schema 格式提供后重新 sf_expand",
|
|
2006
1893
|
},
|
|
2007
1894
|
};
|
|
2008
1895
|
}
|
|
@@ -2318,6 +2205,40 @@ export async function registerTools(server, deps) {
|
|
|
2318
2205
|
if (!decisionContract.passed) {
|
|
2319
2206
|
advisories.decision_contract_advisory = decisionContract.advisory;
|
|
2320
2207
|
}
|
|
2208
|
+
// 设置 plan_proposal_gate — sf_expand 成功后必须设置,否则 sf_verify 等写工具会被阻断
|
|
2209
|
+
{
|
|
2210
|
+
const { evaluatePlanProposalGate, inferPlanGateTaskType } = await import("../../engine/plan_proposal_gate.js");
|
|
2211
|
+
const routeForGate = expansion.workflow_trace?.route ?? expansionRoute ?? "code_change";
|
|
2212
|
+
const taskTypeForGate = inferPlanGateTaskType(ctx.intent);
|
|
2213
|
+
// 轻量路径(acceptance/review/read_only)自动通过
|
|
2214
|
+
const isLightweight = routeForGate === "acceptance" || routeForGate === "review"
|
|
2215
|
+
|| routeForGate === "direct_answer" || routeForGate === "analysis";
|
|
2216
|
+
if (isLightweight) {
|
|
2217
|
+
await taskContext.setPlanProposalGate(args.task_id, {
|
|
2218
|
+
passed: true,
|
|
2219
|
+
plan_gate_status: "passed",
|
|
2220
|
+
required_level: "brief_plan",
|
|
2221
|
+
reason_zh: "轻量路径自动通过",
|
|
2222
|
+
violations: [],
|
|
2223
|
+
evidence_refs: [],
|
|
2224
|
+
blocked_actions: [],
|
|
2225
|
+
});
|
|
2226
|
+
}
|
|
2227
|
+
else {
|
|
2228
|
+
const gateResult = evaluatePlanProposalGate({
|
|
2229
|
+
task_id: args.task_id,
|
|
2230
|
+
task_type: taskTypeForGate,
|
|
2231
|
+
user_intent: ctx.intent,
|
|
2232
|
+
plan_level: "execution_plan",
|
|
2233
|
+
plan_summary_zh: ctx.intent.slice(0, 200),
|
|
2234
|
+
proposed_steps: [expansionRoute ?? "execute"],
|
|
2235
|
+
verification_plan: (expansion.acceptance?.automated ?? []).map((a) => a.description ?? String(a)),
|
|
2236
|
+
risks: [],
|
|
2237
|
+
evidence_refs: expansion.matched_knowledge ?? [],
|
|
2238
|
+
});
|
|
2239
|
+
await taskContext.setPlanProposalGate(args.task_id, gateResult);
|
|
2240
|
+
}
|
|
2241
|
+
}
|
|
2321
2242
|
// 存储膨胀结果
|
|
2322
2243
|
try {
|
|
2323
2244
|
await taskContext.setExpansion(args.task_id, expansion);
|
|
@@ -3160,6 +3081,22 @@ export async function registerTools(server, deps) {
|
|
|
3160
3081
|
result: { task_id: args.task_id, cancelled },
|
|
3161
3082
|
};
|
|
3162
3083
|
}
|
|
3084
|
+
case "retry_expand": {
|
|
3085
|
+
if (!args.task_id) {
|
|
3086
|
+
return {
|
|
3087
|
+
result: { error: "重试 expand 需要 task_id" },
|
|
3088
|
+
};
|
|
3089
|
+
}
|
|
3090
|
+
const retried = await taskContext.retryExpand(args.task_id);
|
|
3091
|
+
if (!retried) {
|
|
3092
|
+
return {
|
|
3093
|
+
result: { error: "任务不存在、非 failed 状态或缺少 classification,无法重试 expand", task_id: args.task_id },
|
|
3094
|
+
};
|
|
3095
|
+
}
|
|
3096
|
+
return {
|
|
3097
|
+
result: { task_id: args.task_id, retried: true, hint: "任务已恢复到 expanding 状态,可重新调用 sf_expand" },
|
|
3098
|
+
};
|
|
3099
|
+
}
|
|
3163
3100
|
case "archive_stale": {
|
|
3164
3101
|
const stale = await detectStaleCurrentTask(taskContext.getStateDir());
|
|
3165
3102
|
const taskId = args.task_id ?? stale.task_id;
|