@kkeve/suite 0.0.1 → 0.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.
Files changed (152) hide show
  1. package/README.md +53 -0
  2. package/dist/bin/keve.d.ts +13 -0
  3. package/dist/bin/keve.js +164 -0
  4. package/dist/commands/auth-update.d.ts +16 -0
  5. package/dist/commands/auth-update.js +88 -0
  6. package/dist/commands/clean.d.ts +10 -0
  7. package/dist/commands/clean.js +78 -0
  8. package/dist/commands/config.d.ts +17 -0
  9. package/dist/commands/config.js +99 -0
  10. package/dist/commands/init.d.ts +15 -0
  11. package/dist/commands/init.js +292 -0
  12. package/dist/commands/report.d.ts +12 -0
  13. package/dist/commands/report.js +159 -0
  14. package/dist/commands/run.d.ts +29 -0
  15. package/dist/commands/run.js +417 -0
  16. package/dist/commands/test.d.ts +12 -0
  17. package/dist/commands/test.js +102 -0
  18. package/dist/commands/vitest.d.ts +14 -0
  19. package/dist/commands/vitest.js +166 -0
  20. package/dist/config.d.ts +109 -0
  21. package/dist/config.js +291 -0
  22. package/dist/core/action-log-writer.d.ts +47 -0
  23. package/dist/{tools/write-file.js → core/action-log-writer.js} +42 -26
  24. package/dist/core/auth.d.ts +17 -0
  25. package/dist/core/auth.js +224 -0
  26. package/dist/core/cdp-resolver.d.ts +5 -0
  27. package/dist/core/cdp-resolver.js +93 -0
  28. package/dist/core/generateReport/report.d.ts +19 -0
  29. package/dist/core/generateReport/report.js +91 -0
  30. package/dist/core/generateReport/reportData.d.ts +215 -0
  31. package/dist/core/generateReport/reportData.js +735 -0
  32. package/dist/core/global-setup.d.ts +6 -0
  33. package/dist/core/global-setup.js +113 -0
  34. package/dist/core/keve-aspect.d.ts +54 -0
  35. package/dist/core/keve-aspect.js +52 -0
  36. package/dist/core/keve-decorators.d.ts +51 -0
  37. package/dist/core/keve-decorators.js +95 -0
  38. package/dist/core/keve-registry.d.ts +38 -0
  39. package/dist/core/keve-registry.js +25 -0
  40. package/dist/core/keve-report.d.ts +27 -0
  41. package/dist/core/keve-report.js +357 -0
  42. package/dist/core/keve-test.d.ts +36 -0
  43. package/dist/core/keve-test.js +364 -0
  44. package/dist/core/learned-actions.d.ts +24 -0
  45. package/dist/core/learned-actions.js +65 -0
  46. package/dist/core/pw-config.d.ts +19 -0
  47. package/dist/core/pw-config.js +180 -0
  48. package/dist/index.d.ts +8 -23
  49. package/dist/index.js +36 -43
  50. package/dist/page-agent/agent.d.ts +129 -0
  51. package/dist/page-agent/agent.js +585 -0
  52. package/dist/page-agent/hooks.d.ts +13 -0
  53. package/dist/page-agent/hooks.js +218 -0
  54. package/dist/page-agent/tools.d.ts +29 -0
  55. package/dist/page-agent/tools.js +297 -0
  56. package/doc/README.md +124 -0
  57. package/doc/agents/keve-dev-test-agent.md +140 -0
  58. package/doc/agents/keve-test-agent.md +178 -0
  59. package/doc/asserts//346/265/213/350/257/225/345/220/204/351/230/266/346/256/265/350/257/264/346/230/216.png +0 -0
  60. package/doc/keve-agent-demo.html +370 -0
  61. package/doc/skills/keve-bddcase-gen/SKILL.md +332 -0
  62. package/doc/skills/keve-bddcase-gen/references/test-case-rules.md +91 -0
  63. package/doc/skills/keve-bddcase-gen/references/test-cases-example.md +103 -0
  64. package/doc/skills/keve-component-gen/SKILL.md +255 -0
  65. package/doc/skills/keve-component-gen/references/component-mock-strategy.md +74 -0
  66. package/doc/skills/keve-component-gen/references/component-model-template.md +98 -0
  67. package/doc/skills/keve-component-gen/references/component-test-template.md +100 -0
  68. package/doc/skills/keve-component-gen/references/vue-test-utils-guide.md +91 -0
  69. package/doc/skills/keve-e2e-gen/SKILL.md +179 -0
  70. package/doc/skills/keve-e2e-gen/references/code-analysis-guide.md +208 -0
  71. package/doc/skills/keve-e2e-gen/references/decisions.md +36 -0
  72. package/doc/skills/keve-e2e-gen/references/pom-generation-guide.md +140 -0
  73. package/doc/skills/keve-e2e-gen/references/script-generation-guide.md +236 -0
  74. package/doc/skills/keve-e2e-gen/references/test-auditor-guide.md +189 -0
  75. package/doc/skills/keve-e2e-gen/scripts/extract-components.sh +85 -0
  76. package/doc/skills/keve-e2e-gen/scripts/inject-testids.sh +95 -0
  77. package/doc/skills/keve-static-analysis/SKILL.md +362 -0
  78. package/doc/skills/keve-static-analysis/references/codegraph-analysis-guide.md +108 -0
  79. package/doc/skills/keve-static-analysis/references/git-impact-analysis.md +81 -0
  80. package/doc/skills/keve-static-analysis/references/lint-fix-guide.md +69 -0
  81. package/doc/skills/keve-static-analysis/references/runtime-risk-patterns.md +92 -0
  82. package/doc/skills/keve-static-analysis/references/security-scan-guide.md +32 -0
  83. package/doc/skills/keve-static-analysis/references/ts-error-patterns.md +98 -0
  84. package/doc/skills/keve-static-analysis/references/vue-security-guide.md +72 -0
  85. package/doc/skills/keve-test-eval/SKILL.md +78 -0
  86. package/doc/skills/keve-test-eval/references/common-fix-guide.md +166 -0
  87. package/doc/skills/keve-test-eval/references/confidence-data-guide.md +78 -0
  88. package/doc/skills/keve-test-eval/references/fix-loop-guide.md +67 -0
  89. package/doc/skills/keve-unit-gen/SKILL.md +203 -0
  90. package/doc/skills/keve-unit-gen/references/boundary-conditions.md +78 -0
  91. package/doc/skills/keve-unit-gen/references/unit-mock-strategy.md +71 -0
  92. package/doc/skills/keve-unit-gen/references/unit-test-template.md +105 -0
  93. package/package.json +47 -25
  94. package/dist/agent/factory.d.ts +0 -25
  95. package/dist/agent/factory.js +0 -99
  96. package/dist/agent/index.d.ts +0 -3
  97. package/dist/agent/index.js +0 -7
  98. package/dist/agent/loader.d.ts +0 -22
  99. package/dist/agent/loader.js +0 -117
  100. package/dist/agent/types.d.ts +0 -9
  101. package/dist/agent/types.js +0 -2
  102. package/dist/agent-loop/complete-task.d.ts +0 -28
  103. package/dist/agent-loop/complete-task.js +0 -70
  104. package/dist/agent-loop/index.d.ts +0 -16
  105. package/dist/agent-loop/index.js +0 -26
  106. package/dist/agent-loop/loop.d.ts +0 -42
  107. package/dist/agent-loop/loop.js +0 -282
  108. package/dist/agent-loop/runtime.d.ts +0 -40
  109. package/dist/agent-loop/runtime.js +0 -163
  110. package/dist/agent-loop/types.d.ts +0 -161
  111. package/dist/agent-loop/types.js +0 -105
  112. package/dist/context/index.d.ts +0 -8
  113. package/dist/context/index.js +0 -29
  114. package/dist/context/tokenCalculation.d.ts +0 -55
  115. package/dist/context/tokenCalculation.js +0 -95
  116. package/dist/context/truncation.d.ts +0 -67
  117. package/dist/context/truncation.js +0 -142
  118. package/dist/context/types.d.ts +0 -7
  119. package/dist/context/types.js +0 -27
  120. package/dist/llm/OpenAIClient.d.ts +0 -31
  121. package/dist/llm/OpenAIClient.js +0 -455
  122. package/dist/llm/constants.d.ts +0 -2
  123. package/dist/llm/constants.js +0 -6
  124. package/dist/llm/errors.d.ts +0 -25
  125. package/dist/llm/errors.js +0 -51
  126. package/dist/llm/index.d.ts +0 -49
  127. package/dist/llm/index.js +0 -158
  128. package/dist/llm/types.d.ts +0 -124
  129. package/dist/llm/types.js +0 -2
  130. package/dist/llm/utils.d.ts +0 -29
  131. package/dist/llm/utils.js +0 -284
  132. package/dist/skill/frontmatter-parser.d.ts +0 -50
  133. package/dist/skill/frontmatter-parser.js +0 -152
  134. package/dist/skill/index.d.ts +0 -12
  135. package/dist/skill/index.js +0 -17
  136. package/dist/skill/loader.d.ts +0 -96
  137. package/dist/skill/loader.js +0 -256
  138. package/dist/tools/ask-user.d.ts +0 -8
  139. package/dist/tools/ask-user.js +0 -47
  140. package/dist/tools/bash.d.ts +0 -47
  141. package/dist/tools/bash.js +0 -213
  142. package/dist/tools/edit-file.d.ts +0 -9
  143. package/dist/tools/edit-file.js +0 -76
  144. package/dist/tools/glob.d.ts +0 -8
  145. package/dist/tools/glob.js +0 -101
  146. package/dist/tools/grep.d.ts +0 -10
  147. package/dist/tools/grep.js +0 -76
  148. package/dist/tools/index.d.ts +0 -24
  149. package/dist/tools/index.js +0 -47
  150. package/dist/tools/read-files.d.ts +0 -8
  151. package/dist/tools/read-files.js +0 -81
  152. package/dist/tools/write-file.d.ts +0 -8
@@ -0,0 +1,362 @@
1
+ ---
2
+ name: keve-static-analysis
3
+ description: 全栈静态分析:tsc+eslint 编译检查 + Code-Graph 关系分析 + Git 变更影响分析 + 安全漏洞扫描。AI 按优先级自动修复类型/lint 错误,输出依赖风险、变更影响范围和安全评级报告。
4
+ allowed-tools: Bash(shell:*) Bash(npx:*) Bash(npm:*) Bash(node:*) Bash(git:*) Bash(pnpm:*) Bash(yarn:*) codegraph_search codegraph_explore codegraph_callers codegraph_callees codegraph_impact codegraph_files
5
+ ---
6
+
7
+ # keve-static-analysis
8
+
9
+ ## 定位
10
+
11
+ **本技能负责**:四阶段静态分析,作为测试流水线的**第一步**。
12
+
13
+ - Phase 1: tsc + eslint → 语法/类型/规范错误(P0 必修)
14
+ - Phase 2: Code-Graph → 依赖关系/架构违规/死代码(P1 建议修)
15
+ - Phase 3: Git 分析 → 变更影响范围/热点文件(P2 信息参考)
16
+ - Phase 4: 安全扫描 → 漏洞/密钥/运行时风险(P1~P0 按评级)
17
+
18
+ ***
19
+
20
+ ## 触发条件
21
+
22
+ | 触发方式 | 场景 | 说明 |
23
+ |----------|------|------|
24
+ | `use_skill("keve-static-analysis")` | 测试流水线第一步 | 由 keve-dev-test-agent 或 keve-test-agent 调度 |
25
+ | `/keve-static-analysis` 指令 | 用户主动要求静态检查 | 手动触发 |
26
+
27
+ ***
28
+
29
+ ## 输入
30
+
31
+ - 项目源码(`src/` 目录)
32
+ - `tsconfig.json`(TypeScript 配置)
33
+ - `.eslintrc.*` 或 `eslint.config.*`(ESLint 配置,可选)
34
+ - `.codegraph/` 索引(如不存在,需先 `codegraph init -i`)
35
+
36
+ ***
37
+
38
+ ## 流程
39
+
40
+ ### Phase 1: tsc + eslint(P0 必修)
41
+
42
+ #### Step 1: TypeScript 检查
43
+
44
+ ```bash
45
+ npx tsc --noEmit --pretty false 2>&1
46
+ ```
47
+
48
+ 解析输出,按文件分组:
49
+ - 格式:`src/path/file.ts(line,col): error TSXXXX: message`
50
+ - 提取:文件路径、行号、错误码、错误消息
51
+ - 分组:`Map<filePath, TSError[]>`
52
+
53
+ #### Step 2: ESLint 检查
54
+
55
+ ```bash
56
+ npx eslint src/ --format json 2>&1
57
+ ```
58
+
59
+ 解析 JSON 输出,按规则分组:
60
+ - 格式:`[{ filePath, messages: [{ ruleId, severity, message, line, column }] }]`
61
+ - severity: 1=warning, 2=error
62
+ - 分组:`Map<ruleId, LintMessage[]>`
63
+
64
+ #### Step 3: 按优先级修复
65
+
66
+ | 优先级 | 类型 | 修复策略 |
67
+ |--------|------|---------|
68
+ | P0 | TS 类型错误 | 修复类型标注、接口定义、导入路径 |
69
+ | P1 | ESLint error | 自动修复(`--fix`)或手动修复 |
70
+ | P2 | ESLint warning | 可选修复,不阻塞 |
71
+
72
+ **修复约束**:
73
+ - **禁止修改业务逻辑**,只修类型标注和代码风格
74
+ - **禁止添加 `@ts-ignore` / `@ts-nocheck`** 掩盖错误
75
+ - **禁止删除 ESLint 规则配置**来绕过检查
76
+
77
+ **每轮修复后重新验证**(最多 3 轮)。
78
+
79
+ ### Phase 2: Code-Graph 关系分析(P1 建议修)
80
+
81
+ > Code-Graph 内部基于 Tree-sitter 构建 AST→符号→图索引,
82
+ > 不需要单独引入 Tree-sitter。
83
+
84
+ #### Step 4: 循环依赖检测
85
+
86
+ ```
87
+ 1. codegraph_files() → 项目文件结构
88
+ 2. 对每个模块目录调用 codegraph_explore("import from module")
89
+ 3. 识别 A→B→C→A 环路
90
+ 4. 输出: ["src/utils/a.ts → src/store/b.ts → src/utils/a.ts"]
91
+ ```
92
+
93
+ #### Step 5: 幽灵依赖检测
94
+
95
+ ```
96
+ 1. 读取 package.json 的 dependencies + devDependencies
97
+ 2. 扫描源码中所有 import/from 语句
98
+ 3. 对比: import 了但 package.json 没有声明的包 = 幽灵依赖
99
+ 4. codegraph_callees("外部模块名") → 验证调用关系
100
+ 5. 输出: [{ package: "lodash", file: "src/utils/format.ts", declared: false }]
101
+ ```
102
+
103
+ #### Step 6: 死代码检测
104
+
105
+ ```
106
+ 1. codegraph_search("*") → 列出所有符号
107
+ 2. codegraph_callers("符号名") → 无调用者的非导出函数 = 死代码
108
+ 3. 排除: export 的函数(可能被外部使用)
109
+ 4. 输出: [{ symbol: "formatCurrency", file: "src/utils/format.ts", callers: 0 }]
110
+ ```
111
+
112
+ #### Step 7: 架构违规检测
113
+
114
+ ```
115
+ 1. codegraph_explore("import patterns") → 查看跨目录导入
116
+ 2. 检测违规模式:
117
+ - common/ import src/ → 反向依赖
118
+ - utils/ import components/ → 层级违规
119
+ - services/ import pages/ → 层级违规
120
+ 3. 输出: [{ from: "common/utils/a.ts", to: "src/components/B.vue", rule: "common 不应 import src" }]
121
+ ```
122
+
123
+ #### Step 8: 圈复杂度检测
124
+
125
+ ```
126
+ 1. codegraph_search("*") → 列出所有函数
127
+ 2. 对每个函数: codegraph_node("函数名", includeCode=true) → 获取函数体源码
128
+ 3. AI 计算决策点: if + else if + for + while + case + catch + && + || + 三元表达式
129
+ 4. 圈复杂度 = 1 + 决策点数
130
+ 5. 阈值: ≤10 正常, 11-20 ⚠️偏高, >20 🔴过高
131
+ 6. 输出: [{ symbol: "handleSubmit", file: "src/pages/Form.vue", cyclomatic: 22 }]
132
+ ```
133
+
134
+ **Phase 2 不自动修复**,只输出建议列表。
135
+
136
+ ### Phase 3: Git 变更分析(P2 信息参考)
137
+
138
+ #### Step 9: 当前变更范围
139
+
140
+ ```bash
141
+ git diff --name-only HEAD~1 → 本次提交修改了哪些文件
142
+ git diff --name-only --cached → 暂存区变更
143
+ ```
144
+
145
+ #### Step 10: 变更影响范围
146
+
147
+ ```
148
+ codegraph_impact("改动的函数名") → 计算受影响的调用者链
149
+ ```
150
+
151
+ #### Step 11: 热点文件分析
152
+
153
+ ```bash
154
+ git log --format="%H" --since="30 days ago" | xargs git diff-tree --no-commit-id --name-only -r | sort | uniq -c | sort -rn | head -20
155
+ ```
156
+
157
+ → 最近 30 天高频变更的文件 = 不稳定区域,需要更多测试覆盖
158
+
159
+ ### Phase 4: 安全扫描(P1~P0 按评级)
160
+
161
+ #### Step 12: 依赖漏洞扫描
162
+
163
+ ```bash
164
+ npm audit --json 2>&1
165
+ # 或
166
+ pnpm audit --json 2>&1
167
+ ```
168
+
169
+ #### Step 13: 代码安全规则扫描
170
+
171
+ ```bash
172
+ npx eslint src/ --plugin security --format json 2>&1
173
+ ```
174
+
175
+ 检测:eval / ReDoS / innerHTML / 动态正则 / 属性注入
176
+
177
+ #### Step 14: 硬编码密钥扫描
178
+
179
+ ```bash
180
+ npx gitleaks detect --no-git --source . --report-format json 2>&1
181
+ ```
182
+
183
+ #### Step 15: 运行时风险扫描
184
+
185
+ ```bash
186
+ npx eslint src/ --plugin promise --plugin sonarjs --plugin vue --format json 2>&1
187
+ ```
188
+
189
+ 检测:Promise 未 catch / setInterval 未清理 / addEventListener 未移除 / v-html XSS
190
+
191
+ **安全扫描不自动修复**(误报率高,输出报告由人工确认)。
192
+
193
+ ***
194
+
195
+ ## 产出
196
+
197
+ | 产出 | 路径 | 说明 |
198
+ |------|------|------|
199
+ | 修复后的源码 | 源文件 | Phase 1 直接修改,无独立产出 |
200
+ | 分析报告(YAML) | `.keve/analysis-report.yaml` | 四阶段完整结果,机器可读 |
201
+ | 分析报告(HTML) | `.keve/analysis-report.html` | 人可读,`keve analysis` 生成 |
202
+ | test-plan 更新 | `.keve/test-plan.yaml` | phase status + outputs 摘要 |
203
+
204
+ ### analysis-report.yaml 结构
205
+
206
+ ```yaml
207
+ # .keve/analysis-report.yaml
208
+ generated_at: 2026-06-16T20:07:00
209
+
210
+ phase1:
211
+ status: passed
212
+ type_errors_before: 5
213
+ type_errors_after: 0
214
+ lint_errors_before: 3
215
+ lint_errors_after: 0
216
+ lint_warnings_before: 8
217
+ lint_warnings_after: 5
218
+ fix_rounds: 2
219
+
220
+ phase2:
221
+ status: completed
222
+ circular_deps:
223
+ - path: "src/utils/a.ts → src/store/b.ts → src/utils/a.ts"
224
+ severity: warning
225
+ suggestion: "提取共享模块到 src/shared/"
226
+ ghost_deps:
227
+ - package: "lodash"
228
+ file: "src/utils/format.ts"
229
+ declared_in_package_json: false
230
+ detail: "import 了但 package.json 未声明"
231
+ dead_code:
232
+ - symbol: "formatCurrency"
233
+ file: "src/utils/format.ts"
234
+ callers: 0
235
+ is_exported: false
236
+ suggestion: "删除或添加 export"
237
+ arch_violations:
238
+ - from: "src/utils/request.ts"
239
+ to: "src/components/Modal.vue"
240
+ rule: "utils 不应 import components"
241
+ count: 1
242
+ cyclomatic_complexity:
243
+ - symbol: "handleSubmit"
244
+ file: "src/pages/FormPage.vue"
245
+ cyclomatic: 22
246
+ decision_points: 21
247
+ threshold: 10
248
+ severity: critical
249
+ suggestion: "拆分为多个子函数"
250
+ - symbol: "processData"
251
+ file: "src/utils/data.ts"
252
+ cyclomatic: 15
253
+ decision_points: 14
254
+ threshold: 10
255
+ severity: warning
256
+ suggestion: "考虑拆分"
257
+
258
+ phase3:
259
+ status: completed
260
+ changed_files:
261
+ - "src/utils/format.ts"
262
+ - "src/components/SearchFilter.vue"
263
+ impact_scope:
264
+ - file: "src/utils/format.ts"
265
+ callers_count: 15
266
+ risk: high
267
+ hotspots:
268
+ - file: "src/api/client.ts"
269
+ changes_last_30d: 8
270
+ risk: high
271
+
272
+ phase4:
273
+ status: completed
274
+ dependency_audit:
275
+ critical:
276
+ - package: "lodash@4.17.15"
277
+ cve: "CVE-2021-23337"
278
+ fix_version: "4.17.21"
279
+ high: []
280
+ medium: []
281
+ low: []
282
+ code_security:
283
+ - type: xss
284
+ file: "src/components/UserComment.vue"
285
+ line: 42
286
+ detail: "v-html 绑定用户输入"
287
+ severity: high
288
+ - type: hardcoded_secret
289
+ file: "src/config.ts"
290
+ line: 15
291
+ detail: "API_KEY = 'sk-xxx'"
292
+ severity: critical
293
+ runtime_risks:
294
+ - type: unhandled_promise
295
+ file: "src/api/client.ts"
296
+ line: 30
297
+ detail: "fetch().then() 无 .catch()"
298
+ - type: uncleared_timer
299
+ file: "src/components/Poller.vue"
300
+ line: 20
301
+ detail: "setInterval 未在 onUnmounted 清理"
302
+ recommendation: "修复 1 个 Critical(硬编码密钥)+ 1 个 High(v-html XSS)"
303
+
304
+ summary:
305
+ pass: true
306
+ blockers: [] # Critical 级别会进这里
307
+ warnings: 5
308
+ info: 3
309
+ ```
310
+
311
+ ***
312
+
313
+ ## 通过条件
314
+
315
+ - ✅ Phase 1: 0 个 type error + 0 个 lint error(必修)
316
+ - ⚠️ Phase 2: 循环依赖/死代码/架构违规 → 建议修,不阻塞
317
+ - ℹ️ Phase 3: 信息参考,不阻塞
318
+ - 🔴 Phase 4: 0 个 Critical 安全漏洞 → 否则阻塞
319
+ - 🟠 Phase 4: High 级别漏洞 → 建议修,不阻塞
320
+
321
+ ***
322
+
323
+ ## 禁止事项
324
+
325
+ - **禁止添加 `@ts-ignore` / `@ts-nocheck`**
326
+ - **禁止修改 ESLint 规则配置来绕过检查**
327
+ - **禁止修改业务逻辑**(只修类型和风格)
328
+ - **禁止删除文件来消除错误**
329
+ - **禁止引入新依赖来解决类型问题**(除非必要且用户确认)
330
+ - **Phase 2/3 不自动修改代码**(只输出分析结果)
331
+ - **Phase 4 安全扫描不自动修复**(误报率高,需人工确认)
332
+
333
+ ***
334
+
335
+ ## Key Decisions
336
+
337
+ | ID | 决策 | 说明 |
338
+ |----|------|------|
339
+ | SA01 | 静态分析是流水线第一步 | 类型错误不修,后续测试会被干扰 |
340
+ | SA02 | 不修改业务逻辑 | 静态分析只修类型标注和代码风格 |
341
+ | SA03 | 最多 3 轮修复 | 防止无限修复循环 |
342
+ | SA04 | lint warning 不阻塞 | 不强制清零 warning,避免过度修改 |
343
+ | SA05 | 四阶段架构 | P0: tsc+eslint, P1: Code-Graph, P2: Git 分析, P1~P0: 安全扫描 |
344
+ | SA06 | Code-Graph 替代单独 Tree-sitter | Code-Graph 内部基于 Tree-sitter,不需要重复引入 |
345
+ | SA07 | Phase 2/3 不自动修复 | 关系分析/变更分析只输出建议,由人决策 |
346
+ | SA08 | 安全扫描合并为 Phase 4 | 安全是静态分析的一个维度,不是独立 Skill |
347
+ | SA09 | 安全扫描不自动修复 | 误报率高,需人工确认修复方案 |
348
+ | SA10 | Critical 安全漏洞阻塞流程 | Phase 4 的 Critical 级别 = 阻塞后续测试 |
349
+ | SA11 | Phase 2 必须输出圈复杂度数值 | codegraph_node 获取函数体 → AI 计算决策点 → 具体数值 |
350
+ | SA12 | 幽灵依赖对比 package.json | 不只是缺 .d.ts,还要检测 import 了但未在 package.json 声明的包 |
351
+
352
+ ***
353
+
354
+ ## References
355
+
356
+ - [ts-error-patterns.md](references/ts-error-patterns.md) — 常见 TS 错误码及修复模式
357
+ - [lint-fix-guide.md](references/lint-fix-guide.md) — ESLint 自动修复和手动修复指南
358
+ - [codegraph-analysis-guide.md](references/codegraph-analysis-guide.md) — Code-Graph 检测模式和查询策略
359
+ - [git-impact-analysis.md](references/git-impact-analysis.md) — Git 变更影响分析方法
360
+ - [security-scan-guide.md](references/security-scan-guide.md) — 安全漏洞扫描规则和评级体系
361
+ - [runtime-risk-patterns.md](references/runtime-risk-patterns.md) — 运行时风险模式识别
362
+ - [vue-security-guide.md](references/vue-security-guide.md) — Vue 专项安全规则
@@ -0,0 +1,108 @@
1
+ # Code-Graph 检测模式和查询策略
2
+
3
+ > AI 使用 Code-Graph MCP 工具时的查询指南
4
+
5
+ ---
6
+
7
+ ## 前置条件
8
+
9
+ ```bash
10
+ # 如果项目没有 .codegraph/ 索引
11
+ codegraph init -i
12
+ ```
13
+
14
+ ---
15
+
16
+ ## 检测模式
17
+
18
+ ### 循环依赖
19
+
20
+ ```
21
+ 查询: codegraph_explore("import cycle circular dependency")
22
+ 解读: 返回模块间的调用链,识别 A→B→C→A 环路
23
+ 输出格式: ["src/utils/a.ts → src/store/b.ts → src/utils/a.ts"]
24
+ ```
25
+
26
+ ### 幽灵依赖
27
+
28
+ ```
29
+ 查询: codegraph_callees("模块名")
30
+ 解读: 函数/模块调用的外部依赖,对比 package.json 的 dependencies
31
+ 输出格式: 未在 package.json 中声明的导入
32
+ ```
33
+
34
+ ### 死代码
35
+
36
+ ```
37
+ 查询: codegraph_callers("函数名")
38
+ 解读: 非导出函数且无调用者 = 死代码
39
+ 注意: exclude export 的函数(可能被外部使用)
40
+ ```
41
+
42
+ ### 架构层级违规
43
+
44
+ ```
45
+ 查询: codegraph_explore("utils import component")
46
+ 解读: utils/ 不应导入 components/,违反分层架构
47
+ 输出格式: ["src/utils/request.ts imports src/components/Modal.vue"]
48
+ ```
49
+
50
+ ### 变更影响范围
51
+
52
+ ```
53
+ 查询: codegraph_impact("函数名", depth=2)
54
+ 解读: 改了某函数,影响哪些调用者(2 层深度)
55
+ 输出格式: 直接调用者 + 间接调用者
56
+ ```
57
+
58
+ ### 圈复杂度计算
59
+
60
+ ```
61
+ 步骤:
62
+ 1. codegraph_search("函数名") → 找到符号位置
63
+ 2. codegraph_node("函数名", includeCode=true) → 获取函数体完整源码
64
+ 3. AI 分析源码计算决策点:
65
+ 圈复杂度 = 1 + if数 + else if数 + for数 + while数 + case数 + catch数
66
+ + &&数 + ||数 + 三元表达式数
67
+
68
+ 阈值:
69
+ ≤ 10 ✅ 正常
70
+ 11-20 ⚠️ 偏高,建议拆分
71
+ > 20 🔴 过高,必须重构
72
+ ```
73
+
74
+ ### 代码克隆检测
75
+
76
+ ```
77
+ 步骤:
78
+ 1. codegraph_files(format="flat") → 获取所有文件列表
79
+ 2. codegraph_node("相似函数", includeCode=true) → 获取函数体
80
+ 3. AI 比对不同函数的 AST 结构相似度:
81
+ - 变量名不同但结构相同 = Type-2 克隆
82
+ - 部分 结构相同 = Type-3 克隆
83
+ 4. 相似度 > 70% → 标记为潜在克隆
84
+ ```
85
+
86
+ ---
87
+
88
+ ## 查询策略
89
+
90
+ ### 从全局到局部
91
+
92
+ ```
93
+ 1. codegraph_files() → 项目结构概览
94
+ 2. codegraph_search("模块") → 定位符号
95
+ 3. codegraph_explore() → 查看源码 + 关系
96
+ 4. codegraph_callers/callees → 深入依赖
97
+ 5. codegraph_impact() → 计算影响
98
+ ```
99
+
100
+ ### 按分析维度选择工具
101
+
102
+ | 分析目标 | 工具 | 参数 |
103
+ |---------|------|------|
104
+ | 找符号 | `codegraph_search` | query="函数名" |
105
+ | 看源码 | `codegraph_explore` | query="模块名 文件名" |
106
+ | 谁调它 | `codegraph_callers` | symbol="函数名" |
107
+ | 它调谁 | `codegraph_callees` | symbol="函数名" |
108
+ | 改它影响谁 | `codegraph_impact` | symbol="函数名", depth=2 |
@@ -0,0 +1,81 @@
1
+ # Git 变更影响分析方法
2
+
3
+ > AI 使用 git 命令进行变更分析时的参考
4
+
5
+ ---
6
+
7
+ ## 当前变更范围
8
+
9
+ ### 查看本次提交修改了哪些文件
10
+
11
+ ```bash
12
+ # 最近一次提交
13
+ git diff --name-only HEAD~1
14
+
15
+ # 暂存区(未提交)
16
+ git diff --name-only --cached
17
+
18
+ # 工作区(未暂存)
19
+ git diff --name-only
20
+
21
+ # 所有未推送的变更
22
+ git diff --name-only origin/main...HEAD
23
+ ```
24
+
25
+ ### 查看修改了哪些函数
26
+
27
+ ```bash
28
+ # 按函数级别查看改动
29
+ git diff --stat HEAD~1
30
+ ```
31
+
32
+ ---
33
+
34
+ ## 变更影响范围
35
+
36
+ ### 结合 Code-Graph 计算影响
37
+
38
+ ```
39
+ 1. 从 git diff 获取修改的文件和函数列表
40
+ 2. 对每个修改的函数调用 codegraph_impact(symbol, depth=2)
41
+ 3. 汇总所有受影响的调用者
42
+ ```
43
+
44
+ ### 手动计算(无 Code-Graph 时)
45
+
46
+ ```bash
47
+ # 查看修改文件被哪些文件引用
48
+ grep -rn "import.*from.*修改的文件" src/
49
+ ```
50
+
51
+ ---
52
+
53
+ ## 热点文件分析
54
+
55
+ ### 最近 30 天高频变更文件
56
+
57
+ ```bash
58
+ git log --format="%H" --since="30 days ago" \
59
+ | xargs git diff-tree --no-commit-id --name-only -r \
60
+ | sort | uniq -c | sort -rn | head -20
61
+ ```
62
+
63
+ → 变更次数 > 5 的文件 = 不稳定区域,需要更多测试覆盖
64
+
65
+ ### 最近新增的文件(可能缺少测试)
66
+
67
+ ```bash
68
+ git log --diff-filter=A --name-only --pretty=format: --since="30 days ago" \
69
+ | grep -v "^$" | sort -u
70
+ ```
71
+
72
+ ---
73
+
74
+ ## 风险评估规则
75
+
76
+ | 风险等级 | 条件 | 建议 |
77
+ |---------|------|------|
78
+ | 🔴 高 | 文件被 > 10 个模块依赖 + 本次有改动 | 重点回归测试 |
79
+ | 🟡 中 | 文件被 5-10 个模块依赖 | 补充单元测试 |
80
+ | 🟢 低 | 文件被 < 5 个模块依赖 | 常规测试即可 |
81
+ | 🔵 新增 | 新文件无历史测试 | 至少覆盖核心路径 |
@@ -0,0 +1,69 @@
1
+ # ESLint 修复指南
2
+
3
+ > AI 修复 ESLint 错误时的参考手册
4
+
5
+ ---
6
+
7
+ ## 修复策略
8
+
9
+ ### 1. 自动修复(首选)
10
+
11
+ ```bash
12
+ npx eslint src/ --fix
13
+ ```
14
+
15
+ 可自动修复的规则(常见):
16
+ - `indent` — 缩进
17
+ - `semi` — 分号
18
+ - `quotes` — 引号风格
19
+ - `comma-dangle` — 尾逗号
20
+ - `no-extra-semi` — 多余分号
21
+ - `no-multiple-empty-lines` — 多余空行
22
+ - `eol-last` — 文件末尾换行
23
+ - `no-trailing-spaces` — 行尾空格
24
+ - `arrow-parens` — 箭头函数参数括号
25
+ - `object-curly-spacing` — 花括号空格
26
+
27
+ ### 2. 手动修复
28
+
29
+ 自动修复无法处理的规则(需理解上下文):
30
+
31
+ | 规则 | 常见原因 | 修复方式 |
32
+ |------|---------|---------|
33
+ | `no-unused-vars` | 声明但未使用 | 删除未使用变量,或加 `_` 前缀 |
34
+ | `no-undef` | 使用未定义变量 | 补充 import 或全局声明 |
35
+ | `no-console` | console.log | 替换为 logger 或删除 |
36
+ | `no-redeclare` | 重复声明 | 合并声明或重命名 |
37
+ | `no-shadow` | 变量名遮蔽 | 重命名内层变量 |
38
+ | `@typescript-eslint/no-explicit-any` | 使用 any | 改为具体类型 |
39
+ | `@typescript-eslint/explicit-function-return-type` | 缺少返回类型 | 补充 `: ReturnType` |
40
+ | `vue/require-default-prop` | Props 缺少 default | 添加 `default` 属性 |
41
+ | `vue/no-mutating-props` | 直接修改 Props | 改用 emit 或本地副本 |
42
+
43
+ ### 3. 禁止修复
44
+
45
+ 以下情况**不应修复**,应报告给用户:
46
+ - 规则涉及业务逻辑变更
47
+ - 修复可能改变运行行为
48
+ - 不确定修复是否安全的
49
+
50
+ ---
51
+
52
+ ## 修复原则
53
+
54
+ 1. **先自动修复,再手动修复**,减少工作量
55
+ 2. **error 必须修复,warning 可选修复**
56
+ 3. **每轮修复后重新验证**,确认不引入新问题
57
+ 4. **同一规则的多处错误**,一次性全部修复
58
+ 5. **修复后运行 `tsc --noEmit`**,确认类型不冲突
59
+
60
+ ---
61
+
62
+ ## 修复优先级
63
+
64
+ ```
65
+ P0: TS 类型错误(阻塞一切)
66
+ P1: ESLint error(阻塞 CI)
67
+ P2: ESLint warning(不阻塞,可选修复)
68
+ P3: ESLint 建议(可忽略)
69
+ ```
@@ -0,0 +1,92 @@
1
+ # 运行时风险模式识别
2
+
3
+ > AI 安全扫描时的运行时风险参考
4
+
5
+ ---
6
+
7
+ ## 内存泄漏模式
8
+
9
+ ### setInterval 未清理
10
+
11
+ ```typescript
12
+ // ❌ 风险
13
+ setInterval(() => { this.poll(); }, 5000);
14
+ // 组件销毁后仍在执行
15
+
16
+ // ✅ 修复
17
+ onMounted(() => { this.timer = setInterval(() => { this.poll(); }, 5000); });
18
+ onUnmounted(() => { clearInterval(this.timer); });
19
+ ```
20
+
21
+ ### addEventListener 未移除
22
+
23
+ ```typescript
24
+ // ❌ 风险
25
+ window.addEventListener('resize', this.handleResize);
26
+ // 组件销毁后监听器仍存在
27
+
28
+ // ✅ 修复
29
+ onMounted(() => { window.addEventListener('resize', this.handleResize); });
30
+ onUnmounted(() => { window.removeEventListener('resize', this.handleResize); });
31
+ ```
32
+
33
+ ### 闭包持有引用
34
+
35
+ ```typescript
36
+ // ❌ 风险:闭包持有组件引用
37
+ const handler = () => { this.update(); };
38
+ longRunningTask(handler);
39
+ // 任务完成后闭包仍持有 this
40
+
41
+ // ✅ 修复:使用 weakRef 或显式释放
42
+ ```
43
+
44
+ ---
45
+
46
+ ## Promise 风险
47
+
48
+ ### 未处理 rejection
49
+
50
+ ```typescript
51
+ // ❌ 风险
52
+ fetchData().then(data => { this.data = data; });
53
+ // 网络错误时 rejection 未处理,静默失败
54
+
55
+ // ✅ 修复
56
+ fetchData()
57
+ .then(data => { this.data = data; })
58
+ .catch(err => { this.error = err.message; });
59
+ ```
60
+
61
+ ### 浮动 Promise(async 未 await)
62
+
63
+ ```typescript
64
+ // ❌ 风险
65
+ async function save() {
66
+ validate(); // 返回 Promise 但未 await
67
+ await persist();
68
+ }
69
+ // validate 的 rejection 不会被 save 的 catch 捕获
70
+
71
+ // ✅ 修复
72
+ async function save() {
73
+ await validate();
74
+ await persist();
75
+ }
76
+ ```
77
+
78
+ ---
79
+
80
+ ## 事件风险
81
+
82
+ ### 全局事件未清理
83
+
84
+ ```typescript
85
+ // ❌ 风险
86
+ EventBus.on('data-updated', this.refresh);
87
+ // 组件销毁后仍监听
88
+
89
+ // ✅ 修复
90
+ onMounted(() => { EventBus.on('data-updated', this.refresh); });
91
+ onUnmounted(() => { EventBus.off('data-updated', this.refresh); });
92
+ ```