dsh-codegraph-visualizer 0.1.0 → 0.3.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 +391 -223
- package/assets/icon-180.png +0 -0
- package/assets/icon.svg +30 -0
- package/cordis.patch.yml +22 -17
- package/dist/CodeGraphAdapter-C8JvcS7m.js +10 -0
- package/dist/CodeGraphAdapter-eyrhs0K0.js +422 -0
- package/dist/CodeGraphAdapter-eyrhs0K0.js.map +1 -0
- package/dist/FileSystemAdapter-CgasSGbB.js +524 -0
- package/dist/FileSystemAdapter-CgasSGbB.js.map +1 -0
- package/dist/LensAdapter-C9Saf_i_.js +89 -0
- package/dist/LensAdapter-C9Saf_i_.js.map +1 -0
- package/dist/Logger-DUIJSeNu.js +80 -0
- package/dist/Logger-DUIJSeNu.js.map +1 -0
- package/dist/TreeSitterAdapter-C-EWy8br.js +631 -0
- package/dist/TreeSitterAdapter-C-EWy8br.js.map +1 -0
- package/dist/TreeSitterAdapter-C6FcO2_s.js +8 -0
- package/dist/client/index.css +8900 -1777
- package/dist/client/index.css.map +1 -0
- package/dist/client/index.d.ts +634 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.esm.js +57219 -20978
- package/dist/client/index.js.map +1 -0
- package/dist/client/{index.js → worker/layoutWorker.js} +7657 -8787
- package/dist/client.js +90067 -0
- package/dist/codeGraphDb-BT9nZCEO.js +357 -0
- package/dist/codeGraphDb-BT9nZCEO.js.map +1 -0
- package/dist/codeGraphDb-Bg7bWud2.js +9 -0
- package/dist/codeGraphRows-BhZX34uB.js +6 -0
- package/dist/codeGraphRows-C7hqu35E.js +246 -0
- package/dist/codeGraphRows-C7hqu35E.js.map +1 -0
- package/dist/constants-CQq93l3e.js +399 -0
- package/dist/constants-CQq93l3e.js.map +1 -0
- package/dist/graphFingerprint-CeARo7jG.js +4 -0
- package/dist/graphFingerprint-PuxORZUF.js +277 -0
- package/dist/graphFingerprint-PuxORZUF.js.map +1 -0
- package/dist/graphMetrics-C0F30730.js +555 -0
- package/dist/graphMetrics-C0F30730.js.map +1 -0
- package/dist/index.d.ts +572 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14734 -2003
- package/dist/index.js.map +1 -1
- package/dist/inheritanceEnhancer-Bi3UoYJS.js +291 -0
- package/dist/inheritanceEnhancer-Bi3UoYJS.js.map +1 -0
- package/dist/layerUtils-DDm-EsaD.js +72 -0
- package/dist/layerUtils-DDm-EsaD.js.map +1 -0
- package/dist/nativeIndex-Cx7RLXUp.js +5 -0
- package/dist/nativeIndex-DlSpD611.js +347 -0
- package/dist/nativeIndex-DlSpD611.js.map +1 -0
- package/dist/treeSitterExtractors-B1ybKNrC.js +394 -0
- package/dist/treeSitterExtractors-B1ybKNrC.js.map +1 -0
- package/dist/types-BUDxI_00.js +23 -0
- package/dist/types-BUDxI_00.js.map +1 -0
- package/locale/en.json +6 -0
- package/locale/zh-CN.json +6 -0
- package/locale/zh.json +6 -0
- package/package.json +101 -21
- package/dist/client-cjs/index.cjs +0 -44283
- package/dist/client-cjs/index.css +0 -2404
package/README.md
CHANGED
|
@@ -1,223 +1,391 @@
|
|
|
1
|
-
# DSH CodeGraph Visualizer
|
|
2
|
-
|
|
3
|
-
> DeepSeek Harness (DSH) 代码图谱可视化插件 — 将 `dsh-codegraph` 与 `dsh-tool-lens` 数据源聚合为交互式代码关系图谱
|
|
4
|
-
|
|
5
|
-
[](https://github.com/xuanyuanchumo/dsh-codegraph-visualizer/actions/workflows/ci.yml)
|
|
6
|
-
[](https://github.com/xuanyuanchumo/dsh-codegraph-visualizer/actions/workflows/release.yml)
|
|
7
|
-
[](https://opensource.org/licenses/MIT)
|
|
8
|
-
[](https://nodejs.org/)
|
|
9
|
-
[](https://pnpm.io/)
|
|
10
|
-
|
|
11
|
-
## 概述
|
|
12
|
-
|
|
13
|
-
DSH CodeGraph Visualizer 是一个 [DeepSeek Harness](https://github.com/deepseek-ai/dsh) 生态插件,填补了代码关系图谱可视化领域的空白。它将 `dsh-codegraph`(CodeGraph CLI 封装工具)和 `dsh-tool-lens`(AST 代码图谱与拓扑分析)两个数据源的输出聚合、转换,并通过 [Cytoscape.js](https://cytoscape.org/) 渲染为交互式代码关系图谱面板,嵌入 DSH Web UI 侧边栏。
|
|
14
|
-
|
|
15
|
-
### 核心能力
|
|
16
|
-
|
|
17
|
-
- **多数据源融合** — 同时接入 `dsh-codegraph` 与 `dsh-tool-lens`,自动合并去重
|
|
18
|
-
- **渐进式层级聚合** —
|
|
19
|
-
- **
|
|
20
|
-
- **交互式分析** — 符号搜索、调用链追踪、循环依赖检测、影响分析、继承层次
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
###
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
###
|
|
41
|
-
|
|
42
|
-
```bash
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
```bash
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
pnpm
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
#
|
|
67
|
-
dsh web
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
pnpm run
|
|
77
|
-
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
│
|
|
94
|
-
│
|
|
95
|
-
│ │
|
|
96
|
-
│ │
|
|
97
|
-
│ │
|
|
98
|
-
│
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
│
|
|
120
|
-
├──
|
|
121
|
-
│ ├──
|
|
122
|
-
│ ├──
|
|
123
|
-
│
|
|
124
|
-
|
|
125
|
-
│ ├──
|
|
126
|
-
│
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
│ ├──
|
|
130
|
-
│
|
|
131
|
-
│
|
|
132
|
-
│
|
|
133
|
-
│
|
|
134
|
-
│
|
|
135
|
-
│
|
|
136
|
-
│
|
|
137
|
-
│
|
|
138
|
-
│ ├──
|
|
139
|
-
│ ├──
|
|
140
|
-
│ └──
|
|
141
|
-
├──
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
|
205
|
-
|
|
206
|
-
|
|
|
207
|
-
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
1
|
+
# DSH CodeGraph Visualizer
|
|
2
|
+
|
|
3
|
+
> DeepSeek Harness (DSH) 代码图谱可视化插件 — 将 `dsh-codegraph` 与 `dsh-tool-lens` 数据源聚合为交互式代码关系图谱
|
|
4
|
+
|
|
5
|
+
[](https://github.com/xuanyuanchumo/dsh-codegraph-visualizer/actions/workflows/ci.yml)
|
|
6
|
+
[](https://github.com/xuanyuanchumo/dsh-codegraph-visualizer/actions/workflows/release.yml)
|
|
7
|
+
[](https://opensource.org/licenses/MIT)
|
|
8
|
+
[](https://nodejs.org/)
|
|
9
|
+
[](https://pnpm.io/)
|
|
10
|
+
|
|
11
|
+
## 概述
|
|
12
|
+
|
|
13
|
+
DSH CodeGraph Visualizer 是一个 [DeepSeek Harness](https://github.com/deepseek-ai/dsh) 生态插件,填补了代码关系图谱可视化领域的空白。它将 `dsh-codegraph`(CodeGraph CLI 封装工具)和 `dsh-tool-lens`(AST 代码图谱与拓扑分析)两个数据源的输出聚合、转换,并通过 [Cytoscape.js](https://cytoscape.org/) 渲染为交互式代码关系图谱面板,嵌入 DSH Web UI 侧边栏。
|
|
14
|
+
|
|
15
|
+
### 核心能力
|
|
16
|
+
|
|
17
|
+
- **多数据源融合** — 同时接入 `dsh-codegraph` 与 `dsh-tool-lens`,自动合并去重
|
|
18
|
+
- **渐进式层级聚合** — 渐进式聚类 + 增量聚类 + Louvain 社区检测
|
|
19
|
+
- **7 种布局引擎** — Cose(力导向)、fCose(改进力导向)、Dagre(层次)、Circle(环形)、Grid(网格)、Radial(辐射)、Tree(树形)
|
|
20
|
+
- **交互式分析** — 符号搜索、调用链追踪、循环依赖检测、影响分析、继承层次
|
|
21
|
+
- **交互式图例** — 点击图例行切换节点/边类型可见性(v0.3.0)
|
|
22
|
+
- **调用链流动动画** — 高亮调用链的边以虚线流动呈现数据流向(v0.3.0)
|
|
23
|
+
- **实时增量更新** — 文件监听 + 事件驱动,代码变更后图谱自动刷新
|
|
24
|
+
- **导出能力** — PNG / SVG / JSON / Mermaid 四格式导出
|
|
25
|
+
- **图谱管理面板** — 图指标(密度/聚类/PageRank/介数)、索引覆盖范围、限流观测、诊断四态(ready/degraded/disabled)+ 修复指引问题码
|
|
26
|
+
- **可观测性数据面** — 管线耗时占比、缓存命中率、ETag 决策分布、AST 预算用量、限流白盒快照
|
|
27
|
+
- **声明式配置** — Schemastery `Config` schema 导出,宿主设置 UI 可编辑、加载期校验(v0.3.0)
|
|
28
|
+
- **跨项目隔离** — 按 workspace 隔离图谱数据与缓存,多工作区切换互不污染
|
|
29
|
+
- **中英双语 i18n** — 完整国际化支持
|
|
30
|
+
- **主题切换** — 深色/浅色主题,自动适配 DSH 环境变量
|
|
31
|
+
|
|
32
|
+
## 安装
|
|
33
|
+
|
|
34
|
+
### 前置条件
|
|
35
|
+
|
|
36
|
+
- Node.js >= 22.19 或 >= 24
|
|
37
|
+
- pnpm >= 9
|
|
38
|
+
- DSH Web 环境(`dsh web`)
|
|
39
|
+
|
|
40
|
+
### 通过 DSH 插件管理安装(推荐)
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
# 安装插件(两种方式均可)
|
|
44
|
+
dsh plugin --profile web add github:xuanyuanchumo/dsh-codegraph-visualizer
|
|
45
|
+
dsh plugin --profile web add xuanyuanchumo/dsh-codegraph-visualizer
|
|
46
|
+
|
|
47
|
+
# 卸载插件
|
|
48
|
+
dsh plugin --profile web remove dsh-codegraph-visualizer
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
安装完成后启动 DSH Web 即可在侧边栏看到 "Code Graph" 标签页:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
dsh web
|
|
55
|
+
# → http://localhost:3080,点击侧边栏 "Code Graph" 标签页
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 从源码构建(开发者)
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
git clone https://github.com/xuanyuanchumo/dsh-codegraph-visualizer.git
|
|
62
|
+
cd dsh-codegraph-visualizer
|
|
63
|
+
pnpm install
|
|
64
|
+
pnpm run build
|
|
65
|
+
|
|
66
|
+
# 将构建产物安装到 DSH
|
|
67
|
+
dsh plugin --profile web add /path/to/dsh-codegraph-visualizer
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## 快速开始
|
|
71
|
+
|
|
72
|
+
### 开发模式
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
# 启动自包含的 dev server(模拟 DSH Web Shell + 模拟数据)
|
|
76
|
+
pnpm run dev
|
|
77
|
+
# → http://localhost:3080
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### 运行测试
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
pnpm run test # 单元 + 组件(5,900+ 用例,以实跑为准)
|
|
84
|
+
pnpm run test:e2e # E2E(需先启动 dev server)
|
|
85
|
+
pnpm run typecheck # 三面类型检查(host / client / test)
|
|
86
|
+
pnpm run lint # oxlint
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## 架构
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
93
|
+
│ DSH Web UI Shell │
|
|
94
|
+
│ ┌───────────────────────────────────────────────────────┐ │
|
|
95
|
+
│ │ CodeGraph Visualizer Plugin │ │
|
|
96
|
+
│ │ │ │
|
|
97
|
+
│ │ ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ │ │
|
|
98
|
+
│ │ │ Host Layer │ │ Data Layer │ │ Client Layer│ │ │
|
|
99
|
+
│ │ │ │ │ │ │ │ │ │
|
|
100
|
+
│ │ │ • routes │ │ • CodeGraph │ │ • GraphPanel│ │ │
|
|
101
|
+
│ │ │ • watcher │ │ Adapter │ │ • Toolbar │ │ │
|
|
102
|
+
│ │ │ • config │ │ • LensAdapter│ │ • Cytoscape │ │ │
|
|
103
|
+
│ │ │ • security │ │ • GraphData │ │ Renderer │ │ │
|
|
104
|
+
│ │ │ • prereqs │ │ Merger │ │ • Store │ │ │
|
|
105
|
+
│ │ │ │ │ │ │ • i18n │ │ │
|
|
106
|
+
│ │ └─────────────┘ └──────────────┘ └─────────────┘ │ │
|
|
107
|
+
│ └───────────────────────────────────────────────────────┘ │
|
|
108
|
+
└─────────────────────────────────────────────────────────────┘
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### 目录结构
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
src/
|
|
115
|
+
├── index.ts # Host 端插件入口(re-export 聚合)
|
|
116
|
+
├── tools.ts # 11 个工具:graph_status/data/symbol/impact/path_find/path_enumerate/cycles/query/health/rules_check/focus
|
|
117
|
+
├── types/ # Branded 类型、GraphData、事件声明合并
|
|
118
|
+
├── adapters/ # 数据源适配器
|
|
119
|
+
│ ├── CodeGraphAdapter.ts # dsh-codegraph 数据源
|
|
120
|
+
│ ├── LensAdapter.ts # dsh-tool-lens 数据源
|
|
121
|
+
│ ├── DependencyAdapter.ts # 依赖图谱数据源
|
|
122
|
+
│ ├── TreeSitterAdapter.ts # TreeSitter AST 解析适配器
|
|
123
|
+
│ └── IAdapter.ts # 适配器接口定义
|
|
124
|
+
├── merger/
|
|
125
|
+
│ ├── GraphDataMerger.ts # 多数据源融合器(去重 + 合并)
|
|
126
|
+
│ └── DiffEngine.ts # 图谱差异引擎
|
|
127
|
+
├── graphUtils.ts # 图谱工具函数
|
|
128
|
+
├── host/ # Host 端模块
|
|
129
|
+
│ ├── config.ts # 配置定义与校验
|
|
130
|
+
│ ├── routes.ts # HTTP 路由注册(19 条)
|
|
131
|
+
│ ├── routes/ # 六个域分区路由文件
|
|
132
|
+
│ ├── compat/ # 多代适配层(ApiCompatLayer/FeatureFlags/能力探针/版本探测/快照防缩水)
|
|
133
|
+
│ ├── watcher.ts # 文件监听与事件监听
|
|
134
|
+
│ ├── incrementalUpdate.ts # 文件级增量 diff 更新层
|
|
135
|
+
│ ├── security.ts # 路径安全校验
|
|
136
|
+
│ ├── prerequisites.ts # 前置条件检测
|
|
137
|
+
│ ├── McpServer.ts # MCP 协议服务器
|
|
138
|
+
│ ├── HttpHelpers.ts # HTTP 辅助函数
|
|
139
|
+
│ ├── RateLimiter.ts # 速率限制器
|
|
140
|
+
│ └── cli.ts # CLI 工具
|
|
141
|
+
├── client/ # Client 端模块(浏览器渲染)
|
|
142
|
+
│ ├── index.ts # Client 端插件入口
|
|
143
|
+
│ ├── GraphPanel.tsx # 主面板 UI 组件
|
|
144
|
+
│ ├── api/ # HTTP API helpers
|
|
145
|
+
│ ├── components/ # UI 组件(Toolbar, SearchBar, ImportPanel, ...)
|
|
146
|
+
│ ├── renderer/ # 渲染引擎
|
|
147
|
+
│ │ ├── CytoscapeRenderer.ts # Cytoscape.js 渲染器
|
|
148
|
+
│ │ ├── IRenderer.ts # 渲染器接口
|
|
149
|
+
│ │ ├── LayoutController.ts # 布局控制器
|
|
150
|
+
│ │ ├── VirtualViewportController.ts # 虚拟视口控制器
|
|
151
|
+
│ │ ├── OverlapRemover.ts # 碰撞检测与重叠消除
|
|
152
|
+
│ │ ├── QuadTree.ts # 四叉树空间索引
|
|
153
|
+
│ │ ├── AdjacencyCache.ts # 邻接缓存
|
|
154
|
+
│ │ └── styles/ # 主题样式
|
|
155
|
+
│ ├── store/ # 状态管理
|
|
156
|
+
│ │ ├── graphStore.ts # Zustand 全局状态
|
|
157
|
+
│ │ └── cluster/ # 聚类策略模块
|
|
158
|
+
│ │ ├── types.ts # ClusterLevel/ClusterNode/ClusterEdge
|
|
159
|
+
│ │ ├── index.ts # 策略注册表
|
|
160
|
+
│ │ ├── progressiveCluster.ts # 渐进式聚类
|
|
161
|
+
│ │ ├── incrementalCluster.ts # 增量聚类
|
|
162
|
+
│ │ ├── louvainDetection.ts # Louvain 社区检测
|
|
163
|
+
│ │ ├── communityDetection.ts # 社区检测辅助
|
|
164
|
+
│ │ ├── ProgressiveClusterStrategy.ts # 渐进式策略
|
|
165
|
+
│ │ └── ClusterStrategy.ts # 策略接口
|
|
166
|
+
│ ├── diagram/ # 微视图图表组装器
|
|
167
|
+
│ │ ├── CFGAssembler.ts # 控制流图汇编器
|
|
168
|
+
│ │ ├── FlowchartAssembler.ts # 流程图汇编器
|
|
169
|
+
│ │ ├── SequenceAssembler.ts # 时序图汇编器
|
|
170
|
+
│ │ └── HierarchicalAssembler.ts # 层次图汇编器
|
|
171
|
+
│ ├── cache/ # 图谱缓存
|
|
172
|
+
│ ├── history/ # 历史管理
|
|
173
|
+
│ ├── i18n/ # 国际化(中/英)
|
|
174
|
+
│ ├── hooks/ # React Hooks
|
|
175
|
+
│ └── worker/ # Web Worker(布局计算)
|
|
176
|
+
├── generated/ # 自动生成的代码(版本号等)
|
|
177
|
+
├── xuanji/ # 璇玑图算法库(零宿主依赖,可提取为独立包)
|
|
178
|
+
│ ├── ops/ # Booth 最小旋转 / 滚动哈希 / 环存在性 / 不变量 I1-I5
|
|
179
|
+
│ ├── core/ # 图空间 / 路径规则与组合代数 / 路径条目 / 长度 NFA
|
|
180
|
+
│ ├── index/ # 路径索引 / 增量引擎 / 局部重组
|
|
181
|
+
│ ├── query/ # 枚举 / 查询回退 / Top-K
|
|
182
|
+
│ └── registry/ # 规则注册与版本热替换
|
|
183
|
+
└── shared/ # Host/Client 共享模块
|
|
184
|
+
├── Logger.ts # 日志工具
|
|
185
|
+
├── constants.ts # 常量定义
|
|
186
|
+
├── viewModeUtils.ts # 视图模式工具
|
|
187
|
+
├── layoutUtils.ts # 布局间距计算
|
|
188
|
+
├── pathUtils.ts # 路径工具
|
|
189
|
+
├── astUtils.ts # AST 工具
|
|
190
|
+
├── CFGTypes.ts # CFG 类型定义
|
|
191
|
+
└── analysis/ # 分析算法
|
|
192
|
+
├── AdjacencyList.ts # 邻接表
|
|
193
|
+
├── GraphBFS.ts # BFS 遍历
|
|
194
|
+
├── XuanjiAdapter.ts # 璇玑图库的宿主适配层(GraphData ⇄ GraphSpace)
|
|
195
|
+
├── batchReach.ts # SCC + bitset 批量可达计数
|
|
196
|
+
└── modulePath.ts # 模块路径分析
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 其它顶层目录
|
|
200
|
+
|
|
201
|
+
| 路径 | 作用 |
|
|
202
|
+
|---|---|
|
|
203
|
+
| `docs/agents/` | **权威开发文档族**:01 插件开发规范 / 02 宿主 API / 03 客户端 API / 04 架构设计 / 05 官方规范检索证据 / 06 dsh-anic 规范 / **07 界面与功能域规划** / **08 质量属性与评审标准** / **09 破坏性变更与兼容策略** |
|
|
204
|
+
| `docs/research/` | 研究报告(多代 API 差异、璇玑图、Graphify、本轮规范与破坏性变更) |
|
|
205
|
+
| `site/plugin-market/` | 本地插件市场索引(`index.json` + `icons/`),由 `scripts/plugin-market-index.mjs` 生成 |
|
|
206
|
+
| `dsh-anic/` | 仓库内的**独立兄弟工程**(ANIC 工作流可视化),与本插件源码零依赖 |
|
|
207
|
+
| `.dsh/skills/` | 仓库内技能库(`ai-native-iteration-cycle` 等) |
|
|
208
|
+
| `.cycles/` | 迭代循环工件(评估报告、门禁台账、子规划、测试报告) |
|
|
209
|
+
|
|
210
|
+
### 聚类策略
|
|
211
|
+
|
|
212
|
+
采用 **渐进式聚类 + 增量聚类 + Louvain 社区检测** 三层聚类体系:
|
|
213
|
+
|
|
214
|
+
| 模块 | 策略 | 行为 |
|
|
215
|
+
|------|------|------|
|
|
216
|
+
| `progressiveCluster` | 渐进式聚类 | 按聚类深度逐步展开,目录 → 文件 → 函数层级递进 |
|
|
217
|
+
| `incrementalCluster` | 增量聚类 | 新增节点增量聚类,保留已有聚类结构不变 |
|
|
218
|
+
| `louvainDetection` | Louvain 社区检测 | 基于模块度的社区检测算法,自动发现代码社区结构 |
|
|
219
|
+
| `communityDetection` | 社区检测辅助 | 高连接度节点选择、社区质量评估 |
|
|
220
|
+
|
|
221
|
+
**渐进式层级展开**:在渐进式聚类模式下,展开一个聚类节点会显示下一层级的聚类节点。用户可以逐层展开直到看到原始函数/类/变量节点。增量聚类确保新增节点被合理分配到已有聚类中,不会破坏现有聚类结构。
|
|
222
|
+
|
|
223
|
+
## DSH 插件规范合规
|
|
224
|
+
|
|
225
|
+
本项目遵循 DSH 插件开发规范九条红线:
|
|
226
|
+
|
|
227
|
+
- [x] 插件入口 `src/index.ts` 使用 Cordis 4 原生模式(`export const name` + `export const inject` + `export async function apply`)注册
|
|
228
|
+
- [x] `dsh.bundle.patch` 指定 Cordis 补丁文件
|
|
229
|
+
- [x] `dsh.client.platform` 为 `"web"`
|
|
230
|
+
- [x] `dsh.client.inject` 声明运行时注入依赖
|
|
231
|
+
- [x] `peerDependencies` 声明 Cordis / dsh-tools / dsh-llm / React
|
|
232
|
+
- [x] `exports` 字段正确导出 host(`.`)与 client(`./client`)入口,并导出 `./locale/*.json`
|
|
233
|
+
- [x] `files` 字段只包含运行时需要的产物:`dist`、`cordis.patch.yml`、`locale`、`assets`、`README.md`
|
|
234
|
+
- [x] `engines` 声明 Node/pnpm/DSH 版本要求;其中 `engines.dsh` 是宿主**真正读取**的兼容门
|
|
235
|
+
- [x] `packageManager` 字段指定 pnpm 版本
|
|
236
|
+
- [x] 不含无读取者的元数据(`dsh.displayName` / `category` / `permissions` 等一律不写,由 `tests/unit/manifest.test.ts` 守卫)
|
|
237
|
+
|
|
238
|
+
## 插件市场
|
|
239
|
+
|
|
240
|
+
本仓库同时维护一份**可用于自建插件市场的索引**,它不进 npm 包,而是作为静态资源发布。
|
|
241
|
+
|
|
242
|
+
### 市场怎么收录一个插件
|
|
243
|
+
|
|
244
|
+
- **npm 包只在声明了 `dsh.bundle` 时才会被索引收录**。本项目的声明在 `package.json` 的
|
|
245
|
+
`dsh.bundle.patch = "./cordis.patch.yml"`——没有这一条,`keywords` 写得再好也不会出现。
|
|
246
|
+
- **搜索命中面**:名称、作者、`keywords`,以及**所有语言**的标题/描述/分类/标签。
|
|
247
|
+
本项目的 18 个 `keywords`(`dsh`、`dsh-plugin`、`dsh-market`、`codegraph`、`call-graph`、
|
|
248
|
+
`impact-analysis`、`ast`、`tree-sitter` …)就是搜索入口。
|
|
249
|
+
- **多语言显示文案**来自 `locale/en.json` + `locale/zh.json`(`LocalizedText` 要求至少含 `en`),
|
|
250
|
+
而不是 `package.json.description`。
|
|
251
|
+
- **图标**:`assets/icon.svg`,索引里以相对路径 `icons/icon.svg` 引用——相对图标**相对索引 URL 解析**,
|
|
252
|
+
所以索引和 `icons/` 目录必须一起发布。
|
|
253
|
+
|
|
254
|
+
### 本地生成索引
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
node scripts/plugin-market-index.mjs # 生成 site/plugin-market/index.json + icons/
|
|
258
|
+
node scripts/plugin-market-index.mjs --offline # 不访问 npm registry(离线可复现)
|
|
259
|
+
node scripts/plugin-market-index.mjs --check # 只校验是否最新,过期退出码 1(CI 用)
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
索引格式为 `format: 1` 的 JSON,每个插件条目含 `name` / `title` / `description` / `icon` /
|
|
263
|
+
`author` / `homepage` / `repository` / `metadata`(分类、标签、排序键)/ `versions`
|
|
264
|
+
(`version` + `publishTimestamp` + `source` + 可选 `engines.dsh`)。
|
|
265
|
+
|
|
266
|
+
### 发布
|
|
267
|
+
|
|
268
|
+
把 `site/plugin-market/` 整个目录放到任意静态主机(GitHub Pages、对象存储均可)即可;
|
|
269
|
+
要求 UTF-8 JSON、2xx 直出且不经过重定向。DSH 侧在「插件 → 实验性插件 → 自定义插件市场」里
|
|
270
|
+
添加该 `index.json` 的 URL 后,就能在「发现」标签页搜索与安装。
|
|
271
|
+
|
|
272
|
+
> 格式的权威说明见本地知识库 `dsh-plugin-dev-kb` 的 `site/guide/plugin-market.md`。
|
|
273
|
+
|
|
274
|
+
## 质量门禁与兼容承诺
|
|
275
|
+
|
|
276
|
+
### 门禁(每条都能在本地一条命令复验)
|
|
277
|
+
|
|
278
|
+
| 门禁 | 阈值 / 口径 | 命令 |
|
|
279
|
+
|---|---|---|
|
|
280
|
+
| 类型 | 三面零错误(host / client / test) | `pnpm run typecheck` |
|
|
281
|
+
| Lint | 0 warnings / 0 errors | `pnpm run lint` |
|
|
282
|
+
| 测试 | 全绿;用例数不得低于已提交基线 | `pnpm run test` |
|
|
283
|
+
| 覆盖率 | 语句/分支/函数/行 **四维均 ≥ 86%** | `pnpm run test:coverage` |
|
|
284
|
+
| 构建 | exit 0;client ≤ 3 MB、host ≤ 512 KB | `pnpm run build && pnpm run perf-gate` |
|
|
285
|
+
| 复杂度 | 单文件 ≤ 100(`band-detector` 预算,超带即 `OVER_BUDGET`) | `node .dsh/skills/ai-native-iteration-cycle/scripts/band-detector.mjs . --threshold 0.15` |
|
|
286
|
+
| 依赖安全 | `critical = 0`、`high = 0`(**必须**显式 registry,镜像无 bulk audit 端点) | `pnpm audit --json --registry=https://registry.npmjs.org` |
|
|
287
|
+
| 卫生 | 消费面/死代码检查 | `pnpm run hygiene` |
|
|
288
|
+
|
|
289
|
+
逐条判据(场景 → 阈值 → 用例 → 当前状态)在 [`docs/agents/08-质量属性与评审标准.md`](docs/agents/08-质量属性与评审标准.md);
|
|
290
|
+
哪里**只有人工评审能发现**,也在那份文档里显式列出(不假装有保护)。
|
|
291
|
+
|
|
292
|
+
### 兼容承诺
|
|
293
|
+
|
|
294
|
+
| 项 | 值 | 是不是真承诺 |
|
|
295
|
+
|---|---|---|
|
|
296
|
+
| `engines.dsh` | `">=0.2.0-rc.2 <0.4.0-0"` | **是。宿主 `dsh-app-boot` 的 `unmetRequirements()` 读它,且单独决定——声明了它,peer 范围就不再被检查** |
|
|
297
|
+
| `peerDependencies`(`@deepseek-ai/dsh-*`) | `"^0.2.0-rc.2 \|\| ^0.3.0-rc.2"` | 仅在 `engines.dsh` 缺席时才生效(对本项目是「备份声明」) |
|
|
298
|
+
| `dsh.manifestVersion` | `1` | **不是**。零读取者(宿主 asar 内只有 6 处命中,全是 README 正文) |
|
|
299
|
+
| 已验证运行宿主 | `0.2.1-rc.3`(Windows 桌面端) | 这是「跑通过」的事实,**不是**下限;下限是 `0.2.0-rc.2` |
|
|
300
|
+
| gen3(`0.3.0-rc.2`) | 在声明窗口内 | **未真机验证**,只保证不被安装门拒绝 |
|
|
301
|
+
|
|
302
|
+
为什么「peer 范围才是真承诺」这个流行说法在本项目**不成立**、以及 `0.4.0-rc.1` 曾被放行的完整证据链,
|
|
303
|
+
见 [`docs/agents/09-破坏性变更与兼容策略.md`](docs/agents/09-破坏性变更与兼容策略.md) §1 与 §3.2。
|
|
304
|
+
|
|
305
|
+
## 开发
|
|
306
|
+
|
|
307
|
+
### 技术栈
|
|
308
|
+
|
|
309
|
+
| 层 | 技术 |
|
|
310
|
+
|----|------|
|
|
311
|
+
| 语言 | TypeScript 5.7+ |
|
|
312
|
+
| 框架 | React 19 + Cordis 4 |
|
|
313
|
+
| 渲染 | Cytoscape.js 3.26 + cytoscape-dagre |
|
|
314
|
+
| 状态 | Zustand 5 |
|
|
315
|
+
| 构建 | tsdown (rolldown) |
|
|
316
|
+
| 测试 | Vitest 3 + Playwright 1.62 |
|
|
317
|
+
| Lint | oxlint |
|
|
318
|
+
| 包管理 | pnpm 9 |
|
|
319
|
+
|
|
320
|
+
### 常用命令
|
|
321
|
+
|
|
322
|
+
```bash
|
|
323
|
+
pnpm run build # 完整构建(host + client)
|
|
324
|
+
pnpm run build:client # 仅构建 client bundle
|
|
325
|
+
pnpm run dev # 启动自包含 dev server(模拟 Web Shell + 桩数据)
|
|
326
|
+
pnpm run test # 单元 + 组件测试
|
|
327
|
+
pnpm run test:coverage # 覆盖率(四维 86% 阈值)
|
|
328
|
+
pnpm run test:e2e # E2E 测试(需先启动 dev server)
|
|
329
|
+
pnpm run typecheck # 三面类型检查(host / client / test)
|
|
330
|
+
pnpm run lint # oxlint
|
|
331
|
+
pnpm run perf-gate # 体积 + 用例数门禁
|
|
332
|
+
pnpm run hygiene # 消费面 / 死代码检查
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
### 真机验证
|
|
336
|
+
|
|
337
|
+
真机(Electron 桌面宿主 / Web 宿主)的启动、认证 URL 获取与进程收敛统一走
|
|
338
|
+
`node scripts/start-dsh-test.mjs`,**不要自己写第二套启动脚本**——历史事故都来自两套脚本漂移。
|
|
339
|
+
该脚本在 cycle-110 修了三处启动缺陷:Electron 垫片解析、认证 URL 等待窗口、桌面宿主进程名白名单。
|
|
340
|
+
步骤与断言点见 `docs/用户旅程.md` 的 J0 段,以及 `.cycles/cycles/cycle-110/subplans/` 下的旅程清单。
|
|
341
|
+
|
|
342
|
+
> 改过 HOST 路由后必须**重启宿主进程**(只重建不够:运行中的进程持有旧 bundle)。
|
|
343
|
+
|
|
344
|
+
### CI/CD
|
|
345
|
+
|
|
346
|
+
项目使用两个独立的 GitHub Actions 工作流:
|
|
347
|
+
|
|
348
|
+
| 工作流 | 文件 | 触发条件 | 职责 |
|
|
349
|
+
|--------|------|----------|------|
|
|
350
|
+
| CI | `ci.yml` | push/PR to master | lint + typecheck + test + build |
|
|
351
|
+
| Release | `release.yml` | push tag `v*` | build + GitHub Release + npm publish |
|
|
352
|
+
|
|
353
|
+
### 测试覆盖
|
|
354
|
+
|
|
355
|
+
分层与命令(准确数字以实跑为准,`pnpm run test` 会打印;用例数下限由 `pnpm run perf-gate` 棘轮守住):
|
|
356
|
+
|
|
357
|
+
| 层 | 位置 | 命令 |
|
|
358
|
+
|---|---|---|
|
|
359
|
+
| L1 单元 + L2 组件 | `tests/unit/**`、`tests/component/**`(jsdom) | `pnpm run test` |
|
|
360
|
+
| L3 契约守卫(源码形态扫描) | `tests/unit/*Contract.test.ts` | 同上 |
|
|
361
|
+
| L4 E2E | `tests/e2e/**`(23 个 spec:用户旅程、混沌、按需加载、条件请求、键盘、i18n、视图分层…) | `pnpm run test:e2e` |
|
|
362
|
+
| L4 视觉 | `tests/e2e/visual-screenshots.spec.ts`(逐图预算 + 硬上限) | `pnpm run test:visual` |
|
|
363
|
+
| L4 性能 | `tests/e2e/performance.spec.ts` | `pnpm run test:performance` |
|
|
364
|
+
|
|
365
|
+
覆盖率、体积与用例数的真实基线见 `.cycles/cycles/*/test-reports/test-report.md` 与 `scripts/perf-baseline.json`。
|
|
366
|
+
|
|
367
|
+
## 更新日志
|
|
368
|
+
|
|
369
|
+
### 0.3.0(2026-11-07)
|
|
370
|
+
|
|
371
|
+
- **声明式配置**:导出 Schemastery `Config` schema(Standard Schema 接口)——宿主设置 UI 可编辑插件配置,cordis 加载期校验 + 默认值填充;与 `resolveConfig` 双防线同形状(契约测试钉死单一真源)。
|
|
372
|
+
- **诊断四态**:`/status` 新增 `diagnosis` 字段(`ready`/`degraded`/`disabled` + 稳定问题码),管理面板按问题码渲染修复指引(对齐 dsh-ops diagnose 模式)。
|
|
373
|
+
- **限流可观测**:`/manage/metrics` 新增 `rateLimiter` 白盒快照(活跃桶/配额/窗口剩余),限流从黑盒行为变成数据面。
|
|
374
|
+
- **交互式图例**:点击图例行切换节点/边类型可见性,与筛选面板共享同一状态源;最后一个可见类型防呆不可关闭。
|
|
375
|
+
- **调用链流动动画**:高亮调用链的边以虚线流动呈现(cytoscape 原生 line-dash-offset 补间),动画句柄生命周期与高亮类严格对齐(无 RAF 泄漏)。
|
|
376
|
+
- 测试基线 7041 → **7055**(+14:configSchemaContract 5 / diagnosisContract 6 / rateLimiterSnapshot 4 / Legend 组件 6 / 流动动画 4 − 既有 routes 断言更新 9)。
|
|
377
|
+
|
|
378
|
+
### 0.2.0
|
|
379
|
+
|
|
380
|
+
- 原生 SQLite 索引通道(上游缺席时毫秒级分页读取)、Π 时序/所有权视图、图谱管理面板(图指标 14 项 + 索引覆盖 + 索引删除)、介数采样上界(8393 节点 65.4s → 2.7s)、命令窗口显示修复(windowsHide 纪律)。
|
|
381
|
+
|
|
382
|
+
## 许可证
|
|
383
|
+
|
|
384
|
+
[MIT](LICENSE)
|
|
385
|
+
|
|
386
|
+
## 致谢
|
|
387
|
+
|
|
388
|
+
- [DeepSeek Harness (DSH)](https://github.com/deepseek-ai/deepseek-harness) — Agent 运行时框架
|
|
389
|
+
- [Cytoscape.js](https://cytoscape.org/) — 图可视化引擎
|
|
390
|
+
- [dsh-codegraph](https://github.com/jiangzhenguo/dsh-codegraph) — CodeGraph CLI 数据源
|
|
391
|
+
- [dsh-tool-lens](https://github.com/trench-xinxin/dsh-tool-lens) — AST 代码图谱数据源
|
|
Binary file
|