soloforge 1.3.2 → 1.3.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.
Files changed (84) hide show
  1. package/README.md +5 -0
  2. package/dist/adapters/claude_code/tools.d.ts.map +1 -1
  3. package/dist/adapters/claude_code/tools.js +287 -1
  4. package/dist/adapters/claude_code/tools.js.map +1 -1
  5. package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
  6. package/dist/adapters/shared/workflow_template.js +2 -1
  7. package/dist/adapters/shared/workflow_template.js.map +1 -1
  8. package/dist/bin/soloforge.d.ts.map +1 -1
  9. package/dist/bin/soloforge.js +231 -1
  10. package/dist/bin/soloforge.js.map +1 -1
  11. package/dist/engine/asset_manifest.d.ts.map +1 -1
  12. package/dist/engine/asset_manifest.js +13 -0
  13. package/dist/engine/asset_manifest.js.map +1 -1
  14. package/dist/engine/backend_implementation_contract.d.ts +51 -0
  15. package/dist/engine/backend_implementation_contract.d.ts.map +1 -0
  16. package/dist/engine/backend_implementation_contract.js +142 -0
  17. package/dist/engine/backend_implementation_contract.js.map +1 -0
  18. package/dist/engine/consumable_asset_registry.d.ts.map +1 -1
  19. package/dist/engine/consumable_asset_registry.js +133 -0
  20. package/dist/engine/consumable_asset_registry.js.map +1 -1
  21. package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -1
  22. package/dist/engine/dual_layer_mechanism_registry.js +124 -0
  23. package/dist/engine/dual_layer_mechanism_registry.js.map +1 -1
  24. package/dist/engine/explicit_asset_registry.d.ts.map +1 -1
  25. package/dist/engine/explicit_asset_registry.js +204 -0
  26. package/dist/engine/explicit_asset_registry.js.map +1 -1
  27. package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
  28. package/dist/engine/implementation_roadmap_registry.js +68 -2
  29. package/dist/engine/implementation_roadmap_registry.js.map +1 -1
  30. package/dist/engine/mechanism_contract_registry.d.ts.map +1 -1
  31. package/dist/engine/mechanism_contract_registry.js +68 -0
  32. package/dist/engine/mechanism_contract_registry.js.map +1 -1
  33. package/dist/engine/next_action_planner.d.ts +19 -0
  34. package/dist/engine/next_action_planner.d.ts.map +1 -0
  35. package/dist/engine/next_action_planner.js +453 -0
  36. package/dist/engine/next_action_planner.js.map +1 -0
  37. package/dist/engine/ood_solid_contract.d.ts +51 -0
  38. package/dist/engine/ood_solid_contract.d.ts.map +1 -0
  39. package/dist/engine/ood_solid_contract.js +115 -0
  40. package/dist/engine/ood_solid_contract.js.map +1 -0
  41. package/dist/engine/project_stage_detector.d.ts +17 -0
  42. package/dist/engine/project_stage_detector.d.ts.map +1 -0
  43. package/dist/engine/project_stage_detector.js +185 -0
  44. package/dist/engine/project_stage_detector.js.map +1 -0
  45. package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -1
  46. package/dist/engine/release_issue_scenario_registry.js +14 -1
  47. package/dist/engine/release_issue_scenario_registry.js.map +1 -1
  48. package/dist/engine/release_readiness_gate.d.ts.map +1 -1
  49. package/dist/engine/release_readiness_gate.js +149 -3
  50. package/dist/engine/release_readiness_gate.js.map +1 -1
  51. package/dist/engine/stale_current_task_detector.d.ts +30 -0
  52. package/dist/engine/stale_current_task_detector.d.ts.map +1 -0
  53. package/dist/engine/stale_current_task_detector.js +168 -0
  54. package/dist/engine/stale_current_task_detector.js.map +1 -0
  55. package/dist/engine/task_stage_detector.d.ts +19 -0
  56. package/dist/engine/task_stage_detector.d.ts.map +1 -0
  57. package/dist/engine/task_stage_detector.js +201 -0
  58. package/dist/engine/task_stage_detector.js.map +1 -0
  59. package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -1
  60. package/dist/engine/tool_invocation_contract_registry.js +10 -0
  61. package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
  62. package/dist/engine/workflow_navigation_contract.d.ts +115 -0
  63. package/dist/engine/workflow_navigation_contract.d.ts.map +1 -0
  64. package/dist/engine/workflow_navigation_contract.js +39 -0
  65. package/dist/engine/workflow_navigation_contract.js.map +1 -0
  66. package/dist/types.d.ts +8 -0
  67. package/dist/types.d.ts.map +1 -1
  68. package/package.json +1 -1
  69. package/templates/knowledge/acceptance_templates/OOD/350/256/276/350/256/241/346/221/230/350/246/201/346/250/241/347/211/210.md +60 -0
  70. package/templates/knowledge/acceptance_templates//345/220/216/347/253/257/345/256/236/347/216/260/351/252/214/346/224/266/346/270/205/345/215/225.md +46 -0
  71. package/templates/knowledge/procedures/OOD/350/256/276/350/256/241/345/267/245/344/275/234/346/265/201.md +50 -0
  72. package/templates/knowledge/procedures//345/205/250/347/224/237/345/221/275/345/221/250/346/234/237/345/267/245/344/275/234/346/265/201/345/257/274/350/210/252.md +100 -0
  73. package/templates/knowledge/procedures//345/220/216/347/253/257/346/216/245/345/217/243/345/256/236/347/216/260/345/267/245/344/275/234/346/265/201.md +50 -0
  74. package/templates/knowledge/review_rules/SOLID/344/273/243/347/240/201/345/256/241/346/237/245/350/247/204/345/210/231.md +40 -0
  75. package/templates/knowledge/review_rules//345/220/216/347/253/257/345/256/236/347/216/260/345/267/245/347/250/213/345/256/241/346/237/245/350/247/204/345/210/231.md +38 -0
  76. package/templates/knowledge/rules/OOD/344/270/216SOLID/350/256/276/350/256/241/350/247/204/345/210/231.md +62 -0
  77. package/templates/knowledge/rules//345/220/216/347/253/257/345/256/236/347/216/260/345/267/245/347/250/213/345/245/221/347/272/246/350/247/204/345/210/231.md +55 -0
  78. package/templates/knowledge/rules//345/267/245/344/275/234/346/265/201/345/257/274/350/210/252/345/245/221/347/272/246/350/247/204/345/210/231.md +113 -0
  79. package/templates/knowledge/rules//346/240/207/345/207/206/350/265/204/344/272/247/350/246/206/347/233/226/350/247/204/345/210/231.md +43 -0
  80. package/templates/knowledge/rules//346/250/241/346/235/277/350/265/204/344/272/247/345/217/257/350/247/201/346/200/247/350/247/204/345/210/231.md +44 -0
  81. package/templates/knowledge/rules//351/200/232/347/224/250/345/206/263/347/255/226/347/240/224/350/256/250/350/247/204/345/210/231.md +47 -0
  82. package/templates/knowledge/rules//351/252/214/346/224/266/346/250/241/346/235/277/350/276/223/345/207/272/345/245/221/347/272/246/350/247/204/345/210/231.md +46 -0
  83. package/templates/patterns/SOLID/350/256/276/350/256/241/350/247/204/350/214/203.md +39 -0
  84. package/templates/patterns//345/220/216/347/253/257/345/256/236/347/216/260/345/267/245/347/250/213/350/247/204/350/214/203.md +39 -0
package/README.md CHANGED
@@ -75,6 +75,8 @@ SoloForge 不会覆盖已有知识文件。重新运行 `soloforge init` 可刷
75
75
  ```bash
76
76
  soloforge validate # 检查项目配置和知识文件
77
77
  soloforge status # 查看当前项目状态和配置来源
78
+ soloforge next # 查看当前阶段、阻断项和下一步可执行工作包
79
+ soloforge stage # 查看项目阶段与当前任务阶段
78
80
  soloforge config resolve # 查看配置解析结果和来源
79
81
  soloforge config explain # 解释某项配置为什么是当前值
80
82
  soloforge version # 查看版本
@@ -153,6 +155,9 @@ soloforge migrate --apply --confirm # 确认后迁移
153
155
  - **施工指令约束** — AI 写代码前必须先明确目标、范围、非目标和验收标准,不会跳过定义直接动手写实现。
154
156
  - **证据驱动** — AI 不得无证据声称项目事实。默认模板和通用规则不算项目证据;架构分析必须有真实代码依据或你的人工确认。
155
157
  - **存量设计复验** — 升级 SoloForge 后,已有架构/数据库/API 文档不会被默认信任。运行 `soloforge audit-design-artifacts` 可得到差距报告;需要升级时先 dry-run,再经 `--apply --confirm` 归档旧文件并写入升级契约,修订后的文档必须重新复验。
158
+ - **下一步导航** — 不确定接下来该做什么时,运行 `soloforge next`,或向 AI 直接说“下一步/继续/现在能写代码吗”。SoloForge 会依据配置、设计验收、当前任务、修复指令和验证证据输出阶段、阻断原因与工作包;陈旧任务不会被静默绕过。
159
+ - **OOD 与 SOLID 编码约束** — 复杂业务、领域服务、策略和重构类实现会先要求对象职责、接口与依赖方向摘要;代码审查可识别职责膨胀、直接依赖基础设施、宽接口和替换违约。文案或简单配置修改不会被强行复杂化。
160
+ - **后端实现工程约束** — 实现后端接口前会要求 DTO/校验、响应与分页、事务与幂等、安全审计、OpenAPI/数据库对齐和测试证据;实体泄漏、写接口无校验、事务内外调、关键写入无幂等或敏感接口无安全证据会阻断交付。
156
161
  - **日志清晰** — 用户可见输出中文优先;JSON 模式(`--json`)输出保持纯 JSON,不混入内部日志。
157
162
  - 写代码类任务会更明确 scope、验收项和验证命令。
158
163
  - 生成文档、提取说明、分析日志等产物型任务会默认输出到 `.soloforge/output/`,不会默认修改 `src/`。
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/tools.ts"],"names":[],"mappings":"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"}
@@ -83,6 +83,9 @@ const lazyDesignArtifactPack = createLazy(() => import("../../engine/design_arti
83
83
  const lazyStandardAssetContract = createLazy(() => import("../../engine/standard_asset_contract.js"));
84
84
  const lazyTemplateVisibility = createLazy(() => import("../../engine/template_asset_visibility.js"));
85
85
  const lazyDecisionWorkshop = createLazy(() => import("../../engine/decision_workshop.js"));
86
+ const lazyNavigation = createLazy(() => import("../../engine/next_action_planner.js"));
87
+ const lazyOodSolid = createLazy(() => import("../../engine/ood_solid_contract.js"));
88
+ const lazyBackendImplementation = createLazy(() => import("../../engine/backend_implementation_contract.js"));
86
89
  // ── Zod Schema 定义 ──
87
90
  const ClassifySchema = {
88
91
  intent: z.string().describe("开发者意图描述"),
@@ -95,6 +98,8 @@ const ExpandSchema = {
95
98
  architecture_decision_workshop: z.unknown().optional().describe("架构设计前已讨论并确认的六域决策记录"),
96
99
  decision_workshop: z.unknown().optional().describe("通用决策研讨合同(技术选型/数据迁移/安全策略/部署/重构/第三方集成等)"),
97
100
  design_artifact_pack: z.unknown().optional().describe("设计产物包路径映射或已复验状态"),
101
+ ood_solid_summary: z.unknown().optional().describe("复杂编码任务的 OOD/SOLID 设计摘要"),
102
+ backend_implementation_work_package: z.unknown().optional().describe("后端接口实现的工程工作包"),
98
103
  };
99
104
  const VerifySchema = {
100
105
  task_id: z.string().describe("任务 ID"),
@@ -1250,9 +1255,33 @@ export async function registerTools(server, deps) {
1250
1255
  debug("工具注册", "批量注册核心/辅助/知识维护工具...");
1251
1256
  // ── sf_classify: 意图分类入口,创建任务上下文并返回分类结果 ──
1252
1257
  registerSafeTool("sf_classify", "分析开发者意图,返回任务类型、风险、复杂度和执行策略", ClassifySchema, async (args) => {
1258
+ const asksForNavigation = /(?:下一步|继续(?:做|执行|开发)?|现在(?:可以|能)(?:开始)?(?:写代码|编码|开发|测试|交付)|接下来(?:做什么|该做什么)|该(?:做什么|怎么继续))/i.test(args.intent);
1259
+ if (asksForNavigation) {
1260
+ const navigation = await (await lazyNavigation()).planNextAction(projectPath);
1261
+ return {
1262
+ result: {
1263
+ status: "navigation_required",
1264
+ reason_zh: "检测到阶段推进意图,必须先依据 SoloForge 状态规划下一步",
1265
+ navigation,
1266
+ },
1267
+ };
1268
+ }
1253
1269
  // 检查是否存在进行中的任务
1254
1270
  const existing = await taskContext.getCurrentTask();
1255
1271
  if (existing && !["done", "failed"].includes(existing.status)) {
1272
+ const navigation = await (await lazyNavigation()).planNextAction(projectPath);
1273
+ if (navigation.stale_task?.is_stale) {
1274
+ return {
1275
+ result: {
1276
+ status: "stale_task_requires_resolution",
1277
+ error: "存在陈旧任务指针,必须先选择恢复、归档或开始新任务",
1278
+ existing_task_id: existing.task_id,
1279
+ existing_status: existing.status,
1280
+ navigation,
1281
+ hint: "先调用 sf_navigation 查看可执行处理步骤,不得绕过 SoloForge 状态直接分析或编码",
1282
+ },
1283
+ };
1284
+ }
1256
1285
  return {
1257
1286
  result: {
1258
1287
  error: "存在未完成的任务",
@@ -1295,7 +1324,14 @@ export async function registerTools(server, deps) {
1295
1324
  if (args.design_artifact_pack) {
1296
1325
  ctx.design_artifact_pack = args.design_artifact_pack;
1297
1326
  }
1298
- if (args.architecture_decision_workshop || args.decision_workshop || args.design_artifact_pack) {
1327
+ if (args.ood_solid_summary) {
1328
+ ctx.ood_solid_summary = args.ood_solid_summary;
1329
+ }
1330
+ if (args.backend_implementation_work_package) {
1331
+ ctx.backend_implementation_work_package = args.backend_implementation_work_package;
1332
+ }
1333
+ if (args.architecture_decision_workshop || args.decision_workshop || args.design_artifact_pack
1334
+ || args.ood_solid_summary || args.backend_implementation_work_package) {
1299
1335
  await taskContext.save(ctx);
1300
1336
  }
1301
1337
  // 状态守卫:classifying/expanding/clarifying → expanding
@@ -1668,6 +1704,56 @@ export async function registerTools(server, deps) {
1668
1704
  };
1669
1705
  }
1670
1706
  }
1707
+ // 问题六十六: 复杂业务编码必须先具备对象职责、接口和依赖方向摘要。
1708
+ {
1709
+ const oodModule = await lazyOodSolid();
1710
+ const oodGate = oodModule.evaluateOodDesignGate({
1711
+ task_id: args.task_id,
1712
+ intent: ctx.intent,
1713
+ route: expansionRoute,
1714
+ summary: ctx.ood_solid_summary,
1715
+ });
1716
+ if (oodGate.applicable) {
1717
+ ctx.ood_solid_summary = oodGate.required_summary;
1718
+ await taskContext.save(ctx);
1719
+ }
1720
+ if (!oodGate.allowed) {
1721
+ return {
1722
+ result: {
1723
+ error: oodGate.reason_zh,
1724
+ status: "awaiting_ood_design",
1725
+ diagnostic_code: "SF-OOD-6601",
1726
+ ood_solid_summary: oodGate.required_summary,
1727
+ recovery: "请确认对象职责、接口边界、依赖方向、变化点和 SOLID 风险后重新调用 sf_expand",
1728
+ },
1729
+ };
1730
+ }
1731
+ }
1732
+ // 问题六十七: 后端接口编码必须先确认工程边界与验收证据。
1733
+ {
1734
+ const backendModule = await lazyBackendImplementation();
1735
+ const backendGate = backendModule.evaluateBackendImplementationGate({
1736
+ task_id: args.task_id,
1737
+ intent: ctx.intent,
1738
+ route: expansionRoute,
1739
+ work_package: ctx.backend_implementation_work_package,
1740
+ });
1741
+ if (backendGate.applicable) {
1742
+ ctx.backend_implementation_work_package = backendGate.work_package;
1743
+ await taskContext.save(ctx);
1744
+ }
1745
+ if (!backendGate.allowed) {
1746
+ return {
1747
+ result: {
1748
+ error: backendGate.reason_zh,
1749
+ status: "awaiting_backend_contract",
1750
+ diagnostic_code: "SF-BACKEND-6701",
1751
+ backend_implementation_work_package: backendGate.work_package,
1752
+ recovery: "请补齐 DTO/校验、事务一致性、安全审计、契约对齐与测试证据后重新调用 sf_expand",
1753
+ },
1754
+ };
1755
+ }
1756
+ }
1671
1757
  // Input Material Contract: 处理 hard-blocking 结果
1672
1758
  // Privacy Gate: 隐私/敏感信息策略阻断
1673
1759
  const isBlocked = expansion.prompt.startsWith("## 阻塞:输入材料禁止读取")
@@ -1872,6 +1958,102 @@ export async function registerTools(server, deps) {
1872
1958
  result: { error: "任务不存在" },
1873
1959
  };
1874
1960
  }
1961
+ const implementationFiles = args.changed_files.filter((file) => /\.(?:ts|tsx|js|jsx|java|kt|cs|go|py)$/.test(file)
1962
+ && !/(?:^|\/)tests?\//.test(file));
1963
+ if (implementationFiles.length > 0) {
1964
+ const implementationContents = {};
1965
+ for (const changedFile of implementationFiles) {
1966
+ const absoluteFile = path.resolve(projectPath, changedFile);
1967
+ try {
1968
+ if (absoluteFile.startsWith(`${path.resolve(projectPath)}${path.sep}`) && fss.statSync(absoluteFile).isFile()) {
1969
+ implementationContents[changedFile] = fss.readFileSync(absoluteFile, "utf-8");
1970
+ }
1971
+ }
1972
+ catch {
1973
+ // 文件缺失会由验证命令或现有产物检查报告。
1974
+ }
1975
+ }
1976
+ const oodModule = await lazyOodSolid();
1977
+ const oodGate = oodModule.evaluateOodDesignGate({
1978
+ task_id: args.task_id,
1979
+ intent: ctx.intent,
1980
+ route: ctx.expansion?.workflow_trace?.route,
1981
+ changed_files: implementationFiles,
1982
+ summary: ctx.ood_solid_summary,
1983
+ });
1984
+ if (!oodGate.allowed) {
1985
+ return {
1986
+ result: {
1987
+ error: oodGate.reason_zh,
1988
+ status: "blocked",
1989
+ diagnostic_code: "SF-OOD-6601",
1990
+ ood_solid_summary: oodGate.required_summary,
1991
+ recovery: "完成 OOD/SOLID 摘要后重新执行 sf_expand 与 sf_verify",
1992
+ },
1993
+ };
1994
+ }
1995
+ const backendModule = await lazyBackendImplementation();
1996
+ const backendGate = backendModule.evaluateBackendImplementationGate({
1997
+ task_id: args.task_id,
1998
+ intent: ctx.intent,
1999
+ route: ctx.expansion?.workflow_trace?.route,
2000
+ changed_files: implementationFiles,
2001
+ work_package: ctx.backend_implementation_work_package,
2002
+ });
2003
+ if (!backendGate.allowed) {
2004
+ return {
2005
+ result: {
2006
+ error: backendGate.reason_zh,
2007
+ status: "blocked",
2008
+ diagnostic_code: "SF-BACKEND-6701",
2009
+ backend_implementation_work_package: backendGate.work_package,
2010
+ recovery: "完成后端工程工作包后重新执行 sf_expand 与 sf_verify",
2011
+ },
2012
+ };
2013
+ }
2014
+ const solidFindings = oodGate.applicable ? oodModule.reviewSolidCode(implementationContents) : [];
2015
+ const backendFindings = backendGate.applicable ? backendModule.reviewBackendImplementationFiles(implementationContents) : [];
2016
+ if (backendGate.applicable) {
2017
+ const openApiPath = path.join(projectPath, "docs", "api", "openapi.yaml");
2018
+ const apiMarkdownPath = path.join(projectPath, "docs", "architecture", "03-API接口规格文档.md");
2019
+ const migrationDirectory = path.join(projectPath, "db", "migrations");
2020
+ const openapiText = fss.existsSync(openApiPath) ? fss.readFileSync(openApiPath, "utf-8") : undefined;
2021
+ const apiDocumentText = fss.existsSync(apiMarkdownPath) ? fss.readFileSync(apiMarkdownPath, "utf-8") : undefined;
2022
+ const migrationText = fss.existsSync(migrationDirectory)
2023
+ ? fss.readdirSync(migrationDirectory).filter((name) => /\.sql$/i.test(name))
2024
+ .map((name) => fss.readFileSync(path.join(migrationDirectory, name), "utf-8")).join("\n")
2025
+ : undefined;
2026
+ backendFindings.push(...backendModule.verifyBackendArtifactAlignment({
2027
+ openapiText,
2028
+ apiDocumentText,
2029
+ migrationText,
2030
+ sourceFiles: implementationContents,
2031
+ }));
2032
+ }
2033
+ ctx.ood_solid_findings = solidFindings;
2034
+ ctx.backend_implementation_findings = backendFindings;
2035
+ await taskContext.save(ctx);
2036
+ if (oodModule.hasBlockingSolidFindings(solidFindings)) {
2037
+ return {
2038
+ result: {
2039
+ error: "OOD/SOLID 代码复验发现阻断项,需修复后重验",
2040
+ status: "blocked",
2041
+ diagnostic_code: "SF-OOD-6602",
2042
+ ood_solid_findings: solidFindings,
2043
+ },
2044
+ };
2045
+ }
2046
+ if (backendModule.hasBlockingBackendFindings(backendFindings)) {
2047
+ return {
2048
+ result: {
2049
+ error: "后端实现工程复验发现阻断项,需修复后重验",
2050
+ status: "blocked",
2051
+ diagnostic_code: "SF-BACKEND-6702",
2052
+ backend_implementation_findings: backendFindings,
2053
+ },
2054
+ };
2055
+ }
2056
+ }
1875
2057
  // 问题六十二: 设计产物验证必须读取用户项目真实文件,不接受占位合同自证通过。
1876
2058
  const verifyWorkflowIntent = ctx.route_decision?.workflow_intent ?? ctx.classification?.route_decision?.workflow_intent;
1877
2059
  const touchesDesignArtifacts = args.changed_files.some((file) => /docs\/architecture\/|docs\/api\/|openapi|db\/(?:migrations|schema)|架构设计|数据库设计|API接口规格/i.test(file));
@@ -2633,12 +2815,55 @@ export async function registerTools(server, deps) {
2633
2815
  }, tracker);
2634
2816
  result.task_id = args.task_id;
2635
2817
  await taskContext.setCodeReview(args.task_id, result);
2818
+ const contractContents = { ...(args.file_contents ?? {}) };
2819
+ for (const changedFile of args.changed_files) {
2820
+ if (contractContents[changedFile] !== undefined)
2821
+ continue;
2822
+ const absoluteFile = path.resolve(projectPath, changedFile);
2823
+ try {
2824
+ if (absoluteFile.startsWith(`${path.resolve(projectPath)}${path.sep}`) && fss.statSync(absoluteFile).isFile()) {
2825
+ contractContents[changedFile] = fss.readFileSync(absoluteFile, "utf-8");
2826
+ }
2827
+ }
2828
+ catch {
2829
+ // 无法读取的文件留给现有 reviewer 报告,不制造假结论。
2830
+ }
2831
+ }
2832
+ const oodModule = await lazyOodSolid();
2833
+ const solidFindings = oodModule.requiresOodSolidContract(ctx.intent, ctx.expansion?.workflow_trace?.route, args.changed_files)
2834
+ || ctx.ood_solid_summary
2835
+ ? [
2836
+ ...oodModule.reviewSolidCode(contractContents),
2837
+ ...oodModule.evaluateOverdesignRisk(ctx.intent, ctx.ood_solid_summary),
2838
+ ]
2839
+ : [];
2840
+ const backendModule = await lazyBackendImplementation();
2841
+ const backendFindings = backendModule.requiresBackendImplementationContract(ctx.intent, ctx.expansion?.workflow_trace?.route, args.changed_files)
2842
+ || ctx.backend_implementation_work_package
2843
+ ? backendModule.reviewBackendImplementationFiles(contractContents)
2844
+ : [];
2845
+ if (solidFindings.length > 0 || backendFindings.length > 0) {
2846
+ const updatedCtx = await taskContext.load(args.task_id);
2847
+ if (updatedCtx) {
2848
+ updatedCtx.ood_solid_findings = solidFindings;
2849
+ updatedCtx.backend_implementation_findings = backendFindings;
2850
+ await taskContext.save(updatedCtx);
2851
+ }
2852
+ }
2636
2853
  // 决策契约 advisory: 校验 review 输出
2637
2854
  const decisionContract = (await lazyDecision()).validateDecisionOutput(result);
2638
2855
  const reviewExtras = {};
2639
2856
  if (!decisionContract.passed) {
2640
2857
  reviewExtras.decision_contract_advisory = decisionContract.advisory;
2641
2858
  }
2859
+ if (solidFindings.length > 0)
2860
+ reviewExtras.ood_solid_findings = solidFindings;
2861
+ if (backendFindings.length > 0)
2862
+ reviewExtras.backend_implementation_findings = backendFindings;
2863
+ if (oodModule.hasBlockingSolidFindings(solidFindings) || backendModule.hasBlockingBackendFindings(backendFindings)) {
2864
+ reviewExtras.delivery_blocked = true;
2865
+ reviewExtras.diagnostic_code = "SF-IMPLEMENTATION-CONTRACT-REVIEW-BLOCKED";
2866
+ }
2642
2867
  return { result: Object.keys(reviewExtras).length > 0 ? { ...result, ...reviewExtras } : result };
2643
2868
  });
2644
2869
  // ── sf_scaffold: 生成标准化代码骨架 ──
@@ -2791,6 +3016,29 @@ export async function registerTools(server, deps) {
2791
3016
  },
2792
3017
  };
2793
3018
  }
3019
+ // 问题六十六/六十七: 审查或验证阶段产生的工程硬失败不得进入交付。
3020
+ const oodModule = await lazyOodSolid();
3021
+ if (oodModule.hasBlockingSolidFindings(ctx.ood_solid_findings ?? [])) {
3022
+ return {
3023
+ result: {
3024
+ error: "OOD/SOLID 契约仍存在硬失败,不得交付",
3025
+ diagnostic_code: "SF-OOD-6602",
3026
+ findings: ctx.ood_solid_findings,
3027
+ recovery: "按 finding 修复职责或依赖边界,并重新执行 sf_review 与 sf_verify",
3028
+ },
3029
+ };
3030
+ }
3031
+ const backendModule = await lazyBackendImplementation();
3032
+ if (backendModule.hasBlockingBackendFindings(ctx.backend_implementation_findings ?? [])) {
3033
+ return {
3034
+ result: {
3035
+ error: "后端实现工程契约仍存在硬失败,不得交付",
3036
+ diagnostic_code: "SF-BACKEND-6702",
3037
+ findings: ctx.backend_implementation_findings,
3038
+ recovery: "按 finding 修复后端边界、安全或一致性问题,并重新执行 sf_review 与 sf_verify",
3039
+ },
3040
+ };
3041
+ }
2794
3042
  // 产物状态门控: deliver 需要产物状态为 accepted 且有证据
2795
3043
  if (ctx.artifact_output) {
2796
3044
  const status = ctx.artifact_output.status;
@@ -3463,5 +3711,43 @@ export async function registerTools(server, deps) {
3463
3711
  result: { text: lines.join("\n") },
3464
3712
  };
3465
3713
  });
3714
+ // ── sf_navigation: 工作流导航 — 问题六十五 ──
3715
+ const NavigationSchema = {
3716
+ type: "object",
3717
+ properties: {
3718
+ project_path: { type: "string", description: "项目路径(可选,默认当前目录)" },
3719
+ },
3720
+ required: [],
3721
+ };
3722
+ registerSafeTool("sf_navigation", "查询工作流导航: 当前项目阶段、任务阶段、下一步操作和禁止操作。用于\"下一步\"\"继续\"\"现在能写代码吗\"等模糊推进意图。不得靠模型经验回答,必须调用此工具获取真实导航状态", NavigationSchema, async (args) => {
3723
+ const projectPath = args.project_path || config._projectPath || process.cwd();
3724
+ const { planNextAction } = await import("../../engine/next_action_planner.js");
3725
+ const plan = await planNextAction(projectPath);
3726
+ return {
3727
+ result: {
3728
+ project_stage: plan.project_stage,
3729
+ task_stage: plan.task_stage,
3730
+ current_task_id: plan.current_task_id,
3731
+ confidence: plan.confidence,
3732
+ stage_evidence: plan.stage_evidence,
3733
+ blocking_reasons: plan.blocking_reasons,
3734
+ stale_task: plan.stale_task,
3735
+ work_package: plan.work_package ? {
3736
+ id: plan.work_package.id,
3737
+ goal_zh: plan.work_package.goal_zh,
3738
+ description_zh: plan.work_package.description_zh,
3739
+ action: plan.work_package.action,
3740
+ tool_name: plan.work_package.tool_name,
3741
+ must_read: plan.work_package.must_read,
3742
+ forbidden_changes: plan.work_package.forbidden_changes,
3743
+ expected_outputs: plan.work_package.expected_outputs,
3744
+ acceptance_commands: plan.work_package.acceptance_commands,
3745
+ } : null,
3746
+ disallowed_actions: plan.disallowed_actions,
3747
+ recommended_commands: plan.recommended_commands,
3748
+ recommended_prompt_zh: plan.recommended_prompt_zh,
3749
+ },
3750
+ };
3751
+ });
3466
3752
  }
3467
3753
  //# sourceMappingURL=tools.js.map