soloforge 1.0.0 → 1.1.1
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 +4 -1
- package/dist/adapters/claude_code/claude_md.d.ts +1 -2
- package/dist/adapters/claude_code/claude_md.d.ts.map +1 -1
- package/dist/adapters/claude_code/claude_md.js +2 -76
- package/dist/adapters/claude_code/claude_md.js.map +1 -1
- package/dist/adapters/claude_code/server.d.ts +16 -0
- package/dist/adapters/claude_code/server.d.ts.map +1 -1
- package/dist/adapters/claude_code/server.js +17 -1
- package/dist/adapters/claude_code/server.js.map +1 -1
- package/dist/adapters/claude_code/tools.d.ts +32 -1
- package/dist/adapters/claude_code/tools.d.ts.map +1 -1
- package/dist/adapters/claude_code/tools.js +65 -30
- package/dist/adapters/claude_code/tools.js.map +1 -1
- package/dist/adapters/codex/codex_config.d.ts +3 -0
- package/dist/adapters/codex/codex_config.d.ts.map +1 -0
- package/dist/adapters/codex/codex_config.js +51 -0
- package/dist/adapters/codex/codex_config.js.map +1 -0
- package/dist/adapters/codex/codex_rules.d.ts +2 -0
- package/dist/adapters/codex/codex_rules.d.ts.map +1 -0
- package/dist/adapters/codex/codex_rules.js +5 -0
- package/dist/adapters/codex/codex_rules.js.map +1 -0
- package/dist/adapters/shared/workflow_template.d.ts +3 -0
- package/dist/adapters/shared/workflow_template.d.ts.map +1 -0
- package/dist/adapters/shared/workflow_template.js +78 -0
- package/dist/adapters/shared/workflow_template.js.map +1 -0
- package/dist/adapters/trae/trae_rules.d.ts +1 -2
- package/dist/adapters/trae/trae_rules.d.ts.map +1 -1
- package/dist/adapters/trae/trae_rules.js +2 -75
- package/dist/adapters/trae/trae_rules.js.map +1 -1
- package/dist/bin/soloforge.js +171 -22
- package/dist/bin/soloforge.js.map +1 -1
- package/dist/engine/change_coordinator.d.ts +20 -5
- package/dist/engine/change_coordinator.d.ts.map +1 -1
- package/dist/engine/change_coordinator.js +36 -22
- package/dist/engine/change_coordinator.js.map +1 -1
- package/dist/engine/classifier.d.ts +7 -0
- package/dist/engine/classifier.d.ts.map +1 -1
- package/dist/engine/classifier.js +75 -3
- package/dist/engine/classifier.js.map +1 -1
- package/dist/engine/code_reviewer.d.ts +37 -1
- package/dist/engine/code_reviewer.d.ts.map +1 -1
- package/dist/engine/code_reviewer.js +126 -24
- package/dist/engine/code_reviewer.js.map +1 -1
- package/dist/engine/confidence_scorer.d.ts +21 -0
- package/dist/engine/confidence_scorer.d.ts.map +1 -1
- package/dist/engine/confidence_scorer.js +19 -6
- package/dist/engine/confidence_scorer.js.map +1 -1
- package/dist/engine/contract_guard.d.ts +23 -0
- package/dist/engine/contract_guard.d.ts.map +1 -1
- package/dist/engine/contract_guard.js +152 -43
- package/dist/engine/contract_guard.js.map +1 -1
- package/dist/engine/convention_detector.d.ts +20 -0
- package/dist/engine/convention_detector.d.ts.map +1 -1
- package/dist/engine/convention_detector.js +19 -1
- package/dist/engine/convention_detector.js.map +1 -1
- package/dist/engine/debt_reporter.d.ts +5 -0
- package/dist/engine/debt_reporter.d.ts.map +1 -1
- package/dist/engine/debt_reporter.js +30 -6
- package/dist/engine/debt_reporter.js.map +1 -1
- package/dist/engine/debt_tracker.d.ts +52 -0
- package/dist/engine/debt_tracker.d.ts.map +1 -1
- package/dist/engine/debt_tracker.js +66 -1
- package/dist/engine/debt_tracker.js.map +1 -1
- package/dist/engine/debugger.d.ts +9 -0
- package/dist/engine/debugger.d.ts.map +1 -1
- package/dist/engine/debugger.js +112 -20
- package/dist/engine/debugger.js.map +1 -1
- package/dist/engine/delivery.d.ts +27 -0
- package/dist/engine/delivery.d.ts.map +1 -1
- package/dist/engine/delivery.js +67 -13
- package/dist/engine/delivery.js.map +1 -1
- package/dist/engine/dependency_scanner.d.ts +5 -8
- package/dist/engine/dependency_scanner.d.ts.map +1 -1
- package/dist/engine/dependency_scanner.js +46 -29
- package/dist/engine/dependency_scanner.js.map +1 -1
- package/dist/engine/evolver.d.ts +54 -0
- package/dist/engine/evolver.d.ts.map +1 -1
- package/dist/engine/evolver.js +159 -6
- package/dist/engine/evolver.js.map +1 -1
- package/dist/engine/exploration.d.ts +114 -0
- package/dist/engine/exploration.d.ts.map +1 -0
- package/dist/engine/exploration.js +414 -0
- package/dist/engine/exploration.js.map +1 -0
- package/dist/engine/failure_classifier.d.ts +28 -0
- package/dist/engine/failure_classifier.d.ts.map +1 -1
- package/dist/engine/failure_classifier.js +51 -5
- package/dist/engine/failure_classifier.js.map +1 -1
- package/dist/engine/git_deps.d.ts +29 -0
- package/dist/engine/git_deps.d.ts.map +1 -1
- package/dist/engine/git_deps.js +1 -0
- package/dist/engine/git_deps.js.map +1 -1
- package/dist/engine/impact_analyzer.d.ts +17 -0
- package/dist/engine/impact_analyzer.d.ts.map +1 -1
- package/dist/engine/impact_analyzer.js +76 -4
- package/dist/engine/impact_analyzer.js.map +1 -1
- package/dist/engine/intent_expander.d.ts +58 -0
- package/dist/engine/intent_expander.d.ts.map +1 -1
- package/dist/engine/intent_expander.js +173 -1
- package/dist/engine/intent_expander.js.map +1 -1
- package/dist/engine/migration_guard.d.ts +6 -0
- package/dist/engine/migration_guard.d.ts.map +1 -1
- package/dist/engine/migration_guard.js +26 -7
- package/dist/engine/migration_guard.js.map +1 -1
- package/dist/engine/observability.d.ts +31 -7
- package/dist/engine/observability.d.ts.map +1 -1
- package/dist/engine/observability.js +88 -28
- package/dist/engine/observability.js.map +1 -1
- package/dist/engine/onboarding.d.ts +41 -1
- package/dist/engine/onboarding.d.ts.map +1 -1
- package/dist/engine/onboarding.js +83 -8
- package/dist/engine/onboarding.js.map +1 -1
- package/dist/engine/scaffolder.d.ts +10 -0
- package/dist/engine/scaffolder.d.ts.map +1 -1
- package/dist/engine/scaffolder.js +55 -10
- package/dist/engine/scaffolder.js.map +1 -1
- package/dist/engine/scope_controller.d.ts +13 -0
- package/dist/engine/scope_controller.d.ts.map +1 -1
- package/dist/engine/scope_controller.js +76 -12
- package/dist/engine/scope_controller.js.map +1 -1
- package/dist/engine/task_context.d.ts +124 -0
- package/dist/engine/task_context.d.ts.map +1 -1
- package/dist/engine/task_context.js +155 -7
- package/dist/engine/task_context.js.map +1 -1
- package/dist/engine/task_planner.d.ts +17 -0
- package/dist/engine/task_planner.d.ts.map +1 -1
- package/dist/engine/task_planner.js +51 -4
- package/dist/engine/task_planner.js.map +1 -1
- package/dist/engine/team_awareness.d.ts +17 -0
- package/dist/engine/team_awareness.d.ts.map +1 -1
- package/dist/engine/team_awareness.js +29 -11
- package/dist/engine/team_awareness.js.map +1 -1
- package/dist/engine/test_generator.d.ts +5 -4
- package/dist/engine/test_generator.d.ts.map +1 -1
- package/dist/engine/test_generator.js +22 -5
- package/dist/engine/test_generator.js.map +1 -1
- package/dist/engine/test_quality.d.ts +11 -4
- package/dist/engine/test_quality.d.ts.map +1 -1
- package/dist/engine/test_quality.js +171 -14
- package/dist/engine/test_quality.js.map +1 -1
- package/dist/engine/verifier.d.ts +41 -0
- package/dist/engine/verifier.d.ts.map +1 -1
- package/dist/engine/verifier.js +110 -1
- package/dist/engine/verifier.js.map +1 -1
- package/dist/git/operations.d.ts +1 -0
- package/dist/git/operations.d.ts.map +1 -1
- package/dist/git/operations.js +3 -0
- package/dist/git/operations.js.map +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/knowledge/index_manager.d.ts +7 -1
- package/dist/knowledge/index_manager.d.ts.map +1 -1
- package/dist/knowledge/index_manager.js +112 -37
- package/dist/knowledge/index_manager.js.map +1 -1
- package/dist/knowledge/loader.d.ts +31 -0
- package/dist/knowledge/loader.d.ts.map +1 -1
- package/dist/knowledge/loader.js +102 -8
- package/dist/knowledge/loader.js.map +1 -1
- package/dist/types.d.ts +608 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/templates/knowledge/acceptance_templates//346/212/200/346/234/257/351/200/211/345/236/213/351/252/214/346/224/266/346/270/205/345/215/225.md +19 -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 +4 -0
- package/templates/knowledge/procedures//345/212/237/350/203/275/345/274/200/345/217/221/346/265/201/347/250/213.md +4 -1
- package/templates/knowledge/procedures//350/207/252/344/270/273/351/200/211/345/236/213/346/265/201/347/250/213.md +34 -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 +66 -0
- package/templates/scaffolds/react/Form.tsx.hbs +9 -1
- package/templates/scaffolds/react/List.tsx.hbs +10 -1
- package/templates/scaffolds/react/Page.tsx.hbs +4 -1
- package/templates/scaffolds/react/service.ts.hbs +29 -0
- package/templates/scaffolds/react/types.ts.hbs +7 -1
- package/templates/scaffolds/react/use{{ModuleName}}.ts.hbs +34 -2
- package/templates/scaffolds/spring-boot/Controller.java.hbs +27 -0
- package/templates/scaffolds/spring-boot/DTO.java.hbs +7 -1
- package/templates/scaffolds/spring-boot/Entity.java.hbs +11 -1
- package/templates/scaffolds/spring-boot/ErrorCode.java.hbs +13 -1
- package/templates/scaffolds/spring-boot/Mapper.java.hbs +4 -1
- package/templates/scaffolds/spring-boot/PageResponse.java.hbs +24 -1
- package/templates/scaffolds/spring-boot/Service.java.hbs +32 -0
- package/templates/scaffolds/spring-boot/ServiceImpl.java.hbs +23 -5
- package/templates/scaffolds/spring-boot/ServiceTest.java.hbs +7 -1
package/README.md
CHANGED
|
@@ -10,8 +10,11 @@ SoloForge 是一个 [MCP (Model Context Protocol)](https://modelcontextprotocol.
|
|
|
10
10
|
# 全局安装
|
|
11
11
|
npm install -g soloforge
|
|
12
12
|
|
|
13
|
-
#
|
|
13
|
+
# 或直接使用(不安装)
|
|
14
14
|
npx soloforge init
|
|
15
|
+
|
|
16
|
+
# 更新到最新版本
|
|
17
|
+
npm update -g soloforge
|
|
15
18
|
```
|
|
16
19
|
|
|
17
20
|
`init` 命令会生成项目配置(`.soloforge/config.yaml`)、初始化知识模板、并为你的 AI 工具生成适配配置。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude_md.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/claude_md.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude_md.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/claude_md.ts"],"names":[],"mappings":"AAEA,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,gBAAgB,EAAE,aAAa,GAAG,MAAM,CAEvF"}
|
|
@@ -1,79 +1,5 @@
|
|
|
1
|
+
import { generateWorkflowRules } from "../shared/workflow_template.js";
|
|
1
2
|
export function generateClaudeMd(config) {
|
|
2
|
-
return
|
|
3
|
-
|
|
4
|
-
## 强制工作流
|
|
5
|
-
|
|
6
|
-
当收到开发指令时(非纯对话/提问),必须按以下顺序执行:
|
|
7
|
-
|
|
8
|
-
### 步骤 1: 分类
|
|
9
|
-
调用 \`sf_classify\` 工具,传入用户意图和当前项目路径。
|
|
10
|
-
|
|
11
|
-
### 步骤 1.5: 任务拆解(建议)
|
|
12
|
-
如果分类结果 complexity=high 且 strategy=full_pipeline,调用 \`sf_plan\` 查看拆解建议。
|
|
13
|
-
如果 \`sf_plan\` 返回多阶段计划(sub_tasks > 1),则按阶段执行:
|
|
14
|
-
1. 调用 \`sf_expand\` 获取当前阶段指令(自动注入模板和前序产出)
|
|
15
|
-
2. 执行该阶段任务
|
|
16
|
-
3. 调用 \`sf_plan_advance\` 推进到下一阶段
|
|
17
|
-
4. 重复直到所有阶段完成
|
|
18
|
-
|
|
19
|
-
### 步骤 2: 根据分类结果执行
|
|
20
|
-
- task_type = "scaffold" → 调用 \`sf_scaffold\` 生成代码骨架,然后填充业务逻辑
|
|
21
|
-
- strategy = "full_pipeline" → 调用 \`sf_expand\`,然后按 expand 的 prompt 执行
|
|
22
|
-
- strategy = "quick_fix" → 调用 \`sf_expand\`(简化版),然后执行
|
|
23
|
-
- strategy = "skip_soloForge" → 直接处理,不调用 SoloForge 工具
|
|
24
|
-
|
|
25
|
-
### 步骤 2.5: 影响分析(建议)
|
|
26
|
-
执行 \`sf_expand\` 后,可选择调用 \`sf_analyze\` 查看影响范围分析。如果提示范围不足,可扩大作用域或确认范围。
|
|
27
|
-
|
|
28
|
-
### 步骤 3: 代码修改后验证
|
|
29
|
-
所有代码修改完成后,调用 \`sf_verify\` 获取验证命令。
|
|
30
|
-
通过 Bash 工具执行 \`sf_verify\` 返回的验证命令。
|
|
31
|
-
|
|
32
|
-
### 步骤 3.5: 代码审查(建议)
|
|
33
|
-
验证通过后,可选择调用 \`sf_review\` 进行代码审查。hotfix 场景自动跳过。
|
|
34
|
-
审查结果包含质量、安全、性能、架构、技术债务五个维度。支持知识驱动审查规则。技术债务自动记录,不强制修复。
|
|
35
|
-
|
|
36
|
-
### 步骤 3.6: 契约检查(建议)
|
|
37
|
-
如果变更涉及 API 路由、DTO、接口文件,可调用 \`sf_contract_check\` 检测破坏性变更和跨服务影响。
|
|
38
|
-
|
|
39
|
-
### 步骤 4: 学习
|
|
40
|
-
验证完成后(无论通过或失败),调用 \`sf_learn\` 传入验证结果。
|
|
41
|
-
如果 \`sf_learn\` 返回 \`retry_hint\`,表示需要修复后重试,回到步骤 3 重新验证。
|
|
42
|
-
|
|
43
|
-
### 步骤 5: 结果汇报
|
|
44
|
-
向开发者展示:
|
|
45
|
-
- 验证结果摘要
|
|
46
|
-
- 自动化验收通过/失败项
|
|
47
|
-
- 需人工确认的项(如有)
|
|
48
|
-
|
|
49
|
-
### 步骤 5.5: 变更协调检查(建议)
|
|
50
|
-
推送前可调用 \`sf_coord_check\` 检查潜在冲突和跨仓库影响。
|
|
51
|
-
|
|
52
|
-
### 步骤 5.6: 自动交付(可选)
|
|
53
|
-
调用 \`sf_deliver\` 自动提交代码、推送、创建 PR 和生成变更日志。
|
|
54
|
-
新人加入项目时,使用 \`sf_onboard\` 进行分步引导。
|
|
55
|
-
需要查看团队状态时,调用 \`sf_team_status\`。
|
|
56
|
-
|
|
57
|
-
### 步骤 5.7: 知识维护(可选)
|
|
58
|
-
定期调用 \`sf_knowledge_audit\` 审计知识库健康度。
|
|
59
|
-
发现需要新增的知识条目时,调用 \`sf_knowledge_add\` 生成草稿(默认保存到 drafts/,需人工确认)。
|
|
60
|
-
需要更新已有条目时,调用 \`sf_knowledge_update\`(自动创建备份)。
|
|
61
|
-
|
|
62
|
-
## 任务管理
|
|
63
|
-
|
|
64
|
-
使用 \`sf_status\` 工具管理任务生命周期:
|
|
65
|
-
- \`sf_status action=current\` — 查看当前任务状态
|
|
66
|
-
- \`sf_status action=recent\` — 列出近期任务
|
|
67
|
-
- \`sf_status action=resume task_id=xxx\` — 恢复中断的任务
|
|
68
|
-
- \`sf_status action=cancel task_id=xxx\` — 取消未完成的任务
|
|
69
|
-
|
|
70
|
-
对话中断后,先用 \`sf_status action=current\` 检查是否有未完成任务。
|
|
71
|
-
|
|
72
|
-
## 项目信息
|
|
73
|
-
|
|
74
|
-
- 产品: ${config.product_profile}
|
|
75
|
-
- 后端: ${config.tech_stack.backend.framework} ${config.tech_stack.backend.version}
|
|
76
|
-
- 前端: ${config.tech_stack.frontend.framework} ${config.tech_stack.frontend.version}
|
|
77
|
-
`;
|
|
3
|
+
return generateWorkflowRules(config) + "\n";
|
|
78
4
|
}
|
|
79
5
|
//# sourceMappingURL=claude_md.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude_md.js","sourceRoot":"","sources":["../../../src/adapters/claude_code/claude_md.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude_md.js","sourceRoot":"","sources":["../../../src/adapters/claude_code/claude_md.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,MAAM,UAAU,gBAAgB,CAAC,MAA8C;IAC7E,OAAO,qBAAqB,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;AAC9C,CAAC"}
|
|
@@ -1,10 +1,26 @@
|
|
|
1
1
|
import type { ProjectConfig } from "../../types.js";
|
|
2
2
|
import { KnowledgeIndexManager } from "../../knowledge/index_manager.js";
|
|
3
3
|
import { TaskContextManager } from "../../engine/task_context.js";
|
|
4
|
+
/**
|
|
5
|
+
* MCP Server 启动模块。
|
|
6
|
+
* @description 创建 SoloForge MCP 服务器实例,注册所有工具,通过 stdio 传输与 Claude Code 通信。
|
|
7
|
+
* 负责进程生命周期管理:优雅关闭(SIGTERM/SIGINT)、客户端断开检测(SIGPIPE)、
|
|
8
|
+
* 未捕获异常处理,确保资源正确释放。
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Server 依赖项接口。
|
|
12
|
+
* @description 封装 MCP 服务器运行所需的全部依赖。
|
|
13
|
+
*/
|
|
4
14
|
export interface ServerDeps {
|
|
5
15
|
config: ProjectConfig;
|
|
6
16
|
knowledgeIndex: KnowledgeIndexManager;
|
|
7
17
|
taskContext: TaskContextManager;
|
|
8
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* 启动 SoloForge MCP 服务器。
|
|
21
|
+
* @description 创建 McpServer 实例,注册工具,通过 stdio 传输连接 Claude Code,
|
|
22
|
+
* 并设置信号处理和异常处理以确保优雅关闭。
|
|
23
|
+
* @param deps - 服务器依赖项(配置、知识索引、任务上下文)
|
|
24
|
+
*/
|
|
9
25
|
export declare function startServer(deps: ServerDeps): Promise<void>;
|
|
10
26
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,EAAE,qBAAqB,CAAC;IACtC,WAAW,EAAE,kBAAkB,CAAC;CACjC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/server.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAElE;;;;;GAKG;AAEH;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB,cAAc,EAAE,qBAAqB,CAAC;IACtC,WAAW,EAAE,kBAAkB,CAAC;CACjC;AAqBD;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DjE"}
|
|
@@ -3,6 +3,13 @@ import path from "node:path";
|
|
|
3
3
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
4
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
5
|
import { registerTools } from "./tools.js";
|
|
6
|
+
/**
|
|
7
|
+
* 检查当前项目是否为 SoloForge 自身项目(内部方法)。
|
|
8
|
+
* @description 通过检查 package.json 中的 name 字段判断是否为 SoloForge 自身。
|
|
9
|
+
* SoloForge 自身项目会额外注册知识维护工具(sf_knowledge_audit/add/update)。
|
|
10
|
+
* @param config - 项目配置对象
|
|
11
|
+
* @returns 是否为 SoloForge 自身项目
|
|
12
|
+
*/
|
|
6
13
|
function isSoloForgeProject(config) {
|
|
7
14
|
const projectPath = config._projectPath || process.cwd();
|
|
8
15
|
try {
|
|
@@ -15,6 +22,12 @@ function isSoloForgeProject(config) {
|
|
|
15
22
|
return false;
|
|
16
23
|
}
|
|
17
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* 启动 SoloForge MCP 服务器。
|
|
27
|
+
* @description 创建 McpServer 实例,注册工具,通过 stdio 传输连接 Claude Code,
|
|
28
|
+
* 并设置信号处理和异常处理以确保优雅关闭。
|
|
29
|
+
* @param deps - 服务器依赖项(配置、知识索引、任务上下文)
|
|
30
|
+
*/
|
|
18
31
|
export async function startServer(deps) {
|
|
19
32
|
const { config, knowledgeIndex, taskContext } = deps;
|
|
20
33
|
const server = new McpServer({
|
|
@@ -27,6 +40,7 @@ export async function startServer(deps) {
|
|
|
27
40
|
const transport = new StdioServerTransport();
|
|
28
41
|
await server.connect(transport);
|
|
29
42
|
let shuttingDown = false;
|
|
43
|
+
// 优雅关闭:关闭知识索引监听器和传输层,防止重复触发
|
|
30
44
|
const shutdown = async () => {
|
|
31
45
|
if (shuttingDown)
|
|
32
46
|
return;
|
|
@@ -43,10 +57,11 @@ export async function startServer(deps) {
|
|
|
43
57
|
};
|
|
44
58
|
process.on("SIGTERM", shutdown);
|
|
45
59
|
process.on("SIGINT", shutdown);
|
|
60
|
+
// 客户端(Claude Code)断开连接,触发优雅退出
|
|
46
61
|
process.on("SIGPIPE", () => {
|
|
47
|
-
// 客户端断开连接,优雅退出
|
|
48
62
|
shutdown();
|
|
49
63
|
});
|
|
64
|
+
// 捕获未处理的同步异常,确保资源释放后退出
|
|
50
65
|
process.on("uncaughtException", async (err) => {
|
|
51
66
|
console.error("SoloForge 未捕获异常:", err);
|
|
52
67
|
try {
|
|
@@ -59,6 +74,7 @@ export async function startServer(deps) {
|
|
|
59
74
|
}
|
|
60
75
|
process.exit(1);
|
|
61
76
|
});
|
|
77
|
+
// 捕获未处理的 Promise 拒绝,确保资源释放后退出
|
|
62
78
|
process.on("unhandledRejection", async (reason) => {
|
|
63
79
|
console.error("SoloForge 未处理的 Promise 拒绝:", reason);
|
|
64
80
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/adapters/claude_code/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/adapters/claude_code/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,14 +2,45 @@ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
|
2
2
|
import type { ProjectConfig } from "../../types.js";
|
|
3
3
|
import type { KnowledgeIndexManager } from "../../knowledge/index_manager.js";
|
|
4
4
|
import type { TaskContextManager } from "../../engine/task_context.js";
|
|
5
|
+
/**
|
|
6
|
+
* MCP 工具注册模块。
|
|
7
|
+
* @description 将 SoloForge 的全部功能封装为 MCP 工具,注册到 McpServer 实例。
|
|
8
|
+
* 每个工具通过统一的错误处理包装器(registerSafeTool)注册,确保异常不会导致服务崩溃。
|
|
9
|
+
* 工具分为三类:核心流程工具(classify/expand/verify/learn/status)、
|
|
10
|
+
* 辅助工具(plan/review/scaffold/deliver 等)、自维护工具(knowledge_audit/add/update)。
|
|
11
|
+
* 自维护工具仅在 SoloForge 自身项目中注册。
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* SoloForge 核心依赖项。
|
|
15
|
+
* @description 封装所有 MCP 工具共享的依赖:项目配置、知识索引和任务上下文。
|
|
16
|
+
*/
|
|
5
17
|
export interface SoloForgeDeps {
|
|
18
|
+
/** 项目配置对象 */
|
|
6
19
|
config: ProjectConfig;
|
|
20
|
+
/** 知识索引管理器 */
|
|
7
21
|
knowledgeIndex: KnowledgeIndexManager;
|
|
22
|
+
/** 任务上下文管理器 */
|
|
8
23
|
taskContext: TaskContextManager;
|
|
9
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* 工具注册选项。
|
|
27
|
+
*/
|
|
10
28
|
export interface RegisterToolsOptions {
|
|
11
|
-
/**
|
|
29
|
+
/** 是否为 SoloForge 自身项目(true 时注册自维护工具) */
|
|
12
30
|
isSelfProject?: boolean;
|
|
13
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* 注册所有 SoloForge MCP 工具。
|
|
34
|
+
* @description 核心注册函数,将全部 MCP 工具注册到指定的 McpServer 实例。
|
|
35
|
+
* 包含:sf_classify、sf_expand、sf_verify、sf_learn、sf_status、
|
|
36
|
+
* sf_plan、sf_plan_advance、sf_analyze、sf_review、sf_scaffold、
|
|
37
|
+
* sf_deliver、sf_coord_check、sf_team_status、sf_contract_check、
|
|
38
|
+
* sf_onboard、sf_feasibility_check、sf_debug、sf_observability、
|
|
39
|
+
* sf_migration_check、sf_test_guide、sf_test_quality、sf_dependency_scan、
|
|
40
|
+
* sf_debt_report,以及条件注册的 sf_knowledge_audit/add/update。
|
|
41
|
+
* @param server - MCP 服务器实例
|
|
42
|
+
* @param deps - SoloForge 核心依赖项
|
|
43
|
+
* @param options - 注册选项(控制自维护工具是否注册)
|
|
44
|
+
*/
|
|
14
45
|
export declare function registerTools(server: McpServer, deps: SoloForgeDeps, options?: RegisterToolsOptions): void;
|
|
15
46
|
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/adapters/claude_code/tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AA2BvE;;;;;;;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;CACjC;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAuHD;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAk5B1G"}
|
|
@@ -23,6 +23,7 @@ import { generateTestGuide } from "../../engine/test_generator.js";
|
|
|
23
23
|
import { analyzeTestQuality } from "../../engine/test_quality.js";
|
|
24
24
|
import { scanDependencies } from "../../engine/dependency_scanner.js";
|
|
25
25
|
import { generateDebtReport } from "../../engine/debt_reporter.js";
|
|
26
|
+
import { exploreSolutions } from "../../engine/exploration.js";
|
|
26
27
|
// ── Zod Schema 定义 ──
|
|
27
28
|
const ClassifySchema = {
|
|
28
29
|
intent: z.string().describe("开发者意图描述"),
|
|
@@ -111,11 +112,28 @@ const DependencyScanSchema = {
|
|
|
111
112
|
content: z.string().describe("依赖声明文件内容(package.json / pom.xml / build.gradle)"),
|
|
112
113
|
filename: z.string().describe("文件名"),
|
|
113
114
|
};
|
|
115
|
+
const ExploreSchema = {
|
|
116
|
+
domain_query: z.string().describe("技术选型领域关键词(如:分布式锁、流式处理、复杂表单状态管理、缓存策略)"),
|
|
117
|
+
task_id: z.string().optional().describe("关联任务 ID(可选,用于关联项目上下文)"),
|
|
118
|
+
};
|
|
114
119
|
// ── 工具注册 ──
|
|
120
|
+
/**
|
|
121
|
+
* 注册所有 SoloForge MCP 工具。
|
|
122
|
+
* @description 核心注册函数,将全部 MCP 工具注册到指定的 McpServer 实例。
|
|
123
|
+
* 包含:sf_classify、sf_expand、sf_verify、sf_learn、sf_status、
|
|
124
|
+
* sf_plan、sf_plan_advance、sf_analyze、sf_review、sf_scaffold、
|
|
125
|
+
* sf_deliver、sf_coord_check、sf_team_status、sf_contract_check、
|
|
126
|
+
* sf_onboard、sf_feasibility_check、sf_debug、sf_observability、
|
|
127
|
+
* sf_migration_check、sf_test_guide、sf_test_quality、sf_dependency_scan、
|
|
128
|
+
* sf_debt_report,以及条件注册的 sf_knowledge_audit/add/update。
|
|
129
|
+
* @param server - MCP 服务器实例
|
|
130
|
+
* @param deps - SoloForge 核心依赖项
|
|
131
|
+
* @param options - 注册选项(控制自维护工具是否注册)
|
|
132
|
+
*/
|
|
115
133
|
export function registerTools(server, deps, options) {
|
|
116
134
|
const { config, knowledgeIndex, taskContext } = deps;
|
|
117
135
|
const projectPath = config._projectPath || process.cwd();
|
|
118
|
-
//
|
|
136
|
+
// 统一错误处理包装器,捕获工具执行中的异常并返回结构化错误响应
|
|
119
137
|
function registerSafeTool(name, desc, schema, handler) {
|
|
120
138
|
server.tool(name, desc, schema, async (args) => {
|
|
121
139
|
try {
|
|
@@ -129,7 +147,7 @@ export function registerTools(server, deps, options) {
|
|
|
129
147
|
}
|
|
130
148
|
});
|
|
131
149
|
}
|
|
132
|
-
// ── sf_classify ──
|
|
150
|
+
// ── sf_classify: 意图分类入口,创建任务上下文并返回分类结果 ──
|
|
133
151
|
registerSafeTool("sf_classify", "分析开发者意图,返回任务类型、风险、复杂度和执行策略", ClassifySchema, async (args) => {
|
|
134
152
|
// 检查是否存在进行中的任务
|
|
135
153
|
const existing = await taskContext.getCurrentTask();
|
|
@@ -166,7 +184,7 @@ export function registerTools(server, deps, options) {
|
|
|
166
184
|
}],
|
|
167
185
|
};
|
|
168
186
|
});
|
|
169
|
-
// ── sf_expand ──
|
|
187
|
+
// ── sf_expand: 意图膨胀,生成结构化 prompt 并注入计划上下文 ──
|
|
170
188
|
registerSafeTool("sf_expand", "将意图膨胀为结构化 prompt,包含 scope、验收标准和知识匹配。当存在计划时自动注入当前阶段上下文和输出模板", ExpandSchema, async (args) => {
|
|
171
189
|
const ctx = await taskContext.load(args.task_id);
|
|
172
190
|
if (!ctx || !ctx.classification) {
|
|
@@ -217,7 +235,7 @@ export function registerTools(server, deps, options) {
|
|
|
217
235
|
}],
|
|
218
236
|
};
|
|
219
237
|
});
|
|
220
|
-
// ── sf_verify ──
|
|
238
|
+
// ── sf_verify: 生成验证命令(构建、测试、验收检查) ──
|
|
221
239
|
registerSafeTool("sf_verify", "根据变更文件生成验证命令(构建、测试、验收检查),由 Claude Code Bash 执行", VerifySchema, async (args) => {
|
|
222
240
|
const ctx = await taskContext.load(args.task_id);
|
|
223
241
|
if (!ctx) {
|
|
@@ -226,8 +244,6 @@ export function registerTools(server, deps, options) {
|
|
|
226
244
|
isError: true,
|
|
227
245
|
};
|
|
228
246
|
}
|
|
229
|
-
// 转换到验证阶段
|
|
230
|
-
await taskContext.updateStatus(args.task_id, "verifying");
|
|
231
247
|
const acceptanceItems = ctx.expansion
|
|
232
248
|
? [...ctx.expansion.acceptance.automated, ...ctx.expansion.acceptance.manual]
|
|
233
249
|
: [];
|
|
@@ -235,6 +251,8 @@ export function registerTools(server, deps, options) {
|
|
|
235
251
|
verifyResult.task_id = args.task_id;
|
|
236
252
|
// 记录变更文件
|
|
237
253
|
await taskContext.setExecution(args.task_id, args.changed_files);
|
|
254
|
+
// 生成验证命令成功后再转换状态,避免操作失败导致任务卡在 verifying
|
|
255
|
+
await taskContext.updateStatus(args.task_id, "verifying");
|
|
238
256
|
// 存储验证结果
|
|
239
257
|
await taskContext.setVerification(args.task_id, verifyResult);
|
|
240
258
|
return {
|
|
@@ -244,7 +262,7 @@ export function registerTools(server, deps, options) {
|
|
|
244
262
|
}],
|
|
245
263
|
};
|
|
246
264
|
});
|
|
247
|
-
// ── sf_learn ──
|
|
265
|
+
// ── sf_learn: 从执行结果中提取知识,支持重试循环控制 ──
|
|
248
266
|
registerSafeTool("sf_learn", "从任务执行结果中提取知识,低置信度暂存,高置信度直接入库", LearnSchema, async (args) => {
|
|
249
267
|
const ctx = await taskContext.load(args.task_id);
|
|
250
268
|
if (!ctx) {
|
|
@@ -293,7 +311,7 @@ export function registerTools(server, deps, options) {
|
|
|
293
311
|
}],
|
|
294
312
|
};
|
|
295
313
|
});
|
|
296
|
-
// ── sf_status ──
|
|
314
|
+
// ── sf_status: 任务状态查询(current/recent/resume/cancel) ──
|
|
297
315
|
registerSafeTool("sf_status", "查询当前任务状态、列出近期任务、恢复中断任务或取消任务", StatusSchema, async (args) => {
|
|
298
316
|
const action = args.action || "current";
|
|
299
317
|
switch (action) {
|
|
@@ -399,7 +417,7 @@ export function registerTools(server, deps, options) {
|
|
|
399
417
|
};
|
|
400
418
|
}
|
|
401
419
|
});
|
|
402
|
-
// ── sf_plan ──
|
|
420
|
+
// ── sf_plan: 复杂意图任务拆解为子任务列表 ──
|
|
403
421
|
registerSafeTool("sf_plan", "将复杂意图拆解为子任务列表。支持知识驱动的 pipeline_procedure 流程(自动绑定模板)和仓库边界拆分两种策略。仅在 complexity=high 时有效", PlanSchema, async (args) => {
|
|
404
422
|
const ctx = await taskContext.load(args.task_id);
|
|
405
423
|
if (!ctx?.classification) {
|
|
@@ -420,7 +438,7 @@ export function registerTools(server, deps, options) {
|
|
|
420
438
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
421
439
|
};
|
|
422
440
|
});
|
|
423
|
-
// ── sf_plan_advance ──
|
|
441
|
+
// ── sf_plan_advance: 推进多阶段计划到下一步 ──
|
|
424
442
|
registerSafeTool("sf_plan_advance", "将多阶段计划推进到下一步。完成当前阶段后调用,自动更新 current_step_index 并返回下一阶段信息", PlanSchema, async (args) => {
|
|
425
443
|
const ctx = await taskContext.load(args.task_id);
|
|
426
444
|
if (!ctx?.planning || ctx.planning.sub_tasks.length === 0) {
|
|
@@ -468,7 +486,7 @@ export function registerTools(server, deps, options) {
|
|
|
468
486
|
}],
|
|
469
487
|
};
|
|
470
488
|
});
|
|
471
|
-
// ── sf_analyze ──
|
|
489
|
+
// ── sf_analyze: 影响范围分析,建议是否扩大作用域 ──
|
|
472
490
|
registerSafeTool("sf_analyze", "分析意图的影响范围,对比声明范围,提示是否需要扩大作用域。建议性,不强制", AnalyzeSchema, async (args) => {
|
|
473
491
|
const ctx = await taskContext.load(args.task_id);
|
|
474
492
|
if (!ctx?.expansion) {
|
|
@@ -489,7 +507,7 @@ export function registerTools(server, deps, options) {
|
|
|
489
507
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
490
508
|
};
|
|
491
509
|
});
|
|
492
|
-
// ── sf_review ──
|
|
510
|
+
// ── sf_review: 代码审查(质量、安全、性能、技术债务) ──
|
|
493
511
|
registerSafeTool("sf_review", "审查代码变更的质量、安全、性能和技术债务。hotfix 场景可跳过。建议性,不强制修复", ReviewSchema, async (args) => {
|
|
494
512
|
const ctx = await taskContext.load(args.task_id);
|
|
495
513
|
if (!ctx) {
|
|
@@ -514,7 +532,7 @@ export function registerTools(server, deps, options) {
|
|
|
514
532
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
515
533
|
};
|
|
516
534
|
});
|
|
517
|
-
// ── sf_scaffold ──
|
|
535
|
+
// ── sf_scaffold: 生成标准化代码骨架 ──
|
|
518
536
|
registerSafeTool("sf_scaffold", "根据项目模板生成标准化代码骨架(Controller/Service/DTO/测试等)。仅在 task_type=scaffold 时使用", ScaffoldSchema, async (args) => {
|
|
519
537
|
const ctx = await taskContext.load(args.task_id);
|
|
520
538
|
if (!ctx?.classification) {
|
|
@@ -546,7 +564,7 @@ export function registerTools(server, deps, options) {
|
|
|
546
564
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
547
565
|
};
|
|
548
566
|
});
|
|
549
|
-
// ── sf_deliver ──
|
|
567
|
+
// ── sf_deliver: 自动提交、推送、创建 PR ──
|
|
550
568
|
registerSafeTool("sf_deliver", "验收后自动提交代码、推送、创建 PR 和生成变更日志", DeliverSchema, async (args) => {
|
|
551
569
|
const ctx = await taskContext.load(args.task_id);
|
|
552
570
|
if (!ctx) {
|
|
@@ -569,7 +587,7 @@ export function registerTools(server, deps, options) {
|
|
|
569
587
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
570
588
|
};
|
|
571
589
|
});
|
|
572
|
-
// ── sf_coord_check ──
|
|
590
|
+
// ── sf_coord_check: 预测性冲突检测和跨仓库协调 ──
|
|
573
591
|
registerSafeTool("sf_coord_check", "预测性冲突检测和跨仓库协调提示,检查分支状态、本地变更和潜在冲突", CoordCheckSchema, async (args) => {
|
|
574
592
|
const result = await checkConflicts({
|
|
575
593
|
projectPath,
|
|
@@ -581,7 +599,7 @@ export function registerTools(server, deps, options) {
|
|
|
581
599
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
582
600
|
};
|
|
583
601
|
});
|
|
584
|
-
// ── sf_team_status ──
|
|
602
|
+
// ── sf_team_status: 团队活动流和工作负载查询 ──
|
|
585
603
|
registerSafeTool("sf_team_status", "查询团队活动流、成员工作负载、过期分支和知识库更新状态", TeamStatusSchema, async (args) => {
|
|
586
604
|
const result = await getTeamStatus({
|
|
587
605
|
projectPath,
|
|
@@ -594,7 +612,7 @@ export function registerTools(server, deps, options) {
|
|
|
594
612
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
595
613
|
};
|
|
596
614
|
});
|
|
597
|
-
// ── sf_contract_check ──
|
|
615
|
+
// ── sf_contract_check: API 契约变更检测 ──
|
|
598
616
|
registerSafeTool("sf_contract_check", "检测 API 契约变更(路由、DTO 字段等),评估破坏性影响和跨服务依赖", ContractCheckSchema, async (args) => {
|
|
599
617
|
let changedFiles = args.changed_files;
|
|
600
618
|
if (!changedFiles) {
|
|
@@ -611,7 +629,7 @@ export function registerTools(server, deps, options) {
|
|
|
611
629
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
612
630
|
};
|
|
613
631
|
});
|
|
614
|
-
// ── sf_onboard ──
|
|
632
|
+
// ── sf_onboard: 新人分步引导 ──
|
|
615
633
|
registerSafeTool("sf_onboard", "新人分步引导:项目概览 → 代码导览 → 知识回顾 → 首个任务建议", OnboardSchema, async (args) => {
|
|
616
634
|
const result = await onboard({
|
|
617
635
|
config,
|
|
@@ -625,7 +643,7 @@ export function registerTools(server, deps, options) {
|
|
|
625
643
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
626
644
|
};
|
|
627
645
|
});
|
|
628
|
-
// ── sf_feasibility_check ──
|
|
646
|
+
// ── sf_feasibility_check: 任务可行性评估 ──
|
|
629
647
|
registerSafeTool("sf_feasibility_check", "分析任务可行性:可行/风险/不可行三档评估,纯建议不阻断流程", FeasibilityCheckSchema, async (args) => {
|
|
630
648
|
const ctx = await taskContext.load(args.task_id);
|
|
631
649
|
if (!ctx?.classification) {
|
|
@@ -639,7 +657,7 @@ export function registerTools(server, deps, options) {
|
|
|
639
657
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
640
658
|
};
|
|
641
659
|
});
|
|
642
|
-
// ── sf_debug ──
|
|
660
|
+
// ── sf_debug: 智能排障(解析错误 → 根因分析 → 修复方案) ──
|
|
643
661
|
registerSafeTool("sf_debug", "智能排障:解析错误 → 追踪调用链 → 根因分析 → 修复方案 → 测试建议", DebugSchema, async (args) => {
|
|
644
662
|
const projectScope = [
|
|
645
663
|
...config.scope.backend,
|
|
@@ -650,7 +668,7 @@ export function registerTools(server, deps, options) {
|
|
|
650
668
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
651
669
|
};
|
|
652
670
|
});
|
|
653
|
-
// ── sf_observability ──
|
|
671
|
+
// ── sf_observability: 系统可观测和运行报告 ──
|
|
654
672
|
registerSafeTool("sf_observability", "系统可观测:运行指标、成本估算、告警检测、周期报告", ObservabilitySchema, async (args) => {
|
|
655
673
|
const stateDir = taskContext.getStateDir();
|
|
656
674
|
const result = await generateReport(stateDir, args.period_days);
|
|
@@ -658,35 +676,35 @@ export function registerTools(server, deps, options) {
|
|
|
658
676
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
659
677
|
};
|
|
660
678
|
});
|
|
661
|
-
// ── sf_migration_check ──
|
|
679
|
+
// ── sf_migration_check: 数据库迁移安全性分析 ──
|
|
662
680
|
registerSafeTool("sf_migration_check", "分析数据库迁移文件安全性:检测破坏性操作(DROP/DELETE/TRUNCATE)并生成回滚建议", MigrationCheckSchema, async (args) => {
|
|
663
681
|
const result = analyzeMigration(args.content, args.filename);
|
|
664
682
|
return {
|
|
665
683
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
666
684
|
};
|
|
667
685
|
});
|
|
668
|
-
// ── sf_test_guide ──
|
|
686
|
+
// ── sf_test_guide: 基于变更文件生成测试指引 ──
|
|
669
687
|
registerSafeTool("sf_test_guide", "根据变更文件类型生成测试指引:推荐测试类型、场景、Mock 点和断言模板", TestGuideSchema, async (args) => {
|
|
670
688
|
const result = generateTestGuide(args.changed_files, [], config);
|
|
671
689
|
return {
|
|
672
690
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
673
691
|
};
|
|
674
692
|
});
|
|
675
|
-
// ── sf_test_quality ──
|
|
693
|
+
// ── sf_test_quality: 测试文件质量五维评分 ──
|
|
676
694
|
registerSafeTool("sf_test_quality", "评估测试文件质量:断言密度、边界覆盖、命名、重复率、场景覆盖五维评分", TestQualitySchema, async (args) => {
|
|
677
695
|
const result = analyzeTestQuality(args.content, args.filename);
|
|
678
696
|
return {
|
|
679
697
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
680
698
|
};
|
|
681
699
|
});
|
|
682
|
-
// ── sf_dependency_scan ──
|
|
700
|
+
// ── sf_dependency_scan: 依赖漏洞扫描 ──
|
|
683
701
|
registerSafeTool("sf_dependency_scan", "扫描依赖声明文件漏洞:已知 CVE 规则匹配、未锁定版本检测、支持 npm/maven/gradle", DependencyScanSchema, async (args) => {
|
|
684
702
|
const result = scanDependencies(args.content, args.filename);
|
|
685
703
|
return {
|
|
686
704
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
687
705
|
};
|
|
688
706
|
});
|
|
689
|
-
// ── sf_debt_report ──
|
|
707
|
+
// ── sf_debt_report: 技术债务报告生成 ──
|
|
690
708
|
registerSafeTool("sf_debt_report", "生成技术债务报告:按分类/严重度聚合、30 天趋势、优先级排序 Top 5", {}, async () => {
|
|
691
709
|
const tracker = new DebtTracker(projectPath);
|
|
692
710
|
const result = await generateDebtReport(tracker);
|
|
@@ -694,16 +712,33 @@ export function registerTools(server, deps, options) {
|
|
|
694
712
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
695
713
|
};
|
|
696
714
|
});
|
|
697
|
-
// ──
|
|
715
|
+
// ── sf_explore: 自主技术选型与方案证伪 ──
|
|
716
|
+
registerSafeTool("sf_explore", "自主技术选型引擎:行业基准对比 + 四维权重矩阵 + 最优解宣誓 + 方案证伪 + A/B 决策诱导。禁止凭空捏造,必须基于行业标准", ExploreSchema, async (args) => {
|
|
717
|
+
let classification;
|
|
718
|
+
if (args.task_id) {
|
|
719
|
+
const ctx = await taskContext.load(args.task_id);
|
|
720
|
+
classification = ctx?.classification;
|
|
721
|
+
}
|
|
722
|
+
const result = exploreSolutions({
|
|
723
|
+
domain_query: args.domain_query,
|
|
724
|
+
projectConfig: config,
|
|
725
|
+
classification,
|
|
726
|
+
knowledgeIndex,
|
|
727
|
+
});
|
|
728
|
+
return {
|
|
729
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
730
|
+
};
|
|
731
|
+
});
|
|
732
|
+
// ── 自维护工具(仅在 SoloForge 自身项目中注册) ──
|
|
698
733
|
if (options?.isSelfProject) {
|
|
699
|
-
// ── sf_knowledge_audit ──
|
|
734
|
+
// ── sf_knowledge_audit: 知识库健康审计 ──
|
|
700
735
|
registerSafeTool("sf_knowledge_audit", "审计知识库:识别过时条目、重复触发词、格式缺失、覆盖缺口。定期执行或手动触发", {}, async () => {
|
|
701
736
|
const result = await auditKnowledge(knowledgeIndex, config);
|
|
702
737
|
return {
|
|
703
738
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
704
739
|
};
|
|
705
740
|
});
|
|
706
|
-
// ── sf_knowledge_add ──
|
|
741
|
+
// ── sf_knowledge_add: 新增知识条目(默认保存为草稿) ──
|
|
707
742
|
const KnowledgeAddSchema = {
|
|
708
743
|
title: z.string().describe("知识条目标题(英文 kebab-case,如 payment-rules)"),
|
|
709
744
|
type: z.enum(["pattern", "procedure", "pipeline_procedure", "domain", "acceptance_template", "review_rule"]).describe("知识类型"),
|
|
@@ -727,7 +762,7 @@ export function registerTools(server, deps, options) {
|
|
|
727
762
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
728
763
|
};
|
|
729
764
|
});
|
|
730
|
-
// ── sf_knowledge_update ──
|
|
765
|
+
// ── sf_knowledge_update: 更新已有知识条目(自动创建备份) ──
|
|
731
766
|
const KnowledgeUpdateSchema = {
|
|
732
767
|
entry_name: z.string().describe("要更新的知识条目名称(如 payment-rules)"),
|
|
733
768
|
when_triggers: z.string().optional().describe("新的触发关键词(替换现有)"),
|