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.
- v4_pro-2.0.0/LICENSE +21 -0
- v4_pro-2.0.0/PKG-INFO +275 -0
- v4_pro-2.0.0/README.md +243 -0
- v4_pro-2.0.0/pyproject.toml +83 -0
- v4_pro-2.0.0/setup.cfg +4 -0
- v4_pro-2.0.0/tests/test_audit.py +144 -0
- v4_pro-2.0.0/tests/test_config.py +88 -0
- v4_pro-2.0.0/tests/test_context_enricher.py +125 -0
- v4_pro-2.0.0/tests/test_e2e.py +141 -0
- v4_pro-2.0.0/tests/test_freeze.py +179 -0
- v4_pro-2.0.0/tests/test_gate.py +163 -0
- v4_pro-2.0.0/tests/test_phantom.py +127 -0
- v4_pro-2.0.0/tests/test_security_scan.py +135 -0
- v4_pro-2.0.0/tests/test_smells.py +129 -0
- v4_pro-2.0.0/tests/test_static_analysis.py +126 -0
- v4_pro-2.0.0/tests/test_trace.py +114 -0
- v4_pro-2.0.0/v4_pro/__init__.py +8 -0
- v4_pro-2.0.0/v4_pro/audit/__init__.py +5 -0
- v4_pro-2.0.0/v4_pro/audit/scanner.py +137 -0
- v4_pro-2.0.0/v4_pro/ci_check.py +79 -0
- v4_pro-2.0.0/v4_pro/cli.py +784 -0
- v4_pro-2.0.0/v4_pro/config.py +155 -0
- v4_pro-2.0.0/v4_pro/context_enricher.py +197 -0
- v4_pro-2.0.0/v4_pro/engine.py +649 -0
- v4_pro-2.0.0/v4_pro/freeze/__init__.py +5 -0
- v4_pro-2.0.0/v4_pro/freeze/manager.py +278 -0
- v4_pro-2.0.0/v4_pro/gate.py +406 -0
- v4_pro-2.0.0/v4_pro/llm/__init__.py +14 -0
- v4_pro-2.0.0/v4_pro/llm/base.py +88 -0
- v4_pro-2.0.0/v4_pro/llm/factory.py +76 -0
- v4_pro-2.0.0/v4_pro/llm/openai_adapter.py +110 -0
- v4_pro-2.0.0/v4_pro/phantom.py +408 -0
- v4_pro-2.0.0/v4_pro/prompts/__init__.py +9 -0
- v4_pro-2.0.0/v4_pro/prompts/loader.py +156 -0
- v4_pro-2.0.0/v4_pro/py.typed +1 -0
- v4_pro-2.0.0/v4_pro/scaffold.py +76 -0
- v4_pro-2.0.0/v4_pro/smells.py +335 -0
- v4_pro-2.0.0/v4_pro/trace.py +182 -0
- v4_pro-2.0.0/v4_pro/verify/__init__.py +7 -0
- v4_pro-2.0.0/v4_pro/verify/arch_compliance.py +267 -0
- v4_pro-2.0.0/v4_pro/verify/security_scan.py +403 -0
- v4_pro-2.0.0/v4_pro/verify/static_analysis.py +306 -0
- v4_pro-2.0.0/v4_pro.egg-info/PKG-INFO +275 -0
- v4_pro-2.0.0/v4_pro.egg-info/SOURCES.txt +46 -0
- v4_pro-2.0.0/v4_pro.egg-info/dependency_links.txt +1 -0
- v4_pro-2.0.0/v4_pro.egg-info/entry_points.txt +2 -0
- v4_pro-2.0.0/v4_pro.egg-info/requires.txt +12 -0
- 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
|
+
[]()
|
|
43
|
+
[]()
|
|
44
|
+
[](https://github.com/yn400/v4-pro/actions/workflows/ci.yml)
|
|
45
|
+
[]()
|
|
46
|
+
[](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
|
+
[]()
|
|
11
|
+
[]()
|
|
12
|
+
[](https://github.com/yn400/v4-pro/actions/workflows/ci.yml)
|
|
13
|
+
[]()
|
|
14
|
+
[](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