soloforge 1.3.2 → 1.3.4
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/README.md +14 -0
- package/dist/adapters/claude_code/server.js +1 -1
- package/dist/adapters/claude_code/server.js.map +1 -1
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +385 -15
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/shared/workflow_template.d.ts.map +1 -1
- package/dist/adapters/shared/workflow_template.js +3 -2
- package/dist/adapters/shared/workflow_template.js.map +1 -1
- package/dist/bin/soloforge.d.ts.map +1 -1
- package/dist/bin/soloforge.js +296 -1
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/asset_manifest.d.ts.map +1 -1
- package/dist/engine/asset_manifest.js +24 -0
- package/dist/engine/asset_manifest.js.map +1 -1
- package/dist/engine/backend_implementation_contract.d.ts +51 -0
- package/dist/engine/backend_implementation_contract.d.ts.map +1 -0
- package/dist/engine/backend_implementation_contract.js +142 -0
- package/dist/engine/backend_implementation_contract.js.map +1 -0
- package/dist/engine/code_maintainability_observability_contract.d.ts +74 -0
- package/dist/engine/code_maintainability_observability_contract.d.ts.map +1 -0
- package/dist/engine/code_maintainability_observability_contract.js +473 -0
- package/dist/engine/code_maintainability_observability_contract.js.map +1 -0
- package/dist/engine/config_write_boundary.d.ts +29 -0
- package/dist/engine/config_write_boundary.d.ts.map +1 -0
- package/dist/engine/config_write_boundary.js +69 -0
- package/dist/engine/config_write_boundary.js.map +1 -0
- package/dist/engine/consumable_asset_registry.d.ts.map +1 -1
- package/dist/engine/consumable_asset_registry.js +182 -1
- package/dist/engine/consumable_asset_registry.js.map +1 -1
- package/dist/engine/diagnostic_registry.d.ts +12 -0
- package/dist/engine/diagnostic_registry.d.ts.map +1 -1
- package/dist/engine/diagnostic_registry.js +62 -0
- package/dist/engine/diagnostic_registry.js.map +1 -1
- package/dist/engine/dual_layer_mechanism_registry.d.ts.map +1 -1
- package/dist/engine/dual_layer_mechanism_registry.js +318 -1
- package/dist/engine/dual_layer_mechanism_registry.js.map +1 -1
- package/dist/engine/explicit_asset_registry.d.ts.map +1 -1
- package/dist/engine/explicit_asset_registry.js +338 -0
- package/dist/engine/explicit_asset_registry.js.map +1 -1
- package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
- package/dist/engine/implementation_roadmap_registry.js +112 -2
- package/dist/engine/implementation_roadmap_registry.js.map +1 -1
- package/dist/engine/knowledge_governance_gate.d.ts +38 -0
- package/dist/engine/knowledge_governance_gate.d.ts.map +1 -0
- package/dist/engine/knowledge_governance_gate.js +123 -0
- package/dist/engine/knowledge_governance_gate.js.map +1 -0
- package/dist/engine/log_governance.d.ts +25 -0
- package/dist/engine/log_governance.d.ts.map +1 -0
- package/dist/engine/log_governance.js +76 -0
- package/dist/engine/log_governance.js.map +1 -0
- package/dist/engine/mechanism_contract_registry.d.ts +1 -0
- package/dist/engine/mechanism_contract_registry.d.ts.map +1 -1
- package/dist/engine/mechanism_contract_registry.js +172 -0
- package/dist/engine/mechanism_contract_registry.js.map +1 -1
- package/dist/engine/mechanism_health_check.d.ts +23 -0
- package/dist/engine/mechanism_health_check.d.ts.map +1 -0
- package/dist/engine/mechanism_health_check.js +140 -0
- package/dist/engine/mechanism_health_check.js.map +1 -0
- package/dist/engine/next_action_planner.d.ts +19 -0
- package/dist/engine/next_action_planner.d.ts.map +1 -0
- package/dist/engine/next_action_planner.js +453 -0
- package/dist/engine/next_action_planner.js.map +1 -0
- package/dist/engine/observability.js +1 -1
- package/dist/engine/observability.js.map +1 -1
- package/dist/engine/ood_solid_contract.d.ts +51 -0
- package/dist/engine/ood_solid_contract.d.ts.map +1 -0
- package/dist/engine/ood_solid_contract.js +115 -0
- package/dist/engine/ood_solid_contract.js.map +1 -0
- package/dist/engine/project_stage_detector.d.ts +17 -0
- package/dist/engine/project_stage_detector.d.ts.map +1 -0
- package/dist/engine/project_stage_detector.js +185 -0
- package/dist/engine/project_stage_detector.js.map +1 -0
- package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -1
- package/dist/engine/release_issue_scenario_registry.js +230 -1
- package/dist/engine/release_issue_scenario_registry.js.map +1 -1
- package/dist/engine/release_readiness_gate.d.ts +3 -0
- package/dist/engine/release_readiness_gate.d.ts.map +1 -1
- package/dist/engine/release_readiness_gate.js +407 -9
- package/dist/engine/release_readiness_gate.js.map +1 -1
- package/dist/engine/stale_current_task_detector.d.ts +30 -0
- package/dist/engine/stale_current_task_detector.d.ts.map +1 -0
- package/dist/engine/stale_current_task_detector.js +168 -0
- package/dist/engine/stale_current_task_detector.js.map +1 -0
- package/dist/engine/task_stage_detector.d.ts +19 -0
- package/dist/engine/task_stage_detector.d.ts.map +1 -0
- package/dist/engine/task_stage_detector.js +201 -0
- package/dist/engine/task_stage_detector.js.map +1 -0
- package/dist/engine/team_awareness.js +6 -6
- package/dist/engine/team_awareness.js.map +1 -1
- package/dist/engine/tool_invocation_contract_registry.d.ts.map +1 -1
- package/dist/engine/tool_invocation_contract_registry.js +10 -0
- package/dist/engine/tool_invocation_contract_registry.js.map +1 -1
- package/dist/engine/workflow_navigation_contract.d.ts +115 -0
- package/dist/engine/workflow_navigation_contract.d.ts.map +1 -0
- package/dist/engine/workflow_navigation_contract.js +39 -0
- package/dist/engine/workflow_navigation_contract.js.map +1 -0
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- 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
- package/templates/knowledge/acceptance_templates//344/273/243/347/240/201/346/263/250/351/207/212/344/270/216/346/227/245/345/277/227/351/252/214/346/224/266/346/250/241/346/235/277.md +78 -0
- 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
- package/templates/knowledge/procedures/OOD/350/256/276/350/256/241/345/267/245/344/275/234/346/265/201.md +50 -0
- 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
- 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
- package/templates/knowledge/review//344/273/243/347/240/201/345/217/257/347/273/264/346/212/244/346/200/247/344/270/216/345/217/257/350/247/202/346/265/213/346/200/247/345/256/241/346/237/245.md +81 -0
- 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
- 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
- package/templates/knowledge/rules/OOD/344/270/216SOLID/350/256/276/350/256/241/350/247/204/345/210/231.md +62 -0
- package/templates/knowledge/rules//344/273/243/347/240/201/346/263/250/351/207/212/344/270/216/346/227/245/345/277/227/345/245/221/347/272/246/350/247/204/345/210/231.md +121 -0
- 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
- 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
- package/templates/knowledge/rules//346/225/217/346/204/237/344/277/241/346/201/257/346/227/245/345/277/227/350/247/204/345/210/231.md +69 -0
- package/templates/knowledge/rules//346/227/245/345/277/227/346/262/273/347/220/206/350/247/204/345/210/231.md +49 -0
- package/templates/knowledge/rules//346/234/272/345/210/266/350/207/252/346/262/273/347/220/206/350/247/204/345/210/231.md +48 -0
- 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
- 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
- package/templates/knowledge/rules//347/237/245/350/257/206/346/262/273/347/220/206/350/247/204/345/210/231.md +50 -0
- 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
- package/templates/knowledge/rules//351/205/215/347/275/256/350/220/275/347/233/230/350/276/271/347/225/214/350/247/204/345/210/231.md +47 -0
- 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
- package/templates/patterns/SOLID/350/256/276/350/256/241/350/247/204/350/214/203.md +39 -0
- 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
|
@@ -8,6 +8,15 @@ AI 编程助手的项目工作流配置器。SoloForge 帮你把 Claude Code、C
|
|
|
8
8
|
- 你希望每个项目都有稳定的 AI 工作流规则,而不是每次从零解释。
|
|
9
9
|
- 你希望 AI 修改代码前先理解项目边界,生成产物时不要误改源码。
|
|
10
10
|
- 你希望配置可以自动推断,但不要在低置信度时乱写项目配置。
|
|
11
|
+
- 你希望 AI 写业务代码时能遵守必要注释、结构化日志、敏感信息脱敏和交付复验要求。
|
|
12
|
+
|
|
13
|
+
## 核心能力
|
|
14
|
+
|
|
15
|
+
- **下一步导航**: `soloforge next` 会根据当前阶段、阻断项和已有证据提示下一步,而不是只报告状态。
|
|
16
|
+
- **设计产物包审计**: 架构、数据库、API、OpenAPI、SQL/migration 和一致性报告按统一合同审计,避免文档之间漂移。
|
|
17
|
+
- **工程实现契约**: 编码阶段会约束 OOD/SOLID、Controller 入参出参、参数校验、事务、幂等、权限、日志和错误处理等实现细节。
|
|
18
|
+
- **注释与日志治理**: 关键业务规则、状态变更、支付/权限/安全路径、异常处理和迁移脚本需要可定位日志或必要注释;敏感信息不得进入日志。
|
|
19
|
+
- **长期机制化门禁**: SoloForge 自身发布前会检查机制消费链路、知识治理、配置落盘边界、日志治理和诊断码集中注册,防止只靠文档或测试自证。
|
|
11
20
|
|
|
12
21
|
## 最短成功路径
|
|
13
22
|
|
|
@@ -75,6 +84,8 @@ SoloForge 不会覆盖已有知识文件。重新运行 `soloforge init` 可刷
|
|
|
75
84
|
```bash
|
|
76
85
|
soloforge validate # 检查项目配置和知识文件
|
|
77
86
|
soloforge status # 查看当前项目状态和配置来源
|
|
87
|
+
soloforge next # 查看当前阶段、阻断项和下一步可执行工作包
|
|
88
|
+
soloforge stage # 查看项目阶段与当前任务阶段
|
|
78
89
|
soloforge config resolve # 查看配置解析结果和来源
|
|
79
90
|
soloforge config explain # 解释某项配置为什么是当前值
|
|
80
91
|
soloforge version # 查看版本
|
|
@@ -153,6 +164,9 @@ soloforge migrate --apply --confirm # 确认后迁移
|
|
|
153
164
|
- **施工指令约束** — AI 写代码前必须先明确目标、范围、非目标和验收标准,不会跳过定义直接动手写实现。
|
|
154
165
|
- **证据驱动** — AI 不得无证据声称项目事实。默认模板和通用规则不算项目证据;架构分析必须有真实代码依据或你的人工确认。
|
|
155
166
|
- **存量设计复验** — 升级 SoloForge 后,已有架构/数据库/API 文档不会被默认信任。运行 `soloforge audit-design-artifacts` 可得到差距报告;需要升级时先 dry-run,再经 `--apply --confirm` 归档旧文件并写入升级契约,修订后的文档必须重新复验。
|
|
167
|
+
- **下一步导航** — 不确定接下来该做什么时,运行 `soloforge next`,或向 AI 直接说“下一步/继续/现在能写代码吗”。SoloForge 会依据配置、设计验收、当前任务、修复指令和验证证据输出阶段、阻断原因与工作包;陈旧任务不会被静默绕过。
|
|
168
|
+
- **OOD 与 SOLID 编码约束** — 复杂业务、领域服务、策略和重构类实现会先要求对象职责、接口与依赖方向摘要;代码审查可识别职责膨胀、直接依赖基础设施、宽接口和替换违约。文案或简单配置修改不会被强行复杂化。
|
|
169
|
+
- **后端实现工程约束** — 实现后端接口前会要求 DTO/校验、响应与分页、事务与幂等、安全审计、OpenAPI/数据库对齐和测试证据;实体泄漏、写接口无校验、事务内外调、关键写入无幂等或敏感接口无安全证据会阻断交付。
|
|
156
170
|
- **日志清晰** — 用户可见输出中文优先;JSON 模式(`--json`)输出保持纯 JSON,不混入内部日志。
|
|
157
171
|
- 写代码类任务会更明确 scope、验收项和验证命令。
|
|
158
172
|
- 生成文档、提取说明、分析日志等产物型任务会默认输出到 `.soloforge/output/`,不会默认修改 `src/`。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/adapters/claude_code/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI3C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC7D,MAAM,UAAU,GAAW,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAmBxH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAgB;IAC9C,KAAK,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IACxC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAErD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,UAAU;KACpB,CAAC,CAAC;IAEH,MAAM,aAAa,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IAErE,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,YAAY;YAAE,OAAO;QACzB,YAAY,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,IAAI,cAAc;gBAAE,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;YACjD,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/adapters/claude_code/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI3C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC7D,MAAM,UAAU,GAAW,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAmBxH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAgB;IAC9C,KAAK,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IACxC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAErD,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,UAAU;KACpB,CAAC,CAAC;IAEH,MAAM,aAAa,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;IAErE,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEhC,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,IAAI,YAAY;YAAE,OAAO;QACzB,YAAY,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC;YACH,IAAI,cAAc;gBAAE,MAAM,cAAc,CAAC,KAAK,EAAE,CAAC;YACjD,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QAC5B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,8BAA8B;IAC9B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;QACzB,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC,CAAC;IAEH,sCAAsC;IACtC,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;QACtC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;QACtC,yBAAyB;QACzB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IACH,4BAA4B;IAC5B,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE;QAC1C,YAAY,CAAC,QAAQ,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;QACnD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/tools.ts"],"names":[],"mappings":"AAKA,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;AAiF3D;;;;;;;GAOG;AAEH;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,aAAa;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc;IACd,cAAc,EAAE,qBAAqB,CAAC;IACtC,eAAe;IACf,WAAW,EAAE,kBAAkB,CAAC;IAChC,yDAAyD;IACzD,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import crypto from "node:crypto";
|
|
|
6
6
|
import { verifyArtifact } from "../../engine/artifact_contract_registry.js";
|
|
7
7
|
import { verifyRouteDecisionContract } from "../../engine/route_decision_contract_verifier.js";
|
|
8
8
|
import { findToolInvocationContractByName, createToolTrace, validateToolInvocation, hasWriteSideEffect, } from "../../engine/tool_invocation_contract_registry.js";
|
|
9
|
+
import { TOOL_DIAGNOSTIC_CODES } from "../../engine/diagnostic_registry.js";
|
|
9
10
|
function createLazy(loader) {
|
|
10
11
|
let mod = { loaded: null, promise: null };
|
|
11
12
|
return () => {
|
|
@@ -38,7 +39,6 @@ const lazyDebugger = createLazy(() => import("../../engine/debugger.js"));
|
|
|
38
39
|
const lazyObservability = createLazy(() => import("../../engine/observability.js"));
|
|
39
40
|
const lazyGovernance = createLazy(() => import("../../engine/governance_report.js"));
|
|
40
41
|
const lazyMigration = createLazy(() => import("../../engine/migration_guard.js"));
|
|
41
|
-
const lazyPlanGate = createLazy(() => import("../../engine/plan_proposal_gate.js"));
|
|
42
42
|
const lazyTestGen = createLazy(() => import("../../engine/test_generator.js"));
|
|
43
43
|
const lazyTestQuality = createLazy(() => import("../../engine/test_quality.js"));
|
|
44
44
|
const lazyDepScan = createLazy(() => import("../../engine/dependency_scanner.js"));
|
|
@@ -59,7 +59,6 @@ const lazyCapState = createLazy(() => import("../../engine/capability_state_stor
|
|
|
59
59
|
const lazyMainPath = createLazy(() => import("../../engine/main_path_integration_contract.js"));
|
|
60
60
|
const lazyDualLayer = createLazy(() => import("../../engine/dual_layer_mechanism_registry.js"));
|
|
61
61
|
const lazyInputMaterial = createLazy(() => import("../../engine/input_material_contract_registry.js"));
|
|
62
|
-
const lazyConfigCmd = createLazy(() => import("../../bin/config_commands.js"));
|
|
63
62
|
const lazyConfigPrecedence = createLazy(() => import("../../engine/config_precedence_contract.js"));
|
|
64
63
|
const lazyEnforcementGuard = createLazy(() => import("../../engine/enforcement_guard.js"));
|
|
65
64
|
const lazyWorkspaceLease = createLazy(() => import("../../engine/workspace_lease.js"));
|
|
@@ -67,8 +66,6 @@ const lazyDeliveryReadiness = createLazy(() => import("../../engine/delivery_rea
|
|
|
67
66
|
const lazyVerificationContract = createLazy(() => import("../../engine/verification_contract.js"));
|
|
68
67
|
const lazyFailureReport = createLazy(() => import("../../engine/failure_report.js"));
|
|
69
68
|
const lazyDegradation = createLazy(() => import("../../engine/degradation.js"));
|
|
70
|
-
const lazyRetentionPolicy = createLazy(() => import("../../engine/retention_policy.js"));
|
|
71
|
-
const lazyDiagnosticRegistry = createLazy(() => import("../../engine/diagnostic_registry.js"));
|
|
72
69
|
const lazyArchitectureDesign = createLazy(() => import("../../engine/architecture_design_contract.js"));
|
|
73
70
|
const lazyExistingSystemAnalysis = createLazy(() => import("../../engine/existing_system_analysis.js"));
|
|
74
71
|
const lazyCodingReadiness = createLazy(() => import("../../engine/coding_readiness_gate.js"));
|
|
@@ -81,8 +78,11 @@ const lazyBrainstormContract = createLazy(() => import("../../engine/brainstorm_
|
|
|
81
78
|
const lazyArchitectureWorkshop = createLazy(() => import("../../engine/architecture_decision_workshop.js"));
|
|
82
79
|
const lazyDesignArtifactPack = createLazy(() => import("../../engine/design_artifact_pack.js"));
|
|
83
80
|
const lazyStandardAssetContract = createLazy(() => import("../../engine/standard_asset_contract.js"));
|
|
84
|
-
const lazyTemplateVisibility = createLazy(() => import("../../engine/template_asset_visibility.js"));
|
|
85
81
|
const lazyDecisionWorkshop = createLazy(() => import("../../engine/decision_workshop.js"));
|
|
82
|
+
const lazyNavigation = createLazy(() => import("../../engine/next_action_planner.js"));
|
|
83
|
+
const lazyOodSolid = createLazy(() => import("../../engine/ood_solid_contract.js"));
|
|
84
|
+
const lazyBackendImplementation = createLazy(() => import("../../engine/backend_implementation_contract.js"));
|
|
85
|
+
const lazyCodeObservability = createLazy(() => import("../../engine/code_maintainability_observability_contract.js"));
|
|
86
86
|
// ── Zod Schema 定义 ──
|
|
87
87
|
const ClassifySchema = {
|
|
88
88
|
intent: z.string().describe("开发者意图描述"),
|
|
@@ -95,6 +95,9 @@ const ExpandSchema = {
|
|
|
95
95
|
architecture_decision_workshop: z.unknown().optional().describe("架构设计前已讨论并确认的六域决策记录"),
|
|
96
96
|
decision_workshop: z.unknown().optional().describe("通用决策研讨合同(技术选型/数据迁移/安全策略/部署/重构/第三方集成等)"),
|
|
97
97
|
design_artifact_pack: z.unknown().optional().describe("设计产物包路径映射或已复验状态"),
|
|
98
|
+
ood_solid_summary: z.unknown().optional().describe("复杂编码任务的 OOD/SOLID 设计摘要"),
|
|
99
|
+
backend_implementation_work_package: z.unknown().optional().describe("后端接口实现的工程工作包"),
|
|
100
|
+
code_observability_work_package: z.unknown().optional().describe("代码可维护性与可观测性工作包"),
|
|
98
101
|
};
|
|
99
102
|
const VerifySchema = {
|
|
100
103
|
task_id: z.string().describe("任务 ID"),
|
|
@@ -235,7 +238,7 @@ export function checkWriteToolPlanGate(params) {
|
|
|
235
238
|
if (!params.ctx || !params.ctx.plan_proposal_gate) {
|
|
236
239
|
return {
|
|
237
240
|
allowed: false,
|
|
238
|
-
diagnostic_code:
|
|
241
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.planGate,
|
|
239
242
|
violation_type: "guard_blocked",
|
|
240
243
|
reason: `工具 ${params.toolName} 执行前缺少 Plan Proposal Gate`,
|
|
241
244
|
};
|
|
@@ -782,7 +785,7 @@ export async function assessCepForRepairReverify(params) {
|
|
|
782
785
|
*/
|
|
783
786
|
export async function assessCepForUserFeedback(params) {
|
|
784
787
|
const cepModule = await import("../../engine/core_experience_principle.js");
|
|
785
|
-
|
|
788
|
+
const cep = cepModule.evaluateUserVisibleOutput({
|
|
786
789
|
has_conclusion_first: params.has_conclusion_first,
|
|
787
790
|
has_clear_summary: params.has_clear_summary,
|
|
788
791
|
has_actionable_next_step: params.has_actionable_next_step,
|
|
@@ -790,6 +793,22 @@ export async function assessCepForUserFeedback(params) {
|
|
|
790
793
|
hides_critical_failure: params.hides_critical_failure,
|
|
791
794
|
chinese_semantic_first: params.chinese_semantic_first,
|
|
792
795
|
});
|
|
796
|
+
const logGov = await import("../../engine/log_governance.js");
|
|
797
|
+
const logReport = logGov.evaluateFeedbackOutputQuality({
|
|
798
|
+
output: [
|
|
799
|
+
params.has_conclusion_first ? "结论优先" : "缺少结论",
|
|
800
|
+
params.has_clear_summary ? "摘要清晰" : "摘要不足",
|
|
801
|
+
params.has_actionable_next_step ? "下一步明确" : "下一步缺失",
|
|
802
|
+
].join(";"),
|
|
803
|
+
critical_failure_hidden: params.hides_critical_failure,
|
|
804
|
+
});
|
|
805
|
+
return {
|
|
806
|
+
passed: cep.passed && logReport.passed,
|
|
807
|
+
issues_zh: [
|
|
808
|
+
...cep.issues_zh,
|
|
809
|
+
...logReport.findings.map((f) => f.message_zh),
|
|
810
|
+
],
|
|
811
|
+
};
|
|
793
812
|
}
|
|
794
813
|
/**
|
|
795
814
|
* 注册所有 MCP 工具到服务器实例。
|
|
@@ -977,7 +996,7 @@ export async function registerTools(server, deps) {
|
|
|
977
996
|
content: [{ type: "text", text: JSON.stringify({
|
|
978
997
|
error: planViolation.reason,
|
|
979
998
|
violation: planViolation,
|
|
980
|
-
diagnostic_code: pgResult.diagnostic_code ??
|
|
999
|
+
diagnostic_code: pgResult.diagnostic_code ?? TOOL_DIAGNOSTIC_CODES.planGate,
|
|
981
1000
|
recovery: planViolation.recovery,
|
|
982
1001
|
}) }],
|
|
983
1002
|
isError: true,
|
|
@@ -1003,7 +1022,7 @@ export async function registerTools(server, deps) {
|
|
|
1003
1022
|
content: [{ type: "text", text: JSON.stringify({
|
|
1004
1023
|
error: planViolation.reason,
|
|
1005
1024
|
violation: planViolation,
|
|
1006
|
-
diagnostic_code:
|
|
1025
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.planGate,
|
|
1007
1026
|
recovery: planViolation.recovery,
|
|
1008
1027
|
}) }],
|
|
1009
1028
|
isError: true,
|
|
@@ -1032,7 +1051,7 @@ export async function registerTools(server, deps) {
|
|
|
1032
1051
|
content: [{ type: "text", text: JSON.stringify({
|
|
1033
1052
|
error: instrViolation.reason,
|
|
1034
1053
|
violation: instrViolation,
|
|
1035
|
-
diagnostic_code: instrResult.diagnostic_code ??
|
|
1054
|
+
diagnostic_code: instrResult.diagnostic_code ?? TOOL_DIAGNOSTIC_CODES.instructionContract,
|
|
1036
1055
|
recovery: instrViolation.recovery,
|
|
1037
1056
|
}) }],
|
|
1038
1057
|
isError: true,
|
|
@@ -1250,9 +1269,33 @@ export async function registerTools(server, deps) {
|
|
|
1250
1269
|
debug("工具注册", "批量注册核心/辅助/知识维护工具...");
|
|
1251
1270
|
// ── sf_classify: 意图分类入口,创建任务上下文并返回分类结果 ──
|
|
1252
1271
|
registerSafeTool("sf_classify", "分析开发者意图,返回任务类型、风险、复杂度和执行策略", ClassifySchema, async (args) => {
|
|
1272
|
+
const asksForNavigation = /(?:下一步|继续(?:做|执行|开发)?|现在(?:可以|能)(?:开始)?(?:写代码|编码|开发|测试|交付)|接下来(?:做什么|该做什么)|该(?:做什么|怎么继续))/i.test(args.intent);
|
|
1273
|
+
if (asksForNavigation) {
|
|
1274
|
+
const navigation = await (await lazyNavigation()).planNextAction(projectPath);
|
|
1275
|
+
return {
|
|
1276
|
+
result: {
|
|
1277
|
+
status: "navigation_required",
|
|
1278
|
+
reason_zh: "检测到阶段推进意图,必须先依据 SoloForge 状态规划下一步",
|
|
1279
|
+
navigation,
|
|
1280
|
+
},
|
|
1281
|
+
};
|
|
1282
|
+
}
|
|
1253
1283
|
// 检查是否存在进行中的任务
|
|
1254
1284
|
const existing = await taskContext.getCurrentTask();
|
|
1255
1285
|
if (existing && !["done", "failed"].includes(existing.status)) {
|
|
1286
|
+
const navigation = await (await lazyNavigation()).planNextAction(projectPath);
|
|
1287
|
+
if (navigation.stale_task?.is_stale) {
|
|
1288
|
+
return {
|
|
1289
|
+
result: {
|
|
1290
|
+
status: "stale_task_requires_resolution",
|
|
1291
|
+
error: "存在陈旧任务指针,必须先选择恢复、归档或开始新任务",
|
|
1292
|
+
existing_task_id: existing.task_id,
|
|
1293
|
+
existing_status: existing.status,
|
|
1294
|
+
navigation,
|
|
1295
|
+
hint: "先调用 sf_navigation 查看可执行处理步骤,不得绕过 SoloForge 状态直接分析或编码",
|
|
1296
|
+
},
|
|
1297
|
+
};
|
|
1298
|
+
}
|
|
1256
1299
|
return {
|
|
1257
1300
|
result: {
|
|
1258
1301
|
error: "存在未完成的任务",
|
|
@@ -1295,7 +1338,17 @@ export async function registerTools(server, deps) {
|
|
|
1295
1338
|
if (args.design_artifact_pack) {
|
|
1296
1339
|
ctx.design_artifact_pack = args.design_artifact_pack;
|
|
1297
1340
|
}
|
|
1298
|
-
if (args.
|
|
1341
|
+
if (args.ood_solid_summary) {
|
|
1342
|
+
ctx.ood_solid_summary = args.ood_solid_summary;
|
|
1343
|
+
}
|
|
1344
|
+
if (args.backend_implementation_work_package) {
|
|
1345
|
+
ctx.backend_implementation_work_package = args.backend_implementation_work_package;
|
|
1346
|
+
}
|
|
1347
|
+
if (args.code_observability_work_package) {
|
|
1348
|
+
ctx.code_observability_work_package = args.code_observability_work_package;
|
|
1349
|
+
}
|
|
1350
|
+
if (args.architecture_decision_workshop || args.decision_workshop || args.design_artifact_pack
|
|
1351
|
+
|| args.ood_solid_summary || args.backend_implementation_work_package || args.code_observability_work_package) {
|
|
1299
1352
|
await taskContext.save(ctx);
|
|
1300
1353
|
}
|
|
1301
1354
|
// 状态守卫:classifying/expanding/clarifying → expanding
|
|
@@ -1668,6 +1721,82 @@ export async function registerTools(server, deps) {
|
|
|
1668
1721
|
};
|
|
1669
1722
|
}
|
|
1670
1723
|
}
|
|
1724
|
+
// 问题六十六: 复杂业务编码必须先具备对象职责、接口和依赖方向摘要。
|
|
1725
|
+
{
|
|
1726
|
+
const oodModule = await lazyOodSolid();
|
|
1727
|
+
const oodGate = oodModule.evaluateOodDesignGate({
|
|
1728
|
+
task_id: args.task_id,
|
|
1729
|
+
intent: ctx.intent,
|
|
1730
|
+
route: expansionRoute,
|
|
1731
|
+
summary: ctx.ood_solid_summary,
|
|
1732
|
+
});
|
|
1733
|
+
if (oodGate.applicable) {
|
|
1734
|
+
ctx.ood_solid_summary = oodGate.required_summary;
|
|
1735
|
+
await taskContext.save(ctx);
|
|
1736
|
+
}
|
|
1737
|
+
if (!oodGate.allowed) {
|
|
1738
|
+
return {
|
|
1739
|
+
result: {
|
|
1740
|
+
error: oodGate.reason_zh,
|
|
1741
|
+
status: "awaiting_ood_design",
|
|
1742
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.oodMissingSummary,
|
|
1743
|
+
ood_solid_summary: oodGate.required_summary,
|
|
1744
|
+
recovery: "请确认对象职责、接口边界、依赖方向、变化点和 SOLID 风险后重新调用 sf_expand",
|
|
1745
|
+
},
|
|
1746
|
+
};
|
|
1747
|
+
}
|
|
1748
|
+
}
|
|
1749
|
+
// 问题六十七: 后端接口编码必须先确认工程边界与验收证据。
|
|
1750
|
+
{
|
|
1751
|
+
const backendModule = await lazyBackendImplementation();
|
|
1752
|
+
const backendGate = backendModule.evaluateBackendImplementationGate({
|
|
1753
|
+
task_id: args.task_id,
|
|
1754
|
+
intent: ctx.intent,
|
|
1755
|
+
route: expansionRoute,
|
|
1756
|
+
work_package: ctx.backend_implementation_work_package,
|
|
1757
|
+
});
|
|
1758
|
+
if (backendGate.applicable) {
|
|
1759
|
+
ctx.backend_implementation_work_package = backendGate.work_package;
|
|
1760
|
+
await taskContext.save(ctx);
|
|
1761
|
+
}
|
|
1762
|
+
if (!backendGate.allowed) {
|
|
1763
|
+
return {
|
|
1764
|
+
result: {
|
|
1765
|
+
error: backendGate.reason_zh,
|
|
1766
|
+
status: "awaiting_backend_contract",
|
|
1767
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.backendMissingSummary,
|
|
1768
|
+
backend_implementation_work_package: backendGate.work_package,
|
|
1769
|
+
recovery: "请补齐 DTO/校验、事务一致性、安全审计、契约对齐与测试证据后重新调用 sf_expand",
|
|
1770
|
+
},
|
|
1771
|
+
};
|
|
1772
|
+
}
|
|
1773
|
+
}
|
|
1774
|
+
// 问题六十八: 业务编码必须确认代码可维护性与可观测性约束。
|
|
1775
|
+
{
|
|
1776
|
+
const obsModule = await lazyCodeObservability();
|
|
1777
|
+
const obsGate = obsModule.evaluateCodeObservabilityGate({
|
|
1778
|
+
task_id: args.task_id,
|
|
1779
|
+
intent: ctx.intent,
|
|
1780
|
+
route: expansionRoute,
|
|
1781
|
+
changed_files: ctx.execution?.changed_files,
|
|
1782
|
+
work_package: ctx.code_observability_work_package,
|
|
1783
|
+
});
|
|
1784
|
+
if (obsGate.applicable) {
|
|
1785
|
+
ctx.code_observability_work_package = obsGate.work_package;
|
|
1786
|
+
await taskContext.save(ctx);
|
|
1787
|
+
}
|
|
1788
|
+
if (!obsGate.allowed) {
|
|
1789
|
+
return {
|
|
1790
|
+
result: {
|
|
1791
|
+
error: obsGate.reason_zh,
|
|
1792
|
+
status: "awaiting_code_observability_contract",
|
|
1793
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.codeObservabilityWorkPackage,
|
|
1794
|
+
code_observability_work_package: obsGate.work_package,
|
|
1795
|
+
recovery: "请确认必要注释、结构化日志、敏感信息脱敏和项目 logger 使用后重新调用 sf_expand",
|
|
1796
|
+
},
|
|
1797
|
+
};
|
|
1798
|
+
}
|
|
1799
|
+
}
|
|
1671
1800
|
// Input Material Contract: 处理 hard-blocking 结果
|
|
1672
1801
|
// Privacy Gate: 隐私/敏感信息策略阻断
|
|
1673
1802
|
const isBlocked = expansion.prompt.startsWith("## 阻塞:输入材料禁止读取")
|
|
@@ -1872,6 +2001,121 @@ export async function registerTools(server, deps) {
|
|
|
1872
2001
|
result: { error: "任务不存在" },
|
|
1873
2002
|
};
|
|
1874
2003
|
}
|
|
2004
|
+
const implementationFiles = args.changed_files.filter((file) => /\.(?:ts|tsx|js|jsx|java|kt|cs|go|py)$/.test(file)
|
|
2005
|
+
&& !/(?:^|\/)tests?\//.test(file));
|
|
2006
|
+
if (implementationFiles.length > 0) {
|
|
2007
|
+
const implementationContents = {};
|
|
2008
|
+
for (const changedFile of implementationFiles) {
|
|
2009
|
+
const absoluteFile = path.resolve(projectPath, changedFile);
|
|
2010
|
+
try {
|
|
2011
|
+
if (absoluteFile.startsWith(`${path.resolve(projectPath)}${path.sep}`) && fss.statSync(absoluteFile).isFile()) {
|
|
2012
|
+
implementationContents[changedFile] = fss.readFileSync(absoluteFile, "utf-8");
|
|
2013
|
+
}
|
|
2014
|
+
}
|
|
2015
|
+
catch {
|
|
2016
|
+
// 文件缺失会由验证命令或现有产物检查报告。
|
|
2017
|
+
}
|
|
2018
|
+
}
|
|
2019
|
+
const oodModule = await lazyOodSolid();
|
|
2020
|
+
const oodGate = oodModule.evaluateOodDesignGate({
|
|
2021
|
+
task_id: args.task_id,
|
|
2022
|
+
intent: ctx.intent,
|
|
2023
|
+
route: ctx.expansion?.workflow_trace?.route,
|
|
2024
|
+
changed_files: implementationFiles,
|
|
2025
|
+
summary: ctx.ood_solid_summary,
|
|
2026
|
+
});
|
|
2027
|
+
if (!oodGate.allowed) {
|
|
2028
|
+
return {
|
|
2029
|
+
result: {
|
|
2030
|
+
error: oodGate.reason_zh,
|
|
2031
|
+
status: "blocked",
|
|
2032
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.oodMissingSummary,
|
|
2033
|
+
ood_solid_summary: oodGate.required_summary,
|
|
2034
|
+
recovery: "完成 OOD/SOLID 摘要后重新执行 sf_expand 与 sf_verify",
|
|
2035
|
+
},
|
|
2036
|
+
};
|
|
2037
|
+
}
|
|
2038
|
+
const backendModule = await lazyBackendImplementation();
|
|
2039
|
+
const backendGate = backendModule.evaluateBackendImplementationGate({
|
|
2040
|
+
task_id: args.task_id,
|
|
2041
|
+
intent: ctx.intent,
|
|
2042
|
+
route: ctx.expansion?.workflow_trace?.route,
|
|
2043
|
+
changed_files: implementationFiles,
|
|
2044
|
+
work_package: ctx.backend_implementation_work_package,
|
|
2045
|
+
});
|
|
2046
|
+
if (!backendGate.allowed) {
|
|
2047
|
+
return {
|
|
2048
|
+
result: {
|
|
2049
|
+
error: backendGate.reason_zh,
|
|
2050
|
+
status: "blocked",
|
|
2051
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.backendMissingSummary,
|
|
2052
|
+
backend_implementation_work_package: backendGate.work_package,
|
|
2053
|
+
recovery: "完成后端工程工作包后重新执行 sf_expand 与 sf_verify",
|
|
2054
|
+
},
|
|
2055
|
+
};
|
|
2056
|
+
}
|
|
2057
|
+
const solidFindings = oodGate.applicable ? oodModule.reviewSolidCode(implementationContents) : [];
|
|
2058
|
+
const backendFindings = backendGate.applicable ? backendModule.reviewBackendImplementationFiles(implementationContents) : [];
|
|
2059
|
+
if (backendGate.applicable) {
|
|
2060
|
+
const openApiPath = path.join(projectPath, "docs", "api", "openapi.yaml");
|
|
2061
|
+
const apiMarkdownPath = path.join(projectPath, "docs", "architecture", "03-API接口规格文档.md");
|
|
2062
|
+
const migrationDirectory = path.join(projectPath, "db", "migrations");
|
|
2063
|
+
const openapiText = fss.existsSync(openApiPath) ? fss.readFileSync(openApiPath, "utf-8") : undefined;
|
|
2064
|
+
const apiDocumentText = fss.existsSync(apiMarkdownPath) ? fss.readFileSync(apiMarkdownPath, "utf-8") : undefined;
|
|
2065
|
+
const migrationText = fss.existsSync(migrationDirectory)
|
|
2066
|
+
? fss.readdirSync(migrationDirectory).filter((name) => /\.sql$/i.test(name))
|
|
2067
|
+
.map((name) => fss.readFileSync(path.join(migrationDirectory, name), "utf-8")).join("\n")
|
|
2068
|
+
: undefined;
|
|
2069
|
+
backendFindings.push(...backendModule.verifyBackendArtifactAlignment({
|
|
2070
|
+
openapiText,
|
|
2071
|
+
apiDocumentText,
|
|
2072
|
+
migrationText,
|
|
2073
|
+
sourceFiles: implementationContents,
|
|
2074
|
+
}));
|
|
2075
|
+
}
|
|
2076
|
+
ctx.ood_solid_findings = solidFindings;
|
|
2077
|
+
ctx.backend_implementation_findings = backendFindings;
|
|
2078
|
+
await taskContext.save(ctx);
|
|
2079
|
+
if (oodModule.hasBlockingSolidFindings(solidFindings)) {
|
|
2080
|
+
return {
|
|
2081
|
+
result: {
|
|
2082
|
+
error: "OOD/SOLID 代码复验发现阻断项,需修复后重验",
|
|
2083
|
+
status: "blocked",
|
|
2084
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.oodDeliveryBlock,
|
|
2085
|
+
ood_solid_findings: solidFindings,
|
|
2086
|
+
},
|
|
2087
|
+
};
|
|
2088
|
+
}
|
|
2089
|
+
if (backendModule.hasBlockingBackendFindings(backendFindings)) {
|
|
2090
|
+
return {
|
|
2091
|
+
result: {
|
|
2092
|
+
error: "后端实现工程复验发现阻断项,需修复后重验",
|
|
2093
|
+
status: "blocked",
|
|
2094
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.backendDeliveryBlock,
|
|
2095
|
+
backend_implementation_findings: backendFindings,
|
|
2096
|
+
},
|
|
2097
|
+
};
|
|
2098
|
+
}
|
|
2099
|
+
// 问题六十八: 代码可维护性与可观测性契约
|
|
2100
|
+
const codeObsModule = await lazyCodeObservability();
|
|
2101
|
+
const obsFindings = codeObsModule.verifyChangedFilesObservability({
|
|
2102
|
+
changed_files: implementationFiles,
|
|
2103
|
+
file_contents: implementationContents,
|
|
2104
|
+
intent: ctx.intent,
|
|
2105
|
+
});
|
|
2106
|
+
ctx.code_observability_findings = obsFindings;
|
|
2107
|
+
await taskContext.save(ctx);
|
|
2108
|
+
if (codeObsModule.hasBlockingObservabilityFindings(obsFindings)) {
|
|
2109
|
+
return {
|
|
2110
|
+
result: {
|
|
2111
|
+
error: "代码可维护性/可观测性复验发现阻断项,需修复后重验",
|
|
2112
|
+
status: "blocked",
|
|
2113
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.codeObservabilityFinding,
|
|
2114
|
+
code_observability_findings: obsFindings,
|
|
2115
|
+
},
|
|
2116
|
+
};
|
|
2117
|
+
}
|
|
2118
|
+
}
|
|
1875
2119
|
// 问题六十二: 设计产物验证必须读取用户项目真实文件,不接受占位合同自证通过。
|
|
1876
2120
|
const verifyWorkflowIntent = ctx.route_decision?.workflow_intent ?? ctx.classification?.route_decision?.workflow_intent;
|
|
1877
2121
|
const touchesDesignArtifacts = args.changed_files.some((file) => /docs\/architecture\/|docs\/api\/|openapi|db\/(?:migrations|schema)|架构设计|数据库设计|API接口规格/i.test(file));
|
|
@@ -1961,7 +2205,7 @@ export async function registerTools(server, deps) {
|
|
|
1961
2205
|
result: {
|
|
1962
2206
|
error: `文件 ${changedFile} 模板契约验证未通过,进入修复重验闭环`,
|
|
1963
2207
|
status: "blocked",
|
|
1964
|
-
diagnostic_code:
|
|
2208
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.contractDraft,
|
|
1965
2209
|
template_contract_id: perFileContract.asset_id,
|
|
1966
2210
|
missing_fields: contractResult.missing_fields,
|
|
1967
2211
|
messages: contractResult.messages,
|
|
@@ -2252,8 +2496,8 @@ export async function registerTools(server, deps) {
|
|
|
2252
2496
|
if (args.plan_id !== currentPlan.plan_id) {
|
|
2253
2497
|
return {
|
|
2254
2498
|
result: {
|
|
2255
|
-
error: `plan_id 不匹配: 请求 "${args.plan_id}",当前任务计划 "${currentPlan.plan_id}" [
|
|
2256
|
-
diagnostic_code:
|
|
2499
|
+
error: `plan_id 不匹配: 请求 "${args.plan_id}",当前任务计划 "${currentPlan.plan_id}" [${TOOL_DIAGNOSTIC_CODES.verifyPlanMismatch}]`,
|
|
2500
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.verifyPlanMismatch,
|
|
2257
2501
|
},
|
|
2258
2502
|
};
|
|
2259
2503
|
}
|
|
@@ -2633,12 +2877,64 @@ export async function registerTools(server, deps) {
|
|
|
2633
2877
|
}, tracker);
|
|
2634
2878
|
result.task_id = args.task_id;
|
|
2635
2879
|
await taskContext.setCodeReview(args.task_id, result);
|
|
2880
|
+
const contractContents = { ...(args.file_contents ?? {}) };
|
|
2881
|
+
for (const changedFile of args.changed_files) {
|
|
2882
|
+
if (contractContents[changedFile] !== undefined)
|
|
2883
|
+
continue;
|
|
2884
|
+
const absoluteFile = path.resolve(projectPath, changedFile);
|
|
2885
|
+
try {
|
|
2886
|
+
if (absoluteFile.startsWith(`${path.resolve(projectPath)}${path.sep}`) && fss.statSync(absoluteFile).isFile()) {
|
|
2887
|
+
contractContents[changedFile] = fss.readFileSync(absoluteFile, "utf-8");
|
|
2888
|
+
}
|
|
2889
|
+
}
|
|
2890
|
+
catch {
|
|
2891
|
+
// 无法读取的文件留给现有 reviewer 报告,不制造假结论。
|
|
2892
|
+
}
|
|
2893
|
+
}
|
|
2894
|
+
const oodModule = await lazyOodSolid();
|
|
2895
|
+
const solidFindings = oodModule.requiresOodSolidContract(ctx.intent, ctx.expansion?.workflow_trace?.route, args.changed_files)
|
|
2896
|
+
|| ctx.ood_solid_summary
|
|
2897
|
+
? [
|
|
2898
|
+
...oodModule.reviewSolidCode(contractContents),
|
|
2899
|
+
...oodModule.evaluateOverdesignRisk(ctx.intent, ctx.ood_solid_summary),
|
|
2900
|
+
]
|
|
2901
|
+
: [];
|
|
2902
|
+
const backendModule = await lazyBackendImplementation();
|
|
2903
|
+
const backendFindings = backendModule.requiresBackendImplementationContract(ctx.intent, ctx.expansion?.workflow_trace?.route, args.changed_files)
|
|
2904
|
+
|| ctx.backend_implementation_work_package
|
|
2905
|
+
? backendModule.reviewBackendImplementationFiles(contractContents)
|
|
2906
|
+
: [];
|
|
2907
|
+
// 问题六十八: 代码可维护性与可观测性审查
|
|
2908
|
+
const obsModule = await lazyCodeObservability();
|
|
2909
|
+
const obsFindings = obsModule.requiresCodeObservabilityContract(ctx.intent, ctx.expansion?.workflow_trace?.route, args.changed_files)
|
|
2910
|
+
|| ctx.code_observability_work_package
|
|
2911
|
+
? obsModule.reviewCodeObservability(contractContents)
|
|
2912
|
+
: [];
|
|
2913
|
+
if (solidFindings.length > 0 || backendFindings.length > 0 || obsFindings.length > 0) {
|
|
2914
|
+
const updatedCtx = await taskContext.load(args.task_id);
|
|
2915
|
+
if (updatedCtx) {
|
|
2916
|
+
updatedCtx.ood_solid_findings = solidFindings;
|
|
2917
|
+
updatedCtx.backend_implementation_findings = backendFindings;
|
|
2918
|
+
updatedCtx.code_observability_findings = obsFindings;
|
|
2919
|
+
await taskContext.save(updatedCtx);
|
|
2920
|
+
}
|
|
2921
|
+
}
|
|
2636
2922
|
// 决策契约 advisory: 校验 review 输出
|
|
2637
2923
|
const decisionContract = (await lazyDecision()).validateDecisionOutput(result);
|
|
2638
2924
|
const reviewExtras = {};
|
|
2639
2925
|
if (!decisionContract.passed) {
|
|
2640
2926
|
reviewExtras.decision_contract_advisory = decisionContract.advisory;
|
|
2641
2927
|
}
|
|
2928
|
+
if (solidFindings.length > 0)
|
|
2929
|
+
reviewExtras.ood_solid_findings = solidFindings;
|
|
2930
|
+
if (backendFindings.length > 0)
|
|
2931
|
+
reviewExtras.backend_implementation_findings = backendFindings;
|
|
2932
|
+
if (obsFindings.length > 0)
|
|
2933
|
+
reviewExtras.code_observability_findings = obsFindings;
|
|
2934
|
+
if (oodModule.hasBlockingSolidFindings(solidFindings) || backendModule.hasBlockingBackendFindings(backendFindings) || obsModule.hasBlockingObservabilityFindings(obsFindings)) {
|
|
2935
|
+
reviewExtras.delivery_blocked = true;
|
|
2936
|
+
reviewExtras.diagnostic_code = "SF-IMPLEMENTATION-CONTRACT-REVIEW-BLOCKED";
|
|
2937
|
+
}
|
|
2642
2938
|
return { result: Object.keys(reviewExtras).length > 0 ? { ...result, ...reviewExtras } : result };
|
|
2643
2939
|
});
|
|
2644
2940
|
// ── sf_scaffold: 生成标准化代码骨架 ──
|
|
@@ -2783,7 +3079,7 @@ export async function registerTools(server, deps) {
|
|
|
2783
3079
|
return {
|
|
2784
3080
|
result: {
|
|
2785
3081
|
error: "存在未清零的模板契约修复指令,需完成修复重验后才能交付",
|
|
2786
|
-
diagnostic_code:
|
|
3082
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.contractDraft,
|
|
2787
3083
|
repair_directive: ctx.repair_reverify_directive,
|
|
2788
3084
|
recovery: "修复文档缺口后重新执行 sf_verify,验证通过后 repair_reverify_directive 自动清零",
|
|
2789
3085
|
recovery_next_tools: ["sf_learn", "sf_verify", "sf_status"],
|
|
@@ -2791,6 +3087,42 @@ export async function registerTools(server, deps) {
|
|
|
2791
3087
|
},
|
|
2792
3088
|
};
|
|
2793
3089
|
}
|
|
3090
|
+
// 问题六十六/六十七: 审查或验证阶段产生的工程硬失败不得进入交付。
|
|
3091
|
+
const oodModule = await lazyOodSolid();
|
|
3092
|
+
if (oodModule.hasBlockingSolidFindings(ctx.ood_solid_findings ?? [])) {
|
|
3093
|
+
return {
|
|
3094
|
+
result: {
|
|
3095
|
+
error: "OOD/SOLID 契约仍存在硬失败,不得交付",
|
|
3096
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.oodDeliveryBlock,
|
|
3097
|
+
findings: ctx.ood_solid_findings,
|
|
3098
|
+
recovery: "按 finding 修复职责或依赖边界,并重新执行 sf_review 与 sf_verify",
|
|
3099
|
+
},
|
|
3100
|
+
};
|
|
3101
|
+
}
|
|
3102
|
+
const backendModule = await lazyBackendImplementation();
|
|
3103
|
+
if (backendModule.hasBlockingBackendFindings(ctx.backend_implementation_findings ?? [])) {
|
|
3104
|
+
return {
|
|
3105
|
+
result: {
|
|
3106
|
+
error: "后端实现工程契约仍存在硬失败,不得交付",
|
|
3107
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.backendDeliveryBlock,
|
|
3108
|
+
findings: ctx.backend_implementation_findings,
|
|
3109
|
+
recovery: "按 finding 修复后端边界、安全或一致性问题,并重新执行 sf_review 与 sf_verify",
|
|
3110
|
+
},
|
|
3111
|
+
};
|
|
3112
|
+
}
|
|
3113
|
+
// 问题六十八: 代码可维护性与可观测性 P0 阻断交付。
|
|
3114
|
+
const obsModule = await lazyCodeObservability();
|
|
3115
|
+
const obsDeliveryBlock = obsModule.evaluateDeliveryBlock(ctx.code_observability_findings ?? []);
|
|
3116
|
+
if (obsDeliveryBlock.blocked) {
|
|
3117
|
+
return {
|
|
3118
|
+
result: {
|
|
3119
|
+
error: `代码可维护性/可观测性存在阻断: ${obsDeliveryBlock.reason_zh}`,
|
|
3120
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.codeObservabilityFinding,
|
|
3121
|
+
findings: obsDeliveryBlock.blocking_findings,
|
|
3122
|
+
recovery: "按 finding 修复敏感信息泄漏、缺失日志或吞异常问题,并重新执行 sf_review 与 sf_verify",
|
|
3123
|
+
},
|
|
3124
|
+
};
|
|
3125
|
+
}
|
|
2794
3126
|
// 产物状态门控: deliver 需要产物状态为 accepted 且有证据
|
|
2795
3127
|
if (ctx.artifact_output) {
|
|
2796
3128
|
const status = ctx.artifact_output.status;
|
|
@@ -3463,5 +3795,43 @@ export async function registerTools(server, deps) {
|
|
|
3463
3795
|
result: { text: lines.join("\n") },
|
|
3464
3796
|
};
|
|
3465
3797
|
});
|
|
3798
|
+
// ── sf_navigation: 工作流导航 — 问题六十五 ──
|
|
3799
|
+
const NavigationSchema = {
|
|
3800
|
+
type: "object",
|
|
3801
|
+
properties: {
|
|
3802
|
+
project_path: { type: "string", description: "项目路径(可选,默认当前目录)" },
|
|
3803
|
+
},
|
|
3804
|
+
required: [],
|
|
3805
|
+
};
|
|
3806
|
+
registerSafeTool("sf_navigation", "查询工作流导航: 当前项目阶段、任务阶段、下一步操作和禁止操作。用于\"下一步\"\"继续\"\"现在能写代码吗\"等模糊推进意图。不得靠模型经验回答,必须调用此工具获取真实导航状态", NavigationSchema, async (args) => {
|
|
3807
|
+
const projectPath = args.project_path || config._projectPath || process.cwd();
|
|
3808
|
+
const { planNextAction } = await import("../../engine/next_action_planner.js");
|
|
3809
|
+
const plan = await planNextAction(projectPath);
|
|
3810
|
+
return {
|
|
3811
|
+
result: {
|
|
3812
|
+
project_stage: plan.project_stage,
|
|
3813
|
+
task_stage: plan.task_stage,
|
|
3814
|
+
current_task_id: plan.current_task_id,
|
|
3815
|
+
confidence: plan.confidence,
|
|
3816
|
+
stage_evidence: plan.stage_evidence,
|
|
3817
|
+
blocking_reasons: plan.blocking_reasons,
|
|
3818
|
+
stale_task: plan.stale_task,
|
|
3819
|
+
work_package: plan.work_package ? {
|
|
3820
|
+
id: plan.work_package.id,
|
|
3821
|
+
goal_zh: plan.work_package.goal_zh,
|
|
3822
|
+
description_zh: plan.work_package.description_zh,
|
|
3823
|
+
action: plan.work_package.action,
|
|
3824
|
+
tool_name: plan.work_package.tool_name,
|
|
3825
|
+
must_read: plan.work_package.must_read,
|
|
3826
|
+
forbidden_changes: plan.work_package.forbidden_changes,
|
|
3827
|
+
expected_outputs: plan.work_package.expected_outputs,
|
|
3828
|
+
acceptance_commands: plan.work_package.acceptance_commands,
|
|
3829
|
+
} : null,
|
|
3830
|
+
disallowed_actions: plan.disallowed_actions,
|
|
3831
|
+
recommended_commands: plan.recommended_commands,
|
|
3832
|
+
recommended_prompt_zh: plan.recommended_prompt_zh,
|
|
3833
|
+
},
|
|
3834
|
+
};
|
|
3835
|
+
});
|
|
3466
3836
|
}
|
|
3467
3837
|
//# sourceMappingURL=tools.js.map
|