MKanhan/archlint
GitHub: MKanhan/archlint
一个轻量级 Claude Code 钩子,通过解析文件导入并与预定义的层级规则比对,在 AI Agent 编码过程中实时捕获和阻断架构偏移。
Stars: 0 | Forks: 0
# archlint
一个轻量级的 Claude Code 钩子,能够通过将编辑内容与您已保存在 `CLAUDE.md` 中的架构蓝图进行比对,在 Agent 编写代码时捕获架构偏移。
无需守护进程。无需新增配置文件。LLM 不在关键路径上。只需一个仅依赖标准库的 Python 脚本。
## 功能说明
在 Claude Code 编辑您的项目时:
- **在每次 `Write`/`Edit`/`MultiEdit` 之后**,archlint 会解析文件,提取其导入项,并根据您的蓝图中声明的层级规则进行检查。如果跨越了被禁止的边界(例如 UI 直接访问数据库),它会向 Claude 反馈一条简短且可执行的建议。
- **在每个回合结束时 (`Stop`)**,archlint 会输出一份关于所有未解决偏移的检查点摘要,这样 Claude 在宣布完成之前还有最后的机会进行修复。
在 `lenient`(宽容)模式(默认)下,偏移会作为 `additionalContext` 报告,Claude 通常会在下一步自行纠正。在 `strict`(严格)模式下,偏移会触发 `decision: block`,这将强制 Claude 继续工作,直到违规行为被消除。
## 蓝图
在您的 `CLAUDE.md`(或 `ARCHITECTURE.md`、`SPEC.md`、`ROADMAP.md` —— 以最先找到的为准)中添加一个 `## Architecture` 部分。在其中,一个带有围栏的 `archlint` 代码块用于声明您的层级和规则:
```
## Architecture
We follow a layered structure: routes → services → repositories → models.
The UI must never reach into the database directly.
```archlint
layer routes = src/routes/**, src/api/**
layer services = src/services/**
layer repos = src/repos/**
layer models = src/models/**
layer ui = src/ui/**, src/components/**
routes -> services
services -> repos
repos -> models
ui -> services
forbid ui -> repos
forbid ui -> models
forbid routes -> repos
forbid * -> src/legacy/**
```
```
语法(每行一条语句,`#` 开头为注释):
| 语句 | 含义 |
|-------------------------------------|------------------------------------------------|
| `layer NAME = glob, glob, ...` | 通过一个或多个文件 glob 模式定义层级。 |
| `X -> Y` | 允许 `X` 依赖于 `Y`。 |
| `forbid X -> Y` | 显式禁止(优先于允许规则)。 |
| `forbid * -> path/glob/**` | 任何对 `path/...` 的依赖都被禁止。 |
外部导入(npm 包、pip 包、标准库)将被忽略。
## 安装
将脚本放入您的项目中:
```
mkdir -p .claude/hooks
curl -fsSL https://raw.githubusercontent.com/MKanhan/archlint/main/archlint.py \
-o .claude/hooks/archlint.py
chmod +x .claude/hooks/archlint.py
```
然后将以下内容合并到 `.claude/settings.json` 中:
```
{
"hooks": {
"PostToolUse": [{
"matcher": "Write|Edit|MultiEdit",
"hooks": [{
"type": "command",
"command": "python3 $CLAUDE_PROJECT_DIR/.claude/hooks/archlint.py post"
}]
}],
"Stop": [{
"hooks": [{
"type": "command",
"command": "python3 $CLAUDE_PROJECT_DIR/.claude/hooks/archlint.py stop"
}]
}]
}
}
```
将 `.archlint/` 添加到您的 `.gitignore` 中(这是存储每个回合状态和偏移日志的地方)。
## 在 Claude Code 之外使用
```
# Pre-commit / CI: 扫描整个项目,drift 时 exit 1。
python3 .claude/hooks/archlint.py check
```
将其作为 git 的 pre-commit 钩子接入:
```
# .git/hooks/pre-commit
#!/usr/bin/env bash
python3 .claude/hooks/archlint.py check
```
## 模式
| 环境变量 | 值 | 效果 |
|-----------------------|-------------------------|-----------------------------------------------------------------------------------|
| `ARCHLINT_MODE` | `lenient` (默认), `strict` | `strict` 模式会通过 `decision: block` 阻止 Claude 继续;`lenient` 模式仅发出通知。 |
| `ARCHLINT_BLUEPRINT` | 路径 | 覆盖蓝图的存储位置。 |
| `ARCHLINT_QUIET` | `1` | 抑制非阻塞输出(保留供将来使用)。 |
## 支持的语言
导入提取适用于:Python (AST)、TypeScript/JavaScript (regex)、Go (regex)、Rust (regex)。外部导入和未解析的规范会被直接跳过——对第三方包不会产生误报。
添加一种语言大约只需 15 行代码:一个用于导入提取的正则表达式(或 AST),以及在 `_MODULE_SUFFIXES` 中的几个文件后缀名。
## 尚不支持的功能
- **不会自动生成蓝图。** 您只需编写一次规则。一个明显的下一步是开发配套的 `archlint init` 命令,让 Claude 根据现有目录树起草初始蓝图。
- **不进行深层语义分析。** 它基于导入和 glob 模式工作。它不会捕获“此函数名暗示了层级跨越”——那需要 LLM,而我们更希望将其保持为可选项。
- **不会自动修复问题。** 它只负责暴露偏移;由 Claude 决定如何处理。这是有意为之的设计——我们是安全带,而不是方向盘。
## 为什么是钩子而不是静态分析器
静态分析器在 CI 阶段运行,而那时架构已经发生了偏移。钩子在 *Agent 循环内部* 运行,此时还有低成本纠正路线的机会。其核心目的在于防止偏移在单个回合的 40 次工具调用中不断累积——而不仅仅是在事后进行检测。
这两者都很有价值。`archlint check` 适用于 CI/pre-commit 场景;而钩子适用于实时编码场景。相同的代码,相同的规则。
## 许可证
MIT。
标签:AI编程助手, CI/CD钩子, Claude Code插件, CLAUDE.md, CMS安全, Go, IPv6支持, JavaScript, LLM开发工具, Python, Ruby工具, Rust, stdlib-only, TypeScript, 代码规范, 代码静态分析, 分层架构, 可视化界面, 安全插件, 实时代码审查, 数据可视化, 无后门, 无第三方依赖, 日志审计, 架构漂移检测, 网络流量审计, 自动纠错, 软件架构, 逆向工具, 重构