rules-enforcer 1.0.0
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 +58 -0
- package/detector/README.md +212 -0
- package/detector/decision-engine/README.md +203 -0
- package/detector/decision-engine/conflict-resolver.js +336 -0
- package/detector/decision-engine/de-verify.js +461 -0
- package/detector/decision-engine/index.js +204 -0
- package/detector/decision-engine/optimizer.js +325 -0
- package/detector/decision-engine/scorer.js +359 -0
- package/detector/knowledge-base/README.md +140 -0
- package/detector/knowledge-base/agent-knowledge.json +62 -0
- package/detector/knowledge-base/index.js +332 -0
- package/detector/knowledge-base/kb-verify.js +287 -0
- package/detector/knowledge-base/mcp-knowledge.json +135 -0
- package/detector/knowledge-base/rules-knowledge.json +184 -0
- package/detector/mcp-server.js +157 -0
- package/detector/mcp-service.js +118 -0
- package/detector/package.json +13 -0
- package/detector/plugin.json +122 -0
- package/detector/project-detector.js +710 -0
- package/detector/render-engine/ag-config-render.js +195 -0
- package/detector/render-engine/index.js +124 -0
- package/detector/render-engine/render-core.js +200 -0
- package/detector/render-engine/render-verify.js +282 -0
- package/detector/render-engine/rule-render.js +231 -0
- package/detector/test-exceptions.js +366 -0
- package/detector/verify-plugin.js +233 -0
- package/hooks/chain-invoker.js +98 -0
- package/hooks/custom-hook-server.js +312 -0
- package/hooks/mcp-hooks.js +153 -0
- package/hooks/validate-chain.js +147 -0
- package/package.json +35 -0
- package/rules-server.js +350 -0
- package/test/test-mcp-full.js +193 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Knowledge Base - 项目配置知识库
|
|
2
|
+
|
|
3
|
+
## 目录信息
|
|
4
|
+
|
|
5
|
+
| 属性 | 值 |
|
|
6
|
+
|------|-----|
|
|
7
|
+
| 名称 | Knowledge Base |
|
|
8
|
+
| 版本 | 1.0.0 |
|
|
9
|
+
| 路径 | `.trae/plugins/project-detector/knowledge-base/` |
|
|
10
|
+
| 插件 | project-detector |
|
|
11
|
+
|
|
12
|
+
## 目录结构
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
knowledge-base/
|
|
16
|
+
├── mcp-knowledge.json # MCP服务知识库
|
|
17
|
+
├── agent-knowledge.json # Agent配置知识库
|
|
18
|
+
├── rules-knowledge.json # 规则文件知识库
|
|
19
|
+
├── index.js # 知识库查询接口
|
|
20
|
+
└── kb-verify.js # 知识库自检脚本
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 功能说明
|
|
24
|
+
|
|
25
|
+
### 1. MCP服务知识库
|
|
26
|
+
|
|
27
|
+
存储已知的MCP服务特征信息,用于与项目探测结果匹配:
|
|
28
|
+
|
|
29
|
+
| 服务ID | 名称 | 类型 | 匹配技术栈 |
|
|
30
|
+
|--------|------|------|-----------|
|
|
31
|
+
| rules-enforcer | Rules Enforcer | rules-engine | javascript, typescript, node.js |
|
|
32
|
+
| custom-hooks | Custom Hooks | hook-gateway | javascript, typescript |
|
|
33
|
+
| context7 | Context7 | context-management | any |
|
|
34
|
+
| sequential-thinking | Sequential Thinking | thinking-chain | any |
|
|
35
|
+
| project-detector | Project Detector | project-scanner | any |
|
|
36
|
+
|
|
37
|
+
### 2. Agent配置知识库
|
|
38
|
+
|
|
39
|
+
存储Agent配置模板和推荐规则:
|
|
40
|
+
|
|
41
|
+
- **全栈开发者**: Node.js + Express.js + React技术栈推荐
|
|
42
|
+
- **后端开发者**: Node.js + Python/Go技术栈推荐
|
|
43
|
+
- **前端开发者**: JavaScript + React/Vue技术栈推荐
|
|
44
|
+
|
|
45
|
+
### 3. 规则知识库
|
|
46
|
+
|
|
47
|
+
| 级别 | 数量 | 说明 |
|
|
48
|
+
|------|------|------|
|
|
49
|
+
| L1 | 1 | 用户全局行为约束 |
|
|
50
|
+
| L2 | 1 | 项目特定规则 |
|
|
51
|
+
| L3 | 9 | RZero + custom_config规则 |
|
|
52
|
+
| Custom | 1 | 注意力优化规则 |
|
|
53
|
+
|
|
54
|
+
## 数据格式
|
|
55
|
+
|
|
56
|
+
### MCP服务数据结构
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"id": "service-id",
|
|
61
|
+
"name": "Service Name",
|
|
62
|
+
"type": "service-type",
|
|
63
|
+
"description": "服务描述",
|
|
64
|
+
"features": ["feature1", "feature2"],
|
|
65
|
+
"techStackMatch": ["javascript", "typescript"],
|
|
66
|
+
"projectSizeRange": ["small", "medium", "large"]
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 规则数据结构
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"id": "rule-id",
|
|
75
|
+
"name": "Rule Name",
|
|
76
|
+
"level": "L1/L2/L3/custom",
|
|
77
|
+
"module": "RZero/custom_config",
|
|
78
|
+
"type": "rule-type",
|
|
79
|
+
"description": "规则描述",
|
|
80
|
+
"priority": 100
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## 接口API
|
|
85
|
+
|
|
86
|
+
### KnowledgeBase类
|
|
87
|
+
|
|
88
|
+
```javascript
|
|
89
|
+
const { KnowledgeBase } = require('./knowledge-base/index.js');
|
|
90
|
+
const kb = new KnowledgeBase();
|
|
91
|
+
|
|
92
|
+
// 加载知识库
|
|
93
|
+
kb.load();
|
|
94
|
+
|
|
95
|
+
// 获取MCP推荐
|
|
96
|
+
kb.recommendMCP(['Node.js', 'Express.js']);
|
|
97
|
+
|
|
98
|
+
// 获取规则推荐
|
|
99
|
+
kb.recommendRules('medium', existingRules);
|
|
100
|
+
|
|
101
|
+
// 获取Agent推荐
|
|
102
|
+
kb.recommendAgent(['Node.js', 'Express.js']);
|
|
103
|
+
|
|
104
|
+
// 生成完整配置建议
|
|
105
|
+
kb.generateRecommendations(projectReport);
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## 与project-detector对接
|
|
109
|
+
|
|
110
|
+
项目探测结束后自动调用知识库:
|
|
111
|
+
|
|
112
|
+
```javascript
|
|
113
|
+
const detector = new ProjectDetector(projectPath);
|
|
114
|
+
detector.scan();
|
|
115
|
+
|
|
116
|
+
// 自动获取知识库推荐
|
|
117
|
+
detector.printKnowledgeRecommendations();
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## 自检脚本
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
node .trae/plugins/project-detector/knowledge-base/kb-verify.js
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 自检项目
|
|
127
|
+
|
|
128
|
+
| 检验项 | 内容 |
|
|
129
|
+
|--------|------|
|
|
130
|
+
| 文件完整性 | mcp-knowledge.json, agent-knowledge.json, rules-knowledge.json, index.js |
|
|
131
|
+
| JSON格式 | 三个JSON文件格式校验 |
|
|
132
|
+
| 接口可用性 | load, getMetadata, listMcpServices, listRules, getMcpService, getRule |
|
|
133
|
+
| 跨插件调用 | 与project-detector.js对接测试 |
|
|
134
|
+
| 数据一致性 | metadata与实际数据一致性 |
|
|
135
|
+
|
|
136
|
+
## 约束
|
|
137
|
+
|
|
138
|
+
- 知识库存放在 `.trae/plugins/project-detector/knowledge-base/` 目录内
|
|
139
|
+
- 不得独立外置或拆分到其他目录
|
|
140
|
+
- JSON数据必须与project-detector输出的数据结构对应
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"agents": {
|
|
3
|
+
"AGENTS.md-root": {
|
|
4
|
+
"id": "AGENTS.md-root",
|
|
5
|
+
"name": "Root AGENTS.md",
|
|
6
|
+
"type": "root-config",
|
|
7
|
+
"description": "Trae Agent根配置文件,定义全局Agent行为规范",
|
|
8
|
+
"appliesTo": ["global"],
|
|
9
|
+
"techStackMatch": ["any"],
|
|
10
|
+
"projectSizeRange": ["small", "medium", "large"],
|
|
11
|
+
"rules": {
|
|
12
|
+
"L1": true,
|
|
13
|
+
"L2": true,
|
|
14
|
+
"L3": true
|
|
15
|
+
},
|
|
16
|
+
"mcpDependencies": ["rules-enforcer"],
|
|
17
|
+
"keywords": ["agents", "root", "config", "global"]
|
|
18
|
+
},
|
|
19
|
+
"example-agent": {
|
|
20
|
+
"id": "example-agent",
|
|
21
|
+
"name": "Example Agent",
|
|
22
|
+
"type": "sub-agent",
|
|
23
|
+
"description": "示例Agent配置,展示子Agent编写规范",
|
|
24
|
+
"appliesTo": [".trae/agents/"],
|
|
25
|
+
"techStackMatch": ["any"],
|
|
26
|
+
"projectSizeRange": ["medium", "large"],
|
|
27
|
+
"rules": {
|
|
28
|
+
"L1": true,
|
|
29
|
+
"L2": true,
|
|
30
|
+
"L3": false
|
|
31
|
+
},
|
|
32
|
+
"mcpDependencies": [],
|
|
33
|
+
"keywords": ["example", "agent", "sample"]
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"agentProfiles": {
|
|
37
|
+
"fullstack-developer": {
|
|
38
|
+
"name": "全栈开发者",
|
|
39
|
+
"techStack": ["javascript", "typescript", "node.js", "react", "express.js"],
|
|
40
|
+
"recommendedMcp": ["rules-enforcer", "context7"],
|
|
41
|
+
"recommendedRules": ["L1", "L2"]
|
|
42
|
+
},
|
|
43
|
+
"backend-developer": {
|
|
44
|
+
"name": "后端开发者",
|
|
45
|
+
"techStack": ["node.js", "express.js", "python", "go"],
|
|
46
|
+
"recommendedMcp": ["rules-enforcer", "sequential-thinking"],
|
|
47
|
+
"recommendedRules": ["L1", "L2", "L3"]
|
|
48
|
+
},
|
|
49
|
+
"frontend-developer": {
|
|
50
|
+
"name": "前端开发者",
|
|
51
|
+
"techStack": ["javascript", "typescript", "react", "vue.js", "next.js"],
|
|
52
|
+
"recommendedMcp": ["rules-enforcer", "context7"],
|
|
53
|
+
"recommendedRules": ["L1", "L2"]
|
|
54
|
+
}
|
|
55
|
+
},
|
|
56
|
+
"metadata": {
|
|
57
|
+
"version": "1.0.0",
|
|
58
|
+
"lastUpdated": "2026-06-05",
|
|
59
|
+
"totalAgents": 2,
|
|
60
|
+
"totalProfiles": 3
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Knowledge Base Interface for Project Detector
|
|
3
|
+
* 知识库查询接口,与project-detector.js对接,提供配置推荐
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const fs = require('fs');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
class KnowledgeBase {
|
|
10
|
+
constructor(kbPath) {
|
|
11
|
+
this.kbPath = kbPath || path.join(__dirname);
|
|
12
|
+
this.mcpKnowledge = null;
|
|
13
|
+
this.agentKnowledge = null;
|
|
14
|
+
this.rulesKnowledge = null;
|
|
15
|
+
this.loaded = false;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* 加载全部知识库
|
|
20
|
+
*/
|
|
21
|
+
load() {
|
|
22
|
+
if (this.loaded) return;
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
this.mcpKnowledge = JSON.parse(
|
|
26
|
+
fs.readFileSync(path.join(this.kbPath, 'mcp-knowledge.json'), 'utf8')
|
|
27
|
+
);
|
|
28
|
+
this.agentKnowledge = JSON.parse(
|
|
29
|
+
fs.readFileSync(path.join(this.kbPath, 'agent-knowledge.json'), 'utf8')
|
|
30
|
+
);
|
|
31
|
+
this.rulesKnowledge = JSON.parse(
|
|
32
|
+
fs.readFileSync(path.join(this.kbPath, 'rules-knowledge.json'), 'utf8')
|
|
33
|
+
);
|
|
34
|
+
this.loaded = true;
|
|
35
|
+
} catch (e) {
|
|
36
|
+
throw new Error(`[KnowledgeBase] 加载失败: ${e.message}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* 根据技术栈推荐MCP服务
|
|
42
|
+
*/
|
|
43
|
+
recommendMCP(techStack) {
|
|
44
|
+
this.load();
|
|
45
|
+
|
|
46
|
+
const recommendations = [];
|
|
47
|
+
const services = this.mcpKnowledge.mcpServices;
|
|
48
|
+
|
|
49
|
+
for (const [id, service] of Object.entries(services)) {
|
|
50
|
+
const matchScore = this.calculateMatchScore(techStack, service.techStackMatch);
|
|
51
|
+
if (matchScore > 0) {
|
|
52
|
+
recommendations.push({
|
|
53
|
+
id: service.id,
|
|
54
|
+
name: service.name,
|
|
55
|
+
type: service.type,
|
|
56
|
+
description: service.description,
|
|
57
|
+
matchScore,
|
|
58
|
+
features: service.features,
|
|
59
|
+
keywords: service.keywords
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return recommendations.sort((a, b) => b.matchScore - a.matchScore);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* 根据项目复杂度推荐规则
|
|
69
|
+
*/
|
|
70
|
+
recommendRules(complexity, existingRules = []) {
|
|
71
|
+
this.load();
|
|
72
|
+
|
|
73
|
+
const recommendations = [];
|
|
74
|
+
const rules = this.rulesKnowledge.rules;
|
|
75
|
+
const recommendations_config = this.rulesKnowledge.ruleRecommendations;
|
|
76
|
+
|
|
77
|
+
// 根据复杂度选择推荐配置
|
|
78
|
+
let configKey = 'simple-project';
|
|
79
|
+
if (complexity === 'complex') {
|
|
80
|
+
configKey = 'complex-project';
|
|
81
|
+
} else if (complexity === 'medium') {
|
|
82
|
+
configKey = 'simple-project';
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const config = recommendations_config[configKey];
|
|
86
|
+
|
|
87
|
+
if (config) {
|
|
88
|
+
for (const ruleId of config.rules) {
|
|
89
|
+
if (rules[ruleId] && !existingRules.includes(ruleId)) {
|
|
90
|
+
recommendations.push({
|
|
91
|
+
id: rules[ruleId].id,
|
|
92
|
+
name: rules[ruleId].name,
|
|
93
|
+
level: rules[ruleId].level,
|
|
94
|
+
module: rules[ruleId].module,
|
|
95
|
+
description: rules[ruleId].description,
|
|
96
|
+
priority: rules[ruleId].priority
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return recommendations;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* 推荐Agent配置
|
|
107
|
+
*/
|
|
108
|
+
recommendAgent(techStack) {
|
|
109
|
+
this.load();
|
|
110
|
+
|
|
111
|
+
const profiles = this.agentKnowledge.agentProfiles;
|
|
112
|
+
let bestMatch = null;
|
|
113
|
+
let highestScore = 0;
|
|
114
|
+
|
|
115
|
+
for (const [id, profile] of Object.entries(profiles)) {
|
|
116
|
+
const score = this.calculateMatchScore(techStack, profile.techStack);
|
|
117
|
+
if (score > highestScore) {
|
|
118
|
+
highestScore = score;
|
|
119
|
+
bestMatch = profile;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
if (bestMatch) {
|
|
124
|
+
return {
|
|
125
|
+
name: bestMatch.name,
|
|
126
|
+
recommendedMcp: bestMatch.recommendedMcp,
|
|
127
|
+
recommendedRules: bestMatch.recommendedRules
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return null;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* 计算匹配分数
|
|
136
|
+
*/
|
|
137
|
+
calculateMatchScore(input, patterns) {
|
|
138
|
+
if (!Array.isArray(input)) {
|
|
139
|
+
input = [input];
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
let score = 0;
|
|
143
|
+
for (const item of input) {
|
|
144
|
+
const normalizedItem = item.toLowerCase();
|
|
145
|
+
for (const pattern of patterns) {
|
|
146
|
+
const normalizedPattern = pattern.toLowerCase();
|
|
147
|
+
if (normalizedItem === normalizedPattern) {
|
|
148
|
+
score += 10;
|
|
149
|
+
} else if (normalizedItem.includes(normalizedPattern)) {
|
|
150
|
+
score += 5;
|
|
151
|
+
} else if (normalizedPattern.includes(normalizedItem)) {
|
|
152
|
+
score += 3;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return score;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* 根据项目探测报告生成完整配置建议
|
|
161
|
+
*/
|
|
162
|
+
generateRecommendations(projectReport) {
|
|
163
|
+
this.load();
|
|
164
|
+
|
|
165
|
+
const techStack = projectReport.techStack || [];
|
|
166
|
+
const complexity = projectReport.stats?.complexity || 'simple';
|
|
167
|
+
const existingMcp = projectReport.existingComponents?.mcp || [];
|
|
168
|
+
const existingRules = projectReport.existingComponents?.rules || [];
|
|
169
|
+
|
|
170
|
+
// 获取推荐
|
|
171
|
+
const mcpRecommendations = this.recommendMCP(techStack);
|
|
172
|
+
const rulesRecommendations = this.recommendRules(complexity, existingRules.map(r => r.name));
|
|
173
|
+
const agentRecommendation = this.recommendAgent(techStack);
|
|
174
|
+
|
|
175
|
+
// 过滤已存在的MCP
|
|
176
|
+
const newMcpRecommendations = mcpRecommendations.filter(
|
|
177
|
+
mcp => !existingMcp.includes(mcp.id)
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
return {
|
|
181
|
+
timestamp: new Date().toISOString(),
|
|
182
|
+
projectAnalysis: {
|
|
183
|
+
techStack,
|
|
184
|
+
complexity,
|
|
185
|
+
existingMcp: existingMcp.length,
|
|
186
|
+
existingRules: existingRules.length
|
|
187
|
+
},
|
|
188
|
+
recommendations: {
|
|
189
|
+
newMcpServices: newMcpRecommendations,
|
|
190
|
+
newRules: rulesRecommendations,
|
|
191
|
+
agentProfile: agentRecommendation
|
|
192
|
+
},
|
|
193
|
+
summary: {
|
|
194
|
+
suggestedMcpCount: newMcpRecommendations.length,
|
|
195
|
+
suggestedRulesCount: rulesRecommendations.length,
|
|
196
|
+
hasAgentRecommendation: !!agentRecommendation
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* 获取MCP服务详情
|
|
203
|
+
*/
|
|
204
|
+
getMcpService(mcpId) {
|
|
205
|
+
this.load();
|
|
206
|
+
return this.mcpKnowledge.mcpServices[mcpId] || null;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* 获取规则详情
|
|
211
|
+
*/
|
|
212
|
+
getRule(ruleId) {
|
|
213
|
+
this.load();
|
|
214
|
+
return this.rulesKnowledge.rules[ruleId] || null;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* 获取全部MCP服务列表
|
|
219
|
+
*/
|
|
220
|
+
listMcpServices() {
|
|
221
|
+
this.load();
|
|
222
|
+
return Object.keys(this.mcpKnowledge.mcpServices);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* 获取全部规则列表
|
|
227
|
+
*/
|
|
228
|
+
listRules() {
|
|
229
|
+
this.load();
|
|
230
|
+
return Object.values(this.rulesKnowledge.rules);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* 获取知识库元信息
|
|
235
|
+
*/
|
|
236
|
+
getMetadata() {
|
|
237
|
+
this.load();
|
|
238
|
+
return {
|
|
239
|
+
mcp: this.mcpKnowledge.metadata,
|
|
240
|
+
agent: this.agentKnowledge.metadata,
|
|
241
|
+
rules: this.rulesKnowledge.metadata
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* 验证知识库完整性
|
|
247
|
+
*/
|
|
248
|
+
validate() {
|
|
249
|
+
const errors = [];
|
|
250
|
+
|
|
251
|
+
// 检查文件存在
|
|
252
|
+
const files = ['mcp-knowledge.json', 'agent-knowledge.json', 'rules-knowledge.json'];
|
|
253
|
+
for (const file of files) {
|
|
254
|
+
const filePath = path.join(this.kbPath, file);
|
|
255
|
+
if (!fs.existsSync(filePath)) {
|
|
256
|
+
errors.push(`文件缺失: ${file}`);
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
try {
|
|
261
|
+
const content = fs.readFileSync(filePath, 'utf8');
|
|
262
|
+
JSON.parse(content);
|
|
263
|
+
} catch (e) {
|
|
264
|
+
errors.push(`JSON格式错误 ${file}: ${e.message}`);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// 检查知识库内容
|
|
269
|
+
try {
|
|
270
|
+
this.load();
|
|
271
|
+
|
|
272
|
+
if (!this.mcpKnowledge.mcpServices) {
|
|
273
|
+
errors.push('mcp-knowledge.json 缺少 mcpServices 字段');
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (!this.agentKnowledge.agents) {
|
|
277
|
+
errors.push('agent-knowledge.json 缺少 agents 字段');
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
if (!this.rulesKnowledge.rules) {
|
|
281
|
+
errors.push('rules-knowledge.json 缺少 rules 字段');
|
|
282
|
+
}
|
|
283
|
+
} catch (e) {
|
|
284
|
+
errors.push(`知识库加载失败: ${e.message}`);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
return {
|
|
288
|
+
valid: errors.length === 0,
|
|
289
|
+
errors
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// 导出
|
|
295
|
+
module.exports = { KnowledgeBase };
|
|
296
|
+
|
|
297
|
+
// CLI入口
|
|
298
|
+
if (require.main === module) {
|
|
299
|
+
const kb = new KnowledgeBase();
|
|
300
|
+
const validation = kb.validate();
|
|
301
|
+
|
|
302
|
+
console.log('[KnowledgeBase] ========== 知识库验证 ==========');
|
|
303
|
+
|
|
304
|
+
if (validation.valid) {
|
|
305
|
+
console.log('✅ 知识库验证通过');
|
|
306
|
+
console.log('\n元信息:');
|
|
307
|
+
console.log(JSON.stringify(kb.getMetadata(), null, 2));
|
|
308
|
+
|
|
309
|
+
console.log('\n可用MCP服务:');
|
|
310
|
+
console.log(kb.listMcpServices().join(', '));
|
|
311
|
+
|
|
312
|
+
console.log('\n可用规则:');
|
|
313
|
+
console.log(`L1: ${kb.listRules().filter(r => r.level === 'L1').map(r => r.name).join(', ')}`);
|
|
314
|
+
console.log(`L2: ${kb.listRules().filter(r => r.level === 'L2').map(r => r.name).join(', ')}`);
|
|
315
|
+
console.log(`L3: ${kb.listRules().filter(r => r.level === 'L3').map(r => r.name).join(', ')}`);
|
|
316
|
+
|
|
317
|
+
console.log('\n示例推荐(基于当前项目):');
|
|
318
|
+
const { ProjectDetector } = require('./project-detector.js');
|
|
319
|
+
const detector = new ProjectDetector(process.cwd());
|
|
320
|
+
detector.scan();
|
|
321
|
+
const recommendations = kb.generateRecommendations(detector.getReport());
|
|
322
|
+
console.log(JSON.stringify(recommendations, null, 2));
|
|
323
|
+
|
|
324
|
+
process.exit(0);
|
|
325
|
+
} else {
|
|
326
|
+
console.log('❌ 知识库验证失败:');
|
|
327
|
+
for (const error of validation.errors) {
|
|
328
|
+
console.log(` - ${error}`);
|
|
329
|
+
}
|
|
330
|
+
process.exit(1);
|
|
331
|
+
}
|
|
332
|
+
}
|