mr-sliy 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 (50) hide show
  1. package/.env.example +145 -0
  2. package/database/schema.sql +187 -0
  3. package/package.json +74 -0
  4. package/scripts/download-tree-sitter.js +171 -0
  5. package/scripts/postinstall.js +134 -0
  6. package/src/agent/agent.js +563 -0
  7. package/src/agent.js +87 -0
  8. package/src/cli/index.js +1643 -0
  9. package/src/config/index.js +232 -0
  10. package/src/engine/dualModeEngine.js +486 -0
  11. package/src/index.js +165 -0
  12. package/src/middlewares/errorHandler.js +166 -0
  13. package/src/middlewares/index.js +23 -0
  14. package/src/routes/aiRoutes.js +117 -0
  15. package/src/routes/configRoutes.js +31 -0
  16. package/src/routes/index.js +75 -0
  17. package/src/routes/issueRoutes.js +195 -0
  18. package/src/routes/projectRoutes.js +46 -0
  19. package/src/routes/reportRoutes.js +40 -0
  20. package/src/routes/scanRoutes.js +245 -0
  21. package/src/routes/userRoutes.js +47 -0
  22. package/src/services/ast/parser.js +503 -0
  23. package/src/services/detection/detector.js +934 -0
  24. package/src/services/llm/providers.js +1107 -0
  25. package/src/services/rag/agent.js +375 -0
  26. package/src/services/vector/knowledgeBase.js +863 -0
  27. package/src/skills/Skill.js +38 -0
  28. package/src/skills/code-analysis/index.js +272 -0
  29. package/src/skills/code-detection/index.js +166 -0
  30. package/src/skills/code-detection/rules/console-log.js +45 -0
  31. package/src/skills/code-detection/rules/deep-nesting.js +76 -0
  32. package/src/skills/code-detection/rules/duplicate-code.js +57 -0
  33. package/src/skills/code-detection/rules/high-complexity.js +109 -0
  34. package/src/skills/code-detection/rules/index.js +59 -0
  35. package/src/skills/code-detection/rules/long-functions.js +54 -0
  36. package/src/skills/code-detection/rules/magic-numbers.js +48 -0
  37. package/src/skills/code-detection/rules/missing-comment.js +64 -0
  38. package/src/skills/code-detection/rules/null-check.js +71 -0
  39. package/src/skills/code-detection/rules/unnecessary-else.js +46 -0
  40. package/src/skills/code-detection/rules/unused-functions.js +57 -0
  41. package/src/skills/code-detection/rules/unused-imports.js +57 -0
  42. package/src/skills/code-detection/rules/unused-variables.js +54 -0
  43. package/src/skills/code-optimization/index.js +319 -0
  44. package/src/skills/index.js +152 -0
  45. package/src/utils/crypto.js +212 -0
  46. package/src/utils/database.js +125 -0
  47. package/src/utils/helpers.js +226 -0
  48. package/src/utils/logger.js +202 -0
  49. package/src/utils/mysql.js +198 -0
  50. package/src/utils/response.js +124 -0
package/src/index.js ADDED
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Express应用主文件
3
+ * 创建并配置Express服务器
4
+ */
5
+
6
+ const express = require('express');
7
+ const path = require('path');
8
+ const { config, validate } = require('./config');
9
+ const { logger, requestLogger } = require('./utils/logger');
10
+ const { closeDatabase } = require('./utils/database');
11
+ const {
12
+ securityMiddleware,
13
+ corsMiddleware,
14
+ rateLimitMiddleware,
15
+ bodyParserMiddleware,
16
+ errorHandler,
17
+ notFoundHandler
18
+ } = require('./middlewares');
19
+
20
+ // 导入路由
21
+ const routes = require('./routes');
22
+
23
+ // 创建Express应用
24
+ const app = express();
25
+
26
+ // 验证配置
27
+ if (!validate()) {
28
+ process.exit(1);
29
+ }
30
+
31
+ // ============================================
32
+ // 配置中间件
33
+ // ============================================
34
+
35
+ // 安全中间件
36
+ app.use(securityMiddleware);
37
+
38
+ // CORS中间件
39
+ app.use(corsMiddleware);
40
+
41
+ // 请求体解析中间件
42
+ app.use(bodyParserMiddleware);
43
+
44
+ // 请求日志中间件
45
+ app.use(requestLogger);
46
+
47
+ // 静态文件服务(用于报告文件)
48
+ const reportsDir = path.join(__dirname, '..', 'reports');
49
+ app.use('/reports', express.static(reportsDir));
50
+
51
+ // ============================================
52
+ // API路由
53
+ // ============================================
54
+
55
+ // API路由前缀
56
+ app.use('/api', rateLimitMiddleware);
57
+
58
+ // 注册业务路由
59
+ app.use('/api', routes);
60
+
61
+ // 健康检查路由
62
+ app.get('/health', (req, res) => {
63
+ res.json({
64
+ success: true,
65
+ code: 200,
66
+ message: '服务运行正常',
67
+ data: {
68
+ status: 'healthy',
69
+ mode: config.defaultMode,
70
+ timestamp: new Date().toISOString()
71
+ }
72
+ });
73
+ });
74
+
75
+ // 根路由
76
+ app.get('/', (req, res) => {
77
+ res.json({
78
+ success: true,
79
+ code: 200,
80
+ message: '代码优化智能体API服务',
81
+ data: {
82
+ name: 'Code Optimizer Agent',
83
+ version: '1.0.0',
84
+ description: '基于Tree-sitter与RAG的多语言代码优化智能体',
85
+ endpoints: {
86
+ health: '/health',
87
+ api: '/api',
88
+ docs: '/api/docs'
89
+ }
90
+ }
91
+ });
92
+ });
93
+
94
+ // ============================================
95
+ // 错误处理
96
+ // ============================================
97
+
98
+ // 404处理
99
+ app.use(notFoundHandler);
100
+
101
+ // 全局错误处理
102
+ app.use(errorHandler);
103
+
104
+ // ============================================
105
+ // 启动服务器
106
+ // ============================================
107
+
108
+ const PORT = config.server.port;
109
+ const HOST = config.server.host;
110
+
111
+ // 启动HTTP服务器
112
+ const server = app.listen(PORT, HOST, () => {
113
+ logger.info(`服务器启动成功: http://${HOST}:${PORT}`);
114
+ logger.info(`运行模式: ${config.defaultMode}`);
115
+ logger.info(`环境: ${config.server.nodeEnv}`);
116
+ });
117
+
118
+ // ============================================
119
+ // 进程事件处理
120
+ // ============================================
121
+
122
+ // 优雅关闭
123
+ process.on('SIGTERM', gracefulShutdown);
124
+ process.on('SIGINT', gracefulShutdown);
125
+
126
+ // 未捕获异常处理
127
+ process.on('uncaughtException', (err) => {
128
+ logger.error('未捕获异常:', err);
129
+ gracefulShutdown();
130
+ });
131
+
132
+ // 未处理的Promise拒绝
133
+ process.on('unhandledRejection', (reason, promise) => {
134
+ logger.error('未处理的Promise拒绝:', reason);
135
+ });
136
+
137
+ /**
138
+ * 优雅关闭函数
139
+ */
140
+ function gracefulShutdown() {
141
+ logger.info('正在关闭服务器...');
142
+
143
+ server.close((err) => {
144
+ if (err) {
145
+ logger.error('关闭服务器失败:', err);
146
+ process.exit(1);
147
+ }
148
+
149
+ logger.info('服务器已关闭');
150
+
151
+ // 关闭数据库连接
152
+ closeDatabase();
153
+
154
+ process.exit(0);
155
+ });
156
+
157
+ // 强制关闭超时
158
+ setTimeout(() => {
159
+ logger.error('强制关闭服务器');
160
+ closeDatabase();
161
+ process.exit(1);
162
+ }, 10000);
163
+ }
164
+
165
+ module.exports = app;
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Express中间件模块
3
+ */
4
+
5
+ const helmet = require('helmet');
6
+ const cors = require('cors');
7
+ const rateLimit = require('express-rate-limit');
8
+ const { config } = require('../config');
9
+ const { logger } = require('../utils/logger');
10
+
11
+ /**
12
+ * 安全中间件配置
13
+ */
14
+ const securityMiddleware = [
15
+ // Helmet安全头
16
+ helmet({
17
+ contentSecurityPolicy: {
18
+ directives: {
19
+ defaultSrc: ["'self'"],
20
+ styleSrc: ["'self'", "'unsafe-inline'"],
21
+ scriptSrc: ["'self'"],
22
+ imgSrc: ["'self'", 'data:', 'https:'],
23
+ },
24
+ },
25
+ crossOriginEmbedderPolicy: false,
26
+ }),
27
+ ];
28
+
29
+ /**
30
+ * CORS中间件配置
31
+ */
32
+ const corsMiddleware = cors({
33
+ origin: config.cors.origins,
34
+ credentials: config.cors.credentials,
35
+ methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
36
+ allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'],
37
+ exposedHeaders: ['X-Total-Count', 'X-Page-Size'],
38
+ maxAge: 86400, // 24小时
39
+ });
40
+
41
+ /**
42
+ * 速率限制中间件
43
+ */
44
+ const rateLimitMiddleware = rateLimit({
45
+ windowMs: config.rateLimit.windowMs,
46
+ max: config.rateLimit.max,
47
+ message: {
48
+ success: false,
49
+ code: 429,
50
+ message: '请求过于频繁,请稍后再试',
51
+ timestamp: new Date().toISOString()
52
+ },
53
+ standardHeaders: true,
54
+ legacyHeaders: false,
55
+ handler: (req, res, next, options) => {
56
+ logger.warn(`速率限制触发: ${req.ip} - ${req.method} ${req.url}`);
57
+ res.status(429).json(options.message);
58
+ }
59
+ });
60
+
61
+ /**
62
+ * 请求体解析中间件
63
+ */
64
+ const bodyParserMiddleware = [
65
+ // JSON解析
66
+ require('express').json({
67
+ limit: '10mb',
68
+ strict: true,
69
+ }),
70
+ // URL编码解析
71
+ require('express').urlencoded({
72
+ extended: true,
73
+ limit: '10mb',
74
+ }),
75
+ ];
76
+
77
+ /**
78
+ * 错误处理中间件
79
+ */
80
+ function errorHandler(err, req, res, next) {
81
+ logger.error('错误处理中间件捕获:', err);
82
+
83
+ // JWT错误
84
+ if (err.name === 'UnauthorizedError') {
85
+ return res.status(401).json({
86
+ success: false,
87
+ code: 401,
88
+ message: '无效的认证令牌',
89
+ timestamp: new Date().toISOString()
90
+ });
91
+ }
92
+
93
+ // 验证错误
94
+ if (err.name === 'ValidationError') {
95
+ return res.status(400).json({
96
+ success: false,
97
+ code: 400,
98
+ message: '参数验证失败',
99
+ errors: err.errors,
100
+ timestamp: new Date().toISOString()
101
+ });
102
+ }
103
+
104
+ // 语法错误
105
+ if (err instanceof SyntaxError && err.status === 400 && 'body' in err) {
106
+ return res.status(400).json({
107
+ success: false,
108
+ code: 400,
109
+ message: 'JSON解析错误',
110
+ timestamp: new Date().toISOString()
111
+ });
112
+ }
113
+
114
+ // 数据库错误
115
+ if (err.code === 'SQLITE_CONSTRAINT') {
116
+ return res.status(400).json({
117
+ success: false,
118
+ code: 400,
119
+ message: '数据约束冲突',
120
+ timestamp: new Date().toISOString()
121
+ });
122
+ }
123
+
124
+ // 默认错误
125
+ const statusCode = err.status || err.statusCode || 500;
126
+ const message = err.message || '服务器内部错误';
127
+
128
+ res.status(statusCode).json({
129
+ success: false,
130
+ code: statusCode,
131
+ message,
132
+ errors: config.server.nodeEnv === 'development' ? err.stack : undefined,
133
+ timestamp: new Date().toISOString()
134
+ });
135
+ }
136
+
137
+ /**
138
+ * 404处理中间件
139
+ */
140
+ function notFoundHandler(req, res, next) {
141
+ res.status(404).json({
142
+ success: false,
143
+ code: 404,
144
+ message: `路由未找到: ${req.method} ${req.url}`,
145
+ timestamp: new Date().toISOString()
146
+ });
147
+ }
148
+
149
+ /**
150
+ * 异步错误捕获包装器
151
+ */
152
+ function asyncHandler(fn) {
153
+ return (req, res, next) => {
154
+ Promise.resolve(fn(req, res, next)).catch(next);
155
+ };
156
+ }
157
+
158
+ module.exports = {
159
+ securityMiddleware,
160
+ corsMiddleware,
161
+ rateLimitMiddleware,
162
+ bodyParserMiddleware,
163
+ errorHandler,
164
+ notFoundHandler,
165
+ asyncHandler
166
+ };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * 中间件导出模块
3
+ */
4
+
5
+ const {
6
+ securityMiddleware,
7
+ corsMiddleware,
8
+ rateLimitMiddleware,
9
+ bodyParserMiddleware,
10
+ errorHandler,
11
+ notFoundHandler,
12
+ asyncHandler
13
+ } = require('./errorHandler');
14
+
15
+ module.exports = {
16
+ securityMiddleware,
17
+ corsMiddleware,
18
+ rateLimitMiddleware,
19
+ bodyParserMiddleware,
20
+ errorHandler,
21
+ notFoundHandler,
22
+ asyncHandler
23
+ };
@@ -0,0 +1,117 @@
1
+ /**
2
+ * AI优化路由模块
3
+ * 处理AI代码优化相关请求
4
+ */
5
+
6
+ const express = require('express');
7
+ const router = express.Router();
8
+ const { optimizeWithRAG } = require('../services/rag/agent');
9
+ const { success, error } = require('../utils/response');
10
+ const { logger } = require('../utils/logger');
11
+ const { getFileLanguage } = require('../utils/helpers');
12
+ const { isOnlineMode } = require('../config');
13
+
14
+ /**
15
+ * AI优化代码片段
16
+ */
17
+ router.post('/optimize', async (req, res) => {
18
+ const startTime = Date.now();
19
+
20
+ try {
21
+ const { code, filePath, language, issueType, message } = req.body;
22
+
23
+ if (!code) {
24
+ return res.status(400).json(error('缺少代码片段', 400));
25
+ }
26
+
27
+ // 检查是否为在线模式
28
+ if (!isOnlineMode()) {
29
+ return res.json(error('当前为离线模式,无法使用AI优化功能'));
30
+ }
31
+
32
+ // 构建issue对象
33
+ const issue = {
34
+ id: null,
35
+ codeSnippet: code
36
+ };
37
+
38
+ // 构建上下文
39
+ const context = {
40
+ language: language || getFileLanguage(filePath || 'unknown.js'),
41
+ issueType: issueType || 'general',
42
+ message: message || '优化建议',
43
+ taskId: null
44
+ };
45
+
46
+ // 执行RAG优化
47
+ const result = await optimizeWithRAG(issue, context);
48
+
49
+ if (!result.success) {
50
+ return res.json(error(result.message));
51
+ }
52
+
53
+ logger.info('AI优化完成');
54
+
55
+ return res.json(success({
56
+ optimizationId: result.optimizationId,
57
+ optimizedCode: result.optimizedCode,
58
+ explanation: result.explanation,
59
+ suggestions: result.suggestions,
60
+ similarSnippets: result.similarSnippets,
61
+ tokensUsed: result.tokensUsed,
62
+ durationMs: Date.now() - startTime
63
+ }));
64
+ } catch (err) {
65
+ logger.error('AI优化失败:', err);
66
+ return res.status(500).json(error(err.message));
67
+ }
68
+ });
69
+
70
+ /**
71
+ * 获取优化历史
72
+ */
73
+ router.get('/history', (req, res) => {
74
+ try {
75
+ const limit = parseInt(req.query.limit) || 10;
76
+ const { getOptimizationHistory } = require('../services/rag/agent');
77
+ const history = getOptimizationHistory(limit);
78
+
79
+ return res.json(success({
80
+ total: history.length,
81
+ history
82
+ }));
83
+ } catch (err) {
84
+ logger.error('获取优化历史失败:', err);
85
+ return res.status(500).json(error(err.message));
86
+ }
87
+ });
88
+
89
+ /**
90
+ * 应用优化建议
91
+ */
92
+ router.post('/apply', async (req, res) => {
93
+ try {
94
+ const { optimizationId, filePath, originalCode, optimizedCode } = req.body;
95
+
96
+ if (!filePath || !optimizedCode) {
97
+ return res.status(400).json(error('缺少必要参数', 400));
98
+ }
99
+
100
+ // 这里应该实现实际的代码替换逻辑
101
+ // 由于安全考虑,实际应用中应该由前端或IDE插件完成替换
102
+
103
+ logger.info(`优化建议已应用: ${optimizationId}`);
104
+
105
+ return res.json(success({
106
+ optimizationId,
107
+ filePath,
108
+ applied: true,
109
+ message: '优化建议已应用,请在IDE中确认更改'
110
+ }));
111
+ } catch (err) {
112
+ logger.error('应用优化失败:', err);
113
+ return res.status(500).json(error(err.message));
114
+ }
115
+ });
116
+
117
+ module.exports = router;
@@ -0,0 +1,31 @@
1
+ /**
2
+ * 配置路由模块
3
+ */
4
+
5
+ const express = require('express');
6
+ const router = express.Router();
7
+ const { getDatabase } = require('../utils/database');
8
+ const { success, error } = require('../utils/response');
9
+
10
+ router.get('/', (req, res) => {
11
+ try {
12
+ const db = getDatabase();
13
+ const stmt = db.prepare('SELECT config_key, config_value, config_type, description FROM sys_config WHERE is_public = 1');
14
+ const configs = stmt.all();
15
+
16
+ const configMap = {};
17
+ configs.forEach(c => {
18
+ configMap[c.config_key] = {
19
+ value: c.config_value,
20
+ type: c.config_type,
21
+ description: c.description
22
+ };
23
+ });
24
+
25
+ return res.json(success(configMap));
26
+ } catch (err) {
27
+ return res.status(500).json(error(err.message));
28
+ }
29
+ });
30
+
31
+ module.exports = router;
@@ -0,0 +1,75 @@
1
+ /**
2
+ * 路由注册模块
3
+ * 统一管理所有API路由
4
+ */
5
+
6
+ const express = require('express');
7
+ const router = express.Router();
8
+
9
+ // 导入各业务模块路由
10
+ const userRoutes = require('./userRoutes');
11
+ const configRoutes = require('./configRoutes');
12
+ const projectRoutes = require('./projectRoutes');
13
+ const scanRoutes = require('./scanRoutes');
14
+ const issueRoutes = require('./issueRoutes');
15
+ const aiRoutes = require('./aiRoutes');
16
+ const reportRoutes = require('./reportRoutes');
17
+
18
+ // 注册路由
19
+ router.use('/users', userRoutes);
20
+ router.use('/config', configRoutes);
21
+ router.use('/projects', projectRoutes);
22
+ router.use('/scan', scanRoutes);
23
+ router.use('/issues', issueRoutes);
24
+ router.use('/ai', aiRoutes);
25
+ router.use('/reports', reportRoutes);
26
+
27
+ // API文档路由
28
+ router.get('/docs', (req, res) => {
29
+ res.json({
30
+ success: true,
31
+ code: 200,
32
+ message: 'API文档',
33
+ data: {
34
+ endpoints: {
35
+ users: {
36
+ base: '/api/users',
37
+ methods: ['GET', 'POST', 'PUT', 'DELETE'],
38
+ description: '用户管理'
39
+ },
40
+ config: {
41
+ base: '/api/config',
42
+ methods: ['GET', 'PUT'],
43
+ description: '系统配置'
44
+ },
45
+ projects: {
46
+ base: '/api/projects',
47
+ methods: ['GET', 'POST', 'PUT', 'DELETE'],
48
+ description: '项目管理'
49
+ },
50
+ scan: {
51
+ base: '/api/scan',
52
+ methods: ['POST', 'GET'],
53
+ description: '代码扫描'
54
+ },
55
+ issues: {
56
+ base: '/api/issues',
57
+ methods: ['GET', 'PUT'],
58
+ description: '代码缺陷'
59
+ },
60
+ ai: {
61
+ base: '/api/ai',
62
+ methods: ['POST', 'GET'],
63
+ description: 'AI优化'
64
+ },
65
+ reports: {
66
+ base: '/api/reports',
67
+ methods: ['GET', 'POST'],
68
+ description: '报告管理'
69
+ }
70
+ }
71
+ }
72
+ });
73
+ });
74
+
75
+ module.exports = router;