soloforge 1.4.1 → 1.4.3
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.map +1 -1
- package/dist/adapters/claude_code/tools.js +173 -6
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/engine/decision_workshop.d.ts +8 -0
- package/dist/engine/decision_workshop.d.ts.map +1 -1
- package/dist/engine/decision_workshop.js +126 -5
- package/dist/engine/decision_workshop.js.map +1 -1
- package/dist/engine/design_artifact_pack.d.ts +1 -0
- package/dist/engine/design_artifact_pack.d.ts.map +1 -1
- package/dist/engine/design_artifact_pack.js +19 -0
- package/dist/engine/design_artifact_pack.js.map +1 -1
- package/dist/engine/diagnostic_registry.d.ts +4 -0
- package/dist/engine/diagnostic_registry.d.ts.map +1 -1
- package/dist/engine/diagnostic_registry.js +24 -0
- package/dist/engine/diagnostic_registry.js.map +1 -1
- package/dist/engine/historical_issue_mechanization_matrix.js +8 -8
- package/dist/engine/historical_issue_mechanization_matrix.js.map +1 -1
- package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
- package/dist/engine/implementation_roadmap_registry.js +16 -2
- package/dist/engine/implementation_roadmap_registry.js.map +1 -1
- package/dist/engine/next_action_planner.d.ts.map +1 -1
- package/dist/engine/next_action_planner.js +26 -0
- package/dist/engine/next_action_planner.js.map +1 -1
- package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -1
- package/dist/engine/release_issue_scenario_registry.js +21 -7
- package/dist/engine/release_issue_scenario_registry.js.map +1 -1
- package/dist/engine/release_readiness_gate.d.ts.map +1 -1
- package/dist/engine/release_readiness_gate.js +61 -4
- package/dist/engine/release_readiness_gate.js.map +1 -1
- package/dist/engine/traceability.d.ts +36 -0
- package/dist/engine/traceability.d.ts.map +1 -1
- package/dist/engine/traceability.js +238 -0
- package/dist/engine/traceability.js.map +1 -1
- package/dist/types.d.ts +11 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -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;AAEvE,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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"}
|
|
@@ -85,6 +85,7 @@ const lazyNavigation = createLazy(() => import("../../engine/next_action_planner
|
|
|
85
85
|
const lazyOodSolid = createLazy(() => import("../../engine/ood_solid_contract.js"));
|
|
86
86
|
const lazyBackendImplementation = createLazy(() => import("../../engine/backend_implementation_contract.js"));
|
|
87
87
|
const lazyCodeObservability = createLazy(() => import("../../engine/code_maintainability_observability_contract.js"));
|
|
88
|
+
const lazyTraceability = createLazy(() => import("../../engine/traceability.js"));
|
|
88
89
|
const ARCHITECTURE_CONTEXT_PATTERN = /架构|architecture|系统设计|技术方案|现有系统|差距分析|gap.?analysis/i;
|
|
89
90
|
function stripPathLikeReferences(text) {
|
|
90
91
|
return text.replace(/(^|[\s"'((])(?:~\/|\.{1,2}\/|\/|[A-Za-z0-9_.-]+\/)[^\s"',。;,;::))]+/g, "$1 ");
|
|
@@ -92,6 +93,29 @@ function stripPathLikeReferences(text) {
|
|
|
92
93
|
function hasArchitectureIntentSignal(intent) {
|
|
93
94
|
return ARCHITECTURE_CONTEXT_PATTERN.test(stripPathLikeReferences(intent ?? ""));
|
|
94
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* 解析 MCP 输入中的契约对象。
|
|
98
|
+
* @description 部分 MCP 客户端会把 z.unknown() 对象参数序列化为 JSON 字符串;
|
|
99
|
+
* 入口层必须兼容字符串对象,避免后续机制访问数组字段时触发 JS 运行时错误。
|
|
100
|
+
*/
|
|
101
|
+
function parseContractObject(value, fieldName) {
|
|
102
|
+
if (value === undefined || value === null)
|
|
103
|
+
return {};
|
|
104
|
+
const candidate = typeof value === "string"
|
|
105
|
+
? (() => {
|
|
106
|
+
try {
|
|
107
|
+
return JSON.parse(value);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
})()
|
|
113
|
+
: value;
|
|
114
|
+
if (!candidate || typeof candidate !== "object" || Array.isArray(candidate)) {
|
|
115
|
+
return { error: `${fieldName} 必须是对象或可解析为对象的 JSON 字符串` };
|
|
116
|
+
}
|
|
117
|
+
return { value: candidate };
|
|
118
|
+
}
|
|
95
119
|
// ── Zod Schema 定义 ──
|
|
96
120
|
const ClassifySchema = {
|
|
97
121
|
intent: z.string().describe("开发者意图描述"),
|
|
@@ -1240,11 +1264,23 @@ export async function registerTools(server, deps) {
|
|
|
1240
1264
|
};
|
|
1241
1265
|
}
|
|
1242
1266
|
catch (err) {
|
|
1267
|
+
const errorNextTools = name === "sf_expand"
|
|
1268
|
+
? ["sf_status", "sf_debug", "sf_governance_report"]
|
|
1269
|
+
: contract.default_next_tools;
|
|
1270
|
+
const errorForbiddenTools = name === "sf_expand"
|
|
1271
|
+
? ["sf_verify", "sf_review", "sf_deliver", "sf_scaffold"]
|
|
1272
|
+
: contract.forbidden_next_tools;
|
|
1273
|
+
if (name === "sf_expand" && taskId) {
|
|
1274
|
+
try {
|
|
1275
|
+
await taskContext.updateStatus(taskId, "failed");
|
|
1276
|
+
}
|
|
1277
|
+
catch { /* best effort */ }
|
|
1278
|
+
}
|
|
1243
1279
|
const errorTrace = createToolTrace({
|
|
1244
1280
|
tool_name: name, invocation_id: invocationId, task_id: taskId,
|
|
1245
1281
|
actual_side_effects: effectiveSideEffects,
|
|
1246
|
-
next_allowed_tools:
|
|
1247
|
-
forbidden_tools:
|
|
1282
|
+
next_allowed_tools: errorNextTools,
|
|
1283
|
+
forbidden_tools: errorForbiddenTools,
|
|
1248
1284
|
authorization, bypass,
|
|
1249
1285
|
});
|
|
1250
1286
|
if (taskId) {
|
|
@@ -1257,8 +1293,8 @@ export async function registerTools(server, deps) {
|
|
|
1257
1293
|
content: [{ type: "text", text: JSON.stringify({
|
|
1258
1294
|
error: err instanceof Error ? err.message : String(err),
|
|
1259
1295
|
tool_trace: errorTrace,
|
|
1260
|
-
next_allowed_tools:
|
|
1261
|
-
forbidden_tools:
|
|
1296
|
+
next_allowed_tools: errorNextTools,
|
|
1297
|
+
forbidden_tools: errorForbiddenTools,
|
|
1262
1298
|
}) }],
|
|
1263
1299
|
isError: true,
|
|
1264
1300
|
};
|
|
@@ -1384,11 +1420,30 @@ export async function registerTools(server, deps) {
|
|
|
1384
1420
|
if (!ctx || !ctx.classification) {
|
|
1385
1421
|
return { result: { error: "任务不存在或尚未分类,请先调用 sf_classify" } };
|
|
1386
1422
|
}
|
|
1423
|
+
const existingArchitectureWorkshop = parseContractObject(ctx.architecture_decision_workshop, "architecture_decision_workshop");
|
|
1424
|
+
if (existingArchitectureWorkshop.error) {
|
|
1425
|
+
return { result: { error: existingArchitectureWorkshop.error, status: "invalid_input" } };
|
|
1426
|
+
}
|
|
1427
|
+
const existingDecisionWorkshop = parseContractObject(ctx.decision_workshop, "decision_workshop");
|
|
1428
|
+
if (existingDecisionWorkshop.error) {
|
|
1429
|
+
return { result: { error: existingDecisionWorkshop.error, status: "invalid_input" } };
|
|
1430
|
+
}
|
|
1431
|
+
if (existingArchitectureWorkshop.value)
|
|
1432
|
+
ctx.architecture_decision_workshop = existingArchitectureWorkshop.value;
|
|
1433
|
+
if (existingDecisionWorkshop.value) {
|
|
1434
|
+
ctx.decision_workshop = (await lazyDecisionWorkshop()).normalizeDecisionWorkshopContract(existingDecisionWorkshop.value, args.task_id) ?? existingDecisionWorkshop.value;
|
|
1435
|
+
}
|
|
1387
1436
|
if (args.architecture_decision_workshop) {
|
|
1388
|
-
|
|
1437
|
+
const parsed = parseContractObject(args.architecture_decision_workshop, "architecture_decision_workshop");
|
|
1438
|
+
if (parsed.error)
|
|
1439
|
+
return { result: { error: parsed.error, status: "invalid_input" } };
|
|
1440
|
+
ctx.architecture_decision_workshop = parsed.value;
|
|
1389
1441
|
}
|
|
1390
1442
|
if (args.decision_workshop) {
|
|
1391
|
-
|
|
1443
|
+
const parsed = parseContractObject(args.decision_workshop, "decision_workshop");
|
|
1444
|
+
if (parsed.error)
|
|
1445
|
+
return { result: { error: parsed.error, status: "invalid_input" } };
|
|
1446
|
+
ctx.decision_workshop = (await lazyDecisionWorkshop()).normalizeDecisionWorkshopContract(parsed.value, args.task_id) ?? parsed.value;
|
|
1392
1447
|
}
|
|
1393
1448
|
if (args.design_artifact_pack) {
|
|
1394
1449
|
ctx.design_artifact_pack = args.design_artifact_pack;
|
|
@@ -1781,6 +1836,84 @@ export async function registerTools(server, deps) {
|
|
|
1781
1836
|
{
|
|
1782
1837
|
const preImplementationBlocks = [];
|
|
1783
1838
|
const preImplementationPayload = {};
|
|
1839
|
+
const artifactDesignIntent = expansionRoute === "artifact_generation"
|
|
1840
|
+
|| ["architecture_design", "database_design", "api_design", "detailed_design"].includes(String(workflowIntent))
|
|
1841
|
+
|| /(?:架构|数据库|API|接口|OpenAPI).{0,12}(?:设计|规格|文档)|(?:设计|规格|文档).{0,12}(?:API|接口|OpenAPI)/i.test(ctx.intent);
|
|
1842
|
+
const isImplementationRoute = !artifactDesignIntent && (expansionRoute === "code_change"
|
|
1843
|
+
|| String(workflowIntent) === "backend_api_implementation"
|
|
1844
|
+
|| String(workflowIntent) === "frontend_business_logic"
|
|
1845
|
+
|| /编码|实现|开发|controller|service|component/i.test(ctx.intent));
|
|
1846
|
+
const traceabilityModule = await lazyTraceability();
|
|
1847
|
+
const traceReport = isImplementationRoute
|
|
1848
|
+
? traceabilityModule.auditDesignImplementationTraceability(projectPath)
|
|
1849
|
+
: {
|
|
1850
|
+
passed: true,
|
|
1851
|
+
matrix_exists: false,
|
|
1852
|
+
findings: [],
|
|
1853
|
+
checked_files: [],
|
|
1854
|
+
matrix_path: traceabilityModule.DEFAULT_DESIGN_IMPLEMENTATION_TRACEABILITY_PATH,
|
|
1855
|
+
};
|
|
1856
|
+
if (isImplementationRoute && !traceReport.passed) {
|
|
1857
|
+
ctx.traceability_binding = {
|
|
1858
|
+
requirement_ids: [],
|
|
1859
|
+
prototype_ids: [],
|
|
1860
|
+
architecture_ids: [],
|
|
1861
|
+
detail_design_ids: [],
|
|
1862
|
+
slice_ids: [],
|
|
1863
|
+
acceptance_ids: [],
|
|
1864
|
+
status: "needs_backfill",
|
|
1865
|
+
findings: traceReport.findings.map((finding) => `${finding.code}: ${finding.message_zh}`),
|
|
1866
|
+
};
|
|
1867
|
+
await taskContext.save(ctx);
|
|
1868
|
+
return {
|
|
1869
|
+
result: {
|
|
1870
|
+
error: "需求/原型/设计/切片/验收追踪链路未闭合,不得进入编码实现",
|
|
1871
|
+
status: "blocked",
|
|
1872
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.traceabilityMissing,
|
|
1873
|
+
traceability_findings: traceReport.findings,
|
|
1874
|
+
checked_files: traceReport.checked_files,
|
|
1875
|
+
recovery: "先补齐 docs/traceability/01-需求原型设计实现追踪矩阵.md,并让架构、详细设计、切片计划绑定 REQ/PROTO/ARCH/DD/SLICE/AC ID 后重新 sf_expand",
|
|
1876
|
+
},
|
|
1877
|
+
};
|
|
1878
|
+
}
|
|
1879
|
+
const traceBindingIds = traceabilityModule.extractTraceabilityBindingIds(ctx);
|
|
1880
|
+
if (traceReport.matrix_exists && isImplementationRoute) {
|
|
1881
|
+
const missingPrefixes = ["SLICE", "DD", "AC"].filter((prefix) => !traceBindingIds.some((id) => id.startsWith(`${prefix}-`)));
|
|
1882
|
+
if (missingPrefixes.length > 0) {
|
|
1883
|
+
ctx.traceability_binding = {
|
|
1884
|
+
requirement_ids: traceBindingIds.filter((id) => id.startsWith("REQ-")),
|
|
1885
|
+
prototype_ids: traceBindingIds.filter((id) => id.startsWith("PROTO-")),
|
|
1886
|
+
architecture_ids: traceBindingIds.filter((id) => id.startsWith("ARCH-")),
|
|
1887
|
+
detail_design_ids: traceBindingIds.filter((id) => id.startsWith("DD-")),
|
|
1888
|
+
slice_ids: traceBindingIds.filter((id) => id.startsWith("SLICE-")),
|
|
1889
|
+
acceptance_ids: traceBindingIds.filter((id) => id.startsWith("AC-")),
|
|
1890
|
+
status: "missing",
|
|
1891
|
+
findings: missingPrefixes.map((prefix) => `编码前缺少 ${prefix}-* 绑定`),
|
|
1892
|
+
};
|
|
1893
|
+
await taskContext.save(ctx);
|
|
1894
|
+
return {
|
|
1895
|
+
result: {
|
|
1896
|
+
error: "编码任务必须先绑定切片、详细设计和验收 ID",
|
|
1897
|
+
status: "awaiting_traceability_binding",
|
|
1898
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.traceabilityBindingMissing,
|
|
1899
|
+
missing_prefixes: missingPrefixes,
|
|
1900
|
+
matrix_path: traceReport.matrix_path,
|
|
1901
|
+
recovery: "在任务上下文或指令中明确本次实现对应的 SLICE-*、DD-*、AC-*,再重新调用 sf_expand;不得脱离已确认设计直接编码",
|
|
1902
|
+
},
|
|
1903
|
+
};
|
|
1904
|
+
}
|
|
1905
|
+
ctx.traceability_binding = {
|
|
1906
|
+
requirement_ids: traceBindingIds.filter((id) => id.startsWith("REQ-")),
|
|
1907
|
+
prototype_ids: traceBindingIds.filter((id) => id.startsWith("PROTO-")),
|
|
1908
|
+
architecture_ids: traceBindingIds.filter((id) => id.startsWith("ARCH-")),
|
|
1909
|
+
detail_design_ids: traceBindingIds.filter((id) => id.startsWith("DD-")),
|
|
1910
|
+
slice_ids: traceBindingIds.filter((id) => id.startsWith("SLICE-")),
|
|
1911
|
+
acceptance_ids: traceBindingIds.filter((id) => id.startsWith("AC-")),
|
|
1912
|
+
status: "bound",
|
|
1913
|
+
findings: [],
|
|
1914
|
+
};
|
|
1915
|
+
preImplementationPayload.traceability_binding = ctx.traceability_binding;
|
|
1916
|
+
}
|
|
1784
1917
|
const oodModule = await lazyOodSolid();
|
|
1785
1918
|
const oodGate = oodModule.evaluateOodDesignGate({
|
|
1786
1919
|
task_id: args.task_id,
|
|
@@ -2069,6 +2202,30 @@ export async function registerTools(server, deps) {
|
|
|
2069
2202
|
// 文件缺失会由验证命令或现有产物检查报告。
|
|
2070
2203
|
}
|
|
2071
2204
|
}
|
|
2205
|
+
const traceabilityModule = await lazyTraceability();
|
|
2206
|
+
const traceVerification = traceabilityModule.verifyChangedFilesAgainstDesignTraceability(projectPath, implementationFiles, ctx);
|
|
2207
|
+
if (!traceVerification.passed) {
|
|
2208
|
+
ctx.traceability_binding = {
|
|
2209
|
+
requirement_ids: traceVerification.binding_ids.filter((id) => id.startsWith("REQ-")),
|
|
2210
|
+
prototype_ids: traceVerification.binding_ids.filter((id) => id.startsWith("PROTO-")),
|
|
2211
|
+
architecture_ids: traceVerification.binding_ids.filter((id) => id.startsWith("ARCH-")),
|
|
2212
|
+
detail_design_ids: traceVerification.binding_ids.filter((id) => id.startsWith("DD-")),
|
|
2213
|
+
slice_ids: traceVerification.binding_ids.filter((id) => id.startsWith("SLICE-")),
|
|
2214
|
+
acceptance_ids: traceVerification.binding_ids.filter((id) => id.startsWith("AC-")),
|
|
2215
|
+
status: "missing",
|
|
2216
|
+
findings: traceVerification.findings.map((finding) => `${finding.code}: ${finding.message_zh}`),
|
|
2217
|
+
};
|
|
2218
|
+
await taskContext.save(ctx);
|
|
2219
|
+
return {
|
|
2220
|
+
result: {
|
|
2221
|
+
error: "编码变更未绑定需求/原型/设计/切片/验收追踪链路,需修复后重验",
|
|
2222
|
+
status: "blocked",
|
|
2223
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.traceabilityVerifyFailed,
|
|
2224
|
+
traceability_findings: traceVerification.findings,
|
|
2225
|
+
recovery: "补齐追踪矩阵并在任务中绑定 SLICE-*、DD-*、AC-* 后重新执行 sf_verify",
|
|
2226
|
+
},
|
|
2227
|
+
};
|
|
2228
|
+
}
|
|
2072
2229
|
const oodModule = await lazyOodSolid();
|
|
2073
2230
|
const oodGate = oodModule.evaluateOodDesignGate({
|
|
2074
2231
|
task_id: args.task_id,
|
|
@@ -3249,6 +3406,16 @@ export async function registerTools(server, deps) {
|
|
|
3249
3406
|
},
|
|
3250
3407
|
};
|
|
3251
3408
|
}
|
|
3409
|
+
if (ctx.traceability_binding && ctx.traceability_binding.status !== "bound") {
|
|
3410
|
+
return {
|
|
3411
|
+
result: {
|
|
3412
|
+
error: "追踪绑定未闭合,不得交付编码结果",
|
|
3413
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.traceabilityDeliveryBlocked,
|
|
3414
|
+
traceability_binding: ctx.traceability_binding,
|
|
3415
|
+
recovery: "补齐需求/原型/设计/切片/验收追踪矩阵并重新 sf_expand → sf_verify,通过后再 sf_deliver",
|
|
3416
|
+
},
|
|
3417
|
+
};
|
|
3418
|
+
}
|
|
3252
3419
|
// 交付 lease 互斥检查
|
|
3253
3420
|
const leaseModule = await lazyWorkspaceLease();
|
|
3254
3421
|
const deliverLease = leaseModule.acquireLease(args.task_id, "delivery", [projectPath]);
|