soloforge 1.3.3 → 1.3.5
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 +19 -3
- 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 +164 -44
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/shared/workflow_template.js +2 -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 +148 -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 +11 -0
- package/dist/engine/asset_manifest.js.map +1 -1
- package/dist/engine/backend_implementation_contract.d.ts +1 -1
- package/dist/engine/backend_implementation_contract.d.ts.map +1 -1
- package/dist/engine/backend_implementation_contract.js +22 -0
- package/dist/engine/backend_implementation_contract.js.map +1 -1
- package/dist/engine/brainstorm_contract.d.ts +1 -1
- package/dist/engine/brainstorm_contract.js +1 -1
- 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 +711 -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 +49 -1
- package/dist/engine/consumable_asset_registry.js.map +1 -1
- package/dist/engine/contract_registry.js +1 -1
- package/dist/engine/diagnostic_registry.d.ts +13 -0
- package/dist/engine/diagnostic_registry.d.ts.map +1 -1
- package/dist/engine/diagnostic_registry.js +68 -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 +195 -2
- 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 +134 -0
- package/dist/engine/explicit_asset_registry.js.map +1 -1
- package/dist/engine/extension_scenario_registry.js +4 -4
- package/dist/engine/extension_scenario_registry.js.map +1 -1
- package/dist/engine/foundation_scenario_runners.d.ts.map +1 -1
- package/dist/engine/foundation_scenario_runners.js +4 -2
- package/dist/engine/foundation_scenario_runners.js.map +1 -1
- package/dist/engine/historical_issue_mechanization_matrix.d.ts +28 -0
- package/dist/engine/historical_issue_mechanization_matrix.d.ts.map +1 -0
- package/dist/engine/historical_issue_mechanization_matrix.js +134 -0
- package/dist/engine/historical_issue_mechanization_matrix.js.map +1 -0
- package/dist/engine/implementation_roadmap_registry.d.ts.map +1 -1
- package/dist/engine/implementation_roadmap_registry.js +114 -13
- package/dist/engine/implementation_roadmap_registry.js.map +1 -1
- package/dist/engine/intent_expander.d.ts.map +1 -1
- package/dist/engine/intent_expander.js +151 -1
- package/dist/engine/intent_expander.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 +104 -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.map +1 -1
- package/dist/engine/next_action_planner.js +72 -4
- package/dist/engine/next_action_planner.js.map +1 -1
- package/dist/engine/observability.js +1 -1
- package/dist/engine/observability.js.map +1 -1
- package/dist/engine/project_knowledge_contract.d.ts +58 -0
- package/dist/engine/project_knowledge_contract.d.ts.map +1 -0
- package/dist/engine/project_knowledge_contract.js +298 -0
- package/dist/engine/project_knowledge_contract.js.map +1 -0
- package/dist/engine/project_knowledge_system_regression_matrix.d.ts +27 -0
- package/dist/engine/project_knowledge_system_regression_matrix.d.ts.map +1 -0
- package/dist/engine/project_knowledge_system_regression_matrix.js +295 -0
- package/dist/engine/project_knowledge_system_regression_matrix.js.map +1 -0
- package/dist/engine/release_issue_scenario_registry.d.ts.map +1 -1
- package/dist/engine/release_issue_scenario_registry.js +506 -95
- package/dist/engine/release_issue_scenario_registry.js.map +1 -1
- package/dist/engine/release_readiness_gate.d.ts +4 -0
- package/dist/engine/release_readiness_gate.d.ts.map +1 -1
- package/dist/engine/release_readiness_gate.js +643 -12
- package/dist/engine/release_readiness_gate.js.map +1 -1
- package/dist/engine/team_awareness.js +6 -6
- package/dist/engine/team_awareness.js.map +1 -1
- package/dist/engine/technology_decision.js +5 -5
- package/dist/engine/technology_decision.js.map +1 -1
- package/dist/engine/template_asset_contract_registry.d.ts.map +1 -1
- package/dist/engine/template_asset_contract_registry.js +6 -5
- package/dist/engine/template_asset_contract_registry.js.map +1 -1
- package/dist/engine/verifier.js +1 -1
- package/dist/engine/verifier.js.map +1 -1
- package/dist/engine/workflow_navigation_contract.d.ts +10 -0
- package/dist/engine/workflow_navigation_contract.d.ts.map +1 -1
- package/dist/knowledge/loader.d.ts +3 -1
- package/dist/knowledge/loader.d.ts.map +1 -1
- package/dist/knowledge/loader.js +2 -2
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- 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//351/200/232/347/224/250/350/264/250/351/207/217/351/252/214/346/224/266/346/270/205/345/215/225.md +1 -1
- package/templates/knowledge/acceptance_templates//351/207/215/346/236/204/346/226/271/346/241/210/346/250/241/347/211/210.md +1 -1
- package/templates/knowledge/domain//346/224/257/344/273/230/350/247/204/345/210/231.md +1 -1
- package/templates/knowledge/procedures//346/225/260/346/215/256/345/272/223/350/277/201/347/247/273/346/265/201/347/250/213.md +1 -1
- package/templates/knowledge/procedures//351/203/250/347/275/262/345/217/221/345/270/203/346/265/201/347/250/213.md +1 -1
- package/templates/knowledge/procedures//351/207/215/346/236/204/346/265/201/346/260/264/347/272/277.md +1 -1
- 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//344/272/244/344/273/230/345/256/214/345/244/207/346/200/247/345/256/241/346/237/245/350/247/204/345/210/231.md +1 -1
- package/templates/knowledge/review_rules//350/264/250/351/207/217/345/256/241/346/237/245/350/247/204/345/210/231.md +3 -3
- 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 +150 -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/270/345/277/203/344/275/223/351/252/214/345/216/237/345/210/231.md +1 -1
- package/templates/knowledge/rules//346/240/270/345/277/203/345/267/245/347/250/213/346/211/247/350/241/214/345/216/237/345/210/231.md +2 -2
- package/templates/knowledge/rules//346/274/224/350/277/233/345/233/236/345/275/222/351/227/250/346/216/247/350/247/204/345/210/231.md +1 -1
- 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/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/patterns/Git/346/223/215/344/275/234/350/247/204/350/214/203.md +1 -1
- package/templates/scaffolds/react/Form.tsx.hbs +11 -3
- package/templates/scaffolds/react/List.tsx.hbs +11 -3
- package/templates/scaffolds/react/Page.tsx.hbs +1 -1
- package/templates/scaffolds/react/types.ts.hbs +4 -1
- package/templates/scaffolds/spring-boot/Controller.java.hbs +18 -4
- package/templates/scaffolds/spring-boot/DTO.java.hbs +4 -1
- package/templates/scaffolds/spring-boot/Entity.java.hbs +8 -3
- package/templates/scaffolds/spring-boot/Mapper.java.hbs +4 -1
- package/templates/scaffolds/spring-boot/ServiceImpl.java.hbs +34 -10
- package/templates/scaffolds/spring-boot/ServiceTest.java.hbs +0 -1
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/Handler/Router 入参出参、参数校验、事务、幂等、权限、日志和错误处理等实现细节。
|
|
18
|
+
- **注释与日志治理**: 后端写操作、前端关键交互、状态变更、支付/权限/安全路径、异常处理和迁移脚本需要可定位日志、埋点/错误上报或必要注释;敏感信息不得进入日志。
|
|
19
|
+
- **长期机制化门禁**: SoloForge 自身发布前会检查机制消费链路、知识治理、配置落盘边界、日志治理和诊断码集中注册,防止只靠文档或测试自证。
|
|
11
20
|
|
|
12
21
|
## 最短成功路径
|
|
13
22
|
|
|
@@ -61,7 +70,7 @@ soloforge init --adapter all # 同时生成所有适配器配置
|
|
|
61
70
|
|
|
62
71
|
| 位置 | 用途 |
|
|
63
72
|
|------|------|
|
|
64
|
-
| `.soloforge/knowledge/` |
|
|
73
|
+
| `.soloforge/knowledge/` | 项目知识模板和规则;内置同步资产受 manifest/hash 保护,用户自定义规则会被审计为 hard rule、injectable 或 index_only |
|
|
65
74
|
| `.soloforge/config.yaml` | 可选项目配置,仅在高置信度或手动确认后生成 |
|
|
66
75
|
| `~/.soloforge/patterns/` | 全局默认模板(所有项目共享),init 时自动同步、已有文件不覆盖 |
|
|
67
76
|
| `.claude/settings.json` / `CLAUDE.md` / `.mcp.json` | Claude Code 配置 |
|
|
@@ -79,6 +88,7 @@ soloforge next # 查看当前阶段、阻断项和下一步可执
|
|
|
79
88
|
soloforge stage # 查看项目阶段与当前任务阶段
|
|
80
89
|
soloforge config resolve # 查看配置解析结果和来源
|
|
81
90
|
soloforge config explain # 解释某项配置为什么是当前值
|
|
91
|
+
soloforge audit-project-knowledge # 审计项目自定义知识规则是否可被稳定消费
|
|
82
92
|
soloforge version # 查看版本
|
|
83
93
|
```
|
|
84
94
|
|
|
@@ -121,6 +131,10 @@ soloforge migrate --apply --confirm # 执行项目迁移
|
|
|
121
131
|
- 你手动修改过的模板和适配器文件(如 `CLAUDE.md`)不会被静默覆盖——SoloForge 会检测文件是否被用户修改,修改过的文件在同步时自动跳过并报告。
|
|
122
132
|
- 核心知识模板受保护,即使 apply 也不会被自动同步覆盖。
|
|
123
133
|
- dry-run 中的“应用安全: 需确认”表示发现用户已有文件或需要人工确认;这不是命令失败,只有加 `--apply --confirm` 才会写入。
|
|
134
|
+
- 用户自己新增到 `.soloforge/knowledge/**` 的规则不会被当成普通静态文件。带有 `asset_kind: hard_rule`、`routes`、`primary_triggers` 或 `enforcement.level` 的项目规则会进入审计和任务选择;缺少触发条件的 hard rule 会被 `audit-project-knowledge` 标为阻断。
|
|
135
|
+
- 项目规则进入 `sf_expand` 时会按 intent、route、技术栈和触发词筛选,不会整库塞进 prompt;`sf_review`、`sf_verify`、`sf_deliver` 会在项目规则不可消费或冲突时阻断。
|
|
136
|
+
- 项目规则可用 `conflict_group` + `rule_value` 或 `conflicts_with` 声明互斥口径,例如 API 响应格式、分页格式、日志字段、数据库命名和权限模型。冲突不会由 AI 直接拍板,必须先由用户确认。
|
|
137
|
+
- 知识资产与项目规则消费体系受 20 项防回归矩阵约束:模板卫生、脚手架质量、项目知识承载、选择注入、冲突确认、`next` 消费、同步保护、技术栈过滤、设计产物消费、消费 trace 和用户可见解释都必须有真实入口和 release gate。
|
|
124
138
|
|
|
125
139
|
**典型升级流程:**
|
|
126
140
|
|
|
@@ -157,8 +171,8 @@ soloforge migrate --apply --confirm # 确认后迁移
|
|
|
157
171
|
- **存量设计复验** — 升级 SoloForge 后,已有架构/数据库/API 文档不会被默认信任。运行 `soloforge audit-design-artifacts` 可得到差距报告;需要升级时先 dry-run,再经 `--apply --confirm` 归档旧文件并写入升级契约,修订后的文档必须重新复验。
|
|
158
172
|
- **下一步导航** — 不确定接下来该做什么时,运行 `soloforge next`,或向 AI 直接说“下一步/继续/现在能写代码吗”。SoloForge 会依据配置、设计验收、当前任务、修复指令和验证证据输出阶段、阻断原因与工作包;陈旧任务不会被静默绕过。
|
|
159
173
|
- **OOD 与 SOLID 编码约束** — 复杂业务、领域服务、策略和重构类实现会先要求对象职责、接口与依赖方向摘要;代码审查可识别职责膨胀、直接依赖基础设施、宽接口和替换违约。文案或简单配置修改不会被强行复杂化。
|
|
160
|
-
- **后端实现工程约束** — 实现后端接口前会要求 DTO/校验、响应与分页、事务与幂等、安全审计、OpenAPI
|
|
161
|
-
-
|
|
174
|
+
- **后端实现工程约束** — 实现后端接口前会要求 DTO/校验、响应与分页、事务与幂等、安全审计、OpenAPI/数据库对齐和测试证据;Spring Boot Entity 默认保持 `@Getter`/`@Setter`,DTO/VO/Request/Response 默认使用 `@Data`;实体泄漏、写接口无校验、事务内外调、关键写入无幂等或敏感接口无安全证据会阻断交付。
|
|
175
|
+
- **日志与注释清晰** — 用户可见输出中文优先;JSON 模式(`--json`)输出保持纯 JSON,不混入内部日志。用户项目业务日志和注释也必须中文;后端类需要说明类作用的 Javadoc,方法需要说明方法、入参和出参,关键业务行需要中文行注释。
|
|
162
176
|
- 写代码类任务会更明确 scope、验收项和验证命令。
|
|
163
177
|
- 生成文档、提取说明、分析日志等产物型任务会默认输出到 `.soloforge/output/`,不会默认修改 `src/`。
|
|
164
178
|
- 遇到缺少路径、源码包、日志等必需输入时,会先澄清,而不是猜着执行。
|
|
@@ -183,6 +197,8 @@ SoloForge 对验证和交付有严格的分层设计:
|
|
|
183
197
|
- **可修复失败有预算**:重试次数有上限,超预算后停止并升级。
|
|
184
198
|
- **范围不足不越权**:如果失败是因为 scope 不够,SoloForge 会请求扩大范围,不会静默越权写入。
|
|
185
199
|
- **错误信息已脱敏**:失败报告中的敏感信息(密钥、密码、原始输出)会自动脱敏,只保留摘要和哈希。
|
|
200
|
+
- **项目知识可审计**:项目自定义规则必须能说明适用路由、触发词和技术栈。能执行的规则会被选中或注入;只适合作为背景资料的规则会标为 `index_only`,不得冒充已执行约束。`soloforge next` 会显示下一步会参考哪些项目规则,`audit-project-knowledge` 会显示冲突、身份、可消费性和修复建议。
|
|
201
|
+
- **历史问题机制化**:新反馈不会只按表面文件或单个场景处理。SoloForge 的发布门禁要求历史问题先归入长期机制族,并具备第一性原理不变量、生产入口、用户项目路径、must-fail 和 must-pass。
|
|
186
202
|
|
|
187
203
|
### 安全护栏
|
|
188
204
|
|
|
@@ -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;
|
|
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,11 +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"));
|
|
86
82
|
const lazyNavigation = createLazy(() => import("../../engine/next_action_planner.js"));
|
|
87
83
|
const lazyOodSolid = createLazy(() => import("../../engine/ood_solid_contract.js"));
|
|
88
84
|
const lazyBackendImplementation = createLazy(() => import("../../engine/backend_implementation_contract.js"));
|
|
85
|
+
const lazyCodeObservability = createLazy(() => import("../../engine/code_maintainability_observability_contract.js"));
|
|
89
86
|
// ── Zod Schema 定义 ──
|
|
90
87
|
const ClassifySchema = {
|
|
91
88
|
intent: z.string().describe("开发者意图描述"),
|
|
@@ -100,6 +97,7 @@ const ExpandSchema = {
|
|
|
100
97
|
design_artifact_pack: z.unknown().optional().describe("设计产物包路径映射或已复验状态"),
|
|
101
98
|
ood_solid_summary: z.unknown().optional().describe("复杂编码任务的 OOD/SOLID 设计摘要"),
|
|
102
99
|
backend_implementation_work_package: z.unknown().optional().describe("后端接口实现的工程工作包"),
|
|
100
|
+
code_observability_work_package: z.unknown().optional().describe("代码可维护性与可观测性工作包"),
|
|
103
101
|
};
|
|
104
102
|
const VerifySchema = {
|
|
105
103
|
task_id: z.string().describe("任务 ID"),
|
|
@@ -240,7 +238,7 @@ export function checkWriteToolPlanGate(params) {
|
|
|
240
238
|
if (!params.ctx || !params.ctx.plan_proposal_gate) {
|
|
241
239
|
return {
|
|
242
240
|
allowed: false,
|
|
243
|
-
diagnostic_code:
|
|
241
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.planGate,
|
|
244
242
|
violation_type: "guard_blocked",
|
|
245
243
|
reason: `工具 ${params.toolName} 执行前缺少 Plan Proposal Gate`,
|
|
246
244
|
};
|
|
@@ -787,7 +785,7 @@ export async function assessCepForRepairReverify(params) {
|
|
|
787
785
|
*/
|
|
788
786
|
export async function assessCepForUserFeedback(params) {
|
|
789
787
|
const cepModule = await import("../../engine/core_experience_principle.js");
|
|
790
|
-
|
|
788
|
+
const cep = cepModule.evaluateUserVisibleOutput({
|
|
791
789
|
has_conclusion_first: params.has_conclusion_first,
|
|
792
790
|
has_clear_summary: params.has_clear_summary,
|
|
793
791
|
has_actionable_next_step: params.has_actionable_next_step,
|
|
@@ -795,6 +793,22 @@ export async function assessCepForUserFeedback(params) {
|
|
|
795
793
|
hides_critical_failure: params.hides_critical_failure,
|
|
796
794
|
chinese_semantic_first: params.chinese_semantic_first,
|
|
797
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
|
+
};
|
|
798
812
|
}
|
|
799
813
|
/**
|
|
800
814
|
* 注册所有 MCP 工具到服务器实例。
|
|
@@ -982,7 +996,7 @@ export async function registerTools(server, deps) {
|
|
|
982
996
|
content: [{ type: "text", text: JSON.stringify({
|
|
983
997
|
error: planViolation.reason,
|
|
984
998
|
violation: planViolation,
|
|
985
|
-
diagnostic_code: pgResult.diagnostic_code ??
|
|
999
|
+
diagnostic_code: pgResult.diagnostic_code ?? TOOL_DIAGNOSTIC_CODES.planGate,
|
|
986
1000
|
recovery: planViolation.recovery,
|
|
987
1001
|
}) }],
|
|
988
1002
|
isError: true,
|
|
@@ -1008,7 +1022,7 @@ export async function registerTools(server, deps) {
|
|
|
1008
1022
|
content: [{ type: "text", text: JSON.stringify({
|
|
1009
1023
|
error: planViolation.reason,
|
|
1010
1024
|
violation: planViolation,
|
|
1011
|
-
diagnostic_code:
|
|
1025
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.planGate,
|
|
1012
1026
|
recovery: planViolation.recovery,
|
|
1013
1027
|
}) }],
|
|
1014
1028
|
isError: true,
|
|
@@ -1037,7 +1051,7 @@ export async function registerTools(server, deps) {
|
|
|
1037
1051
|
content: [{ type: "text", text: JSON.stringify({
|
|
1038
1052
|
error: instrViolation.reason,
|
|
1039
1053
|
violation: instrViolation,
|
|
1040
|
-
diagnostic_code: instrResult.diagnostic_code ??
|
|
1054
|
+
diagnostic_code: instrResult.diagnostic_code ?? TOOL_DIAGNOSTIC_CODES.instructionContract,
|
|
1041
1055
|
recovery: instrViolation.recovery,
|
|
1042
1056
|
}) }],
|
|
1043
1057
|
isError: true,
|
|
@@ -1073,6 +1087,43 @@ export async function registerTools(server, deps) {
|
|
|
1073
1087
|
};
|
|
1074
1088
|
}
|
|
1075
1089
|
}
|
|
1090
|
+
// 用户项目知识门禁: review/verify/deliver 不能绕过不可消费的项目 hard rule。
|
|
1091
|
+
if (["sf_review", "sf_verify", "sf_deliver"].includes(name)) {
|
|
1092
|
+
const { auditProjectKnowledge } = await import("../../engine/project_knowledge_contract.js");
|
|
1093
|
+
const pkReport = auditProjectKnowledge(projectPath, config);
|
|
1094
|
+
if (pkReport.hard_fail_count > 0) {
|
|
1095
|
+
const pkFindings = pkReport.assets.flatMap((asset) => asset.findings
|
|
1096
|
+
.filter((finding) => finding.severity === "hard_fail")
|
|
1097
|
+
.map((finding) => `${asset.rel_path}: [${finding.code}] ${finding.message_zh}`));
|
|
1098
|
+
const pkViolation = {
|
|
1099
|
+
invocation_id: invocationId,
|
|
1100
|
+
tool_name: name,
|
|
1101
|
+
violation_type: "guard_blocked",
|
|
1102
|
+
severity: "hard_fail",
|
|
1103
|
+
reason: `用户项目知识存在 ${pkReport.hard_fail_count} 个不可消费阻断项`,
|
|
1104
|
+
recovery: "运行 soloforge audit-project-knowledge,修复 hard rule 的 routes、primary_triggers 或身份冲突后重试",
|
|
1105
|
+
};
|
|
1106
|
+
const pkTrace = createToolTrace({
|
|
1107
|
+
tool_name: name, invocation_id: invocationId, task_id: taskId,
|
|
1108
|
+
actual_side_effects: effectiveSideEffects,
|
|
1109
|
+
next_allowed_tools: ["sf_expand", "sf_status"],
|
|
1110
|
+
forbidden_tools: ["sf_review", "sf_verify", "sf_deliver"],
|
|
1111
|
+
authorization, bypass,
|
|
1112
|
+
});
|
|
1113
|
+
if (taskId && ctx)
|
|
1114
|
+
await taskContext.setToolTrace(taskId, pkTrace, [pkViolation]);
|
|
1115
|
+
return {
|
|
1116
|
+
content: [{ type: "text", text: JSON.stringify({
|
|
1117
|
+
error: pkViolation.reason,
|
|
1118
|
+
violation: pkViolation,
|
|
1119
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.projectKnowledgeBlocked,
|
|
1120
|
+
findings: pkFindings,
|
|
1121
|
+
recovery: pkViolation.recovery,
|
|
1122
|
+
}) }],
|
|
1123
|
+
isError: true,
|
|
1124
|
+
};
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1076
1127
|
// 合同验证
|
|
1077
1128
|
const lastTrace = ctx?.last_tool_trace;
|
|
1078
1129
|
// 为动态工具构建有效的合同覆盖(如 sf_status cancel)
|
|
@@ -1330,8 +1381,11 @@ export async function registerTools(server, deps) {
|
|
|
1330
1381
|
if (args.backend_implementation_work_package) {
|
|
1331
1382
|
ctx.backend_implementation_work_package = args.backend_implementation_work_package;
|
|
1332
1383
|
}
|
|
1384
|
+
if (args.code_observability_work_package) {
|
|
1385
|
+
ctx.code_observability_work_package = args.code_observability_work_package;
|
|
1386
|
+
}
|
|
1333
1387
|
if (args.architecture_decision_workshop || args.decision_workshop || args.design_artifact_pack
|
|
1334
|
-
|| args.ood_solid_summary || args.backend_implementation_work_package) {
|
|
1388
|
+
|| args.ood_solid_summary || args.backend_implementation_work_package || args.code_observability_work_package) {
|
|
1335
1389
|
await taskContext.save(ctx);
|
|
1336
1390
|
}
|
|
1337
1391
|
// 状态守卫:classifying/expanding/clarifying → expanding
|
|
@@ -1690,7 +1744,7 @@ export async function registerTools(server, deps) {
|
|
|
1690
1744
|
};
|
|
1691
1745
|
}
|
|
1692
1746
|
}
|
|
1693
|
-
//
|
|
1747
|
+
// 问题四十二(brainstorm): 脑暴契约 gate — 不确定项缺方案探索时 blocked
|
|
1694
1748
|
{
|
|
1695
1749
|
const brainstormGate = await checkBrainstormGate({ ctx, route: expansionRoute });
|
|
1696
1750
|
if (!brainstormGate.allowed) {
|
|
@@ -1704,8 +1758,11 @@ export async function registerTools(server, deps) {
|
|
|
1704
1758
|
};
|
|
1705
1759
|
}
|
|
1706
1760
|
}
|
|
1707
|
-
//
|
|
1761
|
+
// 问题六十六/六十七/六十八: 编码前工程约束必须聚合返回。
|
|
1762
|
+
// 不能让 OOD 或后端工程门禁抢先返回,遮蔽用户项目的注释/日志契约。
|
|
1708
1763
|
{
|
|
1764
|
+
const preImplementationBlocks = [];
|
|
1765
|
+
const preImplementationPayload = {};
|
|
1709
1766
|
const oodModule = await lazyOodSolid();
|
|
1710
1767
|
const oodGate = oodModule.evaluateOodDesignGate({
|
|
1711
1768
|
task_id: args.task_id,
|
|
@@ -1715,22 +1772,14 @@ export async function registerTools(server, deps) {
|
|
|
1715
1772
|
});
|
|
1716
1773
|
if (oodGate.applicable) {
|
|
1717
1774
|
ctx.ood_solid_summary = oodGate.required_summary;
|
|
1718
|
-
|
|
1775
|
+
preImplementationPayload.ood_solid_summary = oodGate.required_summary;
|
|
1719
1776
|
}
|
|
1720
1777
|
if (!oodGate.allowed) {
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
|
|
1724
|
-
|
|
1725
|
-
diagnostic_code: "SF-OOD-6601",
|
|
1726
|
-
ood_solid_summary: oodGate.required_summary,
|
|
1727
|
-
recovery: "请确认对象职责、接口边界、依赖方向、变化点和 SOLID 风险后重新调用 sf_expand",
|
|
1728
|
-
},
|
|
1729
|
-
};
|
|
1778
|
+
preImplementationBlocks.push({
|
|
1779
|
+
code: TOOL_DIAGNOSTIC_CODES.oodMissingSummary,
|
|
1780
|
+
reason_zh: oodGate.reason_zh,
|
|
1781
|
+
});
|
|
1730
1782
|
}
|
|
1731
|
-
}
|
|
1732
|
-
// 问题六十七: 后端接口编码必须先确认工程边界与验收证据。
|
|
1733
|
-
{
|
|
1734
1783
|
const backendModule = await lazyBackendImplementation();
|
|
1735
1784
|
const backendGate = backendModule.evaluateBackendImplementationGate({
|
|
1736
1785
|
task_id: args.task_id,
|
|
@@ -1740,16 +1789,46 @@ export async function registerTools(server, deps) {
|
|
|
1740
1789
|
});
|
|
1741
1790
|
if (backendGate.applicable) {
|
|
1742
1791
|
ctx.backend_implementation_work_package = backendGate.work_package;
|
|
1743
|
-
|
|
1792
|
+
preImplementationPayload.backend_implementation_work_package = backendGate.work_package;
|
|
1744
1793
|
}
|
|
1745
1794
|
if (!backendGate.allowed) {
|
|
1795
|
+
preImplementationBlocks.push({
|
|
1796
|
+
code: TOOL_DIAGNOSTIC_CODES.backendMissingSummary,
|
|
1797
|
+
reason_zh: backendGate.reason_zh,
|
|
1798
|
+
});
|
|
1799
|
+
}
|
|
1800
|
+
if (ctx.classification.task_type !== "scaffold") {
|
|
1801
|
+
const obsModule = await lazyCodeObservability();
|
|
1802
|
+
const obsGate = obsModule.evaluateCodeObservabilityGate({
|
|
1803
|
+
task_id: args.task_id,
|
|
1804
|
+
intent: ctx.intent,
|
|
1805
|
+
route: expansionRoute,
|
|
1806
|
+
changed_files: ctx.execution?.changed_files,
|
|
1807
|
+
work_package: ctx.code_observability_work_package,
|
|
1808
|
+
});
|
|
1809
|
+
if (obsGate.applicable) {
|
|
1810
|
+
ctx.code_observability_work_package = obsGate.work_package;
|
|
1811
|
+
preImplementationPayload.code_observability_work_package = obsGate.work_package;
|
|
1812
|
+
}
|
|
1813
|
+
if (!obsGate.allowed) {
|
|
1814
|
+
preImplementationBlocks.push({
|
|
1815
|
+
code: TOOL_DIAGNOSTIC_CODES.codeObservabilityWorkPackage,
|
|
1816
|
+
reason_zh: obsGate.reason_zh,
|
|
1817
|
+
});
|
|
1818
|
+
}
|
|
1819
|
+
}
|
|
1820
|
+
if (Object.keys(preImplementationPayload).length > 0) {
|
|
1821
|
+
await taskContext.save(ctx);
|
|
1822
|
+
}
|
|
1823
|
+
if (preImplementationBlocks.length > 0) {
|
|
1746
1824
|
return {
|
|
1747
1825
|
result: {
|
|
1748
|
-
error:
|
|
1749
|
-
status: "
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1826
|
+
error: "编码前工程契约未全部确认,不得开始实现",
|
|
1827
|
+
status: "awaiting_implementation_contracts",
|
|
1828
|
+
diagnostic_codes: preImplementationBlocks.map((b) => b.code),
|
|
1829
|
+
blocking_findings: preImplementationBlocks,
|
|
1830
|
+
...preImplementationPayload,
|
|
1831
|
+
recovery: "请同时确认 OOD/SOLID、后端工程边界、代码注释与日志契约后重新调用 sf_expand",
|
|
1753
1832
|
},
|
|
1754
1833
|
};
|
|
1755
1834
|
}
|
|
@@ -1986,7 +2065,7 @@ export async function registerTools(server, deps) {
|
|
|
1986
2065
|
result: {
|
|
1987
2066
|
error: oodGate.reason_zh,
|
|
1988
2067
|
status: "blocked",
|
|
1989
|
-
diagnostic_code:
|
|
2068
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.oodMissingSummary,
|
|
1990
2069
|
ood_solid_summary: oodGate.required_summary,
|
|
1991
2070
|
recovery: "完成 OOD/SOLID 摘要后重新执行 sf_expand 与 sf_verify",
|
|
1992
2071
|
},
|
|
@@ -2005,7 +2084,7 @@ export async function registerTools(server, deps) {
|
|
|
2005
2084
|
result: {
|
|
2006
2085
|
error: backendGate.reason_zh,
|
|
2007
2086
|
status: "blocked",
|
|
2008
|
-
diagnostic_code:
|
|
2087
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.backendMissingSummary,
|
|
2009
2088
|
backend_implementation_work_package: backendGate.work_package,
|
|
2010
2089
|
recovery: "完成后端工程工作包后重新执行 sf_expand 与 sf_verify",
|
|
2011
2090
|
},
|
|
@@ -2038,7 +2117,7 @@ export async function registerTools(server, deps) {
|
|
|
2038
2117
|
result: {
|
|
2039
2118
|
error: "OOD/SOLID 代码复验发现阻断项,需修复后重验",
|
|
2040
2119
|
status: "blocked",
|
|
2041
|
-
diagnostic_code:
|
|
2120
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.oodDeliveryBlock,
|
|
2042
2121
|
ood_solid_findings: solidFindings,
|
|
2043
2122
|
},
|
|
2044
2123
|
};
|
|
@@ -2048,11 +2127,30 @@ export async function registerTools(server, deps) {
|
|
|
2048
2127
|
result: {
|
|
2049
2128
|
error: "后端实现工程复验发现阻断项,需修复后重验",
|
|
2050
2129
|
status: "blocked",
|
|
2051
|
-
diagnostic_code:
|
|
2130
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.backendDeliveryBlock,
|
|
2052
2131
|
backend_implementation_findings: backendFindings,
|
|
2053
2132
|
},
|
|
2054
2133
|
};
|
|
2055
2134
|
}
|
|
2135
|
+
// 问题六十八: 代码可维护性与可观测性契约
|
|
2136
|
+
const codeObsModule = await lazyCodeObservability();
|
|
2137
|
+
const obsFindings = codeObsModule.verifyChangedFilesObservability({
|
|
2138
|
+
changed_files: implementationFiles,
|
|
2139
|
+
file_contents: implementationContents,
|
|
2140
|
+
intent: ctx.intent,
|
|
2141
|
+
});
|
|
2142
|
+
ctx.code_observability_findings = obsFindings;
|
|
2143
|
+
await taskContext.save(ctx);
|
|
2144
|
+
if (codeObsModule.hasBlockingObservabilityFindings(obsFindings)) {
|
|
2145
|
+
return {
|
|
2146
|
+
result: {
|
|
2147
|
+
error: "代码可维护性/可观测性复验发现阻断项,需修复后重验",
|
|
2148
|
+
status: "blocked",
|
|
2149
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.codeObservabilityFinding,
|
|
2150
|
+
code_observability_findings: obsFindings,
|
|
2151
|
+
},
|
|
2152
|
+
};
|
|
2153
|
+
}
|
|
2056
2154
|
}
|
|
2057
2155
|
// 问题六十二: 设计产物验证必须读取用户项目真实文件,不接受占位合同自证通过。
|
|
2058
2156
|
const verifyWorkflowIntent = ctx.route_decision?.workflow_intent ?? ctx.classification?.route_decision?.workflow_intent;
|
|
@@ -2143,7 +2241,7 @@ export async function registerTools(server, deps) {
|
|
|
2143
2241
|
result: {
|
|
2144
2242
|
error: `文件 ${changedFile} 模板契约验证未通过,进入修复重验闭环`,
|
|
2145
2243
|
status: "blocked",
|
|
2146
|
-
diagnostic_code:
|
|
2244
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.contractDraft,
|
|
2147
2245
|
template_contract_id: perFileContract.asset_id,
|
|
2148
2246
|
missing_fields: contractResult.missing_fields,
|
|
2149
2247
|
messages: contractResult.messages,
|
|
@@ -2434,8 +2532,8 @@ export async function registerTools(server, deps) {
|
|
|
2434
2532
|
if (args.plan_id !== currentPlan.plan_id) {
|
|
2435
2533
|
return {
|
|
2436
2534
|
result: {
|
|
2437
|
-
error: `plan_id 不匹配: 请求 "${args.plan_id}",当前任务计划 "${currentPlan.plan_id}" [
|
|
2438
|
-
diagnostic_code:
|
|
2535
|
+
error: `plan_id 不匹配: 请求 "${args.plan_id}",当前任务计划 "${currentPlan.plan_id}" [${TOOL_DIAGNOSTIC_CODES.verifyPlanMismatch}]`,
|
|
2536
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.verifyPlanMismatch,
|
|
2439
2537
|
},
|
|
2440
2538
|
};
|
|
2441
2539
|
}
|
|
@@ -2842,11 +2940,18 @@ export async function registerTools(server, deps) {
|
|
|
2842
2940
|
|| ctx.backend_implementation_work_package
|
|
2843
2941
|
? backendModule.reviewBackendImplementationFiles(contractContents)
|
|
2844
2942
|
: [];
|
|
2845
|
-
|
|
2943
|
+
// 问题六十八: 代码可维护性与可观测性审查
|
|
2944
|
+
const obsModule = await lazyCodeObservability();
|
|
2945
|
+
const obsFindings = obsModule.requiresCodeObservabilityContract(ctx.intent, ctx.expansion?.workflow_trace?.route, args.changed_files)
|
|
2946
|
+
|| ctx.code_observability_work_package
|
|
2947
|
+
? obsModule.reviewCodeObservability(contractContents)
|
|
2948
|
+
: [];
|
|
2949
|
+
if (solidFindings.length > 0 || backendFindings.length > 0 || obsFindings.length > 0) {
|
|
2846
2950
|
const updatedCtx = await taskContext.load(args.task_id);
|
|
2847
2951
|
if (updatedCtx) {
|
|
2848
2952
|
updatedCtx.ood_solid_findings = solidFindings;
|
|
2849
2953
|
updatedCtx.backend_implementation_findings = backendFindings;
|
|
2954
|
+
updatedCtx.code_observability_findings = obsFindings;
|
|
2850
2955
|
await taskContext.save(updatedCtx);
|
|
2851
2956
|
}
|
|
2852
2957
|
}
|
|
@@ -2860,7 +2965,9 @@ export async function registerTools(server, deps) {
|
|
|
2860
2965
|
reviewExtras.ood_solid_findings = solidFindings;
|
|
2861
2966
|
if (backendFindings.length > 0)
|
|
2862
2967
|
reviewExtras.backend_implementation_findings = backendFindings;
|
|
2863
|
-
if (
|
|
2968
|
+
if (obsFindings.length > 0)
|
|
2969
|
+
reviewExtras.code_observability_findings = obsFindings;
|
|
2970
|
+
if (oodModule.hasBlockingSolidFindings(solidFindings) || backendModule.hasBlockingBackendFindings(backendFindings) || obsModule.hasBlockingObservabilityFindings(obsFindings)) {
|
|
2864
2971
|
reviewExtras.delivery_blocked = true;
|
|
2865
2972
|
reviewExtras.diagnostic_code = "SF-IMPLEMENTATION-CONTRACT-REVIEW-BLOCKED";
|
|
2866
2973
|
}
|
|
@@ -3008,7 +3115,7 @@ export async function registerTools(server, deps) {
|
|
|
3008
3115
|
return {
|
|
3009
3116
|
result: {
|
|
3010
3117
|
error: "存在未清零的模板契约修复指令,需完成修复重验后才能交付",
|
|
3011
|
-
diagnostic_code:
|
|
3118
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.contractDraft,
|
|
3012
3119
|
repair_directive: ctx.repair_reverify_directive,
|
|
3013
3120
|
recovery: "修复文档缺口后重新执行 sf_verify,验证通过后 repair_reverify_directive 自动清零",
|
|
3014
3121
|
recovery_next_tools: ["sf_learn", "sf_verify", "sf_status"],
|
|
@@ -3022,7 +3129,7 @@ export async function registerTools(server, deps) {
|
|
|
3022
3129
|
return {
|
|
3023
3130
|
result: {
|
|
3024
3131
|
error: "OOD/SOLID 契约仍存在硬失败,不得交付",
|
|
3025
|
-
diagnostic_code:
|
|
3132
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.oodDeliveryBlock,
|
|
3026
3133
|
findings: ctx.ood_solid_findings,
|
|
3027
3134
|
recovery: "按 finding 修复职责或依赖边界,并重新执行 sf_review 与 sf_verify",
|
|
3028
3135
|
},
|
|
@@ -3033,12 +3140,25 @@ export async function registerTools(server, deps) {
|
|
|
3033
3140
|
return {
|
|
3034
3141
|
result: {
|
|
3035
3142
|
error: "后端实现工程契约仍存在硬失败,不得交付",
|
|
3036
|
-
diagnostic_code:
|
|
3143
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.backendDeliveryBlock,
|
|
3037
3144
|
findings: ctx.backend_implementation_findings,
|
|
3038
3145
|
recovery: "按 finding 修复后端边界、安全或一致性问题,并重新执行 sf_review 与 sf_verify",
|
|
3039
3146
|
},
|
|
3040
3147
|
};
|
|
3041
3148
|
}
|
|
3149
|
+
// 问题六十八: 代码可维护性与可观测性 P0 阻断交付。
|
|
3150
|
+
const obsModule = await lazyCodeObservability();
|
|
3151
|
+
const obsDeliveryBlock = obsModule.evaluateDeliveryBlock(ctx.code_observability_findings ?? []);
|
|
3152
|
+
if (obsDeliveryBlock.blocked) {
|
|
3153
|
+
return {
|
|
3154
|
+
result: {
|
|
3155
|
+
error: `代码可维护性/可观测性存在阻断: ${obsDeliveryBlock.reason_zh}`,
|
|
3156
|
+
diagnostic_code: TOOL_DIAGNOSTIC_CODES.codeObservabilityFinding,
|
|
3157
|
+
findings: obsDeliveryBlock.blocking_findings,
|
|
3158
|
+
recovery: "按 finding 修复敏感信息泄漏、缺失日志或吞异常问题,并重新执行 sf_review 与 sf_verify",
|
|
3159
|
+
},
|
|
3160
|
+
};
|
|
3161
|
+
}
|
|
3042
3162
|
// 产物状态门控: deliver 需要产物状态为 accepted 且有证据
|
|
3043
3163
|
if (ctx.artifact_output) {
|
|
3044
3164
|
const status = ctx.artifact_output.status;
|