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.
- package/README.md +5 -0
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +287 -1
- 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 +2 -1
- package/dist/adapters/shared/workflow_template.js.map +1 -1
- package/dist/bin/soloforge.d.ts.map +1 -1
- package/dist/bin/soloforge.js +231 -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 +13 -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/consumable_asset_registry.d.ts.map +1 -1
- package/dist/engine/consumable_asset_registry.js +133 -0
- package/dist/engine/consumable_asset_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 +124 -0
- 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 +204 -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 +68 -2
- package/dist/engine/implementation_roadmap_registry.js.map +1 -1
- package/dist/engine/mechanism_contract_registry.d.ts.map +1 -1
- package/dist/engine/mechanism_contract_registry.js +68 -0
- package/dist/engine/mechanism_contract_registry.js.map +1 -1
- 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/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 +14 -1
- package/dist/engine/release_issue_scenario_registry.js.map +1 -1
- package/dist/engine/release_readiness_gate.d.ts.map +1 -1
- package/dist/engine/release_readiness_gate.js +149 -3
- 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/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 +8 -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//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_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//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/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//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/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
|
@@ -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":"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":"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;AAoF3D;;;;;;;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;AAiKD;;;;;;;;;;;GAWG;AACH;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAW3F;AAED;;;;;GAKG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,EAAE;IACzD,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,GAAG,CAAC;CACtB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAwCzH;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE;IACnD,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAWlE;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAAC,MAAM,EAAE;IACxD,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAmBzE;AAED;;;GAGG;AACH,wBAAsB,qCAAqC,CAAC,MAAM,EAAE;IAClE,GAAG,EAAE,WAAW,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,gDAAgD,EAAE,0BAA0B,CAAC;CACtG,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAmB/F;AAED;;;GAGG;AACH,wBAAsB,+BAA+B,CAAC,MAAM,EAAE;IAC5D,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,OAAO,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAgBjF;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAwBtF;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;CACxB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAwCrF;AAYD,yDAAyD;AACzD,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAc5F;AAED,+CAA+C;AAC/C,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAYzF;AAED,sDAAsD;AACtD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAYxF;AAED,wCAAwC;AACxC,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAYnF;AAED;;;;GAIG;AACH,wBAAsB,4BAA4B,CAAC,MAAM,EAAE;IACzD,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzC,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAAC,0BAA0B,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgCxH;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE;IACtD,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzC,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,0BAA0B,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBrH;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzC,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,0BAA0B,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB9G;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,GAAG,EAAE,WAAW,GAAG,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzC,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,0BAA0B,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBhH;AAED;GACG;AACH,wBAAsB,0BAA0B,CAAC,MAAM,EAAE;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,yBAAyB,EAAE,OAAO,CAAC;IACnC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,oBAAoB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA+BxK;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,yBAAyB,EAAE,OAAO,CAAC;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,cAAc,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAepE;AAED;;GAEG;AACH,wBAAsB,6BAA6B,CAAC,MAAM,EAAE;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,oBAAoB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA8B9I;AAED;;GAEG;AACH,wBAAsB,6BAA6B,CAAC,MAAM,EAAE;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,WAAW,EAAE,OAAO,CAAC;CACtB,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,oBAAoB,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA8B9I;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,MAAM,EAAE;IACvD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,mBAAmB,EAAE,OAAO,CAAC;CAC9B,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAepE;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,MAAM,EAAE;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,sBAAsB,EAAE,OAAO,CAAC;IAChC,sBAAsB,EAAE,OAAO,CAAC;IAChC,wBAAwB,EAAE,OAAO,CAAC;IAClC,sBAAsB,EAAE,OAAO,CAAC;CACjC,GAAG,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAUpD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAs3GzF"}
|
|
@@ -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.
|
|
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
|