v4-pro 2.0.0__tar.gz

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 (48) hide show
  1. v4_pro-2.0.0/LICENSE +21 -0
  2. v4_pro-2.0.0/PKG-INFO +275 -0
  3. v4_pro-2.0.0/README.md +243 -0
  4. v4_pro-2.0.0/pyproject.toml +83 -0
  5. v4_pro-2.0.0/setup.cfg +4 -0
  6. v4_pro-2.0.0/tests/test_audit.py +144 -0
  7. v4_pro-2.0.0/tests/test_config.py +88 -0
  8. v4_pro-2.0.0/tests/test_context_enricher.py +125 -0
  9. v4_pro-2.0.0/tests/test_e2e.py +141 -0
  10. v4_pro-2.0.0/tests/test_freeze.py +179 -0
  11. v4_pro-2.0.0/tests/test_gate.py +163 -0
  12. v4_pro-2.0.0/tests/test_phantom.py +127 -0
  13. v4_pro-2.0.0/tests/test_security_scan.py +135 -0
  14. v4_pro-2.0.0/tests/test_smells.py +129 -0
  15. v4_pro-2.0.0/tests/test_static_analysis.py +126 -0
  16. v4_pro-2.0.0/tests/test_trace.py +114 -0
  17. v4_pro-2.0.0/v4_pro/__init__.py +8 -0
  18. v4_pro-2.0.0/v4_pro/audit/__init__.py +5 -0
  19. v4_pro-2.0.0/v4_pro/audit/scanner.py +137 -0
  20. v4_pro-2.0.0/v4_pro/ci_check.py +79 -0
  21. v4_pro-2.0.0/v4_pro/cli.py +784 -0
  22. v4_pro-2.0.0/v4_pro/config.py +155 -0
  23. v4_pro-2.0.0/v4_pro/context_enricher.py +197 -0
  24. v4_pro-2.0.0/v4_pro/engine.py +649 -0
  25. v4_pro-2.0.0/v4_pro/freeze/__init__.py +5 -0
  26. v4_pro-2.0.0/v4_pro/freeze/manager.py +278 -0
  27. v4_pro-2.0.0/v4_pro/gate.py +406 -0
  28. v4_pro-2.0.0/v4_pro/llm/__init__.py +14 -0
  29. v4_pro-2.0.0/v4_pro/llm/base.py +88 -0
  30. v4_pro-2.0.0/v4_pro/llm/factory.py +76 -0
  31. v4_pro-2.0.0/v4_pro/llm/openai_adapter.py +110 -0
  32. v4_pro-2.0.0/v4_pro/phantom.py +408 -0
  33. v4_pro-2.0.0/v4_pro/prompts/__init__.py +9 -0
  34. v4_pro-2.0.0/v4_pro/prompts/loader.py +156 -0
  35. v4_pro-2.0.0/v4_pro/py.typed +1 -0
  36. v4_pro-2.0.0/v4_pro/scaffold.py +76 -0
  37. v4_pro-2.0.0/v4_pro/smells.py +335 -0
  38. v4_pro-2.0.0/v4_pro/trace.py +182 -0
  39. v4_pro-2.0.0/v4_pro/verify/__init__.py +7 -0
  40. v4_pro-2.0.0/v4_pro/verify/arch_compliance.py +267 -0
  41. v4_pro-2.0.0/v4_pro/verify/security_scan.py +403 -0
  42. v4_pro-2.0.0/v4_pro/verify/static_analysis.py +306 -0
  43. v4_pro-2.0.0/v4_pro.egg-info/PKG-INFO +275 -0
  44. v4_pro-2.0.0/v4_pro.egg-info/SOURCES.txt +46 -0
  45. v4_pro-2.0.0/v4_pro.egg-info/dependency_links.txt +1 -0
  46. v4_pro-2.0.0/v4_pro.egg-info/entry_points.txt +2 -0
  47. v4_pro-2.0.0/v4_pro.egg-info/requires.txt +12 -0
  48. v4_pro-2.0.0/v4_pro.egg-info/top_level.txt +1 -0
v4_pro-2.0.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 yn400
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
v4_pro-2.0.0/PKG-INFO ADDED
@@ -0,0 +1,275 @@
1
+ Metadata-Version: 2.4
2
+ Name: v4-pro
3
+ Version: 2.0.0
4
+ Summary: AI Code Quality Gate — 自动检测 AI 代码的 Bug/安全/架构问题
5
+ Author: yn400
6
+ License: MIT
7
+ Project-URL: Homepage, https://github.com/yn400/v4-pro
8
+ Project-URL: Repository, https://github.com/yn400/v4-pro
9
+ Project-URL: Bug Tracker, https://github.com/yn400/v4-pro/issues
10
+ Keywords: vibe-coding,ai,code-quality,pipeline,llm,static-analysis,security-audit,ai-coding
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Requires-Python: >=3.10
18
+ Description-Content-Type: text/markdown
19
+ License-File: LICENSE
20
+ Requires-Dist: click<9.0,>=8.1
21
+ Requires-Dist: rich<14.0,>=13.0
22
+ Requires-Dist: pydantic<3.0,>=2.0
23
+ Requires-Dist: pydantic-settings<3.0,>=2.0
24
+ Requires-Dist: openai<2.0,>=1.0
25
+ Requires-Dist: httpx<1.0,>=0.25
26
+ Requires-Dist: jinja2<4.0,>=3.1
27
+ Provides-Extra: dev
28
+ Requires-Dist: pytest>=7.0; extra == "dev"
29
+ Requires-Dist: pytest-cov>=4.0; extra == "dev"
30
+ Requires-Dist: ruff>=0.4; extra == "dev"
31
+ Dynamic: license-file
32
+
33
+ <div align="center">
34
+
35
+ # 🛡️ V4 Pro
36
+
37
+ **AI 代码质量门禁 · The Quality Gate for AI-Generated Code**
38
+
39
+ *拦截 AI 幻觉依赖、吞异常、桩函数 —— 在它们上线之前*
40
+ *Catch hallucinated dependencies, swallowed exceptions, and stub code — before they ship*
41
+
42
+ [![Python](https://img.shields.io/badge/Python-3.10%2B-blue)]()
43
+ [![License](https://img.shields.io/badge/License-MIT-green)]()
44
+ [![CI](https://github.com/yn400/v4-pro/actions/workflows/ci.yml/badge.svg)](https://github.com/yn400/v4-pro/actions/workflows/ci.yml)
45
+ [![Tests](https://img.shields.io/badge/Tests-114-passing-brightgreen)]()
46
+ [![Release](https://img.shields.io/github/v/release/yn400/v4-pro)](https://github.com/yn400/v4-pro/releases)
47
+
48
+ </div>
49
+
50
+ ---
51
+
52
+ ## 为什么需要它 · Why
53
+
54
+ AI 写代码又快又多,但它会:
55
+
56
+ - **编造依赖包** — `import fastcsvparser` 这种 PyPI 上根本不存在的包。攻击者专门抢注这些名字投放恶意代码,这类攻击被称为 [slopsquatting](https://labs.cloudsecurityalliance.org/research/csa-research-note-slopsquatting-ai-supply-chain-20260419-csa),`pip install` 的瞬间就中招
57
+ - **静默吞异常** — `except Exception: pass`,出错时一片寂静
58
+ - **生成桩函数** — 看起来实现了、函数体其实是 `pass` 或 `raise NotImplementedError`
59
+ - **留下占位符** — `YOUR_API_KEY`、`changeme`、`https://example.com/api`
60
+ - **改写时忘删旧版** — 同一个函数定义两次
61
+
62
+ 传统 linter(Ruff/Semgrep/ESLint)盯的是代码风格和已知漏洞模式,**以上这些恰好都在盲区里**。V4 Pro 专补这一层。
63
+
64
+ ## 核心能力 · What it catches
65
+
66
+ | 能力 | 说明 | 无需联网 |
67
+ |------|------|:---:|
68
+ | 🚫 **幻觉依赖检测** | import 了 PyPI/npm 上不存在的包 → P0 阻断(注册表查证+本地缓存,离线降级不误伤) | 离线可用* |
69
+ | 🧠 **AI 异味检测** | 吞异常 / 桩函数 / 重复定义 / 占位符密钥 / TODO 热点 | ✅ |
70
+ | 🔐 **安全扫描** | SQL 注入 / 命令注入 / 不安全反序列化 / 硬编码密钥 / XSS / 弱哈希(AST+精确正则) | ✅ |
71
+ | 🧊 **架构合规** | 冻结分层约束,检查 import 依赖方向 | ✅ |
72
+ | 📏 **静态分析** | pylint/eslint(装了就用)+ 内置降级规则 | ✅ |
73
+
74
+ <sub>*离线模式下幻觉检测降级为 P3 提示,绝不阻断门禁</sub>
75
+
76
+ ## 🚀 快速开始 · Quick Start
77
+
78
+ ```bash
79
+ # 方式 A: uvx / pipx(推荐,零污染)
80
+ uvx v4-pro verify --code ./src/
81
+ pipx install v4-pro && v4-pro verify --code ./src/
82
+
83
+ # 方式 B: pip
84
+ pip install v4-pro
85
+
86
+ # 方式 C: Docker
87
+ docker run --rm -v $(pwd):/code ghcr.io/yn400/v4-pro verify --code /code
88
+ ```
89
+
90
+ **不需要任何 API Key** — `verify` 是纯本地检查,开箱即用。
91
+ (API Key 只在全流程 `run/research/design/generate` 时才需要。)
92
+
93
+ ## 真实效果 · Verified Output
94
+
95
+ 以下是对 [examples/ai_slop_demo.py](examples/ai_slop_demo.py)(一段故意埋了 8 类典型问题的 "AI 生成代码")的真实运行结果:
96
+
97
+ ```text
98
+ ┌─────────┬────────┬─────────┬──────────┬────────┬────┐
99
+ │ 检查项 │ 总问题 │ P0 │ P1 │ P2 │ P3 │
100
+ ├─────────┼────────┼─────────┼──────────┼────────┼────┤
101
+ │ 安全扫描 │ 6 │ 3 │ 1 │ 2 │ 0 │
102
+ │ AI 代码异味 │ 6 │ 0 │ 5 │ 1 │ 0 │
103
+ │ 幻觉依赖 │ 1 │ 1 │ 0 │ 0 │ 0 │
104
+ ├─────────┼────────┼─────────┼──────────┼────────┼────┤
105
+ │ 合计 │ 13 │ 4 │ 6 │ 3 │ 0 │
106
+ └─────────┴────────┴─────────┴──────────┴────────┴────┘
107
+
108
+ 问题详情:
109
+ ● [安全] 使用了不安全的反序列化 — ai_slop_demo.py:42
110
+ ● [安全] 潜在的 SQL 注入(f-string 拼接 SQL) — ai_slop_demo.py:60
111
+ ● [安全] 硬编码密钥/密码(字符串字面量赋值) — ai_slop_demo.py:16
112
+ ● [幻觉依赖] 幻觉依赖: fastcsvparser 在 PyPI 上不存在
113
+ ——AI 编造的包名,攻击者可能已抢注(slopsquatting)— ai_slop_demo.py:14
114
+
115
+ ✗ 质量门禁未通过! (exit code 1)
116
+ ```
117
+
118
+ 13 个报告 = 演示文件里埋的 13 处真问题,**零误报**。埋了什么就报什么,没埋的不报。
119
+
120
+ ### 自门禁 · It gates itself
121
+
122
+ > 质量门禁工具最大的耻辱是自己的代码过不了自己的门。V4 Pro 在 CI 里运行
123
+ > `v4-pro verify --code ./v4_pro/` —— 0 个 P0/P1,通过。
124
+ > `v4-pro audit` 自审:**0 发现,风险分 0**。(1.x 版本自审曾报 14 个误报、风险分 51——全部来自规则定义字符串的自指误报,2.0 已根治。)
125
+
126
+ ## 门禁工程化 · Built for CI
127
+
128
+ ### PR 门禁:只看新增问题
129
+
130
+ 存量代码一堆问题不拦新 PR?用基线棘轮或 diff 模式:
131
+
132
+ ```bash
133
+ # 一次性保存当前状态为基线(允许此时失败退出)
134
+ v4-pro verify --code ./src/ --save-baseline gate.baseline.json
135
+
136
+ # 之后每次 PR:存量问题不阻断,新增问题必拦
137
+ v4-pro verify --code ./src/ --baseline gate.baseline.json
138
+
139
+ # 或者只检查相对 main 变更的行
140
+ v4-pro verify --code ./src/ --diff main
141
+
142
+ # 提高门槛:P1 也阻断
143
+ v4-pro verify --code ./src/ --fail-on P1
144
+ ```
145
+
146
+ ### GitHub Actions
147
+
148
+ ```yaml
149
+ # .github/workflows/gate.yml
150
+ name: V4 Pro Quality Gate
151
+ on: [pull_request]
152
+ jobs:
153
+ gate:
154
+ runs-on: ubuntu-latest
155
+ steps:
156
+ - uses: actions/checkout@v4
157
+ with: {fetch-depth: 0} # --diff 需要完整历史
158
+ - uses: actions/setup-python@v5
159
+ with: {python-version: "3.12"}
160
+ - run: pip install v4-pro
161
+ - run: v4-pro verify --code ./src/ --diff origin/${{ github.base_ref }}
162
+ ```
163
+
164
+ ### SARIF 上传 GitHub Code Scanning
165
+
166
+ ```bash
167
+ v4-pro verify --code ./src/ --format sarif --output results.sarif
168
+ ```
169
+ 配合 [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) 即可在 PR 页面内联显示问题。
170
+
171
+ ### 按需调配置
172
+
173
+ ```bash
174
+ v4-pro init # 生成 .v4pro.json
175
+ ```
176
+
177
+ ```jsonc
178
+ // .v4pro.json
179
+ {
180
+ "fail_on": "P0", // 阻断阈值
181
+ "exclude": ["docs/**", "*.md"], // 路径排除(glob)
182
+ "disable_rules": ["SA/print-instead-of-logging"],
183
+ "test_paths": ["tests", "test"], // 测试目录自动享受宽松规则
184
+ "phantom": {
185
+ "allowlist": ["my-internal-pkg"], // 内部包白名单
186
+ "offline": false,
187
+ "timeout": 5
188
+ }
189
+ }
190
+ ```
191
+
192
+ 误报时不需要关掉整条规则——在代码行尾加注释即可:
193
+
194
+ ```python
195
+ result = legacy_call() # v4pro:ignore=SMELL/overbroad-except 历史接口,下版本重构
196
+ ```
197
+
198
+ ## 与同类工具的关系 · Positioning
199
+
200
+ | 工具 | 擅长 | 与 V4 Pro 的关系 |
201
+ |------|------|------|
202
+ | Ruff / ESLint | 代码风格、语言级错误 | 互补——风格问题它们更专业 |
203
+ | Semgrep / Bandit | 已知漏洞模式 | 互补——但都不查幻觉依赖与 AI 异味 |
204
+ | CodeRabbit / pr-agent | AI 生成 PR 评审建议 | 互补——它们给建议,V4 Pro 给硬门禁 |
205
+ | Snyk / Mend | 依赖漏洞数据库 | 互补——它们查"已安装的包有没有洞",V4 Pro 查"这包到底存不存在" |
206
+
207
+ **V4 Pro 独有**:幻觉依赖检测(slopsquatting 防线)+ AI 生成失败模式检测 + 零依赖本地运行 + 基线/diff 门禁。
208
+
209
+ ## 全流程模式(可选)· Full Pipeline
210
+
211
+ 除了独立门禁,V4 Pro 也提供结构化生成流水线(需配置 LLM API Key):
212
+
213
+ ```bash
214
+ v4-pro run "做一个待办事项 App"
215
+ # 研究 → 需求 → 设计 → 生成 → 质量门禁
216
+ # 配套: v4-pro freeze 冻结架构规范,防止后续生成腐化
217
+ ```
218
+
219
+ | 命令 | 说明 | 需要 Key |
220
+ |------|------|:---:|
221
+ | `v4-pro verify` | **质量门禁**(五项检查) | ❌ |
222
+ | `v4-pro audit` | 独立安全审计 | ❌ |
223
+ | `v4-pro init` | 初始化项目 + 门禁配置 | ❌ |
224
+ | `v4-pro run <需求>` | 一键全流程 | ✅ |
225
+ | `v4-pro research/define/design/generate` | 分步执行 | ✅ |
226
+ | `v4-pro freeze` | 冻结架构规范 | ❌ |
227
+
228
+ ## 测试与质量 · Quality
229
+
230
+ ```bash
231
+ python -m pytest -v # 114 个测试全部通过
232
+ ```
233
+
234
+ - 覆盖:检测规则正确性、误报抑制、抑制注释、基线/diff 过滤、SARIF 结构、真实 git 仓库集成
235
+ - CI 矩阵(ubuntu/windows × py3.10-3.12)+ **自门禁 job**(自己的代码必须过自己的门 + AI-slop 演示必须被拦下)
236
+
237
+ ## 项目结构 · Structure
238
+
239
+ ```
240
+ v4-pro/
241
+ ├── v4_pro/
242
+ │ ├── cli.py # CLI 入口
243
+ │ ├── engine.py # 工作流引擎
244
+ │ ├── gate.py # 门禁基础设施(掩码/抑制/基线/diff/SARIF)
245
+ │ ├── phantom.py # 幻觉依赖检测(slopsquatting 防线)
246
+ │ ├── smells.py # AI 代码异味检测
247
+ │ ├── verify/ # 安全扫描 / 静态分析 / 架构合规
248
+ │ ├── audit/ # 独立审计(与 verify 同引擎)
249
+ │ ├── freeze/ # 冻结规范管理
250
+ │ ├── llm/ # LLM 适配器层
251
+ │ └── config.py # 配置管理
252
+ ├── examples/ # AI-slop 演示文件(可自查复现)
253
+ ├── presets/ # 4 种项目类型预设
254
+ └── tests/ # 114 个测试
255
+ ```
256
+
257
+ ## 支持 · Supported
258
+
259
+ - **语言**: Python(AST 深度分析)、JavaScript/TypeScript(精确正则)
260
+ - **LLM Provider**(仅全流程需要): OpenAI 兼容 / 智谱 GLM / 通义 Qwen / Claude(即将)
261
+ - **平台**: Linux / macOS / Windows(Windows 终端已做 UTF-8 修复)
262
+
263
+ ## 协议 · License
264
+
265
+ [MIT](LICENSE) — 自由使用、修改、商用。
266
+
267
+ ---
268
+
269
+ <div align="center">
270
+
271
+ **如果 V4 Pro 拦下过你的问题,点个 ⭐ 吧!**
272
+
273
+ [GitHub](https://github.com/yn400/v4-pro) · [Issues](https://github.com/yn400/v4-pro/issues) · [CHANGELOG](CHANGELOG.md)
274
+
275
+ </div>
v4_pro-2.0.0/README.md ADDED
@@ -0,0 +1,243 @@
1
+ <div align="center">
2
+
3
+ # 🛡️ V4 Pro
4
+
5
+ **AI 代码质量门禁 · The Quality Gate for AI-Generated Code**
6
+
7
+ *拦截 AI 幻觉依赖、吞异常、桩函数 —— 在它们上线之前*
8
+ *Catch hallucinated dependencies, swallowed exceptions, and stub code — before they ship*
9
+
10
+ [![Python](https://img.shields.io/badge/Python-3.10%2B-blue)]()
11
+ [![License](https://img.shields.io/badge/License-MIT-green)]()
12
+ [![CI](https://github.com/yn400/v4-pro/actions/workflows/ci.yml/badge.svg)](https://github.com/yn400/v4-pro/actions/workflows/ci.yml)
13
+ [![Tests](https://img.shields.io/badge/Tests-114-passing-brightgreen)]()
14
+ [![Release](https://img.shields.io/github/v/release/yn400/v4-pro)](https://github.com/yn400/v4-pro/releases)
15
+
16
+ </div>
17
+
18
+ ---
19
+
20
+ ## 为什么需要它 · Why
21
+
22
+ AI 写代码又快又多,但它会:
23
+
24
+ - **编造依赖包** — `import fastcsvparser` 这种 PyPI 上根本不存在的包。攻击者专门抢注这些名字投放恶意代码,这类攻击被称为 [slopsquatting](https://labs.cloudsecurityalliance.org/research/csa-research-note-slopsquatting-ai-supply-chain-20260419-csa),`pip install` 的瞬间就中招
25
+ - **静默吞异常** — `except Exception: pass`,出错时一片寂静
26
+ - **生成桩函数** — 看起来实现了、函数体其实是 `pass` 或 `raise NotImplementedError`
27
+ - **留下占位符** — `YOUR_API_KEY`、`changeme`、`https://example.com/api`
28
+ - **改写时忘删旧版** — 同一个函数定义两次
29
+
30
+ 传统 linter(Ruff/Semgrep/ESLint)盯的是代码风格和已知漏洞模式,**以上这些恰好都在盲区里**。V4 Pro 专补这一层。
31
+
32
+ ## 核心能力 · What it catches
33
+
34
+ | 能力 | 说明 | 无需联网 |
35
+ |------|------|:---:|
36
+ | 🚫 **幻觉依赖检测** | import 了 PyPI/npm 上不存在的包 → P0 阻断(注册表查证+本地缓存,离线降级不误伤) | 离线可用* |
37
+ | 🧠 **AI 异味检测** | 吞异常 / 桩函数 / 重复定义 / 占位符密钥 / TODO 热点 | ✅ |
38
+ | 🔐 **安全扫描** | SQL 注入 / 命令注入 / 不安全反序列化 / 硬编码密钥 / XSS / 弱哈希(AST+精确正则) | ✅ |
39
+ | 🧊 **架构合规** | 冻结分层约束,检查 import 依赖方向 | ✅ |
40
+ | 📏 **静态分析** | pylint/eslint(装了就用)+ 内置降级规则 | ✅ |
41
+
42
+ <sub>*离线模式下幻觉检测降级为 P3 提示,绝不阻断门禁</sub>
43
+
44
+ ## 🚀 快速开始 · Quick Start
45
+
46
+ ```bash
47
+ # 方式 A: uvx / pipx(推荐,零污染)
48
+ uvx v4-pro verify --code ./src/
49
+ pipx install v4-pro && v4-pro verify --code ./src/
50
+
51
+ # 方式 B: pip
52
+ pip install v4-pro
53
+
54
+ # 方式 C: Docker
55
+ docker run --rm -v $(pwd):/code ghcr.io/yn400/v4-pro verify --code /code
56
+ ```
57
+
58
+ **不需要任何 API Key** — `verify` 是纯本地检查,开箱即用。
59
+ (API Key 只在全流程 `run/research/design/generate` 时才需要。)
60
+
61
+ ## 真实效果 · Verified Output
62
+
63
+ 以下是对 [examples/ai_slop_demo.py](examples/ai_slop_demo.py)(一段故意埋了 8 类典型问题的 "AI 生成代码")的真实运行结果:
64
+
65
+ ```text
66
+ ┌─────────┬────────┬─────────┬──────────┬────────┬────┐
67
+ │ 检查项 │ 总问题 │ P0 │ P1 │ P2 │ P3 │
68
+ ├─────────┼────────┼─────────┼──────────┼────────┼────┤
69
+ │ 安全扫描 │ 6 │ 3 │ 1 │ 2 │ 0 │
70
+ │ AI 代码异味 │ 6 │ 0 │ 5 │ 1 │ 0 │
71
+ │ 幻觉依赖 │ 1 │ 1 │ 0 │ 0 │ 0 │
72
+ ├─────────┼────────┼─────────┼──────────┼────────┼────┤
73
+ │ 合计 │ 13 │ 4 │ 6 │ 3 │ 0 │
74
+ └─────────┴────────┴─────────┴──────────┴────────┴────┘
75
+
76
+ 问题详情:
77
+ ● [安全] 使用了不安全的反序列化 — ai_slop_demo.py:42
78
+ ● [安全] 潜在的 SQL 注入(f-string 拼接 SQL) — ai_slop_demo.py:60
79
+ ● [安全] 硬编码密钥/密码(字符串字面量赋值) — ai_slop_demo.py:16
80
+ ● [幻觉依赖] 幻觉依赖: fastcsvparser 在 PyPI 上不存在
81
+ ——AI 编造的包名,攻击者可能已抢注(slopsquatting)— ai_slop_demo.py:14
82
+
83
+ ✗ 质量门禁未通过! (exit code 1)
84
+ ```
85
+
86
+ 13 个报告 = 演示文件里埋的 13 处真问题,**零误报**。埋了什么就报什么,没埋的不报。
87
+
88
+ ### 自门禁 · It gates itself
89
+
90
+ > 质量门禁工具最大的耻辱是自己的代码过不了自己的门。V4 Pro 在 CI 里运行
91
+ > `v4-pro verify --code ./v4_pro/` —— 0 个 P0/P1,通过。
92
+ > `v4-pro audit` 自审:**0 发现,风险分 0**。(1.x 版本自审曾报 14 个误报、风险分 51——全部来自规则定义字符串的自指误报,2.0 已根治。)
93
+
94
+ ## 门禁工程化 · Built for CI
95
+
96
+ ### PR 门禁:只看新增问题
97
+
98
+ 存量代码一堆问题不拦新 PR?用基线棘轮或 diff 模式:
99
+
100
+ ```bash
101
+ # 一次性保存当前状态为基线(允许此时失败退出)
102
+ v4-pro verify --code ./src/ --save-baseline gate.baseline.json
103
+
104
+ # 之后每次 PR:存量问题不阻断,新增问题必拦
105
+ v4-pro verify --code ./src/ --baseline gate.baseline.json
106
+
107
+ # 或者只检查相对 main 变更的行
108
+ v4-pro verify --code ./src/ --diff main
109
+
110
+ # 提高门槛:P1 也阻断
111
+ v4-pro verify --code ./src/ --fail-on P1
112
+ ```
113
+
114
+ ### GitHub Actions
115
+
116
+ ```yaml
117
+ # .github/workflows/gate.yml
118
+ name: V4 Pro Quality Gate
119
+ on: [pull_request]
120
+ jobs:
121
+ gate:
122
+ runs-on: ubuntu-latest
123
+ steps:
124
+ - uses: actions/checkout@v4
125
+ with: {fetch-depth: 0} # --diff 需要完整历史
126
+ - uses: actions/setup-python@v5
127
+ with: {python-version: "3.12"}
128
+ - run: pip install v4-pro
129
+ - run: v4-pro verify --code ./src/ --diff origin/${{ github.base_ref }}
130
+ ```
131
+
132
+ ### SARIF 上传 GitHub Code Scanning
133
+
134
+ ```bash
135
+ v4-pro verify --code ./src/ --format sarif --output results.sarif
136
+ ```
137
+ 配合 [github/codeql-action/upload-sarif](https://github.com/github/codeql-action) 即可在 PR 页面内联显示问题。
138
+
139
+ ### 按需调配置
140
+
141
+ ```bash
142
+ v4-pro init # 生成 .v4pro.json
143
+ ```
144
+
145
+ ```jsonc
146
+ // .v4pro.json
147
+ {
148
+ "fail_on": "P0", // 阻断阈值
149
+ "exclude": ["docs/**", "*.md"], // 路径排除(glob)
150
+ "disable_rules": ["SA/print-instead-of-logging"],
151
+ "test_paths": ["tests", "test"], // 测试目录自动享受宽松规则
152
+ "phantom": {
153
+ "allowlist": ["my-internal-pkg"], // 内部包白名单
154
+ "offline": false,
155
+ "timeout": 5
156
+ }
157
+ }
158
+ ```
159
+
160
+ 误报时不需要关掉整条规则——在代码行尾加注释即可:
161
+
162
+ ```python
163
+ result = legacy_call() # v4pro:ignore=SMELL/overbroad-except 历史接口,下版本重构
164
+ ```
165
+
166
+ ## 与同类工具的关系 · Positioning
167
+
168
+ | 工具 | 擅长 | 与 V4 Pro 的关系 |
169
+ |------|------|------|
170
+ | Ruff / ESLint | 代码风格、语言级错误 | 互补——风格问题它们更专业 |
171
+ | Semgrep / Bandit | 已知漏洞模式 | 互补——但都不查幻觉依赖与 AI 异味 |
172
+ | CodeRabbit / pr-agent | AI 生成 PR 评审建议 | 互补——它们给建议,V4 Pro 给硬门禁 |
173
+ | Snyk / Mend | 依赖漏洞数据库 | 互补——它们查"已安装的包有没有洞",V4 Pro 查"这包到底存不存在" |
174
+
175
+ **V4 Pro 独有**:幻觉依赖检测(slopsquatting 防线)+ AI 生成失败模式检测 + 零依赖本地运行 + 基线/diff 门禁。
176
+
177
+ ## 全流程模式(可选)· Full Pipeline
178
+
179
+ 除了独立门禁,V4 Pro 也提供结构化生成流水线(需配置 LLM API Key):
180
+
181
+ ```bash
182
+ v4-pro run "做一个待办事项 App"
183
+ # 研究 → 需求 → 设计 → 生成 → 质量门禁
184
+ # 配套: v4-pro freeze 冻结架构规范,防止后续生成腐化
185
+ ```
186
+
187
+ | 命令 | 说明 | 需要 Key |
188
+ |------|------|:---:|
189
+ | `v4-pro verify` | **质量门禁**(五项检查) | ❌ |
190
+ | `v4-pro audit` | 独立安全审计 | ❌ |
191
+ | `v4-pro init` | 初始化项目 + 门禁配置 | ❌ |
192
+ | `v4-pro run <需求>` | 一键全流程 | ✅ |
193
+ | `v4-pro research/define/design/generate` | 分步执行 | ✅ |
194
+ | `v4-pro freeze` | 冻结架构规范 | ❌ |
195
+
196
+ ## 测试与质量 · Quality
197
+
198
+ ```bash
199
+ python -m pytest -v # 114 个测试全部通过
200
+ ```
201
+
202
+ - 覆盖:检测规则正确性、误报抑制、抑制注释、基线/diff 过滤、SARIF 结构、真实 git 仓库集成
203
+ - CI 矩阵(ubuntu/windows × py3.10-3.12)+ **自门禁 job**(自己的代码必须过自己的门 + AI-slop 演示必须被拦下)
204
+
205
+ ## 项目结构 · Structure
206
+
207
+ ```
208
+ v4-pro/
209
+ ├── v4_pro/
210
+ │ ├── cli.py # CLI 入口
211
+ │ ├── engine.py # 工作流引擎
212
+ │ ├── gate.py # 门禁基础设施(掩码/抑制/基线/diff/SARIF)
213
+ │ ├── phantom.py # 幻觉依赖检测(slopsquatting 防线)
214
+ │ ├── smells.py # AI 代码异味检测
215
+ │ ├── verify/ # 安全扫描 / 静态分析 / 架构合规
216
+ │ ├── audit/ # 独立审计(与 verify 同引擎)
217
+ │ ├── freeze/ # 冻结规范管理
218
+ │ ├── llm/ # LLM 适配器层
219
+ │ └── config.py # 配置管理
220
+ ├── examples/ # AI-slop 演示文件(可自查复现)
221
+ ├── presets/ # 4 种项目类型预设
222
+ └── tests/ # 114 个测试
223
+ ```
224
+
225
+ ## 支持 · Supported
226
+
227
+ - **语言**: Python(AST 深度分析)、JavaScript/TypeScript(精确正则)
228
+ - **LLM Provider**(仅全流程需要): OpenAI 兼容 / 智谱 GLM / 通义 Qwen / Claude(即将)
229
+ - **平台**: Linux / macOS / Windows(Windows 终端已做 UTF-8 修复)
230
+
231
+ ## 协议 · License
232
+
233
+ [MIT](LICENSE) — 自由使用、修改、商用。
234
+
235
+ ---
236
+
237
+ <div align="center">
238
+
239
+ **如果 V4 Pro 拦下过你的问题,点个 ⭐ 吧!**
240
+
241
+ [GitHub](https://github.com/yn400/v4-pro) · [Issues](https://github.com/yn400/v4-pro/issues) · [CHANGELOG](CHANGELOG.md)
242
+
243
+ </div>
@@ -0,0 +1,83 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68.0", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "v4-pro"
7
+ version = "2.0.0"
8
+ description = "AI Code Quality Gate — 自动检测 AI 代码的 Bug/安全/架构问题"
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = {text = "MIT"}
12
+ authors = [{name = "yn400"}]
13
+ keywords = ["vibe-coding", "ai", "code-quality", "pipeline", "llm", "static-analysis", "security-audit", "ai-coding"]
14
+ classifiers = [
15
+ "Development Status :: 4 - Beta",
16
+ "Intended Audience :: Developers",
17
+ "License :: OSI Approved :: MIT License",
18
+ "Programming Language :: Python :: 3.10",
19
+ "Programming Language :: Python :: 3.11",
20
+ "Programming Language :: Python :: 3.12",
21
+ ]
22
+
23
+ dependencies = [
24
+ "click>=8.1,<9.0",
25
+ "rich>=13.0,<14.0",
26
+ "pydantic>=2.0,<3.0",
27
+ "pydantic-settings>=2.0,<3.0",
28
+ "openai>=1.0,<2.0",
29
+ "httpx>=0.25,<1.0",
30
+ "jinja2>=3.1,<4.0",
31
+ ]
32
+
33
+ [project.optional-dependencies]
34
+ dev = [
35
+ "pytest>=7.0",
36
+ "pytest-cov>=4.0",
37
+ "ruff>=0.4",
38
+ ]
39
+
40
+ [project.urls]
41
+ Homepage = "https://github.com/yn400/v4-pro"
42
+ Repository = "https://github.com/yn400/v4-pro"
43
+ "Bug Tracker" = "https://github.com/yn400/v4-pro/issues"
44
+
45
+ [project.scripts]
46
+ v4-pro = "v4_pro.cli:main"
47
+
48
+ [tool.setuptools.packages.find]
49
+ where = ["."]
50
+ include = ["v4_pro*"]
51
+
52
+ [tool.setuptools.package-data]
53
+ "v4_pro" = ["py.typed"]
54
+
55
+ # prompts/ 目录在项目根目录,用户从项目根运行时自动找到
56
+ # 若要作为 pip 包分发,需将 prompts/ 移入 v4_pro/ 并更新 engine.py 中的路径
57
+
58
+ [tool.pytest.ini_options]
59
+ testpaths = ["tests"]
60
+ python_files = ["test_*.py"]
61
+ addopts = ["-v", "--tb=short"]
62
+
63
+ [tool.ruff]
64
+ line-length = 120
65
+ target-version = "py310"
66
+ extend-exclude = ["examples"]
67
+
68
+ [tool.ruff.lint]
69
+ select = [
70
+ "E", # pycodestyle errors
71
+ "W", # pycodestyle warnings
72
+ "F", # pyflakes
73
+ "I", # isort
74
+ "UP", # pyupgrade
75
+ "B", # flake8-bugbear
76
+ ]
77
+ ignore = [
78
+ "E501", # line too long(由 line-length 控制)
79
+ "B008", # do not perform function calls in default arguments
80
+ ]
81
+
82
+ [tool.ruff.lint.isort]
83
+ known-first-party = ["v4_pro"]
v4_pro-2.0.0/setup.cfg ADDED
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+