NathanKrupa/gaudi
GitHub: NathanKrupa/gaudi
Gaudi 是一个为 AI 辅助开发设计的 Python 项目架构代码检查工具,通过结构化错误提前发现设计缺陷并降低技术债务。
Stars: 1 | Forks: 0
# Gaudi
**不只是结构稳固,更要美。**
Gaudi 是一个 Python 项目的架构代码检查工具。它会检查项目的结构设计,并生成机器可读的错误代码,供 AI 编码代理(如 Claude、GitHub Copilot 等)理解和执行。
风格检查器捕捉语法错误。安全扫描器捕捉漏洞。**Gaudi 捕捉架构错误**——这些错误会在你达到 1 万用户时导致数月的重构成本。
## 它能做什么
```
$ gaudi check .
ARCH-001 [ERROR] models.py:14 - Multi-tenant table 'donors' has no tenant isolation column
-> Add a `tenant_id` ForeignKey and enforce row-level filtering on all queries.
IDX-001 [WARN] models.py:28 - Column 'email' is used in filter queries but has no db_index
-> Add db_index=True or create a composite index.
SCHEMA-001 [INFO] models.py:45 - Model 'Donor' has no timestamp fields (created_at, updated_at)
-> Add created_at and updated_at DateTimeField columns for debugging and auditing.
Found 1 error, 1 warning, 1 info across 3 files.
```
## 为何存在 Gaudi
AI 编码代理正在编写越来越多的代码。它们擅长实现功能,但不擅长问:“*这样设计合理吗?*”
Gaudi 是纪律层。它将架构最佳实践编码为结构化的错误代码,任何 AI 代理都能解析、理解并解决——没有歧义,没有幻觉。
**对人类:** 在变成技术债务之前发现设计错误。
**对 AI 代理:** 获取结构化的、可操作的架构指导,而不是模糊的“最佳实践”提示。
## 安装
```
pip install gaudi-linter
```
## 快速开始
```
# 检查项目目录
gaudi check .
# 输出为 JSON(供 AI 代理使用)
gaudi check . --format json
# 输出为 GitHub Actions 注释(在 PR 中内联)
gaudi check . --format github
# 仅错误
gaudi check . --severity error --exit-code
# 检查特定文件
gaudi check models.py
# 生成可粘贴到与 LLM 聊天中的 Markdown 报告
gaudi report . --output gaudi-report.md
```
## LLM 协作式工作流
Gaudi 被设计为开发者 ↔ LLM 对话的开局步骤,
而不是一堆机械的自动修复。大多数规则都是判断性决策——
*正确的*处理方式取决于周围代码和项目优先级。
两个输出让这种对话更容易开始:
- **`gaudi check --format github`** 会输出
[GitHub Actions 工作流命令](https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-error-message)
让结果在拉取请求中内联显示,精确地呈现在
审查者(以及 Copilot/Claude PR 审查者)期望看到的位置。参见
[docs/llm-workflow.md](docs/llm-workflow.md) 了解示例工作流。
- **`gaudi report .`** 会生成一个按文件分组的 Markdown 报告。每个发现都包含代码片段、规则建议,以及一段预先写好的
“与 LLM 讨论”提示,开发者可以直接粘贴到 Claude、ChatGPT 或其他助手中使用。
## 它检查什么
Gaudi 使用深度 AST 分析来检查 Django 模型、SQLAlchemy 表、FastAPI 端点、Flask 应用、Celery 任务、Pandas 操作、Pydantic 模型、pytest 固件以及 DRF 视图。
### 规则类别
| 前缀 | 类别 | 示例 |
|--------|----------|----------|
| `ARCH` | 架构 | 租户隔离、神模型、可空外键蔓延 |
| `IDX` | 索引 | 查找/过滤字段缺少索引 |
| `SCHEMA` | 架构设计 | 缺少时间戳、列膨胀、类型选择 |
| `SEC` | 安全 | 硬编码密钥、缺少权限、不安全默认值 |
| `SCALE` | 可扩展性 | N+1 查询、缺少超时、iterrows() |
| `STRUCT` | 结构 | 文件臃肿、缺少应用工厂 |
### 库特定规则
| 前缀 | 库 | 规则 |
|--------|---------|-------|
| `DJ` | Django | 密钥泄露、DEBUG=True、臃肿的视图 |
| `FAPI` | FastAPI | 缺少 response_model、同步端点 |
| `SA` | SQLAlchemy | 会话泄漏、默认延迟加载 |
| `FLASK` | Flask | 模块级应用创建 |
| `CELERY` | Celery |缺少重试、缺少超时限制 |
| `PD` | Pandas | inplace=True、iterrows() |
| `HTTP` | Requests/HTTPX | 缺少超时、无重试逻辑 |
| `PYD` | Pydantic | 可变默认值 |
| `TEST` | pytest | 复杂的断言、昂贵的固件 |
| `DRF` | Django REST Framework | 缺少权限、无节流 |
| `PY314` | Python 3.14 | 移除的 API、已弃用的模块 |
## 错误代码格式
每个发现都遵循一致的架构:
```
{
"code": "ARCH-001",
"severity": "error",
"category": "architecture",
"file": "models.py",
"line": 14,
"message": "Multi-tenant table 'donors' has no tenant isolation column",
"recommendation": "Add a `tenant_id` ForeignKey and enforce row-level filtering."
}
```
## 编写自定义规则
```
from gaudi import Rule, Severity, Category
class CheckTenantIsolation(Rule):
code = "ARCH-001"
severity = Severity.ERROR
category = Category.ARCHITECTURE
message_template = "Multi-tenant table '{table}' has no tenant isolation column"
def check(self, context):
for model in context.models:
if not model.has_column("tenant_id"):
yield self.finding(
file=model.source_file,
line=model.source_line,
table=model.name,
)
```
## AI 代理集成
Gaudi 的 JSON 输出专为 AI 编码代理设计。你可以将其集成到 Claude Code 工作流、CI 流水线或自定义代理循环中。
```
# 在 CI 中使用
gaudi check . --format json --severity error --exit-code
# 在 pre-commit 钩子中使用
gaudi check . --severity error --exit-code
```
### AI 代理的提示片段
在你的系统提示或项目说明中包含以下内容:
```
Before implementing any database schema changes, run `gaudi check .` and resolve
all ERROR-level findings. WARN-level findings should be addressed unless you can
document a specific reason to override them.
```
## 配置
在项目根目录创建 `gaudi.toml`:
```
[gaudi]
severity = "warn" # minimum severity to report
exclude = ["migrations/"] # paths to skip
[gaudi.rules]
"ARCH-001" = "error" # override severity
"IDX-003" = "off" # disable a rule entirely
[philosophy]
school = "convention" # infer with: gaudi philosophy .
```
### 行内抑制
使用 `# noqa` 在单行抑制发现:
```
SECRET_KEY = "test-only" # noqa: DJ-SEC-001
urlpatterns = [...] # noqa
```
`# noqa`(单独使用)会抑制该行所有发现。`# noqa: CODE1, CODE2` 仅抑制列出的规则。
### 规则速查表
从实时注册表生成每行一条规则的 Markdown 文件,适合
用于 `@` 引用 `CLAUDE.md` 或任何其他 AI 代理说明文件:
```
# 打印到标准输出
gaudi cheat-sheet
# 写入文件(已提交的工件)
gaudi cheat-sheet -o docs/gaudi-rules.md
# CI 漂移防护:如果文件过期则退出 1
gaudi cheat-sheet --check -o docs/gaudi-rules.md
```
已提交的文档 [`docs/gaudi-rules.md`](docs/gaudi-rules.md)
由规则 `recommendation_template` 字段生成,不会漂移。
### 哲学推断
Gaudi 可以推荐最适合你项目的架构学派:
```
gaudi philosophy .
```
它会分析你的依赖和项目结构,建议一个学派(例如:Django 项目推荐 `convention`,NumPy 流水线推荐 `data-oriented`)。
## 已知限制(v0.1 Alpha)
- 某些库特定规则使用原始文本正则表达式而非完整 AST 分析,可能产生误报。
这些记录在 [问题追踪器](https://github.com/NathanKrupa/gaudi/issues)。
## 哲学
Gaudi 以建筑师 Antoni Gaudi 命名,他是圣家堂的建筑师。他使用悬挂链模型——倒置的悬链线拱——在铺设第一块石头之前测试结构完整性。他的杰作于 1882 年开工,至今仍在遵循他的结构原则。
这个工具体现了同样的哲学:**在构建之前验证架构**。越早发现结构缺陷,修复成本越低。而且随着 AI 代理编写越来越多的大型代码库,我们比以往更需要自动化的架构纪律。
首先由三项支柱(真实性、经济性、成本诚实)中的十四条声明所约束的 Gaudi——详见 [docs/principles.md](https://github.com/NathanKrupa/gaudi/blob/main/docs/principles.md)。它们旨在是可移植的:任何项目都可以将其作为设计决策所依赖的教义采用。
## 贡献
欢迎贡献。目前最高影响力的贡献包括:
1. **新规则**——尤其是 Django、FastAPI 和 SQLAlchemy 模式。
2. **代码异味检测**——以编程方式实现 Fowler 的 24 种代码异味。
3. **CI/CD 集成示例**——GitHub Actions、GitLab CI 等。
参见 [CONTRIBUTING.md](https://github.com/NathanKrupa/gaudi/blob/main/CONTRIBUTING.md) 获取详情。
## 许可证
MIT 许可证。参见 [LICENSE](https://github.com/NathanKrupa/gaudi/blob/main/LICENSE) 获取详细信息。
*由 [Nathan Krupa](https://thealmoner.com) 构建——筹款人、作家和勉强的建筑师。*
标签:AI, AI 辅助开发, GitHub Actions, Homebrew安装, Linter, LNA, pptx, Python 静态分析, SEO: AI 编码助手, SEO: Python 架构, SEO: 代码质量工具, SEO: 架构检查器, 代码审查工具, 安全规则引擎, 技术债务, 数据库设计, 时间戳字段, 机器学习辅助编程, 架构最佳实践, 架构检查, 架构规范, 索引优化, 结构化错误码, 自动化代码审查, 自动笔记, 逆向工具