@lorrylurui/code-intelligence-mcp 1.0.1 → 1.0.2
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
CHANGED
|
@@ -79,6 +79,24 @@ docker compose ps
|
|
|
79
79
|
mysql -u root -p code_intelligence < sql/schema.sql
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
+
### 自定义表名(第三方项目集成)
|
|
83
|
+
|
|
84
|
+
若需使用不同的表名,可通过环境变量配置:
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# 设置自定义表名
|
|
88
|
+
export MYSQL_SYMBOLS_TABLE=my_project_symbols
|
|
89
|
+
|
|
90
|
+
# 然后server代码内部执行建表(表名会在代码中动态替换)
|
|
91
|
+
mysql -u root -p code_intelligence -e "$(node -e \"import('./dist/db/schema.js').then(m => console.log(m.getSymbolsTableSQL()))\")"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
或在 `.env` 中配置:
|
|
95
|
+
|
|
96
|
+
```env
|
|
97
|
+
MYSQL_SYMBOLS_TABLE=my_project_symbols
|
|
98
|
+
```
|
|
99
|
+
|
|
82
100
|
## 4) 本地运行
|
|
83
101
|
|
|
84
102
|
### 普通开发(热更新)
|
|
@@ -239,7 +257,8 @@ npm run embedding:dev
|
|
|
239
257
|
Run with:
|
|
240
258
|
|
|
241
259
|
````bash
|
|
242
|
-
npx code-intelligence-mcp
|
|
260
|
+
- 脚本 cli 启动:npx code-intelligence-mcp(走mcp不执行)
|
|
261
|
+
- 给项目做索引,运行:npx code-intelligence-index, 项目根目录取配置或者cwd(重要,首次以及后续需要时执行:新项目必须执行一次建表)
|
|
243
262
|
---
|
|
244
263
|
|
|
245
264
|
### MCP 配置(核心)
|
|
@@ -172,7 +172,7 @@ async function main() {
|
|
|
172
172
|
return [];
|
|
173
173
|
const [dbRows] = await mysqlPool.query(`
|
|
174
174
|
SELECT id, name, type, path, CAST(meta AS CHAR) AS meta, embedding
|
|
175
|
-
FROM
|
|
175
|
+
FROM ${env.mysqlSymbolsTable}
|
|
176
176
|
WHERE type = ? AND embedding IS NOT NULL
|
|
177
177
|
ORDER BY usage_count DESC
|
|
178
178
|
LIMIT ?
|
package/dist/config/env.js
CHANGED
|
@@ -8,6 +8,8 @@ export const env = {
|
|
|
8
8
|
mysqlUser: process.env.MYSQL_USER ?? "root",
|
|
9
9
|
mysqlPassword: process.env.MYSQL_PASSWORD ?? "",
|
|
10
10
|
mysqlDatabase: process.env.MYSQL_DATABASE ?? "code_intelligence",
|
|
11
|
+
/** symbols 表名,可通过 MYSQL_SYMBOLS_TABLE 环境变量配置 */
|
|
12
|
+
mysqlSymbolsTable: process.env.MYSQL_SYMBOLS_TABLE ?? "symbols",
|
|
11
13
|
/** Phase 5:指向 Python FastAPI 嵌入服务根 URL,如 http://127.0.0.1:8765 */
|
|
12
14
|
embeddingServiceUrl: (process.env.EMBEDDING_SERVICE_URL ?? "").trim()
|
|
13
15
|
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 动态生成数据库表结构 SQL,表名可通过环境变量配置
|
|
3
|
+
*/
|
|
4
|
+
import { env } from '../config/env.js';
|
|
5
|
+
/** 获取 symbols 表的建表 SQL */
|
|
6
|
+
export function getSymbolsTableSQL() {
|
|
7
|
+
const tableName = env.mysqlSymbolsTable;
|
|
8
|
+
return `CREATE TABLE IF NOT EXISTS ${tableName} (
|
|
9
|
+
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
10
|
+
name VARCHAR(255) NOT NULL,
|
|
11
|
+
type ENUM('component', 'util', 'selector', 'type') NOT NULL,
|
|
12
|
+
category VARCHAR(255) NULL,
|
|
13
|
+
path TEXT NOT NULL,
|
|
14
|
+
description TEXT NULL,
|
|
15
|
+
content MEDIUMTEXT NULL,
|
|
16
|
+
meta JSON NULL,
|
|
17
|
+
usage_count INT NOT NULL DEFAULT 0,
|
|
18
|
+
embedding JSON NULL COMMENT 'Phase 5: L2-normalized vector from Python embedding service (e.g. 384-dim MiniLM)',
|
|
19
|
+
insert_user VARCHAR(255) NOT NULL DEFAULT 'LorryIsLuRui',
|
|
20
|
+
updated_user VARCHAR(255) NOT NULL DEFAULT 'LorryIsLuRui',
|
|
21
|
+
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
22
|
+
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
23
|
+
UNIQUE KEY uk_symbols_path_name (path(512), name(255))
|
|
24
|
+
)`;
|
|
25
|
+
}
|
|
26
|
+
/** 获取所有建表 SQL(可一次性执行) */
|
|
27
|
+
export function getAllTableSQLs() {
|
|
28
|
+
return [getSymbolsTableSQL()];
|
|
29
|
+
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { env } from '../config/env.js';
|
|
2
|
+
import { getSymbolsTableSQL } from '../db/schema.js';
|
|
1
3
|
/**
|
|
2
4
|
* 依赖表上 `(path, name)` 唯一键:新行插入,已存在则更新类型/描述/内容与 meta;**不**修改 `usage_count`。
|
|
3
5
|
* @param rows 来自 `indexProject`;空数组时立即返回,不开启事务。
|
|
@@ -8,11 +10,12 @@ export async function upsertSymbols(pool, rows, embeddings) {
|
|
|
8
10
|
if (rows.length === 0)
|
|
9
11
|
return;
|
|
10
12
|
if (embeddings && embeddings.length !== rows.length) {
|
|
11
|
-
throw new Error(
|
|
13
|
+
throw new Error('upsertSymbols: embeddings length must match rows');
|
|
12
14
|
}
|
|
13
|
-
const actor = process.env.GITHUB_USERNAME?.trim() ||
|
|
15
|
+
const actor = process.env.GITHUB_USERNAME?.trim() || 'LorryIsLuRui';
|
|
16
|
+
await pool.query(getSymbolsTableSQL()); // 确保表存在
|
|
14
17
|
const sql = `
|
|
15
|
-
INSERT INTO
|
|
18
|
+
INSERT INTO ${env.mysqlSymbolsTable} (name, type, category, path, description, content, meta, insert_user, updated_user, embedding)
|
|
16
19
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
17
20
|
ON DUPLICATE KEY UPDATE
|
|
18
21
|
type = VALUES(type),
|
|
@@ -40,7 +43,7 @@ export async function upsertSymbols(pool, rows, embeddings) {
|
|
|
40
43
|
JSON.stringify(r.meta),
|
|
41
44
|
actor,
|
|
42
45
|
actor,
|
|
43
|
-
embJson
|
|
46
|
+
embJson,
|
|
44
47
|
]);
|
|
45
48
|
}
|
|
46
49
|
await conn.commit();
|
|
@@ -97,7 +97,7 @@ export class SymbolRepository {
|
|
|
97
97
|
const params = [`%${query}%`];
|
|
98
98
|
let sql = `
|
|
99
99
|
SELECT id, name, type, category, path, description, content, CAST(meta AS CHAR) AS meta, usage_count, created_at
|
|
100
|
-
FROM
|
|
100
|
+
FROM ${env.mysqlSymbolsTable}
|
|
101
101
|
WHERE (name LIKE ? OR description LIKE ?)
|
|
102
102
|
`;
|
|
103
103
|
params.push(`%${query}%`);
|
|
@@ -129,7 +129,7 @@ export class SymbolRepository {
|
|
|
129
129
|
}
|
|
130
130
|
let sql = `
|
|
131
131
|
SELECT id, name, type, category, path, description, content, CAST(meta AS CHAR) AS meta, usage_count, created_at, embedding
|
|
132
|
-
FROM
|
|
132
|
+
FROM ${env.mysqlSymbolsTable}
|
|
133
133
|
WHERE embedding IS NOT NULL
|
|
134
134
|
`;
|
|
135
135
|
const params = [];
|
|
@@ -158,7 +158,7 @@ export class SymbolRepository {
|
|
|
158
158
|
}
|
|
159
159
|
const [rows] = await this.pool.query(`
|
|
160
160
|
SELECT id, name, type, category, path, description, content, CAST(meta AS CHAR) AS meta, usage_count, created_at
|
|
161
|
-
FROM
|
|
161
|
+
FROM ${env.mysqlSymbolsTable}
|
|
162
162
|
WHERE name = ?
|
|
163
163
|
LIMIT 1
|
|
164
164
|
`, [name]);
|
|
@@ -197,7 +197,7 @@ export class SymbolRepository {
|
|
|
197
197
|
const params = [];
|
|
198
198
|
let sql = `
|
|
199
199
|
SELECT id, name, type, category, path, description, content, CAST(meta AS CHAR) AS meta, usage_count, created_at
|
|
200
|
-
FROM
|
|
200
|
+
FROM ${env.mysqlSymbolsTable}
|
|
201
201
|
WHERE 1 = 1
|
|
202
202
|
`;
|
|
203
203
|
if (type) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lorrylurui/code-intelligence-mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "MCP server for code intelligence with symbol search and reusable code recommendation",
|
|
6
6
|
"type": "module",
|
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
"dist"
|
|
10
10
|
],
|
|
11
11
|
"bin": {
|
|
12
|
-
"code-intelligence-mcp": "./dist/index.js"
|
|
12
|
+
"code-intelligence-mcp": "./dist/index.js",
|
|
13
|
+
"code-intelligence-index": "./dist/cli/index-codebase.js"
|
|
13
14
|
},
|
|
14
15
|
"scripts": {
|
|
15
16
|
"dev": "tsx watch --clear-screen=false --exclude node_modules --exclude dist src/index.ts",
|