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.
Files changed (33) hide show
  1. package/README.md +58 -0
  2. package/detector/README.md +212 -0
  3. package/detector/decision-engine/README.md +203 -0
  4. package/detector/decision-engine/conflict-resolver.js +336 -0
  5. package/detector/decision-engine/de-verify.js +461 -0
  6. package/detector/decision-engine/index.js +204 -0
  7. package/detector/decision-engine/optimizer.js +325 -0
  8. package/detector/decision-engine/scorer.js +359 -0
  9. package/detector/knowledge-base/README.md +140 -0
  10. package/detector/knowledge-base/agent-knowledge.json +62 -0
  11. package/detector/knowledge-base/index.js +332 -0
  12. package/detector/knowledge-base/kb-verify.js +287 -0
  13. package/detector/knowledge-base/mcp-knowledge.json +135 -0
  14. package/detector/knowledge-base/rules-knowledge.json +184 -0
  15. package/detector/mcp-server.js +157 -0
  16. package/detector/mcp-service.js +118 -0
  17. package/detector/package.json +13 -0
  18. package/detector/plugin.json +122 -0
  19. package/detector/project-detector.js +710 -0
  20. package/detector/render-engine/ag-config-render.js +195 -0
  21. package/detector/render-engine/index.js +124 -0
  22. package/detector/render-engine/render-core.js +200 -0
  23. package/detector/render-engine/render-verify.js +282 -0
  24. package/detector/render-engine/rule-render.js +231 -0
  25. package/detector/test-exceptions.js +366 -0
  26. package/detector/verify-plugin.js +233 -0
  27. package/hooks/chain-invoker.js +98 -0
  28. package/hooks/custom-hook-server.js +312 -0
  29. package/hooks/mcp-hooks.js +153 -0
  30. package/hooks/validate-chain.js +147 -0
  31. package/package.json +35 -0
  32. package/rules-server.js +350 -0
  33. package/test/test-mcp-full.js +193 -0
@@ -0,0 +1,461 @@
1
+ /**
2
+ * Decision Engine Verification Script
3
+ * 覆盖三类用例:常规项目配置、组件依赖冲突、规则层级冲突
4
+ */
5
+
6
+ const path = require('path');
7
+
8
+ class DEVerifier {
9
+ constructor() {
10
+ this.results = [];
11
+ this.passed = 0;
12
+ this.failed = 0;
13
+ }
14
+
15
+ /**
16
+ * 记录测试结果
17
+ */
18
+ log(type, message, status) {
19
+ const icon = status === 'PASS' ? '✅' : '❌';
20
+ const log = `${icon} [${type}] ${message}`;
21
+ this.results.push({ type, message, status });
22
+ console.log(log);
23
+ if (status === 'PASS') this.passed++;
24
+ else this.failed++;
25
+ }
26
+
27
+ /**
28
+ * 测试1: 常规项目配置
29
+ */
30
+ testNormalProject() {
31
+ console.log('\n========== 测试1: 常规项目配置 ==========');
32
+
33
+ try {
34
+ const { DecisionEngine } = require('./index.js');
35
+ const { KnowledgeBase } = require('../knowledge-base/index.js');
36
+
37
+ const engine = new DecisionEngine();
38
+ const kb = new KnowledgeBase(path.join(__dirname, '../knowledge-base'));
39
+ kb.load();
40
+
41
+ // 模拟常规项目
42
+ const projectInfo = {
43
+ techStack: ['Node.js', 'Express.js', 'SQLite'],
44
+ complexity: 'medium',
45
+ existingComponents: {
46
+ mcp: ['rules-enforcer'],
47
+ agents: [{ name: 'AGENTS.md' }],
48
+ rules: [{ name: 'user_rules.md', level: 'L1' }]
49
+ },
50
+ stats: { complexity: 'medium' }
51
+ };
52
+
53
+ const decision = engine.decide(kb, projectInfo);
54
+
55
+ // 验证输出结构
56
+ if (decision.decision && decision.scoreBreakdown && decision.conflicts && decision.alternatives) {
57
+ this.log('NORMAL', '决策输出结构完整', 'PASS');
58
+ } else {
59
+ this.log('NORMAL', '决策输出结构不完整', 'FAIL');
60
+ }
61
+
62
+ // 验证置信度范围
63
+ if (decision.decision.confidence >= 0 && decision.decision.confidence <= 1) {
64
+ this.log('NORMAL', `置信度范围正确: ${decision.decision.confidence}`, 'PASS');
65
+ } else {
66
+ this.log('NORMAL', `置信度范围错误: ${decision.decision.confidence}`, 'FAIL');
67
+ }
68
+
69
+ // 验证分项得分范围
70
+ const scores = decision.scoreBreakdown;
71
+ if (scores.techStackMatch >= 0 && scores.techStackMatch <= 100 &&
72
+ scores.complexityFit >= 0 && scores.complexityFit <= 100 &&
73
+ scores.dependencyScore >= 0 && scores.dependencyScore <= 100 &&
74
+ scores.reuseScore >= 0 && scores.reuseScore <= 100) {
75
+ this.log('NORMAL', '分项得分范围正确 (0~100)', 'PASS');
76
+ } else {
77
+ this.log('NORMAL', '分项得分范围错误', 'FAIL');
78
+ }
79
+
80
+ // 验证权重
81
+ const weights = engine.optimizer.weights;
82
+ if (weights.mcp === 0.4 && weights.rules === 0.35 && weights.agent === 0.25) {
83
+ this.log('NORMAL', '权重配置正确 (MCP=40%, Rules=35%, Agent=25%)', 'PASS');
84
+ } else {
85
+ this.log('NORMAL', `权重配置错误: ${JSON.stringify(weights)}`, 'FAIL');
86
+ }
87
+
88
+ // 验证置信度公式:技术栈93、复杂度100、依赖88、复用0
89
+ // 理论值 = 93*0.4 + 100*0.35 + 88*0.25 = 94.2 -> 0.942
90
+ const { Optimizer } = require('./optimizer.js');
91
+ const opt = new Optimizer();
92
+
93
+ // 模拟输入数据
94
+ const mockMcpResult = {
95
+ recommended: [{
96
+ scores: { techStackMatch: 93, complexityFit: 100, dependency: 88, reuse: 0 },
97
+ totalScore: 93
98
+ }]
99
+ };
100
+ const mockRulesResult = {
101
+ recommended: [{
102
+ scores: { techStackMatch: 93, complexityFit: 100, dependency: 88, reuse: 0 },
103
+ totalScore: 93
104
+ }]
105
+ };
106
+ const mockAgentResult = {
107
+ recommended: {
108
+ scores: { techStackMatch: 93, complexityFit: 100, dependency: 88, reuse: 0 },
109
+ totalScore: 93
110
+ }
111
+ };
112
+
113
+ // 计算置信度
114
+ const expectedConfidence = 0.942;
115
+ const actualConfidence = opt.calculateConfidence(mockMcpResult, mockRulesResult, mockAgentResult);
116
+
117
+ if (Math.abs(actualConfidence - expectedConfidence) < 0.01) {
118
+ this.log('NORMAL', `置信度公式验证通过: ${actualConfidence.toFixed(3)} ≈ ${expectedConfidence}`, 'PASS');
119
+ } else {
120
+ this.log('NORMAL', `置信度公式错误: 期望${expectedConfidence}, 实际${actualConfidence}`, 'FAIL');
121
+ }
122
+
123
+ } catch (e) {
124
+ this.log('NORMAL', `测试失败: ${e.message}`, 'FAIL');
125
+ }
126
+ }
127
+
128
+ /**
129
+ * 测试2: 组件依赖冲突
130
+ */
131
+ testDependencyConflict() {
132
+ console.log('\n========== 测试2: 组件依赖冲突 ==========');
133
+
134
+ try {
135
+ const { ConflictResolver } = require('./conflict-resolver.js');
136
+
137
+ const resolver = new ConflictResolver();
138
+
139
+ // 模拟MCP依赖冲突
140
+ const mcpServices = [
141
+ { id: 'service-a', dependencies: ['service-b'] },
142
+ { id: 'service-b', dependencies: ['service-c'] },
143
+ { id: 'service-c', dependencies: ['service-a'] } // 循环依赖
144
+ ];
145
+
146
+ const conflicts = resolver.detectMcpConflicts(mcpServices, []);
147
+
148
+ if (conflicts.some(c => c.type === 'mcp-circular-dependency')) {
149
+ this.log('DEPENDENCY', '检测到循环依赖', 'PASS');
150
+ } else {
151
+ this.log('DEPENDENCY', '未检测到循环依赖', 'FAIL');
152
+ }
153
+
154
+ // 测试缺失依赖
155
+ const mcpServices2 = [
156
+ { id: 'service-x', dependencies: ['non-existent-service'] }
157
+ ];
158
+
159
+ const conflicts2 = resolver.detectMcpConflicts(mcpServices2, []);
160
+
161
+ if (conflicts2.some(c => c.type === 'mcp-missing-dependency')) {
162
+ this.log('DEPENDENCY', '检测到缺失依赖', 'PASS');
163
+ } else {
164
+ this.log('DEPENDENCY', '未检测到缺失依赖', 'FAIL');
165
+ }
166
+
167
+ // 测试不兼容依赖
168
+ const mcpServices3 = [
169
+ { id: 'service-a', incompatible: ['service-b'] },
170
+ { id: 'service-b' }
171
+ ];
172
+
173
+ const conflicts3 = resolver.detectMcpConflicts(mcpServices3, []);
174
+
175
+ if (conflicts3.some(c => c.type === 'mcp-incompatible-dependency')) {
176
+ this.log('DEPENDENCY', '检测到不兼容依赖', 'PASS');
177
+ } else {
178
+ this.log('DEPENDENCY', '未检测到不兼容依赖', 'FAIL');
179
+ }
180
+
181
+ } catch (e) {
182
+ this.log('DEPENDENCY', `测试失败: ${e.message}`, 'FAIL');
183
+ }
184
+ }
185
+
186
+ /**
187
+ * 测试3: 规则层级冲突
188
+ */
189
+ testRuleConflict() {
190
+ console.log('\n========== 测试3: 规则层级冲突 ==========');
191
+
192
+ try {
193
+ const { ConflictResolver } = require('./conflict-resolver.js');
194
+
195
+ const resolver = new ConflictResolver();
196
+
197
+ // 模拟规则冲突
198
+ const rules = [
199
+ { id: 'rule-1', name: 'Rule 1', level: 'L1', type: 'behavior', module: 'core' },
200
+ { id: 'rule-2', name: 'Rule 2', level: 'L1', type: 'behavior', module: 'core' }, // 同类型同优先级
201
+ { id: 'rule-3', name: 'Rule 3', level: 'L3', type: 'custom', module: 'RZero' }
202
+ ];
203
+
204
+ const conflicts = resolver.detectRuleConflicts(rules);
205
+
206
+ if (conflicts.some(c => c.type === 'rule-duplicate')) {
207
+ this.log('RULE', '检测到同类型同优先级规则冲突', 'PASS');
208
+ } else {
209
+ this.log('RULE', '未检测到规则冲突', 'FAIL');
210
+ }
211
+
212
+ // 测试缺失层级
213
+ const rules2 = [
214
+ { id: 'rule-l3', name: 'L3 Rule', level: 'L3', type: 'custom', module: 'RZero' }
215
+ ];
216
+
217
+ const conflicts2 = resolver.detectRuleConflicts(rules2);
218
+
219
+ if (conflicts2.some(c => c.type === 'rule-missing-level')) {
220
+ this.log('RULE', '检测到缺失L1/L2层级', 'PASS');
221
+ } else {
222
+ this.log('RULE', '未检测到缺失层级', 'FAIL');
223
+ }
224
+
225
+ // 测试规则解决
226
+ const resolveResult = resolver.resolveRuleConflicts(rules);
227
+
228
+ if (resolveResult.resolved.length > 0 && resolveResult.removed.length > 0) {
229
+ this.log('RULE', `规则冲突解决成功: 保留${resolveResult.resolved.length}个, 移除${resolveResult.removed.length}个`, 'PASS');
230
+ } else {
231
+ this.log('RULE', '规则冲突解决失败', 'FAIL');
232
+ }
233
+
234
+ } catch (e) {
235
+ this.log('RULE', `测试失败: ${e.message}`, 'FAIL');
236
+ }
237
+ }
238
+
239
+ /**
240
+ * 测试4: 评分引擎
241
+ */
242
+ testScorer() {
243
+ console.log('\n========== 测试4: 评分引擎 ==========');
244
+
245
+ try {
246
+ const { Scorer } = require('./scorer.js');
247
+
248
+ const scorer = new Scorer();
249
+
250
+ // 测试技术栈匹配分
251
+ const techScore = scorer.calculateTechStackMatchScore(
252
+ ['Node.js', 'Express.js'],
253
+ ['node.js', 'express.js', 'typescript']
254
+ );
255
+
256
+ if (techScore >= 0 && techScore <= 100) {
257
+ this.log('SCORER', `技术栈匹配分: ${techScore}`, 'PASS');
258
+ } else {
259
+ this.log('SCORER', `技术栈匹配分范围错误: ${techScore}`, 'FAIL');
260
+ }
261
+
262
+ // 测试复杂度适配分
263
+ const complexityScore = scorer.calculateComplexityFitScore('medium', ['small', 'medium', 'large']);
264
+
265
+ if (complexityScore === 100) {
266
+ this.log('SCORER', `复杂度适配分: ${complexityScore}`, 'PASS');
267
+ } else {
268
+ this.log('SCORER', `复杂度适配分错误: ${complexityScore}`, 'FAIL');
269
+ }
270
+
271
+ // 测试依赖兼容分
272
+ const depScore = scorer.calculateDependencyScore(
273
+ ['rules-enforcer'],
274
+ { mcp: ['rules-enforcer'], agents: [], rules: [] }
275
+ );
276
+
277
+ if (depScore === 100) {
278
+ this.log('SCORER', `依赖兼容分: ${depScore}`, 'PASS');
279
+ } else {
280
+ this.log('SCORER', `依赖兼容分错误: ${depScore}`, 'FAIL');
281
+ }
282
+
283
+ // 测试复用分
284
+ const reuseScore = scorer.calculateReuseScore(
285
+ 'rules-enforcer',
286
+ { mcp: ['rules-enforcer'], agents: [], rules: [] }
287
+ );
288
+
289
+ if (reuseScore === 100) {
290
+ this.log('SCORER', `组件复用分: ${reuseScore}`, 'PASS');
291
+ } else {
292
+ this.log('SCORER', `组件复用分错误: ${reuseScore}`, 'FAIL');
293
+ }
294
+
295
+ } catch (e) {
296
+ this.log('SCORER', `测试失败: ${e.message}`, 'FAIL');
297
+ }
298
+ }
299
+
300
+ /**
301
+ * 测试5: 优化算法
302
+ */
303
+ testOptimizer() {
304
+ console.log('\n========== 测试5: 优化算法 ==========');
305
+
306
+ try {
307
+ const { Optimizer } = require('./optimizer.js');
308
+
309
+ const optimizer = new Optimizer();
310
+
311
+ // 模拟知识库
312
+ const knowledgeBase = {
313
+ mcpKnowledge: {
314
+ mcpServices: {
315
+ 'test-mcp': {
316
+ id: 'test-mcp',
317
+ name: 'Test MCP',
318
+ type: 'test',
319
+ techStackMatch: ['node.js'],
320
+ projectSizeRange: ['small', 'medium', 'large'],
321
+ dependencies: []
322
+ }
323
+ }
324
+ },
325
+ rulesKnowledge: {
326
+ rules: {
327
+ 'test-rule': {
328
+ id: 'test-rule',
329
+ name: 'Test Rule',
330
+ level: 'L1',
331
+ type: 'test',
332
+ techStackMatch: ['any'],
333
+ projectSizeRange: ['small', 'medium', 'large']
334
+ }
335
+ }
336
+ },
337
+ agentKnowledge: {
338
+ agentProfiles: {
339
+ 'test-agent': {
340
+ name: 'Test Agent',
341
+ techStack: ['node.js'],
342
+ recommendedMcp: ['test-mcp'],
343
+ recommendedRules: ['L1']
344
+ }
345
+ }
346
+ }
347
+ };
348
+
349
+ const projectInfo = {
350
+ techStack: ['Node.js'],
351
+ complexity: 'medium',
352
+ existingComponents: { mcp: [], agents: [], rules: [] }
353
+ };
354
+
355
+ const result = optimizer.optimize(knowledgeBase, projectInfo);
356
+
357
+ if (result.mcpResult && result.rulesResult && result.agentResult) {
358
+ this.log('OPTIMIZER', '优化结果包含三类组件', 'PASS');
359
+ } else {
360
+ this.log('OPTIMIZER', '优化结果结构不完整', 'FAIL');
361
+ }
362
+
363
+ if (result.confidence >= 0 && result.confidence <= 1) {
364
+ this.log('OPTIMIZER', `置信度计算正确: ${result.confidence.toFixed(2)}`, 'PASS');
365
+ } else {
366
+ this.log('OPTIMIZER', `置信度计算错误: ${result.confidence}`, 'FAIL');
367
+ }
368
+
369
+ } catch (e) {
370
+ this.log('OPTIMIZER', `测试失败: ${e.message}`, 'FAIL');
371
+ }
372
+ }
373
+
374
+ /**
375
+ * 测试6: 全链路集成
376
+ */
377
+ testIntegration() {
378
+ console.log('\n========== 测试6: 全链路集成 ==========');
379
+
380
+ try {
381
+ const { DecisionEngine } = require('./index.js');
382
+ const { KnowledgeBase } = require('../knowledge-base/index.js');
383
+ const { ProjectDetector } = require('../project-detector.js');
384
+
385
+ // 执行项目探测
386
+ const detector = new ProjectDetector(process.cwd());
387
+ detector.scan();
388
+ const report = detector.getReport();
389
+
390
+ // 加载知识库
391
+ const kb = new KnowledgeBase(path.join(__dirname, '../knowledge-base'));
392
+ kb.load();
393
+
394
+ // 执行决策
395
+ const engine = new DecisionEngine();
396
+ const decision = engine.decide(kb, report);
397
+
398
+ // 验证完整输出
399
+ const requiredFields = ['decision', 'scoreBreakdown', 'conflicts', 'alternatives'];
400
+ const decisionFields = ['recommendedMcp', 'recommendedRules', 'recommendedAgent', 'confidence'];
401
+
402
+ let allFieldsPresent = true;
403
+
404
+ for (const field of requiredFields) {
405
+ if (!decision[field]) {
406
+ this.log('INTEGRATION', `缺少字段: ${field}`, 'FAIL');
407
+ allFieldsPresent = false;
408
+ }
409
+ }
410
+
411
+ for (const field of decisionFields) {
412
+ if (decision.decision[field] === undefined) {
413
+ this.log('INTEGRATION', `decision缺少字段: ${field}`, 'FAIL');
414
+ allFieldsPresent = false;
415
+ }
416
+ }
417
+
418
+ if (allFieldsPresent) {
419
+ this.log('INTEGRATION', '全链路集成测试通过', 'PASS');
420
+ }
421
+
422
+ // 打印决策结果
423
+ engine.printDecision(decision);
424
+
425
+ } catch (e) {
426
+ this.log('INTEGRATION', `测试失败: ${e.message}`, 'FAIL');
427
+ }
428
+ }
429
+
430
+ /**
431
+ * 执行全部验证
432
+ */
433
+ verifyAll() {
434
+ console.log('===========================================');
435
+ console.log(' Decision Engine Verification');
436
+ console.log('===========================================');
437
+
438
+ this.testNormalProject();
439
+ this.testDependencyConflict();
440
+ this.testRuleConflict();
441
+ this.testScorer();
442
+ this.testOptimizer();
443
+ this.testIntegration();
444
+
445
+ console.log('\n===========================================');
446
+ console.log(` 验证结果: ${this.passed} 通过, ${this.failed} 失败`);
447
+ console.log('===========================================');
448
+
449
+ if (this.failed > 0) {
450
+ console.log('\n❌ 决策引擎验证未全部通过,请检查上述失败项');
451
+ process.exit(1);
452
+ } else {
453
+ console.log('\n✅ 决策引擎验证全部通过!');
454
+ process.exit(0);
455
+ }
456
+ }
457
+ }
458
+
459
+ // 执行验证
460
+ const verifier = new DEVerifier();
461
+ verifier.verifyAll();
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Decision Engine - 决策引擎入口
3
+ * 对接上层project-detector主程序、下层knowledge-base知识库
4
+ * 输出最优配置组合建议
5
+ */
6
+
7
+ const { Optimizer } = require('./optimizer.js');
8
+ const { ConflictResolver } = require('./conflict-resolver.js');
9
+
10
+ class DecisionEngine {
11
+ constructor() {
12
+ this.optimizer = new Optimizer();
13
+ this.conflictResolver = new ConflictResolver();
14
+ }
15
+
16
+ /**
17
+ * 执行决策流程
18
+ */
19
+ decide(knowledgeBase, projectReport) {
20
+ // 构建项目信息
21
+ const projectInfo = {
22
+ techStack: projectReport.techStack || [],
23
+ complexity: projectReport.stats?.complexity || 'medium',
24
+ existingComponents: projectReport.existingComponents || { mcp: [], agents: [], rules: [] },
25
+ stats: projectReport.stats || {}
26
+ };
27
+
28
+ // 执行优化
29
+ const optimizationResult = this.optimizer.optimize(knowledgeBase, projectInfo);
30
+
31
+ // 检测冲突
32
+ const conflictResult = this.conflictResolver.detectAll(optimizationResult, projectInfo);
33
+
34
+ // 构建决策输出
35
+ const decision = this.buildDecision(optimizationResult, conflictResult);
36
+
37
+ return decision;
38
+ }
39
+
40
+ /**
41
+ * 构建决策输出
42
+ */
43
+ buildDecision(optimizationResult, conflictResult) {
44
+ // 提取推荐配置
45
+ const recommendedMcp = optimizationResult.mcpResult.recommended.map(c => ({
46
+ id: c.id,
47
+ name: c.name,
48
+ type: c.type,
49
+ score: c.totalScore
50
+ }));
51
+
52
+ const recommendedRules = optimizationResult.rulesResult.recommended.map(c => ({
53
+ id: c.id,
54
+ name: c.name,
55
+ level: c.level,
56
+ module: c.module,
57
+ score: c.totalScore
58
+ }));
59
+
60
+ const recommendedAgent = optimizationResult.agentResult.recommended ? {
61
+ id: optimizationResult.agentResult.recommended.id,
62
+ name: optimizationResult.agentResult.recommended.name,
63
+ score: optimizationResult.agentResult.recommended.totalScore,
64
+ recommendedMcp: optimizationResult.agentResult.recommended.recommendedMcp,
65
+ recommendedRules: optimizationResult.agentResult.recommended.recommendedRules
66
+ } : null;
67
+
68
+ // 构建最终输出
69
+ return {
70
+ decision: {
71
+ recommendedMcp,
72
+ recommendedRules,
73
+ recommendedAgent,
74
+ confidence: Math.round(optimizationResult.confidence * 100) / 100
75
+ },
76
+ scoreBreakdown: optimizationResult.scoreBreakdown,
77
+ conflicts: conflictResult.conflicts,
78
+ alternatives: optimizationResult.alternatives
79
+ };
80
+ }
81
+
82
+ /**
83
+ * 打印决策结果
84
+ */
85
+ printDecision(decision) {
86
+ console.log('\n========== 决策引擎输出 ==========\n');
87
+
88
+ // 置信度
89
+ console.log(`📊 综合置信度: ${(decision.decision.confidence * 100).toFixed(1)}%`);
90
+
91
+ // 分项得分
92
+ console.log('\n📈 分项得分:');
93
+ console.log(` 技术栈匹配: ${decision.scoreBreakdown.techStackMatch}/100`);
94
+ console.log(` 复杂度适配: ${decision.scoreBreakdown.complexityFit}/100`);
95
+ console.log(` 依赖兼容: ${decision.scoreBreakdown.dependencyScore}/100`);
96
+ console.log(` 组件复用: ${decision.scoreBreakdown.reuseScore}/100`);
97
+
98
+ // MCP推荐
99
+ console.log('\n📦 推荐MCP服务:');
100
+ if (decision.decision.recommendedMcp.length === 0) {
101
+ console.log(' 无需新增MCP服务');
102
+ } else {
103
+ for (const mcp of decision.decision.recommendedMcp) {
104
+ console.log(` - ${mcp.name} (${mcp.type}) - 得分: ${mcp.score}`);
105
+ }
106
+ }
107
+
108
+ // 规则推荐
109
+ console.log('\n📋 推荐规则:');
110
+ if (decision.decision.recommendedRules.length === 0) {
111
+ console.log(' 无需新增规则');
112
+ } else {
113
+ for (const rule of decision.decision.recommendedRules) {
114
+ console.log(` - ${rule.name} [${rule.level}] - 得分: ${rule.score}`);
115
+ }
116
+ }
117
+
118
+ // Agent推荐
119
+ console.log('\n👤 推荐Agent配置:');
120
+ if (decision.decision.recommendedAgent) {
121
+ const agent = decision.decision.recommendedAgent;
122
+ console.log(` ${agent.name} - 得分: ${agent.score}`);
123
+ if (agent.recommendedMcp) {
124
+ console.log(` 推荐MCP: ${agent.recommendedMcp.join(', ')}`);
125
+ }
126
+ } else {
127
+ console.log(' 无Agent推荐');
128
+ }
129
+
130
+ // 冲突信息
131
+ if (decision.conflicts.length > 0) {
132
+ console.log('\n⚠️ 检测到冲突:');
133
+ for (const conflict of decision.conflicts) {
134
+ const icon = conflict.severity === 'error' ? '❌' :
135
+ conflict.severity === 'warning' ? '⚠️' : 'ℹ️';
136
+ console.log(` ${icon} [${conflict.type}] ${conflict.message}`);
137
+ if (conflict.suggestion) {
138
+ console.log(` 建议: ${conflict.suggestion}`);
139
+ }
140
+ }
141
+ } else {
142
+ console.log('\n✅ 未检测到冲突');
143
+ }
144
+
145
+ // 备选方案
146
+ if (decision.alternatives.length > 0) {
147
+ console.log('\n🔄 备选方案:');
148
+ for (const alt of decision.alternatives.slice(0, 5)) {
149
+ console.log(` - [${alt.type}] ${alt.name} - 得分: ${alt.score}`);
150
+ }
151
+ }
152
+
153
+ console.log('\n==========================================\n');
154
+ }
155
+
156
+ /**
157
+ * 获取引擎信息
158
+ */
159
+ getInfo() {
160
+ return {
161
+ name: 'DecisionEngine',
162
+ version: '1.0.0',
163
+ weights: this.optimizer.weights,
164
+ components: ['Optimizer', 'ConflictResolver', 'Scorer']
165
+ };
166
+ }
167
+ }
168
+
169
+ module.exports = { DecisionEngine };
170
+
171
+ // CLI入口
172
+ if (require.main === module) {
173
+ const path = require('path');
174
+
175
+ try {
176
+ // 加载知识库
177
+ const { KnowledgeBase } = require('../knowledge-base/index.js');
178
+ const { ProjectDetector } = require('../project-detector.js');
179
+
180
+ // 执行项目探测
181
+ const detector = new ProjectDetector(process.cwd());
182
+ detector.scan();
183
+ const report = detector.getReport();
184
+
185
+ // 加载知识库
186
+ const kb = new KnowledgeBase(path.join(__dirname, '..'));
187
+ kb.load();
188
+
189
+ // 执行决策
190
+ const engine = new DecisionEngine();
191
+ const decision = engine.decide(kb, report);
192
+
193
+ // 输出结果
194
+ engine.printDecision(decision);
195
+
196
+ // 输出JSON
197
+ console.log('完整决策结果:');
198
+ console.log(JSON.stringify(decision, null, 2));
199
+
200
+ } catch (e) {
201
+ console.error('决策引擎执行失败:', e.message);
202
+ process.exit(1);
203
+ }
204
+ }