@jokeran/frontend-code-skimmer 0.1.6
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 +179 -0
- package/dist/index.js +413 -0
- package/package.json +49 -0
package/README.md
ADDED
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# Frontend-Code-Skimmer MCP
|
|
2
|
+
|
|
3
|
+
> 不读全文,只看骨架;不搜字符,搜语义关联。
|
|
4
|
+
|
|
5
|
+
AI 代码助手的智能代码索引引擎,支持 **Vue 2 / Vue 3 / React Hooks**。
|
|
6
|
+
|
|
7
|
+
## 解决什么问题?
|
|
8
|
+
|
|
9
|
+
- **7000 行大文件**:`skimmer_get_component_outline` 将其压缩为 60 行骨架,节省 95% Token
|
|
10
|
+
- **函数名拼写错误**:搜 `changeCash` 能找到 `changeCashValue`,自动提示 "cash 可能是 cache 的拼写错误"
|
|
11
|
+
- **不知道函数名**:`skimmer_find_by_behavior` 按行为搜索,搜 `storage` 直接列出所有操作 localStorage 的函数
|
|
12
|
+
- **同名函数串台**:`skimmer_find_symbol` / `skimmer_find_by_behavior` / `skimmer_get_call_graph` 支持 `file_path` 过滤
|
|
13
|
+
- **修改前评估影响**:`skimmer_get_blast_radius` 告诉你改一个函数会影响哪些地方
|
|
14
|
+
|
|
15
|
+
## 13 个 MCP 工具
|
|
16
|
+
|
|
17
|
+
| 工具 | 用途 |
|
|
18
|
+
| ---------------------------- | ---------------------------------- |
|
|
19
|
+
| `skimmer_index_project` | 初始化/更新代码索引 |
|
|
20
|
+
| `skimmer_get_component_outline` | ⭐ 获取文件骨架(极致 Token 节省) |
|
|
21
|
+
| `skimmer_find_symbol` | 智能符号搜索(支持拼写错误) |
|
|
22
|
+
| `skimmer_get_code_slice` | 精准代码切片(只取一个函数) |
|
|
23
|
+
| `skimmer_trace_assignments` | 变量赋值链路追踪(轻量) |
|
|
24
|
+
| `skimmer_trace_property_changes` | 对象属性修改追踪(轻量) |
|
|
25
|
+
| `skimmer_find_by_behavior` | ⭐ 按行为标签搜索(绕过命名问题) |
|
|
26
|
+
| `skimmer_trace_api_calls` | 网络 API 调用追踪 |
|
|
27
|
+
| `skimmer_get_call_graph` | 函数调用关系图谱 |
|
|
28
|
+
| `skimmer_trace_key_flow` | ⭐ 单工具 key 链路追踪 |
|
|
29
|
+
| `skimmer_visualize_dataflow` | 赋值+调用+落点合并视图 |
|
|
30
|
+
| `skimmer_get_blast_radius` | 修改影响范围评估 |
|
|
31
|
+
| `skimmer_get_project_overview` | 项目整体概览 |
|
|
32
|
+
|
|
33
|
+
## 安装
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
git clone <this-repo>
|
|
37
|
+
cd frontend-code-skimmer
|
|
38
|
+
npm install
|
|
39
|
+
npm run build
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 配置(Cursor / Claude Desktop)
|
|
43
|
+
|
|
44
|
+
在 MCP 配置文件中添加(**不需要指定项目路径**):
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"mcpServers": {
|
|
49
|
+
"frontend-code-skimmer": {
|
|
50
|
+
"command": "node",
|
|
51
|
+
"args": ["/path/to/frontend-code-skimmer/dist/index.js"],
|
|
52
|
+
"autoApprove": ["skimmer_index_project", "skimmer_get_component_outline", "skimmer_find_symbol", "skimmer_get_code_slice", "skimmer_trace_assignments", "skimmer_trace_property_changes", "skimmer_find_by_behavior", "skimmer_trace_api_calls", "skimmer_get_call_graph", "skimmer_trace_key_flow", "skimmer_visualize_dataflow", "skimmer_get_blast_radius", "skimmer_get_project_overview"]
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
就这样,不需要任何 `env` 配置。项目路径在**每次工具调用时动态指定**。
|
|
59
|
+
|
|
60
|
+
### 多项目工作流
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
项目 A: skimmer_index_project({ project_path: "/work/project-a" })
|
|
64
|
+
项目 B: skimmer_index_project({ project_path: "/work/project-b" })
|
|
65
|
+
|
|
66
|
+
→ 两个项目的索引会同时缓存在内存中
|
|
67
|
+
|
|
68
|
+
→ 查项目 A:
|
|
69
|
+
skimmer_get_component_outline({ project_path: "/work/project-a", file_path: "src/views/home.vue" })
|
|
70
|
+
|
|
71
|
+
→ 查项目 B:
|
|
72
|
+
skimmer_find_symbol({ project_path: "/work/project-b", query: "handleSubmit" })
|
|
73
|
+
|
|
74
|
+
→ 省略 project_path 时,自动使用上次操作的项目:
|
|
75
|
+
skimmer_find_symbol({ query: "handleSubmit" }) ← 自动用项目 B
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### 数据库存放位置
|
|
79
|
+
|
|
80
|
+
| 情况 | 数据库位置 |
|
|
81
|
+
| ------------ | ----------------------------------- |
|
|
82
|
+
| 项目目录可写 | `<项目根>/.frontend-code-skimmer-index.db` |
|
|
83
|
+
| 项目只读 | `~/.frontend-code-skimmer/databases/<项目名>.db` |
|
|
84
|
+
|
|
85
|
+
## 环境变量(全部可选)
|
|
86
|
+
|
|
87
|
+
| 变量 | 说明 | 默认值 |
|
|
88
|
+
| ----------------- | ------------------------------ | ------- |
|
|
89
|
+
| `LENS_PROJECT` | 全局默认项目(可选) | 无 |
|
|
90
|
+
| `LENS_AUTO_INDEX` | 启动时自动索引默认项目 | `false` |
|
|
91
|
+
| `LENS_DB` | 自定义数据库路径(单项目场景) | 自动 |
|
|
92
|
+
|
|
93
|
+
## 使用示例
|
|
94
|
+
|
|
95
|
+
### 1. 首次使用
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
调用 skimmer_index_project → 等待索引完成(50个文件约 2 秒)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 2. 快速了解组件
|
|
102
|
+
|
|
103
|
+
```
|
|
104
|
+
调用 skimmer_get_component_outline({ file_path: "src/views/apply/index.vue" })
|
|
105
|
+
→ 返回组件所有方法、状态、行为标签的骨架视图
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### 3. 查找拼写错误的函数
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
调用 skimmer_find_symbol({ query: "changeCash" })
|
|
112
|
+
→ 找到 changeCashValue,提示 "cash 可能是 cache 的拼写错误"
|
|
113
|
+
→ 行为标签显示: [storage:localStorage.setItem]
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 4. 查找操作本地存储的函数
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
调用 skimmer_find_by_behavior({ category: "storage", operation: "setItem", file_path: "src/views/apply/index.vue" })
|
|
120
|
+
→ 列出所有写入 localStorage 的函数,带文件位置
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### 5. 追踪某个 key 通过哪个调用链进入缓存
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
调用 skimmer_trace_key_flow({
|
|
127
|
+
key: "storageParams",
|
|
128
|
+
file_path: "src/views/apply/index.vue",
|
|
129
|
+
storage_api: "localStorage",
|
|
130
|
+
max_depth: 2
|
|
131
|
+
})
|
|
132
|
+
→ 一次返回:调用入口 + 下游方法链 + storage 落点
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### 6. 追踪变量赋值与属性修改
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
skimmer_trace_assignments({ variable: "changeResult", file_path: "src/views/apply/index.vue" })
|
|
139
|
+
skimmer_trace_property_changes({ object: "params", property: "receiveAdr", file_path: "src/views/apply/index.vue" })
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
说明:
|
|
143
|
+
- `skimmer_trace_assignments` 已升级为 **AST 优先**(正则兜底),可更稳定识别 `this.xxx = ...`、`obj[prop] = ...` 等赋值。
|
|
144
|
+
|
|
145
|
+
### 7. 追踪接口调用
|
|
146
|
+
|
|
147
|
+
```
|
|
148
|
+
skimmer_trace_api_calls({ file_path: "src/views/apply/index.vue", keyword: "/queryDetailForC" })
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
说明:
|
|
152
|
+
- 支持识别封装网络调用(如 `this.aksCommonHandle(...)`、`xxxApi.request(...)`)并归类为 `network`。
|
|
153
|
+
|
|
154
|
+
### 8. 数据流总览(轻量)
|
|
155
|
+
|
|
156
|
+
```
|
|
157
|
+
skimmer_visualize_dataflow({ variable: "storageParams", file_path: "src/views/apply/index.vue", max_depth: 2 })
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
## 框架支持
|
|
161
|
+
|
|
162
|
+
| 框架 | 解析器 | 支持的模式 |
|
|
163
|
+
| ----- | ------------------------------- | ---------------------------------- |
|
|
164
|
+
| Vue 2 | `vue-template-compiler` + Acorn | Options API |
|
|
165
|
+
| Vue 3 | `@vue/compiler-sfc` + Acorn | `<script setup>` + Composition API |
|
|
166
|
+
| React | Acorn + `acorn-jsx` | 函数组件 + Hooks |
|
|
167
|
+
|
|
168
|
+
## 行为检测
|
|
169
|
+
|
|
170
|
+
自动识别以下 API 调用并打上标签:
|
|
171
|
+
|
|
172
|
+
- `storage`:localStorage / sessionStorage
|
|
173
|
+
- `network`:axios / fetch
|
|
174
|
+
- `router`:$router / useRouter / navigate
|
|
175
|
+
- `vuex`:$store / useStore / dispatch / commit
|
|
176
|
+
- `dom`:document / $refs / $nextTick
|
|
177
|
+
- `event`:$emit / EventBus
|
|
178
|
+
- `timer`:setTimeout / setInterval
|
|
179
|
+
- `i18n`:$t / useI18n
|